@stackoverfloweth/prefect-design
Version:
A collection of low-level Vue components.
94 lines (78 loc) • 2.85 kB
text/typescript
import { default as highlight, LanguageFn, HighlightResult } from 'highlight.js'
import css from 'highlight.js/lib/languages/css'
import jinja from 'highlight.js/lib/languages/django'
import javascript from 'highlight.js/lib/languages/javascript'
import markdown from 'highlight.js/lib/languages/markdown'
import python from 'highlight.js/lib/languages/python'
import xml from 'highlight.js/lib/languages/xml'
import yaml from 'highlight.js/lib/languages/yaml'
import { githubFlavoredMarkdownLanguage } from '@/components/CodeHighlight/languages/markdown'
import { vueLanguage } from '@/components/CodeHighlight/languages/vue'
import {
isJavascriptLanguageRef,
isJsonLanguageRef,
isPythonLanguageRef,
isCssLanguageRef,
isJinjaLanguageRef,
isHtmlLanguageRef,
isGithubFlavoredMarkdownLanguageRef,
isMarkdownLanguageRef,
isVueLanguageRef,
isYamlLanguageRef,
SupportedLanguage,
UnformattedMessagePayload,
FormattedMessagePayload
} from '@/types/codeHighlight'
const registeredLanguages: Set<SupportedLanguage> = new Set()
const highlightText = (text: string, lang: SupportedLanguage): HighlightResult => {
registerLanguage(lang)
return highlight.highlight(text, { language: lang })
}
const getLanguageFunctions = (lang: SupportedLanguage): Record<string, LanguageFn> => {
if (isJavascriptLanguageRef(lang) || isJsonLanguageRef(lang)) {
return { javascript }
}
if (isPythonLanguageRef(lang)) {
return { python }
}
if (isYamlLanguageRef(lang)) {
return { yaml }
}
if (isCssLanguageRef(lang)) {
return { css }
}
if (isJinjaLanguageRef(lang)) {
return { jinja }
}
if (isHtmlLanguageRef(lang) || isVueLanguageRef(lang)) {
return { xml, css, javascript, 'vue': vueLanguage }
}
if (isGithubFlavoredMarkdownLanguageRef(lang) || isMarkdownLanguageRef(lang)) {
return { 'gh-markdown': githubFlavoredMarkdownLanguage, markdown, xml, css, python, javascript, vueLanguage }
}
throw new Error(`Language ${lang} is not supported`)
}
const isRegistered = (lang: SupportedLanguage): boolean => registeredLanguages.has(lang)
const registerLanguage = (lang: SupportedLanguage): void => {
if (isRegistered(lang)) {
return
}
registeredLanguages.add(lang)
const languageFunctions = getLanguageFunctions(lang)
Object.entries(languageFunctions).forEach(([langRef, langFn]) => highlight.registerLanguage(langRef, langFn))
}
const handleMessage = (message: MessageEvent<UnformattedMessagePayload>): void => {
const { id, text, lang } = message.data
const { language, code, illegal, relevance, value } = highlightText(text, lang)
const response: FormattedMessagePayload = {
id,
unformatted: code,
formatted: value,
illegal,
relevance,
language,
}
self.postMessage(response)
}
self.onmessage = handleMessage
export default {}