-
-
Notifications
You must be signed in to change notification settings - Fork 29
/
Copy pathsupport.js
80 lines (70 loc) · 1.85 KB
/
support.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
/**
* @import {LanguageFn} from 'highlight.js'
* @import {ListItem, PhrasingContent, Root} from 'mdast'
*/
import fs from 'node:fs/promises'
import hljs from 'highlight.js'
import {zone} from 'mdast-zone'
/** @type {{common: Array<string>, uncommon: Array<string>}} */
const data = JSON.parse(
String(await fs.readFile(new URL('data.json', import.meta.url)))
)
const items = await Promise.all(
[...data.common, ...data.uncommon]
.sort(function (a, b) {
return a.localeCompare(b)
})
.map(function (d) {
return item(d)
})
)
/**
* Generate support.
*
* @returns
* Transform.
*/
export default function support() {
/**
* Transform.
*
* @param {Root} tree
* Tree.
* @returns {Promise<undefined>}
* Nothing.
*/
return async function (tree) {
zone(tree, 'support', function (start, _, end) {
return [start, {type: 'list', spread: false, children: items}, end]
})
}
}
/**
* @param {string} name
* Name.
* @returns {Promise<ListItem>}
* List item.
*/
async function item(name) {
/** @type {{default: LanguageFn}} */
const languageModule = await import('highlight.js/lib/languages/' + name)
const languageFunction = languageModule.default
const language = languageFunction(hljs)
/** @type {Array<PhrasingContent>} */
const content = [{type: 'inlineCode', value: name}]
let index = -1
if (language.aliases) {
content.push({type: 'text', value: ' ('})
while (++index < language.aliases.length) {
if (index) content.push({type: 'text', value: ', '})
content.push({type: 'inlineCode', value: language.aliases[index]})
}
content.push({type: 'text', value: ')'})
}
content.push({type: 'text', value: ' — ' + language.name})
return {
type: 'listItem',
checked: data.common.includes(name),
children: [{type: 'paragraph', children: content}]
}
}