@orangecheck/app-design 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -5
- package/dist/chrome.d.mts +31 -42
- package/dist/chrome.d.ts +31 -42
- package/dist/chrome.js +500 -23
- package/dist/chrome.js.map +1 -1
- package/dist/chrome.mjs +495 -25
- package/dist/chrome.mjs.map +1 -1
- package/dist/code.d.mts +52 -0
- package/dist/code.d.ts +52 -0
- package/dist/code.js +534 -0
- package/dist/code.js.map +1 -0
- package/dist/code.mjs +522 -0
- package/dist/code.mjs.map +1 -0
- package/dist/components.d.mts +61 -117
- package/dist/components.d.ts +61 -117
- package/dist/components.js +2170 -105
- package/dist/components.js.map +1 -1
- package/dist/components.mjs +2142 -109
- package/dist/components.mjs.map +1 -1
- package/dist/docs-DhnstueM.d.ts +219 -0
- package/dist/docs-DiR6s43s.d.mts +219 -0
- package/dist/format.d.mts +12 -0
- package/dist/format.d.ts +12 -0
- package/dist/format.js +65 -0
- package/dist/format.js.map +1 -0
- package/dist/format.mjs +58 -0
- package/dist/format.mjs.map +1 -0
- package/dist/hero-Dn37il-9.d.mts +31 -0
- package/dist/hero-Dn37il-9.d.ts +31 -0
- package/dist/index.d.mts +10 -3
- package/dist/index.d.ts +10 -3
- package/dist/index.js +2668 -131
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2614 -134
- package/dist/index.mjs.map +1 -1
- package/dist/mdx.d.mts +58 -0
- package/dist/mdx.d.ts +58 -0
- package/dist/mdx.js +1712 -0
- package/dist/mdx.js.map +1 -0
- package/dist/mdx.mjs +1685 -0
- package/dist/mdx.mjs.map +1 -0
- package/dist/primitives.d.mts +22 -5
- package/dist/primitives.d.ts +22 -5
- package/dist/primitives.js +51 -5
- package/dist/primitives.js.map +1 -1
- package/dist/primitives.mjs +51 -7
- package/dist/primitives.mjs.map +1 -1
- package/dist/session.d.mts +18 -0
- package/dist/session.d.ts +18 -0
- package/dist/session.js +432 -0
- package/dist/session.js.map +1 -0
- package/dist/session.mjs +401 -0
- package/dist/session.mjs.map +1 -0
- package/dist/styles/code.css +97 -0
- package/dist/styles/theme.css +2 -0
- package/dist/styles/tokens.css +40 -0
- package/dist/styles.css +1 -0
- package/dist/tool-shell-B1C7ahKE.d.ts +81 -0
- package/dist/tool-shell-BDx_N5ai.d.mts +81 -0
- package/dist/tools-BggNN5DV.d.ts +131 -0
- package/dist/tools-DFIxIj5p.d.mts +131 -0
- package/package.json +31 -2
package/dist/code.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/code/highlight.ts","../src/code/rehype.ts"],"names":[],"mappings":"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","file":"code.js","sourcesContent":["/*\n * Syntax highlighting with no dependency and no async step, so code is\n * coloured in the server's HTML: at build time in the docs (rehypeCode), and\n * in a page's own render for code made at run time (an envelope, an install\n * line). It reads the languages the family writes: TypeScript and JavaScript\n * (with JSX), JSON, shell, Python, YAML and diffs. Anything else is shown as\n * plain text, never guessed at.\n *\n * Each token names a kind; the kind is a class, and the class is a colour in\n * tokens.css (--oca-code-*). One palette for every highlighter: the shiki\n * theme in ./theme maps TextMate scopes onto the same variables.\n */\n\nexport type TokenKind =\n | 'keyword'\n | 'string'\n | 'number'\n | 'function'\n | 'type'\n | 'property'\n | 'comment'\n | 'tag'\n | 'url';\n\nexport interface Token {\n text: string;\n kind?: TokenKind;\n}\n\n/** One line of code, as tokens. */\nexport type CodeLine = Token[];\n\n/** The class each kind is drawn with (styles/code.css). */\nexport const TOKEN_CLASS: Record<TokenKind, string> = {\n keyword: 'oca-k',\n string: 'oca-s',\n number: 'oca-n',\n function: 'oca-f',\n type: 'oca-y',\n property: 'oca-p',\n comment: 'oca-c',\n tag: 'oca-g',\n url: 'oca-u',\n};\n\ntype Grammar = 'js' | 'json' | 'shell' | 'python' | 'yaml' | 'diff' | 'plain';\n\nconst ALIASES: Record<string, Grammar> = {\n ts: 'js',\n typescript: 'js',\n tsx: 'js',\n js: 'js',\n javascript: 'js',\n jsx: 'js',\n mjs: 'js',\n cjs: 'js',\n json: 'json',\n jsonc: 'json',\n json5: 'json',\n bash: 'shell',\n sh: 'shell',\n shell: 'shell',\n zsh: 'shell',\n console: 'shell',\n terminal: 'shell',\n py: 'python',\n python: 'python',\n yaml: 'yaml',\n yml: 'yaml',\n diff: 'diff',\n};\n\n/** The languages read, by the names a code fence uses. */\nexport const CODE_LANGS: readonly string[] = Object.keys(ALIASES);\n\nexport function grammarOf(lang?: string | null): Grammar {\n return (lang && ALIASES[lang.toLowerCase()]) || 'plain';\n}\n\n/* ── Scanner ─────────────────────────────────────────────────────────── */\n\ntype Emit = (text: string, kind?: TokenKind) => void;\n\n/** Collects tokens, merging neighbours of one kind so the markup stays small. */\nfunction collector(): { emit: Emit; tokens: Token[] } {\n const tokens: Token[] = [];\n const emit: Emit = (text, kind) => {\n if (!text) return;\n const last = tokens[tokens.length - 1];\n if (last && last.kind === kind) last.text += text;\n else tokens.push(kind ? { text, kind } : { text });\n };\n return { emit, tokens };\n}\n\nfunction at(re: RegExp, src: string, i: number): string | null {\n re.lastIndex = i;\n const m = re.exec(src);\n return m ? m[0] : null;\n}\n\nconst WS = /[ \\t]+/y;\nconst NEWLINE = /\\r?\\n/y;\n\n/* ── JavaScript, TypeScript, JSX ─────────────────────────────────────── */\n\nconst JS_KEYWORDS = new Set(\n (\n 'abstract as async await break case catch class const continue debugger declare default delete do else enum export ' +\n 'extends finally for from function get if implements import in infer instanceof interface is keyof let module ' +\n 'namespace new of override private protected public readonly return satisfies set static super switch this throw ' +\n 'try type typeof unique var void while with yield'\n ).split(' ')\n);\nconst JS_CONSTANTS = new Set(['true', 'false', 'null', 'undefined', 'NaN', 'Infinity']);\nconst TS_PRIMITIVES = new Set(['string', 'number', 'boolean', 'bigint', 'symbol', 'object', 'unknown', 'any', 'never']);\n\n/* MAX_SATS, DOCS_HREF: a constant. JSON, URL: a namespace, read as a type. */\nconst isConstant = (m: string) => /^[A-Z][A-Z\\d_]+$/.test(m) && (m.includes('_') || m.length > 4);\n\nconst JS_LINE_COMMENT = /\\/\\/[^\\n]*/y;\nconst JS_BLOCK_COMMENT = /\\/\\*[\\s\\S]*?(?:\\*\\/|$)/y;\nconst JS_TEMPLATE = /`(?:\\\\[\\s\\S]|[^\\\\`])*`?/y;\nconst JS_STRING = /'(?:\\\\.|[^\\\\'\\n])*'?|\"(?:\\\\.|[^\\\\\"\\n])*\"?/y;\nconst JS_NUMBER = /(?:0[xX][\\da-fA-F_]+|0[bB][01_]+|0[oO][0-7_]+|\\d[\\d_]*(?:\\.[\\d_]+)?(?:[eE][+-]?\\d+)?|\\.\\d[\\d_]*(?:[eE][+-]?\\d+)?)n?/y;\nconst JS_IDENT = /[A-Za-z_$][\\w$]*/y;\nconst JS_DECORATOR = /@[A-Za-z_$][\\w$.]*/y;\nconst JS_CALL_AFTER = /\\s*(?:<[\\w$\\s,.[\\]|&'\"]*>)?\\s*\\(/y;\nconst JS_TAG = /<\\/?(?=[A-Za-z])/y;\nconst JS_TAG_NAME = /[A-Za-z][\\w$.:-]*/y;\nconst JS_PUNCT = /=>|\\.\\.\\.|[{}()[\\];,.<>=+\\-*/%!?:&|^~#]/y;\n/* Where a JSX tag can start: after one of these, or at the start of a line. */\nconst JSX_BEFORE = new Set(['(', ',', '=', '?', ':', '{', '[', ';', '>', '&&', '||', '=>', 'return']);\n\nfunction scanJs(src: string, emit: Emit, jsx: boolean) {\n let i = 0;\n let prev = ''; // the last significant token, for property access and JSX starts\n let tagDepth = 0; // inside <Tag …> before its >\n let braceInTag = 0; // a {…} expression inside a tag's attributes\n const sig = (t: string) => {\n prev = t;\n };\n while (i < src.length) {\n let m: string | null;\n if ((m = at(WS, src, i)) || (m = at(NEWLINE, src, i))) {\n emit(m);\n i += m.length;\n continue;\n }\n if ((m = at(JS_LINE_COMMENT, src, i)) || (m = at(JS_BLOCK_COMMENT, src, i))) {\n emit(m, 'comment');\n i += m.length;\n continue;\n }\n if ((m = at(JS_TEMPLATE, src, i)) || (m = at(JS_STRING, src, i))) {\n emit(m, 'string');\n i += m.length;\n sig('\"');\n continue;\n }\n if (jsx && tagDepth === 0 && (m = at(JS_TAG, src, i)) && (prev === '' || JSX_BEFORE.has(prev))) {\n const name = at(JS_TAG_NAME, src, i + m.length);\n if (name) {\n emit(m);\n emit(name, 'tag');\n i += m.length + name.length;\n tagDepth = 1;\n braceInTag = 0;\n sig('tag');\n continue;\n }\n }\n if (jsx && tagDepth > 0 && braceInTag === 0) {\n if (src.startsWith('/>', i) || src[i] === '>') {\n const close = src[i] === '>' ? '>' : '/>';\n emit(close);\n i += close.length;\n tagDepth = 0;\n sig('>');\n continue;\n }\n if ((m = at(JS_IDENT, src, i)) && /^\\s*=/.test(src.slice(i + m.length, i + m.length + 4))) {\n emit(m, 'property');\n i += m.length;\n continue;\n }\n if ((m = at(JS_IDENT, src, i))) {\n emit(m, 'property');\n i += m.length;\n continue;\n }\n if (src[i] === '{') braceInTag = 1;\n } else if (jsx && tagDepth > 0 && braceInTag > 0) {\n if (src[i] === '{') braceInTag++;\n else if (src[i] === '}') braceInTag--;\n }\n if ((m = at(JS_DECORATOR, src, i))) {\n emit(m, 'function');\n i += m.length;\n sig('@');\n continue;\n }\n if ((m = at(JS_IDENT, src, i))) {\n const end = i + m.length;\n let kind: TokenKind | undefined;\n if (prev !== '.' && JS_CONSTANTS.has(m)) kind = 'number';\n else if (prev !== '.' && JS_KEYWORDS.has(m)) kind = 'keyword';\n else if (at(JS_CALL_AFTER, src, end) !== null) kind = 'function';\n else if (prev !== '.' && TS_PRIMITIVES.has(m)) kind = 'type';\n else if (isConstant(m)) kind = 'number';\n else if (/^[A-Z]/.test(m)) kind = 'type';\n emit(m, kind);\n i = end;\n sig(kind === 'keyword' ? m : 'id');\n continue;\n }\n if ((m = at(JS_NUMBER, src, i))) {\n emit(m, 'number');\n i += m.length;\n sig('0');\n continue;\n }\n if ((m = at(JS_PUNCT, src, i))) {\n emit(m);\n i += m.length;\n sig(m === '.' ? '.' : m);\n continue;\n }\n emit(src[i]!);\n i++;\n }\n}\n\n/* ── JSON ────────────────────────────────────────────────────────────── */\n\nconst JSON_STRING = /\"(?:\\\\.|[^\\\\\"\\n])*\"?/y;\nconst JSON_KEY_AFTER = /\\s*:/y;\nconst JSON_NUMBER = /-?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?/y;\nconst JSON_WORD = /true|false|null/y;\n\nfunction scanJson(src: string, emit: Emit) {\n let i = 0;\n while (i < src.length) {\n let m: string | null;\n if ((m = at(JS_LINE_COMMENT, src, i)) || (m = at(JS_BLOCK_COMMENT, src, i))) {\n emit(m, 'comment');\n } else if ((m = at(JSON_STRING, src, i))) {\n emit(m, at(JSON_KEY_AFTER, src, i + m.length) !== null ? 'property' : 'string');\n } else if ((m = at(JSON_NUMBER, src, i)) || (m = at(JSON_WORD, src, i))) {\n emit(m, 'number');\n } else {\n m = src[i]!;\n emit(m);\n }\n i += m.length;\n }\n}\n\n/* ── Shell ───────────────────────────────────────────────────────────── */\n\nconst SH_KEYWORDS = new Set(\n 'if then else elif fi for in do done case esac while until function return export local select time'.split(' ')\n);\nconst SH_PROMPT = /\\$ (?=\\S)/y;\nconst SH_COMMENT = /#[^\\n]*/y;\nconst SH_SINGLE = /'[^']*'?/y;\nconst SH_DOUBLE = /\"(?:\\\\.|[^\\\\\"])*\"?/y;\nconst SH_VAR = /\\$(?:\\{[^}\\n]*\\}?|[A-Za-z_][\\w]*|[@*#?$!\\d])/y;\nconst SH_URL = /https?:\\/\\/[^\\s'\"`)]+/y;\nconst SH_FLAG = /--?[A-Za-z][\\w-]*/y;\nconst SH_ASSIGN = /[A-Za-z_][\\w]*(?==)/y;\nconst SH_VALUE = /=[^\\s|&;()<>'\"`$]*/y;\nconst SH_WORD = /[^\\s|&;()<>'\"`$#]+/y;\nconst SH_OPERATOR = /\\|\\||&&|[|;&]|\\$\\(|[()<>]/y;\n\nfunction scanShell(src: string, emit: Emit) {\n let i = 0;\n let command = true; // the next word is a command\n let lineStart = true;\n while (i < src.length) {\n let m: string | null;\n if ((m = at(NEWLINE, src, i))) {\n emit(m);\n i += m.length;\n // A trailing backslash continues the command on the next line.\n command = !/\\\\\\s*$/.test(src.slice(0, i - m.length));\n lineStart = true;\n continue;\n }\n if ((m = at(WS, src, i))) {\n emit(m);\n i += m.length;\n continue;\n }\n if (lineStart && (m = at(SH_PROMPT, src, i))) {\n emit(m, 'comment');\n i += m.length;\n lineStart = false;\n continue;\n }\n lineStart = false;\n // A # starts a comment at the start of a word, not inside one (url#frag).\n if ((m = at(SH_COMMENT, src, i)) && (i === 0 || /\\s/.test(src[i - 1]!))) {\n emit(m, 'comment');\n i += m.length;\n continue;\n }\n if ((m = at(SH_SINGLE, src, i)) || (m = at(SH_DOUBLE, src, i))) {\n emit(m, 'string');\n i += m.length;\n command = false;\n continue;\n }\n if ((m = at(SH_OPERATOR, src, i))) {\n emit(m);\n i += m.length;\n command = m !== ')' && m !== '>' && m !== '<';\n continue;\n }\n if ((m = at(SH_VAR, src, i))) {\n emit(m, 'type');\n i += m.length;\n command = false;\n continue;\n }\n if ((m = at(SH_URL, src, i))) {\n emit(m, 'url');\n i += m.length;\n command = false;\n continue;\n }\n if (command && (m = at(SH_ASSIGN, src, i))) {\n // FOO=bar cmd: the name, then its value; the command comes after.\n emit(m, 'property');\n i += m.length;\n const v = at(SH_VALUE, src, i)!;\n emit(v);\n i += v.length;\n continue;\n }\n if ((m = at(SH_FLAG, src, i)) && !command) {\n emit(m, 'keyword');\n i += m.length;\n continue;\n }\n if ((m = at(SH_WORD, src, i))) {\n if (command && SH_KEYWORDS.has(m)) emit(m, 'keyword');\n else if (command) {\n emit(m, 'function');\n // `sudo npm …`, `npx tsx …`: the next word is the real command.\n command = m === 'sudo' || m === 'npx' || m === 'env' || m === 'time';\n i += m.length;\n continue;\n } else emit(m);\n i += m.length;\n continue;\n }\n emit(src[i]!);\n i++;\n }\n}\n\n/* ── Python ──────────────────────────────────────────────────────────── */\n\nconst PY_KEYWORDS = new Set(\n (\n 'and as assert async await break class continue def del elif else except finally for from global if import in is ' +\n 'lambda match case nonlocal not or pass raise return try while with yield self cls'\n ).split(' ')\n);\nconst PY_CONSTANTS = new Set(['True', 'False', 'None']);\nconst PY_TYPES = new Set(['int', 'str', 'bool', 'float', 'bytes', 'list', 'dict', 'tuple', 'set', 'object']);\nconst PY_COMMENT = /#[^\\n]*/y;\nconst PY_TRIPLE = /[rRbBuUfF]{0,2}(?:\"\"\"[\\s\\S]*?(?:\"\"\"|$)|'''[\\s\\S]*?(?:'''|$))/y;\nconst PY_STRING = /[rRbBuUfF]{0,2}(?:'(?:\\\\.|[^\\\\'\\n])*'?|\"(?:\\\\.|[^\\\\\"\\n])*\"?)/y;\nconst PY_NUMBER = /(?:0[xX][\\da-fA-F_]+|\\d[\\d_]*(?:\\.[\\d_]*)?(?:[eE][+-]?\\d+)?j?)/y;\nconst PY_IDENT = /[A-Za-z_]\\w*/y;\nconst PY_DECORATOR = /@[A-Za-z_][\\w.]*/y;\nconst PY_CALL_AFTER = /\\s*\\(/y;\n\nfunction scanPython(src: string, emit: Emit) {\n let i = 0;\n let prev = '';\n while (i < src.length) {\n let m: string | null;\n if ((m = at(WS, src, i)) || (m = at(NEWLINE, src, i))) {\n emit(m);\n i += m.length;\n continue;\n }\n if ((m = at(PY_COMMENT, src, i))) {\n emit(m, 'comment');\n } else if ((m = at(PY_TRIPLE, src, i)) || (m = at(PY_STRING, src, i))) {\n // An identifier like `f` or `rb` is only a prefix when a quote follows.\n if (/^[A-Za-z]+$/.test(m)) {\n emit(m);\n } else emit(m, 'string');\n prev = '\"';\n } else if ((m = at(PY_DECORATOR, src, i))) {\n emit(m, 'function');\n prev = '@';\n } else if ((m = at(PY_IDENT, src, i))) {\n let kind: TokenKind | undefined;\n if (PY_CONSTANTS.has(m)) kind = 'number';\n else if (prev !== '.' && PY_KEYWORDS.has(m)) kind = 'keyword';\n else if (prev === 'def' || at(PY_CALL_AFTER, src, i + m.length) !== null) kind = 'function';\n else if (prev === 'class' || /^[A-Z][a-z]/.test(m) || PY_TYPES.has(m)) kind = 'type';\n else if (isConstant(m)) kind = 'number';\n emit(m, kind);\n prev = kind === 'keyword' ? m : 'id';\n } else if ((m = at(PY_NUMBER, src, i))) {\n emit(m, 'number');\n prev = '0';\n } else {\n m = src[i]!;\n emit(m);\n prev = m;\n }\n i += m.length;\n }\n}\n\n/* ── YAML ────────────────────────────────────────────────────────────── */\n\nconst YAML_KEY = /[ \\t]*(?:- )?[\\w.$/-]+(?=[ \\t]*:(?:\\s|$))/y;\nconst YAML_VALUE_WORD = /(?:true|false|null|yes|no|~|-?\\d+(?:\\.\\d+)?)(?=\\s*(?:#|$))/y;\n\nfunction scanYaml(src: string, emit: Emit) {\n let i = 0;\n let lineStart = true;\n while (i < src.length) {\n let m: string | null;\n if ((m = at(NEWLINE, src, i))) {\n emit(m);\n i += m.length;\n lineStart = true;\n continue;\n }\n if (lineStart && (m = at(YAML_KEY, src, i))) {\n const dash = m.match(/^([ \\t]*(?:- )?)/)![1]!;\n emit(dash);\n emit(m.slice(dash.length), 'property');\n i += m.length;\n lineStart = false;\n continue;\n }\n lineStart = false;\n if ((m = at(SH_COMMENT, src, i)) && (i === 0 || /\\s/.test(src[i - 1]!))) emit(m, 'comment');\n else if ((m = at(SH_SINGLE, src, i)) || (m = at(JSON_STRING, src, i))) emit(m, 'string');\n else if ((m = at(YAML_VALUE_WORD, src, i))) emit(m, 'number');\n else if ((m = at(SH_URL, src, i))) emit(m, 'url');\n else {\n m = src[i]!;\n emit(m);\n }\n i += m.length;\n }\n}\n\n/* ── Lines ───────────────────────────────────────────────────────────── */\n\n/** Split tokens into lines; a token that spans lines (a block comment) is cut at each break. */\nfunction toLines(tokens: Token[]): CodeLine[] {\n const lines: CodeLine[] = [[]];\n for (const t of tokens) {\n const parts = t.text.split(/\\r?\\n/);\n parts.forEach((part, j) => {\n if (j > 0) lines.push([]);\n if (part) lines[lines.length - 1]!.push(t.kind ? { text: part, kind: t.kind } : { text: part });\n });\n }\n return lines;\n}\n\n/**\n * Highlight `code` written in `lang` (a fence name: ts, json, bash…). Returns\n * one array of tokens per line. An unknown language comes back as plain text.\n */\nexport function highlight(code: string, lang?: string | null): CodeLine[] {\n // A trailing newline (every fence has one) is not an extra empty line.\n const src = code.replace(/\\r?\\n$/, '');\n const grammar = grammarOf(lang);\n const { emit, tokens } = collector();\n const name = (lang ?? '').toLowerCase();\n switch (grammar) {\n case 'js':\n scanJs(src, emit, name === 'tsx' || name === 'jsx');\n break;\n case 'json':\n scanJson(src, emit);\n break;\n case 'shell':\n scanShell(src, emit);\n break;\n case 'python':\n scanPython(src, emit);\n break;\n case 'yaml':\n scanYaml(src, emit);\n break;\n default:\n emit(src);\n }\n return toLines(tokens);\n}\n\n/* ── Line marks: highlight, diff ─────────────────────────────────────── */\n\nexport type DiffMark = 'add' | 'remove';\n\nexport interface LineMarks {\n /** 1-based line numbers to mark as highlighted. */\n highlight?: ReadonlySet<number>;\n /** 1-based line numbers added or removed. */\n diff?: ReadonlyMap<number, DiffMark>;\n}\n\n/**\n * Read `+` and `-` at the start of each line as a diff, and return the code\n * without them and the marks. A line that starts with neither is context; a\n * single leading space (as `git diff` writes context) is dropped too.\n */\nexport function readDiff(code: string): { code: string; diff: Map<number, DiffMark> } {\n const diff = new Map<number, DiffMark>();\n const lines = code.replace(/\\r?\\n$/, '').split(/\\r?\\n/);\n const out = lines.map((line, i) => {\n const c = line[0];\n if (c === '+' || c === '-') {\n diff.set(i + 1, c === '+' ? 'add' : 'remove');\n return line.slice(1);\n }\n return c === ' ' ? line.slice(1) : line;\n });\n return { code: out.join('\\n'), diff };\n}\n\n/** \"1,3-5\" → {1, 3, 4, 5}. Out-of-order and repeated parts are fine. */\nexport function parseLineRanges(spec: string | readonly number[] | undefined | null): Set<number> {\n if (!spec) return new Set();\n if (typeof spec !== 'string') return new Set(spec);\n const out = new Set<number>();\n for (const part of spec.split(',')) {\n const m = part.trim().match(/^(\\d+)(?:\\s*-\\s*(\\d+))?$/);\n if (!m) continue;\n const a = Number(m[1]);\n const b = m[2] ? Number(m[2]) : a;\n for (let n = Math.min(a, b); n <= Math.max(a, b) && n - a < 10_000; n++) out.add(n);\n }\n return out;\n}\n\n/** What a fence's meta string says: ```ts title=\"gate.ts\" {2,4} diff showLineNumbers */\nexport interface CodeMeta {\n title?: string;\n highlight?: string;\n diff?: boolean;\n lineNumbers?: boolean;\n}\n\nexport function parseCodeMeta(meta?: string | null): CodeMeta {\n if (!meta) return {};\n const out: CodeMeta = {};\n const title = meta.match(/(?:title|filename)=(?:\"([^\"]*)\"|'([^']*)'|(\\S+))/);\n if (title) out.title = title[1] ?? title[2] ?? title[3];\n const lines = meta.match(/\\{([\\d,\\s-]+)\\}/);\n if (lines) out.highlight = lines[1]!.replace(/\\s+/g, '');\n const rest = meta.replace(/(?:title|filename)=(?:\"[^\"]*\"|'[^']*'|\\S+)/, '');\n if (/\\bdiff\\b/.test(rest)) out.diff = true;\n if (/\\b(?:showLineNumbers|lineNumbers|numbers)\\b/.test(rest)) out.lineNumbers = true;\n return out;\n}\n\n/* ── HTML ────────────────────────────────────────────────────────────── */\n\nconst ESCAPE: Record<string, string> = { '&': '&', '<': '<', '>': '>', '\"': '"' };\nexport function escapeHtml(s: string): string {\n return s.replace(/[&<>\"]/g, (c) => ESCAPE[c]!);\n}\n\n/**\n * Lines as markup for CodeBlock's `html`: one `<span data-line>` per line\n * (with `data-mark` or `data-diff` where marked), tokens as classed spans,\n * lines joined by newlines so selecting and copying keeps them.\n */\nexport function linesToHtml(lines: CodeLine[], marks: LineMarks = {}): string {\n return lines\n .map((line, i) => {\n const n = i + 1;\n const attrs = [\n 'data-line=\"\"',\n marks.highlight?.has(n) ? 'data-mark=\"\"' : '',\n marks.diff?.has(n) ? `data-diff=\"${marks.diff.get(n)}\"` : '',\n ]\n .filter(Boolean)\n .join(' ');\n const body = line\n .map((t) => (t.kind ? `<span class=\"${TOKEN_CLASS[t.kind]}\">${escapeHtml(t.text)}</span>` : escapeHtml(t.text)))\n .join('');\n return `<span ${attrs}>${body}</span>`;\n })\n .join('\\n');\n}\n\n/** Highlight and render in one step, reading `diff` and line ranges as CodeBlock does. */\nexport function highlightToHtml(\n code: string,\n lang?: string | null,\n opts: { highlight?: string | readonly number[]; diff?: boolean } = {}\n): string {\n const d = opts.diff ? readDiff(code) : null;\n return linesToHtml(highlight(d ? d.code : code, lang), {\n highlight: parseLineRanges(opts.highlight),\n diff: d?.diff,\n });\n}\n","import { highlight, linesToHtml, parseCodeMeta, parseLineRanges, readDiff, type CodeLine } from './highlight';\n\n/*\n * A rehype plugin for MDX (@next/mdx, @mdx-js/mdx): highlights every fenced\n * code block at build time and reads its meta, so a page ships coloured code\n * with no highlighter in the browser.\n *\n * ```ts title=\"gate.ts\" {2,4} a caption and two marked lines\n * ```diff + and - lines (or `diff` in the meta)\n * ```bash showLineNumbers numbered lines\n *\n * Each block becomes <pre data-oca-code data-html=\"…\" data-lang data-title\n * data-diff data-line-numbers>, which mdxComponents' `pre` hands to\n * CodeBlock. The highlighted markup travels as one string per block rather\n * than as an element per token, so a page's JavaScript grows by the size of\n * its code, not by a call for every word in it. No dependencies: it walks\n * the tree itself.\n */\n\ninterface HastNode {\n type: string;\n tagName?: string;\n value?: string;\n properties?: Record<string, unknown>;\n children?: HastNode[];\n data?: { meta?: string | null };\n}\n\nexport interface RehypeCodeOptions {\n /**\n * Replace the built-in highlighter, for instance with shiki's tokens\n * mapped onto these kinds. Return null to fall back to the built-in one.\n */\n tokenize?: (code: string, lang: string | undefined) => CodeLine[] | null;\n /** Fences to leave as they are. Default: mermaid (drawn by Diagram). */\n skip?: readonly string[];\n}\n\nfunction textOf(node: HastNode): string {\n if (node.type === 'text') return node.value ?? '';\n return (node.children ?? []).map(textOf).join('');\n}\n\nfunction langOf(code: HastNode): string | undefined {\n const cls = code.properties?.className;\n const list = Array.isArray(cls) ? cls : typeof cls === 'string' ? cls.split(' ') : [];\n for (const c of list) {\n const m = String(c).match(/^language-(.+)$/);\n if (m) return m[1];\n }\n return undefined;\n}\n\nexport function rehypeCode(options: RehypeCodeOptions = {}) {\n const skip = new Set(options.skip ?? ['mermaid']);\n const visit = (node: HastNode) => {\n for (const child of node.children ?? []) {\n const code = child.type === 'element' && child.tagName === 'pre' ? child.children?.[0] : undefined;\n if (code && code.type === 'element' && code.tagName === 'code' && child.children?.length === 1) {\n const lang = langOf(code);\n if (lang && skip.has(lang)) continue;\n const meta = parseCodeMeta(code.data?.meta);\n let source = textOf(code);\n const diff = meta.diff || lang === 'diff' ? readDiff(source) : null;\n if (diff) source = diff.code;\n const lines = options.tokenize?.(source, lang) ?? highlight(source, lang === 'diff' ? undefined : lang);\n child.properties = {\n ...child.properties,\n dataOcaCode: '',\n dataHtml: linesToHtml(lines, { highlight: parseLineRanges(meta.highlight), diff: diff?.diff }),\n ...(lang ? { dataLang: lang } : {}),\n ...(meta.title ? { dataTitle: meta.title } : {}),\n ...(diff ? { dataDiff: '' } : {}),\n ...(meta.lineNumbers ? { dataLineNumbers: '' } : {}),\n };\n child.children = [];\n continue;\n }\n visit(child);\n }\n };\n return (tree: HastNode) => visit(tree);\n}\n"]}
|
package/dist/code.mjs
ADDED
|
@@ -0,0 +1,522 @@
|
|
|
1
|
+
// src/code/highlight.ts
|
|
2
|
+
var TOKEN_CLASS = {
|
|
3
|
+
keyword: "oca-k",
|
|
4
|
+
string: "oca-s",
|
|
5
|
+
number: "oca-n",
|
|
6
|
+
function: "oca-f",
|
|
7
|
+
type: "oca-y",
|
|
8
|
+
property: "oca-p",
|
|
9
|
+
comment: "oca-c",
|
|
10
|
+
tag: "oca-g",
|
|
11
|
+
url: "oca-u"
|
|
12
|
+
};
|
|
13
|
+
var ALIASES = {
|
|
14
|
+
ts: "js",
|
|
15
|
+
typescript: "js",
|
|
16
|
+
tsx: "js",
|
|
17
|
+
js: "js",
|
|
18
|
+
javascript: "js",
|
|
19
|
+
jsx: "js",
|
|
20
|
+
mjs: "js",
|
|
21
|
+
cjs: "js",
|
|
22
|
+
json: "json",
|
|
23
|
+
jsonc: "json",
|
|
24
|
+
json5: "json",
|
|
25
|
+
bash: "shell",
|
|
26
|
+
sh: "shell",
|
|
27
|
+
shell: "shell",
|
|
28
|
+
zsh: "shell",
|
|
29
|
+
console: "shell",
|
|
30
|
+
terminal: "shell",
|
|
31
|
+
py: "python",
|
|
32
|
+
python: "python",
|
|
33
|
+
yaml: "yaml",
|
|
34
|
+
yml: "yaml",
|
|
35
|
+
diff: "diff"
|
|
36
|
+
};
|
|
37
|
+
var CODE_LANGS = Object.keys(ALIASES);
|
|
38
|
+
function grammarOf(lang) {
|
|
39
|
+
return lang && ALIASES[lang.toLowerCase()] || "plain";
|
|
40
|
+
}
|
|
41
|
+
function collector() {
|
|
42
|
+
const tokens = [];
|
|
43
|
+
const emit = (text, kind) => {
|
|
44
|
+
if (!text) return;
|
|
45
|
+
const last = tokens[tokens.length - 1];
|
|
46
|
+
if (last && last.kind === kind) last.text += text;
|
|
47
|
+
else tokens.push(kind ? { text, kind } : { text });
|
|
48
|
+
};
|
|
49
|
+
return { emit, tokens };
|
|
50
|
+
}
|
|
51
|
+
function at(re, src, i) {
|
|
52
|
+
re.lastIndex = i;
|
|
53
|
+
const m = re.exec(src);
|
|
54
|
+
return m ? m[0] : null;
|
|
55
|
+
}
|
|
56
|
+
var WS = /[ \t]+/y;
|
|
57
|
+
var NEWLINE = /\r?\n/y;
|
|
58
|
+
var JS_KEYWORDS = new Set(
|
|
59
|
+
"abstract as async await break case catch class const continue debugger declare default delete do else enum export extends finally for from function get if implements import in infer instanceof interface is keyof let module namespace new of override private protected public readonly return satisfies set static super switch this throw try type typeof unique var void while with yield".split(" ")
|
|
60
|
+
);
|
|
61
|
+
var JS_CONSTANTS = /* @__PURE__ */ new Set(["true", "false", "null", "undefined", "NaN", "Infinity"]);
|
|
62
|
+
var TS_PRIMITIVES = /* @__PURE__ */ new Set(["string", "number", "boolean", "bigint", "symbol", "object", "unknown", "any", "never"]);
|
|
63
|
+
var isConstant = (m) => /^[A-Z][A-Z\d_]+$/.test(m) && (m.includes("_") || m.length > 4);
|
|
64
|
+
var JS_LINE_COMMENT = /\/\/[^\n]*/y;
|
|
65
|
+
var JS_BLOCK_COMMENT = /\/\*[\s\S]*?(?:\*\/|$)/y;
|
|
66
|
+
var JS_TEMPLATE = /`(?:\\[\s\S]|[^\\`])*`?/y;
|
|
67
|
+
var JS_STRING = /'(?:\\.|[^\\'\n])*'?|"(?:\\.|[^\\"\n])*"?/y;
|
|
68
|
+
var JS_NUMBER = /(?:0[xX][\da-fA-F_]+|0[bB][01_]+|0[oO][0-7_]+|\d[\d_]*(?:\.[\d_]+)?(?:[eE][+-]?\d+)?|\.\d[\d_]*(?:[eE][+-]?\d+)?)n?/y;
|
|
69
|
+
var JS_IDENT = /[A-Za-z_$][\w$]*/y;
|
|
70
|
+
var JS_DECORATOR = /@[A-Za-z_$][\w$.]*/y;
|
|
71
|
+
var JS_CALL_AFTER = /\s*(?:<[\w$\s,.[\]|&'"]*>)?\s*\(/y;
|
|
72
|
+
var JS_TAG = /<\/?(?=[A-Za-z])/y;
|
|
73
|
+
var JS_TAG_NAME = /[A-Za-z][\w$.:-]*/y;
|
|
74
|
+
var JS_PUNCT = /=>|\.\.\.|[{}()[\];,.<>=+\-*/%!?:&|^~#]/y;
|
|
75
|
+
var JSX_BEFORE = /* @__PURE__ */ new Set(["(", ",", "=", "?", ":", "{", "[", ";", ">", "&&", "||", "=>", "return"]);
|
|
76
|
+
function scanJs(src, emit, jsx) {
|
|
77
|
+
let i = 0;
|
|
78
|
+
let prev = "";
|
|
79
|
+
let tagDepth = 0;
|
|
80
|
+
let braceInTag = 0;
|
|
81
|
+
const sig = (t) => {
|
|
82
|
+
prev = t;
|
|
83
|
+
};
|
|
84
|
+
while (i < src.length) {
|
|
85
|
+
let m;
|
|
86
|
+
if ((m = at(WS, src, i)) || (m = at(NEWLINE, src, i))) {
|
|
87
|
+
emit(m);
|
|
88
|
+
i += m.length;
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
if ((m = at(JS_LINE_COMMENT, src, i)) || (m = at(JS_BLOCK_COMMENT, src, i))) {
|
|
92
|
+
emit(m, "comment");
|
|
93
|
+
i += m.length;
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
if ((m = at(JS_TEMPLATE, src, i)) || (m = at(JS_STRING, src, i))) {
|
|
97
|
+
emit(m, "string");
|
|
98
|
+
i += m.length;
|
|
99
|
+
sig('"');
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
if (jsx && tagDepth === 0 && (m = at(JS_TAG, src, i)) && (prev === "" || JSX_BEFORE.has(prev))) {
|
|
103
|
+
const name = at(JS_TAG_NAME, src, i + m.length);
|
|
104
|
+
if (name) {
|
|
105
|
+
emit(m);
|
|
106
|
+
emit(name, "tag");
|
|
107
|
+
i += m.length + name.length;
|
|
108
|
+
tagDepth = 1;
|
|
109
|
+
braceInTag = 0;
|
|
110
|
+
sig("tag");
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
if (jsx && tagDepth > 0 && braceInTag === 0) {
|
|
115
|
+
if (src.startsWith("/>", i) || src[i] === ">") {
|
|
116
|
+
const close = src[i] === ">" ? ">" : "/>";
|
|
117
|
+
emit(close);
|
|
118
|
+
i += close.length;
|
|
119
|
+
tagDepth = 0;
|
|
120
|
+
sig(">");
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
if ((m = at(JS_IDENT, src, i)) && /^\s*=/.test(src.slice(i + m.length, i + m.length + 4))) {
|
|
124
|
+
emit(m, "property");
|
|
125
|
+
i += m.length;
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
if (m = at(JS_IDENT, src, i)) {
|
|
129
|
+
emit(m, "property");
|
|
130
|
+
i += m.length;
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
if (src[i] === "{") braceInTag = 1;
|
|
134
|
+
} else if (jsx && tagDepth > 0 && braceInTag > 0) {
|
|
135
|
+
if (src[i] === "{") braceInTag++;
|
|
136
|
+
else if (src[i] === "}") braceInTag--;
|
|
137
|
+
}
|
|
138
|
+
if (m = at(JS_DECORATOR, src, i)) {
|
|
139
|
+
emit(m, "function");
|
|
140
|
+
i += m.length;
|
|
141
|
+
sig("@");
|
|
142
|
+
continue;
|
|
143
|
+
}
|
|
144
|
+
if (m = at(JS_IDENT, src, i)) {
|
|
145
|
+
const end = i + m.length;
|
|
146
|
+
let kind;
|
|
147
|
+
if (prev !== "." && JS_CONSTANTS.has(m)) kind = "number";
|
|
148
|
+
else if (prev !== "." && JS_KEYWORDS.has(m)) kind = "keyword";
|
|
149
|
+
else if (at(JS_CALL_AFTER, src, end) !== null) kind = "function";
|
|
150
|
+
else if (prev !== "." && TS_PRIMITIVES.has(m)) kind = "type";
|
|
151
|
+
else if (isConstant(m)) kind = "number";
|
|
152
|
+
else if (/^[A-Z]/.test(m)) kind = "type";
|
|
153
|
+
emit(m, kind);
|
|
154
|
+
i = end;
|
|
155
|
+
sig(kind === "keyword" ? m : "id");
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
if (m = at(JS_NUMBER, src, i)) {
|
|
159
|
+
emit(m, "number");
|
|
160
|
+
i += m.length;
|
|
161
|
+
sig("0");
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
if (m = at(JS_PUNCT, src, i)) {
|
|
165
|
+
emit(m);
|
|
166
|
+
i += m.length;
|
|
167
|
+
sig(m === "." ? "." : m);
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
emit(src[i]);
|
|
171
|
+
i++;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
var JSON_STRING = /"(?:\\.|[^\\"\n])*"?/y;
|
|
175
|
+
var JSON_KEY_AFTER = /\s*:/y;
|
|
176
|
+
var JSON_NUMBER = /-?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?/y;
|
|
177
|
+
var JSON_WORD = /true|false|null/y;
|
|
178
|
+
function scanJson(src, emit) {
|
|
179
|
+
let i = 0;
|
|
180
|
+
while (i < src.length) {
|
|
181
|
+
let m;
|
|
182
|
+
if ((m = at(JS_LINE_COMMENT, src, i)) || (m = at(JS_BLOCK_COMMENT, src, i))) {
|
|
183
|
+
emit(m, "comment");
|
|
184
|
+
} else if (m = at(JSON_STRING, src, i)) {
|
|
185
|
+
emit(m, at(JSON_KEY_AFTER, src, i + m.length) !== null ? "property" : "string");
|
|
186
|
+
} else if ((m = at(JSON_NUMBER, src, i)) || (m = at(JSON_WORD, src, i))) {
|
|
187
|
+
emit(m, "number");
|
|
188
|
+
} else {
|
|
189
|
+
m = src[i];
|
|
190
|
+
emit(m);
|
|
191
|
+
}
|
|
192
|
+
i += m.length;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
var SH_KEYWORDS = new Set(
|
|
196
|
+
"if then else elif fi for in do done case esac while until function return export local select time".split(" ")
|
|
197
|
+
);
|
|
198
|
+
var SH_PROMPT = /\$ (?=\S)/y;
|
|
199
|
+
var SH_COMMENT = /#[^\n]*/y;
|
|
200
|
+
var SH_SINGLE = /'[^']*'?/y;
|
|
201
|
+
var SH_DOUBLE = /"(?:\\.|[^\\"])*"?/y;
|
|
202
|
+
var SH_VAR = /\$(?:\{[^}\n]*\}?|[A-Za-z_][\w]*|[@*#?$!\d])/y;
|
|
203
|
+
var SH_URL = /https?:\/\/[^\s'"`)]+/y;
|
|
204
|
+
var SH_FLAG = /--?[A-Za-z][\w-]*/y;
|
|
205
|
+
var SH_ASSIGN = /[A-Za-z_][\w]*(?==)/y;
|
|
206
|
+
var SH_VALUE = /=[^\s|&;()<>'"`$]*/y;
|
|
207
|
+
var SH_WORD = /[^\s|&;()<>'"`$#]+/y;
|
|
208
|
+
var SH_OPERATOR = /\|\||&&|[|;&]|\$\(|[()<>]/y;
|
|
209
|
+
function scanShell(src, emit) {
|
|
210
|
+
let i = 0;
|
|
211
|
+
let command = true;
|
|
212
|
+
let lineStart = true;
|
|
213
|
+
while (i < src.length) {
|
|
214
|
+
let m;
|
|
215
|
+
if (m = at(NEWLINE, src, i)) {
|
|
216
|
+
emit(m);
|
|
217
|
+
i += m.length;
|
|
218
|
+
command = !/\\\s*$/.test(src.slice(0, i - m.length));
|
|
219
|
+
lineStart = true;
|
|
220
|
+
continue;
|
|
221
|
+
}
|
|
222
|
+
if (m = at(WS, src, i)) {
|
|
223
|
+
emit(m);
|
|
224
|
+
i += m.length;
|
|
225
|
+
continue;
|
|
226
|
+
}
|
|
227
|
+
if (lineStart && (m = at(SH_PROMPT, src, i))) {
|
|
228
|
+
emit(m, "comment");
|
|
229
|
+
i += m.length;
|
|
230
|
+
lineStart = false;
|
|
231
|
+
continue;
|
|
232
|
+
}
|
|
233
|
+
lineStart = false;
|
|
234
|
+
if ((m = at(SH_COMMENT, src, i)) && (i === 0 || /\s/.test(src[i - 1]))) {
|
|
235
|
+
emit(m, "comment");
|
|
236
|
+
i += m.length;
|
|
237
|
+
continue;
|
|
238
|
+
}
|
|
239
|
+
if ((m = at(SH_SINGLE, src, i)) || (m = at(SH_DOUBLE, src, i))) {
|
|
240
|
+
emit(m, "string");
|
|
241
|
+
i += m.length;
|
|
242
|
+
command = false;
|
|
243
|
+
continue;
|
|
244
|
+
}
|
|
245
|
+
if (m = at(SH_OPERATOR, src, i)) {
|
|
246
|
+
emit(m);
|
|
247
|
+
i += m.length;
|
|
248
|
+
command = m !== ")" && m !== ">" && m !== "<";
|
|
249
|
+
continue;
|
|
250
|
+
}
|
|
251
|
+
if (m = at(SH_VAR, src, i)) {
|
|
252
|
+
emit(m, "type");
|
|
253
|
+
i += m.length;
|
|
254
|
+
command = false;
|
|
255
|
+
continue;
|
|
256
|
+
}
|
|
257
|
+
if (m = at(SH_URL, src, i)) {
|
|
258
|
+
emit(m, "url");
|
|
259
|
+
i += m.length;
|
|
260
|
+
command = false;
|
|
261
|
+
continue;
|
|
262
|
+
}
|
|
263
|
+
if (command && (m = at(SH_ASSIGN, src, i))) {
|
|
264
|
+
emit(m, "property");
|
|
265
|
+
i += m.length;
|
|
266
|
+
const v = at(SH_VALUE, src, i);
|
|
267
|
+
emit(v);
|
|
268
|
+
i += v.length;
|
|
269
|
+
continue;
|
|
270
|
+
}
|
|
271
|
+
if ((m = at(SH_FLAG, src, i)) && !command) {
|
|
272
|
+
emit(m, "keyword");
|
|
273
|
+
i += m.length;
|
|
274
|
+
continue;
|
|
275
|
+
}
|
|
276
|
+
if (m = at(SH_WORD, src, i)) {
|
|
277
|
+
if (command && SH_KEYWORDS.has(m)) emit(m, "keyword");
|
|
278
|
+
else if (command) {
|
|
279
|
+
emit(m, "function");
|
|
280
|
+
command = m === "sudo" || m === "npx" || m === "env" || m === "time";
|
|
281
|
+
i += m.length;
|
|
282
|
+
continue;
|
|
283
|
+
} else emit(m);
|
|
284
|
+
i += m.length;
|
|
285
|
+
continue;
|
|
286
|
+
}
|
|
287
|
+
emit(src[i]);
|
|
288
|
+
i++;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
var PY_KEYWORDS = new Set(
|
|
292
|
+
"and as assert async await break class continue def del elif else except finally for from global if import in is lambda match case nonlocal not or pass raise return try while with yield self cls".split(" ")
|
|
293
|
+
);
|
|
294
|
+
var PY_CONSTANTS = /* @__PURE__ */ new Set(["True", "False", "None"]);
|
|
295
|
+
var PY_TYPES = /* @__PURE__ */ new Set(["int", "str", "bool", "float", "bytes", "list", "dict", "tuple", "set", "object"]);
|
|
296
|
+
var PY_COMMENT = /#[^\n]*/y;
|
|
297
|
+
var PY_TRIPLE = /[rRbBuUfF]{0,2}(?:"""[\s\S]*?(?:"""|$)|'''[\s\S]*?(?:'''|$))/y;
|
|
298
|
+
var PY_STRING = /[rRbBuUfF]{0,2}(?:'(?:\\.|[^\\'\n])*'?|"(?:\\.|[^\\"\n])*"?)/y;
|
|
299
|
+
var PY_NUMBER = /(?:0[xX][\da-fA-F_]+|\d[\d_]*(?:\.[\d_]*)?(?:[eE][+-]?\d+)?j?)/y;
|
|
300
|
+
var PY_IDENT = /[A-Za-z_]\w*/y;
|
|
301
|
+
var PY_DECORATOR = /@[A-Za-z_][\w.]*/y;
|
|
302
|
+
var PY_CALL_AFTER = /\s*\(/y;
|
|
303
|
+
function scanPython(src, emit) {
|
|
304
|
+
let i = 0;
|
|
305
|
+
let prev = "";
|
|
306
|
+
while (i < src.length) {
|
|
307
|
+
let m;
|
|
308
|
+
if ((m = at(WS, src, i)) || (m = at(NEWLINE, src, i))) {
|
|
309
|
+
emit(m);
|
|
310
|
+
i += m.length;
|
|
311
|
+
continue;
|
|
312
|
+
}
|
|
313
|
+
if (m = at(PY_COMMENT, src, i)) {
|
|
314
|
+
emit(m, "comment");
|
|
315
|
+
} else if ((m = at(PY_TRIPLE, src, i)) || (m = at(PY_STRING, src, i))) {
|
|
316
|
+
if (/^[A-Za-z]+$/.test(m)) {
|
|
317
|
+
emit(m);
|
|
318
|
+
} else emit(m, "string");
|
|
319
|
+
prev = '"';
|
|
320
|
+
} else if (m = at(PY_DECORATOR, src, i)) {
|
|
321
|
+
emit(m, "function");
|
|
322
|
+
prev = "@";
|
|
323
|
+
} else if (m = at(PY_IDENT, src, i)) {
|
|
324
|
+
let kind;
|
|
325
|
+
if (PY_CONSTANTS.has(m)) kind = "number";
|
|
326
|
+
else if (prev !== "." && PY_KEYWORDS.has(m)) kind = "keyword";
|
|
327
|
+
else if (prev === "def" || at(PY_CALL_AFTER, src, i + m.length) !== null) kind = "function";
|
|
328
|
+
else if (prev === "class" || /^[A-Z][a-z]/.test(m) || PY_TYPES.has(m)) kind = "type";
|
|
329
|
+
else if (isConstant(m)) kind = "number";
|
|
330
|
+
emit(m, kind);
|
|
331
|
+
prev = kind === "keyword" ? m : "id";
|
|
332
|
+
} else if (m = at(PY_NUMBER, src, i)) {
|
|
333
|
+
emit(m, "number");
|
|
334
|
+
prev = "0";
|
|
335
|
+
} else {
|
|
336
|
+
m = src[i];
|
|
337
|
+
emit(m);
|
|
338
|
+
prev = m;
|
|
339
|
+
}
|
|
340
|
+
i += m.length;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
var YAML_KEY = /[ \t]*(?:- )?[\w.$/-]+(?=[ \t]*:(?:\s|$))/y;
|
|
344
|
+
var YAML_VALUE_WORD = /(?:true|false|null|yes|no|~|-?\d+(?:\.\d+)?)(?=\s*(?:#|$))/y;
|
|
345
|
+
function scanYaml(src, emit) {
|
|
346
|
+
let i = 0;
|
|
347
|
+
let lineStart = true;
|
|
348
|
+
while (i < src.length) {
|
|
349
|
+
let m;
|
|
350
|
+
if (m = at(NEWLINE, src, i)) {
|
|
351
|
+
emit(m);
|
|
352
|
+
i += m.length;
|
|
353
|
+
lineStart = true;
|
|
354
|
+
continue;
|
|
355
|
+
}
|
|
356
|
+
if (lineStart && (m = at(YAML_KEY, src, i))) {
|
|
357
|
+
const dash = m.match(/^([ \t]*(?:- )?)/)[1];
|
|
358
|
+
emit(dash);
|
|
359
|
+
emit(m.slice(dash.length), "property");
|
|
360
|
+
i += m.length;
|
|
361
|
+
lineStart = false;
|
|
362
|
+
continue;
|
|
363
|
+
}
|
|
364
|
+
lineStart = false;
|
|
365
|
+
if ((m = at(SH_COMMENT, src, i)) && (i === 0 || /\s/.test(src[i - 1]))) emit(m, "comment");
|
|
366
|
+
else if ((m = at(SH_SINGLE, src, i)) || (m = at(JSON_STRING, src, i))) emit(m, "string");
|
|
367
|
+
else if (m = at(YAML_VALUE_WORD, src, i)) emit(m, "number");
|
|
368
|
+
else if (m = at(SH_URL, src, i)) emit(m, "url");
|
|
369
|
+
else {
|
|
370
|
+
m = src[i];
|
|
371
|
+
emit(m);
|
|
372
|
+
}
|
|
373
|
+
i += m.length;
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
function toLines(tokens) {
|
|
377
|
+
const lines = [[]];
|
|
378
|
+
for (const t of tokens) {
|
|
379
|
+
const parts = t.text.split(/\r?\n/);
|
|
380
|
+
parts.forEach((part, j) => {
|
|
381
|
+
if (j > 0) lines.push([]);
|
|
382
|
+
if (part) lines[lines.length - 1].push(t.kind ? { text: part, kind: t.kind } : { text: part });
|
|
383
|
+
});
|
|
384
|
+
}
|
|
385
|
+
return lines;
|
|
386
|
+
}
|
|
387
|
+
function highlight(code, lang) {
|
|
388
|
+
const src = code.replace(/\r?\n$/, "");
|
|
389
|
+
const grammar = grammarOf(lang);
|
|
390
|
+
const { emit, tokens } = collector();
|
|
391
|
+
const name = (lang ?? "").toLowerCase();
|
|
392
|
+
switch (grammar) {
|
|
393
|
+
case "js":
|
|
394
|
+
scanJs(src, emit, name === "tsx" || name === "jsx");
|
|
395
|
+
break;
|
|
396
|
+
case "json":
|
|
397
|
+
scanJson(src, emit);
|
|
398
|
+
break;
|
|
399
|
+
case "shell":
|
|
400
|
+
scanShell(src, emit);
|
|
401
|
+
break;
|
|
402
|
+
case "python":
|
|
403
|
+
scanPython(src, emit);
|
|
404
|
+
break;
|
|
405
|
+
case "yaml":
|
|
406
|
+
scanYaml(src, emit);
|
|
407
|
+
break;
|
|
408
|
+
default:
|
|
409
|
+
emit(src);
|
|
410
|
+
}
|
|
411
|
+
return toLines(tokens);
|
|
412
|
+
}
|
|
413
|
+
function readDiff(code) {
|
|
414
|
+
const diff = /* @__PURE__ */ new Map();
|
|
415
|
+
const lines = code.replace(/\r?\n$/, "").split(/\r?\n/);
|
|
416
|
+
const out = lines.map((line, i) => {
|
|
417
|
+
const c = line[0];
|
|
418
|
+
if (c === "+" || c === "-") {
|
|
419
|
+
diff.set(i + 1, c === "+" ? "add" : "remove");
|
|
420
|
+
return line.slice(1);
|
|
421
|
+
}
|
|
422
|
+
return c === " " ? line.slice(1) : line;
|
|
423
|
+
});
|
|
424
|
+
return { code: out.join("\n"), diff };
|
|
425
|
+
}
|
|
426
|
+
function parseLineRanges(spec) {
|
|
427
|
+
if (!spec) return /* @__PURE__ */ new Set();
|
|
428
|
+
if (typeof spec !== "string") return new Set(spec);
|
|
429
|
+
const out = /* @__PURE__ */ new Set();
|
|
430
|
+
for (const part of spec.split(",")) {
|
|
431
|
+
const m = part.trim().match(/^(\d+)(?:\s*-\s*(\d+))?$/);
|
|
432
|
+
if (!m) continue;
|
|
433
|
+
const a = Number(m[1]);
|
|
434
|
+
const b = m[2] ? Number(m[2]) : a;
|
|
435
|
+
for (let n = Math.min(a, b); n <= Math.max(a, b) && n - a < 1e4; n++) out.add(n);
|
|
436
|
+
}
|
|
437
|
+
return out;
|
|
438
|
+
}
|
|
439
|
+
function parseCodeMeta(meta) {
|
|
440
|
+
if (!meta) return {};
|
|
441
|
+
const out = {};
|
|
442
|
+
const title = meta.match(/(?:title|filename)=(?:"([^"]*)"|'([^']*)'|(\S+))/);
|
|
443
|
+
if (title) out.title = title[1] ?? title[2] ?? title[3];
|
|
444
|
+
const lines = meta.match(/\{([\d,\s-]+)\}/);
|
|
445
|
+
if (lines) out.highlight = lines[1].replace(/\s+/g, "");
|
|
446
|
+
const rest = meta.replace(/(?:title|filename)=(?:"[^"]*"|'[^']*'|\S+)/, "");
|
|
447
|
+
if (/\bdiff\b/.test(rest)) out.diff = true;
|
|
448
|
+
if (/\b(?:showLineNumbers|lineNumbers|numbers)\b/.test(rest)) out.lineNumbers = true;
|
|
449
|
+
return out;
|
|
450
|
+
}
|
|
451
|
+
var ESCAPE = { "&": "&", "<": "<", ">": ">", '"': """ };
|
|
452
|
+
function escapeHtml(s) {
|
|
453
|
+
return s.replace(/[&<>"]/g, (c) => ESCAPE[c]);
|
|
454
|
+
}
|
|
455
|
+
function linesToHtml(lines, marks = {}) {
|
|
456
|
+
return lines.map((line, i) => {
|
|
457
|
+
const n = i + 1;
|
|
458
|
+
const attrs = [
|
|
459
|
+
'data-line=""',
|
|
460
|
+
marks.highlight?.has(n) ? 'data-mark=""' : "",
|
|
461
|
+
marks.diff?.has(n) ? `data-diff="${marks.diff.get(n)}"` : ""
|
|
462
|
+
].filter(Boolean).join(" ");
|
|
463
|
+
const body = line.map((t) => t.kind ? `<span class="${TOKEN_CLASS[t.kind]}">${escapeHtml(t.text)}</span>` : escapeHtml(t.text)).join("");
|
|
464
|
+
return `<span ${attrs}>${body}</span>`;
|
|
465
|
+
}).join("\n");
|
|
466
|
+
}
|
|
467
|
+
function highlightToHtml(code, lang, opts = {}) {
|
|
468
|
+
const d = opts.diff ? readDiff(code) : null;
|
|
469
|
+
return linesToHtml(highlight(d ? d.code : code, lang), {
|
|
470
|
+
highlight: parseLineRanges(opts.highlight),
|
|
471
|
+
diff: d?.diff
|
|
472
|
+
});
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
// src/code/rehype.ts
|
|
476
|
+
function textOf(node) {
|
|
477
|
+
if (node.type === "text") return node.value ?? "";
|
|
478
|
+
return (node.children ?? []).map(textOf).join("");
|
|
479
|
+
}
|
|
480
|
+
function langOf(code) {
|
|
481
|
+
const cls = code.properties?.className;
|
|
482
|
+
const list = Array.isArray(cls) ? cls : typeof cls === "string" ? cls.split(" ") : [];
|
|
483
|
+
for (const c of list) {
|
|
484
|
+
const m = String(c).match(/^language-(.+)$/);
|
|
485
|
+
if (m) return m[1];
|
|
486
|
+
}
|
|
487
|
+
return void 0;
|
|
488
|
+
}
|
|
489
|
+
function rehypeCode(options = {}) {
|
|
490
|
+
const skip = new Set(options.skip ?? ["mermaid"]);
|
|
491
|
+
const visit = (node) => {
|
|
492
|
+
for (const child of node.children ?? []) {
|
|
493
|
+
const code = child.type === "element" && child.tagName === "pre" ? child.children?.[0] : void 0;
|
|
494
|
+
if (code && code.type === "element" && code.tagName === "code" && child.children?.length === 1) {
|
|
495
|
+
const lang = langOf(code);
|
|
496
|
+
if (lang && skip.has(lang)) continue;
|
|
497
|
+
const meta = parseCodeMeta(code.data?.meta);
|
|
498
|
+
let source = textOf(code);
|
|
499
|
+
const diff = meta.diff || lang === "diff" ? readDiff(source) : null;
|
|
500
|
+
if (diff) source = diff.code;
|
|
501
|
+
const lines = options.tokenize?.(source, lang) ?? highlight(source, lang === "diff" ? void 0 : lang);
|
|
502
|
+
child.properties = {
|
|
503
|
+
...child.properties,
|
|
504
|
+
dataOcaCode: "",
|
|
505
|
+
dataHtml: linesToHtml(lines, { highlight: parseLineRanges(meta.highlight), diff: diff?.diff }),
|
|
506
|
+
...lang ? { dataLang: lang } : {},
|
|
507
|
+
...meta.title ? { dataTitle: meta.title } : {},
|
|
508
|
+
...diff ? { dataDiff: "" } : {},
|
|
509
|
+
...meta.lineNumbers ? { dataLineNumbers: "" } : {}
|
|
510
|
+
};
|
|
511
|
+
child.children = [];
|
|
512
|
+
continue;
|
|
513
|
+
}
|
|
514
|
+
visit(child);
|
|
515
|
+
}
|
|
516
|
+
};
|
|
517
|
+
return (tree) => visit(tree);
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
export { CODE_LANGS, TOKEN_CLASS, escapeHtml, grammarOf, highlight, highlightToHtml, linesToHtml, parseCodeMeta, parseLineRanges, readDiff, rehypeCode };
|
|
521
|
+
//# sourceMappingURL=code.mjs.map
|
|
522
|
+
//# sourceMappingURL=code.mjs.map
|