forked from discohook/site
-
Notifications
You must be signed in to change notification settings - Fork 0
/
generateHljsLanguages.js
91 lines (74 loc) · 2.57 KB
/
generateHljsLanguages.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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
// @ts-check
/* eslint-disable @typescript-eslint/no-var-requires */
/* eslint-disable @typescript-eslint/prefer-nullish-coalescing */
const hljs = require("highlight.js")
const { get } = require("https")
/** @typedef {import("http").IncomingMessage} IncomingMessage */
/** @typedef {import("../modules/markdown/code/Language").Language} Language */
const HLJS_GIT_RAW_LANGUAGES_BASE_URL =
"https://raw.githubusercontent.com/highlightjs/highlight.js/master/src/languages"
/** @type {(language: string) => Promise<string[] | undefined>} */
async function getDependencies(language) {
/** @type {IncomingMessage} */
const message = await new Promise(resolve => {
get(`${HLJS_GIT_RAW_LANGUAGES_BASE_URL}/${language}.js`, resolve)
})
let source = ""
message.on("data", chunk => (source += chunk))
await new Promise(resolve => {
message.once("end", resolve)
})
const requires = source
.split(/\n|\r/g)
.find(line => line.startsWith("Requires:"))
if (!requires) return
return requires
.slice("Requires:".length)
.split(",")
.map(file => file.trim().replace(".js", ""))
.sort((first, second) => (first > second ? 1 : -1))
}
/** @type {(language: string) => Promise<Language>} */
async function getLanguage(language) {
const hljsLanguage = hljs.getLanguage(language)
if (!hljsLanguage)
throw new Error(`Language ${JSON.stringify(language)} not found.`)
const aliases = (hljsLanguage.aliases || [])
.map(alias => alias.toLowerCase())
.filter(alias => alias !== language)
.filter((alias, index, array) => array.indexOf(alias) === index)
.sort((first, second) => (first > second ? 1 : -1))
const dependencies = (await getDependencies(language)) || []
return {
name: language,
aliases: aliases.length === 0 ? undefined : aliases,
dependencies: dependencies.length === 0 ? undefined : dependencies,
}
}
/** @type {() => Generator<Promise<Language>>} */
function* getAllLanguages() {
const languages = hljs
.listLanguages()
.sort((first, second) => (first > second ? 1 : -1))
for (const language of languages) {
yield getLanguage(language)
}
}
async function main() {
console.log("[")
for await (const { name, aliases, dependencies } of getAllLanguages()) {
console.log(" {")
console.log(` name: "${name}",`)
if (aliases) {
console.log(` aliases: ["${aliases.join('", "')}"],`)
}
if (dependencies) {
console.log(` dependencies: ["${dependencies.join('", "')}"],`)
}
console.log(" },")
}
console.log("]")
}
main().catch(error => {
console.error(error)
})