{
  "version": 3,
  "sources": ["../src/html.ts"],
  "sourcesContent": ["import { CopyButton } from '@substrate-system/copy-button/html'\nimport { DEFAULT_COPY_BUTTON_LABEL } from './constants.js'\n\nexport interface CodeBlockOptions {\n    code?:string\n    copyHint?:string|boolean\n    copyButtonLabel?:string\n    classes?:string[]\n    languageClass?:string\n}\n\ntype AttrValue = string|number|boolean|string[]|null|undefined\ntype CodeBlockRenderer = ((options?:CodeBlockOptions) => string) & {\n    outerHTML: (\n        options?:CodeBlockOptions,\n        attrs?:Record<string, AttrValue>\n    ) => string\n}\n\nfunction escapeHtml (str:string) {\n    return str\n        .replaceAll('&', '&amp;')\n        .replaceAll('<', '&lt;')\n        .replaceAll('>', '&gt;')\n        .replaceAll('\"', '&quot;')\n        .replaceAll(\"'\", '&#39;')\n}\n\nfunction toSafeAttributes (attrs:Record<string, AttrValue>) {\n    return Object.keys(attrs).reduce((result, key) => {\n        const value = attrs[key]\n        if (!value) return result\n        if (typeof value === 'boolean') {\n            return value ? `${result} ${key}`.trim() : result\n        }\n        const text = Array.isArray(value) ? value.join(' ') : String(value)\n        return `${result} ${key}=\"${escapeHtml(text)}\"`.trim()\n    }, '')\n}\n\nfunction getLanguageClassFromList (classNames:string[]) {\n    return classNames.find(name => name.startsWith('language-')) ?? ''\n}\n\nfunction getLanguageClassFromAttrs (attrs:Record<string, AttrValue>) {\n    const classValue = attrs.class\n    if (typeof classValue === 'string') {\n        return getLanguageClassFromList(\n            classValue.split(/\\s+/).filter(Boolean)\n        )\n    }\n    if (Array.isArray(classValue)) {\n        return getLanguageClassFromList(classValue)\n    }\n    return ''\n}\n\nfunction toCopyButtonMarkup (\n    code:string,\n    hint:string|boolean,\n    label:string\n) {\n    const attrs = toSafeAttributes({\n        'data-code-block-copy': true,\n        payload: code,\n        hint: hint !== false\n    })\n\n    const button = CopyButton({\n        classes: ['code-block-copy-icon'],\n        hint: typeof hint === 'string' ? escapeHtml(hint) : hint\n    }).replace(\n        'aria-label=\"Copy\"',\n        `aria-label=\"${escapeHtml(label)}\"`\n    )\n\n    return `<copy-button ${attrs}>${button}</copy-button>`\n}\n\nexport const CodeBlock:CodeBlockRenderer = (options:CodeBlockOptions = {}) => {\n    const code = options.code ?? ''\n    const hint = options.copyHint ?? true\n    const wrapperClasses = ['code-block-inner']\n        .concat(options.classes ?? [])\n        .filter(Boolean)\n        .join(' ')\n    const languageClass = (\n        options.languageClass ??\n        (options.classes ?? []).find(name => name.startsWith('language-')) ??\n        ''\n    ).trim()\n    const preClasses = [\n        'code-block-pre',\n        languageClass\n    ].filter(Boolean).join(' ')\n    const codeClasses = [languageClass].filter(Boolean).join(' ')\n    const label = options.copyButtonLabel?.trim() ||\n        DEFAULT_COPY_BUTTON_LABEL\n    const safeCode = escapeHtml(code)\n    const codeClassAttr = codeClasses\n        ? ` class=\"${escapeHtml(codeClasses)}\"`\n        : ''\n    const preMarkup = (\n        `<pre class=\"${escapeHtml(preClasses)}\" tabindex=\"0\">` +\n        `<code data-code-block-code${codeClassAttr}>${safeCode}</code></pre>`\n    )\n\n    return `<div class=\"${escapeHtml(wrapperClasses)}\" data-code-block-root>\n        ${preMarkup}\n        <div class=\"code-block-controls\">\n            ${toCopyButtonMarkup(code, hint, label)}\n        </div>\n        <span class=\"visually-hidden\" data-code-block-live ` +\n        `aria-live=\"polite\"></span>\n    </div>`\n}\n\nCodeBlock.outerHTML = (\n    options:CodeBlockOptions = {},\n    attrs:Record<string, AttrValue> = {}\n) => {\n    const hostAttributes = toSafeAttributes(attrs)\n    const rendered = CodeBlock({\n        ...options,\n        languageClass: options.languageClass ??\n            getLanguageClassFromAttrs(attrs)\n    })\n\n    return `<code-block${hostAttributes.length ? ` ${hostAttributes}` : ''}>\n        ${rendered}\n    </code-block>`\n}\n"],
  "mappings": "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",
  "names": []
}
