Skip to content
This repository was archived by the owner on Jun 3, 2024. It is now read-only.

Commit 9d9aa6e

Browse files
author
Shammamah Hossain
committed
Refactor markdown syntax highlighting.
1 parent 2a1f01e commit 9d9aa6e

File tree

8 files changed

+98
-13
lines changed

8 files changed

+98
-13
lines changed

dash_core_components_base/__init__.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
'datepicker',
4444
'dropdown',
4545
'graph',
46+
'highlight',
4647
'markdown',
4748
'upload'
4849
]
@@ -70,10 +71,6 @@
7071
} for async_resource in async_resources])
7172

7273
_js_dist.extend([
73-
{
74-
'relative_package_path': 'highlight.pack.js',
75-
'namespace': 'dash_core_components'
76-
},
7774
{
7875
'relative_package_path': '{}.min.js'.format(__name__),
7976
'external_url': (

dash_core_components_base/highlight.pack.js

Lines changed: 0 additions & 2 deletions
This file was deleted.

package-lock.json

Lines changed: 26 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
"dependencies": {
3636
"color": "^3.1.0",
3737
"fast-isnumeric": "^1.1.3",
38+
"highlight.js": "^9.17.1",
3839
"moment": "^2.20.1",
3940
"plotly.js": "1.51.2",
4041
"prop-types": "^15.6.0",

src/fragments/Markdown.react.js

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,17 @@ import React, {Component} from 'react';
22
import {type} from 'ramda';
33
import Markdown from 'react-markdown';
44

5+
import Highlight from '../utils/Highlight';
56
import {propTypes, defaultProps} from '../components/Markdown.react';
67
import '../components/css/highlight.css';
78

89
export default class DashMarkdown extends Component {
910
constructor(props) {
1011
super(props);
12+
new Highlight();
13+
if (Highlight.isReady !== true) {
14+
Highlight.isReady.then(() => { this.setState({}); })
15+
}
1116
this.highlightCode = this.highlightCode.bind(this);
1217
this.dedent = this.dedent.bind(this);
1318
}
@@ -21,16 +26,14 @@ export default class DashMarkdown extends Component {
2126
}
2227

2328
highlightCode() {
24-
if (!window.hljs) {
25-
// skip highlighting if highlight.js isn't found
26-
return;
27-
}
2829
if (this.mdContainer) {
2930
const nodes = this.mdContainer.querySelectorAll('pre code');
3031

31-
for (let i = 0; i < nodes.length; i++) {
32-
window.hljs.highlightBlock(nodes[i]);
33-
}
32+
if(Highlight.hljs) {
33+
for (let i = 0; i < nodes.length; i++) {
34+
Highlight.hljs.highlightBlock(nodes[i]);
35+
}
36+
} else { Highlight.loadhljs(); }
3437
}
3538
}
3639

src/utils/Highlight.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import LazyLoader from './LazyLoader';
2+
3+
export default class Highlight {
4+
5+
static hljsResolve() {}
6+
7+
constructor() {
8+
if(!Highlight.isReady) {
9+
Highlight.isReady = new Promise(resolve => {
10+
Highlight.hljsResolve = resolve;
11+
});
12+
}
13+
}
14+
15+
static async loadhljs() {
16+
Highlight.hljs = await LazyLoader.hljs();
17+
Highlight.hljsResolve();
18+
Highlight.isReady = true;
19+
}
20+
21+
}

src/utils/LazyLoader.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,13 @@ export default {
77
import(/* webpackChunkName: "dropdown" */ '../fragments/Dropdown.react'),
88
graph: () =>
99
import(/* webpackChunkName: "graph" */ '../fragments/Graph.react'),
10+
hljs: () =>
11+
Promise.resolve(
12+
window.hljs ||
13+
import(/* webpackChunkName: "highlight" */ '../../third-party/highlight.js').then(
14+
result => result.default
15+
)
16+
),
1017
markdown: () =>
1118
import(/* webpackChunkName: "markdown" */ '../fragments/Markdown.react'),
1219
plotly: () =>

third-party/highlight.js

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import highlightjs from 'highlight.js/lib/highlight';
2+
import 'highlight.js/styles/github.css';
3+
4+
import bash from 'highlight.js/lib/languages/bash';
5+
import css from 'highlight.js/lib/languages/css';
6+
import http from 'highlight.js/lib/languages/http';
7+
import javascript from 'highlight.js/lib/languages/javascript';
8+
import json from 'highlight.js/lib/languages/json';
9+
import markdown from 'highlight.js/lib/languages/markdown';
10+
import python from 'highlight.js/lib/languages/python';
11+
import r from 'highlight.js/lib/languages/r';
12+
import ruby from 'highlight.js/lib/languages/ruby';
13+
import shell from 'highlight.js/lib/languages/shell';
14+
import sql from 'highlight.js/lib/languages/sql';
15+
import xml from 'highlight.js/lib/languages/xml';
16+
import yaml from 'highlight.js/lib/languages/yaml';
17+
18+
highlightjs.registerLanguage('bash', bash);
19+
highlightjs.registerLanguage('css', css);
20+
highlightjs.registerLanguage('http', http);
21+
highlightjs.registerLanguage('javascript', javascript);
22+
highlightjs.registerLanguage('json', json);
23+
highlightjs.registerLanguage('markdown', markdown);
24+
highlightjs.registerLanguage('python', python);
25+
highlightjs.registerLanguage('r', r);
26+
highlightjs.registerLanguage('ruby', ruby);
27+
highlightjs.registerLanguage('shell', shell);
28+
highlightjs.registerLanguage('sql', sql);
29+
highlightjs.registerLanguage('xml', xml);
30+
highlightjs.registerLanguage('yaml', yaml);
31+
32+
export default highlightjs;

0 commit comments

Comments
 (0)