@linloir/limr 0.1.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +123 -0
- package/README.md +63 -138
- package/dist/base.css +10 -7
- package/dist/{chunk-65V5OZ4G.js → chunk-3ILUZKDB.js} +77 -17
- package/dist/chunk-3ILUZKDB.js.map +1 -0
- package/dist/{chunk-ETHLPBKQ.js → chunk-N77VD2YR.js} +96 -51
- package/dist/chunk-N77VD2YR.js.map +1 -0
- package/dist/{chunk-7JF5HHVF.js → chunk-TTISGBST.js} +14 -1
- package/dist/{chunk-7JF5HHVF.js.map → chunk-TTISGBST.js.map} +1 -1
- package/dist/core/index.d.ts +6 -3
- package/dist/core/index.js +3 -1
- package/dist/extensions/index.d.ts +2 -2
- package/dist/extensions/index.js +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +7 -3
- package/dist/react/index.d.ts +4 -3
- package/dist/react/index.js +5 -3
- package/dist/styles.css +10 -7
- package/dist/{translations-BliabrPd.d.ts → translations-DHnYMg4h.d.ts} +11 -3
- package/docs/README.md +13 -0
- package/docs/api.md +5 -158
- package/docs/assets/rendered.svg +9 -0
- package/docs/assets/source.svg +9 -0
- package/docs/en/README.md +26 -0
- package/docs/en/ai-skills.md +57 -0
- package/docs/en/annotations.md +84 -0
- package/docs/en/api.md +107 -0
- package/docs/en/architecture.md +33 -0
- package/docs/en/extensions.md +159 -0
- package/docs/en/getting-started.md +67 -0
- package/docs/en/integration.md +130 -0
- package/docs/en/modules.md +80 -0
- package/docs/en/performance.md +53 -0
- package/docs/en/plugin-packages.md +68 -0
- package/docs/en/styles.md +80 -0
- package/docs/en/syntax.md +352 -0
- package/docs/extensions.md +5 -306
- package/docs/implementation.md +5 -76
- package/docs/performance.md +5 -81
- package/docs/screenshots/blocks.png +0 -0
- package/docs/screenshots/dark.png +0 -0
- package/docs/screenshots/desktop.png +0 -0
- package/docs/screenshots/plugin-mobile.png +0 -0
- package/docs/styles.md +5 -100
- package/docs/visual-upgrade.md +5 -145
- package/docs/zh-CN/README.md +26 -0
- package/docs/zh-CN/ai-skills.md +57 -0
- package/docs/zh-CN/annotations.md +84 -0
- package/docs/zh-CN/api.md +107 -0
- package/docs/zh-CN/architecture.md +33 -0
- package/docs/zh-CN/extensions.md +159 -0
- package/docs/zh-CN/getting-started.md +67 -0
- package/docs/zh-CN/integration.md +130 -0
- package/docs/zh-CN/modules.md +80 -0
- package/docs/zh-CN/performance.md +53 -0
- package/docs/zh-CN/plugin-packages.md +68 -0
- package/docs/zh-CN/styles.md +80 -0
- package/docs/zh-CN/syntax.md +352 -0
- package/examples/notes.tsx +18 -11
- package/examples/packages/paper-theme/index.css +25 -0
- package/examples/packages/paper-theme/package.json +7 -0
- package/examples/packages/reading-tools/index.d.ts +2 -0
- package/examples/packages/reading-tools/index.js +25 -0
- package/examples/packages/reading-tools/package.json +16 -0
- package/package.json +9 -5
- package/skills/limr-plugin-development/SKILL.md +22 -0
- package/skills/limr-plugin-development/agents/openai.yaml +4 -0
- package/skills/limr-plugin-development/assets/plugin-template/README.md +30 -0
- package/skills/limr-plugin-development/assets/plugin-template/package.json +36 -0
- package/skills/limr-plugin-development/assets/plugin-template/src/index.tsx +50 -0
- package/skills/limr-plugin-development/assets/plugin-template/src/styles.css +9 -0
- package/skills/limr-plugin-development/assets/plugin-template/tsconfig.json +20 -0
- package/skills/limr-plugin-development/assets/plugin-template/tsup.config.ts +8 -0
- package/skills/limr-plugin-development/references/contract.md +45 -0
- package/skills/limr-use/SKILL.md +23 -0
- package/skills/limr-use/agents/openai.yaml +4 -0
- package/skills/limr-use/references/integration.md +41 -0
- package/skills/limr-use/references/syntax.md +17 -0
- package/dist/chunk-65V5OZ4G.js.map +0 -1
- package/dist/chunk-ETHLPBKQ.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/parser.ts","../src/core/tree.ts","../src/core/engine.ts","../src/core/selection.ts","../src/core/annotations.ts"],"sourcesContent":["import { fromMarkdown } from 'mdast-util-from-markdown';\nimport { mdxJsx } from 'micromark-extension-mdx-jsx';\nimport { mdxJsxFromMarkdown } from 'mdast-util-mdx-jsx';\nimport { directive } from 'micromark-extension-directive';\nimport { directiveFromMarkdown } from 'mdast-util-directive';\nimport { lineStarts, sourcePoint, walk } from './tree';\nimport type { Diagnostic, MarkdownNode, ParseContext, SourcePosition, SyntaxExtension } from './types';\n\nexport function validateExtensions(extensions: readonly SyntaxExtension[]): void {\n const names = new Set<string>();\n const tags = new Set<string>();\n const directives = new Set<string>();\n for (const extension of extensions) {\n if (names.has(extension.name)) throw new Error(`Duplicate LiMR extension: ${extension.name}. Use replaceExtension() to replace it explicitly.`);\n names.add(extension.name);\n for (const [items, known, kind] of [[extension.tags, tags, 'tag'], [extension.directives, directives, 'directive']] as const) {\n for (const name of items ?? []) {\n if (known.has(name)) throw new Error(`Duplicate LiMR ${kind}: ${name}`);\n known.add(name);\n }\n }\n }\n}\n\nexport function createParser(extensions: readonly SyntaxExtension[]) {\n validateExtensions(extensions);\n const tagDefinitions = new Map(extensions.flatMap(ext => (ext.tags ?? []).map(name => [name, ext] as const)));\n const directiveDefinitions = new Map(extensions.flatMap(ext => (ext.directives ?? []).map(name => [name, ext] as const)));\n const syntax = extensions.flatMap(ext => [...ext.micromark ?? []]);\n const mdast = extensions.flatMap(ext => [...ext.mdast ?? []]);\n if (directiveDefinitions.size) { syntax.push(directive()); mdast.push(directiveFromMarkdown()); }\n // CommonMark's HTML blocks otherwise swallow same-line native tag names such\n // as <figcaption>**caption**</figcaption> before the JSX adapter can see them.\n // Unknown JSX remains inert through the whitelist below; recovery keeps HTML.\n const jsxSyntax = tagDefinitions.size ? [...syntax, { disable: { null: ['htmlFlow', 'htmlText'] } }, mdxJsx()] : syntax;\n const jsxMdast = tagDefinitions.size ? [...mdast, mdxJsxFromMarkdown()] : mdast;\n\n return (fragment: string, offset: number, context: ParseContext, lines: readonly number[], environment = '') => {\n // Definitions are a parsing environment, never part of the stored source.\n // A known prefix offset is removed from EVERY node position below.\n // A neutral paragraph closes footnote containers. Without it, an indented\n // suffix can be consumed as part of a synthetic footnote definition.\n const prefix = environment ? `${environment}\\n\\nlimr-definition-boundary\\n\\n` : '';\n const input = prefix + fragment;\n const diagnostics: Diagnostic[] = [];\n let attributeLines: readonly number[] | undefined;\n const attributePoint = (at: number) => sourcePoint(at, lines.length ? lines : attributeLines ??= lineStarts(context.source));\n let recoveryOffset: number | undefined;\n let root: MarkdownNode;\n try {\n root = fromMarkdown(input, { extensions: jsxSyntax, mdastExtensions: jsxMdast }) as unknown as MarkdownNode;\n } catch (error) {\n // Incomplete JSX is common during streaming. Preserve readable Markdown,\n // treat HTML as inert source and retry the final block on the next append.\n root = fromMarkdown(input, { extensions: syntax, mdastExtensions: mdast }) as unknown as MarkdownNode;\n recoveryOffset = offset;\n diagnostics.push({ message: error instanceof Error ? error.message : String(error), offset });\n }\n root.children = root.children?.filter(node => (node.position?.start.offset ?? 0) >= prefix.length);\n if (offset || prefix.length || tagDefinitions.size || directiveDefinitions.size) walk(root, node => {\n if (node.position && (offset || prefix.length)) {\n const start = Math.max(0, node.position.start.offset - prefix.length + offset);\n const end = Math.max(start, node.position.end.offset - prefix.length + offset);\n node.position = { start: sourcePoint(start, lines), end: sourcePoint(end, lines) };\n }\n if (node.type === 'mdxJsxFlowElement' || node.type === 'mdxJsxTextElement') {\n const definition = tagDefinitions.get(node.name ?? '');\n const rawAttributes = node.attributes as unknown as { type: string; name: string; value: unknown; position?: SourcePosition }[];\n const attributes: Record<string, string | boolean | number> = {};\n const attributeNodes: Record<string, MarkdownNode> = {};\n for (const attr of rawAttributes ?? []) {\n if (attr.type === 'mdxJsxAttribute' && (typeof attr.value === 'string' || attr.value === null)) {\n attributes[attr.name] = attr.value ?? true;\n if (definition && typeof attr.value === 'string' && attr.position) {\n const start = attr.position.start.offset - prefix.length + offset;\n const end = attr.position.end.offset - prefix.length + offset;\n const raw = context.source.slice(start, end), opening = raw.search(/[\"']/);\n if (opening >= 0) attributeNodes[attr.name] = { type: 'text', value: attr.value, verbatimEscapes: true, position: { start: attributePoint(start + opening + 1), end: attributePoint(end - 1) } };\n }\n }\n else diagnostics.push({ message: 'JSX expressions are not executed. Use string attributes or pass data from React.', offset: node.position?.start.offset });\n }\n node.inline = definition?.display === 'block' ? false : definition?.display === 'inline' ? true : node.type === 'mdxJsxTextElement';\n node.type = definition ? 'component' : 'html';\n node.attributes = attributes;\n if (Object.keys(attributeNodes).length) node.attributeNodes = attributeNodes;\n node.selection = definition?.selection ?? 'content';\n if (!definition && node.position) {\n node.value = context.source.slice(node.position.start.offset, node.position.end.offset);\n node.children = undefined;\n }\n } else if (node.type === 'containerDirective' || node.type === 'leafDirective' || node.type === 'textDirective') {\n const definition = directiveDefinitions.get(node.name ?? '');\n if (definition) {\n // Directive attributes have no mdast positions. Scan only their header,\n // respecting quoted values instead of searching the rendered title.\n const start = node.position?.start.offset ?? 0;\n const end = context.source.indexOf('\\n', start);\n const header = context.source.slice(start, end < 0 ? context.source.length : end);\n const brace = header.indexOf('{');\n if (brace >= 0) {\n const attributeNodes: Record<string, MarkdownNode> = {};\n const expression = /([^\\s{}=]+)\\s*=\\s*(?:\"((?:\\\\.|[^\"\\\\])*)\"|'((?:\\\\.|[^'\\\\])*)'|([^\\s}]+))/g;\n const raw = header.slice(brace + 1);\n for (const match of raw.matchAll(expression)) {\n const name = match[1], value = node.attributes?.[name];\n if (typeof value !== 'string') continue;\n const quoted = match[2] !== undefined || match[3] !== undefined;\n const valueLength = (match[2] ?? match[3] ?? match[4]).length;\n const valueEnd = start + brace + 1 + match.index! + match[0].length - (quoted ? 1 : 0);\n attributeNodes[name] = { type: 'text', value, position: { start: attributePoint(valueEnd - valueLength), end: attributePoint(valueEnd) } };\n }\n if (Object.keys(attributeNodes).length) node.attributeNodes = attributeNodes;\n }\n node.inline = node.type === 'textDirective';\n node.type = 'component';\n node.selection = definition.selection ?? 'content';\n }\n }\n });\n if (offset || prefix.length) root.position = { start: sourcePoint(offset, lines), end: sourcePoint(offset + fragment.length, lines) };\n for (const extension of extensions) {\n try { extension.transform?.(root, context); }\n catch (error) { diagnostics.push({ message: error instanceof Error ? error.message : String(error), extension: extension.name }); }\n }\n return { nodes: root.children ?? [], diagnostics, recoveryOffset };\n };\n}\n","import type { MarkdownNode, SourcePoint, SourceRange } from './types';\n\nexport function walk(node: MarkdownNode, visit: (node: MarkdownNode, parent?: MarkdownNode) => void, parent?: MarkdownNode): void {\n visit(node, parent);\n for (const child of node.children ?? []) walk(child, visit, node);\n}\nexport function textContent(node: MarkdownNode): string {\n if (node.type === 'image') return String(node.alt ?? '');\n return node.value ?? node.children?.map(textContent).join('') ?? '';\n}\nexport function rangeOf(node: MarkdownNode): SourceRange {\n return { start: node.position?.start.offset ?? 0, end: node.position?.end.offset ?? 0 };\n}\nexport function intersects(a: SourceRange, b: SourceRange): boolean { return a.start < b.end && b.start < a.end; }\nexport function lineStarts(source: string): number[] {\n const result = [0];\n for (let i = 0; i < source.length; i++) {\n if (source[i] === '\\r') { if (source[i + 1] === '\\n') i++; result.push(i + 1); }\n else if (source[i] === '\\n') result.push(i + 1);\n }\n return result;\n}\nexport function sourcePoint(offset: number, lines: readonly number[]): SourcePoint {\n let lo = 0, hi = lines.length;\n while (lo + 1 < hi) { const mid = (lo + hi) >>> 1; if (lines[mid] <= offset) lo = mid; else hi = mid; }\n return { offset, line: lo + 1, column: offset - lines[lo] + 1 };\n}\nexport function slugify(text: string): string {\n return text.toLowerCase().trim().replace(/[^\\p{L}\\p{N}\\s_-]/gu, '').replace(/[\\s_]+/g, '-').replace(/^-+|-+$/g, '') || 'section';\n}\nexport function safeUrl(value: unknown, image = false): string | undefined {\n if (typeof value !== 'string') return undefined;\n const normalized = value.trim().replace(/[\\u0000-\\u0020\\u007f]/g, '');\n if (/^(?:https?:|mailto:|tel:)/i.test(normalized) || !/^[a-z][a-z\\d+.-]*:/i.test(normalized)) return value;\n if (image && /^data:image\\/(?:png|gif|jpe?g|webp|avif);base64,/i.test(normalized)) return value;\n return undefined;\n}\n","import { createParser } from './parser';\nimport { lineStarts, rangeOf, slugify, textContent, walk } from './tree';\nimport type { Annotation, AnnotationOccurrence, Block, DocumentMetrics, DocumentOptions, DocumentSnapshot, Heading, MarkdownNode, SyntaxExtension } from './types';\n\nlet sequence = 0;\n\n/** A synchronous, DOM-free document session. React/scroll state never enters it. */\nexport class DocumentEngine {\n readonly id: string;\n private extensions: readonly SyntaxExtension[];\n private parse: ReturnType<typeof createParser>;\n private snapshot?: DocumentSnapshot;\n private nextBlock = 0;\n private listeners = new Set<() => void>();\n private definitionSignature = '';\n private recoveryOffset: number | undefined;\n\n constructor(source = '', options: DocumentOptions = {}) {\n this.id = options.id ?? `limr-${++sequence}`;\n this.extensions = options.extensions ?? [];\n this.parse = createParser(this.extensions);\n this.update(source, { streaming: options.streaming });\n }\n\n getSnapshot = (): DocumentSnapshot => this.snapshot!;\n subscribe = (listener: () => void): (() => void) => { this.listeners.add(listener); return () => this.listeners.delete(listener); };\n\n setExtensions(extensions: readonly SyntaxExtension[]): void {\n if (extensions === this.extensions) return;\n this.parse = createParser(extensions);\n this.extensions = extensions;\n const previous = this.snapshot!;\n this.update(previous.source, { streaming: previous.streaming }, true);\n }\n\n append(chunk: string): DocumentSnapshot { return this.update(this.snapshot!.source + chunk, { streaming: true }); }\n finish(): DocumentSnapshot { return this.update(this.snapshot!.source, { streaming: false }); }\n\n update(source: string, options: { streaming?: boolean } = {}, force = false): DocumentSnapshot {\n const previous = this.snapshot;\n const streaming = options.streaming ?? false;\n if (!force && previous?.source === source && previous.streaming === streaming) return previous;\n const globalTransform = this.extensions.some(ext => ext.transform && ext.scope !== 'local');\n const append = !force && previous?.streaming && source.startsWith(previous.source) && !globalTransform;\n const finalizing = !!previous?.streaming && !streaming;\n let start = append && streaming && previous.blocks.length ? previous.blocks[previous.blocks.length - 1].range.start : 0;\n const recovering = this.recoveryOffset !== undefined;\n if (append && recovering) start = Math.min(start, this.recoveryOffset!);\n let reason: DocumentMetrics['reason'] = force || globalTransform ? 'extension' : !previous ? 'initial' : finalizing ? 'finalize' : append ? 'append' : 'replace';\n const lines = start ? lineStarts(source) : [];\n const context = { source, streaming, documentId: this.id };\n let retained = start ? previous!.blocks.filter(block => block.range.end <= start) : [];\n const environment: string[] = [];\n for (const block of retained) walk(block.node, node => {\n if (node.type === 'definition' || node.type === 'footnoteDefinition') { const range = rangeOf(node); environment.push(source.slice(range.start, range.end)); }\n });\n let parsed = this.parse(source.slice(start), start, context, lines, environment.join('\\n\\n'));\n const getSignature = (nodes: readonly MarkdownNode[]) => {\n const entries: string[] = [];\n for (const node of nodes) walk(node, child => {\n if (child.type === 'definition' || child.type === 'footnoteDefinition') { const range = rangeOf(child); entries.push(source.slice(range.start, range.end)); }\n });\n return entries.join('\\u0000');\n };\n let signature = getSignature([...retained.map(block => block.node), ...parsed.nodes]);\n let parsedCharacters = source.length - start + environment.join('\\n\\n').length;\n const definitionsChanged = !!previous && signature !== this.definitionSignature;\n if (start && definitionsChanged) {\n reason = 'definitions';\n start = 0;\n retained = [];\n parsed = this.parse(source, 0, context, lines);\n signature = getSignature(parsed.nodes);\n parsedCharacters += source.length;\n }\n this.definitionSignature = signature;\n this.recoveryOffset = parsed.recoveryOffset;\n const oldAt = new Map(previous?.blocks.map(block => [block.range.start, block]));\n let reused = retained.length;\n const blocks: Block[] = [...retained];\n for (let index = 0; index < parsed.nodes.length; index++) {\n const node = parsed.nodes[index];\n const range = rangeOf(node);\n const old = oldAt.get(range.start);\n const pending = streaming && index === parsed.nodes.length - 1;\n // Definition changes can change semantic nodes without changing their raw text.\n const reusable = !definitionsChanged && !recovering && reason === 'append' && old && old.node.type === node.type && old.pending === pending && previous!.source.slice(old.range.start, old.range.end) === source.slice(range.start, range.end);\n if (reusable) { blocks.push(old); reused++; }\n else blocks.push({ id: old?.id ?? `${this.id}-b${++this.nextBlock}`, node, range, pending });\n }\n const headings: Heading[] = [];\n const definitions = new Map<string, MarkdownNode>();\n const footnotes = new Map<string, MarkdownNode>();\n const footnoteOrder: string[] = [];\n const annotations = new Map<string, Annotation>();\n const occurrences: AnnotationOccurrence[] = [];\n const slugCounts = new Map<string, number>();\n for (const block of blocks) walk(block.node, node => {\n if (node.type === 'heading') {\n const text = textContent(node);\n const base = slugify(text);\n const count = slugCounts.get(base) ?? 0;\n slugCounts.set(base, count + 1);\n headings.push({ id: `${this.id}-${base}${count ? `-${count}` : ''}`, text, level: Number(node.depth), range: rangeOf(node), blockId: block.id });\n }\n if (node.type === 'definition' && !definitions.has(String(node.identifier))) definitions.set(String(node.identifier), node);\n if (node.type === 'footnoteDefinition' && !footnotes.has(String(node.identifier))) footnotes.set(String(node.identifier), node);\n if (node.type === 'footnoteReference' && !footnoteOrder.includes(String(node.identifier))) footnoteOrder.push(String(node.identifier));\n if (node.type === 'annotationDefinition') {\n const annotation = node.annotation as Annotation;\n annotations.set(annotation.id, annotation);\n }\n if (node.type === 'annotationReference') {\n const range = rangeOf(node);\n occurrences.push({ id: `${this.id}-ref-${range.start}`, range, annotationIds: node.annotationIds as string[], embedded: true });\n }\n });\n this.snapshot = {\n id: this.id, revision: (previous?.revision ?? -1) + 1, source, streaming,\n blocks,\n headings: previous && headings.length === previous.headings.length && headings.every((heading, index) => {\n const old = previous.headings[index];\n return heading.id === old.id && heading.text === old.text && heading.level === old.level && heading.blockId === old.blockId && heading.range.start === old.range.start && heading.range.end === old.range.end;\n }) ? previous.headings : headings,\n definitions, footnotes, footnoteOrder, annotations: [...annotations.values()], occurrences,\n diagnostics: parsed.diagnostics,\n metrics: { parsedCharacters, reusedBlocks: reused, parsedBlocks: parsed.nodes.length, fullParse: start === 0, reason },\n };\n for (const listener of this.listeners) listener();\n return this.snapshot;\n }\n}\n\nexport function createDocument(source = '', options: DocumentOptions = {}): DocumentEngine { return new DocumentEngine(source, options); }\n\nexport function replaceExtension<T extends SyntaxExtension>(extensions: readonly T[], replacement: T): T[] {\n const exists = extensions.some(extension => extension.name === replacement.name);\n return exists ? extensions.map(extension => extension.name === replacement.name ? replacement : extension) : [...extensions, replacement];\n}\n","import { decodeString } from 'micromark-util-decode-string';\nimport { intersects, rangeOf } from './tree';\nimport type { DocumentSnapshot, MarkdownNode, SelectionResult, SelectionSnapshot, SourceRange } from './types';\n\nexport interface TextMapping { starts: readonly number[]; ends: readonly number[]; exact: boolean }\n\n/** Align decoded text to original source, retaining escape/entity/CRLF boundaries. */\nexport function mapText(source: string, value: string, range: SourceRange, options: { escapes?: boolean } = {}): TextMapping {\n const raw = source.slice(range.start, range.end);\n const starts: number[] = [], ends: number[] = [];\n let rendered = 0, exact = true;\n for (let at = 0; at < raw.length && rendered < value.length;) {\n let length = 1, decoded = raw[at];\n if (options.escapes !== false && raw[at] === '\\\\' && /[!\"#$%&'()*+,\\-./:;<=>?@[\\\\\\]^_`{|}~]/.test(raw[at + 1] ?? '')) { length = 2; decoded = raw[at + 1]; }\n else if (raw[at] === '&') {\n const entity = /^&(?:#x[\\da-f]+|#\\d+|[a-z][\\da-z]+);/i.exec(raw.slice(at));\n if (entity) { const result = decodeString(entity[0]); if (result !== entity[0]) { length = entity[0].length; decoded = result; } }\n } else if (raw[at] === '\\r') { length = raw[at + 1] === '\\n' ? 2 : 1; decoded = '\\n'; }\n if (value.startsWith(decoded, rendered)) {\n for (let unit = 0; unit < decoded.length; unit++) { starts.push(range.start + at); ends.push(range.start + at + length); }\n rendered += decoded.length;\n } else if (!/[\\s>]/.test(decoded)) exact = false;\n at += length;\n }\n if (rendered !== value.length) exact = false;\n while (starts.length < value.length) { starts.push(range.start); ends.push(range.end); }\n return { starts, ends, exact };\n}\n\nexport function selectionFromRange(document: DocumentSnapshot, raw: SourceRange, options: { text?: string; quality?: SelectionSnapshot['quality']; settled?: boolean } = {}): SelectionSnapshot {\n const initial = { start: Math.max(0, raw.start), end: Math.min(document.source.length, raw.end) };\n const syntax = { ...initial };\n const containers = new Set(['strong', 'emphasis', 'delete', 'link', 'linkReference', 'heading', 'listItem', 'blockquote']);\n const source = document.source;\n const whitespace = (start: number, end: number) => !source.slice(start, end).trim();\n // Walk boundary ancestors inside-out. Each edge absorbs only its adjacent\n // delimiter, never the unselected words inside an ancestor. Custom component\n // tags remain boundaries; their Markdown children still participate normally.\n function expand(node: MarkdownNode) {\n const range = rangeOf(node);\n if (!intersects(range, syntax) || range.start >= syntax.start && range.end <= syntax.end) return;\n node.children?.forEach(expand);\n let content: SourceRange | undefined;\n if (containers.has(node.type) && node.children?.length) {\n content = { start: rangeOf(node.children[0]).start, end: rangeOf(node.children.at(-1)!).end };\n } else if (node.type === 'inlineCode' || node.type === 'inlineMath') {\n const length = (node.type === 'inlineCode' ? /^`+/ : /^\\$+/).exec(source.slice(range.start, range.end))?.[0].length ?? 0;\n content = { start: range.start + length, end: range.end - length };\n } else if (node.type === 'code' || node.type === 'math') {\n const raw = source.slice(range.start, range.end);\n const opening = /^[ \\t]*(`{3,}|~{3,}|\\${2,})[^\\r\\n]*(?:\\r\\n|\\r|\\n)/.exec(raw);\n if (opening) {\n const fence = opening[1];\n const closing = /(?:\\r\\n|\\r|\\n)[ \\t]*(`+|~+|\\$+)[ \\t]*$/.exec(raw);\n const closed = closing && closing[1][0] === fence[0] && closing[1].length >= fence.length;\n content = { start: range.start + opening[0].length, end: closed ? range.start + closing.index : range.end };\n }\n }\n if (content) {\n if (syntax.start > range.start && syntax.start < range.end && (syntax.start <= content.start || whitespace(content.start, syntax.start))) syntax.start = range.start;\n if (syntax.end < range.end && syntax.end > range.start && (syntax.end >= content.end || whitespace(syntax.end, content.end))) syntax.end = range.end;\n }\n if (node.type === 'blockquote') {\n // Continuation lines have their own quote prefixes, independent of the\n // paragraph's first line. Do not consume earlier, unselected quote text.\n const line = Math.max(range.start, source.lastIndexOf('\\n', syntax.start - 1) + 1);\n if (/^[ \\t]*(?:>[ \\t]*)+$/.test(source.slice(line, syntax.start))) syntax.start = line;\n }\n }\n let lo = 0, hi = document.blocks.length;\n while (lo < hi) { const mid = (lo + hi) >>> 1; if (document.blocks[mid].range.end <= initial.start) lo = mid + 1; else hi = mid; }\n const selectedBlocks = [];\n for (let index = lo; index < document.blocks.length && document.blocks[index].range.start < initial.end; index++) {\n const block = document.blocks[index]; selectedBlocks.push(block); expand(block.node);\n }\n const blockRanges: SourceRange[] = [];\n const blockTypes = new Set(['paragraph', 'heading', 'code', 'math', 'table', 'listItem', 'thematicBreak', 'html']);\n function collect(node: MarkdownNode) {\n const range = rangeOf(node);\n if (!intersects(range, initial)) return;\n if (blockTypes.has(node.type) || node.type === 'component' && !node.inline) { blockRanges.push(range); return; }\n node.children?.forEach(collect);\n }\n selectedBlocks.forEach(block => collect(block.node));\n const result = (ranges: SourceRange[]): SelectionResult => ({ ranges, sourceText: ranges.map(range => document.source.slice(range.start, range.end)).join('\\n\\n') });\n return {\n documentId: document.id, revision: document.revision, text: options.text ?? document.source.slice(initial.start, initial.end),\n quality: options.quality ?? 'exact', settled: options.settled ?? true,\n raw: result([initial]), syntax: result([syntax]), blocks: result(blockRanges.length ? blockRanges : [initial]),\n };\n}\n","import type { Annotation, AnnotationAnchor, DocumentSnapshot, HighlightData, SourceRange } from './types';\n\nexport const defaultHighlight: Readonly<HighlightData> = { color: '#F2C744', style: 'background' };\nexport const sameRange = (a: SourceRange, b: SourceRange) => a.start === b.start && a.end === b.end;\n\n/** Resolve persisted anchors once against the current source. */\nexport function resolveAnnotationAnchors(annotation: Annotation, document: DocumentSnapshot): AnnotationAnchor[] {\n return (annotation.anchors ?? (annotation.range ? [{ range: annotation.range }] : [])).flatMap(anchor => {\n if (anchor.documentId && anchor.documentId !== document.id) return [];\n let range = anchor.range;\n if (anchor.quote && document.source.slice(range.start, range.end) !== anchor.quote) {\n const start = document.source.indexOf(anchor.quote);\n if (start < 0 || document.source.indexOf(anchor.quote, start + 1) >= 0) return [];\n range = { start, end: start + anchor.quote.length };\n } else if (anchor.revision !== undefined && anchor.revision !== document.revision && !anchor.quote) return [];\n return range.start >= 0 && range.end <= document.source.length && range.start <= range.end ? [{ ...anchor, range }] : [];\n });\n}\n"],"mappings":";AAAA,SAAS,oBAAoB;AAC7B,SAAS,cAAc;AACvB,SAAS,0BAA0B;AACnC,SAAS,iBAAiB;AAC1B,SAAS,6BAA6B;;;ACF/B,SAAS,KAAK,MAAoB,OAA4D,QAA6B;AAChI,QAAM,MAAM,MAAM;AAClB,aAAW,SAAS,KAAK,YAAY,CAAC,EAAG,MAAK,OAAO,OAAO,IAAI;AAClE;AACO,SAAS,YAAY,MAA4B;AACtD,MAAI,KAAK,SAAS,QAAS,QAAO,OAAO,KAAK,OAAO,EAAE;AACvD,SAAO,KAAK,SAAS,KAAK,UAAU,IAAI,WAAW,EAAE,KAAK,EAAE,KAAK;AACnE;AACO,SAAS,QAAQ,MAAiC;AACvD,SAAO,EAAE,OAAO,KAAK,UAAU,MAAM,UAAU,GAAG,KAAK,KAAK,UAAU,IAAI,UAAU,EAAE;AACxF;AACO,SAAS,WAAW,GAAgB,GAAyB;AAAE,SAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE;AAAK;AAC1G,SAAS,WAAW,QAA0B;AACnD,QAAM,SAAS,CAAC,CAAC;AACjB,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,QAAI,OAAO,CAAC,MAAM,MAAM;AAAE,UAAI,OAAO,IAAI,CAAC,MAAM,KAAM;AAAK,aAAO,KAAK,IAAI,CAAC;AAAA,IAAG,WACtE,OAAO,CAAC,MAAM,KAAM,QAAO,KAAK,IAAI,CAAC;AAAA,EAChD;AACA,SAAO;AACT;AACO,SAAS,YAAY,QAAgB,OAAuC;AACjF,MAAI,KAAK,GAAG,KAAK,MAAM;AACvB,SAAO,KAAK,IAAI,IAAI;AAAE,UAAM,MAAO,KAAK,OAAQ;AAAG,QAAI,MAAM,GAAG,KAAK,OAAQ,MAAK;AAAA,QAAU,MAAK;AAAA,EAAK;AACtG,SAAO,EAAE,QAAQ,MAAM,KAAK,GAAG,QAAQ,SAAS,MAAM,EAAE,IAAI,EAAE;AAChE;AACO,SAAS,QAAQ,MAAsB;AAC5C,SAAO,KAAK,YAAY,EAAE,KAAK,EAAE,QAAQ,uBAAuB,EAAE,EAAE,QAAQ,WAAW,GAAG,EAAE,QAAQ,YAAY,EAAE,KAAK;AACzH;AACO,SAAS,QAAQ,OAAgB,QAAQ,OAA2B;AACzE,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,QAAM,aAAa,MAAM,KAAK,EAAE,QAAQ,0BAA0B,EAAE;AACpE,MAAI,6BAA6B,KAAK,UAAU,KAAK,CAAC,sBAAsB,KAAK,UAAU,EAAG,QAAO;AACrG,MAAI,SAAS,oDAAoD,KAAK,UAAU,EAAG,QAAO;AAC1F,SAAO;AACT;;;AD5BO,SAAS,mBAAmB,YAA8C;AAC/E,QAAM,QAAQ,oBAAI,IAAY;AAC9B,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,aAAa,oBAAI,IAAY;AACnC,aAAW,aAAa,YAAY;AAClC,QAAI,MAAM,IAAI,UAAU,IAAI,EAAG,OAAM,IAAI,MAAM,6BAA6B,UAAU,IAAI,oDAAoD;AAC9I,UAAM,IAAI,UAAU,IAAI;AACxB,eAAW,CAAC,OAAO,OAAO,IAAI,KAAK,CAAC,CAAC,UAAU,MAAM,MAAM,KAAK,GAAG,CAAC,UAAU,YAAY,YAAY,WAAW,CAAC,GAAY;AAC5H,iBAAW,QAAQ,SAAS,CAAC,GAAG;AAC9B,YAAI,MAAM,IAAI,IAAI,EAAG,OAAM,IAAI,MAAM,kBAAkB,IAAI,KAAK,IAAI,EAAE;AACtE,cAAM,IAAI,IAAI;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,aAAa,YAAwC;AACnE,qBAAmB,UAAU;AAC7B,QAAM,iBAAiB,IAAI,IAAI,WAAW,QAAQ,UAAQ,IAAI,QAAQ,CAAC,GAAG,IAAI,UAAQ,CAAC,MAAM,GAAG,CAAU,CAAC,CAAC;AAC5G,QAAM,uBAAuB,IAAI,IAAI,WAAW,QAAQ,UAAQ,IAAI,cAAc,CAAC,GAAG,IAAI,UAAQ,CAAC,MAAM,GAAG,CAAU,CAAC,CAAC;AACxH,QAAM,SAAS,WAAW,QAAQ,SAAO,CAAC,GAAG,IAAI,aAAa,CAAC,CAAC,CAAC;AACjE,QAAM,QAAQ,WAAW,QAAQ,SAAO,CAAC,GAAG,IAAI,SAAS,CAAC,CAAC,CAAC;AAC5D,MAAI,qBAAqB,MAAM;AAAE,WAAO,KAAK,UAAU,CAAC;AAAG,UAAM,KAAK,sBAAsB,CAAC;AAAA,EAAG;AAIhG,QAAM,YAAY,eAAe,OAAO,CAAC,GAAG,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,YAAY,UAAU,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI;AACjH,QAAM,WAAW,eAAe,OAAO,CAAC,GAAG,OAAO,mBAAmB,CAAC,IAAI;AAE1E,SAAO,CAAC,UAAkB,QAAgB,SAAuB,OAA0B,cAAc,OAAO;AAK9G,UAAM,SAAS,cAAc,GAAG,WAAW;AAAA;AAAA;AAAA;AAAA,IAAqC;AAChF,UAAM,QAAQ,SAAS;AACvB,UAAM,cAA4B,CAAC;AACnC,QAAI;AACJ,UAAM,iBAAiB,CAAC,OAAe,YAAY,IAAI,MAAM,SAAS,QAAQ,mBAAmB,WAAW,QAAQ,MAAM,CAAC;AAC3H,QAAI;AACJ,QAAI;AACJ,QAAI;AACF,aAAO,aAAa,OAAO,EAAE,YAAY,WAAW,iBAAiB,SAAS,CAAC;AAAA,IACjF,SAAS,OAAO;AAGd,aAAO,aAAa,OAAO,EAAE,YAAY,QAAQ,iBAAiB,MAAM,CAAC;AACzE,uBAAiB;AACjB,kBAAY,KAAK,EAAE,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,GAAG,OAAO,CAAC;AAAA,IAC9F;AACA,SAAK,WAAW,KAAK,UAAU,OAAO,WAAS,KAAK,UAAU,MAAM,UAAU,MAAM,OAAO,MAAM;AACjG,QAAI,UAAU,OAAO,UAAU,eAAe,QAAQ,qBAAqB,KAAM,MAAK,MAAM,UAAQ;AAClG,UAAI,KAAK,aAAa,UAAU,OAAO,SAAS;AAC9C,cAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,SAAS,MAAM,SAAS,OAAO,SAAS,MAAM;AAC7E,cAAM,MAAM,KAAK,IAAI,OAAO,KAAK,SAAS,IAAI,SAAS,OAAO,SAAS,MAAM;AAC7E,aAAK,WAAW,EAAE,OAAO,YAAY,OAAO,KAAK,GAAG,KAAK,YAAY,KAAK,KAAK,EAAE;AAAA,MACnF;AACA,UAAI,KAAK,SAAS,uBAAuB,KAAK,SAAS,qBAAqB;AAC1E,cAAM,aAAa,eAAe,IAAI,KAAK,QAAQ,EAAE;AACrD,cAAM,gBAAgB,KAAK;AAC3B,cAAM,aAAwD,CAAC;AAC/D,cAAM,iBAA+C,CAAC;AACtD,mBAAW,QAAQ,iBAAiB,CAAC,GAAG;AACtC,cAAI,KAAK,SAAS,sBAAsB,OAAO,KAAK,UAAU,YAAY,KAAK,UAAU,OAAO;AAC9F,uBAAW,KAAK,IAAI,IAAI,KAAK,SAAS;AACtC,gBAAI,cAAc,OAAO,KAAK,UAAU,YAAY,KAAK,UAAU;AACjE,oBAAM,QAAQ,KAAK,SAAS,MAAM,SAAS,OAAO,SAAS;AAC3D,oBAAM,MAAM,KAAK,SAAS,IAAI,SAAS,OAAO,SAAS;AACvD,oBAAM,MAAM,QAAQ,OAAO,MAAM,OAAO,GAAG,GAAG,UAAU,IAAI,OAAO,MAAM;AACzE,kBAAI,WAAW,EAAG,gBAAe,KAAK,IAAI,IAAI,EAAE,MAAM,QAAQ,OAAO,KAAK,OAAO,iBAAiB,MAAM,UAAU,EAAE,OAAO,eAAe,QAAQ,UAAU,CAAC,GAAG,KAAK,eAAe,MAAM,CAAC,EAAE,EAAE;AAAA,YACjM;AAAA,UACF,MACK,aAAY,KAAK,EAAE,SAAS,oFAAoF,QAAQ,KAAK,UAAU,MAAM,OAAO,CAAC;AAAA,QAC5J;AACA,aAAK,SAAS,YAAY,YAAY,UAAU,QAAQ,YAAY,YAAY,WAAW,OAAO,KAAK,SAAS;AAChH,aAAK,OAAO,aAAa,cAAc;AACvC,aAAK,aAAa;AAClB,YAAI,OAAO,KAAK,cAAc,EAAE,OAAQ,MAAK,iBAAiB;AAC9D,aAAK,YAAY,YAAY,aAAa;AAC1C,YAAI,CAAC,cAAc,KAAK,UAAU;AAChC,eAAK,QAAQ,QAAQ,OAAO,MAAM,KAAK,SAAS,MAAM,QAAQ,KAAK,SAAS,IAAI,MAAM;AACtF,eAAK,WAAW;AAAA,QAClB;AAAA,MACF,WAAW,KAAK,SAAS,wBAAwB,KAAK,SAAS,mBAAmB,KAAK,SAAS,iBAAiB;AAC/G,cAAM,aAAa,qBAAqB,IAAI,KAAK,QAAQ,EAAE;AAC3D,YAAI,YAAY;AAGd,gBAAM,QAAQ,KAAK,UAAU,MAAM,UAAU;AAC7C,gBAAM,MAAM,QAAQ,OAAO,QAAQ,MAAM,KAAK;AAC9C,gBAAM,SAAS,QAAQ,OAAO,MAAM,OAAO,MAAM,IAAI,QAAQ,OAAO,SAAS,GAAG;AAChF,gBAAM,QAAQ,OAAO,QAAQ,GAAG;AAChC,cAAI,SAAS,GAAG;AACd,kBAAM,iBAA+C,CAAC;AACtD,kBAAM,aAAa;AACnB,kBAAM,MAAM,OAAO,MAAM,QAAQ,CAAC;AAClC,uBAAW,SAAS,IAAI,SAAS,UAAU,GAAG;AAC5C,oBAAM,OAAO,MAAM,CAAC,GAAG,QAAQ,KAAK,aAAa,IAAI;AACrD,kBAAI,OAAO,UAAU,SAAU;AAC/B,oBAAM,SAAS,MAAM,CAAC,MAAM,UAAa,MAAM,CAAC,MAAM;AACtD,oBAAM,eAAe,MAAM,CAAC,KAAK,MAAM,CAAC,KAAK,MAAM,CAAC,GAAG;AACvD,oBAAM,WAAW,QAAQ,QAAQ,IAAI,MAAM,QAAS,MAAM,CAAC,EAAE,UAAU,SAAS,IAAI;AACpF,6BAAe,IAAI,IAAI,EAAE,MAAM,QAAQ,OAAO,UAAU,EAAE,OAAO,eAAe,WAAW,WAAW,GAAG,KAAK,eAAe,QAAQ,EAAE,EAAE;AAAA,YAC3I;AACA,gBAAI,OAAO,KAAK,cAAc,EAAE,OAAQ,MAAK,iBAAiB;AAAA,UAChE;AACA,eAAK,SAAS,KAAK,SAAS;AAC5B,eAAK,OAAO;AACZ,eAAK,YAAY,WAAW,aAAa;AAAA,QAC3C;AAAA,MACF;AAAA,IACF,CAAC;AACD,QAAI,UAAU,OAAO,OAAQ,MAAK,WAAW,EAAE,OAAO,YAAY,QAAQ,KAAK,GAAG,KAAK,YAAY,SAAS,SAAS,QAAQ,KAAK,EAAE;AACpI,eAAW,aAAa,YAAY;AAClC,UAAI;AAAE,kBAAU,YAAY,MAAM,OAAO;AAAA,MAAG,SACrC,OAAO;AAAE,oBAAY,KAAK,EAAE,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,GAAG,WAAW,UAAU,KAAK,CAAC;AAAA,MAAG;AAAA,IACpI;AACA,WAAO,EAAE,OAAO,KAAK,YAAY,CAAC,GAAG,aAAa,eAAe;AAAA,EACnE;AACF;;;AE3HA,IAAI,WAAW;AAGR,IAAM,iBAAN,MAAqB;AAAA,EACjB;AAAA,EACD;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,YAAY,oBAAI,IAAgB;AAAA,EAChC,sBAAsB;AAAA,EACtB;AAAA,EAER,YAAY,SAAS,IAAI,UAA2B,CAAC,GAAG;AACtD,SAAK,KAAK,QAAQ,MAAM,QAAQ,EAAE,QAAQ;AAC1C,SAAK,aAAa,QAAQ,cAAc,CAAC;AACzC,SAAK,QAAQ,aAAa,KAAK,UAAU;AACzC,SAAK,OAAO,QAAQ,EAAE,WAAW,QAAQ,UAAU,CAAC;AAAA,EACtD;AAAA,EAEA,cAAc,MAAwB,KAAK;AAAA,EAC3C,YAAY,CAAC,aAAuC;AAAE,SAAK,UAAU,IAAI,QAAQ;AAAG,WAAO,MAAM,KAAK,UAAU,OAAO,QAAQ;AAAA,EAAG;AAAA,EAElI,cAAc,YAA8C;AAC1D,QAAI,eAAe,KAAK,WAAY;AACpC,SAAK,QAAQ,aAAa,UAAU;AACpC,SAAK,aAAa;AAClB,UAAM,WAAW,KAAK;AACtB,SAAK,OAAO,SAAS,QAAQ,EAAE,WAAW,SAAS,UAAU,GAAG,IAAI;AAAA,EACtE;AAAA,EAEA,OAAO,OAAiC;AAAE,WAAO,KAAK,OAAO,KAAK,SAAU,SAAS,OAAO,EAAE,WAAW,KAAK,CAAC;AAAA,EAAG;AAAA,EAClH,SAA2B;AAAE,WAAO,KAAK,OAAO,KAAK,SAAU,QAAQ,EAAE,WAAW,MAAM,CAAC;AAAA,EAAG;AAAA,EAE9F,OAAO,QAAgB,UAAmC,CAAC,GAAG,QAAQ,OAAyB;AAC7F,UAAM,WAAW,KAAK;AACtB,UAAM,YAAY,QAAQ,aAAa;AACvC,QAAI,CAAC,SAAS,UAAU,WAAW,UAAU,SAAS,cAAc,UAAW,QAAO;AACtF,UAAM,kBAAkB,KAAK,WAAW,KAAK,SAAO,IAAI,aAAa,IAAI,UAAU,OAAO;AAC1F,UAAM,SAAS,CAAC,SAAS,UAAU,aAAa,OAAO,WAAW,SAAS,MAAM,KAAK,CAAC;AACvF,UAAM,aAAa,CAAC,CAAC,UAAU,aAAa,CAAC;AAC7C,QAAI,QAAQ,UAAU,aAAa,SAAS,OAAO,SAAS,SAAS,OAAO,SAAS,OAAO,SAAS,CAAC,EAAE,MAAM,QAAQ;AACtH,UAAM,aAAa,KAAK,mBAAmB;AAC3C,QAAI,UAAU,WAAY,SAAQ,KAAK,IAAI,OAAO,KAAK,cAAe;AACtE,QAAI,SAAoC,SAAS,kBAAkB,cAAc,CAAC,WAAW,YAAY,aAAa,aAAa,SAAS,WAAW;AACvJ,UAAM,QAAQ,QAAQ,WAAW,MAAM,IAAI,CAAC;AAC5C,UAAM,UAAU,EAAE,QAAQ,WAAW,YAAY,KAAK,GAAG;AACzD,QAAI,WAAW,QAAQ,SAAU,OAAO,OAAO,WAAS,MAAM,MAAM,OAAO,KAAK,IAAI,CAAC;AACrF,UAAM,cAAwB,CAAC;AAC/B,eAAW,SAAS,SAAU,MAAK,MAAM,MAAM,UAAQ;AACrD,UAAI,KAAK,SAAS,gBAAgB,KAAK,SAAS,sBAAsB;AAAE,cAAM,QAAQ,QAAQ,IAAI;AAAG,oBAAY,KAAK,OAAO,MAAM,MAAM,OAAO,MAAM,GAAG,CAAC;AAAA,MAAG;AAAA,IAC/J,CAAC;AACD,QAAI,SAAS,KAAK,MAAM,OAAO,MAAM,KAAK,GAAG,OAAO,SAAS,OAAO,YAAY,KAAK,MAAM,CAAC;AAC5F,UAAM,eAAe,CAAC,UAAmC;AACvD,YAAM,UAAoB,CAAC;AAC3B,iBAAW,QAAQ,MAAO,MAAK,MAAM,WAAS;AAC5C,YAAI,MAAM,SAAS,gBAAgB,MAAM,SAAS,sBAAsB;AAAE,gBAAM,QAAQ,QAAQ,KAAK;AAAG,kBAAQ,KAAK,OAAO,MAAM,MAAM,OAAO,MAAM,GAAG,CAAC;AAAA,QAAG;AAAA,MAC9J,CAAC;AACD,aAAO,QAAQ,KAAK,IAAQ;AAAA,IAC9B;AACA,QAAI,YAAY,aAAa,CAAC,GAAG,SAAS,IAAI,WAAS,MAAM,IAAI,GAAG,GAAG,OAAO,KAAK,CAAC;AACpF,QAAI,mBAAmB,OAAO,SAAS,QAAQ,YAAY,KAAK,MAAM,EAAE;AACxE,UAAM,qBAAqB,CAAC,CAAC,YAAY,cAAc,KAAK;AAC5D,QAAI,SAAS,oBAAoB;AAC/B,eAAS;AACT,cAAQ;AACR,iBAAW,CAAC;AACZ,eAAS,KAAK,MAAM,QAAQ,GAAG,SAAS,KAAK;AAC7C,kBAAY,aAAa,OAAO,KAAK;AACrC,0BAAoB,OAAO;AAAA,IAC7B;AACA,SAAK,sBAAsB;AAC3B,SAAK,iBAAiB,OAAO;AAC7B,UAAM,QAAQ,IAAI,IAAI,UAAU,OAAO,IAAI,WAAS,CAAC,MAAM,MAAM,OAAO,KAAK,CAAC,CAAC;AAC/E,QAAI,SAAS,SAAS;AACtB,UAAM,SAAkB,CAAC,GAAG,QAAQ;AACpC,aAAS,QAAQ,GAAG,QAAQ,OAAO,MAAM,QAAQ,SAAS;AACxD,YAAM,OAAO,OAAO,MAAM,KAAK;AAC/B,YAAM,QAAQ,QAAQ,IAAI;AAC1B,YAAM,MAAM,MAAM,IAAI,MAAM,KAAK;AACjC,YAAM,UAAU,aAAa,UAAU,OAAO,MAAM,SAAS;AAE7D,YAAM,WAAW,CAAC,sBAAsB,CAAC,cAAc,WAAW,YAAY,OAAO,IAAI,KAAK,SAAS,KAAK,QAAQ,IAAI,YAAY,WAAW,SAAU,OAAO,MAAM,IAAI,MAAM,OAAO,IAAI,MAAM,GAAG,MAAM,OAAO,MAAM,MAAM,OAAO,MAAM,GAAG;AAC7O,UAAI,UAAU;AAAE,eAAO,KAAK,GAAG;AAAG;AAAA,MAAU,MACvC,QAAO,KAAK,EAAE,IAAI,KAAK,MAAM,GAAG,KAAK,EAAE,KAAK,EAAE,KAAK,SAAS,IAAI,MAAM,OAAO,QAAQ,CAAC;AAAA,IAC7F;AACA,UAAM,WAAsB,CAAC;AAC7B,UAAM,cAAc,oBAAI,IAA0B;AAClD,UAAM,YAAY,oBAAI,IAA0B;AAChD,UAAM,gBAA0B,CAAC;AACjC,UAAM,cAAc,oBAAI,IAAwB;AAChD,UAAM,cAAsC,CAAC;AAC7C,UAAM,aAAa,oBAAI,IAAoB;AAC3C,eAAW,SAAS,OAAQ,MAAK,MAAM,MAAM,UAAQ;AACnD,UAAI,KAAK,SAAS,WAAW;AAC3B,cAAM,OAAO,YAAY,IAAI;AAC7B,cAAM,OAAO,QAAQ,IAAI;AACzB,cAAM,QAAQ,WAAW,IAAI,IAAI,KAAK;AACtC,mBAAW,IAAI,MAAM,QAAQ,CAAC;AAC9B,iBAAS,KAAK,EAAE,IAAI,GAAG,KAAK,EAAE,IAAI,IAAI,GAAG,QAAQ,IAAI,KAAK,KAAK,EAAE,IAAI,MAAM,OAAO,OAAO,KAAK,KAAK,GAAG,OAAO,QAAQ,IAAI,GAAG,SAAS,MAAM,GAAG,CAAC;AAAA,MACjJ;AACA,UAAI,KAAK,SAAS,gBAAgB,CAAC,YAAY,IAAI,OAAO,KAAK,UAAU,CAAC,EAAG,aAAY,IAAI,OAAO,KAAK,UAAU,GAAG,IAAI;AAC1H,UAAI,KAAK,SAAS,wBAAwB,CAAC,UAAU,IAAI,OAAO,KAAK,UAAU,CAAC,EAAG,WAAU,IAAI,OAAO,KAAK,UAAU,GAAG,IAAI;AAC9H,UAAI,KAAK,SAAS,uBAAuB,CAAC,cAAc,SAAS,OAAO,KAAK,UAAU,CAAC,EAAG,eAAc,KAAK,OAAO,KAAK,UAAU,CAAC;AACrI,UAAI,KAAK,SAAS,wBAAwB;AACxC,cAAM,aAAa,KAAK;AACxB,oBAAY,IAAI,WAAW,IAAI,UAAU;AAAA,MAC3C;AACA,UAAI,KAAK,SAAS,uBAAuB;AACvC,cAAM,QAAQ,QAAQ,IAAI;AAC1B,oBAAY,KAAK,EAAE,IAAI,GAAG,KAAK,EAAE,QAAQ,MAAM,KAAK,IAAI,OAAO,eAAe,KAAK,eAA2B,UAAU,KAAK,CAAC;AAAA,MAChI;AAAA,IACF,CAAC;AACD,SAAK,WAAW;AAAA,MACd,IAAI,KAAK;AAAA,MAAI,WAAW,UAAU,YAAY,MAAM;AAAA,MAAG;AAAA,MAAQ;AAAA,MAC/D;AAAA,MACA,UAAU,YAAY,SAAS,WAAW,SAAS,SAAS,UAAU,SAAS,MAAM,CAAC,SAAS,UAAU;AACvG,cAAM,MAAM,SAAS,SAAS,KAAK;AACnC,eAAO,QAAQ,OAAO,IAAI,MAAM,QAAQ,SAAS,IAAI,QAAQ,QAAQ,UAAU,IAAI,SAAS,QAAQ,YAAY,IAAI,WAAW,QAAQ,MAAM,UAAU,IAAI,MAAM,SAAS,QAAQ,MAAM,QAAQ,IAAI,MAAM;AAAA,MAC5M,CAAC,IAAI,SAAS,WAAW;AAAA,MACzB;AAAA,MAAa;AAAA,MAAW;AAAA,MAAe,aAAa,CAAC,GAAG,YAAY,OAAO,CAAC;AAAA,MAAG;AAAA,MAC/E,aAAa,OAAO;AAAA,MACpB,SAAS,EAAE,kBAAkB,cAAc,QAAQ,cAAc,OAAO,MAAM,QAAQ,WAAW,UAAU,GAAG,OAAO;AAAA,IACvH;AACA,eAAW,YAAY,KAAK,UAAW,UAAS;AAChD,WAAO,KAAK;AAAA,EACd;AACF;AAEO,SAAS,eAAe,SAAS,IAAI,UAA2B,CAAC,GAAmB;AAAE,SAAO,IAAI,eAAe,QAAQ,OAAO;AAAG;AAElI,SAAS,iBAA4C,YAA0B,aAAqB;AACzG,QAAM,SAAS,WAAW,KAAK,eAAa,UAAU,SAAS,YAAY,IAAI;AAC/E,SAAO,SAAS,WAAW,IAAI,eAAa,UAAU,SAAS,YAAY,OAAO,cAAc,SAAS,IAAI,CAAC,GAAG,YAAY,WAAW;AAC1I;;;AC1IA,SAAS,oBAAoB;AAOtB,SAAS,QAAQ,QAAgB,OAAe,OAAoB,UAAiC,CAAC,GAAgB;AAC3H,QAAM,MAAM,OAAO,MAAM,MAAM,OAAO,MAAM,GAAG;AAC/C,QAAM,SAAmB,CAAC,GAAG,OAAiB,CAAC;AAC/C,MAAI,WAAW,GAAG,QAAQ;AAC1B,WAAS,KAAK,GAAG,KAAK,IAAI,UAAU,WAAW,MAAM,UAAS;AAC5D,QAAI,SAAS,GAAG,UAAU,IAAI,EAAE;AAChC,QAAI,QAAQ,YAAY,SAAS,IAAI,EAAE,MAAM,QAAQ,wCAAwC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE,GAAG;AAAE,eAAS;AAAG,gBAAU,IAAI,KAAK,CAAC;AAAA,IAAG,WAClJ,IAAI,EAAE,MAAM,KAAK;AACxB,YAAM,SAAS,wCAAwC,KAAK,IAAI,MAAM,EAAE,CAAC;AACzE,UAAI,QAAQ;AAAE,cAAM,SAAS,aAAa,OAAO,CAAC,CAAC;AAAG,YAAI,WAAW,OAAO,CAAC,GAAG;AAAE,mBAAS,OAAO,CAAC,EAAE;AAAQ,oBAAU;AAAA,QAAQ;AAAA,MAAE;AAAA,IACnI,WAAW,IAAI,EAAE,MAAM,MAAM;AAAE,eAAS,IAAI,KAAK,CAAC,MAAM,OAAO,IAAI;AAAG,gBAAU;AAAA,IAAM;AACtF,QAAI,MAAM,WAAW,SAAS,QAAQ,GAAG;AACvC,eAAS,OAAO,GAAG,OAAO,QAAQ,QAAQ,QAAQ;AAAE,eAAO,KAAK,MAAM,QAAQ,EAAE;AAAG,aAAK,KAAK,MAAM,QAAQ,KAAK,MAAM;AAAA,MAAG;AACzH,kBAAY,QAAQ;AAAA,IACtB,WAAW,CAAC,QAAQ,KAAK,OAAO,EAAG,SAAQ;AAC3C,UAAM;AAAA,EACR;AACA,MAAI,aAAa,MAAM,OAAQ,SAAQ;AACvC,SAAO,OAAO,SAAS,MAAM,QAAQ;AAAE,WAAO,KAAK,MAAM,KAAK;AAAG,SAAK,KAAK,MAAM,GAAG;AAAA,EAAG;AACvF,SAAO,EAAE,QAAQ,MAAM,MAAM;AAC/B;AAEO,SAAS,mBAAmB,UAA4B,KAAkB,UAAwF,CAAC,GAAsB;AAC9L,QAAM,UAAU,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI,KAAK,GAAG,KAAK,KAAK,IAAI,SAAS,OAAO,QAAQ,IAAI,GAAG,EAAE;AAChG,QAAM,SAAS,EAAE,GAAG,QAAQ;AAC5B,QAAM,aAAa,oBAAI,IAAI,CAAC,UAAU,YAAY,UAAU,QAAQ,iBAAiB,WAAW,YAAY,YAAY,CAAC;AACzH,QAAM,SAAS,SAAS;AACxB,QAAM,aAAa,CAAC,OAAe,QAAgB,CAAC,OAAO,MAAM,OAAO,GAAG,EAAE,KAAK;AAIlF,WAAS,OAAO,MAAoB;AAClC,UAAM,QAAQ,QAAQ,IAAI;AAC1B,QAAI,CAAC,WAAW,OAAO,MAAM,KAAK,MAAM,SAAS,OAAO,SAAS,MAAM,OAAO,OAAO,IAAK;AAC1F,SAAK,UAAU,QAAQ,MAAM;AAC7B,QAAI;AACJ,QAAI,WAAW,IAAI,KAAK,IAAI,KAAK,KAAK,UAAU,QAAQ;AACtD,gBAAU,EAAE,OAAO,QAAQ,KAAK,SAAS,CAAC,CAAC,EAAE,OAAO,KAAK,QAAQ,KAAK,SAAS,GAAG,EAAE,CAAE,EAAE,IAAI;AAAA,IAC9F,WAAW,KAAK,SAAS,gBAAgB,KAAK,SAAS,cAAc;AACnE,YAAM,UAAU,KAAK,SAAS,eAAe,QAAQ,QAAQ,KAAK,OAAO,MAAM,MAAM,OAAO,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE,UAAU;AACvH,gBAAU,EAAE,OAAO,MAAM,QAAQ,QAAQ,KAAK,MAAM,MAAM,OAAO;AAAA,IACnE,WAAW,KAAK,SAAS,UAAU,KAAK,SAAS,QAAQ;AACvD,YAAMA,OAAM,OAAO,MAAM,MAAM,OAAO,MAAM,GAAG;AAC/C,YAAM,UAAU,oDAAoD,KAAKA,IAAG;AAC5E,UAAI,SAAS;AACX,cAAM,QAAQ,QAAQ,CAAC;AACvB,cAAM,UAAU,yCAAyC,KAAKA,IAAG;AACjE,cAAM,SAAS,WAAW,QAAQ,CAAC,EAAE,CAAC,MAAM,MAAM,CAAC,KAAK,QAAQ,CAAC,EAAE,UAAU,MAAM;AACnF,kBAAU,EAAE,OAAO,MAAM,QAAQ,QAAQ,CAAC,EAAE,QAAQ,KAAK,SAAS,MAAM,QAAQ,QAAQ,QAAQ,MAAM,IAAI;AAAA,MAC5G;AAAA,IACF;AACA,QAAI,SAAS;AACX,UAAI,OAAO,QAAQ,MAAM,SAAS,OAAO,QAAQ,MAAM,QAAQ,OAAO,SAAS,QAAQ,SAAS,WAAW,QAAQ,OAAO,OAAO,KAAK,GAAI,QAAO,QAAQ,MAAM;AAC/J,UAAI,OAAO,MAAM,MAAM,OAAO,OAAO,MAAM,MAAM,UAAU,OAAO,OAAO,QAAQ,OAAO,WAAW,OAAO,KAAK,QAAQ,GAAG,GAAI,QAAO,MAAM,MAAM;AAAA,IACnJ;AACA,QAAI,KAAK,SAAS,cAAc;AAG9B,YAAM,OAAO,KAAK,IAAI,MAAM,OAAO,OAAO,YAAY,MAAM,OAAO,QAAQ,CAAC,IAAI,CAAC;AACjF,UAAI,uBAAuB,KAAK,OAAO,MAAM,MAAM,OAAO,KAAK,CAAC,EAAG,QAAO,QAAQ;AAAA,IACpF;AAAA,EACF;AACA,MAAI,KAAK,GAAG,KAAK,SAAS,OAAO;AACjC,SAAO,KAAK,IAAI;AAAE,UAAM,MAAO,KAAK,OAAQ;AAAG,QAAI,SAAS,OAAO,GAAG,EAAE,MAAM,OAAO,QAAQ,MAAO,MAAK,MAAM;AAAA,QAAQ,MAAK;AAAA,EAAK;AACjI,QAAM,iBAAiB,CAAC;AACxB,WAAS,QAAQ,IAAI,QAAQ,SAAS,OAAO,UAAU,SAAS,OAAO,KAAK,EAAE,MAAM,QAAQ,QAAQ,KAAK,SAAS;AAChH,UAAM,QAAQ,SAAS,OAAO,KAAK;AAAG,mBAAe,KAAK,KAAK;AAAG,WAAO,MAAM,IAAI;AAAA,EACrF;AACA,QAAM,cAA6B,CAAC;AACpC,QAAM,aAAa,oBAAI,IAAI,CAAC,aAAa,WAAW,QAAQ,QAAQ,SAAS,YAAY,iBAAiB,MAAM,CAAC;AACjH,WAAS,QAAQ,MAAoB;AACnC,UAAM,QAAQ,QAAQ,IAAI;AAC1B,QAAI,CAAC,WAAW,OAAO,OAAO,EAAG;AACjC,QAAI,WAAW,IAAI,KAAK,IAAI,KAAK,KAAK,SAAS,eAAe,CAAC,KAAK,QAAQ;AAAE,kBAAY,KAAK,KAAK;AAAG;AAAA,IAAQ;AAC/G,SAAK,UAAU,QAAQ,OAAO;AAAA,EAChC;AACA,iBAAe,QAAQ,WAAS,QAAQ,MAAM,IAAI,CAAC;AACnD,QAAM,SAAS,CAAC,YAA4C,EAAE,QAAQ,YAAY,OAAO,IAAI,WAAS,SAAS,OAAO,MAAM,MAAM,OAAO,MAAM,GAAG,CAAC,EAAE,KAAK,MAAM,EAAE;AAClK,SAAO;AAAA,IACL,YAAY,SAAS;AAAA,IAAI,UAAU,SAAS;AAAA,IAAU,MAAM,QAAQ,QAAQ,SAAS,OAAO,MAAM,QAAQ,OAAO,QAAQ,GAAG;AAAA,IAC5H,SAAS,QAAQ,WAAW;AAAA,IAAS,SAAS,QAAQ,WAAW;AAAA,IACjE,KAAK,OAAO,CAAC,OAAO,CAAC;AAAA,IAAG,QAAQ,OAAO,CAAC,MAAM,CAAC;AAAA,IAAG,QAAQ,OAAO,YAAY,SAAS,cAAc,CAAC,OAAO,CAAC;AAAA,EAC/G;AACF;;;ACxFO,IAAM,mBAA4C,EAAE,OAAO,WAAW,OAAO,aAAa;AAC1F,IAAM,YAAY,CAAC,GAAgB,MAAmB,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE;AAGzF,SAAS,yBAAyB,YAAwB,UAAgD;AAC/G,UAAQ,WAAW,YAAY,WAAW,QAAQ,CAAC,EAAE,OAAO,WAAW,MAAM,CAAC,IAAI,CAAC,IAAI,QAAQ,YAAU;AACvG,QAAI,OAAO,cAAc,OAAO,eAAe,SAAS,GAAI,QAAO,CAAC;AACpE,QAAI,QAAQ,OAAO;AACnB,QAAI,OAAO,SAAS,SAAS,OAAO,MAAM,MAAM,OAAO,MAAM,GAAG,MAAM,OAAO,OAAO;AAClF,YAAM,QAAQ,SAAS,OAAO,QAAQ,OAAO,KAAK;AAClD,UAAI,QAAQ,KAAK,SAAS,OAAO,QAAQ,OAAO,OAAO,QAAQ,CAAC,KAAK,EAAG,QAAO,CAAC;AAChF,cAAQ,EAAE,OAAO,KAAK,QAAQ,OAAO,MAAM,OAAO;AAAA,IACpD,WAAW,OAAO,aAAa,UAAa,OAAO,aAAa,SAAS,YAAY,CAAC,OAAO,MAAO,QAAO,CAAC;AAC5G,WAAO,MAAM,SAAS,KAAK,MAAM,OAAO,SAAS,OAAO,UAAU,MAAM,SAAS,MAAM,MAAM,CAAC,EAAE,GAAG,QAAQ,MAAM,CAAC,IAAI,CAAC;AAAA,EACzH,CAAC;AACH;","names":["raw"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/parser.ts","../src/core/tree.ts","../src/core/engine.ts","../src/core/selection.ts","../src/core/annotations.ts"],"sourcesContent":["import { fromMarkdown } from 'mdast-util-from-markdown';\nimport { mdxJsx } from 'micromark-extension-mdx-jsx';\nimport { mdxJsxFromMarkdown } from 'mdast-util-mdx-jsx';\nimport { directive } from 'micromark-extension-directive';\nimport { directiveFromMarkdown } from 'mdast-util-directive';\nimport { lineStarts, sourcePoint, walk } from './tree';\nimport type { Diagnostic, MarkdownNode, ParseContext, SourcePosition, SyntaxExtension } from './types';\n\nexport function validateExtensions(extensions: readonly SyntaxExtension[]): void {\n const names = new Set<string>();\n const tags = new Set<string>();\n const directives = new Set<string>();\n for (const extension of extensions) {\n if (names.has(extension.name)) throw new Error(`Duplicate LiMR extension: ${extension.name}. Use replaceExtension() to replace it explicitly.`);\n names.add(extension.name);\n for (const [items, known, kind] of [[extension.tags, tags, 'tag'], [extension.directives, directives, 'directive']] as const) {\n for (const name of items ?? []) {\n if (known.has(name)) throw new Error(`Duplicate LiMR ${kind}: ${name}`);\n known.add(name);\n }\n }\n }\n}\n\nexport function createParser(extensions: readonly SyntaxExtension[]) {\n validateExtensions(extensions);\n const tagDefinitions = new Map(extensions.flatMap(ext => (ext.tags ?? []).map(name => [name, ext] as const)));\n const directiveDefinitions = new Map(extensions.flatMap(ext => (ext.directives ?? []).map(name => [name, ext] as const)));\n const syntax = extensions.flatMap(ext => [...ext.micromark ?? []]);\n const mdast = extensions.flatMap(ext => [...ext.mdast ?? []]);\n if (directiveDefinitions.size) { syntax.push(directive()); mdast.push(directiveFromMarkdown()); }\n // CommonMark's HTML blocks otherwise swallow same-line native tag names such\n // as <figcaption>**caption**</figcaption> before the JSX adapter can see them.\n // Unknown JSX remains inert through the whitelist below; recovery keeps HTML.\n const jsxSyntax = tagDefinitions.size ? [...syntax, { disable: { null: ['htmlFlow', 'htmlText'] } }, mdxJsx()] : syntax;\n const jsxMdast = tagDefinitions.size ? [...mdast, mdxJsxFromMarkdown()] : mdast;\n\n return (fragment: string, offset: number, context: ParseContext, lines: readonly number[], environment = '') => {\n // Definitions are a parsing environment, never part of the stored source.\n // A known prefix offset is removed from EVERY node position below.\n // A neutral paragraph closes footnote containers. Without it, an indented\n // suffix can be consumed as part of a synthetic footnote definition.\n const prefix = environment ? `${environment}\\n\\nlimr-definition-boundary\\n\\n` : '';\n const input = prefix + fragment;\n const diagnostics: Diagnostic[] = [];\n let attributeLines: readonly number[] | undefined;\n const attributePoint = (at: number) => sourcePoint(at, lines.length ? lines : attributeLines ??= lineStarts(context.source));\n let recoveryOffset: number | undefined;\n let root: MarkdownNode;\n try {\n root = fromMarkdown(input, { extensions: jsxSyntax, mdastExtensions: jsxMdast }) as unknown as MarkdownNode;\n } catch (error) {\n // Incomplete JSX is common during streaming. Preserve readable Markdown,\n // treat HTML as inert source and retry the final block on the next append.\n root = fromMarkdown(input, { extensions: syntax, mdastExtensions: mdast }) as unknown as MarkdownNode;\n recoveryOffset = offset;\n diagnostics.push({ message: error instanceof Error ? error.message : String(error), offset });\n }\n root.children = root.children?.filter(node => (node.position?.start.offset ?? 0) >= prefix.length);\n if (offset || prefix.length || tagDefinitions.size || directiveDefinitions.size) walk(root, node => {\n if (node.position && (offset || prefix.length)) {\n const start = Math.max(0, node.position.start.offset - prefix.length + offset);\n const end = Math.max(start, node.position.end.offset - prefix.length + offset);\n node.position = { start: sourcePoint(start, lines), end: sourcePoint(end, lines) };\n }\n if (node.type === 'mdxJsxFlowElement' || node.type === 'mdxJsxTextElement') {\n const definition = tagDefinitions.get(node.name ?? '');\n const rawAttributes = node.attributes as unknown as { type: string; name: string; value: unknown; position?: SourcePosition }[];\n const attributes: Record<string, string | boolean | number> = {};\n const attributeNodes: Record<string, MarkdownNode> = {};\n for (const attr of rawAttributes ?? []) {\n if (attr.type === 'mdxJsxAttribute' && (typeof attr.value === 'string' || attr.value === null)) {\n attributes[attr.name] = attr.value ?? true;\n if (definition && typeof attr.value === 'string' && attr.position) {\n const start = attr.position.start.offset - prefix.length + offset;\n const end = attr.position.end.offset - prefix.length + offset;\n const raw = context.source.slice(start, end), opening = raw.search(/[\"']/);\n if (opening >= 0) attributeNodes[attr.name] = { type: 'text', value: attr.value, verbatimEscapes: true, position: { start: attributePoint(start + opening + 1), end: attributePoint(end - 1) } };\n }\n }\n else diagnostics.push({ message: 'JSX expressions are not executed. Use string attributes or pass data from React.', offset: node.position?.start.offset });\n }\n node.inline = definition?.display === 'block' ? false : definition?.display === 'inline' ? true : node.type === 'mdxJsxTextElement';\n node.type = definition ? 'component' : 'html';\n node.attributes = attributes;\n if (Object.keys(attributeNodes).length) node.attributeNodes = attributeNodes;\n node.selection = definition?.selection ?? 'content';\n if (!definition && node.position) {\n node.value = context.source.slice(node.position.start.offset, node.position.end.offset);\n node.children = undefined;\n }\n } else if (node.type === 'containerDirective' || node.type === 'leafDirective' || node.type === 'textDirective') {\n const definition = directiveDefinitions.get(node.name ?? '');\n if (definition) {\n // Directive attributes have no mdast positions. Scan only their header,\n // respecting quoted values instead of searching the rendered title.\n const start = node.position?.start.offset ?? 0;\n const end = context.source.indexOf('\\n', start);\n const header = context.source.slice(start, end < 0 ? context.source.length : end);\n const brace = header.indexOf('{');\n if (brace >= 0) {\n const attributeNodes: Record<string, MarkdownNode> = {};\n const expression = /([^\\s{}=]+)\\s*=\\s*(?:\"((?:\\\\.|[^\"\\\\])*)\"|'((?:\\\\.|[^'\\\\])*)'|([^\\s}]+))/g;\n const raw = header.slice(brace + 1);\n for (const match of raw.matchAll(expression)) {\n const name = match[1], value = node.attributes?.[name];\n if (typeof value !== 'string') continue;\n const quoted = match[2] !== undefined || match[3] !== undefined;\n const valueLength = (match[2] ?? match[3] ?? match[4]).length;\n const valueEnd = start + brace + 1 + match.index! + match[0].length - (quoted ? 1 : 0);\n attributeNodes[name] = { type: 'text', value, position: { start: attributePoint(valueEnd - valueLength), end: attributePoint(valueEnd) } };\n }\n if (Object.keys(attributeNodes).length) node.attributeNodes = attributeNodes;\n }\n node.inline = node.type === 'textDirective';\n node.type = 'component';\n node.selection = definition.selection ?? 'content';\n }\n }\n });\n if (offset || prefix.length) root.position = { start: sourcePoint(offset, lines), end: sourcePoint(offset + fragment.length, lines) };\n for (const extension of extensions) {\n try { extension.transform?.(root, context); }\n catch (error) { diagnostics.push({ message: error instanceof Error ? error.message : String(error), extension: extension.name }); }\n }\n return { nodes: root.children ?? [], diagnostics, recoveryOffset };\n };\n}\n","import type { MarkdownNode, SourcePoint, SourceRange } from './types';\n\nexport function walk(node: MarkdownNode, visit: (node: MarkdownNode, parent?: MarkdownNode) => void, parent?: MarkdownNode): void {\n visit(node, parent);\n for (const child of node.children ?? []) walk(child, visit, node);\n}\nexport function textContent(node: MarkdownNode): string {\n if (node.type === 'image') return String(node.alt ?? '');\n return node.value ?? node.children?.map(textContent).join('') ?? '';\n}\nexport function rangeOf(node: MarkdownNode): SourceRange {\n return { start: node.position?.start.offset ?? 0, end: node.position?.end.offset ?? 0 };\n}\nexport function intersects(a: SourceRange, b: SourceRange): boolean { return a.start < b.end && b.start < a.end; }\nexport function lineStarts(source: string): number[] {\n const result = [0];\n for (let i = 0; i < source.length; i++) {\n if (source[i] === '\\r') { if (source[i + 1] === '\\n') i++; result.push(i + 1); }\n else if (source[i] === '\\n') result.push(i + 1);\n }\n return result;\n}\nexport function sourcePoint(offset: number, lines: readonly number[]): SourcePoint {\n let lo = 0, hi = lines.length;\n while (lo + 1 < hi) { const mid = (lo + hi) >>> 1; if (lines[mid] <= offset) lo = mid; else hi = mid; }\n return { offset, line: lo + 1, column: offset - lines[lo] + 1 };\n}\nexport function slugify(text: string): string {\n return text.toLowerCase().trim().replace(/[^\\p{L}\\p{N}\\s_-]/gu, '').replace(/[\\s_]+/g, '-').replace(/^-+|-+$/g, '') || 'section';\n}\nexport function safeUrl(value: unknown, image = false): string | undefined {\n if (typeof value !== 'string') return undefined;\n const normalized = value.trim().replace(/[\\u0000-\\u0020\\u007f]/g, '');\n if (/^(?:https?:|mailto:|tel:)/i.test(normalized) || !/^[a-z][a-z\\d+.-]*:/i.test(normalized)) return value;\n if (image && /^data:image\\/(?:png|gif|jpe?g|webp|avif);base64,/i.test(normalized)) return value;\n return undefined;\n}\n","import { createParser } from './parser';\nimport { lineStarts, rangeOf, slugify, textContent, walk } from './tree';\nimport type { Annotation, AnnotationOccurrence, Block, DocumentMetrics, DocumentOptions, DocumentSnapshot, Heading, MarkdownNode, SyntaxExtension } from './types';\n\nlet sequence = 0;\n\n/** A synchronous, DOM-free document session. React/scroll state never enters it. */\nexport class DocumentEngine {\n readonly id: string;\n private extensions: readonly SyntaxExtension[];\n private parse: ReturnType<typeof createParser>;\n private snapshot?: DocumentSnapshot;\n private nextBlock = 0;\n private listeners = new Set<() => void>();\n private definitionSignature = '';\n private recoveryOffset: number | undefined;\n\n constructor(source = '', options: DocumentOptions = {}) {\n this.id = options.id ?? `limr-${++sequence}`;\n this.extensions = options.extensions ?? [];\n this.parse = createParser(this.extensions);\n this.update(source, { streaming: options.streaming });\n }\n\n getSnapshot = (): DocumentSnapshot => this.snapshot!;\n subscribe = (listener: () => void): (() => void) => { this.listeners.add(listener); return () => this.listeners.delete(listener); };\n\n setExtensions(extensions: readonly SyntaxExtension[]): void {\n if (extensions === this.extensions) return;\n this.parse = createParser(extensions);\n this.extensions = extensions;\n const previous = this.snapshot!;\n this.update(previous.source, { streaming: previous.streaming }, true);\n }\n\n append(chunk: string): DocumentSnapshot { return this.update(this.snapshot!.source + chunk, { streaming: true }); }\n finish(): DocumentSnapshot { return this.update(this.snapshot!.source, { streaming: false }); }\n\n update(source: string, options: { streaming?: boolean } = {}, force = false): DocumentSnapshot {\n const previous = this.snapshot;\n const streaming = options.streaming ?? false;\n if (!force && previous?.source === source && previous.streaming === streaming) return previous;\n const globalTransform = this.extensions.some(ext => ext.transform && ext.scope !== 'local');\n const append = !force && previous?.streaming && source.startsWith(previous.source) && !globalTransform;\n const finalizing = !!previous?.streaming && !streaming;\n let start = append && streaming && previous.blocks.length ? previous.blocks[previous.blocks.length - 1].range.start : 0;\n const recovering = this.recoveryOffset !== undefined;\n if (append && recovering) start = Math.min(start, this.recoveryOffset!);\n let reason: DocumentMetrics['reason'] = force || globalTransform ? 'extension' : !previous ? 'initial' : finalizing ? 'finalize' : append ? 'append' : 'replace';\n const lines = start ? lineStarts(source) : [];\n const context = { source, streaming, documentId: this.id };\n let retained = start ? previous!.blocks.filter(block => block.range.end <= start) : [];\n const environment: string[] = [];\n for (const block of retained) walk(block.node, node => {\n if (node.type === 'definition' || node.type === 'footnoteDefinition') { const range = rangeOf(node); environment.push(source.slice(range.start, range.end)); }\n });\n let parsed = this.parse(source.slice(start), start, context, lines, environment.join('\\n\\n'));\n const getSignature = (nodes: readonly MarkdownNode[]) => {\n const entries: string[] = [];\n for (const node of nodes) walk(node, child => {\n if (child.type === 'definition' || child.type === 'footnoteDefinition') { const range = rangeOf(child); entries.push(source.slice(range.start, range.end)); }\n });\n return entries.join('\\u0000');\n };\n let signature = getSignature([...retained.map(block => block.node), ...parsed.nodes]);\n let parsedCharacters = source.length - start + environment.join('\\n\\n').length;\n const definitionsChanged = !!previous && signature !== this.definitionSignature;\n if (start && definitionsChanged) {\n reason = 'definitions';\n start = 0;\n retained = [];\n parsed = this.parse(source, 0, context, lines);\n signature = getSignature(parsed.nodes);\n parsedCharacters += source.length;\n }\n this.definitionSignature = signature;\n this.recoveryOffset = parsed.recoveryOffset;\n const oldAt = new Map(previous?.blocks.map(block => [block.range.start, block]));\n let reused = retained.length;\n const blocks: Block[] = [...retained];\n for (let index = 0; index < parsed.nodes.length; index++) {\n const node = parsed.nodes[index];\n const range = rangeOf(node);\n const old = oldAt.get(range.start);\n const pending = streaming && index === parsed.nodes.length - 1;\n // Definition changes can change semantic nodes without changing their raw text.\n const reusable = !definitionsChanged && !recovering && reason === 'append' && old && old.node.type === node.type && old.pending === pending && previous!.source.slice(old.range.start, old.range.end) === source.slice(range.start, range.end);\n if (reusable) { blocks.push(old); reused++; }\n else blocks.push({ id: old?.id ?? `${this.id}-b${++this.nextBlock}`, node, range, pending });\n }\n const headings: Heading[] = [];\n const definitions = new Map<string, MarkdownNode>();\n const footnotes = new Map<string, MarkdownNode>();\n const footnoteOrder: string[] = [];\n const annotations = new Map<string, Annotation>();\n const occurrences: AnnotationOccurrence[] = [];\n const slugCounts = new Map<string, number>();\n for (const block of blocks) walk(block.node, node => {\n if (node.type === 'heading') {\n const text = textContent(node);\n const base = slugify(text);\n const count = slugCounts.get(base) ?? 0;\n slugCounts.set(base, count + 1);\n headings.push({ id: `${this.id}-${base}${count ? `-${count}` : ''}`, text, level: Number(node.depth), range: rangeOf(node), blockId: block.id });\n }\n if (node.type === 'definition' && !definitions.has(String(node.identifier))) definitions.set(String(node.identifier), node);\n if (node.type === 'footnoteDefinition' && !footnotes.has(String(node.identifier))) footnotes.set(String(node.identifier), node);\n if (node.type === 'footnoteReference' && !footnoteOrder.includes(String(node.identifier))) footnoteOrder.push(String(node.identifier));\n if (node.type === 'annotationDefinition') {\n const annotation = node.annotation as Annotation;\n annotations.set(annotation.id, annotation);\n }\n if (node.type === 'annotationReference') {\n const range = rangeOf(node);\n occurrences.push({ id: `${this.id}-ref-${range.start}`, range, annotationIds: node.annotationIds as string[], embedded: true });\n }\n });\n this.snapshot = {\n id: this.id, revision: (previous?.revision ?? -1) + 1, source, streaming,\n blocks,\n headings: previous && headings.length === previous.headings.length && headings.every((heading, index) => {\n const old = previous.headings[index];\n return heading.id === old.id && heading.text === old.text && heading.level === old.level && heading.blockId === old.blockId && heading.range.start === old.range.start && heading.range.end === old.range.end;\n }) ? previous.headings : headings,\n definitions, footnotes, footnoteOrder, annotations: [...annotations.values()], occurrences,\n diagnostics: parsed.diagnostics,\n metrics: { parsedCharacters, reusedBlocks: reused, parsedBlocks: parsed.nodes.length, fullParse: start === 0, reason },\n };\n for (const listener of this.listeners) listener();\n return this.snapshot;\n }\n}\n\nexport function createDocument(source = '', options: DocumentOptions = {}): DocumentEngine { return new DocumentEngine(source, options); }\n\nexport function replaceExtension<T extends SyntaxExtension>(extensions: readonly T[], replacement: T): T[] {\n const exists = extensions.some(extension => extension.name === replacement.name);\n return exists ? extensions.map(extension => extension.name === replacement.name ? replacement : extension) : [...extensions, replacement];\n}\n","import { decodeString } from 'micromark-util-decode-string';\nimport { intersects, rangeOf } from './tree';\nimport type { DocumentSnapshot, MarkdownNode, SelectionResult, SelectionSnapshot, SourceRange } from './types';\n\nexport interface TextMapping { starts: readonly number[]; ends: readonly number[]; exact: boolean }\n\n/** Align decoded text to original source, retaining escape/entity/CRLF boundaries. */\nexport function mapText(source: string, value: string, range: SourceRange, options: { escapes?: boolean } = {}): TextMapping {\n const raw = source.slice(range.start, range.end);\n const starts: number[] = [], ends: number[] = [];\n let rendered = 0, exact = true;\n for (let at = 0; at < raw.length && rendered < value.length;) {\n let length = 1, decoded = raw[at];\n if (options.escapes !== false && raw[at] === '\\\\' && /[!\"#$%&'()*+,\\-./:;<=>?@[\\\\\\]^_`{|}~]/.test(raw[at + 1] ?? '')) { length = 2; decoded = raw[at + 1]; }\n else if (raw[at] === '&') {\n const entity = /^&(?:#x[\\da-f]+|#\\d+|[a-z][\\da-z]+);/i.exec(raw.slice(at));\n if (entity) { const result = decodeString(entity[0]); if (result !== entity[0]) { length = entity[0].length; decoded = result; } }\n } else if (raw[at] === '\\r') { length = raw[at + 1] === '\\n' ? 2 : 1; decoded = '\\n'; }\n if (value.startsWith(decoded, rendered)) {\n for (let unit = 0; unit < decoded.length; unit++) { starts.push(range.start + at); ends.push(range.start + at + length); }\n rendered += decoded.length;\n } else if (!/[\\s>]/.test(decoded)) exact = false;\n at += length;\n }\n if (rendered !== value.length) exact = false;\n while (starts.length < value.length) { starts.push(range.start); ends.push(range.end); }\n return { starts, ends, exact };\n}\n\nexport function selectionFromRange(document: DocumentSnapshot, raw: SourceRange, options: { text?: string; quality?: SelectionSnapshot['quality']; settled?: boolean } = {}): SelectionSnapshot {\n const initial = { start: Math.max(0, raw.start), end: Math.min(document.source.length, raw.end) };\n const syntax = { ...initial };\n const containers = new Set(['strong', 'emphasis', 'delete', 'link', 'linkReference', 'heading', 'listItem', 'blockquote']);\n const source = document.source;\n const whitespace = (start: number, end: number) => !source.slice(start, end).trim();\n // Walk boundary ancestors inside-out. Each edge absorbs only its adjacent\n // delimiter, never the unselected words inside an ancestor. Custom component\n // tags remain boundaries; their Markdown children still participate normally.\n function expand(node: MarkdownNode) {\n const range = rangeOf(node);\n if (!intersects(range, syntax) || range.start >= syntax.start && range.end <= syntax.end) return;\n node.children?.forEach(expand);\n let content: SourceRange | undefined;\n if (containers.has(node.type) && node.children?.length) {\n content = { start: rangeOf(node.children[0]).start, end: rangeOf(node.children.at(-1)!).end };\n } else if (node.type === 'inlineCode' || node.type === 'inlineMath') {\n const length = (node.type === 'inlineCode' ? /^`+/ : /^\\$+/).exec(source.slice(range.start, range.end))?.[0].length ?? 0;\n content = { start: range.start + length, end: range.end - length };\n } else if (node.type === 'code' || node.type === 'math') {\n const raw = source.slice(range.start, range.end);\n const opening = /^[ \\t]*(`{3,}|~{3,}|\\${2,})[^\\r\\n]*(?:\\r\\n|\\r|\\n)/.exec(raw);\n if (opening) {\n const fence = opening[1];\n const closing = /(?:\\r\\n|\\r|\\n)[ \\t]*(`+|~+|\\$+)[ \\t]*$/.exec(raw);\n const closed = closing && closing[1][0] === fence[0] && closing[1].length >= fence.length;\n content = { start: range.start + opening[0].length, end: closed ? range.start + closing.index : range.end };\n }\n }\n if (content) {\n if (syntax.start > range.start && syntax.start < range.end && (syntax.start <= content.start || whitespace(content.start, syntax.start))) syntax.start = range.start;\n if (syntax.end < range.end && syntax.end > range.start && (syntax.end >= content.end || whitespace(syntax.end, content.end))) syntax.end = range.end;\n }\n if (node.type === 'blockquote') {\n // Continuation lines have their own quote prefixes, independent of the\n // paragraph's first line. Do not consume earlier, unselected quote text.\n const line = Math.max(range.start, source.lastIndexOf('\\n', syntax.start - 1) + 1);\n if (/^[ \\t]*(?:>[ \\t]*)+$/.test(source.slice(line, syntax.start))) syntax.start = line;\n }\n }\n let lo = 0, hi = document.blocks.length;\n while (lo < hi) { const mid = (lo + hi) >>> 1; if (document.blocks[mid].range.end <= initial.start) lo = mid + 1; else hi = mid; }\n const selectedBlocks = [];\n for (let index = lo; index < document.blocks.length && document.blocks[index].range.start < initial.end; index++) {\n const block = document.blocks[index]; selectedBlocks.push(block); expand(block.node);\n }\n const blockRanges: SourceRange[] = [];\n const blockTypes = new Set(['paragraph', 'heading', 'code', 'math', 'table', 'listItem', 'thematicBreak', 'html']);\n function collect(node: MarkdownNode) {\n const range = rangeOf(node);\n if (!intersects(range, initial)) return;\n if (blockTypes.has(node.type) || node.type === 'component' && !node.inline) { blockRanges.push(range); return; }\n node.children?.forEach(collect);\n }\n selectedBlocks.forEach(block => collect(block.node));\n const result = (ranges: SourceRange[]): SelectionResult => ({ ranges, sourceText: ranges.map(range => document.source.slice(range.start, range.end)).join('\\n\\n') });\n return {\n documentId: document.id, revision: document.revision, text: options.text ?? document.source.slice(initial.start, initial.end),\n quality: options.quality ?? 'exact', settled: options.settled ?? true,\n raw: result([initial]), syntax: result([syntax]), blocks: result(blockRanges.length ? blockRanges : [initial]),\n };\n}\n","import type { Annotation, AnnotationAnchor, AnnotationOccurrence, DocumentSnapshot, HighlightData, MarkdownNode, SourceRange } from './types';\nimport { intersects, rangeOf } from './tree';\n\nexport const defaultHighlight: Readonly<HighlightData> = { color: '#F2C744', style: 'background' };\nexport const sameRange = (a: SourceRange, b: SourceRange) => a.start === b.start && a.end === b.end;\n\n/** Embedded references quote their nearest text block; keep the marker's own\n * range intact for source mapping, insertion and selection. */\nexport function annotationReferenceRange(document: DocumentSnapshot, occurrence: AnnotationOccurrence): SourceRange {\n if (!occurrence.embedded) return occurrence.range;\n let reference = occurrence.range;\n const visit = (node: MarkdownNode) => {\n const range = rangeOf(node);\n if (!intersects(range, occurrence.range)) return;\n if (['paragraph', 'heading', 'listItem', 'tableCell'].includes(node.type)) reference = range;\n node.children?.forEach(visit);\n };\n for (const block of document.blocks) if (intersects(block.range, occurrence.range)) visit(block.node);\n return reference;\n}\n\n/** Resolve persisted anchors once against the current source. */\nexport function resolveAnnotationAnchors(annotation: Annotation, document: DocumentSnapshot): AnnotationAnchor[] {\n return (annotation.anchors ?? (annotation.range ? [{ range: annotation.range }] : [])).flatMap(anchor => {\n if (anchor.documentId && anchor.documentId !== document.id) return [];\n let range = anchor.range;\n if (anchor.quote && document.source.slice(range.start, range.end) !== anchor.quote) {\n const start = document.source.indexOf(anchor.quote);\n if (start < 0 || document.source.indexOf(anchor.quote, start + 1) >= 0) return [];\n range = { start, end: start + anchor.quote.length };\n } else if (anchor.revision !== undefined && anchor.revision !== document.revision && !anchor.quote) return [];\n return range.start >= 0 && range.end <= document.source.length && range.start <= range.end ? [{ ...anchor, range }] : [];\n });\n}\n"],"mappings":"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","names":["raw"]}
|
package/dist/core/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { k as SourceRange, f as DocumentSnapshot, h as SelectionSnapshot, g as HighlightData, A as Annotation, a as AnnotationAnchor, M as MarkdownNode } from '../engine-43u8B4yt.js';
|
|
2
|
-
export {
|
|
1
|
+
import { k as SourceRange, f as DocumentSnapshot, h as SelectionSnapshot, b as AnnotationOccurrence, g as HighlightData, A as Annotation, a as AnnotationAnchor, M as MarkdownNode } from '../engine-43u8B4yt.js';
|
|
2
|
+
export { B as Block, D as Diagnostic, c as DocumentEngine, d as DocumentMetrics, e as DocumentOptions, H as Heading, P as ParseContext, R as Rect, S as SelectionResult, i as SourcePoint, j as SourcePosition, l as SyntaxExtension, m as createDocument, r as replaceExtension } from '../engine-43u8B4yt.js';
|
|
3
3
|
import 'micromark-util-types';
|
|
4
4
|
import 'mdast-util-from-markdown';
|
|
5
5
|
|
|
@@ -42,6 +42,9 @@ declare class ResourceCache<T = unknown> {
|
|
|
42
42
|
|
|
43
43
|
declare const defaultHighlight: Readonly<HighlightData>;
|
|
44
44
|
declare const sameRange: (a: SourceRange, b: SourceRange) => boolean;
|
|
45
|
+
/** Embedded references quote their nearest text block; keep the marker's own
|
|
46
|
+
* range intact for source mapping, insertion and selection. */
|
|
47
|
+
declare function annotationReferenceRange(document: DocumentSnapshot, occurrence: AnnotationOccurrence): SourceRange;
|
|
45
48
|
/** Resolve persisted anchors once against the current source. */
|
|
46
49
|
declare function resolveAnnotationAnchors(annotation: Annotation, document: DocumentSnapshot): AnnotationAnchor[];
|
|
47
50
|
|
|
@@ -51,4 +54,4 @@ declare function rangeOf(node: MarkdownNode): SourceRange;
|
|
|
51
54
|
declare function intersects(a: SourceRange, b: SourceRange): boolean;
|
|
52
55
|
declare function safeUrl(value: unknown, image?: boolean): string | undefined;
|
|
53
56
|
|
|
54
|
-
export { Annotation, AnnotationAnchor, DocumentSnapshot, HighlightData, LruCache, MarkdownNode, ResourceCache, SelectionSnapshot, SourceRange, type TextMapping, defaultHighlight, intersects, mapText, rangeOf, resolveAnnotationAnchors, safeUrl, sameRange, selectionFromRange, textContent, walk };
|
|
57
|
+
export { Annotation, AnnotationAnchor, AnnotationOccurrence, DocumentSnapshot, HighlightData, LruCache, MarkdownNode, ResourceCache, SelectionSnapshot, SourceRange, type TextMapping, annotationReferenceRange, defaultHighlight, intersects, mapText, rangeOf, resolveAnnotationAnchors, safeUrl, sameRange, selectionFromRange, textContent, walk };
|
package/dist/core/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
DocumentEngine,
|
|
3
|
+
annotationReferenceRange,
|
|
3
4
|
createDocument,
|
|
4
5
|
defaultHighlight,
|
|
5
6
|
intersects,
|
|
@@ -12,7 +13,7 @@ import {
|
|
|
12
13
|
selectionFromRange,
|
|
13
14
|
textContent,
|
|
14
15
|
walk
|
|
15
|
-
} from "../chunk-
|
|
16
|
+
} from "../chunk-TTISGBST.js";
|
|
16
17
|
import {
|
|
17
18
|
LruCache,
|
|
18
19
|
ResourceCache
|
|
@@ -21,6 +22,7 @@ export {
|
|
|
21
22
|
DocumentEngine,
|
|
22
23
|
LruCache,
|
|
23
24
|
ResourceCache,
|
|
25
|
+
annotationReferenceRange,
|
|
24
26
|
createDocument,
|
|
25
27
|
defaultHighlight,
|
|
26
28
|
intersects,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { N as NodeRenderer, f as AnnotationType, R as RendererExtension, i as MarkdownProps, S as SelectionAction } from '../translations-
|
|
2
|
-
export { n as TranslationMode, o as TranslationsOptions, t as translations } from '../translations-
|
|
1
|
+
import { N as NodeRenderer, f as AnnotationType, R as RendererExtension, i as MarkdownProps, S as SelectionAction } from '../translations-DHnYMg4h.js';
|
|
2
|
+
export { n as TranslationMode, o as TranslationsOptions, t as translations } from '../translations-DHnYMg4h.js';
|
|
3
3
|
import { KatexOptions } from 'katex';
|
|
4
4
|
import * as react from 'react';
|
|
5
5
|
import '../engine-43u8B4yt.js';
|
package/dist/extensions/index.js
CHANGED
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { A as Annotation, a as AnnotationAnchor, b as AnnotationOccurrence, B as Block, D as Diagnostic, c as DocumentEngine, d as DocumentMetrics, e as DocumentOptions, f as DocumentSnapshot, H as Heading, g as HighlightData, M as MarkdownNode, P as ParseContext, R as Rect, S as SelectionResult, h as SelectionSnapshot, i as SourcePoint, j as SourcePosition, k as SourceRange, l as SyntaxExtension, m as createDocument, r as replaceExtension } from './engine-43u8B4yt.js';
|
|
2
|
-
export { LruCache, ResourceCache, TextMapping, defaultHighlight, intersects, mapText, rangeOf, resolveAnnotationAnchors, safeUrl, sameRange, selectionFromRange, textContent, walk } from './core/index.js';
|
|
3
|
-
export { A as ActionContext, a as AnnotationContentProps, b as AnnotationExpansion, c as AnnotationOverlayCardProps, d as AnnotationPresentation, e as AnnotationSidebarPreviewProps, f as AnnotationType, D as DocumentCommands, g as DocumentProvider, h as DocumentProviderProps, L as LiMRLocale, M as Markdown, i as MarkdownProps, N as NodeRenderer, j as NodeRendererProps, R as RendererExtension, k as RendererParameters, S as SelectionAction, l as StyledProps, T as TextToken, m as ToolbarActionContext, n as TranslationMode, o as TranslationsOptions, V as ViewConfiguration, t as translations, u as useAnchor, p as useAnnotation, q as useAnnotationState, r as useAnnotations, s as useDocument, v as useDocumentSelector, w as useLiMR, x as
|
|
2
|
+
export { LruCache, ResourceCache, TextMapping, annotationReferenceRange, defaultHighlight, intersects, mapText, rangeOf, resolveAnnotationAnchors, safeUrl, sameRange, selectionFromRange, textContent, walk } from './core/index.js';
|
|
3
|
+
export { A as ActionContext, a as AnnotationContentProps, b as AnnotationExpansion, c as AnnotationOverlayCardProps, d as AnnotationPresentation, e as AnnotationSidebarPreviewProps, f as AnnotationType, D as DocumentCommands, g as DocumentProvider, h as DocumentProviderProps, L as LiMRLocale, M as Markdown, i as MarkdownProps, N as NodeRenderer, j as NodeRendererProps, R as RendererExtension, k as RendererParameters, S as SelectionAction, l as StyledProps, T as TextToken, m as ToolbarActionContext, n as TranslationMode, o as TranslationsOptions, V as ViewConfiguration, t as translations, u as useAnchor, p as useAnnotation, q as useAnnotationState, r as useAnnotations, s as useDocument, v as useDocumentSelector, w as useLiMR, x as useLocale, y as useRendererParameter, z as useSelection } from './translations-DHnYMg4h.js';
|
|
4
4
|
export { AnnotationCard, AnnotationCardProps, AnnotationContent, AnnotationGroup, AnnotationOverlay, AnnotationOverlayProps, AnnotationSidebar, AnnotationSidebarProps, InlineMarker, InlineMarkerProps, Reader, ReaderProps, SelectionToolbar, SelectionToolbarProps, SidebarItem, SidebarPositioner, TableOfContents, TableOfContentsProps, ToolIcon, ToolIconName, alignSidebar, chinese, english } from './react/index.js';
|
|
5
5
|
export { AnnotationMarkdown, BlockExtensionOptions, CitationData, CodeHighlightOptions, FiguresOptions, HighlightOptions, MathOptions, VideoOptions, citation, codeHighlight, copyText, defineAnnotation, defineBlock, defineExtension, definition, deleteAnnotations, extras, figures, gfm, highlightColors, highlightPalette, highlightSelection, math, preloadMath, question, standard, video } from './extensions/index.js';
|
|
6
6
|
import 'micromark-util-types';
|
package/dist/index.js
CHANGED
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
SelectionToolbar,
|
|
9
9
|
TableOfContents,
|
|
10
10
|
alignSidebar
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-N77VD2YR.js";
|
|
12
12
|
import {
|
|
13
13
|
AnnotationCard,
|
|
14
14
|
AnnotationMarkdown,
|
|
@@ -44,12 +44,14 @@ import {
|
|
|
44
44
|
useDocument,
|
|
45
45
|
useDocumentSelector,
|
|
46
46
|
useLiMR,
|
|
47
|
+
useLocale,
|
|
47
48
|
useRendererParameter,
|
|
48
49
|
useSelection,
|
|
49
50
|
video
|
|
50
|
-
} from "./chunk-
|
|
51
|
+
} from "./chunk-3ILUZKDB.js";
|
|
51
52
|
import {
|
|
52
53
|
DocumentEngine,
|
|
54
|
+
annotationReferenceRange,
|
|
53
55
|
createDocument,
|
|
54
56
|
defaultHighlight,
|
|
55
57
|
intersects,
|
|
@@ -62,7 +64,7 @@ import {
|
|
|
62
64
|
selectionFromRange,
|
|
63
65
|
textContent,
|
|
64
66
|
walk
|
|
65
|
-
} from "./chunk-
|
|
67
|
+
} from "./chunk-TTISGBST.js";
|
|
66
68
|
import {
|
|
67
69
|
LruCache,
|
|
68
70
|
ResourceCache
|
|
@@ -85,6 +87,7 @@ export {
|
|
|
85
87
|
TableOfContents,
|
|
86
88
|
ToolIcon,
|
|
87
89
|
alignSidebar,
|
|
90
|
+
annotationReferenceRange,
|
|
88
91
|
chinese,
|
|
89
92
|
citation,
|
|
90
93
|
codeHighlight,
|
|
@@ -124,6 +127,7 @@ export {
|
|
|
124
127
|
useDocument,
|
|
125
128
|
useDocumentSelector,
|
|
126
129
|
useLiMR,
|
|
130
|
+
useLocale,
|
|
127
131
|
useRendererParameter,
|
|
128
132
|
useSelection,
|
|
129
133
|
video,
|
package/dist/react/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { L as LiMRLocale, h as DocumentProviderProps, l as StyledProps, S as SelectionAction, c as AnnotationOverlayCardProps, d as AnnotationPresentation, A as ActionContext } from '../translations-
|
|
2
|
-
export { a as AnnotationContentProps, b as AnnotationExpansion, e as AnnotationSidebarPreviewProps, f as AnnotationType, D as DocumentCommands, g as DocumentProvider, M as Markdown, i as MarkdownProps, N as NodeRenderer, j as NodeRendererProps, R as RendererExtension, k as RendererParameters, T as TextToken, m as ToolbarActionContext, V as ViewConfiguration, u as useAnchor, p as useAnnotation, q as useAnnotationState, r as useAnnotations, s as useDocument, v as useDocumentSelector, w as useLiMR, x as
|
|
1
|
+
import { L as LiMRLocale, h as DocumentProviderProps, l as StyledProps, S as SelectionAction, c as AnnotationOverlayCardProps, d as AnnotationPresentation, A as ActionContext } from '../translations-DHnYMg4h.js';
|
|
2
|
+
export { a as AnnotationContentProps, b as AnnotationExpansion, e as AnnotationSidebarPreviewProps, f as AnnotationType, D as DocumentCommands, g as DocumentProvider, M as Markdown, i as MarkdownProps, N as NodeRenderer, j as NodeRendererProps, R as RendererExtension, k as RendererParameters, T as TextToken, m as ToolbarActionContext, V as ViewConfiguration, u as useAnchor, p as useAnnotation, q as useAnnotationState, r as useAnnotations, s as useDocument, v as useDocumentSelector, w as useLiMR, x as useLocale, y as useRendererParameter, z as useSelection } from '../translations-DHnYMg4h.js';
|
|
3
3
|
import * as react from 'react';
|
|
4
4
|
import { ReactNode, SVGProps, ButtonHTMLAttributes } from 'react';
|
|
5
5
|
import { b as AnnotationOccurrence } from '../engine-43u8B4yt.js';
|
|
@@ -29,7 +29,7 @@ interface TableOfContentsProps extends StyledProps {
|
|
|
29
29
|
}
|
|
30
30
|
declare function TableOfContents({ title, maxDepth, followActive, topInset, updateHash, className, style }: TableOfContentsProps): react.JSX.Element;
|
|
31
31
|
|
|
32
|
-
/** anchorTop is the first
|
|
32
|
+
/** anchorTop is the first referenced text line, falling back to the marker. */
|
|
33
33
|
interface SidebarItem {
|
|
34
34
|
id: string;
|
|
35
35
|
anchorTop: number;
|
|
@@ -39,6 +39,7 @@ type SidebarPositioner = (items: readonly SidebarItem[], context: {
|
|
|
39
39
|
activeId: string | null;
|
|
40
40
|
gap: number;
|
|
41
41
|
height?: number;
|
|
42
|
+
prioritizeActive?: boolean;
|
|
42
43
|
}) => ReadonlyMap<string, number>;
|
|
43
44
|
declare const alignSidebar: SidebarPositioner;
|
|
44
45
|
interface AnnotationSidebarProps extends StyledProps {
|
package/dist/react/index.js
CHANGED
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
SelectionToolbar,
|
|
8
8
|
TableOfContents,
|
|
9
9
|
alignSidebar
|
|
10
|
-
} from "../chunk-
|
|
10
|
+
} from "../chunk-N77VD2YR.js";
|
|
11
11
|
import {
|
|
12
12
|
AnnotationCard,
|
|
13
13
|
DocumentProvider,
|
|
@@ -23,10 +23,11 @@ import {
|
|
|
23
23
|
useDocument,
|
|
24
24
|
useDocumentSelector,
|
|
25
25
|
useLiMR,
|
|
26
|
+
useLocale,
|
|
26
27
|
useRendererParameter,
|
|
27
28
|
useSelection
|
|
28
|
-
} from "../chunk-
|
|
29
|
-
import "../chunk-
|
|
29
|
+
} from "../chunk-3ILUZKDB.js";
|
|
30
|
+
import "../chunk-TTISGBST.js";
|
|
30
31
|
import "../chunk-6N6TFHEN.js";
|
|
31
32
|
export {
|
|
32
33
|
AnnotationCard,
|
|
@@ -51,6 +52,7 @@ export {
|
|
|
51
52
|
useDocument,
|
|
52
53
|
useDocumentSelector,
|
|
53
54
|
useLiMR,
|
|
55
|
+
useLocale,
|
|
54
56
|
useRendererParameter,
|
|
55
57
|
useSelection
|
|
56
58
|
};
|
package/dist/styles.css
CHANGED
|
@@ -82,6 +82,7 @@
|
|
|
82
82
|
.limr-highlight[data-hidden] { background: transparent; text-decoration: none; }
|
|
83
83
|
.limr-paint-background { background: color-mix(in srgb, var(--limr-highlight) 30%, transparent); }
|
|
84
84
|
.limr-paint-background:is([data-hovered],[data-active]) { background: color-mix(in srgb, var(--limr-highlight) 48%, transparent); }
|
|
85
|
+
.limr-paint-background[data-reference] { background: color-mix(in srgb, var(--limr-highlight) 18%, transparent); }
|
|
85
86
|
.limr-highlight-layer .limr-paint-rect:is([data-hovered],[data-active]):not(.limr-paint-background) { background-color: color-mix(in srgb, var(--limr-highlight) 14%, transparent); }
|
|
86
87
|
.limr-highlight { cursor: pointer; }
|
|
87
88
|
.limr-paint-selection { background: var(--limr-selection, #667eea4d); z-index: 1; }
|
|
@@ -318,9 +319,9 @@
|
|
|
318
319
|
.limr-sidebar-card { color: var(--limr-annotation-text, var(--limr-text, #1a1a1a)); min-width: 0; transition: top var(--limr-motion-slow) var(--limr-ease), border-color var(--limr-motion) var(--limr-ease), background-color var(--limr-motion) var(--limr-ease); }
|
|
319
320
|
.limr-sidebar-card:not([data-default-card]),.limr-sidebar-card-body { border-inline-start: 2px solid var(--limr-annotation-border, var(--limr-annotation-color, var(--limr-border-strong, #d5d0c8))); background: var(--limr-background, #fffefa); padding: var(--limr-sidebar-padding-block, .65rem) var(--limr-sidebar-padding-inline, 10px) calc(var(--limr-sidebar-padding-block, .65rem) + 2px); }
|
|
320
321
|
.limr-sidebar-card[data-locked] { z-index: 1; transition-property: border-color, background-color; }
|
|
321
|
-
.limr-sidebar[data-resizing] > .limr-sidebar-card { transition-property: border-color, background-color; }
|
|
322
|
+
.limr-sidebar:is([data-resizing],[data-releasing]) > .limr-sidebar-card { transition-property: border-color, background-color; }
|
|
322
323
|
.limr-sidebar-card[data-default-card] { display: flex; flex-direction: column; }
|
|
323
|
-
.limr-sidebar-card[data-default-card]
|
|
324
|
+
.limr-sidebar-card[data-default-card] { max-height: var(--limr-sidebar-card-height, none); }
|
|
324
325
|
.limr-sidebar-card-body { display: flex; flex-direction: column; min-height: 0; transition: border-color var(--limr-motion) var(--limr-ease), background-color var(--limr-motion) var(--limr-ease); }
|
|
325
326
|
.limr-sidebar-card-body > .limr-collapse { min-height: 0; }
|
|
326
327
|
/* Preview and details trade height; fading both can leave a blank card when
|
|
@@ -408,11 +409,12 @@
|
|
|
408
409
|
.limr-tool-icon :where(*) { max-inline-size: 100% !important; max-block-size: 100% !important; min-inline-size: 0 !important; min-block-size: 0 !important; }
|
|
409
410
|
.limr-tool-icon :where(svg,img) { display: block; width: 100% !important; height: 100% !important; object-fit: contain; flex: none; }
|
|
410
411
|
.limr-tool-icon :where(div,span,i,b,strong,em) { display: inline-flex; align-items: center; justify-content: center; font-size: inherit !important; line-height: 1 !important; }
|
|
411
|
-
|
|
412
|
+
/* Only the actions determine toolbar width. Panel contents cannot enlarge it. */
|
|
413
|
+
.limr-toolbar-panel { display: flex; contain: inline-size; min-width: 0; min-height: 0; align-self: stretch; max-height: var(--limr-toolbar-panel-height, 260px); overflow: hidden; text-align: start; margin-top: 4px; border-top: 1px solid var(--limr-toolbar-border, var(--limr-border, #e5e2dc)); animation: limr-tool-float 300ms cubic-bezier(.16,1,.3,1) both, limr-tool-fade 220ms ease 35ms both; }
|
|
412
414
|
.limr-toolbar-panel .limr-overlay-content { padding: 10px 9px 4px; scroll-padding-block: 8px; }
|
|
413
|
-
.limr-toolbar-panel .limr-overlay-scroll
|
|
415
|
+
.limr-toolbar-panel .limr-overlay-scroll { width: 100%; min-width: 0; }
|
|
416
|
+
.limr-toolbar-panel .limr-overlay-scroll-inner { width: 100%; min-width: 0; overflow-wrap: anywhere; }
|
|
414
417
|
.limr-toolbar-panel :where(input,textarea,select,img) { max-width: 100%; }
|
|
415
|
-
.limr-selection-toolbar[data-expanded] .limr-toolbar-surface { min-width: min(calc(var(--limr-toolbar-panel-width, 246px) + 30px), calc(100vw - 20px)); }
|
|
416
418
|
[data-placement^='top'] .limr-toolbar-panel { order: -1; border-top: 0; border-bottom: 1px solid var(--limr-toolbar-border, var(--limr-border, #e5e2dc)); margin-top: 0; margin-bottom: 4px; }
|
|
417
419
|
.limr-toolbar-swatch { position: relative; width: 24px; height: 24px; margin: 3px 12px 3px 5px; padding: 0; border: 1px solid color-mix(in srgb, var(--swatch) 60%, transparent); border-radius: var(--limr-toolbar-swatch-radius, 4px); background: color-mix(in srgb, var(--swatch) 30%, transparent); transition: scale 240ms var(--limr-ease); --limr-highlight: var(--swatch); }
|
|
418
420
|
.limr-toolbar-swatch:hover { scale: 1.07; }
|
|
@@ -429,8 +431,9 @@
|
|
|
429
431
|
.limr-color-swatch[aria-pressed='true'] { outline-color: var(--swatch); }
|
|
430
432
|
.limr-color-swatch svg { width: 15px; height: 15px; color: var(--limr-text, #3d3a36); opacity: 0; }
|
|
431
433
|
.limr-color-swatch[aria-pressed='true'] svg { opacity: 1; }
|
|
432
|
-
.limr-highlight-styles { display:
|
|
433
|
-
.limr-highlight-styles button { display: flex; flex-direction: column; align-items: center; gap: 4px; padding: 6px
|
|
434
|
+
.limr-highlight-styles { display: flex; flex-wrap: wrap; justify-content: flex-start; align-items: flex-start; gap: 5px; }
|
|
435
|
+
.limr-highlight-styles button { display: flex; flex: 0 0 auto; min-width: 48px; flex-direction: column; align-items: center; gap: 4px; padding: 6px 8px; border: 1px solid transparent; border-radius: 4px; background: transparent; font-size: 11px; white-space: nowrap; }
|
|
436
|
+
.limr-highlight-style-label { text-align: center; }
|
|
434
437
|
.limr-highlight-styles button svg { width: 21px; height: 21px; }
|
|
435
438
|
.limr-highlight-styles [aria-pressed='true'] { color: var(--limr-toolbar-accent, var(--limr-accent, #8a7865)); border-color: currentColor; }
|
|
436
439
|
.limr-action-error { display: block; max-width: 300px; padding: .5rem; color: #b45858; }
|
|
@@ -69,9 +69,12 @@ interface AnnotationOverlayCardProps<T = unknown> {
|
|
|
69
69
|
}
|
|
70
70
|
interface AnnotationType<T = unknown> {
|
|
71
71
|
type: string;
|
|
72
|
-
|
|
72
|
+
/** Resolve labels from the reader locale without recreating the plugin. */
|
|
73
|
+
label: string | ((locale: LiMRLocale) => string);
|
|
73
74
|
icon?: ReactNode | ComponentType;
|
|
74
75
|
color?: string;
|
|
76
|
+
/** Highlight referenced text in the marker color while hovered or active. */
|
|
77
|
+
highlight?: 'hover' | false;
|
|
75
78
|
Content?: ComponentType<AnnotationContentProps<T>>;
|
|
76
79
|
Marker?: ComponentType<{
|
|
77
80
|
annotation: Annotation<T>;
|
|
@@ -119,7 +122,8 @@ interface RendererExtension extends SyntaxExtension {
|
|
|
119
122
|
interface RendererParameters {
|
|
120
123
|
}
|
|
121
124
|
interface DocumentCommands {
|
|
122
|
-
/** Content annotations get a shared highlight unless
|
|
125
|
+
/** Content annotations get a shared highlight unless disabled or their type
|
|
126
|
+
* uses hover highlighting. An explicit appearance still creates a saved highlight. */
|
|
123
127
|
addAnnotation: (annotation: Annotation, options?: {
|
|
124
128
|
highlight?: HighlightData | false;
|
|
125
129
|
edit?: boolean;
|
|
@@ -172,6 +176,9 @@ interface SelectionAction {
|
|
|
172
176
|
render?: (context: ToolbarActionContext) => ReactNode;
|
|
173
177
|
}
|
|
174
178
|
interface LiMRLocale {
|
|
179
|
+
/** Optional language tag for plugin-owned translations. */
|
|
180
|
+
language?: string;
|
|
181
|
+
citation?: string;
|
|
175
182
|
contents: string;
|
|
176
183
|
annotations: string;
|
|
177
184
|
expand: string;
|
|
@@ -252,6 +259,7 @@ declare function useRendererParameter<K extends keyof RendererParameters>(name:
|
|
|
252
259
|
declare function useDocument(): DocumentSnapshot;
|
|
253
260
|
declare function useDocumentSelector<R>(select: (snapshot: DocumentSnapshot) => R): R;
|
|
254
261
|
declare function useSelection(): SelectionSnapshot | null;
|
|
262
|
+
declare function useLocale(): LiMRLocale;
|
|
255
263
|
declare function useAnnotation(id: string): Annotation | undefined;
|
|
256
264
|
declare function useAnnotations(): {
|
|
257
265
|
annotations: ReadonlyMap<string, Annotation<unknown>>;
|
|
@@ -307,4 +315,4 @@ declare module '@linloir/limr' {
|
|
|
307
315
|
}
|
|
308
316
|
declare function translations(options?: TranslationsOptions): RendererExtension;
|
|
309
317
|
|
|
310
|
-
export { type ActionContext as A, type DocumentCommands as D, type LiMRLocale as L, Markdown as M, type NodeRenderer as N, type RendererExtension as R, type SelectionAction as S, type TextToken as T, type ViewConfiguration as V, type AnnotationContentProps as a, type AnnotationExpansion as b, type AnnotationOverlayCardProps as c, type AnnotationPresentation as d, type AnnotationSidebarPreviewProps as e, type AnnotationType as f, DocumentProvider as g, type DocumentProviderProps as h, type MarkdownProps as i, type NodeRendererProps as j, type RendererParameters as k, type StyledProps as l, type ToolbarActionContext as m, type TranslationMode as n, type TranslationsOptions as o, useAnnotation as p, useAnnotationState as q, useAnnotations as r, useDocument as s, translations as t, useAnchor as u, useDocumentSelector as v, useLiMR as w,
|
|
318
|
+
export { type ActionContext as A, type DocumentCommands as D, type LiMRLocale as L, Markdown as M, type NodeRenderer as N, type RendererExtension as R, type SelectionAction as S, type TextToken as T, type ViewConfiguration as V, type AnnotationContentProps as a, type AnnotationExpansion as b, type AnnotationOverlayCardProps as c, type AnnotationPresentation as d, type AnnotationSidebarPreviewProps as e, type AnnotationType as f, DocumentProvider as g, type DocumentProviderProps as h, type MarkdownProps as i, type NodeRendererProps as j, type RendererParameters as k, type StyledProps as l, type ToolbarActionContext as m, type TranslationMode as n, type TranslationsOptions as o, useAnnotation as p, useAnnotationState as q, useAnnotations as r, useDocument as s, translations as t, useAnchor as u, useDocumentSelector as v, useLiMR as w, useLocale as x, useRendererParameter as y, useSelection as z };
|
package/docs/README.md
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# LiMR 文档 / Documentation
|
|
2
|
+
|
|
3
|
+
[简体中文](zh-CN/README.md) · [English](en/README.md)
|
|
4
|
+
|
|
5
|
+
文档按阅读、接入与扩展开发场景组织;两种语言使用相同的文件结构,每页顶部可以切换语言。
|
|
6
|
+
|
|
7
|
+
Documentation is organized around writing content, integrating LiMR, and developing extensions. Both languages use the same file structure, with a language switch on each page.
|
|
8
|
+
|
|
9
|
+
- [中文入门](zh-CN/getting-started.md) / [Getting started](en/getting-started.md)
|
|
10
|
+
- [默认语法](zh-CN/syntax.md) / [Default syntax](en/syntax.md)
|
|
11
|
+
- [AI Skills 下载与导入](zh-CN/ai-skills.md) / [Download and install AI Skills](en/ai-skills.md)
|
|
12
|
+
|
|
13
|
+
[项目首页](../README.md) · [Project overview](../README.en.md)
|