-
Notifications
You must be signed in to change notification settings - Fork 10.3k
/
highlight-code.js
47 lines (41 loc) · 1.27 KB
/
highlight-code.js
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
const Prism = require(`prismjs`)
const _ = require(`lodash`)
const loadPrismLanguage = require(`./load-prism-language`)
module.exports = (language, code, lineNumbersHighlight = []) => {
// (Try to) load languages on demand.
if (!Prism.languages[language]) {
try {
loadPrismLanguage(language)
} catch (e) {
// Language wasn't loaded so let's bail.
if (language === `none`) {
return code // Don't escape if set to none.
} else {
return _.escape(code)
}
}
}
const lang = Prism.languages[language]
let highlightedCode = Prism.highlight(code, lang)
if (lineNumbersHighlight) {
const codeSplits = highlightedCode.split(`\n`).map((split, i) => {
if (_.includes(lineNumbersHighlight, i + 1)) {
return {
highlighted: true,
code: `<span class="gatsby-highlight-code-line">${split}\n</span>`,
}
} else {
return { code: split }
}
})
highlightedCode = ``
// Don't add a new line character after highlighted lines as they
// need to be display: block and full-width.
codeSplits.forEach(split => {
split.highlighted
? (highlightedCode += split.code)
: (highlightedCode += `${split.code}\n`)
})
}
return highlightedCode
}