Skip to content

Commit 8fd88c0

Browse files
committed
feat(pat-markdown): Initialize syntax highlight when parsing markup.
1 parent 3739935 commit 8fd88c0

File tree

2 files changed

+35
-1
lines changed

2 files changed

+35
-1
lines changed

src/pat/markdown/markdown.js

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import $ from "jquery";
22
import logging from "../../core/logging";
33
import utils from "../../core/utils";
44
import Base from "../../core/base";
5+
import events from "../../core/events";
56
import inject from "../inject/inject";
67

78
const log = logging.getLogger("pat.markdown");
@@ -29,11 +30,20 @@ const Markdown = Base.extend({
2930
async render(text) {
3031
const marked = (await import("marked")).marked;
3132
const DOMPurify = (await import("dompurify")).default;
32-
await import("../syntax-highlight/syntax-highlight").default;
33+
const SyntaxHighlight = (await import("../syntax-highlight/syntax-highlight")).default; // prettier-ignore
3334

3435
const wrapper = document.createElement("div");
3536
const parsed = DOMPurify.sanitize(marked.parse(text));
3637
wrapper.innerHTML = parsed;
38+
for (const item of wrapper.querySelectorAll("pre > code")) {
39+
const pre = item.parentElement;
40+
pre.classList.add("pat-syntax-highlight");
41+
// If the code block language was set in a fenced code block,
42+
// marked has already set the language as a class on the code tag.
43+
// pat-syntax-highlight will understand this.
44+
new SyntaxHighlight(pre);
45+
await events.await_event(pre, "init.syntax-highlight.patterns");
46+
}
3747
return $(wrapper);
3848
},
3949

src/pat/markdown/markdown.test.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,4 +159,28 @@ describe("pat-markdown", function () {
159159
).toBe("My title\n-------\nContent\n\n");
160160
});
161161
});
162+
163+
describe("Code blocks", function () {
164+
it("It correctly renders code blocks", async function () {
165+
document.body.innerHTML = `<div class="pat-markdown">
166+
# Title
167+
168+
some content
169+
170+
\`\`\`javascript
171+
const foo = "bar";
172+
\`\`\`
173+
</div>
174+
`;
175+
176+
new pattern(document.querySelector(".pat-markdown"));
177+
await utils.timeout(1); // wait a tick for async to settle.
178+
await utils.timeout(1); // wait a tick for async to settle.
179+
expect(document.body.querySelector(".pat-markdown > h1").textContent).toBe("Title"); // prettier-ignore
180+
expect(document.body.querySelector(".pat-markdown > p").textContent).toBe("some content"); // prettier-ignore
181+
expect(document.body.querySelector(".pat-markdown > pre code")).toBeTruthy(); // prettier-ignore
182+
expect(document.body.querySelector(".pat-markdown > pre.language-javascript code.language-javascript")).toBeTruthy(); // prettier-ignore
183+
expect(document.body.querySelector(".pat-markdown > pre code .token").textContent).toBeTruthy(); // prettier-ignore
184+
});
185+
});
162186
});

0 commit comments

Comments
 (0)