{"version":3,"file":"markdownItPrism.cjs","sources":["../src/index.ts"],"sourcesContent":["import Prism, { Grammar } from '@gerhobbelt/prismjs';\nimport loadLanguages from '@gerhobbelt/prismjs/components/index.js';\nimport MarkdownIt from '@gerhobbelt/markdown-it';\n\ninterface Options {\n\tplugins: string[]\n\t/**\n\t * Callback for Prism initialisation. Useful for initialising plugins.\n\t * @param prism The Prism instance that will be used by the plugin.\n\t */\n\tinit: (prism: typeof Prism) => void\n\t/**\n\t * The language to use for code blocks that specify a language that Prism does not know.\n\t */\n\tdefaultLanguageForUnknown?: string\n\t/**\n\t * The language to use for code blocks that do not specify a language.\n\t */\n\tdefaultLanguageForUnspecified?: string\n\t/**\n\t * Shorthand to set both {@code defaultLanguageForUnknown} and {@code defaultLanguageForUnspecified} to the same value. Will be copied\n\t * to each option if it is set to {@code undefined}.\n\t */\n\tdefaultLanguage?: string,\n\t/**\n\t * Function which will be invoked when the specified/default language is not known to Prism. The function is passed the error message, the specified language and the set of available languages.\n\t */\n\tnoKnownLanguageCallback?: any\n}\n\nconst DEFAULTS: Options = {\n  plugins: [],\n  init: () => {\n\t\t// do nothing by default\n  },\n  defaultLanguageForUnknown: undefined,\n  defaultLanguageForUnspecified: undefined,\n  defaultLanguage: undefined,\n  noKnownLanguageCallback: undefined\n};\n\n\n/**\n * Loads the provided {@code lang} into prism.\n *\n * @param lang\n *        Code of the language to load.\n * @return The Prism language object for the provided {@code lang} code. {@code undefined} if the language is not known to Prism.\n */\nfunction loadPrismLang(lang: string): Grammar | undefined {\n  if (!lang) return undefined;\n  let langObject = Prism.languages[lang];\n  if (langObject === undefined) {\n    loadLanguages([ lang ]);\n    langObject =  Prism.languages[lang];\n  }\n  return langObject;\n}\n\n/**\n * Loads the provided Prism plugin.a\n * @param name\n *        Name of the plugin to load\n * @throws {Error} If there is no plugin with the provided {@code name}\n */\nfunction loadPrismPlugin(name: string): void {\n  try {\n    require(`@gerhobbelt/prismjs/plugins/${name}/prism-${name}`);\n  } catch (e) {\n    throw new Error(`Cannot load Prism plugin \"${name}\". Please check the spelling.`);\n  }\n}\n\n\n/**\n * Select the language to use for highlighting, based on the provided options and the specified language.\n *\n * @param options\n *        The options that were used to initialise the plugin.\n * @param lang\n *        Code of the language to highlight the text in.\n * @return An array where the first element is the name of the language to use, and the second element is the PRISM language object for that language.\n */\nfunction selectLanguage(options: Options, lang: string): [string, Grammar | undefined] {\n  let langToUse = lang;\n  if (langToUse === '' && options.defaultLanguageForUnspecified !== undefined) {\n    langToUse = options.defaultLanguageForUnspecified;\n  }\n  let prismLang = loadPrismLang(langToUse);\n  if (prismLang === undefined && options.defaultLanguageForUnknown !== undefined) {\n    langToUse = options.defaultLanguageForUnknown;\n    prismLang = loadPrismLang(langToUse);\n  }\n  return [ langToUse, prismLang ];\n}\n\n/**\n * Highlights the provided text using Prism.\n *\n * @param markdownit\n *        Instance of MarkdownIt Class. This argument is bound in markdownItPrism().\n * @param options\n *        The options that have been used to initialise the plugin. This argument is bound in markdownItPrism().\n * @param text\n *        The text to highlight.\n * @param lang\n *        Code of the language to highlight the text in.\n * @return {@code text} wrapped in {@code &lt;pre&gt;} and {@code &lt;code&gt;}, both equipped with the appropriate class\n *  (markdown-it’s langPrefix + lang). If Prism knows {@code lang}, {@code text} will be highlighted by it.\n */\nfunction highlight(markdownit: MarkdownIt, options: Options, text: string, lang: string): string {\n  const [ langToUse, prismLang ] = selectLanguage(options, lang);\n  let code;\n  if (prismLang) {\n    code = Prism.highlight(text, prismLang, langToUse);\n  } else {\n    if (options.noKnownLanguageCallback && lang) {\n      options.noKnownLanguageCallback(`There is no Prism language '${lang}' for highlight chunk:\\n${text}`, lang, loadLanguages.getSupportedLanguages());\n    }\n    code = markdownit.utils.escapeHtml(text);\n  }\n  const classAttribute = langToUse ? ` class=\"${markdownit.options.langPrefix}${markdownit.utils.escapeHtml(langToUse)}\"` : '';\n  return `<pre${classAttribute}><code${classAttribute}>${code}</code></pre>`;\n}\n\n/**\n * Checks whether an option represents a valid Prism language\n *\n * @param options\n *        The options that have been used to initialise the plugin.\n * @param optionName\n *        The key of the option inside {@code options} that shall be checked.\n * @throws {Error} If the option is not set to a valid Prism language.\n */\nfunction checkLanguageOption(\n  options: Options,\n  optionName: 'defaultLanguage' | 'defaultLanguageForUnknown' | 'defaultLanguageForUnspecified'\n): void {\n  const language = options[optionName];\n  if (language !== undefined && loadPrismLang(language) === undefined) {\n    throw new Error(`Bad option ${optionName}: There is no Prism language '${language}'.`);\n  }\n}\n\n/**\n * Initialisation function of the plugin. This function is not called directly by clients, but is rather provided\n * to MarkdownIt’s {@link MarkdownIt.use} function.\n *\n * @param markdownit\n *        The markdown it instance the plugin is being registered to.\n * @param useroptions\n *        The options this plugin is being initialised with.\n */\nexport default function markdownItPrism(markdownit: MarkdownIt, useroptions: Options): void {\n  const options = Object.assign({}, DEFAULTS, useroptions);\n\n  checkLanguageOption(options, 'defaultLanguage');\n  checkLanguageOption(options, 'defaultLanguageForUnknown');\n  checkLanguageOption(options, 'defaultLanguageForUnspecified');\n  options.defaultLanguageForUnknown = options.defaultLanguageForUnknown || options.defaultLanguage;\n  options.defaultLanguageForUnspecified = options.defaultLanguageForUnspecified || options.defaultLanguage;\n\n  options.plugins.forEach(loadPrismPlugin);\n  options.init(Prism);\n\n\t// register ourselves as highlighter\n  markdownit.options.highlight = (text, lang) => highlight(markdownit, options, text, lang);\n}\n"],"names":["DEFAULTS","plugins","init","defaultLanguageForUnknown","undefined","defaultLanguageForUnspecified","defaultLanguage","noKnownLanguageCallback","loadPrismLang","lang","langObject","Prism","languages","loadLanguages","loadPrismPlugin","name","require","e","Error","selectLanguage","options","langToUse","prismLang","highlight","markdownit","text","code","getSupportedLanguages","utils","escapeHtml","classAttribute","langPrefix","checkLanguageOption","optionName","language","markdownItPrism","useroptions","Object","assign","forEach"],"mappings":"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"}