import hljs from 'highlight.js'
const EXTENSION_LANGUAGE = {
bash: 'bash',
c: 'c',
cjs: 'javascript',
conf: 'ini',
cpp: 'cpp',
css: 'css',
diff: 'diff',
go: 'go',
h: 'c',
hpp: 'cpp',
htm: 'xml',
html: 'xml',
ini: 'ini',
java: 'java',
js: 'javascript',
json: 'json',
jsonl: 'json',
jsx: 'javascript',
kt: 'kotlin',
less: 'less',
mjs: 'javascript',
md: 'markdown',
patch: 'diff',
php: 'php',
py: 'python',
rb: 'ruby',
rs: 'rust',
scad: 'openscad',
scss: 'scss',
sh: 'bash',
sql: 'sql',
svg: 'xml',
swift: 'swift',
toml: 'ini',
ts: 'typescript',
tsx: 'typescript',
xml: 'xml',
yaml: 'yaml',
yml: 'yaml',
zsh: 'bash',
}
const CONTENT_TYPE_LANGUAGE = {
html: 'xml',
svg: 'xml',
stl: 'openscad',
}
function languageOrPlaintext(language) {
return language && hljs.getLanguage(language) ? language : 'plaintext'
}
function extensionOf(value) {
const clean = String(value || '').split('?')[0].split('#')[0]
return clean.includes('.') ? clean.split('.').pop().toLowerCase() : ''
}
export function sourceLanguage(item = {}) {
const filename = item.source_filename || item.filename || item.url || ''
const language = EXTENSION_LANGUAGE[extensionOf(filename)] || CONTENT_TYPE_LANGUAGE[item.content_type]
return languageOrPlaintext(language)
}
export function highlightSource(source, language) {
return hljs.highlight(source || '', { language: languageOrPlaintext(language) }).value
}