mirror of
https://github.com/ggerganov/llama.cpp.git
synced 2025-02-07 17:03:14 +01:00
5478bbcd17
* add code highlighting and math formatting
* code cleanup
* build public/index.html
* rebuild public/index.html
* fixed coding style
* fixed coding style
* style fixes
* highlight: smaller bundle size, fix light & dark theme
* remove katex
* add bundle size check
* add more languages
* add php
* reuse some langs
* use gzip
* Revert "remove katex"
This reverts commit c0e5046acc
.
* use better maintained @vscode/markdown-it-katex
* fix gzip non deterministic
* ability to add a demo conversation for dev
* fix latex rendering
* add comment
* latex codeblock as code
---------
Co-authored-by: Xuan Son Nguyen <son@huggingface.co>
67 lines
1.8 KiB
JavaScript
67 lines
1.8 KiB
JavaScript
import katex from 'katex';
|
|
|
|
// Adapted from https://github.com/SchneeHertz/markdown-it-katex-gpt
|
|
// MIT license
|
|
|
|
const defaultOptions = {
|
|
delimiters: [
|
|
{ left: '\\[', right: '\\]', display: true },
|
|
{ left: '\\(', right: '\\)', display: false },
|
|
],
|
|
};
|
|
|
|
export function renderLatexHTML(content, display = false) {
|
|
return katex.renderToString(content, {
|
|
throwOnError: false,
|
|
output: 'mathml',
|
|
displayMode: display,
|
|
});
|
|
}
|
|
|
|
function escapedBracketRule(options) {
|
|
return (state, silent) => {
|
|
const max = state.posMax;
|
|
const start = state.pos;
|
|
|
|
for (const { left, right, display } of options.delimiters) {
|
|
|
|
// Check if it starts with the left delimiter
|
|
if (!state.src.slice(start).startsWith(left)) continue;
|
|
|
|
// Skip the length of the left delimiter
|
|
let pos = start + left.length;
|
|
|
|
// Find the matching right delimiter
|
|
while (pos < max) {
|
|
if (state.src.slice(pos).startsWith(right)) {
|
|
break;
|
|
}
|
|
pos++;
|
|
}
|
|
|
|
// No matching right delimiter found, skip to the next match
|
|
if (pos >= max) continue;
|
|
|
|
// If not in silent mode, convert LaTeX formula to MathML
|
|
if (!silent) {
|
|
const content = state.src.slice(start + left.length, pos);
|
|
try {
|
|
const renderedContent = renderLatexHTML(content, display);
|
|
const token = state.push('html_inline', '', 0);
|
|
token.content = renderedContent;
|
|
} catch (e) {
|
|
console.error(e);
|
|
}
|
|
}
|
|
|
|
// Update position, skip the length of the right delimiter
|
|
state.pos = pos + right.length;
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
|
|
export default function (md, options = defaultOptions) {
|
|
md.inline.ruler.after('text', 'escaped_bracket', escapedBracketRule(options));
|
|
}
|