mirror of
https://github.com/pengzhanbo/vuepress-theme-plume.git
synced 2026-04-23 10:58:13 +08:00
35 lines
996 B
TypeScript
35 lines
996 B
TypeScript
import type { App } from 'vuepress'
|
|
import fs from 'node:fs/promises'
|
|
import path from 'node:path'
|
|
import fg from 'fast-glob'
|
|
import { bundledLanguages } from 'shiki'
|
|
|
|
const languages = Object.keys(bundledLanguages)
|
|
const RE_FENCE = /`{3,}[^`]*?(\s|$)/g
|
|
|
|
export async function scanLanguages(app: App): Promise<string[]> {
|
|
const source = app.dir.source()
|
|
const pattern = ['**/*.md', '!.vuepress', '!node_modules']
|
|
const files = await fg(pattern, {
|
|
cwd: source,
|
|
})
|
|
const langs = new Set<string>()
|
|
|
|
for (const file of files) {
|
|
const filepath = path.join(source, file)
|
|
const content = await fs.readFile(filepath, 'utf-8')
|
|
const matched = content.match(RE_FENCE)
|
|
if (matched) {
|
|
for (const match of matched) {
|
|
let lang = match.replace(/`{3,}/, '').trim()
|
|
if (lang.includes(':'))
|
|
lang = lang.split(':')[0]
|
|
if (lang)
|
|
langs.add(lang)
|
|
}
|
|
}
|
|
}
|
|
|
|
return Array.from(langs).filter(lang => languages.includes(lang))
|
|
}
|