@vanduo-oss/vd3-cbun 1.3.2 → 1.4.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/CHANGELOG.md +18 -0
- package/README.md +16 -9
- package/SKILL.md +24 -11
- package/dist/code-editor/core.d.ts +19 -2
- package/dist/code-editor/highlight.cjs +1242 -0
- package/dist/code-editor/highlight.cjs.map +7 -0
- package/dist/code-editor/highlight.d.ts +6 -0
- package/dist/code-editor/highlight.js +1219 -0
- package/dist/code-editor/highlight.js.map +7 -0
- package/dist/code-editor/index.cjs +694 -70
- package/dist/code-editor/index.cjs.map +4 -4
- package/dist/code-editor/index.d.ts +2 -0
- package/dist/code-editor/index.js +694 -70
- package/dist/code-editor/index.js.map +4 -4
- package/dist/index.js +1 -1
- package/dist/index.js.map +2 -2
- package/dist/meta.json +144 -33
- package/package.json +6 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../src/code-editor/vue.js", "../../src/code-editor/tokenizer/scanner.js", "../../src/code-editor/tokenizer/javascript.js", "../../src/code-editor/tokenizer/
|
|
4
|
-
"sourcesContent": ["/**\n * Vue 3 bindings for @vanduo-oss/vd3-cbun/code-editor \u2014 the primary export.\n *\n * import { VdCodeEditor } from '@vanduo-oss/vd3-cbun/code-editor';\n * <VdCodeEditor v-model=\"code\" language=\"javascript\" @change=\"onChange\" />\n *\n * The editor core stays framework-agnostic in ./core.js. SSR-safe: the editor is\n * created on mount (client) into a plain container the server can pre-render.\n */\nimport { defineComponent, h, ref, onMounted, onBeforeUnmount, watch } from 'vue';\nimport { VdCodeEditor as VdCodeEditorCore } from './core.js';\n\nexport const VdCodeEditor = defineComponent({\n name: 'VdCodeEditor',\n props: {\n /** Editor contents (v-model). */\n modelValue: { type: String, default: '' },\n /** Syntax language id or alias (e.g. `js`, `python`, `plaintext`). */\n language: { type: String, default: 'plaintext' },\n /** Render as a non-editable viewer (copy still works). */\n readOnly: { type: Boolean, default: false },\n /** Show the line-number gutter (ignored in wrap mode). */\n lineNumbers: { type: Boolean, default: true },\n /** Indent width, in spaces. */\n tabSize: { type: Number, default: 2 },\n /** Empty-state placeholder text. */\n placeholder: { type: String, default: '' },\n /** Native `maxlength` cap on the content. */\n maxLength: { type: Number, default: undefined },\n /** Soft-wrap long lines (disables the gutter + active-line). */\n wrap: { type: Boolean, default: false },\n /** Auto-close brackets/quotes and step over closers. */\n autoClose: { type: Boolean, default: true },\n /** Highlight the caret's line (ignored in wrap mode). */\n highlightActiveLine: { type: Boolean, default: true },\n /** Skip highlighting above this many characters (perf guard). */\n maxHighlightLength: { type: Number, default: 100000 },\n /** Native spellcheck on the textarea. */\n spellcheck: { type: Boolean, default: false },\n /** Show the copy-to-clipboard button (when the clipboard API exists). */\n copy: { type: Boolean, default: true },\n /** Accessible label for the textarea. */\n ariaLabel: { type: String, default: 'Code editor' },\n },\n emits: ['update:modelValue', 'change', 'focus', 'blur', 'ready'],\n setup(props, { emit, expose }) {\n const el = ref(null);\n let instance = null;\n\n const create = () => {\n instance = new VdCodeEditorCore({\n element: el.value,\n value: props.modelValue,\n language: props.language,\n readOnly: props.readOnly,\n lineNumbers: props.lineNumbers,\n tabSize: props.tabSize,\n placeholder: props.placeholder,\n maxLength: props.maxLength,\n wrap: props.wrap,\n autoClose: props.autoClose,\n highlightActiveLine: props.highlightActiveLine,\n maxHighlightLength: props.maxHighlightLength,\n spellcheck: props.spellcheck,\n copy: props.copy,\n ariaLabel: props.ariaLabel,\n });\n instance.on('change', (payload) => {\n emit('update:modelValue', payload.value);\n emit('change', payload.value);\n });\n instance.on('focus', (e) => emit('focus', e));\n instance.on('blur', (e) => emit('blur', e));\n emit('ready', instance);\n };\n\n const teardown = () => {\n if (instance) {\n instance.destroy();\n instance = null;\n }\n };\n\n onMounted(() => {\n if (typeof window === 'undefined' || !el.value) return;\n create();\n });\n\n // v-model: push external changes in without echoing a change back out.\n watch(\n () => props.modelValue,\n (next) => {\n if (instance && next !== instance.getValue()) instance.setValue(next, { silent: true });\n },\n );\n\n // Cheap props apply live.\n watch(\n () => props.language,\n (v) => instance && instance.setLanguage(v),\n );\n watch(\n () => props.readOnly,\n (v) => instance && instance.setReadOnly(v),\n );\n watch(\n () => props.tabSize,\n (v) => instance && instance.setTabSize(v),\n );\n watch(\n () => props.placeholder,\n (v) => instance && instance.setPlaceholder(v),\n );\n watch(\n () => props.autoClose,\n (v) => instance && instance.setAutoClose(v),\n );\n\n // Structural props recreate the editor (mirrors the flowchart wrapper).\n watch(\n () => [\n props.lineNumbers,\n props.wrap,\n props.highlightActiveLine,\n props.spellcheck,\n props.maxLength,\n props.maxHighlightLength,\n props.copy,\n props.ariaLabel,\n ],\n () => {\n if (!instance) return;\n teardown();\n create();\n },\n );\n\n onBeforeUnmount(teardown);\n\n expose({\n getInstance: () => instance,\n focus: () => instance && instance.focus(),\n blur: () => instance && instance.blur(),\n getValue: () => (instance ? instance.getValue() : props.modelValue),\n setValue: (value) => instance && instance.setValue(value),\n getSelection: () => (instance ? instance.getSelection() : { start: 0, end: 0, text: '' }),\n setSelection: (start, end) => instance && instance.setSelection(start, end),\n insertText: (text) => instance && instance.insertText(text),\n getContainer: () => el.value,\n });\n\n return () => h('div', { ref: el, class: 'vd-code-editor' });\n },\n});\n", "// The shared, ReDoS-safe tokenizer engine.\n//\n// Every language tokenizer is an ordered list of rules `{ type, re }` (or\n// `{ expand, re }`), where each `re` is a STICKY (`y`) regex. `scan()` tries the\n// rules at the current index; the first whose regex matches (consuming >=1 char)\n// wins. Any run of characters no rule matches becomes a single `plain` token.\n//\n// Because every rule is anchored at `lastIndex` and consumes at least one\n// character, scanning is linear in the input length \u2014 there is no cross-position\n// backtracking. Rule regexes must themselves avoid nested unbounded quantifiers\n// (no `(a+)+`) so a single rule can never backtrack catastrophically either.\n\n/**\n * Tokenize `source` with the ordered `rules`. Returns `{ type, value }[]`.\n * Guarantee: `tokens.map((t) => t.value).join('') === source` (lossless).\n */\nexport function scan(source, rules) {\n const tokens = [];\n const n = source.length;\n let i = 0;\n let plainStart = -1;\n\n const flushPlain = (end) => {\n if (plainStart !== -1 && end > plainStart) {\n tokens.push({ type: 'plain', value: source.slice(plainStart, end) });\n }\n plainStart = -1;\n };\n\n while (i < n) {\n let matched = false;\n for (let r = 0; r < rules.length; r++) {\n const rule = rules[r];\n rule.re.lastIndex = i;\n const m = rule.re.exec(source);\n if (m && m[0].length > 0) {\n flushPlain(i);\n const value = m[0];\n if (rule.expand) {\n const sub = rule.expand(value);\n for (let k = 0; k < sub.length; k++) tokens.push(sub[k]);\n } else {\n tokens.push({ type: rule.type, value });\n }\n i += value.length;\n matched = true;\n break;\n }\n }\n if (!matched) {\n if (plainStart === -1) plainStart = i;\n i++;\n }\n }\n flushPlain(n);\n return coalesce(tokens);\n}\n\n/**\n * Merge adjacent tokens of the same type into one, cutting the DOM node count.\n * Lossless \u2014 values are concatenated in order.\n */\nexport function coalesce(tokens) {\n if (tokens.length < 2) return tokens;\n const out = [{ type: tokens[0].type, value: tokens[0].value }];\n for (let i = 1; i < tokens.length; i++) {\n const cur = tokens[i];\n const prev = out[out.length - 1];\n if (cur.type === prev.type) prev.value += cur.value;\n else out.push({ type: cur.type, value: cur.value });\n }\n return out;\n}\n\n/**\n * Build a sticky, word-boundaried alternation from a list of identifier words\n * (all `[A-Za-z0-9_]`, so no escaping needed). Longer words first so the\n * alternation is order-independent even without relying on `\\b`.\n */\nexport function wordRegex(words, flags) {\n const sorted = [...words].sort((a, b) => b.length - a.length);\n return new RegExp('(?:' + sorted.join('|') + ')\\\\b', (flags || '') + 'y');\n}\n", "// JavaScript / TypeScript tokenizer. One rule set, parameterized by keyword\n// list: TypeScript is JavaScript plus a superset of type-level keywords.\n\nimport { scan, wordRegex } from './scanner.js';\n\nconst JS_KEYWORDS = [\n 'break',\n 'case',\n 'catch',\n 'class',\n 'const',\n 'continue',\n 'debugger',\n 'default',\n 'delete',\n 'do',\n 'else',\n 'export',\n 'extends',\n 'finally',\n 'for',\n 'function',\n 'if',\n 'import',\n 'in',\n 'instanceof',\n 'new',\n 'return',\n 'super',\n 'switch',\n 'this',\n 'throw',\n 'try',\n 'typeof',\n 'var',\n 'void',\n 'while',\n 'with',\n 'yield',\n 'async',\n 'await',\n 'let',\n 'static',\n 'get',\n 'set',\n 'of',\n 'as',\n 'from',\n];\n\nconst TS_KEYWORDS = [\n ...JS_KEYWORDS,\n 'interface',\n 'type',\n 'enum',\n 'implements',\n 'declare',\n 'namespace',\n 'readonly',\n 'satisfies',\n 'abstract',\n 'public',\n 'private',\n 'protected',\n 'keyof',\n 'infer',\n 'is',\n 'asserts',\n 'override',\n 'module',\n 'string',\n 'number',\n 'boolean',\n 'object',\n 'symbol',\n 'bigint',\n 'any',\n 'unknown',\n 'never',\n];\n\nconst BUILTINS = [\n 'console',\n 'window',\n 'document',\n 'globalThis',\n 'Math',\n 'JSON',\n 'Object',\n 'Array',\n 'String',\n 'Number',\n 'Boolean',\n 'Symbol',\n 'Promise',\n 'Map',\n 'Set',\n 'WeakMap',\n 'WeakSet',\n 'Date',\n 'RegExp',\n 'Error',\n 'Function',\n 'parseInt',\n 'parseFloat',\n 'isNaN',\n 'isFinite',\n 'require',\n 'module',\n 'exports',\n 'process',\n 'NaN',\n 'Infinity',\n];\n\nfunction makeRules(keywords) {\n return [\n { type: 'comment', re: /\\/\\/[^\\n]*/y },\n { type: 'comment', re: /\\/\\*[\\s\\S]*?(?:\\*\\/|$)/y }, // unterminated -> comment to EOF\n { type: 'string', re: /\"(?:[^\"\\\\\\n]|\\\\.)*\"?/y },\n { type: 'string', re: /'(?:[^'\\\\\\n]|\\\\.)*'?/y },\n { type: 'string', re: /`(?:[^`\\\\]|\\\\.)*`?/y },\n {\n type: 'number',\n re: /0[xX][\\da-fA-F_]+n?|0[bB][01_]+n?|0[oO][0-7_]+n?|(?:\\d[\\d_]*\\.?[\\d_]*|\\.\\d[\\d_]*)(?:[eE][+-]?\\d+)?n?/y,\n },\n { type: 'keyword', re: wordRegex(keywords) },\n { type: 'boolean', re: /(?:true|false)\\b/y },\n { type: 'null', re: /(?:null|undefined)\\b/y },\n { type: 'builtin', re: wordRegex(BUILTINS) },\n { type: 'function', re: /[A-Za-z_$][\\w$]*(?=\\s*\\()/y },\n { type: 'plain', re: /[A-Za-z_$][\\w$]*/y },\n { type: 'operator', re: /\\.{3}|=>|[+\\-*/%=<>!&|^~?]+/y },\n { type: 'punctuation', re: /[{}()[\\];,.:]/y },\n ];\n}\n\nconst JS_RULES = makeRules(JS_KEYWORDS);\nconst TS_RULES = makeRules(TS_KEYWORDS);\n\nexport function tokenizeJavaScript(source) {\n return scan(source, JS_RULES);\n}\n\nexport function tokenizeTypeScript(source) {\n return scan(source, TS_RULES);\n}\n", "// HTML / XML tokenizer. Full tags are matched as one unit, then expanded into\n// tag-name / attribute / value sub-tokens so the tag name and attributes color\n// independently without the scanner needing any \"inside a tag\" state.\n\nimport { scan } from './scanner.js';\n\n// Split a matched tag (e.g. `<div class=\"x\" id='y'>`) into sub-tokens whose\n// values concatenate back to the input exactly (lossless).\nfunction expandTag(value) {\n const out = [];\n const open = /^<\\/?/.exec(value)[0];\n out.push({ type: 'punctuation', value: open });\n let rest = value.slice(open.length);\n\n const name = /^[a-zA-Z][\\w:-]*/.exec(rest);\n if (name) {\n out.push({ type: 'tag', value: name[0] });\n rest = rest.slice(name[0].length);\n }\n\n if (rest) {\n const inner = scan(rest, [\n { type: 'string', re: /\"[^\"]*\"?|'[^']*'?/y },\n { type: 'operator', re: /=/y },\n { type: 'punctuation', re: /\\/?>/y },\n { type: 'attribute', re: /[a-zA-Z_:@][\\w:.-]*/y },\n ]);\n for (let i = 0; i < inner.length; i++) out.push(inner[i]);\n }\n return out;\n}\n\n// The tag name (`[\\w:-]*`) and each attribute are separated by required\n// whitespace (`\\s+`), so the name run and the attribute run never overlap \u2014\n// which keeps the match linear (no catastrophic backtracking) even on an\n// unterminated tag like `<` + a very long identifier.\nconst RULES = [\n { type: 'comment', re: /<!--[\\s\\S]*?-->/y },\n { type: 'meta', re: /<!\\[CDATA\\[[\\s\\S]*?\\]\\]>/y },\n { type: 'meta', re: /<!DOCTYPE[^>]*>/iy },\n {\n expand: expandTag,\n re: /<\\/?[a-zA-Z][\\w:-]*(?:\\s+[^\\s/>\"'=]+(?:\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s>]+))?)*\\s*\\/?>/y,\n },\n { expand: expandTag, re: /<\\/?[a-zA-Z][\\w:-]*/y },\n { type: 'meta', re: /&[a-zA-Z][a-zA-Z0-9]*;|&#\\d+;|&#x[0-9a-fA-F]+;/y },\n];\n\nexport function tokenizeHtml(source) {\n return scan(source, RULES);\n}\n", "// CSS tokenizer. A flat, stateless scan: comments, strings, at-rules, hex\n// colors, numbers+units, `!important`, property names (before a colon),\n// function names (before a paren), punctuation, and combinators.\n\nimport { scan } from './scanner.js';\n\nconst RULES = [\n { type: 'comment', re: /\\/\\*[\\s\\S]*?(?:\\*\\/|$)/y }, // unterminated -> comment to EOF\n { type: 'string', re: /\"(?:[^\"\\\\\\n]|\\\\.)*\"?|'(?:[^'\\\\\\n]|\\\\.)*'?/y },\n { type: 'meta', re: /@[a-zA-Z-]+/y },\n { type: 'keyword', re: /!important\\b/y },\n { type: 'number', re: /#[0-9a-fA-F]{3,8}\\b/y },\n { type: 'number', re: /-?(?:\\d*\\.\\d+|\\d+)(?:%|[a-zA-Z]{1,4})?/y },\n { type: 'property', re: /[-a-zA-Z]+(?=\\s*:)/y },\n { type: 'function', re: /[-a-zA-Z][\\w-]*(?=\\()/y },\n { type: 'punctuation', re: /[{}()[\\];:,]/y },\n { type: 'operator', re: /[>+~*]/y },\n // Catch-all: consume an identifier/dash run (or whitespace) in one match so\n // the greedy property/function look-ahead rules run once per run, not once\n // per character (keeps scanning linear).\n { type: 'plain', re: /[-\\w$]+|\\s+/y },\n];\n\nexport function tokenizeCss(source) {\n return scan(source, RULES);\n}\n", "// JSON tokenizer. Object keys (a string immediately before a colon) color as\n// `property`; all other strings as `string`.\n\nimport { scan } from './scanner.js';\n\nconst RULES = [\n { type: 'property', re: /\"(?:[^\"\\\\]|\\\\.)*\"(?=\\s*:)/y },\n { type: 'string', re: /\"(?:[^\"\\\\]|\\\\.)*\"?/y },\n { type: 'number', re: /-?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?/y },\n { type: 'boolean', re: /\\b(?:true|false)\\b/y },\n { type: 'null', re: /\\bnull\\b/y },\n { type: 'punctuation', re: /[{}[\\]:,]/y },\n];\n\nexport function tokenizeJson(source) {\n return scan(source, RULES);\n}\n", "// Markdown tokenizer. Line-oriented constructs use the `m` (multiline) + `y`\n// (sticky) flags together, so an anchored `^` rule only fires at a line start.\n\nimport { scan } from './scanner.js';\n\nconst RULES = [\n { type: 'string', re: /```[\\s\\S]*?```|~~~[\\s\\S]*?~~~|`[^`\\n]*`/y },\n { type: 'keyword', re: /^ {0,3}#{1,6} [^\\n]*/my },\n { type: 'comment', re: /^ {0,3}>[^\\n]*/my },\n { type: 'punctuation', re: /^ {0,3}(?:[-*+]|\\d+\\.)\\s/my },\n { type: 'meta', re: /^ {0,3}(?:-{3,}|\\*{3,}|_{3,})\\s*$/my },\n { type: 'function', re: /!?\\[[^\\][\\n]*\\]\\([^()\\n]*\\)/y },\n { type: 'operator', re: /\\*\\*[^\\n]*?\\*\\*|__[^\\n]*?__/y },\n { type: 'meta', re: /\\*[^*\\n]+?\\*|_[^_\\n]+?_/y },\n];\n\nexport function tokenizeMarkdown(source) {\n return scan(source, RULES);\n}\n", "// Shell / Bash tokenizer. Variables (`$VAR`, `${...}`) are matched before the\n// `#` comment rule can fire, so `${#arr}` stays a variable.\n\nimport { scan, wordRegex } from './scanner.js';\n\nconst KEYWORDS = [\n 'if',\n 'then',\n 'elif',\n 'else',\n 'fi',\n 'for',\n 'while',\n 'until',\n 'do',\n 'done',\n 'case',\n 'esac',\n 'function',\n 'in',\n 'select',\n 'return',\n 'break',\n 'continue',\n 'local',\n 'export',\n 'readonly',\n 'declare',\n 'typeset',\n 'set',\n 'unset',\n 'shift',\n 'exit',\n 'source',\n 'alias',\n];\n\nconst BUILTINS = [\n 'echo',\n 'printf',\n 'read',\n 'cd',\n 'pwd',\n 'ls',\n 'cat',\n 'grep',\n 'sed',\n 'awk',\n 'cut',\n 'sort',\n 'uniq',\n 'head',\n 'tail',\n 'find',\n 'xargs',\n 'curl',\n 'wget',\n 'git',\n 'npm',\n 'pnpm',\n 'yarn',\n 'node',\n 'python',\n 'pip',\n 'docker',\n 'kubectl',\n 'make',\n 'chmod',\n 'chown',\n 'mkdir',\n 'rmdir',\n 'rm',\n 'cp',\n 'mv',\n 'touch',\n 'test',\n 'sudo',\n 'env',\n 'which',\n 'kill',\n 'ps',\n 'tar',\n 'ssh',\n];\n\nconst RULES = [\n { type: 'comment', re: /#[^\\n]*/y },\n { type: 'string', re: /\"(?:[^\"\\\\]|\\\\.)*\"?/y },\n { type: 'string', re: /'[^']*'?/y },\n { type: 'variable', re: /\\$\\{[^}\\n]*\\}?|\\$[A-Za-z_]\\w*|\\$[@*#?$!0-9-]/y },\n { type: 'keyword', re: wordRegex(KEYWORDS) },\n { type: 'builtin', re: wordRegex(BUILTINS) },\n { type: 'attribute', re: /(?:^|\\s)-{1,2}[A-Za-z][\\w-]*/y },\n { type: 'number', re: /\\b\\d+\\b/y },\n { type: 'operator', re: /\\|\\||&&|[|&;<>]+/y },\n { type: 'punctuation', re: /[(){}[\\]]/y },\n];\n\nexport function tokenizeShell(source) {\n return scan(source, RULES);\n}\n", "// Python tokenizer. Triple-quoted and prefixed (r/b/f/u) strings are matched as\n// whole strings; f-string interpolation is not sub-highlighted in v1.\n\nimport { scan, wordRegex } from './scanner.js';\n\nconst KEYWORDS = [\n 'def',\n 'class',\n 'return',\n 'if',\n 'elif',\n 'else',\n 'for',\n 'while',\n 'break',\n 'continue',\n 'pass',\n 'import',\n 'from',\n 'as',\n 'with',\n 'try',\n 'except',\n 'finally',\n 'raise',\n 'yield',\n 'lambda',\n 'global',\n 'nonlocal',\n 'del',\n 'assert',\n 'async',\n 'await',\n 'in',\n 'is',\n 'not',\n 'and',\n 'or',\n 'match',\n 'case',\n];\n\nconst BUILTINS = [\n 'print',\n 'len',\n 'range',\n 'int',\n 'float',\n 'str',\n 'list',\n 'dict',\n 'set',\n 'tuple',\n 'bool',\n 'bytes',\n 'type',\n 'isinstance',\n 'issubclass',\n 'super',\n 'open',\n 'enumerate',\n 'zip',\n 'map',\n 'filter',\n 'sorted',\n 'reversed',\n 'sum',\n 'min',\n 'max',\n 'abs',\n 'round',\n 'input',\n 'repr',\n 'format',\n 'object',\n 'self',\n 'cls',\n 'Exception',\n 'ValueError',\n 'TypeError',\n 'KeyError',\n 'IndexError',\n 'AttributeError',\n 'RuntimeError',\n];\n\nconst RULES = [\n { type: 'comment', re: /#[^\\n]*/y },\n {\n type: 'string',\n re: /[rRbBfFuU]{0,2}(?:\"\"\"[\\s\\S]*?\"\"\"|'''[\\s\\S]*?'''|\"(?:[^\"\\\\\\n]|\\\\.)*\"?|'(?:[^'\\\\\\n]|\\\\.)*'?)/y,\n },\n { type: 'meta', re: /@[A-Za-z_]\\w*/y },\n { type: 'keyword', re: wordRegex(KEYWORDS) },\n { type: 'boolean', re: /\\b(?:True|False)\\b/y },\n { type: 'null', re: /\\bNone\\b/y },\n { type: 'builtin', re: wordRegex(BUILTINS) },\n { type: 'function', re: /[A-Za-z_]\\w*(?=\\s*\\()/y },\n {\n type: 'number',\n re: /\\b0[xXoObB][0-9a-fA-F_]+\\b|\\b\\d[\\d_]*(?:\\.\\d[\\d_]*)?(?:[eE][+-]?\\d+)?[jJ]?\\b/y,\n },\n { type: 'operator', re: /:=|[+\\-*/%=<>!&|^~@]+/y },\n { type: 'punctuation', re: /[()[\\]{}:;,.]/y },\n // Catch-all: consume an identifier run (or whitespace) in one match so the\n // greedy function look-ahead rule runs once per run, not once per character.\n { type: 'plain', re: /\\w+|\\s+/y },\n];\n\nexport function tokenizePython(source) {\n return scan(source, RULES);\n}\n", "// Tokenizer registry + the public `tokenize()` entry point.\n//\n// Each language module is a pure `(source) => Token[]` function built on the\n// shared linear scanner. `tokenize()` resolves aliases, dispatches to the right\n// tokenizer, and falls back to a single `plain` token for unknown languages \u2014\n// it never throws.\n\nimport { tokenizeJavaScript, tokenizeTypeScript } from './javascript.js';\nimport { tokenizeHtml } from './html.js';\nimport { tokenizeCss } from './css.js';\nimport { tokenizeJson } from './json.js';\nimport { tokenizeMarkdown } from './markdown.js';\nimport { tokenizeShell } from './shell.js';\nimport { tokenizePython } from './python.js';\n\nconst TOKENIZERS = {\n javascript: tokenizeJavaScript,\n typescript: tokenizeTypeScript,\n html: tokenizeHtml,\n css: tokenizeCss,\n json: tokenizeJson,\n markdown: tokenizeMarkdown,\n shell: tokenizeShell,\n python: tokenizePython,\n};\n\n/** Canonical language ids the editor understands (`plaintext` = no highlight). */\nexport const LANGUAGES = Object.freeze([\n 'plaintext',\n 'javascript',\n 'typescript',\n 'html',\n 'css',\n 'json',\n 'markdown',\n 'shell',\n 'python',\n]);\n\n/** Common aliases mapped to canonical ids. */\nexport const ALIASES = Object.freeze({\n js: 'javascript',\n jsx: 'javascript',\n mjs: 'javascript',\n cjs: 'javascript',\n ts: 'typescript',\n tsx: 'typescript',\n htm: 'html',\n xml: 'html',\n vue: 'html',\n svg: 'html',\n sh: 'shell',\n bash: 'shell',\n zsh: 'shell',\n shellscript: 'shell',\n py: 'python',\n python3: 'python',\n md: 'markdown',\n mkd: 'markdown',\n json5: 'json',\n jsonc: 'json',\n text: 'plaintext',\n txt: 'plaintext',\n plain: 'plaintext',\n});\n\n/** Resolve a language id or alias to its canonical id. */\nexport function resolveLanguage(language) {\n const id = String(language || 'plaintext').toLowerCase();\n return ALIASES[id] || id;\n}\n\n/** The tokenizer function for a language, or `null` when none is registered. */\nexport function getTokenizer(language) {\n return TOKENIZERS[resolveLanguage(language)] || null;\n}\n\n/**\n * Tokenize `source` for `language`. Returns `{ type, value }[]`; the token\n * values always concatenate back to `source` exactly (lossless).\n */\nexport function tokenize(source, language) {\n if (!source) return [];\n const tokenizer = getTokenizer(language);\n if (!tokenizer) return [{ type: 'plain', value: source }];\n return tokenizer(source);\n}\n", "// Highlight rendering. Two paths, both escaping-safe:\n// - renderTokensToHtml / highlight \u2192 an escaped HTML STRING (node tests, SSR).\n// - renderTokensToDom \u2192 a DOM DocumentFragment built with createElement /\n// createTextNode. This is the RUNTIME path; untrusted source text only ever\n// reaches `textContent`, so `innerHTML` is never assigned and markup\n// injection is structurally impossible.\n\nimport { tokenize } from './tokenizer/index.js';\n\nconst ESCAPE_RE = /[&<>\"']/g;\nconst ESCAPE_MAP = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n};\n\n/** Escape the five HTML metacharacters. */\nexport function escapeHtml(str) {\n return String(str).replace(ESCAPE_RE, (ch) => ESCAPE_MAP[ch]);\n}\n\n/** Render tokens to an escaped HTML string of `<span class=\"vd-tk-*\">` wrappers. */\nexport function renderTokensToHtml(tokens) {\n let html = '';\n for (let i = 0; i < tokens.length; i++) {\n const t = tokens[i];\n if (t.type === 'plain') {\n html += escapeHtml(t.value);\n } else {\n html += '<span class=\"vd-tk-' + t.type + '\">' + escapeHtml(t.value) + '</span>';\n }\n }\n return html;\n}\n\n/**\n * Tokenize + render to an escaped HTML string. A trailing newline is appended\n * when the source ends in one, so a `<pre>` layer (which collapses a single\n * trailing newline) keeps the same line count as the textarea it sits under.\n */\nexport function highlight(source, language) {\n const html = renderTokensToHtml(tokenize(source, language));\n return source.endsWith('\\n') || source === '' ? html + '\\n' : html;\n}\n\n/**\n * Build a DocumentFragment of token nodes using `doc` (an injected `document`,\n * for jsdom/SSR testability). Plain tokens become text nodes; typed tokens\n * become `<span class=\"vd-tk-*\">` with the text set via `textContent`.\n */\nexport function renderTokensToDom(tokens, doc) {\n const frag = doc.createDocumentFragment();\n for (let i = 0; i < tokens.length; i++) {\n const t = tokens[i];\n if (t.type === 'plain') {\n frag.appendChild(doc.createTextNode(t.value));\n } else {\n const span = doc.createElement('span');\n span.className = 'vd-tk-' + t.type;\n span.textContent = t.value;\n frag.appendChild(span);\n }\n }\n return frag;\n}\n", "// Shared, DOM-free constants for the code editor. Pure data and predicates \u2014\n// safe to import from node tests and from both the core and the tokenizers.\n\n/** Default indent width, in spaces. */\nexport const DEFAULT_TAB_SIZE = 2;\n\n// Above this many characters, highlighting is skipped (the editor renders one\n// escaped plain-text node) so very large documents stay responsive.\nexport const MAX_HIGHLIGHT_LENGTH = 100000;\n\n/** Characters that auto-close to the mapped closer when typed. */\nexport const AUTO_CLOSE_PAIRS = Object.freeze({\n '(': ')',\n '[': ']',\n '{': '}',\n '\"': '\"',\n \"'\": \"'\",\n '`': '`',\n});\n\n/** Opening characters that trigger auto-close. */\nexport const OPENERS = Object.freeze(Object.keys(AUTO_CLOSE_PAIRS));\n\n/** Closing characters (brackets + quotes) the caret can skip over. */\nexport const CLOSERS = Object.freeze([')', ']', '}', '\"', \"'\", '`']);\n\n/** True when `ch` is an auto-closing opener. */\nexport function isOpener(ch) {\n return Object.prototype.hasOwnProperty.call(AUTO_CLOSE_PAIRS, ch);\n}\n\n/** The closer mapped to `ch`, or `undefined`. */\nexport function closerFor(ch) {\n return AUTO_CLOSE_PAIRS[ch];\n}\n\n/** True when `open`/`close` form an auto-close pair. */\nexport function isMatchingPair(open, close) {\n return AUTO_CLOSE_PAIRS[open] === close;\n}\n", "// Pure keymap transactions. Each function takes the current textarea value and\n// selection and returns an EDIT \u2014 `{ from, to, text, selectionStart,\n// selectionEnd }` describing a replacement of `value[from..to]` with `text` plus\n// the resulting caret \u2014 or `null` to let the browser handle the key natively.\n// No DOM access, so every branch is unit-testable in plain node.\n\nimport { AUTO_CLOSE_PAIRS, CLOSERS, closerFor, isMatchingPair } from './constants.js';\n\nconst CLOSER_SET = new Set(CLOSERS);\nconst WORD = /[\\w$]/;\n\n/** Enter: copy the current line's indent, add a level after an opener, and\n * split an empty pair onto its own line. */\nexport function indentOnEnter(value, start, end, unit) {\n const lineStart = value.lastIndexOf('\\n', start - 1) + 1;\n const leading = /^[ \\t]*/.exec(value.slice(lineStart, start))[0];\n const prev = value[start - 1];\n const next = value[end];\n const opens = prev === '{' || prev === '[' || prev === '(';\n\n if (opens && isMatchingPair(prev, next)) {\n const inner = leading + unit;\n const text = '\\n' + inner + '\\n' + leading;\n const caret = start + 1 + inner.length;\n return { from: start, to: end, text, selectionStart: caret, selectionEnd: caret };\n }\n\n const indent = opens ? leading + unit : leading;\n const text = '\\n' + indent;\n const caret = start + text.length;\n return { from: start, to: end, text, selectionStart: caret, selectionEnd: caret };\n}\n\n/** Tab: insert one indent unit, or indent every line of a multi-line selection. */\nexport function handleTab(value, start, end, unit) {\n if (start !== end && value.slice(start, end).indexOf('\\n') !== -1) {\n const from = value.lastIndexOf('\\n', start - 1) + 1;\n const block = value.slice(from, end);\n const indented = block.replace(/^/gm, unit);\n const added = indented.length - block.length;\n return {\n from,\n to: end,\n text: indented,\n selectionStart: start + unit.length,\n selectionEnd: end + added,\n };\n }\n return {\n from: start,\n to: end,\n text: unit,\n selectionStart: start + unit.length,\n selectionEnd: start + unit.length,\n };\n}\n\n/** Shift-Tab: remove up to one indent unit from the start of each selected line. */\nexport function handleShiftTab(value, start, end, unit) {\n const from = value.lastIndexOf('\\n', start - 1) + 1;\n const size = unit.length || 1;\n const lines = value.slice(from, end).split('\\n');\n let firstRemoved = 0;\n let totalRemoved = 0;\n const dedented = lines\n .map((line, idx) => {\n let remove = 0;\n while (remove < size && line[remove] === ' ') remove++;\n if (remove === 0 && line[0] === '\\t') remove = 1;\n if (idx === 0) firstRemoved = remove;\n totalRemoved += remove;\n return line.slice(remove);\n })\n .join('\\n');\n return {\n from,\n to: end,\n text: dedented,\n selectionStart: Math.max(from, start - firstRemoved),\n selectionEnd: Math.max(from, end - totalRemoved),\n };\n}\n\n/** Typing an opener/quote: wrap a selection, or insert the matching closer. */\nexport function autoClosePair(char, value, start, end) {\n const closer = closerFor(char);\n if (!closer) return null;\n\n if (start !== end) {\n return {\n from: start,\n to: end,\n text: char + value.slice(start, end) + closer,\n selectionStart: start + 1,\n selectionEnd: end + 1,\n };\n }\n\n const nextChar = value[start];\n if (char === closer) {\n // Quote: skip auto-close next to a word char (apostrophes, mid-word typing).\n if (nextChar && WORD.test(nextChar)) return null;\n const prevChar = value[start - 1];\n if (prevChar && WORD.test(prevChar)) return null;\n } else if (nextChar && WORD.test(nextChar)) {\n return null;\n }\n\n return {\n from: start,\n to: end,\n text: char + closer,\n selectionStart: start + 1,\n selectionEnd: start + 1,\n };\n}\n\n/** Typing a closer when the next char is that same closer: step over it. */\nexport function skipOverCloser(char, value, start, end) {\n if (start !== end || !CLOSER_SET.has(char)) return null;\n if (value[start] === char) {\n return { caretOnly: true, selectionStart: start + 1, selectionEnd: start + 1 };\n }\n return null;\n}\n\n/** Backspace between an empty auto-pair (`()`, `\"\"`, \u2026): delete both sides. */\nexport function handleBackspacePair(value, start, end) {\n if (start !== end || start === 0) return null;\n const prev = value[start - 1];\n const next = value[start];\n if (AUTO_CLOSE_PAIRS[prev] && AUTO_CLOSE_PAIRS[prev] === next) {\n return {\n from: start - 1,\n to: start + 1,\n text: '',\n selectionStart: start - 1,\n selectionEnd: start - 1,\n };\n }\n return null;\n}\n", "// Framework-agnostic core for the code editor.\n//\n// The editing model is a native <textarea> rendered transparently over a <pre>\n// highlight layer: the browser owns caret, selection, IME, clipboard, and\n// undo/redo, while a homegrown tokenizer repaints the highlight beneath it. The\n// core builds its own DOM, keeps the two layers scroll- and glyph-aligned,\n// applies a small keymap (indent / tab / auto-close) through the native undo\n// stack, and paints only via DOM nodes \u2014 never `innerHTML`. It imports no `vue`.\n\nimport { tokenize, LANGUAGES } from './tokenizer/index.js';\nimport { renderTokensToDom, highlight } from './highlight.js';\nimport {\n indentOnEnter,\n handleTab,\n handleShiftTab,\n autoClosePair,\n skipOverCloser,\n handleBackspacePair,\n} from './editing.js';\nimport { DEFAULT_TAB_SIZE, MAX_HIGHLIGHT_LENGTH } from './constants.js';\n\n/** Current component version (mirrored in component-versions.json). */\nexport const VD_CODE_EDITOR_VERSION = '1.0.1';\n\nconst DEFAULTS = {\n value: '',\n language: 'plaintext',\n readOnly: false,\n lineNumbers: true,\n tabSize: DEFAULT_TAB_SIZE,\n placeholder: '',\n maxLength: undefined,\n wrap: false,\n autoClose: true,\n highlightActiveLine: true,\n maxHighlightLength: MAX_HIGHLIGHT_LENGTH,\n spellcheck: false,\n ariaLabel: 'Code editor',\n copy: true,\n};\n\n// Scheduler that degrades gracefully when rAF is absent (SSR/jsdom). Bound to\n// `window` so browsers never throw \"Illegal invocation\".\nconst RAF =\n typeof window !== 'undefined' && window.requestAnimationFrame\n ? window.requestAnimationFrame.bind(window)\n : (cb) => setTimeout(cb, 16);\nconst CAF =\n typeof window !== 'undefined' && window.cancelAnimationFrame\n ? window.cancelAnimationFrame.bind(window)\n : clearTimeout;\n\nfunction resolveElement(element) {\n if (!element) return null;\n if (typeof element === 'string') {\n return typeof document !== 'undefined' ? document.querySelector(element) : null;\n }\n return element;\n}\n\nfunction countNewlines(str, end) {\n let n = 0;\n const limit = end == null ? str.length : end;\n for (let i = 0; i < limit; i++) {\n if (str.charCodeAt(i) === 10) n++;\n }\n return n;\n}\n\nexport class VdCodeEditor {\n constructor(options = {}) {\n this._opts = Object.assign({}, DEFAULTS, options);\n this._listeners = Object.create(null);\n this._domListeners = [];\n this._raf = 0;\n this._ro = null;\n this._copyTimer = 0;\n this._destroyed = false;\n this._lineHeight = 21;\n this._paddingTop = 0;\n this._gutterCount = -1;\n this._lastValue = this._opts.value == null ? '' : String(this._opts.value);\n\n this.element = resolveElement(options.element);\n if (this.element) this._mount();\n }\n\n // \u2500\u2500 mounting \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n _mount() {\n const el = this.element;\n const doc = el.ownerDocument;\n const opts = this._opts;\n const showGutter = opts.lineNumbers && !opts.wrap;\n const showActiveLine = opts.highlightActiveLine && !opts.wrap;\n\n el.classList.add('vd-code-editor');\n el.classList.toggle('is-wrap', !!opts.wrap);\n el.classList.toggle('is-readonly', !!opts.readOnly);\n el.classList.toggle('has-gutter', showGutter);\n el.style.setProperty('--vd-code-editor-tab-size', String(opts.tabSize));\n\n // Active-line band (bottom layer).\n if (showActiveLine) {\n this._activeLine = doc.createElement('div');\n this._activeLine.className = 'vd-code-editor-active-line';\n this._activeLine.setAttribute('aria-hidden', 'true');\n el.appendChild(this._activeLine);\n }\n\n // Highlight layer.\n this._pre = doc.createElement('pre');\n this._pre.className = 'vd-code-editor-highlight';\n this._pre.setAttribute('aria-hidden', 'true');\n this._code = doc.createElement('code');\n this._code.className = 'vd-code-editor-code';\n this._pre.appendChild(this._code);\n el.appendChild(this._pre);\n\n // Gutter (over the band's left edge; opaque).\n if (showGutter) {\n this._gutter = doc.createElement('div');\n this._gutter.className = 'vd-code-editor-gutter';\n this._gutter.setAttribute('aria-hidden', 'true');\n this._gutterLines = doc.createElement('div');\n this._gutterLines.className = 'vd-code-editor-gutter-lines';\n this._gutter.appendChild(this._gutterLines);\n el.appendChild(this._gutter);\n }\n\n // Editable surface (top layer).\n const ta = doc.createElement('textarea');\n ta.className = 'vd-code-editor-input';\n ta.value = this._lastValue;\n ta.spellcheck = !!opts.spellcheck;\n ta.wrap = opts.wrap ? 'soft' : 'off';\n ta.setAttribute('autocomplete', 'off');\n ta.setAttribute('autocapitalize', 'off');\n ta.setAttribute('autocorrect', 'off');\n ta.setAttribute('aria-label', opts.ariaLabel || 'Code editor');\n ta.setAttribute('aria-multiline', 'true');\n if (opts.readOnly) ta.readOnly = true;\n if (opts.placeholder) ta.placeholder = opts.placeholder;\n if (opts.maxLength != null) ta.maxLength = opts.maxLength;\n ta.style.tabSize = String(opts.tabSize);\n this._pre.style.tabSize = String(opts.tabSize);\n this._textarea = ta;\n el.appendChild(ta);\n\n // Copy control (only when enabled and the clipboard API exists).\n if (opts.copy && typeof navigator !== 'undefined' && navigator.clipboard) {\n const btn = doc.createElement('button');\n btn.type = 'button';\n btn.className = 'vd-code-editor-copy';\n btn.setAttribute('aria-label', 'Copy code');\n btn.textContent = 'Copy';\n this._copyBtn = btn;\n el.appendChild(btn);\n }\n\n this._attach();\n this._measure();\n this._repaint();\n this._syncScroll();\n }\n\n _attach() {\n const ta = this._textarea;\n this._listen(ta, 'input', () => this._handleInput());\n this._listen(ta, 'scroll', () => this._syncScroll());\n this._listen(ta, 'keydown', (e) => this._handleKeydown(e));\n this._listen(ta, 'focus', (e) => this._handleFocus(e));\n this._listen(ta, 'blur', (e) => this._handleBlur(e));\n this._listen(ta, 'click', () => this._updateActiveLine());\n this._listen(ta, 'keyup', () => this._updateActiveLine());\n this._listen(ta, 'select', () => this._updateActiveLine());\n if (this._copyBtn) this._listen(this._copyBtn, 'click', () => this._handleCopy());\n\n if (typeof ResizeObserver === 'function') {\n this._ro = new ResizeObserver(() => {\n this._measure();\n this._syncScroll();\n });\n this._ro.observe(this.element);\n }\n\n // Re-measure once web fonts settle (FOUT would shift line metrics).\n const fonts = this.element.ownerDocument.fonts;\n if (fonts && fonts.ready && typeof fonts.ready.then === 'function') {\n fonts.ready.then(() => {\n if (this._destroyed) return;\n this._measure();\n this._syncScroll();\n });\n }\n }\n\n _listen(target, type, handler) {\n target.addEventListener(type, handler);\n this._domListeners.push([target, type, handler]);\n }\n\n // \u2500\u2500 rendering \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n _measure() {\n if (typeof getComputedStyle !== 'function') return;\n const cs = getComputedStyle(this._textarea);\n const lh = parseFloat(cs.lineHeight);\n if (Number.isFinite(lh) && lh > 0) this._lineHeight = lh;\n const pt = parseFloat(cs.paddingTop);\n this._paddingTop = Number.isFinite(pt) ? pt : 0;\n }\n\n _scheduleRepaint() {\n if (this._raf || this._destroyed) return;\n this._raf = RAF(() => {\n this._raf = 0;\n if (!this._destroyed) this._repaint();\n });\n }\n\n _repaint() {\n const value = this._textarea.value;\n const doc = this.element.ownerDocument;\n const trailing = value.endsWith('\\n') || value === '';\n\n if (value.length > this._opts.maxHighlightLength) {\n this._code.classList.add('is-plain');\n this._code.replaceChildren(doc.createTextNode(trailing ? value + '\\n' : value));\n } else {\n this._code.classList.remove('is-plain');\n const frag = renderTokensToDom(tokenize(value, this._opts.language), doc);\n if (trailing) frag.appendChild(doc.createTextNode('\\n'));\n this._code.replaceChildren(frag);\n }\n this._updateGutter(value);\n }\n\n _updateGutter(value) {\n if (!this._gutterLines) return;\n const lines = countNewlines(value) + 1;\n if (lines === this._gutterCount) return;\n this._gutterCount = lines;\n this.element.style.setProperty(\n '--vd-code-editor-gutter-digits',\n String(Math.max(2, String(lines).length)),\n );\n let text = '1';\n for (let i = 2; i <= lines; i++) text += '\\n' + i;\n this._gutterLines.textContent = text;\n }\n\n _syncScroll() {\n const ta = this._textarea;\n if (!ta) return;\n const st = ta.scrollTop;\n if (this._pre) {\n this._pre.scrollTop = st;\n this._pre.scrollLeft = ta.scrollLeft;\n }\n if (this._gutterLines) {\n this._gutterLines.style.transform = 'translateY(' + -st + 'px)';\n }\n this._updateActiveLine();\n }\n\n _updateActiveLine() {\n if (!this._activeLine) return;\n const ta = this._textarea;\n const line = countNewlines(ta.value, ta.selectionStart || 0);\n const top = this._paddingTop + line * this._lineHeight - ta.scrollTop;\n this._activeLine.style.height = this._lineHeight + 'px';\n this._activeLine.style.transform = 'translateY(' + top + 'px)';\n }\n\n // \u2500\u2500 input + keymap \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n _handleInput() {\n this._scheduleRepaint();\n this._syncScroll();\n this._emitChangeIfChanged();\n }\n\n _emitChangeIfChanged() {\n const v = this._textarea.value;\n if (v === this._lastValue) return;\n this._lastValue = v;\n this._emit('change', { value: v });\n }\n\n _handleFocus(e) {\n this.element.classList.add('is-focused');\n this._emit('focus', e);\n }\n\n _handleBlur(e) {\n this.element.classList.remove('is-focused');\n this._emit('blur', e);\n }\n\n _handleKeydown(e) {\n if (this._opts.readOnly || e.isComposing) return;\n if (e.ctrlKey || e.metaKey || e.altKey) return;\n\n const ta = this._textarea;\n const value = ta.value;\n const s = ta.selectionStart;\n const en = ta.selectionEnd;\n const unit = ' '.repeat(this._opts.tabSize);\n\n if (e.key === 'Enter') {\n e.preventDefault();\n this._applyEdit(indentOnEnter(value, s, en, unit));\n return;\n }\n if (e.key === 'Tab') {\n e.preventDefault();\n this._applyEdit(\n e.shiftKey ? handleShiftTab(value, s, en, unit) : handleTab(value, s, en, unit),\n );\n return;\n }\n if (e.key === 'Backspace') {\n const edit = handleBackspacePair(value, s, en);\n if (edit) {\n e.preventDefault();\n this._applyEdit(edit);\n }\n return;\n }\n if (e.key.length === 1 && this._opts.autoClose) {\n const skip = skipOverCloser(e.key, value, s, en);\n if (skip) {\n e.preventDefault();\n ta.setSelectionRange(skip.selectionStart, skip.selectionEnd);\n this._updateActiveLine();\n return;\n }\n const auto = autoClosePair(e.key, value, s, en);\n if (auto) {\n e.preventDefault();\n this._applyEdit(auto);\n }\n }\n }\n\n // Apply an edit, preferring execCommand so the native undo stack is preserved;\n // fall back to setRangeText, then to a direct value splice (jsdom/old engines).\n _applyEdit(edit) {\n const ta = this._textarea;\n ta.setSelectionRange(edit.from, edit.to);\n let nativeInput = false;\n if (this._tryExecInsert(edit.text)) {\n nativeInput = true;\n } else if (typeof ta.setRangeText === 'function') {\n ta.setRangeText(edit.text, edit.from, edit.to, 'end');\n } else {\n ta.value = ta.value.slice(0, edit.from) + edit.text + ta.value.slice(edit.to);\n }\n if (edit.selectionStart != null) {\n const end = edit.selectionEnd == null ? edit.selectionStart : edit.selectionEnd;\n ta.setSelectionRange(edit.selectionStart, end);\n }\n if (nativeInput) {\n // execCommand already dispatched 'input' (repaint + emit); just fix caret.\n this._updateActiveLine();\n } else {\n this._handleInput();\n }\n }\n\n _tryExecInsert(text) {\n try {\n return (\n typeof document !== 'undefined' &&\n typeof document.execCommand === 'function' &&\n document.execCommand('insertText', false, text)\n );\n } catch {\n return false;\n }\n }\n\n _handleCopy() {\n if (this._destroyed || typeof navigator === 'undefined' || !navigator.clipboard) return;\n navigator.clipboard.writeText(this._textarea.value).then(\n () => this._flashCopied(),\n () => {},\n );\n }\n\n _flashCopied() {\n if (!this._copyBtn) return;\n this._copyBtn.classList.add('is-copied');\n this._copyBtn.textContent = 'Copied';\n if (this._copyTimer) clearTimeout(this._copyTimer);\n this._copyTimer = setTimeout(() => {\n this._copyTimer = 0;\n if (this._destroyed || !this._copyBtn) return;\n this._copyBtn.classList.remove('is-copied');\n this._copyBtn.textContent = 'Copy';\n }, 1200);\n }\n\n // \u2500\u2500 public API \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n getValue() {\n return this._textarea ? this._textarea.value : this._lastValue;\n }\n\n setValue(next, options) {\n const silent = !!(options && options.silent);\n const v = next == null ? '' : String(next);\n if (!this._textarea) {\n this._lastValue = v;\n return this;\n }\n if (v === this._textarea.value) return this;\n this._textarea.value = v;\n if (silent) this._lastValue = v;\n this._repaint();\n this._syncScroll();\n if (!silent) this._emitChangeIfChanged();\n return this;\n }\n\n getSelection() {\n const ta = this._textarea;\n if (!ta) return { start: 0, end: 0, text: '' };\n return {\n start: ta.selectionStart,\n end: ta.selectionEnd,\n text: ta.value.slice(ta.selectionStart, ta.selectionEnd),\n };\n }\n\n setSelection(start, end) {\n if (!this._textarea) return this;\n const e = end == null ? start : end;\n this._textarea.setSelectionRange(start, e);\n this._updateActiveLine();\n return this;\n }\n\n insertText(text) {\n if (!this._textarea) return this;\n const ta = this._textarea;\n const str = String(text);\n this._applyEdit({\n from: ta.selectionStart,\n to: ta.selectionEnd,\n text: str,\n selectionStart: ta.selectionStart + str.length,\n });\n return this;\n }\n\n setLanguage(language) {\n this._opts.language = language || 'plaintext';\n if (this._textarea) this._repaint();\n return this;\n }\n\n setReadOnly(readOnly) {\n this._opts.readOnly = !!readOnly;\n if (this._textarea) this._textarea.readOnly = !!readOnly;\n if (this.element) this.element.classList.toggle('is-readonly', !!readOnly);\n return this;\n }\n\n setTabSize(tabSize) {\n const n = Number(tabSize) || DEFAULT_TAB_SIZE;\n this._opts.tabSize = n;\n if (this._textarea) this._textarea.style.tabSize = String(n);\n if (this._pre) this._pre.style.tabSize = String(n);\n if (this.element) this.element.style.setProperty('--vd-code-editor-tab-size', String(n));\n return this;\n }\n\n setPlaceholder(text) {\n this._opts.placeholder = text || '';\n if (this._textarea) this._textarea.placeholder = text || '';\n return this;\n }\n\n setAutoClose(autoClose) {\n this._opts.autoClose = !!autoClose;\n return this;\n }\n\n focus() {\n if (this._textarea) this._textarea.focus();\n return this;\n }\n\n blur() {\n if (this._textarea) this._textarea.blur();\n return this;\n }\n\n on(name, handler) {\n if (!this._listeners[name]) this._listeners[name] = [];\n this._listeners[name].push(handler);\n return this;\n }\n\n off(name, handler) {\n const list = this._listeners[name];\n if (!list) return this;\n const i = list.indexOf(handler);\n if (i !== -1) list.splice(i, 1);\n return this;\n }\n\n _emit(name, payload) {\n const list = this._listeners[name];\n if (!list) return;\n for (let i = 0; i < list.length; i++) list[i](payload);\n }\n\n destroy() {\n if (this._destroyed) return;\n this._destroyed = true;\n if (this._raf) CAF(this._raf);\n if (this._copyTimer) clearTimeout(this._copyTimer);\n if (this._ro) {\n this._ro.disconnect();\n this._ro = null;\n }\n for (let i = 0; i < this._domListeners.length; i++) {\n const [target, type, handler] = this._domListeners[i];\n target.removeEventListener(type, handler);\n }\n this._domListeners = [];\n if (this.element) {\n const nodes = [this._activeLine, this._pre, this._gutter, this._textarea, this._copyBtn];\n for (let i = 0; i < nodes.length; i++) {\n const n = nodes[i];\n if (n && n.parentNode === this.element) this.element.removeChild(n);\n }\n this.element.classList.remove(\n 'vd-code-editor',\n 'is-wrap',\n 'is-readonly',\n 'has-gutter',\n 'is-focused',\n );\n }\n this._listeners = Object.create(null);\n this._textarea = null;\n this._pre = null;\n this._code = null;\n this._gutter = null;\n this._gutterLines = null;\n this._activeLine = null;\n this._copyBtn = null;\n }\n}\n\nexport { tokenize, highlight, LANGUAGES };\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["RULES", "RULES", "
|
|
3
|
+
"sources": ["../../src/code-editor/vue.js", "../../src/code-editor/tokenizer/scanner.js", "../../src/code-editor/tokenizer/javascript.js", "../../src/code-editor/tokenizer/css.js", "../../src/code-editor/tokenizer/html.js", "../../src/code-editor/tokenizer/json.js", "../../src/code-editor/tokenizer/markdown.js", "../../src/code-editor/tokenizer/shell.js", "../../src/code-editor/tokenizer/python.js", "../../src/code-editor/tokenizer/index.js", "../../src/code-editor/highlight.js", "../../src/code-editor/constants.js", "../../src/code-editor/editing.js", "../../src/code-editor/core.js"],
|
|
4
|
+
"sourcesContent": ["/**\n * Vue 3 bindings for @vanduo-oss/vd3-cbun/code-editor \u2014 the primary export.\n *\n * import { VdCodeEditor } from '@vanduo-oss/vd3-cbun/code-editor';\n * <VdCodeEditor v-model=\"code\" language=\"javascript\" @change=\"onChange\" />\n *\n * The editor core stays framework-agnostic in ./core.js. SSR-safe: the editor is\n * created on mount (client) into a plain container the server can pre-render.\n */\nimport { defineComponent, h, ref, onMounted, onBeforeUnmount, watch } from 'vue';\nimport { VdCodeEditor as VdCodeEditorCore } from './core.js';\n\nexport const VdCodeEditor = defineComponent({\n name: 'VdCodeEditor',\n props: {\n /** Editor contents (v-model). */\n modelValue: { type: String, default: '' },\n /** Syntax language id or alias (e.g. `js`, `python`, `plaintext`). */\n language: { type: String, default: 'plaintext' },\n /** Render as a non-editable viewer (copy still works). */\n readOnly: { type: Boolean, default: false },\n /** Show the line-number gutter (ignored in wrap mode). */\n lineNumbers: { type: Boolean, default: true },\n /** Indent width, in spaces. */\n tabSize: { type: Number, default: 2 },\n /** Empty-state placeholder text. */\n placeholder: { type: String, default: '' },\n /** Native `maxlength` cap on the content. */\n maxLength: { type: Number, default: undefined },\n /** Soft-wrap long lines (disables the gutter + active-line). */\n wrap: { type: Boolean, default: false },\n /** Auto-close brackets/quotes and step over closers. */\n autoClose: { type: Boolean, default: true },\n /** Highlight the caret's line (ignored in wrap mode). */\n highlightActiveLine: { type: Boolean, default: true },\n /** Skip highlighting above this many characters (perf guard). */\n maxHighlightLength: { type: Number, default: 100000 },\n /** Native spellcheck on the textarea. */\n spellcheck: { type: Boolean, default: false },\n /** Show the copy-to-clipboard button (when the clipboard API exists). */\n copy: { type: Boolean, default: true },\n /** Accessible label for the textarea. */\n ariaLabel: { type: String, default: 'Code editor' },\n },\n emits: ['update:modelValue', 'change', 'focus', 'blur', 'ready'],\n setup(props, { emit, expose }) {\n const el = ref(null);\n let instance = null;\n\n const create = () => {\n instance = new VdCodeEditorCore({\n element: el.value,\n value: props.modelValue,\n language: props.language,\n readOnly: props.readOnly,\n lineNumbers: props.lineNumbers,\n tabSize: props.tabSize,\n placeholder: props.placeholder,\n maxLength: props.maxLength,\n wrap: props.wrap,\n autoClose: props.autoClose,\n highlightActiveLine: props.highlightActiveLine,\n maxHighlightLength: props.maxHighlightLength,\n spellcheck: props.spellcheck,\n copy: props.copy,\n ariaLabel: props.ariaLabel,\n });\n instance.on('change', (payload) => {\n emit('update:modelValue', payload.value);\n emit('change', payload.value);\n });\n instance.on('focus', (e) => emit('focus', e));\n instance.on('blur', (e) => emit('blur', e));\n emit('ready', instance);\n };\n\n const teardown = () => {\n if (instance) {\n instance.destroy();\n instance = null;\n }\n };\n\n onMounted(() => {\n if (typeof window === 'undefined' || !el.value) return;\n create();\n });\n\n // v-model: push external changes in without echoing a change back out.\n watch(\n () => props.modelValue,\n (next) => {\n if (instance && next !== instance.getValue()) instance.setValue(next, { silent: true });\n },\n );\n\n // Cheap props apply live.\n watch(\n () => props.language,\n (v) => instance && instance.setLanguage(v),\n );\n watch(\n () => props.readOnly,\n (v) => instance && instance.setReadOnly(v),\n );\n watch(\n () => props.tabSize,\n (v) => instance && instance.setTabSize(v),\n );\n watch(\n () => props.placeholder,\n (v) => instance && instance.setPlaceholder(v),\n );\n watch(\n () => props.autoClose,\n (v) => instance && instance.setAutoClose(v),\n );\n\n // Structural props recreate the editor (mirrors the flowchart wrapper).\n watch(\n () => [\n props.lineNumbers,\n props.wrap,\n props.highlightActiveLine,\n props.spellcheck,\n props.maxLength,\n props.maxHighlightLength,\n props.copy,\n props.ariaLabel,\n ],\n () => {\n if (!instance) return;\n teardown();\n create();\n },\n );\n\n onBeforeUnmount(teardown);\n\n expose({\n getInstance: () => instance,\n focus: () => instance && instance.focus(),\n blur: () => instance && instance.blur(),\n getValue: () => (instance ? instance.getValue() : props.modelValue),\n setValue: (value) => instance && instance.setValue(value),\n getSelection: () => (instance ? instance.getSelection() : { start: 0, end: 0, text: '' }),\n setSelection: (start, end) => instance && instance.setSelection(start, end),\n insertText: (text) => instance && instance.insertText(text),\n getContainer: () => el.value,\n });\n\n return () => h('div', { ref: el, class: 'vd-code-editor' });\n },\n});\n", "// The shared, ReDoS-safe tokenizer engine.\n//\n// Every language tokenizer is an ordered list of rules `{ type, re }` (or\n// `{ expand, re }`), where each `re` is a STICKY (`y`) regex. `scan()` tries the\n// rules at the current index; the first whose regex matches (consuming >=1 char)\n// wins. Any run of characters no rule matches becomes a single `plain` token.\n//\n// Optional `when(source, i)` skips a rule; optional `consume(source, i)` returns\n// `{ value }` without a sticky regex (still must advance \u22651 character).\n//\n// Because every rule is anchored at `lastIndex` (or consume) and consumes at\n// least one character, scanning is linear in the input length \u2014 there is no\n// cross-position backtracking. Rule regexes must themselves avoid nested\n// unbounded quantifiers (no `(a+)+`) so a single rule can never backtrack\n// catastrophically either.\n\n/**\n * Try the ordered `rules` at index `i`. Returns `{ tokens, length, value }`\n * or `null` when nothing matches.\n */\nexport function matchRule(source, i, rules) {\n for (let r = 0; r < rules.length; r++) {\n const rule = rules[r];\n if (rule.when && !rule.when(source, i)) continue;\n let value;\n if (rule.consume) {\n const got = rule.consume(source, i);\n if (!got || !got.value || got.value.length === 0) continue;\n value = got.value;\n } else {\n rule.re.lastIndex = i;\n const m = rule.re.exec(source);\n if (!m || m[0].length === 0) continue;\n value = m[0];\n }\n const tokens = rule.expand ? rule.expand(value) : [{ type: rule.type, value }];\n return { tokens, length: value.length, value };\n }\n return null;\n}\n\n/**\n * Tokenize `source` with the ordered `rules`. Returns `{ type, value }[]`.\n * Guarantee: `tokens.map((t) => t.value).join('') === source` (lossless).\n */\nexport function scan(source, rules) {\n const tokens = [];\n const n = source.length;\n let i = 0;\n let plainStart = -1;\n\n const flushPlain = (end) => {\n if (plainStart !== -1 && end > plainStart) {\n tokens.push({ type: 'plain', value: source.slice(plainStart, end) });\n }\n plainStart = -1;\n };\n\n while (i < n) {\n const hit = matchRule(source, i, rules);\n if (hit) {\n flushPlain(i);\n for (let k = 0; k < hit.tokens.length; k++) tokens.push(hit.tokens[k]);\n i += hit.length;\n } else {\n if (plainStart === -1) plainStart = i;\n i++;\n }\n }\n flushPlain(n);\n return coalesce(tokens);\n}\n\n/**\n * Merge adjacent tokens of the same type into one, cutting the DOM node count.\n * Lossless \u2014 values are concatenated in order.\n */\nexport function coalesce(tokens) {\n if (tokens.length < 2) return tokens;\n const out = [{ type: tokens[0].type, value: tokens[0].value }];\n for (let i = 1; i < tokens.length; i++) {\n const cur = tokens[i];\n const prev = out[out.length - 1];\n if (cur.type === prev.type) prev.value += cur.value;\n else out.push({ type: cur.type, value: cur.value });\n }\n return out;\n}\n\n/**\n * Build a sticky, word-boundaried alternation from a list of identifier words\n * (all `[A-Za-z0-9_]`, so no escaping needed). Longer words first so the\n * alternation is order-independent even without relying on `\\b`.\n */\nexport function wordRegex(words, flags) {\n const sorted = [...words].sort((a, b) => b.length - a.length);\n return new RegExp('(?:' + sorted.join('|') + ')\\\\b', (flags || '') + 'y');\n}\n", "// JavaScript / TypeScript tokenizer. One rule set, parameterized by keyword\n// list: TypeScript is JavaScript plus a superset of type-level keywords.\n// Template literals expand `${}` interpolations; `/pattern/flags` in regex\n// position emits `regex` (division `/` stays an operator after an identifier).\n\nimport { scan, wordRegex } from './scanner.js';\n\nconst JS_KEYWORDS = [\n 'break',\n 'case',\n 'catch',\n 'class',\n 'const',\n 'continue',\n 'debugger',\n 'default',\n 'delete',\n 'do',\n 'else',\n 'export',\n 'extends',\n 'finally',\n 'for',\n 'function',\n 'if',\n 'import',\n 'in',\n 'instanceof',\n 'new',\n 'return',\n 'super',\n 'switch',\n 'this',\n 'throw',\n 'try',\n 'typeof',\n 'var',\n 'void',\n 'while',\n 'with',\n 'yield',\n 'async',\n 'await',\n 'let',\n 'static',\n 'get',\n 'set',\n 'of',\n 'as',\n 'from',\n];\n\nconst TS_KEYWORDS = [\n ...JS_KEYWORDS,\n 'interface',\n 'type',\n 'enum',\n 'implements',\n 'declare',\n 'namespace',\n 'readonly',\n 'satisfies',\n 'abstract',\n 'public',\n 'private',\n 'protected',\n 'keyof',\n 'infer',\n 'is',\n 'asserts',\n 'override',\n 'module',\n 'string',\n 'number',\n 'boolean',\n 'object',\n 'symbol',\n 'bigint',\n 'any',\n 'unknown',\n 'never',\n];\n\nconst BUILTINS = [\n 'console',\n 'window',\n 'document',\n 'globalThis',\n 'Math',\n 'JSON',\n 'Object',\n 'Array',\n 'String',\n 'Number',\n 'Boolean',\n 'Symbol',\n 'Promise',\n 'Map',\n 'Set',\n 'WeakMap',\n 'WeakSet',\n 'Date',\n 'RegExp',\n 'Error',\n 'Function',\n 'parseInt',\n 'parseFloat',\n 'isNaN',\n 'isFinite',\n 'require',\n 'module',\n 'exports',\n 'process',\n 'NaN',\n 'Infinity',\n];\n\nconst REGEX_AFTER_KEYWORD = new Set([\n 'return',\n 'throw',\n 'case',\n 'in',\n 'of',\n 'typeof',\n 'void',\n 'delete',\n 'new',\n 'else',\n 'do',\n 'yield',\n 'await',\n 'extends',\n]);\n\nfunction isWs(c) {\n return c === 32 || c === 9 || c === 10 || c === 13;\n}\n\nfunction isWord(c) {\n return (\n (c >= 48 && c <= 57) || (c >= 65 && c <= 90) || (c >= 97 && c <= 122) || c === 36 || c === 95\n );\n}\n\n/** `/` starts a regex unless the preceding token is an identifier, number, `)`, `]`, `++`, or `--`. */\nexport function canStartRegex(source, i) {\n let j = i - 1;\n while (j >= 0 && isWs(source.charCodeAt(j))) j--;\n if (j < 0) return true;\n const c = source.charCodeAt(j);\n if (c === 41 || c === 93) return false; // ) ]\n if ((c === 43 || c === 45) && j > 0 && source.charCodeAt(j - 1) === c) return false;\n if (isWord(c)) {\n let start = j;\n while (start > 0 && isWord(source.charCodeAt(start - 1))) start--;\n return REGEX_AFTER_KEYWORD.has(source.slice(start, j + 1));\n }\n return true;\n}\n\nfunction isRegexFlag(c) {\n return (\n c === 100 ||\n c === 103 ||\n c === 105 ||\n c === 109 ||\n c === 115 ||\n c === 117 ||\n c === 118 ||\n c === 121\n );\n}\n\n/** Linear `/pattern/flags` consumer. Returns null when unterminated (so `/` can be division). */\nexport function consumeRegex(source, i) {\n const n = source.length;\n let j = i + 1;\n let inClass = false;\n while (j < n) {\n const c = source.charCodeAt(j);\n if (c === 10) return null;\n if (c === 92) {\n j += 2;\n continue;\n }\n if (inClass) {\n if (c === 93) inClass = false;\n j++;\n continue;\n }\n if (c === 91) {\n inClass = true;\n j++;\n continue;\n }\n if (c === 47) {\n j++;\n while (j < n && isRegexFlag(source.charCodeAt(j))) j++;\n return { value: source.slice(i, j) };\n }\n j++;\n }\n return null;\n}\n\nfunction skipQuoted(s, i) {\n const q = s.charCodeAt(i);\n let j = i + 1;\n const n = s.length;\n while (j < n) {\n const c = s.charCodeAt(j);\n if (c === 92) {\n j += 2;\n continue;\n }\n if (c === q) return j + 1;\n if (c === 10) return j;\n j++;\n }\n return n;\n}\n\nfunction findTemplateInterpEnd(s, start) {\n let depth = 1;\n let i = start;\n const n = s.length;\n while (i < n && depth > 0) {\n const c = s.charCodeAt(i);\n if (c === 47 && s.charCodeAt(i + 1) === 47) {\n const nl = s.indexOf('\\n', i + 2);\n if (nl < 0) return n;\n i = nl;\n continue;\n }\n if (c === 47 && s.charCodeAt(i + 1) === 42) {\n const end = s.indexOf('*/', i + 2);\n i = end < 0 ? n : end + 2;\n continue;\n }\n if (c === 34 || c === 39) {\n i = skipQuoted(s, i);\n continue;\n }\n if (c === 96) {\n i = skipTemplate(s, i);\n continue;\n }\n if (c === 123) depth++;\n else if (c === 125) {\n depth--;\n if (depth === 0) return i;\n }\n i++;\n }\n return n;\n}\n\nfunction skipTemplate(s, i) {\n let j = i + 1;\n const n = s.length;\n while (j < n) {\n const c = s.charCodeAt(j);\n if (c === 92) {\n j += 2;\n continue;\n }\n if (c === 96) return j + 1;\n if (c === 36 && s.charCodeAt(j + 1) === 123) {\n const end = findTemplateInterpEnd(s, j + 2);\n j = end < n && s.charCodeAt(end) === 125 ? end + 1 : end;\n continue;\n }\n j++;\n }\n return n;\n}\n\nfunction expandTemplateLiteral(value, rules) {\n const out = [];\n const n = value.length;\n let i = 1;\n let strStart = 0;\n\n const flushString = (end) => {\n if (end > strStart) out.push({ type: 'string', value: value.slice(strStart, end) });\n };\n\n while (i < n) {\n const c = value.charCodeAt(i);\n if (c === 92) {\n i += i + 1 < n ? 2 : 1;\n continue;\n }\n if (c === 96) {\n flushString(i + 1);\n return out;\n }\n if (c === 36 && i + 1 < n && value.charCodeAt(i + 1) === 123) {\n flushString(i);\n out.push({ type: 'operator', value: '${' });\n const innerStart = i + 2;\n const innerEnd = findTemplateInterpEnd(value, innerStart);\n const inner = value.slice(innerStart, innerEnd);\n if (inner) {\n const parts = scan(inner, rules);\n for (let k = 0; k < parts.length; k++) out.push(parts[k]);\n }\n if (innerEnd < n && value.charCodeAt(innerEnd) === 125) {\n out.push({ type: 'punctuation', value: '}' });\n i = innerEnd + 1;\n } else {\n i = innerEnd;\n }\n strStart = i;\n continue;\n }\n i++;\n }\n flushString(n);\n return out;\n}\n\nfunction makeRules(keywords) {\n const rules = [\n { type: 'comment', re: /\\/\\/[^\\n]*/y },\n { type: 'comment', re: /\\/\\*[\\s\\S]*?(?:\\*\\/|$)/y }, // unterminated -> comment to EOF\n { type: 'string', re: /\"(?:[^\"\\\\\\n]|\\\\.)*\"?/y },\n { type: 'string', re: /'(?:[^'\\\\\\n]|\\\\.)*'?/y },\n { expand: (value) => expandTemplateLiteral(value, rules), re: /`(?:[^`\\\\]|\\\\.)*`?/y },\n {\n type: 'number',\n re: /0[xX][\\da-fA-F_]+n?|0[bB][01_]+n?|0[oO][0-7_]+n?|(?:\\d[\\d_]*\\.?[\\d_]*|\\.\\d[\\d_]*)(?:[eE][+-]?\\d+)?n?/y,\n },\n { type: 'keyword', re: wordRegex(keywords) },\n { type: 'boolean', re: /(?:true|false)\\b/y },\n { type: 'null', re: /(?:null|undefined)\\b/y },\n { type: 'builtin', re: wordRegex(BUILTINS) },\n { type: 'function', re: /[A-Za-z_$][\\w$]*(?=\\s*\\()/y },\n { type: 'plain', re: /[A-Za-z_$][\\w$]*/y },\n {\n type: 'regex',\n when: (source, i) => source.charCodeAt(i) === 47 && canStartRegex(source, i),\n consume: consumeRegex,\n },\n { type: 'operator', re: /\\.{3}|=>|[+\\-*/%=<>!&|^~?]+/y },\n { type: 'punctuation', re: /[{}()[\\];,.:]/y },\n ];\n return rules;\n}\n\nconst JS_RULES = makeRules(JS_KEYWORDS);\nconst TS_RULES = makeRules(TS_KEYWORDS);\n\nexport function tokenizeJavaScript(source) {\n return scan(source, JS_RULES);\n}\n\nexport function tokenizeTypeScript(source) {\n return scan(source, TS_RULES);\n}\n", "// CSS tokenizer. A flat, stateless scan: comments, strings, at-rules, hex\n// colors, numbers+units, `!important`, custom properties, known property names\n// (only when followed by `:` \u2014 so `.a:hover` does not mark `a` as `property`),\n// class/id selectors, pseudos, function names, punctuation, and combinators.\n\nimport { scan } from './scanner.js';\n\nconst PROPERTIES = [\n 'align-content',\n 'align-items',\n 'align-self',\n 'all',\n 'animation',\n 'animation-delay',\n 'animation-direction',\n 'animation-duration',\n 'animation-fill-mode',\n 'animation-iteration-count',\n 'animation-name',\n 'animation-play-state',\n 'animation-timing-function',\n 'appearance',\n 'aspect-ratio',\n 'backdrop-filter',\n 'backface-visibility',\n 'background',\n 'background-attachment',\n 'background-blend-mode',\n 'background-clip',\n 'background-color',\n 'background-image',\n 'background-origin',\n 'background-position',\n 'background-repeat',\n 'background-size',\n 'block-size',\n 'border',\n 'border-block',\n 'border-block-end',\n 'border-block-start',\n 'border-bottom',\n 'border-bottom-color',\n 'border-bottom-left-radius',\n 'border-bottom-right-radius',\n 'border-bottom-style',\n 'border-bottom-width',\n 'border-collapse',\n 'border-color',\n 'border-end-end-radius',\n 'border-end-start-radius',\n 'border-image',\n 'border-inline',\n 'border-inline-end',\n 'border-inline-start',\n 'border-left',\n 'border-left-color',\n 'border-left-style',\n 'border-left-width',\n 'border-radius',\n 'border-right',\n 'border-right-color',\n 'border-right-style',\n 'border-right-width',\n 'border-spacing',\n 'border-start-end-radius',\n 'border-start-start-radius',\n 'border-style',\n 'border-top',\n 'border-top-color',\n 'border-top-left-radius',\n 'border-top-right-radius',\n 'border-top-style',\n 'border-top-width',\n 'border-width',\n 'bottom',\n 'box-decoration-break',\n 'box-shadow',\n 'box-sizing',\n 'break-after',\n 'break-before',\n 'break-inside',\n 'caption-side',\n 'caret-color',\n 'clear',\n 'clip',\n 'clip-path',\n 'color',\n 'color-scheme',\n 'column-count',\n 'column-fill',\n 'column-gap',\n 'column-rule',\n 'column-span',\n 'column-width',\n 'columns',\n 'contain',\n 'container',\n 'content',\n 'counter-increment',\n 'counter-reset',\n 'cursor',\n 'direction',\n 'display',\n 'empty-cells',\n 'filter',\n 'flex',\n 'flex-basis',\n 'flex-direction',\n 'flex-flow',\n 'flex-grow',\n 'flex-shrink',\n 'flex-wrap',\n 'float',\n 'font',\n 'font-family',\n 'font-feature-settings',\n 'font-kerning',\n 'font-size',\n 'font-size-adjust',\n 'font-stretch',\n 'font-style',\n 'font-synthesis',\n 'font-variant',\n 'font-variation-settings',\n 'font-weight',\n 'gap',\n 'grid',\n 'grid-area',\n 'grid-auto-columns',\n 'grid-auto-flow',\n 'grid-auto-rows',\n 'grid-column',\n 'grid-column-end',\n 'grid-column-start',\n 'grid-row',\n 'grid-row-end',\n 'grid-row-start',\n 'grid-template',\n 'grid-template-areas',\n 'grid-template-columns',\n 'grid-template-rows',\n 'hanging-punctuation',\n 'height',\n 'hyphens',\n 'image-rendering',\n 'inline-size',\n 'inset',\n 'inset-block',\n 'inset-inline',\n 'isolation',\n 'justify-content',\n 'justify-items',\n 'justify-self',\n 'left',\n 'letter-spacing',\n 'line-break',\n 'line-clamp',\n 'line-height',\n 'list-style',\n 'list-style-image',\n 'list-style-position',\n 'list-style-type',\n 'margin',\n 'margin-block',\n 'margin-block-end',\n 'margin-block-start',\n 'margin-bottom',\n 'margin-inline',\n 'margin-inline-end',\n 'margin-inline-start',\n 'margin-left',\n 'margin-right',\n 'margin-top',\n 'mask',\n 'mask-image',\n 'max-block-size',\n 'max-height',\n 'max-inline-size',\n 'max-width',\n 'min-block-size',\n 'min-height',\n 'min-inline-size',\n 'min-width',\n 'mix-blend-mode',\n 'object-fit',\n 'object-position',\n 'offset',\n 'opacity',\n 'order',\n 'orphans',\n 'outline',\n 'outline-color',\n 'outline-offset',\n 'outline-style',\n 'outline-width',\n 'overflow',\n 'overflow-anchor',\n 'overflow-wrap',\n 'overflow-x',\n 'overflow-y',\n 'overscroll-behavior',\n 'padding',\n 'padding-block',\n 'padding-block-end',\n 'padding-block-start',\n 'padding-bottom',\n 'padding-inline',\n 'padding-inline-end',\n 'padding-inline-start',\n 'padding-left',\n 'padding-right',\n 'padding-top',\n 'page-break-after',\n 'page-break-before',\n 'page-break-inside',\n 'perspective',\n 'place-content',\n 'place-items',\n 'place-self',\n 'pointer-events',\n 'position',\n 'quotes',\n 'resize',\n 'right',\n 'rotate',\n 'row-gap',\n 'scale',\n 'scroll-behavior',\n 'scroll-margin',\n 'scroll-padding',\n 'scroll-snap-align',\n 'scroll-snap-type',\n 'shape-outside',\n 'tab-size',\n 'table-layout',\n 'text-align',\n 'text-align-last',\n 'text-decoration',\n 'text-decoration-color',\n 'text-decoration-line',\n 'text-decoration-style',\n 'text-decoration-thickness',\n 'text-emphasis',\n 'text-indent',\n 'text-overflow',\n 'text-rendering',\n 'text-shadow',\n 'text-transform',\n 'text-underline-offset',\n 'text-wrap',\n 'top',\n 'touch-action',\n 'transform',\n 'transform-origin',\n 'transition',\n 'transition-delay',\n 'transition-duration',\n 'transition-property',\n 'transition-timing-function',\n 'translate',\n 'unicode-bidi',\n 'user-select',\n 'vertical-align',\n 'visibility',\n 'white-space',\n 'widows',\n 'width',\n 'will-change',\n 'word-break',\n 'word-spacing',\n 'word-wrap',\n 'writing-mode',\n 'z-index',\n];\n\nfunction cssPropRegex(names) {\n const sorted = [...names].sort((a, b) => b.length - a.length);\n return new RegExp('(?:' + sorted.join('|') + ')(?=\\\\s*:)', 'y');\n}\n\nconst RULES = [\n { type: 'comment', re: /\\/\\*[\\s\\S]*?(?:\\*\\/|$)/y }, // unterminated -> comment to EOF\n { type: 'string', re: /\"(?:[^\"\\\\\\n]|\\\\.)*\"?|'(?:[^'\\\\\\n]|\\\\.)*'?/y },\n { type: 'meta', re: /@[a-zA-Z-]+/y },\n { type: 'keyword', re: /!important\\b/y },\n { type: 'number', re: /#[0-9a-fA-F]{3,8}\\b/y },\n { type: 'number', re: /-?(?:\\d*\\.\\d+|\\d+)(?:%|[a-zA-Z]{1,4})?/y },\n { type: 'property', re: /--[\\w-]+/y },\n { type: 'property', re: cssPropRegex(PROPERTIES) },\n { type: 'attribute', re: /[.#][a-zA-Z_-][\\w-]*/y },\n { type: 'meta', re: /::?[a-zA-Z_-][\\w-]*/y },\n { type: 'function', re: /[-a-zA-Z][\\w-]*(?=\\()/y },\n { type: 'punctuation', re: /[{}()[\\];:,]/y },\n { type: 'operator', re: /[>+~*]/y },\n // Catch-all: consume an identifier/dash run (or whitespace) in one match so\n // the greedy property/function look-ahead rules run once per run, not once\n // per character (keeps scanning linear).\n { type: 'plain', re: /[-\\w$]+|\\s+/y },\n];\n\nexport function tokenizeCss(source) {\n return scan(source, RULES);\n}\n", "// HTML / XML / Vue SFC tokenizer. Tags are matched as one unit, then expanded\n// into tag-name / attribute / value sub-tokens. Complete `<script>` / `<style>`\n// open tags switch into JS/TS/CSS until the matching close tag (linear search).\n// Vue adds `{{ }}` mustache fences and classifies `v-*` / `@event` / `:bind`\n// as `meta`.\n\nimport { coalesce, matchRule } from './scanner.js';\nimport { tokenizeJavaScript, tokenizeTypeScript } from './javascript.js';\nimport { tokenizeCss } from './css.js';\n\nfunction expandTag(value, vue) {\n const out = [];\n const open = /^<\\/?/.exec(value)[0];\n out.push({ type: 'punctuation', value: open });\n let rest = value.slice(open.length);\n\n const name = /^[a-zA-Z][\\w:-]*/.exec(rest);\n if (name) {\n out.push({ type: 'tag', value: name[0] });\n rest = rest.slice(name[0].length);\n }\n\n if (rest) {\n const attrRules = vue\n ? [\n { type: 'string', re: /\"[^\"]*\"?|'[^']*'?/y },\n { type: 'operator', re: /=/y },\n { type: 'punctuation', re: /\\/?>/y },\n { type: 'meta', re: /(?:v-[\\w:.@-]+|[@:][\\w:.@-]*)/y },\n { type: 'attribute', re: /[a-zA-Z_][\\w:.-]*/y },\n ]\n : [\n { type: 'string', re: /\"[^\"]*\"?|'[^']*'?/y },\n { type: 'operator', re: /=/y },\n { type: 'punctuation', re: /\\/?>/y },\n { type: 'attribute', re: /[a-zA-Z_:@][\\w:.-]*/y },\n ];\n const inner = scanSlice(rest, attrRules);\n for (let i = 0; i < inner.length; i++) out.push(inner[i]);\n }\n return out;\n}\n\nfunction scanSlice(source, rules) {\n const tokens = [];\n const n = source.length;\n let i = 0;\n let plainStart = -1;\n const flushPlain = (end) => {\n if (plainStart !== -1 && end > plainStart) {\n tokens.push({ type: 'plain', value: source.slice(plainStart, end) });\n }\n plainStart = -1;\n };\n while (i < n) {\n const hit = matchRule(source, i, rules);\n if (hit) {\n flushPlain(i);\n for (let k = 0; k < hit.tokens.length; k++) tokens.push(hit.tokens[k]);\n i += hit.length;\n } else {\n if (plainStart === -1) plainStart = i;\n i++;\n }\n }\n flushPlain(n);\n return tokens;\n}\n\nfunction ieqChar(a, b) {\n if (a === b) return true;\n if (a >= 65 && a <= 90) return a + 32 === b;\n if (b >= 65 && b <= 90) return b + 32 === a;\n return false;\n}\n\n/** Linear, case-insensitive search for `</tagName>` starting at `start`. */\nfunction findCloseTag(source, start, tagName) {\n const n = source.length;\n const tlen = tagName.length;\n for (let i = start; i < n; i++) {\n if (source.charCodeAt(i) !== 60) continue;\n if (source.charCodeAt(i + 1) !== 47) continue;\n let ok = true;\n for (let k = 0; k < tlen; k++) {\n if (!ieqChar(source.charCodeAt(i + 2 + k), tagName.charCodeAt(k))) {\n ok = false;\n break;\n }\n }\n if (!ok) continue;\n let j = i + 2 + tlen;\n while (j < n) {\n const c = source.charCodeAt(j);\n if (c === 32 || c === 9 || c === 10 || c === 13) j++;\n else break;\n }\n if (j < n && source.charCodeAt(j) === 62) return { start: i, end: j + 1 };\n }\n return null;\n}\n\nfunction embedInfo(tagValue) {\n const open = /^<(script|style)\\b/i.exec(tagValue);\n if (!open) return null;\n if (!tagValue.endsWith('>') || tagValue.endsWith('/>')) return null;\n const tag = open[1].toLowerCase();\n if (tag === 'style') return { tag: 'style', lang: 'css' };\n const lang = /\\blang\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)'|([^\\s>]+))/i.exec(tagValue);\n const id = ((lang && (lang[1] || lang[2] || lang[3])) || '').toLowerCase();\n if (id === 'ts' || id === 'tsx' || id === 'typescript')\n return { tag: 'script', lang: 'typescript' };\n return { tag: 'script', lang: 'javascript' };\n}\n\nfunction tokenizeEmbed(source, lang) {\n if (lang === 'typescript') return tokenizeTypeScript(source);\n if (lang === 'css') return tokenizeCss(source);\n return tokenizeJavaScript(source);\n}\n\nfunction expandMustache(value) {\n const out = [{ type: 'meta', value: '{{' }];\n let inner = value.slice(2);\n let close = '';\n if (value.length >= 4 && inner.endsWith('}}')) {\n close = '}}';\n inner = inner.slice(0, -2);\n }\n if (inner) {\n const parts = tokenizeJavaScript(inner);\n for (let i = 0; i < parts.length; i++) out.push(parts[i]);\n }\n if (close) out.push({ type: 'meta', value: close });\n return out;\n}\n\nfunction makeMarkupRules(vue) {\n const expand = (value) => expandTag(value, vue);\n const rules = [\n { type: 'comment', re: /<!--[\\s\\S]*?-->/y },\n { type: 'meta', re: /<!\\[CDATA\\[[\\s\\S]*?\\]\\]>/y },\n { type: 'meta', re: /<!DOCTYPE[^>]*>/iy },\n {\n expand,\n re: /<\\/?[a-zA-Z][\\w:-]*(?:\\s+[^\\s/>\"'=]+(?:\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s>]+))?)*\\s*\\/?>/y,\n },\n { expand, re: /<\\/?[a-zA-Z][\\w:-]*/y },\n { type: 'meta', re: /&[a-zA-Z][a-zA-Z0-9]*;|&#\\d+;|&#x[0-9a-fA-F]+;/y },\n ];\n if (vue) {\n rules.splice(1, 0, { expand: expandMustache, re: /\\{\\{[\\s\\S]*?(?:\\}\\}|$)/y });\n }\n return rules;\n}\n\nconst HTML_RULES = makeMarkupRules(false);\nconst VUE_RULES = makeMarkupRules(true);\n\n/**\n * Tokenize HTML or a Vue SFC. `vue: true` enables mustache + directive `meta`.\n */\nexport function tokenizeMarkup(source, options) {\n const vue = !!(options && options.vue);\n const rules = vue ? VUE_RULES : HTML_RULES;\n const tokens = [];\n const n = source.length;\n let i = 0;\n let plainStart = -1;\n\n const flushPlain = (end) => {\n if (plainStart !== -1 && end > plainStart) {\n tokens.push({ type: 'plain', value: source.slice(plainStart, end) });\n }\n plainStart = -1;\n };\n\n while (i < n) {\n const hit = matchRule(source, i, rules);\n if (hit) {\n flushPlain(i);\n const embed = embedInfo(hit.value);\n if (embed) {\n for (let k = 0; k < hit.tokens.length; k++) tokens.push(hit.tokens[k]);\n i += hit.length;\n const close = findCloseTag(source, i, embed.tag);\n const bodyEnd = close ? close.start : n;\n const body = source.slice(i, bodyEnd);\n if (body) {\n const inner = tokenizeEmbed(body, embed.lang);\n for (let k = 0; k < inner.length; k++) tokens.push(inner[k]);\n }\n if (close) {\n const closeTokens = expandTag(source.slice(close.start, close.end), vue);\n for (let k = 0; k < closeTokens.length; k++) tokens.push(closeTokens[k]);\n i = close.end;\n } else {\n i = n;\n }\n continue;\n }\n for (let k = 0; k < hit.tokens.length; k++) tokens.push(hit.tokens[k]);\n i += hit.length;\n } else {\n if (plainStart === -1) plainStart = i;\n i++;\n }\n }\n flushPlain(n);\n return coalesce(tokens);\n}\n\nexport function tokenizeHtml(source) {\n return tokenizeMarkup(source, { vue: false });\n}\n\nexport function tokenizeVue(source) {\n return tokenizeMarkup(source, { vue: true });\n}\n", "// JSON tokenizer. Object keys (a string immediately before a colon) color as\n// `property`; all other strings as `string`.\n\nimport { scan } from './scanner.js';\n\nconst RULES = [\n { type: 'property', re: /\"(?:[^\"\\\\]|\\\\.)*\"(?=\\s*:)/y },\n { type: 'string', re: /\"(?:[^\"\\\\]|\\\\.)*\"?/y },\n { type: 'number', re: /-?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?/y },\n { type: 'boolean', re: /\\b(?:true|false)\\b/y },\n { type: 'null', re: /\\bnull\\b/y },\n { type: 'punctuation', re: /[{}[\\]:,]/y },\n];\n\nexport function tokenizeJson(source) {\n return scan(source, RULES);\n}\n", "// Markdown tokenizer. Line-oriented constructs use the `m` (multiline) + `y`\n// (sticky) flags together, so an anchored `^` rule only fires at a line start.\n\nimport { scan } from './scanner.js';\n\nconst RULES = [\n { type: 'string', re: /```[\\s\\S]*?```|~~~[\\s\\S]*?~~~|`[^`\\n]*`/y },\n { type: 'keyword', re: /^ {0,3}#{1,6} [^\\n]*/my },\n { type: 'comment', re: /^ {0,3}>[^\\n]*/my },\n { type: 'punctuation', re: /^ {0,3}(?:[-*+]|\\d+\\.)\\s/my },\n { type: 'meta', re: /^ {0,3}(?:-{3,}|\\*{3,}|_{3,})\\s*$/my },\n { type: 'function', re: /!?\\[[^\\][\\n]*\\]\\([^()\\n]*\\)/y },\n { type: 'operator', re: /\\*\\*[^\\n]*?\\*\\*|__[^\\n]*?__/y },\n { type: 'meta', re: /\\*[^*\\n]+?\\*|_[^_\\n]+?_/y },\n];\n\nexport function tokenizeMarkdown(source) {\n return scan(source, RULES);\n}\n", "// Shell / Bash tokenizer. Variables (`$VAR`, `${...}`) are matched before the\n// `#` comment rule can fire, so `${#arr}` stays a variable.\n\nimport { scan, wordRegex } from './scanner.js';\n\nconst KEYWORDS = [\n 'if',\n 'then',\n 'elif',\n 'else',\n 'fi',\n 'for',\n 'while',\n 'until',\n 'do',\n 'done',\n 'case',\n 'esac',\n 'function',\n 'in',\n 'select',\n 'return',\n 'break',\n 'continue',\n 'local',\n 'export',\n 'readonly',\n 'declare',\n 'typeset',\n 'set',\n 'unset',\n 'shift',\n 'exit',\n 'source',\n 'alias',\n];\n\nconst BUILTINS = [\n 'echo',\n 'printf',\n 'read',\n 'cd',\n 'pwd',\n 'ls',\n 'cat',\n 'grep',\n 'sed',\n 'awk',\n 'cut',\n 'sort',\n 'uniq',\n 'head',\n 'tail',\n 'find',\n 'xargs',\n 'curl',\n 'wget',\n 'git',\n 'npm',\n 'pnpm',\n 'yarn',\n 'node',\n 'python',\n 'pip',\n 'docker',\n 'kubectl',\n 'make',\n 'chmod',\n 'chown',\n 'mkdir',\n 'rmdir',\n 'rm',\n 'cp',\n 'mv',\n 'touch',\n 'test',\n 'sudo',\n 'env',\n 'which',\n 'kill',\n 'ps',\n 'tar',\n 'ssh',\n];\n\nconst RULES = [\n { type: 'comment', re: /#[^\\n]*/y },\n { type: 'string', re: /\"(?:[^\"\\\\]|\\\\.)*\"?/y },\n { type: 'string', re: /'[^']*'?/y },\n { type: 'variable', re: /\\$\\{[^}\\n]*\\}?|\\$[A-Za-z_]\\w*|\\$[@*#?$!0-9-]/y },\n { type: 'keyword', re: wordRegex(KEYWORDS) },\n { type: 'builtin', re: wordRegex(BUILTINS) },\n { type: 'attribute', re: /(?:^|\\s)-{1,2}[A-Za-z][\\w-]*/y },\n { type: 'number', re: /\\b\\d+\\b/y },\n { type: 'operator', re: /\\|\\||&&|[|&;<>]+/y },\n { type: 'punctuation', re: /[(){}[\\]]/y },\n];\n\nexport function tokenizeShell(source) {\n return scan(source, RULES);\n}\n", "// Python tokenizer. Triple-quoted and prefixed (r/b/f/u) strings are matched as\n// whole strings; f-string interpolation is not sub-highlighted in v1.\n\nimport { scan, wordRegex } from './scanner.js';\n\nconst KEYWORDS = [\n 'def',\n 'class',\n 'return',\n 'if',\n 'elif',\n 'else',\n 'for',\n 'while',\n 'break',\n 'continue',\n 'pass',\n 'import',\n 'from',\n 'as',\n 'with',\n 'try',\n 'except',\n 'finally',\n 'raise',\n 'yield',\n 'lambda',\n 'global',\n 'nonlocal',\n 'del',\n 'assert',\n 'async',\n 'await',\n 'in',\n 'is',\n 'not',\n 'and',\n 'or',\n 'match',\n 'case',\n];\n\nconst BUILTINS = [\n 'print',\n 'len',\n 'range',\n 'int',\n 'float',\n 'str',\n 'list',\n 'dict',\n 'set',\n 'tuple',\n 'bool',\n 'bytes',\n 'type',\n 'isinstance',\n 'issubclass',\n 'super',\n 'open',\n 'enumerate',\n 'zip',\n 'map',\n 'filter',\n 'sorted',\n 'reversed',\n 'sum',\n 'min',\n 'max',\n 'abs',\n 'round',\n 'input',\n 'repr',\n 'format',\n 'object',\n 'self',\n 'cls',\n 'Exception',\n 'ValueError',\n 'TypeError',\n 'KeyError',\n 'IndexError',\n 'AttributeError',\n 'RuntimeError',\n];\n\nconst RULES = [\n { type: 'comment', re: /#[^\\n]*/y },\n {\n type: 'string',\n re: /[rRbBfFuU]{0,2}(?:\"\"\"[\\s\\S]*?\"\"\"|'''[\\s\\S]*?'''|\"(?:[^\"\\\\\\n]|\\\\.)*\"?|'(?:[^'\\\\\\n]|\\\\.)*'?)/y,\n },\n { type: 'meta', re: /@[A-Za-z_]\\w*/y },\n { type: 'keyword', re: wordRegex(KEYWORDS) },\n { type: 'boolean', re: /\\b(?:True|False)\\b/y },\n { type: 'null', re: /\\bNone\\b/y },\n { type: 'builtin', re: wordRegex(BUILTINS) },\n { type: 'function', re: /[A-Za-z_]\\w*(?=\\s*\\()/y },\n {\n type: 'number',\n re: /\\b0[xXoObB][0-9a-fA-F_]+\\b|\\b\\d[\\d_]*(?:\\.\\d[\\d_]*)?(?:[eE][+-]?\\d+)?[jJ]?\\b/y,\n },\n { type: 'operator', re: /:=|[+\\-*/%=<>!&|^~@]+/y },\n { type: 'punctuation', re: /[()[\\]{}:;,.]/y },\n // Catch-all: consume an identifier run (or whitespace) in one match so the\n // greedy function look-ahead rule runs once per run, not once per character.\n { type: 'plain', re: /\\w+|\\s+/y },\n];\n\nexport function tokenizePython(source) {\n return scan(source, RULES);\n}\n", "// Tokenizer registry + the public `tokenize()` entry point.\n//\n// Each language module is a pure `(source) => Token[]` function built on the\n// shared linear scanner. `tokenize()` resolves aliases, dispatches to the right\n// tokenizer, and falls back to a single `plain` token for unknown languages \u2014\n// it never throws.\n\nimport { tokenizeJavaScript, tokenizeTypeScript } from './javascript.js';\nimport { tokenizeHtml, tokenizeVue } from './html.js';\nimport { tokenizeCss } from './css.js';\nimport { tokenizeJson } from './json.js';\nimport { tokenizeMarkdown } from './markdown.js';\nimport { tokenizeShell } from './shell.js';\nimport { tokenizePython } from './python.js';\n\nconst TOKENIZERS = {\n javascript: tokenizeJavaScript,\n typescript: tokenizeTypeScript,\n html: tokenizeHtml,\n vue: tokenizeVue,\n css: tokenizeCss,\n json: tokenizeJson,\n markdown: tokenizeMarkdown,\n shell: tokenizeShell,\n python: tokenizePython,\n};\n\n/** Canonical language ids the editor understands (`plaintext` = no highlight). */\nexport const LANGUAGES = Object.freeze([\n 'plaintext',\n 'javascript',\n 'typescript',\n 'html',\n 'vue',\n 'css',\n 'json',\n 'markdown',\n 'shell',\n 'python',\n]);\n\n/** Common aliases mapped to canonical ids.\n * `jsx` / `tsx` / `jsonc` are JS / TS / JSON fallbacks \u2014 not real grammars. */\nexport const ALIASES = Object.freeze({\n js: 'javascript',\n jsx: 'javascript',\n mjs: 'javascript',\n cjs: 'javascript',\n ts: 'typescript',\n tsx: 'typescript',\n htm: 'html',\n xml: 'html',\n svg: 'html',\n sh: 'shell',\n bash: 'shell',\n zsh: 'shell',\n shellscript: 'shell',\n py: 'python',\n python3: 'python',\n md: 'markdown',\n mkd: 'markdown',\n json5: 'json',\n jsonc: 'json',\n text: 'plaintext',\n txt: 'plaintext',\n plain: 'plaintext',\n});\n\n/** Resolve a language id or alias to its canonical id. */\nexport function resolveLanguage(language) {\n const id = String(language || 'plaintext').toLowerCase();\n return ALIASES[id] || id;\n}\n\n/** The tokenizer function for a language, or `null` when none is registered. */\nexport function getTokenizer(language) {\n return TOKENIZERS[resolveLanguage(language)] || null;\n}\n\n/**\n * Tokenize `source` for `language`. Returns `{ type, value }[]`; the token\n * values always concatenate back to `source` exactly (lossless).\n */\nexport function tokenize(source, language) {\n if (!source) return [];\n const tokenizer = getTokenizer(language);\n if (!tokenizer) return [{ type: 'plain', value: source }];\n return tokenizer(source);\n}\n", "// Highlight rendering. Two paths, both escaping-safe:\n// - renderTokensToHtml / highlight \u2192 an escaped HTML STRING (node tests, SSR,\n// docs snippets). `highlight()` does NOT append an extra newline by default\n// (snippet-safe inside `<pre>`). Pass `{ trailingNewline: true }` for the\n// textarea-overlay line-count fix.\n// - renderTokensToDom \u2192 a DOM DocumentFragment built with createElement /\n// createTextNode. This is the RUNTIME editor path; untrusted source text\n// only ever reaches `textContent`, so `innerHTML` is never assigned.\n//\n// This module is also the `./code-editor/highlight` entry: it re-exports\n// `tokenize` / `LANGUAGES` and MUST NOT import `core.js` or `vue.js`.\n\nimport { tokenize, LANGUAGES } from './tokenizer/index.js';\n\nexport { tokenize, LANGUAGES };\n\nconst ESCAPE_RE = /[&<>\"']/g;\nconst ESCAPE_MAP = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n};\n\n/** Escape the five HTML metacharacters. */\nexport function escapeHtml(str) {\n return String(str).replace(ESCAPE_RE, (ch) => ESCAPE_MAP[ch]);\n}\n\n/** Render tokens to an escaped HTML string of `<span class=\"vd-tk-*\">` wrappers. */\nexport function renderTokensToHtml(tokens) {\n let html = '';\n for (let i = 0; i < tokens.length; i++) {\n const t = tokens[i];\n if (t.type === 'plain') {\n html += escapeHtml(t.value);\n } else {\n html += '<span class=\"vd-tk-' + t.type + '\">' + escapeHtml(t.value) + '</span>';\n }\n }\n return html;\n}\n\n/**\n * Tokenize + render to an escaped HTML string.\n *\n * @param {string} source\n * @param {string} language\n * @param {{ trailingNewline?: boolean }} [options]\n * When `trailingNewline` is true, append an extra `\\n` if `source` is empty\n * or already ends with `\\n` (textarea line-count). Default false \u2014 snippet-safe.\n */\nexport function highlight(source, language, options) {\n const html = renderTokensToHtml(tokenize(source, language));\n if (options && options.trailingNewline && (source.endsWith('\\n') || source === '')) {\n return html + '\\n';\n }\n return html;\n}\n\n/**\n * Build a DocumentFragment of token nodes using `doc` (an injected `document`,\n * for jsdom/SSR testability). Plain tokens become text nodes; typed tokens\n * become `<span class=\"vd-tk-*\">` with the text set via `textContent`.\n */\nexport function renderTokensToDom(tokens, doc) {\n const frag = doc.createDocumentFragment();\n for (let i = 0; i < tokens.length; i++) {\n const t = tokens[i];\n if (t.type === 'plain') {\n frag.appendChild(doc.createTextNode(t.value));\n } else {\n const span = doc.createElement('span');\n span.className = 'vd-tk-' + t.type;\n span.textContent = t.value;\n frag.appendChild(span);\n }\n }\n return frag;\n}\n", "// Shared, DOM-free constants for the code editor. Pure data and predicates \u2014\n// safe to import from node tests and from both the core and the tokenizers.\n\n/** Default indent width, in spaces. */\nexport const DEFAULT_TAB_SIZE = 2;\n\n// Above this many characters, highlighting is skipped (the editor renders one\n// escaped plain-text node) so very large documents stay responsive.\nexport const MAX_HIGHLIGHT_LENGTH = 100000;\n\n/** Characters that auto-close to the mapped closer when typed. */\nexport const AUTO_CLOSE_PAIRS = Object.freeze({\n '(': ')',\n '[': ']',\n '{': '}',\n '\"': '\"',\n \"'\": \"'\",\n '`': '`',\n});\n\n/** Opening characters that trigger auto-close. */\nexport const OPENERS = Object.freeze(Object.keys(AUTO_CLOSE_PAIRS));\n\n/** Closing characters (brackets + quotes) the caret can skip over. */\nexport const CLOSERS = Object.freeze([')', ']', '}', '\"', \"'\", '`']);\n\n/** True when `ch` is an auto-closing opener. */\nexport function isOpener(ch) {\n return Object.prototype.hasOwnProperty.call(AUTO_CLOSE_PAIRS, ch);\n}\n\n/** The closer mapped to `ch`, or `undefined`. */\nexport function closerFor(ch) {\n return AUTO_CLOSE_PAIRS[ch];\n}\n\n/** True when `open`/`close` form an auto-close pair. */\nexport function isMatchingPair(open, close) {\n return AUTO_CLOSE_PAIRS[open] === close;\n}\n", "// Pure keymap transactions. Each function takes the current textarea value and\n// selection and returns an EDIT \u2014 `{ from, to, text, selectionStart,\n// selectionEnd }` describing a replacement of `value[from..to]` with `text` plus\n// the resulting caret \u2014 or `null` to let the browser handle the key natively.\n// No DOM access, so every branch is unit-testable in plain node.\n\nimport { AUTO_CLOSE_PAIRS, CLOSERS, closerFor, isMatchingPair } from './constants.js';\n\nconst CLOSER_SET = new Set(CLOSERS);\nconst WORD = /[\\w$]/;\n\n/** Enter: copy the current line's indent, add a level after an opener, and\n * split an empty pair onto its own line. */\nexport function indentOnEnter(value, start, end, unit) {\n const lineStart = value.lastIndexOf('\\n', start - 1) + 1;\n const leading = /^[ \\t]*/.exec(value.slice(lineStart, start))[0];\n const prev = value[start - 1];\n const next = value[end];\n const opens = prev === '{' || prev === '[' || prev === '(';\n\n if (opens && isMatchingPair(prev, next)) {\n const inner = leading + unit;\n const text = '\\n' + inner + '\\n' + leading;\n const caret = start + 1 + inner.length;\n return { from: start, to: end, text, selectionStart: caret, selectionEnd: caret };\n }\n\n const indent = opens ? leading + unit : leading;\n const text = '\\n' + indent;\n const caret = start + text.length;\n return { from: start, to: end, text, selectionStart: caret, selectionEnd: caret };\n}\n\n/** Tab: insert one indent unit, or indent every line of a multi-line selection. */\nexport function handleTab(value, start, end, unit) {\n if (start !== end && value.slice(start, end).indexOf('\\n') !== -1) {\n const from = value.lastIndexOf('\\n', start - 1) + 1;\n const block = value.slice(from, end);\n const indented = block.replace(/^/gm, unit);\n const added = indented.length - block.length;\n return {\n from,\n to: end,\n text: indented,\n selectionStart: start + unit.length,\n selectionEnd: end + added,\n };\n }\n return {\n from: start,\n to: end,\n text: unit,\n selectionStart: start + unit.length,\n selectionEnd: start + unit.length,\n };\n}\n\n/** Shift-Tab: remove up to one indent unit from the start of each selected line. */\nexport function handleShiftTab(value, start, end, unit) {\n const from = value.lastIndexOf('\\n', start - 1) + 1;\n const size = unit.length || 1;\n const lines = value.slice(from, end).split('\\n');\n let firstRemoved = 0;\n let totalRemoved = 0;\n const dedented = lines\n .map((line, idx) => {\n let remove = 0;\n while (remove < size && line[remove] === ' ') remove++;\n if (remove === 0 && line[0] === '\\t') remove = 1;\n if (idx === 0) firstRemoved = remove;\n totalRemoved += remove;\n return line.slice(remove);\n })\n .join('\\n');\n return {\n from,\n to: end,\n text: dedented,\n selectionStart: Math.max(from, start - firstRemoved),\n selectionEnd: Math.max(from, end - totalRemoved),\n };\n}\n\n/** Typing an opener/quote: wrap a selection, or insert the matching closer. */\nexport function autoClosePair(char, value, start, end) {\n const closer = closerFor(char);\n if (!closer) return null;\n\n if (start !== end) {\n return {\n from: start,\n to: end,\n text: char + value.slice(start, end) + closer,\n selectionStart: start + 1,\n selectionEnd: end + 1,\n };\n }\n\n const nextChar = value[start];\n if (char === closer) {\n // Quote: skip auto-close next to a word char (apostrophes, mid-word typing).\n if (nextChar && WORD.test(nextChar)) return null;\n const prevChar = value[start - 1];\n if (prevChar && WORD.test(prevChar)) return null;\n } else if (nextChar && WORD.test(nextChar)) {\n return null;\n }\n\n return {\n from: start,\n to: end,\n text: char + closer,\n selectionStart: start + 1,\n selectionEnd: start + 1,\n };\n}\n\n/** Typing a closer when the next char is that same closer: step over it. */\nexport function skipOverCloser(char, value, start, end) {\n if (start !== end || !CLOSER_SET.has(char)) return null;\n if (value[start] === char) {\n return { caretOnly: true, selectionStart: start + 1, selectionEnd: start + 1 };\n }\n return null;\n}\n\n/** Backspace between an empty auto-pair (`()`, `\"\"`, \u2026): delete both sides. */\nexport function handleBackspacePair(value, start, end) {\n if (start !== end || start === 0) return null;\n const prev = value[start - 1];\n const next = value[start];\n if (AUTO_CLOSE_PAIRS[prev] && AUTO_CLOSE_PAIRS[prev] === next) {\n return {\n from: start - 1,\n to: start + 1,\n text: '',\n selectionStart: start - 1,\n selectionEnd: start - 1,\n };\n }\n return null;\n}\n", "// Framework-agnostic core for the code editor.\n//\n// The editing model is a native <textarea> rendered transparently over a <pre>\n// highlight layer: the browser owns caret, selection, IME, clipboard, and\n// undo/redo, while a homegrown tokenizer repaints the highlight beneath it. The\n// core builds its own DOM, keeps the two layers scroll- and glyph-aligned,\n// applies a small keymap (indent / tab / auto-close) through the native undo\n// stack, and paints only via DOM nodes \u2014 never `innerHTML`. It imports no `vue`.\n\nimport { tokenize, LANGUAGES } from './tokenizer/index.js';\nimport { renderTokensToDom } from './highlight.js';\nimport {\n indentOnEnter,\n handleTab,\n handleShiftTab,\n autoClosePair,\n skipOverCloser,\n handleBackspacePair,\n} from './editing.js';\nimport { DEFAULT_TAB_SIZE, MAX_HIGHLIGHT_LENGTH } from './constants.js';\n\n/** Current component version (mirrored in component-versions.json). */\nexport const VD_CODE_EDITOR_VERSION = '1.1.0';\n\nconst DEFAULTS = {\n value: '',\n language: 'plaintext',\n readOnly: false,\n lineNumbers: true,\n tabSize: DEFAULT_TAB_SIZE,\n placeholder: '',\n maxLength: undefined,\n wrap: false,\n autoClose: true,\n highlightActiveLine: true,\n maxHighlightLength: MAX_HIGHLIGHT_LENGTH,\n spellcheck: false,\n ariaLabel: 'Code editor',\n copy: true,\n};\n\n// Scheduler that degrades gracefully when rAF is absent (SSR/jsdom). Bound to\n// `window` so browsers never throw \"Illegal invocation\".\nconst RAF =\n typeof window !== 'undefined' && window.requestAnimationFrame\n ? window.requestAnimationFrame.bind(window)\n : (cb) => setTimeout(cb, 16);\nconst CAF =\n typeof window !== 'undefined' && window.cancelAnimationFrame\n ? window.cancelAnimationFrame.bind(window)\n : clearTimeout;\n\nfunction resolveElement(element) {\n if (!element) return null;\n if (typeof element === 'string') {\n return typeof document !== 'undefined' ? document.querySelector(element) : null;\n }\n return element;\n}\n\nfunction countNewlines(str, end) {\n let n = 0;\n const limit = end == null ? str.length : end;\n for (let i = 0; i < limit; i++) {\n if (str.charCodeAt(i) === 10) n++;\n }\n return n;\n}\n\nexport class VdCodeEditor {\n constructor(options = {}) {\n this._opts = Object.assign({}, DEFAULTS, options);\n this._listeners = Object.create(null);\n this._domListeners = [];\n this._raf = 0;\n this._ro = null;\n this._copyTimer = 0;\n this._destroyed = false;\n this._lineHeight = 21;\n this._paddingTop = 0;\n this._gutterCount = -1;\n this._lastValue = this._opts.value == null ? '' : String(this._opts.value);\n\n this.element = resolveElement(options.element);\n if (this.element) this._mount();\n }\n\n // \u2500\u2500 mounting \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n _mount() {\n const el = this.element;\n const doc = el.ownerDocument;\n const opts = this._opts;\n const showGutter = opts.lineNumbers && !opts.wrap;\n const showActiveLine = opts.highlightActiveLine && !opts.wrap;\n\n el.classList.add('vd-code-editor');\n el.classList.toggle('is-wrap', !!opts.wrap);\n el.classList.toggle('is-readonly', !!opts.readOnly);\n el.classList.toggle('has-gutter', showGutter);\n el.style.setProperty('--vd-code-editor-tab-size', String(opts.tabSize));\n\n // Active-line band (bottom layer).\n if (showActiveLine) {\n this._activeLine = doc.createElement('div');\n this._activeLine.className = 'vd-code-editor-active-line';\n this._activeLine.setAttribute('aria-hidden', 'true');\n el.appendChild(this._activeLine);\n }\n\n // Highlight layer.\n this._pre = doc.createElement('pre');\n this._pre.className = 'vd-code-editor-highlight';\n this._pre.setAttribute('aria-hidden', 'true');\n this._code = doc.createElement('code');\n this._code.className = 'vd-code-editor-code';\n this._pre.appendChild(this._code);\n el.appendChild(this._pre);\n\n // Gutter (over the band's left edge; opaque).\n if (showGutter) {\n this._gutter = doc.createElement('div');\n this._gutter.className = 'vd-code-editor-gutter';\n this._gutter.setAttribute('aria-hidden', 'true');\n this._gutterLines = doc.createElement('div');\n this._gutterLines.className = 'vd-code-editor-gutter-lines';\n this._gutter.appendChild(this._gutterLines);\n el.appendChild(this._gutter);\n }\n\n // Editable surface (top layer).\n const ta = doc.createElement('textarea');\n ta.className = 'vd-code-editor-input';\n ta.value = this._lastValue;\n ta.spellcheck = !!opts.spellcheck;\n ta.wrap = opts.wrap ? 'soft' : 'off';\n ta.setAttribute('autocomplete', 'off');\n ta.setAttribute('autocapitalize', 'off');\n ta.setAttribute('autocorrect', 'off');\n ta.setAttribute('aria-label', opts.ariaLabel || 'Code editor');\n ta.setAttribute('aria-multiline', 'true');\n if (opts.readOnly) ta.readOnly = true;\n if (opts.placeholder) ta.placeholder = opts.placeholder;\n if (opts.maxLength != null) ta.maxLength = opts.maxLength;\n ta.style.tabSize = String(opts.tabSize);\n this._pre.style.tabSize = String(opts.tabSize);\n this._textarea = ta;\n el.appendChild(ta);\n\n // Copy control (only when enabled and the clipboard API exists).\n if (opts.copy && typeof navigator !== 'undefined' && navigator.clipboard) {\n const btn = doc.createElement('button');\n btn.type = 'button';\n btn.className = 'vd-code-editor-copy';\n btn.setAttribute('aria-label', 'Copy code');\n btn.textContent = 'Copy';\n this._copyBtn = btn;\n el.appendChild(btn);\n }\n\n this._attach();\n this._measure();\n this._repaint();\n this._syncScroll();\n }\n\n _attach() {\n const ta = this._textarea;\n this._listen(ta, 'input', () => this._handleInput());\n this._listen(ta, 'scroll', () => this._syncScroll());\n this._listen(ta, 'keydown', (e) => this._handleKeydown(e));\n this._listen(ta, 'focus', (e) => this._handleFocus(e));\n this._listen(ta, 'blur', (e) => this._handleBlur(e));\n this._listen(ta, 'click', () => this._updateActiveLine());\n this._listen(ta, 'keyup', () => this._updateActiveLine());\n this._listen(ta, 'select', () => this._updateActiveLine());\n if (this._copyBtn) this._listen(this._copyBtn, 'click', () => this._handleCopy());\n\n if (typeof ResizeObserver === 'function') {\n this._ro = new ResizeObserver(() => {\n this._measure();\n this._syncScroll();\n });\n this._ro.observe(this.element);\n }\n\n // Re-measure once web fonts settle (FOUT would shift line metrics).\n const fonts = this.element.ownerDocument.fonts;\n if (fonts && fonts.ready && typeof fonts.ready.then === 'function') {\n fonts.ready.then(() => {\n if (this._destroyed) return;\n this._measure();\n this._syncScroll();\n });\n }\n }\n\n _listen(target, type, handler) {\n target.addEventListener(type, handler);\n this._domListeners.push([target, type, handler]);\n }\n\n // \u2500\u2500 rendering \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n _measure() {\n if (typeof getComputedStyle !== 'function') return;\n const cs = getComputedStyle(this._textarea);\n const lh = parseFloat(cs.lineHeight);\n if (Number.isFinite(lh) && lh > 0) this._lineHeight = lh;\n const pt = parseFloat(cs.paddingTop);\n this._paddingTop = Number.isFinite(pt) ? pt : 0;\n }\n\n _scheduleRepaint() {\n if (this._raf || this._destroyed) return;\n this._raf = RAF(() => {\n this._raf = 0;\n if (!this._destroyed) this._repaint();\n });\n }\n\n _repaint() {\n const value = this._textarea.value;\n const doc = this.element.ownerDocument;\n const trailing = value.endsWith('\\n') || value === '';\n\n if (value.length > this._opts.maxHighlightLength) {\n this._code.classList.add('is-plain');\n this._code.replaceChildren(doc.createTextNode(trailing ? value + '\\n' : value));\n } else {\n this._code.classList.remove('is-plain');\n const frag = renderTokensToDom(tokenize(value, this._opts.language), doc);\n if (trailing) frag.appendChild(doc.createTextNode('\\n'));\n this._code.replaceChildren(frag);\n }\n this._updateGutter(value);\n }\n\n _updateGutter(value) {\n if (!this._gutterLines) return;\n const lines = countNewlines(value) + 1;\n if (lines === this._gutterCount) return;\n this._gutterCount = lines;\n this.element.style.setProperty(\n '--vd-code-editor-gutter-digits',\n String(Math.max(2, String(lines).length)),\n );\n let text = '1';\n for (let i = 2; i <= lines; i++) text += '\\n' + i;\n this._gutterLines.textContent = text;\n }\n\n _syncScroll() {\n const ta = this._textarea;\n if (!ta) return;\n const st = ta.scrollTop;\n if (this._pre) {\n this._pre.scrollTop = st;\n this._pre.scrollLeft = ta.scrollLeft;\n }\n if (this._gutterLines) {\n this._gutterLines.style.transform = 'translateY(' + -st + 'px)';\n }\n this._updateActiveLine();\n }\n\n _updateActiveLine() {\n if (!this._activeLine) return;\n const ta = this._textarea;\n const line = countNewlines(ta.value, ta.selectionStart || 0);\n const top = this._paddingTop + line * this._lineHeight - ta.scrollTop;\n this._activeLine.style.height = this._lineHeight + 'px';\n this._activeLine.style.transform = 'translateY(' + top + 'px)';\n }\n\n // \u2500\u2500 input + keymap \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n _handleInput() {\n this._scheduleRepaint();\n this._syncScroll();\n this._emitChangeIfChanged();\n }\n\n _emitChangeIfChanged() {\n const v = this._textarea.value;\n if (v === this._lastValue) return;\n this._lastValue = v;\n this._emit('change', { value: v });\n }\n\n _handleFocus(e) {\n this.element.classList.add('is-focused');\n this._emit('focus', e);\n }\n\n _handleBlur(e) {\n this.element.classList.remove('is-focused');\n this._emit('blur', e);\n }\n\n _handleKeydown(e) {\n if (this._opts.readOnly || e.isComposing) return;\n if (e.ctrlKey || e.metaKey || e.altKey) return;\n\n const ta = this._textarea;\n const value = ta.value;\n const s = ta.selectionStart;\n const en = ta.selectionEnd;\n const unit = ' '.repeat(this._opts.tabSize);\n\n if (e.key === 'Enter') {\n e.preventDefault();\n this._applyEdit(indentOnEnter(value, s, en, unit));\n return;\n }\n if (e.key === 'Tab') {\n e.preventDefault();\n this._applyEdit(\n e.shiftKey ? handleShiftTab(value, s, en, unit) : handleTab(value, s, en, unit),\n );\n return;\n }\n if (e.key === 'Backspace') {\n const edit = handleBackspacePair(value, s, en);\n if (edit) {\n e.preventDefault();\n this._applyEdit(edit);\n }\n return;\n }\n if (e.key.length === 1 && this._opts.autoClose) {\n const skip = skipOverCloser(e.key, value, s, en);\n if (skip) {\n e.preventDefault();\n ta.setSelectionRange(skip.selectionStart, skip.selectionEnd);\n this._updateActiveLine();\n return;\n }\n const auto = autoClosePair(e.key, value, s, en);\n if (auto) {\n e.preventDefault();\n this._applyEdit(auto);\n }\n }\n }\n\n // Apply an edit, preferring execCommand so the native undo stack is preserved;\n // fall back to setRangeText, then to a direct value splice (jsdom/old engines).\n _applyEdit(edit) {\n const ta = this._textarea;\n ta.setSelectionRange(edit.from, edit.to);\n let nativeInput = false;\n if (this._tryExecInsert(edit.text)) {\n nativeInput = true;\n } else if (typeof ta.setRangeText === 'function') {\n ta.setRangeText(edit.text, edit.from, edit.to, 'end');\n } else {\n ta.value = ta.value.slice(0, edit.from) + edit.text + ta.value.slice(edit.to);\n }\n if (edit.selectionStart != null) {\n const end = edit.selectionEnd == null ? edit.selectionStart : edit.selectionEnd;\n ta.setSelectionRange(edit.selectionStart, end);\n }\n if (nativeInput) {\n // execCommand already dispatched 'input' (repaint + emit); just fix caret.\n this._updateActiveLine();\n } else {\n this._handleInput();\n }\n }\n\n _tryExecInsert(text) {\n try {\n return (\n typeof document !== 'undefined' &&\n typeof document.execCommand === 'function' &&\n document.execCommand('insertText', false, text)\n );\n } catch {\n return false;\n }\n }\n\n _handleCopy() {\n if (this._destroyed || typeof navigator === 'undefined' || !navigator.clipboard) return;\n navigator.clipboard.writeText(this._textarea.value).then(\n () => this._flashCopied(),\n () => {},\n );\n }\n\n _flashCopied() {\n if (!this._copyBtn) return;\n this._copyBtn.classList.add('is-copied');\n this._copyBtn.textContent = 'Copied';\n if (this._copyTimer) clearTimeout(this._copyTimer);\n this._copyTimer = setTimeout(() => {\n this._copyTimer = 0;\n if (this._destroyed || !this._copyBtn) return;\n this._copyBtn.classList.remove('is-copied');\n this._copyBtn.textContent = 'Copy';\n }, 1200);\n }\n\n // \u2500\u2500 public API \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n getValue() {\n return this._textarea ? this._textarea.value : this._lastValue;\n }\n\n setValue(next, options) {\n const silent = !!(options && options.silent);\n const v = next == null ? '' : String(next);\n if (!this._textarea) {\n this._lastValue = v;\n return this;\n }\n if (v === this._textarea.value) return this;\n this._textarea.value = v;\n if (silent) this._lastValue = v;\n this._repaint();\n this._syncScroll();\n if (!silent) this._emitChangeIfChanged();\n return this;\n }\n\n getSelection() {\n const ta = this._textarea;\n if (!ta) return { start: 0, end: 0, text: '' };\n return {\n start: ta.selectionStart,\n end: ta.selectionEnd,\n text: ta.value.slice(ta.selectionStart, ta.selectionEnd),\n };\n }\n\n setSelection(start, end) {\n if (!this._textarea) return this;\n const e = end == null ? start : end;\n this._textarea.setSelectionRange(start, e);\n this._updateActiveLine();\n return this;\n }\n\n insertText(text) {\n if (!this._textarea) return this;\n const ta = this._textarea;\n const str = String(text);\n this._applyEdit({\n from: ta.selectionStart,\n to: ta.selectionEnd,\n text: str,\n selectionStart: ta.selectionStart + str.length,\n });\n return this;\n }\n\n setLanguage(language) {\n this._opts.language = language || 'plaintext';\n if (this._textarea) this._repaint();\n return this;\n }\n\n setReadOnly(readOnly) {\n this._opts.readOnly = !!readOnly;\n if (this._textarea) this._textarea.readOnly = !!readOnly;\n if (this.element) this.element.classList.toggle('is-readonly', !!readOnly);\n return this;\n }\n\n setTabSize(tabSize) {\n const n = Number(tabSize) || DEFAULT_TAB_SIZE;\n this._opts.tabSize = n;\n if (this._textarea) this._textarea.style.tabSize = String(n);\n if (this._pre) this._pre.style.tabSize = String(n);\n if (this.element) this.element.style.setProperty('--vd-code-editor-tab-size', String(n));\n return this;\n }\n\n setPlaceholder(text) {\n this._opts.placeholder = text || '';\n if (this._textarea) this._textarea.placeholder = text || '';\n return this;\n }\n\n setAutoClose(autoClose) {\n this._opts.autoClose = !!autoClose;\n return this;\n }\n\n focus() {\n if (this._textarea) this._textarea.focus();\n return this;\n }\n\n blur() {\n if (this._textarea) this._textarea.blur();\n return this;\n }\n\n on(name, handler) {\n if (!this._listeners[name]) this._listeners[name] = [];\n this._listeners[name].push(handler);\n return this;\n }\n\n off(name, handler) {\n const list = this._listeners[name];\n if (!list) return this;\n const i = list.indexOf(handler);\n if (i !== -1) list.splice(i, 1);\n return this;\n }\n\n _emit(name, payload) {\n const list = this._listeners[name];\n if (!list) return;\n for (let i = 0; i < list.length; i++) list[i](payload);\n }\n\n destroy() {\n if (this._destroyed) return;\n this._destroyed = true;\n if (this._raf) CAF(this._raf);\n if (this._copyTimer) clearTimeout(this._copyTimer);\n if (this._ro) {\n this._ro.disconnect();\n this._ro = null;\n }\n for (let i = 0; i < this._domListeners.length; i++) {\n const [target, type, handler] = this._domListeners[i];\n target.removeEventListener(type, handler);\n }\n this._domListeners = [];\n if (this.element) {\n const nodes = [this._activeLine, this._pre, this._gutter, this._textarea, this._copyBtn];\n for (let i = 0; i < nodes.length; i++) {\n const n = nodes[i];\n if (n && n.parentNode === this.element) this.element.removeChild(n);\n }\n this.element.classList.remove(\n 'vd-code-editor',\n 'is-wrap',\n 'is-readonly',\n 'has-gutter',\n 'is-focused',\n );\n }\n this._listeners = Object.create(null);\n this._textarea = null;\n this._pre = null;\n this._code = null;\n this._gutter = null;\n this._gutterLines = null;\n this._activeLine = null;\n this._copyBtn = null;\n }\n}\n\nexport { tokenize, LANGUAGES };\nexport { highlight, renderTokensToHtml } from './highlight.js';\n"],
|
|
5
|
+
"mappings": "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AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;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",
|
|
6
|
+
"names": ["RULES", "RULES", "BUILTINS", "RULES", "KEYWORDS", "BUILTINS", "RULES", "text", "caret", "VdCodeEditor"]
|
|
7
7
|
}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/index.js"],
|
|
4
|
-
"sourcesContent": ["// Root entry of @vanduo-oss/vd3-cbun.\n//\n// Exposes ONLY the per-component VERSION-constants map. Component APIs live on\n// the subpath exports (./charts, ./code-editor, ./
|
|
5
|
-
"mappings": ";
|
|
4
|
+
"sourcesContent": ["// Root entry of @vanduo-oss/vd3-cbun.\n//\n// Exposes ONLY the per-component VERSION-constants map. Component APIs live on\n// the subpath exports (./charts, ./code-editor, ./code-editor/highlight, ./draw,\n// ./flowchart, ./hex-grid, ./music-player) so importing one component never\n// pulls in another\n// (tree-shaking contract).\n//\n// The values below are hardcoded mirrors of component-versions.json (the\n// manifest is the source of truth). The version-consistency check \u2014\n// tests/smoke.spec.ts \u2014 asserts the two stay in sync; bump both together.\n// Note: `flowchart` continues the old-line 1.2.0 lineage because\n// VD_FLOWCHART_VERSION is serialized into user documents via toJSON().version.\n\nexport const VD3_CBUN_VERSIONS = Object.freeze({\n charts: '1.1.0',\n 'code-editor': '1.1.0',\n draw: '1.1.0',\n flowchart: '1.2.0',\n 'hex-grid': '1.0.1',\n 'music-player': '1.0.1',\n});\n"],
|
|
5
|
+
"mappings": ";AAcO,IAAM,oBAAoB,OAAO,OAAO;AAAA,EAC7C,QAAQ;AAAA,EACR,eAAe;AAAA,EACf,MAAM;AAAA,EACN,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,gBAAgB;AAClB,CAAC;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|