Newer
Older
navi-1 / webclient / src / utils / sourceHighlight.js
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
}