-
Notifications
You must be signed in to change notification settings - Fork 2
/
markedRenderer.cjs
61 lines (52 loc) · 2.01 KB
/
markedRenderer.cjs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
const { marked } = require('marked');
const highlight = require('highlight.js').default;
const cheerio = require('cheerio');
// Create a custom renderer
const renderer = new marked.Renderer();
// Override the default behavior for rendering <pre> tags
// (We override the code() method, which is responsible for rendering <pre> and <code> blocks.)
renderer.code = (code, language) => {
// console.log(code);
// Check if a language is specified
const validLanguage = !!(language && highlight.getLanguage(language));
// Highlight the code if a valid language is specified
const highlightedCode = validLanguage
? highlight.highlight(language, code).value
: code;
// console.log(highlightedCode);
// escape html encodings since they cause problems
const escapedCode = highlightedCode
.replace(/&/g, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/"/g, '"');
// Return the rendered HTML
// return `<pre><code class="${validLanguage ? 'hljs' : ''}">${highlightedCode}</code></pre>`;
// new alternative:
const codeWithClass = `<span class="${validLanguage ? 'hljs-code' : 'hljs-section'}">${escapedCode}</span>`;
return `<pre><code>${codeWithClass}</code></pre>`;
};
const markedOptions = {
renderer: renderer
};
const highlightFirstOptions = {
highlight: function(code, language) {
if (language && highlight.getLanguage(language)) {
let highlighted = highlight.highlight(code, language).value;
// If the language is JavaScript, handle strings containing HTML differently
if (language.toLowerCase() === 'javascript') {
highlighted = highlighted.replace(/`([^`]+)`/g, (match, p1) => {
return '`' + p1.replace(/</g, '<').replace(/>/g, '>').replace(/&/g, '&') + '`';
});
}
// console.log('highlighted', highlighted);
return highlighted;
}
// console.log('not highlighted', code);
return code;
}
};
module.exports = {
renderer: renderer,
markedOptions: highlightFirstOptions
}