Skip to content

Commit 0d9b9da

Browse files
authored
Merge pull request #2909 from leeagustin/rehighlight-markdown-update
Rehighlights dcc.Markdown when it is updated
2 parents eef8f1c + efa38ec commit 0d9b9da

File tree

2 files changed

+42
-1
lines changed

2 files changed

+42
-1
lines changed

components/dash-core-components/src/fragments/Markdown.react.js

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,20 @@ export default class DashMarkdown extends Component {
3232
}
3333

3434
highlightCode() {
35+
const isHighlighted = node => {
36+
// a highlighted node will have <span> children which are what color the text
37+
return node.children.length > 0;
38+
};
39+
3540
if (this.mdContainer) {
3641
const nodes = this.mdContainer.querySelectorAll('pre code');
3742

3843
if (MarkdownHighlighter.hljs) {
3944
for (let i = 0; i < nodes.length; i++) {
40-
MarkdownHighlighter.hljs.highlightElement(nodes[i]);
45+
if (!isHighlighted(nodes[i])) {
46+
nodes[i].removeAttribute('data-highlighted');
47+
MarkdownHighlighter.hljs.highlightElement(nodes[i]);
48+
}
4149
}
4250
} else {
4351
MarkdownHighlighter.loadhljs();

components/dash-core-components/tests/integration/misc/test_markdown_highlight.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@
44

55

66
md_text = """```python
7+
print('hello, world!')
8+
```"""
9+
10+
new_md_text = """```python
711
import dash
812
print('hello, world!')
913
```"""
@@ -46,3 +50,32 @@ def trigger_md_rerender(nclicks):
4650
dash_dcc.wait_for_text_to_equal("#md-container code", "hljs override")
4751

4852
assert dash_dcc.get_logs() == []
53+
54+
55+
def test_msmh003_update_md(dash_dcc):
56+
app = Dash(__name__)
57+
app.layout = html.Div(
58+
[
59+
html.Button("Click", id="md-trigger"),
60+
dcc.Markdown(md_text, id="md"),
61+
]
62+
)
63+
64+
@app.callback(Output("md", "children"), [Input("md-trigger", "n_clicks")])
65+
def update_md(nclicks):
66+
if nclicks is not None and nclicks > 0:
67+
return new_md_text
68+
return md_text
69+
70+
dash_dcc.start_server(app)
71+
72+
# a highlighted node will have <span> children which are what color the text
73+
code = dash_dcc.wait_for_element("code[data-highlighted='yes']")
74+
assert len(code.find_elements_by_tag_name("span")) == 2
75+
76+
dash_dcc.find_element("#md-trigger").click()
77+
78+
code = dash_dcc.wait_for_element("code[data-highlighted='yes']")
79+
assert len(code.find_elements_by_tag_name("span")) == 3
80+
81+
assert dash_dcc.get_logs() == []

0 commit comments

Comments
 (0)