@pre-markdown/layout 0.2.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/LICENSE +21 -0
- package/dist/index.cjs +1365 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +660 -0
- package/dist/index.d.ts +660 -0
- package/dist/index.js +1348 -0
- package/dist/index.js.map +1 -0
- package/dist/worker-script.js +1867 -0
- package/dist/worker-script.js.map +1 -0
- package/package.json +47 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../node_modules/.pnpm/@chenglou+pretext@0.0.4/node_modules/@chenglou/pretext/dist/bidi.js","../../../node_modules/.pnpm/@chenglou+pretext@0.0.4/node_modules/@chenglou/pretext/dist/analysis.js","../../../node_modules/.pnpm/@chenglou+pretext@0.0.4/node_modules/@chenglou/pretext/dist/measurement.js","../../../node_modules/.pnpm/@chenglou+pretext@0.0.4/node_modules/@chenglou/pretext/dist/layout.js","../src/worker-script.ts"],"sourcesContent":["// Simplified bidi metadata helper for the rich prepareWithSegments() path,\n// forked from pdf.js via Sebastian's text-layout. It classifies characters\n// into bidi types, computes embedding levels, and maps them onto prepared\n// segments for custom rendering. The line-breaking engine does not consume\n// these levels.\nconst baseTypes = [\n 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'S', 'B', 'S', 'WS',\n 'B', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN',\n 'BN', 'BN', 'B', 'B', 'B', 'S', 'WS', 'ON', 'ON', 'ET', 'ET', 'ET', 'ON',\n 'ON', 'ON', 'ON', 'ON', 'ON', 'CS', 'ON', 'CS', 'ON', 'EN', 'EN', 'EN',\n 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'ON', 'ON', 'ON', 'ON', 'ON',\n 'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',\n 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'ON', 'ON',\n 'ON', 'ON', 'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',\n 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',\n 'L', 'ON', 'ON', 'ON', 'ON', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'B', 'BN',\n 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN',\n 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN',\n 'BN', 'CS', 'ON', 'ET', 'ET', 'ET', 'ET', 'ON', 'ON', 'ON', 'ON', 'L', 'ON',\n 'ON', 'ON', 'ON', 'ON', 'ET', 'ET', 'EN', 'EN', 'ON', 'L', 'ON', 'ON', 'ON',\n 'EN', 'L', 'ON', 'ON', 'ON', 'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L',\n 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',\n 'L', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',\n 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',\n 'L', 'L', 'L', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L'\n];\nconst arabicTypes = [\n 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',\n 'CS', 'AL', 'ON', 'ON', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'AL',\n 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',\n 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',\n 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',\n 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',\n 'AL', 'AL', 'AL', 'AL', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM',\n 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'AL', 'AL', 'AL', 'AL',\n 'AL', 'AL', 'AL', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN',\n 'AN', 'ET', 'AN', 'AN', 'AL', 'AL', 'AL', 'NSM', 'AL', 'AL', 'AL', 'AL',\n 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',\n 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',\n 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',\n 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',\n 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',\n 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',\n 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',\n 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',\n 'AL', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM',\n 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'ON', 'NSM',\n 'NSM', 'NSM', 'NSM', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',\n 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL'\n];\nfunction classifyChar(charCode) {\n if (charCode <= 0x00ff)\n return baseTypes[charCode];\n if (0x0590 <= charCode && charCode <= 0x05f4)\n return 'R';\n if (0x0600 <= charCode && charCode <= 0x06ff)\n return arabicTypes[charCode & 0xff];\n if (0x0700 <= charCode && charCode <= 0x08AC)\n return 'AL';\n return 'L';\n}\nfunction computeBidiLevels(str) {\n const len = str.length;\n if (len === 0)\n return null;\n // eslint-disable-next-line unicorn/no-new-array\n const types = new Array(len);\n let numBidi = 0;\n for (let i = 0; i < len; i++) {\n const t = classifyChar(str.charCodeAt(i));\n if (t === 'R' || t === 'AL' || t === 'AN')\n numBidi++;\n types[i] = t;\n }\n if (numBidi === 0)\n return null;\n const startLevel = (len / numBidi) < 0.3 ? 0 : 1;\n const levels = new Int8Array(len);\n for (let i = 0; i < len; i++)\n levels[i] = startLevel;\n const e = (startLevel & 1) ? 'R' : 'L';\n const sor = e;\n // W1-W7\n let lastType = sor;\n for (let i = 0; i < len; i++) {\n if (types[i] === 'NSM')\n types[i] = lastType;\n else\n lastType = types[i];\n }\n lastType = sor;\n for (let i = 0; i < len; i++) {\n const t = types[i];\n if (t === 'EN')\n types[i] = lastType === 'AL' ? 'AN' : 'EN';\n else if (t === 'R' || t === 'L' || t === 'AL')\n lastType = t;\n }\n for (let i = 0; i < len; i++) {\n if (types[i] === 'AL')\n types[i] = 'R';\n }\n for (let i = 1; i < len - 1; i++) {\n if (types[i] === 'ES' && types[i - 1] === 'EN' && types[i + 1] === 'EN') {\n types[i] = 'EN';\n }\n if (types[i] === 'CS' &&\n (types[i - 1] === 'EN' || types[i - 1] === 'AN') &&\n types[i + 1] === types[i - 1]) {\n types[i] = types[i - 1];\n }\n }\n for (let i = 0; i < len; i++) {\n if (types[i] !== 'EN')\n continue;\n let j;\n for (j = i - 1; j >= 0 && types[j] === 'ET'; j--)\n types[j] = 'EN';\n for (j = i + 1; j < len && types[j] === 'ET'; j++)\n types[j] = 'EN';\n }\n for (let i = 0; i < len; i++) {\n const t = types[i];\n if (t === 'WS' || t === 'ES' || t === 'ET' || t === 'CS')\n types[i] = 'ON';\n }\n lastType = sor;\n for (let i = 0; i < len; i++) {\n const t = types[i];\n if (t === 'EN')\n types[i] = lastType === 'L' ? 'L' : 'EN';\n else if (t === 'R' || t === 'L')\n lastType = t;\n }\n // N1-N2\n for (let i = 0; i < len; i++) {\n if (types[i] !== 'ON')\n continue;\n let end = i + 1;\n while (end < len && types[end] === 'ON')\n end++;\n const before = i > 0 ? types[i - 1] : sor;\n const after = end < len ? types[end] : sor;\n const bDir = before !== 'L' ? 'R' : 'L';\n const aDir = after !== 'L' ? 'R' : 'L';\n if (bDir === aDir) {\n for (let j = i; j < end; j++)\n types[j] = bDir;\n }\n i = end - 1;\n }\n for (let i = 0; i < len; i++) {\n if (types[i] === 'ON')\n types[i] = e;\n }\n // I1-I2\n for (let i = 0; i < len; i++) {\n const t = types[i];\n if ((levels[i] & 1) === 0) {\n if (t === 'R')\n levels[i]++;\n else if (t === 'AN' || t === 'EN')\n levels[i] += 2;\n }\n else if (t === 'L' || t === 'AN' || t === 'EN') {\n levels[i]++;\n }\n }\n return levels;\n}\nexport function computeSegmentLevels(normalized, segStarts) {\n const bidiLevels = computeBidiLevels(normalized);\n if (bidiLevels === null)\n return null;\n const segLevels = new Int8Array(segStarts.length);\n for (let i = 0; i < segStarts.length; i++) {\n segLevels[i] = bidiLevels[segStarts[i]];\n }\n return segLevels;\n}\n","const collapsibleWhitespaceRunRe = /[ \\t\\n\\r\\f]+/g;\nconst needsWhitespaceNormalizationRe = /[\\t\\n\\r\\f]| {2,}|^ | $/;\nfunction getWhiteSpaceProfile(whiteSpace) {\n const mode = whiteSpace ?? 'normal';\n return mode === 'pre-wrap'\n ? { mode, preserveOrdinarySpaces: true, preserveHardBreaks: true }\n : { mode, preserveOrdinarySpaces: false, preserveHardBreaks: false };\n}\nexport function normalizeWhitespaceNormal(text) {\n if (!needsWhitespaceNormalizationRe.test(text))\n return text;\n let normalized = text.replace(collapsibleWhitespaceRunRe, ' ');\n if (normalized.charCodeAt(0) === 0x20) {\n normalized = normalized.slice(1);\n }\n if (normalized.length > 0 && normalized.charCodeAt(normalized.length - 1) === 0x20) {\n normalized = normalized.slice(0, -1);\n }\n return normalized;\n}\nfunction normalizeWhitespacePreWrap(text) {\n if (!/[\\r\\f]/.test(text))\n return text.replace(/\\r\\n/g, '\\n');\n return text\n .replace(/\\r\\n/g, '\\n')\n .replace(/[\\r\\f]/g, '\\n');\n}\nlet sharedWordSegmenter = null;\nlet segmenterLocale;\nfunction getSharedWordSegmenter() {\n if (sharedWordSegmenter === null) {\n sharedWordSegmenter = new Intl.Segmenter(segmenterLocale, { granularity: 'word' });\n }\n return sharedWordSegmenter;\n}\nexport function clearAnalysisCaches() {\n sharedWordSegmenter = null;\n}\nexport function setAnalysisLocale(locale) {\n const nextLocale = locale && locale.length > 0 ? locale : undefined;\n if (segmenterLocale === nextLocale)\n return;\n segmenterLocale = nextLocale;\n sharedWordSegmenter = null;\n}\nconst arabicScriptRe = /\\p{Script=Arabic}/u;\nconst combiningMarkRe = /\\p{M}/u;\nconst decimalDigitRe = /\\p{Nd}/u;\nfunction containsArabicScript(text) {\n return arabicScriptRe.test(text);\n}\nexport function isCJK(s) {\n for (const ch of s) {\n const c = ch.codePointAt(0);\n if ((c >= 0x4E00 && c <= 0x9FFF) ||\n (c >= 0x3400 && c <= 0x4DBF) ||\n (c >= 0x20000 && c <= 0x2A6DF) ||\n (c >= 0x2A700 && c <= 0x2B73F) ||\n (c >= 0x2B740 && c <= 0x2B81F) ||\n (c >= 0x2B820 && c <= 0x2CEAF) ||\n (c >= 0x2CEB0 && c <= 0x2EBEF) ||\n (c >= 0x30000 && c <= 0x3134F) ||\n (c >= 0xF900 && c <= 0xFAFF) ||\n (c >= 0x2F800 && c <= 0x2FA1F) ||\n (c >= 0x3000 && c <= 0x303F) ||\n (c >= 0x3040 && c <= 0x309F) ||\n (c >= 0x30A0 && c <= 0x30FF) ||\n (c >= 0xAC00 && c <= 0xD7AF) ||\n (c >= 0xFF00 && c <= 0xFFEF)) {\n return true;\n }\n }\n return false;\n}\nexport const kinsokuStart = new Set([\n '\\uFF0C',\n '\\uFF0E',\n '\\uFF01',\n '\\uFF1A',\n '\\uFF1B',\n '\\uFF1F',\n '\\u3001',\n '\\u3002',\n '\\u30FB',\n '\\uFF09',\n '\\u3015',\n '\\u3009',\n '\\u300B',\n '\\u300D',\n '\\u300F',\n '\\u3011',\n '\\u3017',\n '\\u3019',\n '\\u301B',\n '\\u30FC',\n '\\u3005',\n '\\u303B',\n '\\u309D',\n '\\u309E',\n '\\u30FD',\n '\\u30FE',\n]);\nexport const kinsokuEnd = new Set([\n '\"',\n '(', '[', '{',\n '“', '‘', '«', '‹',\n '\\uFF08',\n '\\u3014',\n '\\u3008',\n '\\u300A',\n '\\u300C',\n '\\u300E',\n '\\u3010',\n '\\u3016',\n '\\u3018',\n '\\u301A',\n]);\nconst forwardStickyGlue = new Set([\n \"'\", '’',\n]);\nexport const leftStickyPunctuation = new Set([\n '.', ',', '!', '?', ':', ';',\n '\\u060C',\n '\\u061B',\n '\\u061F',\n '\\u0964',\n '\\u0965',\n '\\u104A',\n '\\u104B',\n '\\u104C',\n '\\u104D',\n '\\u104F',\n ')', ']', '}',\n '%',\n '\"',\n '”', '’', '»', '›',\n '…',\n]);\nconst arabicNoSpaceTrailingPunctuation = new Set([\n ':',\n '.',\n '\\u060C',\n '\\u061B',\n]);\nconst myanmarMedialGlue = new Set([\n '\\u104F',\n]);\nconst closingQuoteChars = new Set([\n '”', '’', '»', '›',\n '\\u300D',\n '\\u300F',\n '\\u3011',\n '\\u300B',\n '\\u3009',\n '\\u3015',\n '\\uFF09',\n]);\nfunction isLeftStickyPunctuationSegment(segment) {\n if (isEscapedQuoteClusterSegment(segment))\n return true;\n let sawPunctuation = false;\n for (const ch of segment) {\n if (leftStickyPunctuation.has(ch)) {\n sawPunctuation = true;\n continue;\n }\n if (sawPunctuation && combiningMarkRe.test(ch))\n continue;\n return false;\n }\n return sawPunctuation;\n}\nfunction isCJKLineStartProhibitedSegment(segment) {\n for (const ch of segment) {\n if (!kinsokuStart.has(ch) && !leftStickyPunctuation.has(ch))\n return false;\n }\n return segment.length > 0;\n}\nfunction isForwardStickyClusterSegment(segment) {\n if (isEscapedQuoteClusterSegment(segment))\n return true;\n for (const ch of segment) {\n if (!kinsokuEnd.has(ch) && !forwardStickyGlue.has(ch) && !combiningMarkRe.test(ch))\n return false;\n }\n return segment.length > 0;\n}\nfunction isEscapedQuoteClusterSegment(segment) {\n let sawQuote = false;\n for (const ch of segment) {\n if (ch === '\\\\' || combiningMarkRe.test(ch))\n continue;\n if (kinsokuEnd.has(ch) || leftStickyPunctuation.has(ch) || forwardStickyGlue.has(ch)) {\n sawQuote = true;\n continue;\n }\n return false;\n }\n return sawQuote;\n}\nfunction splitTrailingForwardStickyCluster(text) {\n const chars = Array.from(text);\n let splitIndex = chars.length;\n while (splitIndex > 0) {\n const ch = chars[splitIndex - 1];\n if (combiningMarkRe.test(ch)) {\n splitIndex--;\n continue;\n }\n if (kinsokuEnd.has(ch) || forwardStickyGlue.has(ch)) {\n splitIndex--;\n continue;\n }\n break;\n }\n if (splitIndex <= 0 || splitIndex === chars.length)\n return null;\n return {\n head: chars.slice(0, splitIndex).join(''),\n tail: chars.slice(splitIndex).join(''),\n };\n}\nfunction isRepeatedSingleCharRun(segment, ch) {\n if (segment.length === 0)\n return false;\n for (const part of segment) {\n if (part !== ch)\n return false;\n }\n return true;\n}\nfunction endsWithArabicNoSpacePunctuation(segment) {\n if (!containsArabicScript(segment) || segment.length === 0)\n return false;\n return arabicNoSpaceTrailingPunctuation.has(segment[segment.length - 1]);\n}\nfunction endsWithMyanmarMedialGlue(segment) {\n if (segment.length === 0)\n return false;\n return myanmarMedialGlue.has(segment[segment.length - 1]);\n}\nfunction splitLeadingSpaceAndMarks(segment) {\n if (segment.length < 2 || segment[0] !== ' ')\n return null;\n const marks = segment.slice(1);\n if (/^\\p{M}+$/u.test(marks)) {\n return { space: ' ', marks };\n }\n return null;\n}\nexport function endsWithClosingQuote(text) {\n for (let i = text.length - 1; i >= 0; i--) {\n const ch = text[i];\n if (closingQuoteChars.has(ch))\n return true;\n if (!leftStickyPunctuation.has(ch))\n return false;\n }\n return false;\n}\nfunction classifySegmentBreakChar(ch, whiteSpaceProfile) {\n if (whiteSpaceProfile.preserveOrdinarySpaces || whiteSpaceProfile.preserveHardBreaks) {\n if (ch === ' ')\n return 'preserved-space';\n if (ch === '\\t')\n return 'tab';\n if (whiteSpaceProfile.preserveHardBreaks && ch === '\\n')\n return 'hard-break';\n }\n if (ch === ' ')\n return 'space';\n if (ch === '\\u00A0' || ch === '\\u202F' || ch === '\\u2060' || ch === '\\uFEFF') {\n return 'glue';\n }\n if (ch === '\\u200B')\n return 'zero-width-break';\n if (ch === '\\u00AD')\n return 'soft-hyphen';\n return 'text';\n}\nfunction joinTextParts(parts) {\n return parts.length === 1 ? parts[0] : parts.join('');\n}\nfunction splitSegmentByBreakKind(segment, isWordLike, start, whiteSpaceProfile) {\n const pieces = [];\n let currentKind = null;\n let currentTextParts = [];\n let currentStart = start;\n let currentWordLike = false;\n let offset = 0;\n for (const ch of segment) {\n const kind = classifySegmentBreakChar(ch, whiteSpaceProfile);\n const wordLike = kind === 'text' && isWordLike;\n if (currentKind !== null && kind === currentKind && wordLike === currentWordLike) {\n currentTextParts.push(ch);\n offset += ch.length;\n continue;\n }\n if (currentKind !== null) {\n pieces.push({\n text: joinTextParts(currentTextParts),\n isWordLike: currentWordLike,\n kind: currentKind,\n start: currentStart,\n });\n }\n currentKind = kind;\n currentTextParts = [ch];\n currentStart = start + offset;\n currentWordLike = wordLike;\n offset += ch.length;\n }\n if (currentKind !== null) {\n pieces.push({\n text: joinTextParts(currentTextParts),\n isWordLike: currentWordLike,\n kind: currentKind,\n start: currentStart,\n });\n }\n return pieces;\n}\nfunction isTextRunBoundary(kind) {\n return (kind === 'space' ||\n kind === 'preserved-space' ||\n kind === 'zero-width-break' ||\n kind === 'hard-break');\n}\nconst urlSchemeSegmentRe = /^[A-Za-z][A-Za-z0-9+.-]*:$/;\nfunction isUrlLikeRunStart(segmentation, index) {\n const text = segmentation.texts[index];\n if (text.startsWith('www.'))\n return true;\n return (urlSchemeSegmentRe.test(text) &&\n index + 1 < segmentation.len &&\n segmentation.kinds[index + 1] === 'text' &&\n segmentation.texts[index + 1] === '//');\n}\nfunction isUrlQueryBoundarySegment(text) {\n return text.includes('?') && (text.includes('://') || text.startsWith('www.'));\n}\nfunction mergeUrlLikeRuns(segmentation) {\n const texts = segmentation.texts.slice();\n const isWordLike = segmentation.isWordLike.slice();\n const kinds = segmentation.kinds.slice();\n const starts = segmentation.starts.slice();\n for (let i = 0; i < segmentation.len; i++) {\n if (kinds[i] !== 'text' || !isUrlLikeRunStart(segmentation, i))\n continue;\n const mergedParts = [texts[i]];\n let j = i + 1;\n while (j < segmentation.len && !isTextRunBoundary(kinds[j])) {\n mergedParts.push(texts[j]);\n isWordLike[i] = true;\n const endsQueryPrefix = texts[j].includes('?');\n kinds[j] = 'text';\n texts[j] = '';\n j++;\n if (endsQueryPrefix)\n break;\n }\n texts[i] = joinTextParts(mergedParts);\n }\n let compactLen = 0;\n for (let read = 0; read < texts.length; read++) {\n const text = texts[read];\n if (text.length === 0)\n continue;\n if (compactLen !== read) {\n texts[compactLen] = text;\n isWordLike[compactLen] = isWordLike[read];\n kinds[compactLen] = kinds[read];\n starts[compactLen] = starts[read];\n }\n compactLen++;\n }\n texts.length = compactLen;\n isWordLike.length = compactLen;\n kinds.length = compactLen;\n starts.length = compactLen;\n return {\n len: compactLen,\n texts,\n isWordLike,\n kinds,\n starts,\n };\n}\nfunction mergeUrlQueryRuns(segmentation) {\n const texts = [];\n const isWordLike = [];\n const kinds = [];\n const starts = [];\n for (let i = 0; i < segmentation.len; i++) {\n const text = segmentation.texts[i];\n texts.push(text);\n isWordLike.push(segmentation.isWordLike[i]);\n kinds.push(segmentation.kinds[i]);\n starts.push(segmentation.starts[i]);\n if (!isUrlQueryBoundarySegment(text))\n continue;\n const nextIndex = i + 1;\n if (nextIndex >= segmentation.len ||\n isTextRunBoundary(segmentation.kinds[nextIndex])) {\n continue;\n }\n const queryParts = [];\n const queryStart = segmentation.starts[nextIndex];\n let j = nextIndex;\n while (j < segmentation.len && !isTextRunBoundary(segmentation.kinds[j])) {\n queryParts.push(segmentation.texts[j]);\n j++;\n }\n if (queryParts.length > 0) {\n texts.push(joinTextParts(queryParts));\n isWordLike.push(true);\n kinds.push('text');\n starts.push(queryStart);\n i = j - 1;\n }\n }\n return {\n len: texts.length,\n texts,\n isWordLike,\n kinds,\n starts,\n };\n}\nconst numericJoinerChars = new Set([\n ':', '-', '/', '×', ',', '.', '+',\n '\\u2013',\n '\\u2014',\n]);\nconst asciiPunctuationChainSegmentRe = /^[A-Za-z0-9_]+[,:;]*$/;\nconst asciiPunctuationChainTrailingJoinersRe = /[,:;]+$/;\nfunction segmentContainsDecimalDigit(text) {\n for (const ch of text) {\n if (decimalDigitRe.test(ch))\n return true;\n }\n return false;\n}\nfunction isNumericRunSegment(text) {\n if (text.length === 0)\n return false;\n for (const ch of text) {\n if (decimalDigitRe.test(ch) || numericJoinerChars.has(ch))\n continue;\n return false;\n }\n return true;\n}\nfunction mergeNumericRuns(segmentation) {\n const texts = [];\n const isWordLike = [];\n const kinds = [];\n const starts = [];\n for (let i = 0; i < segmentation.len; i++) {\n const text = segmentation.texts[i];\n const kind = segmentation.kinds[i];\n if (kind === 'text' && isNumericRunSegment(text) && segmentContainsDecimalDigit(text)) {\n const mergedParts = [text];\n let j = i + 1;\n while (j < segmentation.len &&\n segmentation.kinds[j] === 'text' &&\n isNumericRunSegment(segmentation.texts[j])) {\n mergedParts.push(segmentation.texts[j]);\n j++;\n }\n texts.push(joinTextParts(mergedParts));\n isWordLike.push(true);\n kinds.push('text');\n starts.push(segmentation.starts[i]);\n i = j - 1;\n continue;\n }\n texts.push(text);\n isWordLike.push(segmentation.isWordLike[i]);\n kinds.push(kind);\n starts.push(segmentation.starts[i]);\n }\n return {\n len: texts.length,\n texts,\n isWordLike,\n kinds,\n starts,\n };\n}\nfunction mergeAsciiPunctuationChains(segmentation) {\n const texts = [];\n const isWordLike = [];\n const kinds = [];\n const starts = [];\n for (let i = 0; i < segmentation.len; i++) {\n const text = segmentation.texts[i];\n const kind = segmentation.kinds[i];\n const wordLike = segmentation.isWordLike[i];\n if (kind === 'text' && wordLike && asciiPunctuationChainSegmentRe.test(text)) {\n const mergedParts = [text];\n let endsWithJoiners = asciiPunctuationChainTrailingJoinersRe.test(text);\n let j = i + 1;\n while (endsWithJoiners &&\n j < segmentation.len &&\n segmentation.kinds[j] === 'text' &&\n segmentation.isWordLike[j] &&\n asciiPunctuationChainSegmentRe.test(segmentation.texts[j])) {\n const nextText = segmentation.texts[j];\n mergedParts.push(nextText);\n endsWithJoiners = asciiPunctuationChainTrailingJoinersRe.test(nextText);\n j++;\n }\n texts.push(joinTextParts(mergedParts));\n isWordLike.push(true);\n kinds.push('text');\n starts.push(segmentation.starts[i]);\n i = j - 1;\n continue;\n }\n texts.push(text);\n isWordLike.push(wordLike);\n kinds.push(kind);\n starts.push(segmentation.starts[i]);\n }\n return {\n len: texts.length,\n texts,\n isWordLike,\n kinds,\n starts,\n };\n}\nfunction splitHyphenatedNumericRuns(segmentation) {\n const texts = [];\n const isWordLike = [];\n const kinds = [];\n const starts = [];\n for (let i = 0; i < segmentation.len; i++) {\n const text = segmentation.texts[i];\n if (segmentation.kinds[i] === 'text' && text.includes('-')) {\n const parts = text.split('-');\n let shouldSplit = parts.length > 1;\n for (let j = 0; j < parts.length; j++) {\n const part = parts[j];\n if (!shouldSplit)\n break;\n if (part.length === 0 ||\n !segmentContainsDecimalDigit(part) ||\n !isNumericRunSegment(part)) {\n shouldSplit = false;\n }\n }\n if (shouldSplit) {\n let offset = 0;\n for (let j = 0; j < parts.length; j++) {\n const part = parts[j];\n const splitText = j < parts.length - 1 ? `${part}-` : part;\n texts.push(splitText);\n isWordLike.push(true);\n kinds.push('text');\n starts.push(segmentation.starts[i] + offset);\n offset += splitText.length;\n }\n continue;\n }\n }\n texts.push(text);\n isWordLike.push(segmentation.isWordLike[i]);\n kinds.push(segmentation.kinds[i]);\n starts.push(segmentation.starts[i]);\n }\n return {\n len: texts.length,\n texts,\n isWordLike,\n kinds,\n starts,\n };\n}\nfunction mergeGlueConnectedTextRuns(segmentation) {\n const texts = [];\n const isWordLike = [];\n const kinds = [];\n const starts = [];\n let read = 0;\n while (read < segmentation.len) {\n const textParts = [segmentation.texts[read]];\n let wordLike = segmentation.isWordLike[read];\n let kind = segmentation.kinds[read];\n let start = segmentation.starts[read];\n if (kind === 'glue') {\n const glueParts = [textParts[0]];\n const glueStart = start;\n read++;\n while (read < segmentation.len && segmentation.kinds[read] === 'glue') {\n glueParts.push(segmentation.texts[read]);\n read++;\n }\n const glueText = joinTextParts(glueParts);\n if (read < segmentation.len && segmentation.kinds[read] === 'text') {\n textParts[0] = glueText;\n textParts.push(segmentation.texts[read]);\n wordLike = segmentation.isWordLike[read];\n kind = 'text';\n start = glueStart;\n read++;\n }\n else {\n texts.push(glueText);\n isWordLike.push(false);\n kinds.push('glue');\n starts.push(glueStart);\n continue;\n }\n }\n else {\n read++;\n }\n if (kind === 'text') {\n while (read < segmentation.len && segmentation.kinds[read] === 'glue') {\n const glueParts = [];\n while (read < segmentation.len && segmentation.kinds[read] === 'glue') {\n glueParts.push(segmentation.texts[read]);\n read++;\n }\n const glueText = joinTextParts(glueParts);\n if (read < segmentation.len && segmentation.kinds[read] === 'text') {\n textParts.push(glueText, segmentation.texts[read]);\n wordLike = wordLike || segmentation.isWordLike[read];\n read++;\n continue;\n }\n textParts.push(glueText);\n }\n }\n texts.push(joinTextParts(textParts));\n isWordLike.push(wordLike);\n kinds.push(kind);\n starts.push(start);\n }\n return {\n len: texts.length,\n texts,\n isWordLike,\n kinds,\n starts,\n };\n}\nfunction carryTrailingForwardStickyAcrossCJKBoundary(segmentation) {\n const texts = segmentation.texts.slice();\n const isWordLike = segmentation.isWordLike.slice();\n const kinds = segmentation.kinds.slice();\n const starts = segmentation.starts.slice();\n for (let i = 0; i < texts.length - 1; i++) {\n if (kinds[i] !== 'text' || kinds[i + 1] !== 'text')\n continue;\n if (!isCJK(texts[i]) || !isCJK(texts[i + 1]))\n continue;\n const split = splitTrailingForwardStickyCluster(texts[i]);\n if (split === null)\n continue;\n texts[i] = split.head;\n texts[i + 1] = split.tail + texts[i + 1];\n starts[i + 1] = starts[i] + split.head.length;\n }\n return {\n len: texts.length,\n texts,\n isWordLike,\n kinds,\n starts,\n };\n}\nfunction buildMergedSegmentation(normalized, profile, whiteSpaceProfile) {\n const wordSegmenter = getSharedWordSegmenter();\n let mergedLen = 0;\n const mergedTexts = [];\n const mergedWordLike = [];\n const mergedKinds = [];\n const mergedStarts = [];\n for (const s of wordSegmenter.segment(normalized)) {\n for (const piece of splitSegmentByBreakKind(s.segment, s.isWordLike ?? false, s.index, whiteSpaceProfile)) {\n const isText = piece.kind === 'text';\n if (profile.carryCJKAfterClosingQuote &&\n isText &&\n mergedLen > 0 &&\n mergedKinds[mergedLen - 1] === 'text' &&\n isCJK(piece.text) &&\n isCJK(mergedTexts[mergedLen - 1]) &&\n endsWithClosingQuote(mergedTexts[mergedLen - 1])) {\n mergedTexts[mergedLen - 1] += piece.text;\n mergedWordLike[mergedLen - 1] = mergedWordLike[mergedLen - 1] || piece.isWordLike;\n }\n else if (isText &&\n mergedLen > 0 &&\n mergedKinds[mergedLen - 1] === 'text' &&\n isCJKLineStartProhibitedSegment(piece.text) &&\n isCJK(mergedTexts[mergedLen - 1])) {\n mergedTexts[mergedLen - 1] += piece.text;\n mergedWordLike[mergedLen - 1] = mergedWordLike[mergedLen - 1] || piece.isWordLike;\n }\n else if (isText &&\n mergedLen > 0 &&\n mergedKinds[mergedLen - 1] === 'text' &&\n endsWithMyanmarMedialGlue(mergedTexts[mergedLen - 1])) {\n mergedTexts[mergedLen - 1] += piece.text;\n mergedWordLike[mergedLen - 1] = mergedWordLike[mergedLen - 1] || piece.isWordLike;\n }\n else if (isText &&\n mergedLen > 0 &&\n mergedKinds[mergedLen - 1] === 'text' &&\n piece.isWordLike &&\n containsArabicScript(piece.text) &&\n endsWithArabicNoSpacePunctuation(mergedTexts[mergedLen - 1])) {\n mergedTexts[mergedLen - 1] += piece.text;\n mergedWordLike[mergedLen - 1] = true;\n }\n else if (isText &&\n !piece.isWordLike &&\n mergedLen > 0 &&\n mergedKinds[mergedLen - 1] === 'text' &&\n piece.text.length === 1 &&\n piece.text !== '-' &&\n piece.text !== '—' &&\n isRepeatedSingleCharRun(mergedTexts[mergedLen - 1], piece.text)) {\n mergedTexts[mergedLen - 1] += piece.text;\n }\n else if (isText &&\n !piece.isWordLike &&\n mergedLen > 0 &&\n mergedKinds[mergedLen - 1] === 'text' &&\n (isLeftStickyPunctuationSegment(piece.text) ||\n (piece.text === '-' && mergedWordLike[mergedLen - 1]))) {\n mergedTexts[mergedLen - 1] += piece.text;\n }\n else {\n mergedTexts[mergedLen] = piece.text;\n mergedWordLike[mergedLen] = piece.isWordLike;\n mergedKinds[mergedLen] = piece.kind;\n mergedStarts[mergedLen] = piece.start;\n mergedLen++;\n }\n }\n }\n for (let i = 1; i < mergedLen; i++) {\n if (mergedKinds[i] === 'text' &&\n !mergedWordLike[i] &&\n isEscapedQuoteClusterSegment(mergedTexts[i]) &&\n mergedKinds[i - 1] === 'text') {\n mergedTexts[i - 1] += mergedTexts[i];\n mergedWordLike[i - 1] = mergedWordLike[i - 1] || mergedWordLike[i];\n mergedTexts[i] = '';\n }\n }\n for (let i = mergedLen - 2; i >= 0; i--) {\n if (mergedKinds[i] === 'text' && !mergedWordLike[i] && isForwardStickyClusterSegment(mergedTexts[i])) {\n let j = i + 1;\n while (j < mergedLen && mergedTexts[j] === '')\n j++;\n if (j < mergedLen && mergedKinds[j] === 'text') {\n mergedTexts[j] = mergedTexts[i] + mergedTexts[j];\n mergedStarts[j] = mergedStarts[i];\n mergedTexts[i] = '';\n }\n }\n }\n let compactLen = 0;\n for (let read = 0; read < mergedLen; read++) {\n const text = mergedTexts[read];\n if (text.length === 0)\n continue;\n if (compactLen !== read) {\n mergedTexts[compactLen] = text;\n mergedWordLike[compactLen] = mergedWordLike[read];\n mergedKinds[compactLen] = mergedKinds[read];\n mergedStarts[compactLen] = mergedStarts[read];\n }\n compactLen++;\n }\n mergedTexts.length = compactLen;\n mergedWordLike.length = compactLen;\n mergedKinds.length = compactLen;\n mergedStarts.length = compactLen;\n const compacted = mergeGlueConnectedTextRuns({\n len: compactLen,\n texts: mergedTexts,\n isWordLike: mergedWordLike,\n kinds: mergedKinds,\n starts: mergedStarts,\n });\n const withMergedUrls = carryTrailingForwardStickyAcrossCJKBoundary(mergeAsciiPunctuationChains(splitHyphenatedNumericRuns(mergeNumericRuns(mergeUrlQueryRuns(mergeUrlLikeRuns(compacted))))));\n for (let i = 0; i < withMergedUrls.len - 1; i++) {\n const split = splitLeadingSpaceAndMarks(withMergedUrls.texts[i]);\n if (split === null)\n continue;\n if ((withMergedUrls.kinds[i] !== 'space' && withMergedUrls.kinds[i] !== 'preserved-space') ||\n withMergedUrls.kinds[i + 1] !== 'text' ||\n !containsArabicScript(withMergedUrls.texts[i + 1])) {\n continue;\n }\n withMergedUrls.texts[i] = split.space;\n withMergedUrls.isWordLike[i] = false;\n withMergedUrls.kinds[i] = withMergedUrls.kinds[i] === 'preserved-space' ? 'preserved-space' : 'space';\n withMergedUrls.texts[i + 1] = split.marks + withMergedUrls.texts[i + 1];\n withMergedUrls.starts[i + 1] = withMergedUrls.starts[i] + split.space.length;\n }\n return withMergedUrls;\n}\nfunction compileAnalysisChunks(segmentation, whiteSpaceProfile) {\n if (segmentation.len === 0)\n return [];\n if (!whiteSpaceProfile.preserveHardBreaks) {\n return [{\n startSegmentIndex: 0,\n endSegmentIndex: segmentation.len,\n consumedEndSegmentIndex: segmentation.len,\n }];\n }\n const chunks = [];\n let startSegmentIndex = 0;\n for (let i = 0; i < segmentation.len; i++) {\n if (segmentation.kinds[i] !== 'hard-break')\n continue;\n chunks.push({\n startSegmentIndex,\n endSegmentIndex: i,\n consumedEndSegmentIndex: i + 1,\n });\n startSegmentIndex = i + 1;\n }\n if (startSegmentIndex < segmentation.len) {\n chunks.push({\n startSegmentIndex,\n endSegmentIndex: segmentation.len,\n consumedEndSegmentIndex: segmentation.len,\n });\n }\n return chunks;\n}\nexport function analyzeText(text, profile, whiteSpace = 'normal') {\n const whiteSpaceProfile = getWhiteSpaceProfile(whiteSpace);\n const normalized = whiteSpaceProfile.mode === 'pre-wrap'\n ? normalizeWhitespacePreWrap(text)\n : normalizeWhitespaceNormal(text);\n if (normalized.length === 0) {\n return {\n normalized,\n chunks: [],\n len: 0,\n texts: [],\n isWordLike: [],\n kinds: [],\n starts: [],\n };\n }\n const segmentation = buildMergedSegmentation(normalized, profile, whiteSpaceProfile);\n return {\n normalized,\n chunks: compileAnalysisChunks(segmentation, whiteSpaceProfile),\n ...segmentation,\n };\n}\n","import { isCJK } from './analysis.js';\nlet measureContext = null;\nconst segmentMetricCaches = new Map();\nlet cachedEngineProfile = null;\nconst emojiPresentationRe = /\\p{Emoji_Presentation}/u;\nconst maybeEmojiRe = /[\\p{Emoji_Presentation}\\p{Extended_Pictographic}\\p{Regional_Indicator}\\uFE0F\\u20E3]/u;\nlet sharedGraphemeSegmenter = null;\nconst emojiCorrectionCache = new Map();\nexport function getMeasureContext() {\n if (measureContext !== null)\n return measureContext;\n if (typeof OffscreenCanvas !== 'undefined') {\n measureContext = new OffscreenCanvas(1, 1).getContext('2d');\n return measureContext;\n }\n if (typeof document !== 'undefined') {\n measureContext = document.createElement('canvas').getContext('2d');\n return measureContext;\n }\n throw new Error('Text measurement requires OffscreenCanvas or a DOM canvas context.');\n}\nexport function getSegmentMetricCache(font) {\n let cache = segmentMetricCaches.get(font);\n if (!cache) {\n cache = new Map();\n segmentMetricCaches.set(font, cache);\n }\n return cache;\n}\nexport function getSegmentMetrics(seg, cache) {\n let metrics = cache.get(seg);\n if (metrics === undefined) {\n const ctx = getMeasureContext();\n metrics = {\n width: ctx.measureText(seg).width,\n containsCJK: isCJK(seg),\n };\n cache.set(seg, metrics);\n }\n return metrics;\n}\nexport function getEngineProfile() {\n if (cachedEngineProfile !== null)\n return cachedEngineProfile;\n if (typeof navigator === 'undefined') {\n cachedEngineProfile = {\n lineFitEpsilon: 0.005,\n carryCJKAfterClosingQuote: false,\n preferPrefixWidthsForBreakableRuns: false,\n preferEarlySoftHyphenBreak: false,\n };\n return cachedEngineProfile;\n }\n const ua = navigator.userAgent;\n const vendor = navigator.vendor;\n const isSafari = vendor === 'Apple Computer, Inc.' &&\n ua.includes('Safari/') &&\n !ua.includes('Chrome/') &&\n !ua.includes('Chromium/') &&\n !ua.includes('CriOS/') &&\n !ua.includes('FxiOS/') &&\n !ua.includes('EdgiOS/');\n const isChromium = ua.includes('Chrome/') ||\n ua.includes('Chromium/') ||\n ua.includes('CriOS/') ||\n ua.includes('Edg/');\n cachedEngineProfile = {\n lineFitEpsilon: isSafari ? 1 / 64 : 0.005,\n carryCJKAfterClosingQuote: isChromium,\n preferPrefixWidthsForBreakableRuns: isSafari,\n preferEarlySoftHyphenBreak: isSafari,\n };\n return cachedEngineProfile;\n}\nexport function parseFontSize(font) {\n const m = font.match(/(\\d+(?:\\.\\d+)?)\\s*px/);\n return m ? parseFloat(m[1]) : 16;\n}\nfunction getSharedGraphemeSegmenter() {\n if (sharedGraphemeSegmenter === null) {\n sharedGraphemeSegmenter = new Intl.Segmenter(undefined, { granularity: 'grapheme' });\n }\n return sharedGraphemeSegmenter;\n}\nfunction isEmojiGrapheme(g) {\n return emojiPresentationRe.test(g) || g.includes('\\uFE0F');\n}\nexport function textMayContainEmoji(text) {\n return maybeEmojiRe.test(text);\n}\nfunction getEmojiCorrection(font, fontSize) {\n let correction = emojiCorrectionCache.get(font);\n if (correction !== undefined)\n return correction;\n const ctx = getMeasureContext();\n ctx.font = font;\n const canvasW = ctx.measureText('\\u{1F600}').width;\n correction = 0;\n if (canvasW > fontSize + 0.5 &&\n typeof document !== 'undefined' &&\n document.body !== null) {\n const span = document.createElement('span');\n span.style.font = font;\n span.style.display = 'inline-block';\n span.style.visibility = 'hidden';\n span.style.position = 'absolute';\n span.textContent = '\\u{1F600}';\n document.body.appendChild(span);\n const domW = span.getBoundingClientRect().width;\n document.body.removeChild(span);\n if (canvasW - domW > 0.5) {\n correction = canvasW - domW;\n }\n }\n emojiCorrectionCache.set(font, correction);\n return correction;\n}\nfunction countEmojiGraphemes(text) {\n let count = 0;\n const graphemeSegmenter = getSharedGraphemeSegmenter();\n for (const g of graphemeSegmenter.segment(text)) {\n if (isEmojiGrapheme(g.segment))\n count++;\n }\n return count;\n}\nfunction getEmojiCount(seg, metrics) {\n if (metrics.emojiCount === undefined) {\n metrics.emojiCount = countEmojiGraphemes(seg);\n }\n return metrics.emojiCount;\n}\nexport function getCorrectedSegmentWidth(seg, metrics, emojiCorrection) {\n if (emojiCorrection === 0)\n return metrics.width;\n return metrics.width - getEmojiCount(seg, metrics) * emojiCorrection;\n}\nexport function getSegmentGraphemeWidths(seg, metrics, cache, emojiCorrection) {\n if (metrics.graphemeWidths !== undefined)\n return metrics.graphemeWidths;\n const widths = [];\n const graphemeSegmenter = getSharedGraphemeSegmenter();\n for (const gs of graphemeSegmenter.segment(seg)) {\n const graphemeMetrics = getSegmentMetrics(gs.segment, cache);\n widths.push(getCorrectedSegmentWidth(gs.segment, graphemeMetrics, emojiCorrection));\n }\n metrics.graphemeWidths = widths.length > 1 ? widths : null;\n return metrics.graphemeWidths;\n}\nexport function getSegmentGraphemePrefixWidths(seg, metrics, cache, emojiCorrection) {\n if (metrics.graphemePrefixWidths !== undefined)\n return metrics.graphemePrefixWidths;\n const prefixWidths = [];\n const graphemeSegmenter = getSharedGraphemeSegmenter();\n let prefix = '';\n for (const gs of graphemeSegmenter.segment(seg)) {\n prefix += gs.segment;\n const prefixMetrics = getSegmentMetrics(prefix, cache);\n prefixWidths.push(getCorrectedSegmentWidth(prefix, prefixMetrics, emojiCorrection));\n }\n metrics.graphemePrefixWidths = prefixWidths.length > 1 ? prefixWidths : null;\n return metrics.graphemePrefixWidths;\n}\nexport function getFontMeasurementState(font, needsEmojiCorrection) {\n const ctx = getMeasureContext();\n ctx.font = font;\n const cache = getSegmentMetricCache(font);\n const fontSize = parseFontSize(font);\n const emojiCorrection = needsEmojiCorrection ? getEmojiCorrection(font, fontSize) : 0;\n return { cache, fontSize, emojiCorrection };\n}\nexport function clearMeasurementCaches() {\n segmentMetricCaches.clear();\n emojiCorrectionCache.clear();\n sharedGraphemeSegmenter = null;\n}\n","// Text measurement for browser environments using canvas measureText.\n//\n// Problem: DOM-based text measurement (getBoundingClientRect, offsetHeight)\n// forces synchronous layout reflow. When components independently measure text,\n// each measurement triggers a reflow of the entire document. This creates\n// read/write interleaving that can cost 30ms+ per frame for 500 text blocks.\n//\n// Solution: two-phase measurement centered around canvas measureText.\n// prepare(text, font) — segments text via Intl.Segmenter, measures each word\n// via canvas, caches widths, and does one cached DOM calibration read per\n// font when emoji correction is needed. Call once when text first appears.\n// layout(prepared, maxWidth, lineHeight) — walks cached word widths with pure\n// arithmetic to count lines and compute height. Call on every resize.\n// ~0.0002ms per text.\n//\n// i18n: Intl.Segmenter handles CJK (per-character breaking), Thai, Arabic, etc.\n// Bidi: simplified rich-path metadata for mixed LTR/RTL custom rendering.\n// Punctuation merging: \"better.\" measured as one unit (matches CSS behavior).\n// Trailing whitespace: hangs past line edge without triggering breaks (CSS behavior).\n// overflow-wrap: pre-measured grapheme widths enable character-level word breaking.\n//\n// Emoji correction: Chrome/Firefox canvas measures emoji wider than DOM at font\n// sizes <24px on macOS (Apple Color Emoji). The inflation is constant per emoji\n// grapheme at a given size, font-independent. Auto-detected by comparing canvas\n// vs actual DOM emoji width (one cached DOM read per font). Safari canvas and\n// DOM agree (both wider than fontSize), so correction = 0 there.\n//\n// Limitations:\n// - system-ui font: canvas resolves to different optical variants than DOM on macOS.\n// Use named fonts (Helvetica, Inter, etc.) for guaranteed accuracy.\n// See RESEARCH.md \"Discovery: system-ui font resolution mismatch\".\n//\n// Based on Sebastian Markbage's text-layout research (github.com/chenglou/text-layout).\nimport { computeSegmentLevels } from './bidi.js';\nimport { analyzeText, clearAnalysisCaches, endsWithClosingQuote, isCJK, kinsokuEnd, kinsokuStart, leftStickyPunctuation, setAnalysisLocale, } from './analysis.js';\nimport { clearMeasurementCaches, getCorrectedSegmentWidth, getEngineProfile, getFontMeasurementState, getSegmentGraphemePrefixWidths, getSegmentGraphemeWidths, getSegmentMetrics, textMayContainEmoji, } from './measurement.js';\nimport { countPreparedLines, layoutNextLineRange as stepPreparedLineRange, walkPreparedLines, } from './line-break.js';\nlet sharedGraphemeSegmenter = null;\n// Rich-path only. Reuses grapheme splits while materializing multiple lines\n// from the same prepared handle, without pushing that cache into the API.\nlet sharedLineTextCaches = new WeakMap();\nfunction getSharedGraphemeSegmenter() {\n if (sharedGraphemeSegmenter === null) {\n sharedGraphemeSegmenter = new Intl.Segmenter(undefined, { granularity: 'grapheme' });\n }\n return sharedGraphemeSegmenter;\n}\n// --- Public API ---\nfunction createEmptyPrepared(includeSegments) {\n if (includeSegments) {\n return {\n widths: [],\n lineEndFitAdvances: [],\n lineEndPaintAdvances: [],\n kinds: [],\n simpleLineWalkFastPath: true,\n segLevels: null,\n breakableWidths: [],\n breakablePrefixWidths: [],\n discretionaryHyphenWidth: 0,\n tabStopAdvance: 0,\n chunks: [],\n segments: [],\n };\n }\n return {\n widths: [],\n lineEndFitAdvances: [],\n lineEndPaintAdvances: [],\n kinds: [],\n simpleLineWalkFastPath: true,\n segLevels: null,\n breakableWidths: [],\n breakablePrefixWidths: [],\n discretionaryHyphenWidth: 0,\n tabStopAdvance: 0,\n chunks: [],\n };\n}\nfunction measureAnalysis(analysis, font, includeSegments) {\n const graphemeSegmenter = getSharedGraphemeSegmenter();\n const engineProfile = getEngineProfile();\n const { cache, emojiCorrection } = getFontMeasurementState(font, textMayContainEmoji(analysis.normalized));\n const discretionaryHyphenWidth = getCorrectedSegmentWidth('-', getSegmentMetrics('-', cache), emojiCorrection);\n const spaceWidth = getCorrectedSegmentWidth(' ', getSegmentMetrics(' ', cache), emojiCorrection);\n const tabStopAdvance = spaceWidth * 8;\n if (analysis.len === 0)\n return createEmptyPrepared(includeSegments);\n const widths = [];\n const lineEndFitAdvances = [];\n const lineEndPaintAdvances = [];\n const kinds = [];\n let simpleLineWalkFastPath = analysis.chunks.length <= 1;\n const segStarts = includeSegments ? [] : null;\n const breakableWidths = [];\n const breakablePrefixWidths = [];\n const segments = includeSegments ? [] : null;\n const preparedStartByAnalysisIndex = Array.from({ length: analysis.len });\n const preparedEndByAnalysisIndex = Array.from({ length: analysis.len });\n function pushMeasuredSegment(text, width, lineEndFitAdvance, lineEndPaintAdvance, kind, start, breakable, breakablePrefix) {\n if (kind !== 'text' && kind !== 'space' && kind !== 'zero-width-break') {\n simpleLineWalkFastPath = false;\n }\n widths.push(width);\n lineEndFitAdvances.push(lineEndFitAdvance);\n lineEndPaintAdvances.push(lineEndPaintAdvance);\n kinds.push(kind);\n segStarts?.push(start);\n breakableWidths.push(breakable);\n breakablePrefixWidths.push(breakablePrefix);\n if (segments !== null)\n segments.push(text);\n }\n for (let mi = 0; mi < analysis.len; mi++) {\n preparedStartByAnalysisIndex[mi] = widths.length;\n const segText = analysis.texts[mi];\n const segWordLike = analysis.isWordLike[mi];\n const segKind = analysis.kinds[mi];\n const segStart = analysis.starts[mi];\n if (segKind === 'soft-hyphen') {\n pushMeasuredSegment(segText, 0, discretionaryHyphenWidth, discretionaryHyphenWidth, segKind, segStart, null, null);\n preparedEndByAnalysisIndex[mi] = widths.length;\n continue;\n }\n if (segKind === 'hard-break') {\n pushMeasuredSegment(segText, 0, 0, 0, segKind, segStart, null, null);\n preparedEndByAnalysisIndex[mi] = widths.length;\n continue;\n }\n if (segKind === 'tab') {\n pushMeasuredSegment(segText, 0, 0, 0, segKind, segStart, null, null);\n preparedEndByAnalysisIndex[mi] = widths.length;\n continue;\n }\n const segMetrics = getSegmentMetrics(segText, cache);\n if (segKind === 'text' && segMetrics.containsCJK) {\n let unitText = '';\n let unitStart = 0;\n for (const gs of graphemeSegmenter.segment(segText)) {\n const grapheme = gs.segment;\n if (unitText.length === 0) {\n unitText = grapheme;\n unitStart = gs.index;\n continue;\n }\n if (kinsokuEnd.has(unitText) ||\n kinsokuStart.has(grapheme) ||\n leftStickyPunctuation.has(grapheme) ||\n (engineProfile.carryCJKAfterClosingQuote &&\n isCJK(grapheme) &&\n endsWithClosingQuote(unitText))) {\n unitText += grapheme;\n continue;\n }\n const unitMetrics = getSegmentMetrics(unitText, cache);\n const w = getCorrectedSegmentWidth(unitText, unitMetrics, emojiCorrection);\n pushMeasuredSegment(unitText, w, w, w, 'text', segStart + unitStart, null, null);\n unitText = grapheme;\n unitStart = gs.index;\n }\n if (unitText.length > 0) {\n const unitMetrics = getSegmentMetrics(unitText, cache);\n const w = getCorrectedSegmentWidth(unitText, unitMetrics, emojiCorrection);\n pushMeasuredSegment(unitText, w, w, w, 'text', segStart + unitStart, null, null);\n }\n preparedEndByAnalysisIndex[mi] = widths.length;\n continue;\n }\n const w = getCorrectedSegmentWidth(segText, segMetrics, emojiCorrection);\n const lineEndFitAdvance = segKind === 'space' || segKind === 'preserved-space' || segKind === 'zero-width-break'\n ? 0\n : w;\n const lineEndPaintAdvance = segKind === 'space' || segKind === 'zero-width-break'\n ? 0\n : w;\n if (segWordLike && segText.length > 1) {\n const graphemeWidths = getSegmentGraphemeWidths(segText, segMetrics, cache, emojiCorrection);\n const graphemePrefixWidths = engineProfile.preferPrefixWidthsForBreakableRuns\n ? getSegmentGraphemePrefixWidths(segText, segMetrics, cache, emojiCorrection)\n : null;\n pushMeasuredSegment(segText, w, lineEndFitAdvance, lineEndPaintAdvance, segKind, segStart, graphemeWidths, graphemePrefixWidths);\n }\n else {\n pushMeasuredSegment(segText, w, lineEndFitAdvance, lineEndPaintAdvance, segKind, segStart, null, null);\n }\n preparedEndByAnalysisIndex[mi] = widths.length;\n }\n const chunks = mapAnalysisChunksToPreparedChunks(analysis.chunks, preparedStartByAnalysisIndex, preparedEndByAnalysisIndex);\n const segLevels = segStarts === null ? null : computeSegmentLevels(analysis.normalized, segStarts);\n if (segments !== null) {\n return {\n widths,\n lineEndFitAdvances,\n lineEndPaintAdvances,\n kinds,\n simpleLineWalkFastPath,\n segLevels,\n breakableWidths,\n breakablePrefixWidths,\n discretionaryHyphenWidth,\n tabStopAdvance,\n chunks,\n segments,\n };\n }\n return {\n widths,\n lineEndFitAdvances,\n lineEndPaintAdvances,\n kinds,\n simpleLineWalkFastPath,\n segLevels,\n breakableWidths,\n breakablePrefixWidths,\n discretionaryHyphenWidth,\n tabStopAdvance,\n chunks,\n };\n}\nfunction mapAnalysisChunksToPreparedChunks(chunks, preparedStartByAnalysisIndex, preparedEndByAnalysisIndex) {\n const preparedChunks = [];\n for (let i = 0; i < chunks.length; i++) {\n const chunk = chunks[i];\n const startSegmentIndex = chunk.startSegmentIndex < preparedStartByAnalysisIndex.length\n ? preparedStartByAnalysisIndex[chunk.startSegmentIndex]\n : preparedEndByAnalysisIndex[preparedEndByAnalysisIndex.length - 1] ?? 0;\n const endSegmentIndex = chunk.endSegmentIndex < preparedStartByAnalysisIndex.length\n ? preparedStartByAnalysisIndex[chunk.endSegmentIndex]\n : preparedEndByAnalysisIndex[preparedEndByAnalysisIndex.length - 1] ?? 0;\n const consumedEndSegmentIndex = chunk.consumedEndSegmentIndex < preparedStartByAnalysisIndex.length\n ? preparedStartByAnalysisIndex[chunk.consumedEndSegmentIndex]\n : preparedEndByAnalysisIndex[preparedEndByAnalysisIndex.length - 1] ?? 0;\n preparedChunks.push({\n startSegmentIndex,\n endSegmentIndex,\n consumedEndSegmentIndex,\n });\n }\n return preparedChunks;\n}\nfunction prepareInternal(text, font, includeSegments, options) {\n const analysis = analyzeText(text, getEngineProfile(), options?.whiteSpace);\n return measureAnalysis(analysis, font, includeSegments);\n}\n// Diagnostic-only helper used by the browser benchmark harness to separate the\n// text-analysis and measurement phases without duplicating the prepare logic.\nexport function profilePrepare(text, font, options) {\n const t0 = performance.now();\n const analysis = analyzeText(text, getEngineProfile(), options?.whiteSpace);\n const t1 = performance.now();\n const prepared = measureAnalysis(analysis, font, false);\n const t2 = performance.now();\n let breakableSegments = 0;\n for (const widths of prepared.breakableWidths) {\n if (widths !== null)\n breakableSegments++;\n }\n return {\n analysisMs: t1 - t0,\n measureMs: t2 - t1,\n totalMs: t2 - t0,\n analysisSegments: analysis.len,\n preparedSegments: prepared.widths.length,\n breakableSegments,\n };\n}\n// Prepare text for layout. Segments the text, measures each segment via canvas,\n// and stores the widths for fast relayout at any width. Call once per text block\n// (e.g. when a comment first appears). The result is width-independent — the\n// same PreparedText can be laid out at any maxWidth and lineHeight via layout().\n//\n// Steps:\n// 1. Normalize collapsible whitespace (CSS white-space: normal behavior)\n// 2. Segment via Intl.Segmenter (handles CJK, Thai, etc.)\n// 3. Merge punctuation into preceding word (\"better.\" as one unit)\n// 4. Split CJK words into individual graphemes (per-character line breaks)\n// 5. Measure each segment via canvas measureText, cache by (segment, font)\n// 6. Pre-measure graphemes of long words (for overflow-wrap: break-word)\n// 7. Correct emoji canvas inflation (auto-detected per font size)\n// 8. Optionally compute rich-path bidi metadata for custom renderers\nexport function prepare(text, font, options) {\n return prepareInternal(text, font, false, options);\n}\n// Rich variant used by callers that need enough information to render the\n// laid-out lines themselves.\nexport function prepareWithSegments(text, font, options) {\n return prepareInternal(text, font, true, options);\n}\nfunction getInternalPrepared(prepared) {\n return prepared;\n}\n// Layout prepared text at a given max width and caller-provided lineHeight.\n// Pure arithmetic on cached widths — no canvas calls, no DOM reads, no string\n// operations, no allocations.\n// ~0.0002ms per text block. Call on every resize.\n//\n// Line breaking rules (matching CSS white-space: normal + overflow-wrap: break-word):\n// - Break before any non-space segment that would overflow the line\n// - Trailing whitespace hangs past the line edge (doesn't trigger breaks)\n// - Segments wider than maxWidth are broken at grapheme boundaries\nexport function layout(prepared, maxWidth, lineHeight) {\n // Keep the resize hot path specialized. `layoutWithLines()` shares the same\n // break semantics but also tracks line ranges; the extra bookkeeping is too\n // expensive to pay on every hot-path `layout()` call.\n const lineCount = countPreparedLines(getInternalPrepared(prepared), maxWidth);\n return { lineCount, height: lineCount * lineHeight };\n}\nfunction getSegmentGraphemes(segmentIndex, segments, cache) {\n let graphemes = cache.get(segmentIndex);\n if (graphemes !== undefined)\n return graphemes;\n graphemes = [];\n const graphemeSegmenter = getSharedGraphemeSegmenter();\n for (const gs of graphemeSegmenter.segment(segments[segmentIndex])) {\n graphemes.push(gs.segment);\n }\n cache.set(segmentIndex, graphemes);\n return graphemes;\n}\nfunction getLineTextCache(prepared) {\n let cache = sharedLineTextCaches.get(prepared);\n if (cache !== undefined)\n return cache;\n cache = new Map();\n sharedLineTextCaches.set(prepared, cache);\n return cache;\n}\nfunction lineHasDiscretionaryHyphen(kinds, startSegmentIndex, startGraphemeIndex, endSegmentIndex) {\n return (endSegmentIndex > 0 &&\n kinds[endSegmentIndex - 1] === 'soft-hyphen' &&\n !(startSegmentIndex === endSegmentIndex && startGraphemeIndex > 0));\n}\nfunction buildLineTextFromRange(segments, kinds, cache, startSegmentIndex, startGraphemeIndex, endSegmentIndex, endGraphemeIndex) {\n let text = '';\n const endsWithDiscretionaryHyphen = lineHasDiscretionaryHyphen(kinds, startSegmentIndex, startGraphemeIndex, endSegmentIndex);\n for (let i = startSegmentIndex; i < endSegmentIndex; i++) {\n if (kinds[i] === 'soft-hyphen' || kinds[i] === 'hard-break')\n continue;\n if (i === startSegmentIndex && startGraphemeIndex > 0) {\n text += getSegmentGraphemes(i, segments, cache).slice(startGraphemeIndex).join('');\n }\n else {\n text += segments[i];\n }\n }\n if (endGraphemeIndex > 0) {\n if (endsWithDiscretionaryHyphen)\n text += '-';\n text += getSegmentGraphemes(endSegmentIndex, segments, cache).slice(startSegmentIndex === endSegmentIndex ? startGraphemeIndex : 0, endGraphemeIndex).join('');\n }\n else if (endsWithDiscretionaryHyphen) {\n text += '-';\n }\n return text;\n}\nfunction createLayoutLine(prepared, cache, width, startSegmentIndex, startGraphemeIndex, endSegmentIndex, endGraphemeIndex) {\n return {\n text: buildLineTextFromRange(prepared.segments, prepared.kinds, cache, startSegmentIndex, startGraphemeIndex, endSegmentIndex, endGraphemeIndex),\n width,\n start: {\n segmentIndex: startSegmentIndex,\n graphemeIndex: startGraphemeIndex,\n },\n end: {\n segmentIndex: endSegmentIndex,\n graphemeIndex: endGraphemeIndex,\n },\n };\n}\nfunction materializeLayoutLine(prepared, cache, line) {\n return createLayoutLine(prepared, cache, line.width, line.startSegmentIndex, line.startGraphemeIndex, line.endSegmentIndex, line.endGraphemeIndex);\n}\nfunction toLayoutLineRange(line) {\n return {\n width: line.width,\n start: {\n segmentIndex: line.startSegmentIndex,\n graphemeIndex: line.startGraphemeIndex,\n },\n end: {\n segmentIndex: line.endSegmentIndex,\n graphemeIndex: line.endGraphemeIndex,\n },\n };\n}\nfunction stepLineRange(prepared, start, maxWidth) {\n const line = stepPreparedLineRange(prepared, start, maxWidth);\n if (line === null)\n return null;\n return toLayoutLineRange(line);\n}\nfunction materializeLine(prepared, line) {\n return createLayoutLine(prepared, getLineTextCache(prepared), line.width, line.start.segmentIndex, line.start.graphemeIndex, line.end.segmentIndex, line.end.graphemeIndex);\n}\n// Batch low-level line geometry pass. This is the non-materializing counterpart\n// to layoutWithLines(), useful for shrinkwrap and other aggregate geometry work.\nexport function walkLineRanges(prepared, maxWidth, onLine) {\n if (prepared.widths.length === 0)\n return 0;\n return walkPreparedLines(getInternalPrepared(prepared), maxWidth, line => {\n onLine(toLayoutLineRange(line));\n });\n}\nexport function layoutNextLine(prepared, start, maxWidth) {\n const line = stepLineRange(prepared, start, maxWidth);\n if (line === null)\n return null;\n return materializeLine(prepared, line);\n}\n// Rich layout API for callers that want the actual line contents and widths.\n// Caller still supplies lineHeight at layout time. Mirrors layout()'s break\n// decisions, but keeps extra per-line bookkeeping so it should stay off the\n// resize hot path.\nexport function layoutWithLines(prepared, maxWidth, lineHeight) {\n const lines = [];\n if (prepared.widths.length === 0)\n return { lineCount: 0, height: 0, lines };\n const graphemeCache = getLineTextCache(prepared);\n const lineCount = walkPreparedLines(getInternalPrepared(prepared), maxWidth, line => {\n lines.push(materializeLayoutLine(prepared, graphemeCache, line));\n });\n return { lineCount, height: lineCount * lineHeight, lines };\n}\nexport function clearCache() {\n clearAnalysisCaches();\n sharedGraphemeSegmenter = null;\n sharedLineTextCaches = new WeakMap();\n clearMeasurementCaches();\n}\nexport function setLocale(locale) {\n setAnalysisLocale(locale);\n clearCache();\n}\n","/**\n * @pre-markdown/layout — Web Worker Script\n *\n * Runs pretext prepare() in a background thread to avoid blocking\n * the main thread on large documents.\n *\n * Communication protocol:\n * Main → Worker: { id, type: 'prepare'|'prepareWithSegments', text, font, options? }\n * Worker → Main: { id, type: 'result', result } or { id, type: 'error', error }\n *\n * Usage: new Worker(new URL('./worker-script.js', import.meta.url), { type: 'module' })\n */\n\nimport {\n prepare,\n prepareWithSegments,\n clearCache as pretextClearCache,\n setLocale as pretextSetLocale,\n} from '@chenglou/pretext'\n\nimport type { PrepareOptions } from '@chenglou/pretext'\n\n// ============================================================\n// Message Types\n// ============================================================\n\nexport interface WorkerRequest {\n id: number\n type: 'prepare' | 'prepareWithSegments' | 'clearCache' | 'setLocale'\n text?: string\n font?: string\n options?: PrepareOptions\n locale?: string\n}\n\nexport interface WorkerResponse {\n id: number\n type: 'result' | 'error'\n result?: unknown\n error?: string\n}\n\n// ============================================================\n// Worker Message Handler\n// ============================================================\n\nconst ctx = globalThis as unknown as DedicatedWorkerGlobalScope\n\nctx.onmessage = (event: MessageEvent<WorkerRequest>) => {\n const { id, type, text, font, options, locale } = event.data\n\n try {\n switch (type) {\n case 'prepare': {\n const result = prepare(text!, font!, options)\n ctx.postMessage({ id, type: 'result', result } satisfies WorkerResponse)\n break\n }\n case 'prepareWithSegments': {\n const result = prepareWithSegments(text!, font!, options)\n ctx.postMessage({ id, type: 'result', result } satisfies WorkerResponse)\n break\n }\n case 'clearCache': {\n pretextClearCache()\n ctx.postMessage({ id, type: 'result' } satisfies WorkerResponse)\n break\n }\n case 'setLocale': {\n pretextSetLocale(locale)\n ctx.postMessage({ id, type: 'result' } satisfies WorkerResponse)\n break\n }\n default: {\n ctx.postMessage({\n id,\n type: 'error',\n error: `Unknown message type: ${type}`,\n } satisfies WorkerResponse)\n }\n }\n } catch (err) {\n ctx.postMessage({\n id,\n type: 'error',\n error: err instanceof Error ? err.message : String(err),\n } satisfies WorkerResponse)\n }\n}\n"],"mappings":";AAKA,IAAM,YAAY;AAAA,EACd;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACrE;AAAA,EAAK;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EACvE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EACpE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAClE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAClE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACxE;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAM;AAAA,EACvE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACrE;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACtE;AAAA,EAAK;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAK;AAAA,EACtE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAClE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAClE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAK;AAAA,EACvE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAK;AAAA,EAAM;AAAA,EAAM;AAAA,EACvE;AAAA,EAAM;AAAA,EAAK;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACvE;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACtE;AAAA,EAAK;AAAA,EAAM;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACvE;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACtE;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAM;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAC5D;AACA,IAAM,cAAc;AAAA,EAChB;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAClE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAClE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAClE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAClE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAClE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAClE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAClE;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EACnE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAClE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAO;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EACnE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAClE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAClE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAClE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAClE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAClE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAClE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAClE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAClE;AAAA,EAAM;AAAA,EAAO;AAAA,E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","names":["ctx","sharedGraphemeSegmenter","getSharedGraphemeSegmenter","w","sharedGraphemeSegmenter"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@pre-markdown/layout",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "Pretext-based zero-DOM-reflow text layout engine",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.cjs",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js",
|
|
13
|
+
"require": "./dist/index.cjs"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"sideEffects": false,
|
|
17
|
+
"license": "MIT",
|
|
18
|
+
"author": "tickli",
|
|
19
|
+
"repository": {
|
|
20
|
+
"type": "git",
|
|
21
|
+
"url": "git+https://github.com/Leo555/pre-markdown.git",
|
|
22
|
+
"directory": "packages/layout"
|
|
23
|
+
},
|
|
24
|
+
"homepage": "https://github.com/Leo555/pre-markdown/tree/master/packages/layout#readme",
|
|
25
|
+
"bugs": {
|
|
26
|
+
"url": "https://github.com/Leo555/pre-markdown/issues"
|
|
27
|
+
},
|
|
28
|
+
"dependencies": {
|
|
29
|
+
"@chenglou/pretext": "^0.0.4",
|
|
30
|
+
"@pre-markdown/core": "0.2.0"
|
|
31
|
+
},
|
|
32
|
+
"files": [
|
|
33
|
+
"dist"
|
|
34
|
+
],
|
|
35
|
+
"keywords": [
|
|
36
|
+
"markdown",
|
|
37
|
+
"layout",
|
|
38
|
+
"pretext",
|
|
39
|
+
"virtual-scroll",
|
|
40
|
+
"text-measurement"
|
|
41
|
+
],
|
|
42
|
+
"scripts": {
|
|
43
|
+
"build": "tsup",
|
|
44
|
+
"dev": "tsup --watch",
|
|
45
|
+
"clean": "rimraf dist"
|
|
46
|
+
}
|
|
47
|
+
}
|