@codedoc/core
Version:
Create beautiful modern documentation websites.
124 lines • 5.86 kB
JavaScript
import chalk from 'chalk';
import { highlight, languages } from 'prismjs';
const loadLanguages = /*#__PURE__*/ require('prismjs/components/');
import { CodeStyle } from './style';
import { parse } from './parse';
import { Icon } from '../misc';
import { underlineMarkerType } from './underline';
import { terminalOutput } from './term-output';
export function Code(options, renderer, content) {
renderer = renderer.plug(this.theme.styled(CodeStyle));
const classes = this.theme.classes(CodeStyle);
const extopts = { wmbar: undefined, filename: undefined };
let lang = undefined;
let safeHighlight = false;
let term = undefined;
let extras;
if (options.lang) {
[lang, ...extras] = options.lang.split('|').map(_ => _.trim());
if (lang === 'bash')
term = '$';
extras.forEach(ext => {
if (ext === '--wmbar')
extopts.wmbar = true;
else if (ext === '--no-wmbar')
extopts.wmbar = false;
else if (ext === '--safe-highlight')
safeHighlight = true;
else if (ext.startsWith('--term')) {
term = ext.split(' ').slice(1).join(' ') || '$';
}
else if (ext === '--no-term') {
term = undefined;
}
else {
extopts.filename = ext;
extopts.wmbar = true;
}
});
}
if (lang) {
if (!(lang in languages)) {
try {
loadLanguages([lang]);
}
catch (_) { }
finally {
if (!(lang in languages)) {
if (safeHighlight)
lang = undefined;
else
throw new Error(``
+ chalk `\n{redBright #}`
+ chalk `\n{redBright # Unrecognized Language::} ${lang}`
+ chalk `\n{redBright #} Check https://prismjs.com/#supported-languages for a list of supported languages.`
+ chalk `\n{redBright #}`
+ chalk `\n{redBright #} You can also add --safe-highlight flag to snippets with unsupported langauges.`
+ chalk `\n{redBright #} Check https://codedoc.cc/docs/code/overview#unsupported-languages for details.`
+ chalk `\n{redBright #}`);
}
}
}
}
const code$ = renderer.create("code", { class: `${lang} -codedoc-code-snippet`, tabindex: "0" },
renderer.create("span", { class: classes.wmbar },
renderer.create("span", null),
renderer.create("span", null),
renderer.create("span", null),
renderer.create("span", null, extopts.filename || '')));
const [code, lines, highlights, outputs] = parse(content[0], !!term);
const highlines = lang ? highlight(code, languages[lang], lang).split('\n') : code.split('\n');
let waving = 'none';
lines.forEach((line, index) => {
const highline = highlines[index];
const counter = index + 1;
let counter$;
if (counter === 1 || counter === lines.length || counter % 5 === 0)
counter$ = renderer.create("span", { class: `${classes.lineCounter} prim -codedoc-line-counter` }, counter);
else
counter$ = renderer.create("span", { class: `${classes.lineCounter} -codedoc-line-counter` }, counter);
renderer.render(renderer.create("span", { class: "-codedoc-line-link" },
renderer.create(Icon, null, "link"))).on(counter$);
const highlighted = highlights[index];
const line$ = renderer.create("div", { class: `${classes.line} ${highlighted} -codedoc-code-line`, "data-content": line, _innerHTML: highline });
line$.childNodes.forEach(child => {
var _a;
if (child instanceof HTMLElement && child.classList.contains('comment')) {
const _waving = underlineMarkerType(child.textContent || '');
if (_waving === 'error' || _waving === 'warning') {
if (_waving === waving)
waving = 'none';
else
waving = _waving;
child.hidden = true;
}
return;
}
if (waving !== 'none') {
let target = child;
if (!(target instanceof HTMLElement)) {
target = renderer.create("span", null, child.textContent);
child.replaceWith(target);
}
target.classList.add(waving);
renderer.render(renderer.create("span", { class: "wave" }, (_a = target.textContent) === null || _a === void 0 ? void 0 : _a.replace(/./g, '~'))).on(target);
}
});
if (line$.firstChild)
renderer.render(counter$).before(line$.firstChild);
else
renderer.render(counter$).on(line$);
if (!!term) {
renderer.render(renderer.create("span", { class: `${classes.termPrefix} -codedoc-code-term-prefix` }, term)).after(counter$);
}
renderer.render(line$).on(code$);
renderer.render(renderer.create("br", null)).on(code$);
if (!!term && outputs[index]) {
renderer.render(renderer.create("span", { class: `${classes.termOutput} -codedoc-code-term-output`, _innerHTML: terminalOutput(...outputs[index]) })).on(code$);
}
});
const wmbar = lines.length > 1 && (this.theme.theme.code.wmbar || extopts.wmbar) && extopts.wmbar !== false;
return renderer.create("pre", { class: wmbar ? 'with-bar' : '' }, code$);
}
export { CodeStyle } from './style';
//# sourceMappingURL=index.js.map