markdown-flow-ui 0.2.16-dev.1 → 0.2.17-dev.1

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.
@@ -1,3 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const m=200,i={han:100,latin:28,arabic:34,thai:42,otherLetterOrNumber:35,punctuationOrEmoji:100,whitespace:0},R="‍",h="\r",w=`
2
- `,g=new RegExp("\\p{Grapheme_Extend}","u"),N=new RegExp("\\p{Mark}","u"),C=new RegExp("\\p{Spacing_Mark}","u"),y=/^\s+$/u,f=new RegExp("\\p{Script_Extensions=Han}","u"),I=new RegExp("\\p{Script_Extensions=Latin}","u"),d=new RegExp("\\p{Script_Extensions=Arabic}","u"),k=new RegExp("\\p{Script_Extensions=Thai}","u"),S=/[\p{Letter}\p{Number}]/u,P=/[\p{Punctuation}\p{Symbol}]/u,O=new RegExp("\\p{Extended_Pictographic}","u");let c;const b=()=>{if(c!==void 0)return c;const e=typeof Intl>"u"?void 0:Intl.Segmenter;return c=e?new e(void 0,{granularity:"grapheme"}):null,c},a=(e,n,r)=>{const t=e.codePointAt(0);return t!==void 0&&t>=n&&t<=r},T=e=>a(e,127462,127487),G=e=>a(e,65024,65039)||a(e,917760,917999),u=e=>a(e,127995,127999),M=e=>a(e,917536,917631),x=e=>g.test(e)||N.test(e)||C.test(e)||G(e)||u(e)||M(e)||e==="⃣"||e==="ำ",E=e=>{const n=Array.from(e),r=[];for(let t=0;t<n.length;t+=1){let s=n[t];if(s===h&&n[t+1]===w){s+=n[t+1],t+=1,r.push(s);continue}if(T(s)&&T(n[t+1]||"")){s+=n[t+1],t+=1,r.push(s);continue}for(;t+1<n.length;){const o=n[t+1];if(x(o)){s+=o,t+=1;continue}if(o===R){s+=o,t+=1,t+1<n.length&&(s+=n[t+1],t+=1);continue}break}r.push(s)}return r},p=(e,n)=>{const r=b();return r?Array.from(r.segment(e),({segment:t})=>t):E(e)},H=e=>O.test(e)||Array.from(e).some(n=>T(n)||u(n)||n==="⃣"),A=e=>y.test(e)?i.whitespace:H(e)||P.test(e)?i.punctuationOrEmoji:f.test(e)?i.han:I.test(e)?i.latin:d.test(e)?i.arabic:k.test(e)?i.thai:S.test(e)?i.otherLetterOrNumber:i.punctuationOrEmoji,l=(e,n)=>p(e).map(r=>({text:r,cost:A(r)})),_=(e,n)=>({tokens:l(e),head:0}),L=e=>e.head>=e.tokens.length,Q=(e,n,r)=>{if(!n)return e;const t=e.tokens.slice(e.head);if(t.length===0)return _(n);const s=t[t.length-1],o=l(`${s.text}${n}`);return{tokens:[...t.slice(0,-1),...o],head:0}},j=(e,n)=>{let r=e.head,t=Math.max(0,n),s="";for(;r<e.tokens.length;){const o=e.tokens[r];if(o.cost>t)break;s+=o.text,t-=o.cost,r+=1}return{chunk:s,queue:{tokens:e.tokens,head:r},remainingBudget:t}};exports.CONTENT_AWARE_TYPEWRITER_TICK_BUDGET=m;exports.appendContentAwareTypewriterQueue=Q;exports.consumeContentAwareTypewriterQueue=j;exports.createContentAwareTypewriterQueue=_;exports.fallbackSegmentTypewriterGraphemes=E;exports.getContentAwareTypewriterCost=A;exports.isContentAwareTypewriterQueueEmpty=L;exports.segmentTypewriterGraphemes=p;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const m=require("../../../node_modules/unicode-segmenter/grapheme.cjs"),l=200,o={han:100,latin:28,arabic:34,thai:42,otherLetterOrNumber:35,punctuationOrEmoji:100,whitespace:0},w=/^\s+$/u,_=new RegExp("\\p{Script_Extensions=Han}","u"),y=new RegExp("\\p{Script_Extensions=Latin}","u"),R=new RegExp("\\p{Script_Extensions=Arabic}","u"),d=new RegExp("\\p{Script_Extensions=Thai}","u"),g=/[\p{Letter}\p{Number}]/u,h=/[\p{Punctuation}\p{Symbol}]/u,C=new RegExp("\\p{Extended_Pictographic}","u");let a;const N=()=>{if(a!==void 0)return a;const e=typeof Intl>"u"?void 0:Intl.Segmenter;return a=e?new e(void 0,{granularity:"grapheme"}):null,a},c=(e,t,r)=>{const n=e.codePointAt(0);return n!==void 0&&n>=t&&n<=r},P=e=>c(e,127462,127487),I=e=>c(e,127995,127999),T=e=>Array.from(m.splitGraphemes(e)),u=(e,t)=>{const r=N();return r?Array.from(r.segment(e),({segment:n})=>n):T(e)},f=e=>C.test(e)||Array.from(e).some(t=>P(t)||I(t)||t==="⃣"),p=e=>w.test(e)?o.whitespace:f(e)||h.test(e)?o.punctuationOrEmoji:_.test(e)?o.han:y.test(e)?o.latin:R.test(e)?o.arabic:d.test(e)?o.thai:g.test(e)?o.otherLetterOrNumber:o.punctuationOrEmoji,E=(e,t)=>u(e).map(r=>({text:r,cost:p(r)})),A=(e,t)=>({tokens:E(e),head:0}),S=e=>e.head>=e.tokens.length,k=(e,t,r)=>{if(!t)return e;const n=e.tokens.slice(e.head);if(n.length===0)return A(t);const i=n[n.length-1],s=E(`${i.text}${t}`);return{tokens:[...n.slice(0,-1),...s],head:0}},O=(e,t)=>{let r=e.head,n=Math.max(0,t),i="";for(;r<e.tokens.length;){const s=e.tokens[r];if(s.cost>n)break;i+=s.text,n-=s.cost,r+=1}return{chunk:i,queue:{tokens:e.tokens,head:r},remainingBudget:n}};exports.CONTENT_AWARE_TYPEWRITER_TICK_BUDGET=l;exports.appendContentAwareTypewriterQueue=k;exports.consumeContentAwareTypewriterQueue=O;exports.createContentAwareTypewriterQueue=A;exports.fallbackSegmentTypewriterGraphemes=T;exports.getContentAwareTypewriterCost=p;exports.isContentAwareTypewriterQueueEmpty=S;exports.segmentTypewriterGraphemes=u;
3
2
  //# sourceMappingURL=typewriter-pacing.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"typewriter-pacing.cjs","sources":["../../../../src/components/ContentRender/utils/typewriter-pacing.ts"],"sourcesContent":["export const CONTENT_AWARE_TYPEWRITER_TICK_BUDGET = 200;\n\nconst TYPEWRITER_GRAPHEME_COST = {\n han: 100,\n latin: 28,\n arabic: 34,\n thai: 42,\n otherLetterOrNumber: 35,\n punctuationOrEmoji: 100,\n whitespace: 0,\n} as const;\n\nconst ZERO_WIDTH_JOINER = \"\\u200d\";\nconst CARRIAGE_RETURN = \"\\r\";\nconst LINE_FEED = \"\\n\";\n\nconst GRAPHEME_EXTEND_PATTERN = /\\p{Grapheme_Extend}/u;\nconst MARK_PATTERN = /\\p{Mark}/u;\nconst SPACING_MARK_PATTERN = /\\p{Spacing_Mark}/u;\nconst WHITESPACE_PATTERN = /^\\s+$/u;\nconst HAN_PATTERN = /\\p{Script_Extensions=Han}/u;\nconst LATIN_PATTERN = /\\p{Script_Extensions=Latin}/u;\nconst ARABIC_PATTERN = /\\p{Script_Extensions=Arabic}/u;\nconst THAI_PATTERN = /\\p{Script_Extensions=Thai}/u;\nconst LETTER_OR_NUMBER_PATTERN = /[\\p{Letter}\\p{Number}]/u;\nconst PUNCTUATION_OR_SYMBOL_PATTERN = /[\\p{Punctuation}\\p{Symbol}]/u;\nconst EXTENDED_PICTOGRAPHIC_PATTERN = /\\p{Extended_Pictographic}/u;\n\nexport interface TypewriterGraphemeSegmenter {\n segment(input: string): Iterable<{ segment: string }>;\n}\n\nexport interface ContentAwareTypewriterToken {\n text: string;\n cost: number;\n}\n\nexport interface ContentAwareTypewriterQueue {\n tokens: readonly ContentAwareTypewriterToken[];\n head: number;\n}\n\nexport interface ContentAwareTypewriterConsumption {\n chunk: string;\n queue: ContentAwareTypewriterQueue;\n remainingBudget: number;\n}\n\nlet cachedIntlSegmenter: TypewriterGraphemeSegmenter | null | undefined;\n\nconst getIntlSegmenter = (): TypewriterGraphemeSegmenter | null => {\n if (cachedIntlSegmenter !== undefined) {\n return cachedIntlSegmenter;\n }\n\n const Segmenter =\n typeof Intl === \"undefined\"\n ? undefined\n : (Intl as typeof Intl & { Segmenter?: typeof Intl.Segmenter }).Segmenter;\n\n cachedIntlSegmenter = Segmenter\n ? new Segmenter(undefined, { granularity: \"grapheme\" })\n : null;\n return cachedIntlSegmenter;\n};\n\nconst isCodePointInRange = (codePoint: string, start: number, end: number) => {\n const value = codePoint.codePointAt(0);\n return value !== undefined && value >= start && value <= end;\n};\n\nconst isRegionalIndicator = (codePoint: string) =>\n isCodePointInRange(codePoint, 0x1f1e6, 0x1f1ff);\n\nconst isVariationSelector = (codePoint: string) =>\n isCodePointInRange(codePoint, 0xfe00, 0xfe0f) ||\n isCodePointInRange(codePoint, 0xe0100, 0xe01ef);\n\nconst isEmojiModifier = (codePoint: string) =>\n isCodePointInRange(codePoint, 0x1f3fb, 0x1f3ff);\n\nconst isEmojiTag = (codePoint: string) =>\n isCodePointInRange(codePoint, 0xe0020, 0xe007f);\n\nconst isFallbackExtend = (codePoint: string) =>\n GRAPHEME_EXTEND_PATTERN.test(codePoint) ||\n MARK_PATTERN.test(codePoint) ||\n SPACING_MARK_PATTERN.test(codePoint) ||\n isVariationSelector(codePoint) ||\n isEmojiModifier(codePoint) ||\n isEmojiTag(codePoint) ||\n codePoint === \"\\u20e3\" ||\n codePoint === \"\\u0e33\";\n\nexport const fallbackSegmentTypewriterGraphemes = (value: string) => {\n const codePoints = Array.from(value);\n const graphemes: string[] = [];\n\n for (let index = 0; index < codePoints.length; index += 1) {\n let grapheme = codePoints[index];\n\n if (grapheme === CARRIAGE_RETURN && codePoints[index + 1] === LINE_FEED) {\n grapheme += codePoints[index + 1];\n index += 1;\n graphemes.push(grapheme);\n continue;\n }\n\n if (\n isRegionalIndicator(grapheme) &&\n isRegionalIndicator(codePoints[index + 1] || \"\")\n ) {\n grapheme += codePoints[index + 1];\n index += 1;\n graphemes.push(grapheme);\n continue;\n }\n\n while (index + 1 < codePoints.length) {\n const nextCodePoint = codePoints[index + 1];\n\n if (isFallbackExtend(nextCodePoint)) {\n grapheme += nextCodePoint;\n index += 1;\n continue;\n }\n\n if (nextCodePoint === ZERO_WIDTH_JOINER) {\n grapheme += nextCodePoint;\n index += 1;\n\n if (index + 1 < codePoints.length) {\n grapheme += codePoints[index + 1];\n index += 1;\n }\n\n continue;\n }\n\n break;\n }\n\n graphemes.push(grapheme);\n }\n\n return graphemes;\n};\n\nexport const segmentTypewriterGraphemes = (\n value: string,\n segmenter?: TypewriterGraphemeSegmenter | null\n) => {\n const resolvedSegmenter =\n segmenter === undefined ? getIntlSegmenter() : segmenter;\n\n if (!resolvedSegmenter) {\n return fallbackSegmentTypewriterGraphemes(value);\n }\n\n return Array.from(resolvedSegmenter.segment(value), ({ segment }) => segment);\n};\n\nconst isEmojiGrapheme = (grapheme: string) =>\n EXTENDED_PICTOGRAPHIC_PATTERN.test(grapheme) ||\n Array.from(grapheme).some(\n (codePoint) =>\n isRegionalIndicator(codePoint) ||\n isEmojiModifier(codePoint) ||\n codePoint === \"\\u20e3\"\n );\n\nexport const getContentAwareTypewriterCost = (grapheme: string) => {\n if (WHITESPACE_PATTERN.test(grapheme)) {\n return TYPEWRITER_GRAPHEME_COST.whitespace;\n }\n\n if (\n isEmojiGrapheme(grapheme) ||\n PUNCTUATION_OR_SYMBOL_PATTERN.test(grapheme)\n ) {\n return TYPEWRITER_GRAPHEME_COST.punctuationOrEmoji;\n }\n\n if (HAN_PATTERN.test(grapheme)) {\n return TYPEWRITER_GRAPHEME_COST.han;\n }\n\n if (LATIN_PATTERN.test(grapheme)) {\n return TYPEWRITER_GRAPHEME_COST.latin;\n }\n\n if (ARABIC_PATTERN.test(grapheme)) {\n return TYPEWRITER_GRAPHEME_COST.arabic;\n }\n\n if (THAI_PATTERN.test(grapheme)) {\n return TYPEWRITER_GRAPHEME_COST.thai;\n }\n\n if (LETTER_OR_NUMBER_PATTERN.test(grapheme)) {\n return TYPEWRITER_GRAPHEME_COST.otherLetterOrNumber;\n }\n\n return TYPEWRITER_GRAPHEME_COST.punctuationOrEmoji;\n};\n\nconst tokenizeContentAwareTypewriterText = (\n value: string,\n segmenter?: TypewriterGraphemeSegmenter | null\n) =>\n segmentTypewriterGraphemes(value, segmenter).map((text) => ({\n text,\n cost: getContentAwareTypewriterCost(text),\n }));\n\nexport const createContentAwareTypewriterQueue = (\n value: string,\n segmenter?: TypewriterGraphemeSegmenter | null\n): ContentAwareTypewriterQueue => ({\n tokens: tokenizeContentAwareTypewriterText(value, segmenter),\n head: 0,\n});\n\nexport const isContentAwareTypewriterQueueEmpty = (\n queue: ContentAwareTypewriterQueue\n) => queue.head >= queue.tokens.length;\n\nexport const appendContentAwareTypewriterQueue = (\n queue: ContentAwareTypewriterQueue,\n suffix: string,\n segmenter?: TypewriterGraphemeSegmenter | null\n): ContentAwareTypewriterQueue => {\n if (!suffix) {\n return queue;\n }\n\n const remainingTokens = queue.tokens.slice(queue.head);\n if (remainingTokens.length === 0) {\n return createContentAwareTypewriterQueue(suffix, segmenter);\n }\n\n const lastToken = remainingTokens[remainingTokens.length - 1];\n const repairedTail = tokenizeContentAwareTypewriterText(\n `${lastToken.text}${suffix}`,\n segmenter\n );\n\n return {\n tokens: [...remainingTokens.slice(0, -1), ...repairedTail],\n head: 0,\n };\n};\n\nexport const consumeContentAwareTypewriterQueue = (\n queue: ContentAwareTypewriterQueue,\n availableBudget: number\n): ContentAwareTypewriterConsumption => {\n let head = queue.head;\n let remainingBudget = Math.max(0, availableBudget);\n let chunk = \"\";\n\n while (head < queue.tokens.length) {\n const token = queue.tokens[head];\n if (token.cost > remainingBudget) {\n break;\n }\n\n chunk += token.text;\n remainingBudget -= token.cost;\n head += 1;\n }\n\n return {\n chunk,\n queue: {\n tokens: queue.tokens,\n head,\n },\n remainingBudget,\n };\n};\n\nexport const getContentAwareTypewriterTickCount = (\n value: string,\n segmenter?: TypewriterGraphemeSegmenter | null\n) => {\n let queue = createContentAwareTypewriterQueue(value, segmenter);\n let budget = 0;\n let ticks = 0;\n\n while (!isContentAwareTypewriterQueueEmpty(queue)) {\n budget += CONTENT_AWARE_TYPEWRITER_TICK_BUDGET;\n const result = consumeContentAwareTypewriterQueue(queue, budget);\n\n if (!result.chunk) {\n throw new Error(\"Typewriter pacing could not consume the next grapheme\");\n }\n\n queue = result.queue;\n budget = result.remainingBudget;\n ticks += 1;\n }\n\n return ticks;\n};\n"],"names":["CONTENT_AWARE_TYPEWRITER_TICK_BUDGET","TYPEWRITER_GRAPHEME_COST","ZERO_WIDTH_JOINER","CARRIAGE_RETURN","LINE_FEED","GRAPHEME_EXTEND_PATTERN","MARK_PATTERN","SPACING_MARK_PATTERN","WHITESPACE_PATTERN","HAN_PATTERN","LATIN_PATTERN","ARABIC_PATTERN","THAI_PATTERN","LETTER_OR_NUMBER_PATTERN","PUNCTUATION_OR_SYMBOL_PATTERN","EXTENDED_PICTOGRAPHIC_PATTERN","cachedIntlSegmenter","getIntlSegmenter","Segmenter","isCodePointInRange","codePoint","start","end","value","isRegionalIndicator","isVariationSelector","isEmojiModifier","isEmojiTag","isFallbackExtend","fallbackSegmentTypewriterGraphemes","codePoints","graphemes","index","grapheme","nextCodePoint","segmentTypewriterGraphemes","segmenter","resolvedSegmenter","segment","isEmojiGrapheme","getContentAwareTypewriterCost","tokenizeContentAwareTypewriterText","text","createContentAwareTypewriterQueue","isContentAwareTypewriterQueueEmpty","queue","appendContentAwareTypewriterQueue","suffix","remainingTokens","lastToken","repairedTail","consumeContentAwareTypewriterQueue","availableBudget","head","remainingBudget","chunk","token"],"mappings":"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"}
1
+ {"version":3,"file":"typewriter-pacing.cjs","sources":["../../../../src/components/ContentRender/utils/typewriter-pacing.ts"],"sourcesContent":["import { splitGraphemes } from \"unicode-segmenter/grapheme\";\n\nexport const CONTENT_AWARE_TYPEWRITER_TICK_BUDGET = 200;\n\nconst TYPEWRITER_GRAPHEME_COST = {\n han: 100,\n latin: 28,\n arabic: 34,\n thai: 42,\n otherLetterOrNumber: 35,\n punctuationOrEmoji: 100,\n whitespace: 0,\n} as const;\n\nconst WHITESPACE_PATTERN = /^\\s+$/u;\nconst HAN_PATTERN = /\\p{Script_Extensions=Han}/u;\nconst LATIN_PATTERN = /\\p{Script_Extensions=Latin}/u;\nconst ARABIC_PATTERN = /\\p{Script_Extensions=Arabic}/u;\nconst THAI_PATTERN = /\\p{Script_Extensions=Thai}/u;\nconst LETTER_OR_NUMBER_PATTERN = /[\\p{Letter}\\p{Number}]/u;\nconst PUNCTUATION_OR_SYMBOL_PATTERN = /[\\p{Punctuation}\\p{Symbol}]/u;\nconst EXTENDED_PICTOGRAPHIC_PATTERN = /\\p{Extended_Pictographic}/u;\n\nexport interface TypewriterGraphemeSegmenter {\n segment(input: string): Iterable<{ segment: string }>;\n}\n\nexport interface ContentAwareTypewriterToken {\n text: string;\n cost: number;\n}\n\nexport interface ContentAwareTypewriterQueue {\n tokens: readonly ContentAwareTypewriterToken[];\n head: number;\n}\n\nexport interface ContentAwareTypewriterConsumption {\n chunk: string;\n queue: ContentAwareTypewriterQueue;\n remainingBudget: number;\n}\n\nlet cachedIntlSegmenter: TypewriterGraphemeSegmenter | null | undefined;\n\nconst getIntlSegmenter = (): TypewriterGraphemeSegmenter | null => {\n if (cachedIntlSegmenter !== undefined) {\n return cachedIntlSegmenter;\n }\n\n const Segmenter =\n typeof Intl === \"undefined\"\n ? undefined\n : (Intl as typeof Intl & { Segmenter?: typeof Intl.Segmenter }).Segmenter;\n\n cachedIntlSegmenter = Segmenter\n ? new Segmenter(undefined, { granularity: \"grapheme\" })\n : null;\n return cachedIntlSegmenter;\n};\n\nconst isCodePointInRange = (codePoint: string, start: number, end: number) => {\n const value = codePoint.codePointAt(0);\n return value !== undefined && value >= start && value <= end;\n};\n\nconst isRegionalIndicator = (codePoint: string) =>\n isCodePointInRange(codePoint, 0x1f1e6, 0x1f1ff);\n\nconst isEmojiModifier = (codePoint: string) =>\n isCodePointInRange(codePoint, 0x1f3fb, 0x1f3ff);\nexport const fallbackSegmentTypewriterGraphemes = (value: string) =>\n Array.from(splitGraphemes(value));\n\nexport const segmentTypewriterGraphemes = (\n value: string,\n segmenter?: TypewriterGraphemeSegmenter | null\n) => {\n const resolvedSegmenter =\n segmenter === undefined ? getIntlSegmenter() : segmenter;\n\n if (!resolvedSegmenter) {\n return fallbackSegmentTypewriterGraphemes(value);\n }\n\n return Array.from(resolvedSegmenter.segment(value), ({ segment }) => segment);\n};\n\nconst isEmojiGrapheme = (grapheme: string) =>\n EXTENDED_PICTOGRAPHIC_PATTERN.test(grapheme) ||\n Array.from(grapheme).some(\n (codePoint) =>\n isRegionalIndicator(codePoint) ||\n isEmojiModifier(codePoint) ||\n codePoint === \"\\u20e3\"\n );\n\nexport const getContentAwareTypewriterCost = (grapheme: string) => {\n if (WHITESPACE_PATTERN.test(grapheme)) {\n return TYPEWRITER_GRAPHEME_COST.whitespace;\n }\n\n if (\n isEmojiGrapheme(grapheme) ||\n PUNCTUATION_OR_SYMBOL_PATTERN.test(grapheme)\n ) {\n return TYPEWRITER_GRAPHEME_COST.punctuationOrEmoji;\n }\n\n if (HAN_PATTERN.test(grapheme)) {\n return TYPEWRITER_GRAPHEME_COST.han;\n }\n\n if (LATIN_PATTERN.test(grapheme)) {\n return TYPEWRITER_GRAPHEME_COST.latin;\n }\n\n if (ARABIC_PATTERN.test(grapheme)) {\n return TYPEWRITER_GRAPHEME_COST.arabic;\n }\n\n if (THAI_PATTERN.test(grapheme)) {\n return TYPEWRITER_GRAPHEME_COST.thai;\n }\n\n if (LETTER_OR_NUMBER_PATTERN.test(grapheme)) {\n return TYPEWRITER_GRAPHEME_COST.otherLetterOrNumber;\n }\n\n return TYPEWRITER_GRAPHEME_COST.punctuationOrEmoji;\n};\n\nconst tokenizeContentAwareTypewriterText = (\n value: string,\n segmenter?: TypewriterGraphemeSegmenter | null\n) =>\n segmentTypewriterGraphemes(value, segmenter).map((text) => ({\n text,\n cost: getContentAwareTypewriterCost(text),\n }));\n\nexport const createContentAwareTypewriterQueue = (\n value: string,\n segmenter?: TypewriterGraphemeSegmenter | null\n): ContentAwareTypewriterQueue => ({\n tokens: tokenizeContentAwareTypewriterText(value, segmenter),\n head: 0,\n});\n\nexport const isContentAwareTypewriterQueueEmpty = (\n queue: ContentAwareTypewriterQueue\n) => queue.head >= queue.tokens.length;\n\nexport const appendContentAwareTypewriterQueue = (\n queue: ContentAwareTypewriterQueue,\n suffix: string,\n segmenter?: TypewriterGraphemeSegmenter | null\n): ContentAwareTypewriterQueue => {\n if (!suffix) {\n return queue;\n }\n\n const remainingTokens = queue.tokens.slice(queue.head);\n if (remainingTokens.length === 0) {\n return createContentAwareTypewriterQueue(suffix, segmenter);\n }\n\n const lastToken = remainingTokens[remainingTokens.length - 1];\n const repairedTail = tokenizeContentAwareTypewriterText(\n `${lastToken.text}${suffix}`,\n segmenter\n );\n\n return {\n tokens: [...remainingTokens.slice(0, -1), ...repairedTail],\n head: 0,\n };\n};\n\nexport const consumeContentAwareTypewriterQueue = (\n queue: ContentAwareTypewriterQueue,\n availableBudget: number\n): ContentAwareTypewriterConsumption => {\n let head = queue.head;\n let remainingBudget = Math.max(0, availableBudget);\n let chunk = \"\";\n\n while (head < queue.tokens.length) {\n const token = queue.tokens[head];\n if (token.cost > remainingBudget) {\n break;\n }\n\n chunk += token.text;\n remainingBudget -= token.cost;\n head += 1;\n }\n\n return {\n chunk,\n queue: {\n tokens: queue.tokens,\n head,\n },\n remainingBudget,\n };\n};\n\nexport const getContentAwareTypewriterTickCount = (\n value: string,\n segmenter?: TypewriterGraphemeSegmenter | null\n) => {\n let queue = createContentAwareTypewriterQueue(value, segmenter);\n let budget = 0;\n let ticks = 0;\n\n while (!isContentAwareTypewriterQueueEmpty(queue)) {\n budget += CONTENT_AWARE_TYPEWRITER_TICK_BUDGET;\n const result = consumeContentAwareTypewriterQueue(queue, budget);\n\n if (!result.chunk) {\n throw new Error(\"Typewriter pacing could not consume the next grapheme\");\n }\n\n queue = result.queue;\n budget = result.remainingBudget;\n ticks += 1;\n }\n\n return ticks;\n};\n"],"names":["CONTENT_AWARE_TYPEWRITER_TICK_BUDGET","TYPEWRITER_GRAPHEME_COST","WHITESPACE_PATTERN","HAN_PATTERN","LATIN_PATTERN","ARABIC_PATTERN","THAI_PATTERN","LETTER_OR_NUMBER_PATTERN","PUNCTUATION_OR_SYMBOL_PATTERN","EXTENDED_PICTOGRAPHIC_PATTERN","cachedIntlSegmenter","getIntlSegmenter","Segmenter","isCodePointInRange","codePoint","start","end","value","isRegionalIndicator","isEmojiModifier","fallbackSegmentTypewriterGraphemes","splitGraphemes","segmentTypewriterGraphemes","segmenter","resolvedSegmenter","segment","isEmojiGrapheme","grapheme","getContentAwareTypewriterCost","tokenizeContentAwareTypewriterText","text","createContentAwareTypewriterQueue","isContentAwareTypewriterQueueEmpty","queue","appendContentAwareTypewriterQueue","suffix","remainingTokens","lastToken","repairedTail","consumeContentAwareTypewriterQueue","availableBudget","head","remainingBudget","chunk","token"],"mappings":"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"}
@@ -1,4 +1,5 @@
1
- const H = 200, i = {
1
+ import { splitGraphemes as u } from "../../../node_modules/unicode-segmenter/grapheme.es.js";
2
+ const y = 200, o = {
2
3
  han: 100,
3
4
  latin: 28,
4
5
  arabic: 34,
@@ -6,93 +7,65 @@ const H = 200, i = {
6
7
  otherLetterOrNumber: 35,
7
8
  punctuationOrEmoji: 100,
8
9
  whitespace: 0
9
- }, p = "‍", A = "\r", l = `
10
- `, _ = new RegExp("\\p{Grapheme_Extend}", "u"), R = new RegExp("\\p{Mark}", "u"), m = new RegExp("\\p{Spacing_Mark}", "u"), h = /^\s+$/u, N = new RegExp("\\p{Script_Extensions=Han}", "u"), g = new RegExp("\\p{Script_Extensions=Latin}", "u"), f = new RegExp("\\p{Script_Extensions=Arabic}", "u"), I = new RegExp("\\p{Script_Extensions=Thai}", "u"), k = /[\p{Letter}\p{Number}]/u, w = /[\p{Punctuation}\p{Symbol}]/u, C = new RegExp("\\p{Extended_Pictographic}", "u");
11
- let a;
12
- const d = () => {
13
- if (a !== void 0)
14
- return a;
10
+ }, E = /^\s+$/u, p = new RegExp("\\p{Script_Extensions=Han}", "u"), m = new RegExp("\\p{Script_Extensions=Latin}", "u"), A = new RegExp("\\p{Script_Extensions=Arabic}", "u"), l = new RegExp("\\p{Script_Extensions=Thai}", "u"), _ = /[\p{Letter}\p{Number}]/u, R = /[\p{Punctuation}\p{Symbol}]/u, d = new RegExp("\\p{Extended_Pictographic}", "u");
11
+ let c;
12
+ const h = () => {
13
+ if (c !== void 0)
14
+ return c;
15
15
  const t = typeof Intl > "u" ? void 0 : Intl.Segmenter;
16
- return a = t ? new t(void 0, { granularity: "grapheme" }) : null, a;
17
- }, c = (t, n, r) => {
18
- const e = t.codePointAt(0);
19
- return e !== void 0 && e >= n && e <= r;
20
- }, T = (t) => c(t, 127462, 127487), S = (t) => c(t, 65024, 65039) || c(t, 917760, 917999), E = (t) => c(t, 127995, 127999), P = (t) => c(t, 917536, 917631), y = (t) => _.test(t) || R.test(t) || m.test(t) || S(t) || E(t) || P(t) || t === "⃣" || t === "ำ", O = (t) => {
21
- const n = Array.from(t), r = [];
22
- for (let e = 0; e < n.length; e += 1) {
23
- let s = n[e];
24
- if (s === A && n[e + 1] === l) {
25
- s += n[e + 1], e += 1, r.push(s);
26
- continue;
27
- }
28
- if (T(s) && T(n[e + 1] || "")) {
29
- s += n[e + 1], e += 1, r.push(s);
30
- continue;
31
- }
32
- for (; e + 1 < n.length; ) {
33
- const o = n[e + 1];
34
- if (y(o)) {
35
- s += o, e += 1;
36
- continue;
37
- }
38
- if (o === p) {
39
- s += o, e += 1, e + 1 < n.length && (s += n[e + 1], e += 1);
40
- continue;
41
- }
42
- break;
43
- }
44
- r.push(s);
45
- }
46
- return r;
47
- }, b = (t, n) => {
48
- const r = d();
49
- return r ? Array.from(r.segment(t), ({ segment: e }) => e) : O(t);
50
- }, x = (t) => C.test(t) || Array.from(t).some(
51
- (n) => T(n) || E(n) || n === "⃣"
52
- ), G = (t) => h.test(t) ? i.whitespace : x(t) || w.test(t) ? i.punctuationOrEmoji : N.test(t) ? i.han : g.test(t) ? i.latin : f.test(t) ? i.arabic : I.test(t) ? i.thai : k.test(t) ? i.otherLetterOrNumber : i.punctuationOrEmoji, u = (t, n) => b(t).map((r) => ({
16
+ return c = t ? new t(void 0, { granularity: "grapheme" }) : null, c;
17
+ }, a = (t, e, r) => {
18
+ const n = t.codePointAt(0);
19
+ return n !== void 0 && n >= e && n <= r;
20
+ }, N = (t) => a(t, 127462, 127487), g = (t) => a(t, 127995, 127999), w = (t) => Array.from(u(t)), P = (t, e) => {
21
+ const r = h();
22
+ return r ? Array.from(r.segment(t), ({ segment: n }) => n) : w(t);
23
+ }, f = (t) => d.test(t) || Array.from(t).some(
24
+ (e) => N(e) || g(e) || e === "⃣"
25
+ ), C = (t) => E.test(t) ? o.whitespace : f(t) || R.test(t) ? o.punctuationOrEmoji : p.test(t) ? o.han : m.test(t) ? o.latin : A.test(t) ? o.arabic : l.test(t) ? o.thai : _.test(t) ? o.otherLetterOrNumber : o.punctuationOrEmoji, T = (t, e) => P(t).map((r) => ({
53
26
  text: r,
54
- cost: G(r)
55
- })), M = (t, n) => ({
56
- tokens: u(t),
27
+ cost: C(r)
28
+ })), I = (t, e) => ({
29
+ tokens: T(t),
57
30
  head: 0
58
- }), L = (t) => t.head >= t.tokens.length, j = (t, n, r) => {
59
- if (!n)
31
+ }), S = (t) => t.head >= t.tokens.length, O = (t, e, r) => {
32
+ if (!e)
60
33
  return t;
61
- const e = t.tokens.slice(t.head);
62
- if (e.length === 0)
63
- return M(n);
64
- const s = e[e.length - 1], o = u(
65
- `${s.text}${n}`
34
+ const n = t.tokens.slice(t.head);
35
+ if (n.length === 0)
36
+ return I(e);
37
+ const i = n[n.length - 1], s = T(
38
+ `${i.text}${e}`
66
39
  );
67
40
  return {
68
- tokens: [...e.slice(0, -1), ...o],
41
+ tokens: [...n.slice(0, -1), ...s],
69
42
  head: 0
70
43
  };
71
- }, D = (t, n) => {
72
- let r = t.head, e = Math.max(0, n), s = "";
44
+ }, b = (t, e) => {
45
+ let r = t.head, n = Math.max(0, e), i = "";
73
46
  for (; r < t.tokens.length; ) {
74
- const o = t.tokens[r];
75
- if (o.cost > e)
47
+ const s = t.tokens[r];
48
+ if (s.cost > n)
76
49
  break;
77
- s += o.text, e -= o.cost, r += 1;
50
+ i += s.text, n -= s.cost, r += 1;
78
51
  }
79
52
  return {
80
- chunk: s,
53
+ chunk: i,
81
54
  queue: {
82
55
  tokens: t.tokens,
83
56
  head: r
84
57
  },
85
- remainingBudget: e
58
+ remainingBudget: n
86
59
  };
87
60
  };
88
61
  export {
89
- H as CONTENT_AWARE_TYPEWRITER_TICK_BUDGET,
90
- j as appendContentAwareTypewriterQueue,
91
- D as consumeContentAwareTypewriterQueue,
92
- M as createContentAwareTypewriterQueue,
93
- O as fallbackSegmentTypewriterGraphemes,
94
- G as getContentAwareTypewriterCost,
95
- L as isContentAwareTypewriterQueueEmpty,
96
- b as segmentTypewriterGraphemes
62
+ y as CONTENT_AWARE_TYPEWRITER_TICK_BUDGET,
63
+ O as appendContentAwareTypewriterQueue,
64
+ b as consumeContentAwareTypewriterQueue,
65
+ I as createContentAwareTypewriterQueue,
66
+ w as fallbackSegmentTypewriterGraphemes,
67
+ C as getContentAwareTypewriterCost,
68
+ S as isContentAwareTypewriterQueueEmpty,
69
+ P as segmentTypewriterGraphemes
97
70
  };
98
71
  //# sourceMappingURL=typewriter-pacing.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"typewriter-pacing.es.js","sources":["../../../../src/components/ContentRender/utils/typewriter-pacing.ts"],"sourcesContent":["export const CONTENT_AWARE_TYPEWRITER_TICK_BUDGET = 200;\n\nconst TYPEWRITER_GRAPHEME_COST = {\n han: 100,\n latin: 28,\n arabic: 34,\n thai: 42,\n otherLetterOrNumber: 35,\n punctuationOrEmoji: 100,\n whitespace: 0,\n} as const;\n\nconst ZERO_WIDTH_JOINER = \"\\u200d\";\nconst CARRIAGE_RETURN = \"\\r\";\nconst LINE_FEED = \"\\n\";\n\nconst GRAPHEME_EXTEND_PATTERN = /\\p{Grapheme_Extend}/u;\nconst MARK_PATTERN = /\\p{Mark}/u;\nconst SPACING_MARK_PATTERN = /\\p{Spacing_Mark}/u;\nconst WHITESPACE_PATTERN = /^\\s+$/u;\nconst HAN_PATTERN = /\\p{Script_Extensions=Han}/u;\nconst LATIN_PATTERN = /\\p{Script_Extensions=Latin}/u;\nconst ARABIC_PATTERN = /\\p{Script_Extensions=Arabic}/u;\nconst THAI_PATTERN = /\\p{Script_Extensions=Thai}/u;\nconst LETTER_OR_NUMBER_PATTERN = /[\\p{Letter}\\p{Number}]/u;\nconst PUNCTUATION_OR_SYMBOL_PATTERN = /[\\p{Punctuation}\\p{Symbol}]/u;\nconst EXTENDED_PICTOGRAPHIC_PATTERN = /\\p{Extended_Pictographic}/u;\n\nexport interface TypewriterGraphemeSegmenter {\n segment(input: string): Iterable<{ segment: string }>;\n}\n\nexport interface ContentAwareTypewriterToken {\n text: string;\n cost: number;\n}\n\nexport interface ContentAwareTypewriterQueue {\n tokens: readonly ContentAwareTypewriterToken[];\n head: number;\n}\n\nexport interface ContentAwareTypewriterConsumption {\n chunk: string;\n queue: ContentAwareTypewriterQueue;\n remainingBudget: number;\n}\n\nlet cachedIntlSegmenter: TypewriterGraphemeSegmenter | null | undefined;\n\nconst getIntlSegmenter = (): TypewriterGraphemeSegmenter | null => {\n if (cachedIntlSegmenter !== undefined) {\n return cachedIntlSegmenter;\n }\n\n const Segmenter =\n typeof Intl === \"undefined\"\n ? undefined\n : (Intl as typeof Intl & { Segmenter?: typeof Intl.Segmenter }).Segmenter;\n\n cachedIntlSegmenter = Segmenter\n ? new Segmenter(undefined, { granularity: \"grapheme\" })\n : null;\n return cachedIntlSegmenter;\n};\n\nconst isCodePointInRange = (codePoint: string, start: number, end: number) => {\n const value = codePoint.codePointAt(0);\n return value !== undefined && value >= start && value <= end;\n};\n\nconst isRegionalIndicator = (codePoint: string) =>\n isCodePointInRange(codePoint, 0x1f1e6, 0x1f1ff);\n\nconst isVariationSelector = (codePoint: string) =>\n isCodePointInRange(codePoint, 0xfe00, 0xfe0f) ||\n isCodePointInRange(codePoint, 0xe0100, 0xe01ef);\n\nconst isEmojiModifier = (codePoint: string) =>\n isCodePointInRange(codePoint, 0x1f3fb, 0x1f3ff);\n\nconst isEmojiTag = (codePoint: string) =>\n isCodePointInRange(codePoint, 0xe0020, 0xe007f);\n\nconst isFallbackExtend = (codePoint: string) =>\n GRAPHEME_EXTEND_PATTERN.test(codePoint) ||\n MARK_PATTERN.test(codePoint) ||\n SPACING_MARK_PATTERN.test(codePoint) ||\n isVariationSelector(codePoint) ||\n isEmojiModifier(codePoint) ||\n isEmojiTag(codePoint) ||\n codePoint === \"\\u20e3\" ||\n codePoint === \"\\u0e33\";\n\nexport const fallbackSegmentTypewriterGraphemes = (value: string) => {\n const codePoints = Array.from(value);\n const graphemes: string[] = [];\n\n for (let index = 0; index < codePoints.length; index += 1) {\n let grapheme = codePoints[index];\n\n if (grapheme === CARRIAGE_RETURN && codePoints[index + 1] === LINE_FEED) {\n grapheme += codePoints[index + 1];\n index += 1;\n graphemes.push(grapheme);\n continue;\n }\n\n if (\n isRegionalIndicator(grapheme) &&\n isRegionalIndicator(codePoints[index + 1] || \"\")\n ) {\n grapheme += codePoints[index + 1];\n index += 1;\n graphemes.push(grapheme);\n continue;\n }\n\n while (index + 1 < codePoints.length) {\n const nextCodePoint = codePoints[index + 1];\n\n if (isFallbackExtend(nextCodePoint)) {\n grapheme += nextCodePoint;\n index += 1;\n continue;\n }\n\n if (nextCodePoint === ZERO_WIDTH_JOINER) {\n grapheme += nextCodePoint;\n index += 1;\n\n if (index + 1 < codePoints.length) {\n grapheme += codePoints[index + 1];\n index += 1;\n }\n\n continue;\n }\n\n break;\n }\n\n graphemes.push(grapheme);\n }\n\n return graphemes;\n};\n\nexport const segmentTypewriterGraphemes = (\n value: string,\n segmenter?: TypewriterGraphemeSegmenter | null\n) => {\n const resolvedSegmenter =\n segmenter === undefined ? getIntlSegmenter() : segmenter;\n\n if (!resolvedSegmenter) {\n return fallbackSegmentTypewriterGraphemes(value);\n }\n\n return Array.from(resolvedSegmenter.segment(value), ({ segment }) => segment);\n};\n\nconst isEmojiGrapheme = (grapheme: string) =>\n EXTENDED_PICTOGRAPHIC_PATTERN.test(grapheme) ||\n Array.from(grapheme).some(\n (codePoint) =>\n isRegionalIndicator(codePoint) ||\n isEmojiModifier(codePoint) ||\n codePoint === \"\\u20e3\"\n );\n\nexport const getContentAwareTypewriterCost = (grapheme: string) => {\n if (WHITESPACE_PATTERN.test(grapheme)) {\n return TYPEWRITER_GRAPHEME_COST.whitespace;\n }\n\n if (\n isEmojiGrapheme(grapheme) ||\n PUNCTUATION_OR_SYMBOL_PATTERN.test(grapheme)\n ) {\n return TYPEWRITER_GRAPHEME_COST.punctuationOrEmoji;\n }\n\n if (HAN_PATTERN.test(grapheme)) {\n return TYPEWRITER_GRAPHEME_COST.han;\n }\n\n if (LATIN_PATTERN.test(grapheme)) {\n return TYPEWRITER_GRAPHEME_COST.latin;\n }\n\n if (ARABIC_PATTERN.test(grapheme)) {\n return TYPEWRITER_GRAPHEME_COST.arabic;\n }\n\n if (THAI_PATTERN.test(grapheme)) {\n return TYPEWRITER_GRAPHEME_COST.thai;\n }\n\n if (LETTER_OR_NUMBER_PATTERN.test(grapheme)) {\n return TYPEWRITER_GRAPHEME_COST.otherLetterOrNumber;\n }\n\n return TYPEWRITER_GRAPHEME_COST.punctuationOrEmoji;\n};\n\nconst tokenizeContentAwareTypewriterText = (\n value: string,\n segmenter?: TypewriterGraphemeSegmenter | null\n) =>\n segmentTypewriterGraphemes(value, segmenter).map((text) => ({\n text,\n cost: getContentAwareTypewriterCost(text),\n }));\n\nexport const createContentAwareTypewriterQueue = (\n value: string,\n segmenter?: TypewriterGraphemeSegmenter | null\n): ContentAwareTypewriterQueue => ({\n tokens: tokenizeContentAwareTypewriterText(value, segmenter),\n head: 0,\n});\n\nexport const isContentAwareTypewriterQueueEmpty = (\n queue: ContentAwareTypewriterQueue\n) => queue.head >= queue.tokens.length;\n\nexport const appendContentAwareTypewriterQueue = (\n queue: ContentAwareTypewriterQueue,\n suffix: string,\n segmenter?: TypewriterGraphemeSegmenter | null\n): ContentAwareTypewriterQueue => {\n if (!suffix) {\n return queue;\n }\n\n const remainingTokens = queue.tokens.slice(queue.head);\n if (remainingTokens.length === 0) {\n return createContentAwareTypewriterQueue(suffix, segmenter);\n }\n\n const lastToken = remainingTokens[remainingTokens.length - 1];\n const repairedTail = tokenizeContentAwareTypewriterText(\n `${lastToken.text}${suffix}`,\n segmenter\n );\n\n return {\n tokens: [...remainingTokens.slice(0, -1), ...repairedTail],\n head: 0,\n };\n};\n\nexport const consumeContentAwareTypewriterQueue = (\n queue: ContentAwareTypewriterQueue,\n availableBudget: number\n): ContentAwareTypewriterConsumption => {\n let head = queue.head;\n let remainingBudget = Math.max(0, availableBudget);\n let chunk = \"\";\n\n while (head < queue.tokens.length) {\n const token = queue.tokens[head];\n if (token.cost > remainingBudget) {\n break;\n }\n\n chunk += token.text;\n remainingBudget -= token.cost;\n head += 1;\n }\n\n return {\n chunk,\n queue: {\n tokens: queue.tokens,\n head,\n },\n remainingBudget,\n };\n};\n\nexport const getContentAwareTypewriterTickCount = (\n value: string,\n segmenter?: TypewriterGraphemeSegmenter | null\n) => {\n let queue = createContentAwareTypewriterQueue(value, segmenter);\n let budget = 0;\n let ticks = 0;\n\n while (!isContentAwareTypewriterQueueEmpty(queue)) {\n budget += CONTENT_AWARE_TYPEWRITER_TICK_BUDGET;\n const result = consumeContentAwareTypewriterQueue(queue, budget);\n\n if (!result.chunk) {\n throw new Error(\"Typewriter pacing could not consume the next grapheme\");\n }\n\n queue = result.queue;\n budget = result.remainingBudget;\n ticks += 1;\n }\n\n return ticks;\n};\n"],"names":["CONTENT_AWARE_TYPEWRITER_TICK_BUDGET","TYPEWRITER_GRAPHEME_COST","ZERO_WIDTH_JOINER","CARRIAGE_RETURN","LINE_FEED","GRAPHEME_EXTEND_PATTERN","MARK_PATTERN","SPACING_MARK_PATTERN","WHITESPACE_PATTERN","HAN_PATTERN","LATIN_PATTERN","ARABIC_PATTERN","THAI_PATTERN","LETTER_OR_NUMBER_PATTERN","PUNCTUATION_OR_SYMBOL_PATTERN","EXTENDED_PICTOGRAPHIC_PATTERN","cachedIntlSegmenter","getIntlSegmenter","Segmenter","isCodePointInRange","codePoint","start","end","value","isRegionalIndicator","isVariationSelector","isEmojiModifier","isEmojiTag","isFallbackExtend","fallbackSegmentTypewriterGraphemes","codePoints","graphemes","index","grapheme","nextCodePoint","segmentTypewriterGraphemes","segmenter","resolvedSegmenter","segment","isEmojiGrapheme","getContentAwareTypewriterCost","tokenizeContentAwareTypewriterText","text","createContentAwareTypewriterQueue","isContentAwareTypewriterQueueEmpty","queue","appendContentAwareTypewriterQueue","suffix","remainingTokens","lastToken","repairedTail","consumeContentAwareTypewriterQueue","availableBudget","head","remainingBudget","chunk","token"],"mappings":"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"}
1
+ {"version":3,"file":"typewriter-pacing.es.js","sources":["../../../../src/components/ContentRender/utils/typewriter-pacing.ts"],"sourcesContent":["import { splitGraphemes } from \"unicode-segmenter/grapheme\";\n\nexport const CONTENT_AWARE_TYPEWRITER_TICK_BUDGET = 200;\n\nconst TYPEWRITER_GRAPHEME_COST = {\n han: 100,\n latin: 28,\n arabic: 34,\n thai: 42,\n otherLetterOrNumber: 35,\n punctuationOrEmoji: 100,\n whitespace: 0,\n} as const;\n\nconst WHITESPACE_PATTERN = /^\\s+$/u;\nconst HAN_PATTERN = /\\p{Script_Extensions=Han}/u;\nconst LATIN_PATTERN = /\\p{Script_Extensions=Latin}/u;\nconst ARABIC_PATTERN = /\\p{Script_Extensions=Arabic}/u;\nconst THAI_PATTERN = /\\p{Script_Extensions=Thai}/u;\nconst LETTER_OR_NUMBER_PATTERN = /[\\p{Letter}\\p{Number}]/u;\nconst PUNCTUATION_OR_SYMBOL_PATTERN = /[\\p{Punctuation}\\p{Symbol}]/u;\nconst EXTENDED_PICTOGRAPHIC_PATTERN = /\\p{Extended_Pictographic}/u;\n\nexport interface TypewriterGraphemeSegmenter {\n segment(input: string): Iterable<{ segment: string }>;\n}\n\nexport interface ContentAwareTypewriterToken {\n text: string;\n cost: number;\n}\n\nexport interface ContentAwareTypewriterQueue {\n tokens: readonly ContentAwareTypewriterToken[];\n head: number;\n}\n\nexport interface ContentAwareTypewriterConsumption {\n chunk: string;\n queue: ContentAwareTypewriterQueue;\n remainingBudget: number;\n}\n\nlet cachedIntlSegmenter: TypewriterGraphemeSegmenter | null | undefined;\n\nconst getIntlSegmenter = (): TypewriterGraphemeSegmenter | null => {\n if (cachedIntlSegmenter !== undefined) {\n return cachedIntlSegmenter;\n }\n\n const Segmenter =\n typeof Intl === \"undefined\"\n ? undefined\n : (Intl as typeof Intl & { Segmenter?: typeof Intl.Segmenter }).Segmenter;\n\n cachedIntlSegmenter = Segmenter\n ? new Segmenter(undefined, { granularity: \"grapheme\" })\n : null;\n return cachedIntlSegmenter;\n};\n\nconst isCodePointInRange = (codePoint: string, start: number, end: number) => {\n const value = codePoint.codePointAt(0);\n return value !== undefined && value >= start && value <= end;\n};\n\nconst isRegionalIndicator = (codePoint: string) =>\n isCodePointInRange(codePoint, 0x1f1e6, 0x1f1ff);\n\nconst isEmojiModifier = (codePoint: string) =>\n isCodePointInRange(codePoint, 0x1f3fb, 0x1f3ff);\nexport const fallbackSegmentTypewriterGraphemes = (value: string) =>\n Array.from(splitGraphemes(value));\n\nexport const segmentTypewriterGraphemes = (\n value: string,\n segmenter?: TypewriterGraphemeSegmenter | null\n) => {\n const resolvedSegmenter =\n segmenter === undefined ? getIntlSegmenter() : segmenter;\n\n if (!resolvedSegmenter) {\n return fallbackSegmentTypewriterGraphemes(value);\n }\n\n return Array.from(resolvedSegmenter.segment(value), ({ segment }) => segment);\n};\n\nconst isEmojiGrapheme = (grapheme: string) =>\n EXTENDED_PICTOGRAPHIC_PATTERN.test(grapheme) ||\n Array.from(grapheme).some(\n (codePoint) =>\n isRegionalIndicator(codePoint) ||\n isEmojiModifier(codePoint) ||\n codePoint === \"\\u20e3\"\n );\n\nexport const getContentAwareTypewriterCost = (grapheme: string) => {\n if (WHITESPACE_PATTERN.test(grapheme)) {\n return TYPEWRITER_GRAPHEME_COST.whitespace;\n }\n\n if (\n isEmojiGrapheme(grapheme) ||\n PUNCTUATION_OR_SYMBOL_PATTERN.test(grapheme)\n ) {\n return TYPEWRITER_GRAPHEME_COST.punctuationOrEmoji;\n }\n\n if (HAN_PATTERN.test(grapheme)) {\n return TYPEWRITER_GRAPHEME_COST.han;\n }\n\n if (LATIN_PATTERN.test(grapheme)) {\n return TYPEWRITER_GRAPHEME_COST.latin;\n }\n\n if (ARABIC_PATTERN.test(grapheme)) {\n return TYPEWRITER_GRAPHEME_COST.arabic;\n }\n\n if (THAI_PATTERN.test(grapheme)) {\n return TYPEWRITER_GRAPHEME_COST.thai;\n }\n\n if (LETTER_OR_NUMBER_PATTERN.test(grapheme)) {\n return TYPEWRITER_GRAPHEME_COST.otherLetterOrNumber;\n }\n\n return TYPEWRITER_GRAPHEME_COST.punctuationOrEmoji;\n};\n\nconst tokenizeContentAwareTypewriterText = (\n value: string,\n segmenter?: TypewriterGraphemeSegmenter | null\n) =>\n segmentTypewriterGraphemes(value, segmenter).map((text) => ({\n text,\n cost: getContentAwareTypewriterCost(text),\n }));\n\nexport const createContentAwareTypewriterQueue = (\n value: string,\n segmenter?: TypewriterGraphemeSegmenter | null\n): ContentAwareTypewriterQueue => ({\n tokens: tokenizeContentAwareTypewriterText(value, segmenter),\n head: 0,\n});\n\nexport const isContentAwareTypewriterQueueEmpty = (\n queue: ContentAwareTypewriterQueue\n) => queue.head >= queue.tokens.length;\n\nexport const appendContentAwareTypewriterQueue = (\n queue: ContentAwareTypewriterQueue,\n suffix: string,\n segmenter?: TypewriterGraphemeSegmenter | null\n): ContentAwareTypewriterQueue => {\n if (!suffix) {\n return queue;\n }\n\n const remainingTokens = queue.tokens.slice(queue.head);\n if (remainingTokens.length === 0) {\n return createContentAwareTypewriterQueue(suffix, segmenter);\n }\n\n const lastToken = remainingTokens[remainingTokens.length - 1];\n const repairedTail = tokenizeContentAwareTypewriterText(\n `${lastToken.text}${suffix}`,\n segmenter\n );\n\n return {\n tokens: [...remainingTokens.slice(0, -1), ...repairedTail],\n head: 0,\n };\n};\n\nexport const consumeContentAwareTypewriterQueue = (\n queue: ContentAwareTypewriterQueue,\n availableBudget: number\n): ContentAwareTypewriterConsumption => {\n let head = queue.head;\n let remainingBudget = Math.max(0, availableBudget);\n let chunk = \"\";\n\n while (head < queue.tokens.length) {\n const token = queue.tokens[head];\n if (token.cost > remainingBudget) {\n break;\n }\n\n chunk += token.text;\n remainingBudget -= token.cost;\n head += 1;\n }\n\n return {\n chunk,\n queue: {\n tokens: queue.tokens,\n head,\n },\n remainingBudget,\n };\n};\n\nexport const getContentAwareTypewriterTickCount = (\n value: string,\n segmenter?: TypewriterGraphemeSegmenter | null\n) => {\n let queue = createContentAwareTypewriterQueue(value, segmenter);\n let budget = 0;\n let ticks = 0;\n\n while (!isContentAwareTypewriterQueueEmpty(queue)) {\n budget += CONTENT_AWARE_TYPEWRITER_TICK_BUDGET;\n const result = consumeContentAwareTypewriterQueue(queue, budget);\n\n if (!result.chunk) {\n throw new Error(\"Typewriter pacing could not consume the next grapheme\");\n }\n\n queue = result.queue;\n budget = result.remainingBudget;\n ticks += 1;\n }\n\n return ticks;\n};\n"],"names":["CONTENT_AWARE_TYPEWRITER_TICK_BUDGET","TYPEWRITER_GRAPHEME_COST","WHITESPACE_PATTERN","HAN_PATTERN","LATIN_PATTERN","ARABIC_PATTERN","THAI_PATTERN","LETTER_OR_NUMBER_PATTERN","PUNCTUATION_OR_SYMBOL_PATTERN","EXTENDED_PICTOGRAPHIC_PATTERN","cachedIntlSegmenter","getIntlSegmenter","Segmenter","isCodePointInRange","codePoint","start","end","value","isRegionalIndicator","isEmojiModifier","fallbackSegmentTypewriterGraphemes","splitGraphemes","segmentTypewriterGraphemes","segmenter","resolvedSegmenter","segment","isEmojiGrapheme","grapheme","getContentAwareTypewriterCost","tokenizeContentAwareTypewriterText","text","createContentAwareTypewriterQueue","isContentAwareTypewriterQueueEmpty","queue","appendContentAwareTypewriterQueue","suffix","remainingTokens","lastToken","repairedTail","consumeContentAwareTypewriterQueue","availableBudget","head","remainingBudget","chunk","token"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const b="090001000h1v5g2903000hl2v6jh16ng1s210111110o35aa10u2k1g10l6600152113h2010u1q1r5aq3890o13181214r22k3158q2n1000v100h1k20000001207030001160721k171001h1j11610332010010321210090411021c1c02100o301201412230u1130b100h1j116111420120411001100k11l10051001h1j11611142011000321210072411021d0g10r3000000132120090o200200g1j11f2012031213711271t1001o301001000001121371b1f0c101h1l2011001031212000080a1t1001m40400102101600i11t301006c7i601008b6p41r10101041h3d0004115a1j290p3q223000511010100g1501010302003172030c0010016000e0i6v50n40n5tl12ir33s12t11u11cj30100060700010a90t220000l71i20m7203010241000502rd101004k300000006101027050920g3t22bk1300616g209030207u18c1000t10003010501b2o20000102000004g37070101o921c000640602001mcv3rg20000001o16d0c0m1fg6g2h30m10q55f1vm11c0ma0p1a42nc0ne1a090q3314902021204020112030318250105bb1201110i1021i15101131502141b15120511011k1155132040202510201010603060a1f02040104210b1g3290e0e0kn11vs12j11j3040pp12t80g6v1qi2500c0r51ktl7319g21g51gh103040n11010040j51i3f01q1h1d0m27p1a0000cs13200523j200010301010100v140018a4q2501010101c08000i1f12601011g3012215110u1a0001015000pcq181000100011000iji5fvc0u91g5bhg20ie0l94lo6002115303121s12240la1tj23h44tj11t45m4ah33q700000l3ep2021a200t220301012040a0i320j2040007f00100r20c100g3208000011531000s520201036020t900207l1101n311000000321210090a12634b910201l22001051020120011020000e1i520701020000n10h5001050000010000010001re0010323010001r11i520701000001q6000000107l600000230004gg12080001lc62027111n1000411230000000000t820321030030r10090n205001380800501020n2050c0001mc00002000000nc006150000i5l1100600010001q753011160000i441111000000rl11019100000c1h201043102n10ltk1f006eoss2b0202gs94r36si2033ku101m373h50b1rqs4113sli1t22m1uh2435070726u13k92rr7m34h380e0m141egl561g1261114k60ga6nn10t33sv13uf1jf0207150qt16t66pr60n23k6bf1f0e1l29g71c1e029j1n30p11ea0k1028139m16rb2v621122i52213040tf1u3b51n17127c0232041d120819052c28220104060306l5g3l4572g130152cqdl2c3o37a5o27u11c32d9m2cu2191obo57eh9gg1tv3",f="262122424333333393233393339333333333393393bf3b3b3b3b3f3f3bffff33b3bb33ff3f33b3b3333333bffff3b33bb33f33bffff33b3bb33ff3f33b3bbb333b3ff33b333f33b3b3b3b3333b3bf33b3bb39333b33b33b3b3b333b333333b3b33333f3b33b3ffb3f3fff3f3b33f35dc33333f3b3b3b33323333b3bb3b33b3fb3b3333b33333bff3b3f33bfb3b3ff3b3b3b3b3b333b333b3323e224423444444444444444444444444444444444444444444444444444444444444444444444444444444433334433333333b3b3bb33333b353bff3b3b3b3f3ff3b3b333bfff3f33333fb3bb3fb3b3bb33232333f333fff333333333b3b3333bb3b39393f3b3fbf33bb3b393b3b3b3333b33b33b3bbb33b33ffff3b3333bb3933b3b3b333b3b3b3b3b33b3b3b33b3b3b33b3b33b33b3b3b3fffff3bb39b9b3b33b3bf3f3b33f3b3f93b33b3b3bb33b33b3b3b3333393b3b3b33b39bffb3b332333b333dd3b3333233332333333333333333333333333333444444444444a4444444444444344444444444444444444444444444444444444444444",g="0001000000010010000000100000000000000000000000000001000000010018000100000001001000010101100101100000000000000000000100000001111000010000000110101001110111111111000100000021001000010000000100100001000000011010000100000001111000014000000100180001000000010010";exports.grapheme_cats=f;exports.grapheme_data=b;exports.grapheme_pairs=g;
2
+ //# sourceMappingURL=_grapheme_data.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_grapheme_data.cjs","sources":["../../../node_modules/unicode-segmenter/_grapheme_data.js"],"sourcesContent":["// The following code was generated by \"scripts/unicode.js\",\n// DO NOT EDIT DIRECTLY.\n//\n// @ts-check\n\n/**\n * @typedef {import('./core.js').UnicodeDataEncoding} UnicodeDataEncoding\n */\n\n/**\n * @typedef {0} GC_Any\n * @typedef {1} GC_CR\n * @typedef {2} GC_Control\n * @typedef {3} GC_Extend\n * @typedef {4} GC_Extended_Pictographic\n * @typedef {5} GC_L\n * @typedef {6} GC_LF\n * @typedef {7} GC_LV\n * @typedef {8} GC_LVT\n * @typedef {9} GC_Prepend\n * @typedef {10} GC_Regional_Indicator\n * @typedef {11} GC_SpacingMark\n * @typedef {12} GC_T\n * @typedef {13} GC_V\n * @typedef {14} GC_ZWJ\n * @typedef {(\n * | GC_Any\n * | GC_CR\n * | GC_Control\n * | GC_Extend\n * | GC_Extended_Pictographic\n * | GC_L\n * | GC_LF\n * | GC_LV\n * | GC_LVT\n * | GC_Prepend\n * | GC_Regional_Indicator\n * | GC_SpacingMark\n * | GC_T\n * | GC_V\n * | GC_ZWJ\n * )} GraphemeCategoryNum\n */\n\n/**\n * @typedef {(\n * | 'Any'\n * | 'CR'\n * | 'Control'\n * | 'Extend'\n * | 'Extended_Pictographic'\n * | 'L'\n * | 'LF'\n * | 'LV'\n * | 'LVT'\n * | 'Prepend'\n * | 'Regional_Indicator'\n * | 'SpacingMark'\n * | 'T'\n * | 'V'\n * | 'ZWJ'\n * )} GraphemeCategoryKey\n */\n\n/**\n * Grapheme category enum\n *\n * Note:\n * The object isn't actually frozen\n * because using `Object.freeze` increases 800 bytes on Brotli compression.\n *\n * @type {Readonly<Record<GraphemeCategoryKey, GraphemeCategoryNum>>}\n */\nexport const GraphemeCategory = {\n Any: 0,\n CR: 1,\n Control: 2,\n Extend: 3,\n Extended_Pictographic: 4,\n L: 5,\n LF: 6,\n LV: 7,\n LVT: 8,\n Prepend: 9,\n Regional_Indicator: 10,\n SpacingMark: 11,\n T: 12,\n V: 13,\n ZWJ: 14,\n};\n\n/**\n * Encoded `Grapheme_Cluster_Break` property ranges.\n *\n * Internal categories (never exposed through the public API):\n * - 15: InCB_Consonant\n *\n * @type {UnicodeDataEncoding}\n */\nexport const grapheme_data = /** @type {UnicodeDataEncoding} */ (\n '090001000h1v5g2903000hl2v6jh16ng1s210111110o35aa10u2k1g10l6600152113h2010u1q1r5aq3890o13181214r22k3158q2n1000v100h1k20000001207030001160721k171001h1j11610332010010321210090411021c1c02100o301201412230u1130b100h1j116111420120411001100k11l10051001h1j11611142011000321210072411021d0g10r3000000132120090o200200g1j11f2012031213711271t1001o301001000001121371b1f0c101h1l2011001031212000080a1t1001m40400102101600i11t301006c7i601008b6p41r10101041h3d0004115a1j290p3q223000511010100g1501010302003172030c0010016000e0i6v50n40n5tl12ir33s12t11u11cj30100060700010a90t220000l71i20m7203010241000502rd101004k300000006101027050920g3t22bk1300616g209030207u18c1000t10003010501b2o20000102000004g37070101o921c000640602001mcv3rg20000001o16d0c0m1fg6g2h30m10q55f1vm11c0ma0p1a42nc0ne1a090q3314902021204020112030318250105bb1201110i1021i15101131502141b15120511011k1155132040202510201010603060a1f02040104210b1g3290e0e0kn11vs12j11j3040pp12t80g6v1qi2500c0r51ktl7319g21g51gh103040n11010040j51i3f01q1h1d0m27p1a0000cs13200523j200010301010100v140018a4q2501010101c08000i1f12601011g3012215110u1a0001015000pcq181000100011000iji5fvc0u91g5bhg20ie0l94lo6002115303121s12240la1tj23h44tj11t45m4ah33q700000l3ep2021a200t220301012040a0i320j2040007f00100r20c100g3208000011531000s520201036020t900207l1101n311000000321210090a12634b910201l22001051020120011020000e1i520701020000n10h5001050000010000010001re0010323010001r11i520701000001q6000000107l600000230004gg12080001lc62027111n1000411230000000000t820321030030r10090n205001380800501020n2050c0001mc00002000000nc006150000i5l1100600010001q753011160000i441111000000rl11019100000c1h201043102n10ltk1f006eoss2b0202gs94r36si2033ku101m373h50b1rqs4113sli1t22m1uh2435070726u13k92rr7m34h380e0m141egl561g1261114k60ga6nn10t33sv13uf1jf0207150qt16t66pr60n23k6bf1f0e1l29g71c1e029j1n30p11ea0k1028139m16rb2v621122i52213040tf1u3b51n17127c0232041d120819052c28220104060306l5g3l4572g130152cqdl2c3o37a5o27u11c32d9m2cu2191obo57eh9gg1tv3'\n);\n\n/**\n * Category of each range in {@link grapheme_data}, base36 digit per range.\n */\nexport const grapheme_cats = '262122424333333393233393339333333333393393bf3b3b3b3b3f3f3bffff33b3bb33ff3f33b3b3333333bffff3b33bb33f33bffff33b3bb33ff3f33b3bbb333b3ff33b333f33b3b3b3b3333b3bf33b3bb39333b33b33b3b3b333b333333b3b33333f3b33b3ffb3f3fff3f3b33f35dc33333f3b3b3b33323333b3bb3b33b3fb3b3333b33333bff3b3f33bfb3b3ff3b3b3b3b3b333b333b3323e224423444444444444444444444444444444444444444444444444444444444444444444444444444444433334433333333b3b3bb33333b353bff3b3b3b3f3ff3b3b333bfff3f33333fb3bb3fb3b3bb33232333f333fff333333333b3b3333bb3b39393f3b3fbf33bb3b393b3b3b3333b33b33b3bbb33b33ffff3b3333bb3933b3b3b333b3b3b3b3b33b3b3b33b3b3b33b3b33b33b3b3b3fffff3bb39b9b3b33b3bf3f3b33f3b3f93b33b3b3bb33b33b3b3b3333393b3b3b33b39bffb3b332333b333dd3b3333233332333333333333333333333333333444444444444a4444444444444344444444444444444444444444444444444444444444';\n\n/**\n * UAX #29 pair-wise rules for extended grapheme cluster boundaries,\n * evaluated into a 16x16 mask table indexed by `catBefore << 4 | catAfter`.\n *\n * A boundary exists iff the mask shares no bit with the runtime's packed sequence state.\n *\n * - 0: boundary (GB999 and friends), no state bit can match\n * - 1: no boundary; bit 0 is always set in the state\n * - 2: GB12/GB13, no boundary iff odd run of RI precedes\n * - 4: GB11, no boundary iff the ZWJ was preceded by ExtPic Extend*\n * - 8: GB9c, no boundary iff InCB Consonant [Extend Linker]* Linker [Extend Linker]* precedes\n *\n * See `buildGraphemePairTable` in scripts/unicode.js for the rules.\n */\nexport const grapheme_pairs = '0001000000010010000000100000000000000000000000000001000000010018000100000001001000010101100101100000000000000000000100000001111000010000000110101001110111111111000100000021001000010000000100100001000000011010000100000001111000014000000100180001000000010010';\n"],"names":["grapheme_data","grapheme_cats","grapheme_pairs"],"mappings":"gFAmGY,MAACA,EACX,u3DAMWC,EAAgB,4yBAgBhBC,EAAiB","x_google_ignoreList":[0]}
@@ -0,0 +1,10 @@
1
+ const b = (
2
+ /** @type {UnicodeDataEncoding} */
3
+ "090001000h1v5g2903000hl2v6jh16ng1s210111110o35aa10u2k1g10l6600152113h2010u1q1r5aq3890o13181214r22k3158q2n1000v100h1k20000001207030001160721k171001h1j11610332010010321210090411021c1c02100o301201412230u1130b100h1j116111420120411001100k11l10051001h1j11611142011000321210072411021d0g10r3000000132120090o200200g1j11f2012031213711271t1001o301001000001121371b1f0c101h1l2011001031212000080a1t1001m40400102101600i11t301006c7i601008b6p41r10101041h3d0004115a1j290p3q223000511010100g1501010302003172030c0010016000e0i6v50n40n5tl12ir33s12t11u11cj30100060700010a90t220000l71i20m7203010241000502rd101004k300000006101027050920g3t22bk1300616g209030207u18c1000t10003010501b2o20000102000004g37070101o921c000640602001mcv3rg20000001o16d0c0m1fg6g2h30m10q55f1vm11c0ma0p1a42nc0ne1a090q3314902021204020112030318250105bb1201110i1021i15101131502141b15120511011k1155132040202510201010603060a1f02040104210b1g3290e0e0kn11vs12j11j3040pp12t80g6v1qi2500c0r51ktl7319g21g51gh103040n11010040j51i3f01q1h1d0m27p1a0000cs13200523j200010301010100v140018a4q2501010101c08000i1f12601011g3012215110u1a0001015000pcq181000100011000iji5fvc0u91g5bhg20ie0l94lo6002115303121s12240la1tj23h44tj11t45m4ah33q700000l3ep2021a200t220301012040a0i320j2040007f00100r20c100g3208000011531000s520201036020t900207l1101n311000000321210090a12634b910201l22001051020120011020000e1i520701020000n10h5001050000010000010001re0010323010001r11i520701000001q6000000107l600000230004gg12080001lc62027111n1000411230000000000t820321030030r10090n205001380800501020n2050c0001mc00002000000nc006150000i5l1100600010001q753011160000i441111000000rl11019100000c1h201043102n10ltk1f006eoss2b0202gs94r36si2033ku101m373h50b1rqs4113sli1t22m1uh2435070726u13k92rr7m34h380e0m141egl561g1261114k60ga6nn10t33sv13uf1jf0207150qt16t66pr60n23k6bf1f0e1l29g71c1e029j1n30p11ea0k1028139m16rb2v621122i52213040tf1u3b51n17127c0232041d120819052c28220104060306l5g3l4572g130152cqdl2c3o37a5o27u11c32d9m2cu2191obo57eh9gg1tv3"
4
+ ), f = "262122424333333393233393339333333333393393bf3b3b3b3b3f3f3bffff33b3bb33ff3f33b3b3333333bffff3b33bb33f33bffff33b3bb33ff3f33b3bbb333b3ff33b333f33b3b3b3b3333b3bf33b3bb39333b33b33b3b3b333b333333b3b33333f3b33b3ffb3f3fff3f3b33f35dc33333f3b3b3b33323333b3bb3b33b3fb3b3333b33333bff3b3f33bfb3b3ff3b3b3b3b3b333b333b3323e224423444444444444444444444444444444444444444444444444444444444444444444444444444444433334433333333b3b3bb33333b353bff3b3b3b3f3ff3b3b333bfff3f33333fb3bb3fb3b3bb33232333f333fff333333333b3b3333bb3b39393f3b3fbf33bb3b393b3b3b3333b33b33b3bbb33b33ffff3b3333bb3933b3b3b333b3b3b3b3b33b3b3b33b3b3b33b3b33b33b3b3b3fffff3bb39b9b3b33b3bf3f3b33f3b3f93b33b3b3bb33b33b3b3b3333393b3b3b33b39bffb3b332333b333dd3b3333233332333333333333333333333333333444444444444a4444444444444344444444444444444444444444444444444444444444", c = "0001000000010010000000100000000000000000000000000001000000010018000100000001001000010101100101100000000000000000000100000001111000010000000110101001110111111111000100000021001000010000000100100001000000011010000100000001111000014000000100180001000000010010";
5
+ export {
6
+ f as grapheme_cats,
7
+ b as grapheme_data,
8
+ c as grapheme_pairs
9
+ };
10
+ //# sourceMappingURL=_grapheme_data.es.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_grapheme_data.es.js","sources":["../../../node_modules/unicode-segmenter/_grapheme_data.js"],"sourcesContent":["// The following code was generated by \"scripts/unicode.js\",\n// DO NOT EDIT DIRECTLY.\n//\n// @ts-check\n\n/**\n * @typedef {import('./core.js').UnicodeDataEncoding} UnicodeDataEncoding\n */\n\n/**\n * @typedef {0} GC_Any\n * @typedef {1} GC_CR\n * @typedef {2} GC_Control\n * @typedef {3} GC_Extend\n * @typedef {4} GC_Extended_Pictographic\n * @typedef {5} GC_L\n * @typedef {6} GC_LF\n * @typedef {7} GC_LV\n * @typedef {8} GC_LVT\n * @typedef {9} GC_Prepend\n * @typedef {10} GC_Regional_Indicator\n * @typedef {11} GC_SpacingMark\n * @typedef {12} GC_T\n * @typedef {13} GC_V\n * @typedef {14} GC_ZWJ\n * @typedef {(\n * | GC_Any\n * | GC_CR\n * | GC_Control\n * | GC_Extend\n * | GC_Extended_Pictographic\n * | GC_L\n * | GC_LF\n * | GC_LV\n * | GC_LVT\n * | GC_Prepend\n * | GC_Regional_Indicator\n * | GC_SpacingMark\n * | GC_T\n * | GC_V\n * | GC_ZWJ\n * )} GraphemeCategoryNum\n */\n\n/**\n * @typedef {(\n * | 'Any'\n * | 'CR'\n * | 'Control'\n * | 'Extend'\n * | 'Extended_Pictographic'\n * | 'L'\n * | 'LF'\n * | 'LV'\n * | 'LVT'\n * | 'Prepend'\n * | 'Regional_Indicator'\n * | 'SpacingMark'\n * | 'T'\n * | 'V'\n * | 'ZWJ'\n * )} GraphemeCategoryKey\n */\n\n/**\n * Grapheme category enum\n *\n * Note:\n * The object isn't actually frozen\n * because using `Object.freeze` increases 800 bytes on Brotli compression.\n *\n * @type {Readonly<Record<GraphemeCategoryKey, GraphemeCategoryNum>>}\n */\nexport const GraphemeCategory = {\n Any: 0,\n CR: 1,\n Control: 2,\n Extend: 3,\n Extended_Pictographic: 4,\n L: 5,\n LF: 6,\n LV: 7,\n LVT: 8,\n Prepend: 9,\n Regional_Indicator: 10,\n SpacingMark: 11,\n T: 12,\n V: 13,\n ZWJ: 14,\n};\n\n/**\n * Encoded `Grapheme_Cluster_Break` property ranges.\n *\n * Internal categories (never exposed through the public API):\n * - 15: InCB_Consonant\n *\n * @type {UnicodeDataEncoding}\n */\nexport const grapheme_data = /** @type {UnicodeDataEncoding} */ (\n '090001000h1v5g2903000hl2v6jh16ng1s210111110o35aa10u2k1g10l6600152113h2010u1q1r5aq3890o13181214r22k3158q2n1000v100h1k20000001207030001160721k171001h1j11610332010010321210090411021c1c02100o301201412230u1130b100h1j116111420120411001100k11l10051001h1j11611142011000321210072411021d0g10r3000000132120090o200200g1j11f2012031213711271t1001o301001000001121371b1f0c101h1l2011001031212000080a1t1001m40400102101600i11t301006c7i601008b6p41r10101041h3d0004115a1j290p3q223000511010100g1501010302003172030c0010016000e0i6v50n40n5tl12ir33s12t11u11cj30100060700010a90t220000l71i20m7203010241000502rd101004k300000006101027050920g3t22bk1300616g209030207u18c1000t10003010501b2o20000102000004g37070101o921c000640602001mcv3rg20000001o16d0c0m1fg6g2h30m10q55f1vm11c0ma0p1a42nc0ne1a090q3314902021204020112030318250105bb1201110i1021i15101131502141b15120511011k1155132040202510201010603060a1f02040104210b1g3290e0e0kn11vs12j11j3040pp12t80g6v1qi2500c0r51ktl7319g21g51gh103040n11010040j51i3f01q1h1d0m27p1a0000cs13200523j200010301010100v140018a4q2501010101c08000i1f12601011g3012215110u1a0001015000pcq181000100011000iji5fvc0u91g5bhg20ie0l94lo6002115303121s12240la1tj23h44tj11t45m4ah33q700000l3ep2021a200t220301012040a0i320j2040007f00100r20c100g3208000011531000s520201036020t900207l1101n311000000321210090a12634b910201l22001051020120011020000e1i520701020000n10h5001050000010000010001re0010323010001r11i520701000001q6000000107l600000230004gg12080001lc62027111n1000411230000000000t820321030030r10090n205001380800501020n2050c0001mc00002000000nc006150000i5l1100600010001q753011160000i441111000000rl11019100000c1h201043102n10ltk1f006eoss2b0202gs94r36si2033ku101m373h50b1rqs4113sli1t22m1uh2435070726u13k92rr7m34h380e0m141egl561g1261114k60ga6nn10t33sv13uf1jf0207150qt16t66pr60n23k6bf1f0e1l29g71c1e029j1n30p11ea0k1028139m16rb2v621122i52213040tf1u3b51n17127c0232041d120819052c28220104060306l5g3l4572g130152cqdl2c3o37a5o27u11c32d9m2cu2191obo57eh9gg1tv3'\n);\n\n/**\n * Category of each range in {@link grapheme_data}, base36 digit per range.\n */\nexport const grapheme_cats = '262122424333333393233393339333333333393393bf3b3b3b3b3f3f3bffff33b3bb33ff3f33b3b3333333bffff3b33bb33f33bffff33b3bb33ff3f33b3bbb333b3ff33b333f33b3b3b3b3333b3bf33b3bb39333b33b33b3b3b333b333333b3b33333f3b33b3ffb3f3fff3f3b33f35dc33333f3b3b3b33323333b3bb3b33b3fb3b3333b33333bff3b3f33bfb3b3ff3b3b3b3b3b333b333b3323e224423444444444444444444444444444444444444444444444444444444444444444444444444444444433334433333333b3b3bb33333b353bff3b3b3b3f3ff3b3b333bfff3f33333fb3bb3fb3b3bb33232333f333fff333333333b3b3333bb3b39393f3b3fbf33bb3b393b3b3b3333b33b33b3bbb33b33ffff3b3333bb3933b3b3b333b3b3b3b3b33b3b3b33b3b3b33b3b33b33b3b3b3fffff3bb39b9b3b33b3bf3f3b33f3b3f93b33b3b3bb33b33b3b3b3333393b3b3b33b39bffb3b332333b333dd3b3333233332333333333333333333333333333444444444444a4444444444444344444444444444444444444444444444444444444444';\n\n/**\n * UAX #29 pair-wise rules for extended grapheme cluster boundaries,\n * evaluated into a 16x16 mask table indexed by `catBefore << 4 | catAfter`.\n *\n * A boundary exists iff the mask shares no bit with the runtime's packed sequence state.\n *\n * - 0: boundary (GB999 and friends), no state bit can match\n * - 1: no boundary; bit 0 is always set in the state\n * - 2: GB12/GB13, no boundary iff odd run of RI precedes\n * - 4: GB11, no boundary iff the ZWJ was preceded by ExtPic Extend*\n * - 8: GB9c, no boundary iff InCB Consonant [Extend Linker]* Linker [Extend Linker]* precedes\n *\n * See `buildGraphemePairTable` in scripts/unicode.js for the rules.\n */\nexport const grapheme_pairs = '0001000000010010000000100000000000000000000000000001000000010018000100000001001000010101100101100000000000000000000100000001111000010000000110101001110111111111000100000021001000010000000100100001000000011010000100000001111000014000000100180001000000010010';\n"],"names":["grapheme_data","grapheme_cats","grapheme_pairs"],"mappings":"AAmGY,MAACA;AAAA;AAAA,EACX;AAAA,GAMWC,IAAgB,6yBAgBhBC,IAAiB;","x_google_ignoreList":[0]}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});function g(t,d,r){let i=t.length,e=0,n=0,l=-1,c=()=>{let o=0,f=0,a;do a=parseInt(t[e++],36),o+=(a&15)<<f,f+=4;while(a&16);return o};for(;e<i;){let o=l+1+c();r(o,l=o+c(),parseInt(d[n++],36))}}function u(t,d,r){let i=0,e=d.length-1;for(;i<=e;){let n=i+e>>>1,l=r[n];if(t<d[n])e=n-1;else if(t>l>>>5)i=n+1;else return l&31}return 0}exports.decodeUnicodeData=g;exports.findUnicodeRangeCategory=u;
2
+ //# sourceMappingURL=core.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.cjs","sources":["../../../node_modules/unicode-segmenter/core.js"],"sourcesContent":["// @ts-check\n\n/**\n * @template {number} [T=number]\n * @typedef {[from: number, to: number, category: T]} CategorizedUnicodeRange\n */\n\n/**\n * @typedef {CategorizedUnicodeRange<0>} UnicodeRange\n */\n\n/**\n * @typedef {string & { __tag: 'UnicodeDataEncoding' }} UnicodeDataEncoding\n *\n * Encoding for array of {@link UnicodeRange}, as a separator-free\n * sequence of variable-length quantities in the base36 alphabet;\n * each character carries 4 payload bits and a continuation bit.\n *\n * Each {@link UnicodeRange} packed as a pair of quantities:\n *\n * gap = from - (previous to) - 1\n * padding = to - from\n *\n * Notes:\n * - Ranges are sorted and never overlap, so the delta-encoded gap is\n * always non-negative, and mostly a single character.\n * - The max value of a category is 23; https://www.unicode.org/reports/tr29/tr29-45.html#Table_Word_Break_Property_Values\n * - The longest range is 42,720; CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6DF\n *\n * See `scripts/lib/encoding.js` for the encoder.\n */\n\n/**\n * Decode {@link UnicodeDataEncoding} and hand every range to `emit`.\n *\n * Callers build their own index from the callback, so decoding never materializes an intermediate array of ranges;\n * on the grapheme table that is ~800 short-lived tuples per module load.\n *\n * @param {UnicodeDataEncoding} data\n * @param {string} cats base36 category digit per range, or `''` for none\n * @param {(from: number, to: number, cat: number) => void} emit\n * @return {void}\n */\nexport function decodeUnicodeData(data, cats, emit) {\n let len = data.length\n , i = 0\n , j = 0\n , p = -1;\n let read = () => {\n let n = 0, shift = 0, d;\n do {\n d = parseInt(data[i++], 36);\n n += (d & 15) << shift;\n shift += 4;\n } while (d & 16);\n return n;\n };\n while (i < len) {\n let from = p + 1 + read();\n emit(from, p = from + read(), cats ? parseInt(cats[j++], 36) : 0);\n }\n}\n\n/**\n * @template {object} Ext\n * @typedef {{\n * segment: string,\n * index: number,\n * input: string,\n * } & Ext} SegmentOutput\n */\n\n/**\n * @template {object} T\n * @typedef {IterableIterator<SegmentOutput<T>>} Segmenter\n */\n\n/**\n * @typedef {[starts: Uint32Array, ends: Uint32Array]} UnicodeRangeTable\n *\n * Flat, binary-searchable range table. `starts[i]` holds the first\n * codepoint of the i-th range, and `ends[i]` packs its last codepoint\n * and category as `end << 5 | category`.\n *\n * The 5-bit category fits any break property; the largest category\n * value is 23.\n */\n\n/**\n * Category of the range containing the given codepoint.\n *\n * @param {number} cp\n * @param {Uint32Array} starts sorted, non-overlapping range starts\n * @param {Uint32Array} ends packed `end << 5 | category`, parallel to `starts`\n * @return {number} category of the containing range, or 0 if no match\n */\nexport function findUnicodeRangeCategory(cp, starts, ends) {\n let lo = 0, hi = starts.length - 1;\n while (lo <= hi) {\n let mid = lo + hi >>> 1\n , end = ends[mid];\n if (cp < starts[mid]) hi = mid - 1;\n else if (cp > end >>> 5) lo = mid + 1;\n else return end & 31;\n }\n return 0;\n}\n\n/**\n * Decode {@link UnicodeDataEncoding} into a membership test table for\n * {@link findUnicodeRangeCategory}; every range takes category 1, so a\n * match is truthy and a miss is 0.\n *\n * @param {UnicodeDataEncoding} data\n * @return {UnicodeRangeTable}\n */\nexport function decodeUnicodeFlatData(data) {\n // Every range takes at least two characters,\n // so half the encoded length is a safe upper bound for the range count.\n let cap = data.length >> 1\n , starts = new Uint32Array(cap)\n , ends = new Uint32Array(cap)\n , n = 0;\n decodeUnicodeData(data, '', (from, to) => {\n starts[n] = from;\n ends[n++] = to << 5 | 1;\n });\n return [starts.slice(0, n), ends.slice(0, n)];\n}\n"],"names":["decodeUnicodeData","data","cats","emit","len","i","j","p","read","n","shift","d","from","findUnicodeRangeCategory","cp","starts","ends","lo","hi","mid","end"],"mappings":"gFA2CO,SAASA,EAAkBC,EAAMC,EAAMC,EAAM,CAClD,IAAIC,EAAMH,EAAK,OACXI,EAAI,EACJC,EAAI,EACJC,EAAI,GACJC,EAAO,IAAM,CACf,IAAIC,EAAI,EAAGC,EAAQ,EAAGC,EACtB,GACEA,EAAI,SAASV,EAAKI,GAAG,EAAG,EAAE,EAC1BI,IAAME,EAAI,KAAOD,EACjBA,GAAS,QACFC,EAAI,IACb,OAAOF,CACT,EACA,KAAOJ,EAAID,GAAK,CACd,IAAIQ,EAAOL,EAAI,EAAIC,EAAI,EACvBL,EAAKS,EAAML,EAAIK,EAAOJ,EAAI,EAAW,SAASN,EAAKI,GAAG,EAAG,EAAE,CAAK,CAClE,CACF,CAmCO,SAASO,EAAyBC,EAAIC,EAAQC,EAAM,CACzD,IAAIC,EAAK,EAAGC,EAAKH,EAAO,OAAS,EACjC,KAAOE,GAAMC,GAAI,CACf,IAAIC,EAAMF,EAAKC,IAAO,EAClBE,EAAMJ,EAAKG,CAAG,EAClB,GAAIL,EAAKC,EAAOI,CAAG,EAAGD,EAAKC,EAAM,UACxBL,EAAKM,IAAQ,EAAGH,EAAKE,EAAM,MAC/B,QAAOC,EAAM,EACpB,CACA,MAAO,EACT","x_google_ignoreList":[0]}
@@ -0,0 +1,28 @@
1
+ function a(t, o, d) {
2
+ let l = t.length, e = 0, n = 0, i = -1, h = () => {
3
+ let r = 0, u = 0, f;
4
+ do
5
+ f = parseInt(t[e++], 36), r += (f & 15) << u, u += 4;
6
+ while (f & 16);
7
+ return r;
8
+ };
9
+ for (; e < l; ) {
10
+ let r = i + 1 + h();
11
+ d(r, i = r + h(), parseInt(o[n++], 36));
12
+ }
13
+ }
14
+ function c(t, o, d) {
15
+ let l = 0, e = o.length - 1;
16
+ for (; l <= e; ) {
17
+ let n = l + e >>> 1, i = d[n];
18
+ if (t < o[n]) e = n - 1;
19
+ else if (t > i >>> 5) l = n + 1;
20
+ else return i & 31;
21
+ }
22
+ return 0;
23
+ }
24
+ export {
25
+ a as decodeUnicodeData,
26
+ c as findUnicodeRangeCategory
27
+ };
28
+ //# sourceMappingURL=core.es.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.es.js","sources":["../../../node_modules/unicode-segmenter/core.js"],"sourcesContent":["// @ts-check\n\n/**\n * @template {number} [T=number]\n * @typedef {[from: number, to: number, category: T]} CategorizedUnicodeRange\n */\n\n/**\n * @typedef {CategorizedUnicodeRange<0>} UnicodeRange\n */\n\n/**\n * @typedef {string & { __tag: 'UnicodeDataEncoding' }} UnicodeDataEncoding\n *\n * Encoding for array of {@link UnicodeRange}, as a separator-free\n * sequence of variable-length quantities in the base36 alphabet;\n * each character carries 4 payload bits and a continuation bit.\n *\n * Each {@link UnicodeRange} packed as a pair of quantities:\n *\n * gap = from - (previous to) - 1\n * padding = to - from\n *\n * Notes:\n * - Ranges are sorted and never overlap, so the delta-encoded gap is\n * always non-negative, and mostly a single character.\n * - The max value of a category is 23; https://www.unicode.org/reports/tr29/tr29-45.html#Table_Word_Break_Property_Values\n * - The longest range is 42,720; CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6DF\n *\n * See `scripts/lib/encoding.js` for the encoder.\n */\n\n/**\n * Decode {@link UnicodeDataEncoding} and hand every range to `emit`.\n *\n * Callers build their own index from the callback, so decoding never materializes an intermediate array of ranges;\n * on the grapheme table that is ~800 short-lived tuples per module load.\n *\n * @param {UnicodeDataEncoding} data\n * @param {string} cats base36 category digit per range, or `''` for none\n * @param {(from: number, to: number, cat: number) => void} emit\n * @return {void}\n */\nexport function decodeUnicodeData(data, cats, emit) {\n let len = data.length\n , i = 0\n , j = 0\n , p = -1;\n let read = () => {\n let n = 0, shift = 0, d;\n do {\n d = parseInt(data[i++], 36);\n n += (d & 15) << shift;\n shift += 4;\n } while (d & 16);\n return n;\n };\n while (i < len) {\n let from = p + 1 + read();\n emit(from, p = from + read(), cats ? parseInt(cats[j++], 36) : 0);\n }\n}\n\n/**\n * @template {object} Ext\n * @typedef {{\n * segment: string,\n * index: number,\n * input: string,\n * } & Ext} SegmentOutput\n */\n\n/**\n * @template {object} T\n * @typedef {IterableIterator<SegmentOutput<T>>} Segmenter\n */\n\n/**\n * @typedef {[starts: Uint32Array, ends: Uint32Array]} UnicodeRangeTable\n *\n * Flat, binary-searchable range table. `starts[i]` holds the first\n * codepoint of the i-th range, and `ends[i]` packs its last codepoint\n * and category as `end << 5 | category`.\n *\n * The 5-bit category fits any break property; the largest category\n * value is 23.\n */\n\n/**\n * Category of the range containing the given codepoint.\n *\n * @param {number} cp\n * @param {Uint32Array} starts sorted, non-overlapping range starts\n * @param {Uint32Array} ends packed `end << 5 | category`, parallel to `starts`\n * @return {number} category of the containing range, or 0 if no match\n */\nexport function findUnicodeRangeCategory(cp, starts, ends) {\n let lo = 0, hi = starts.length - 1;\n while (lo <= hi) {\n let mid = lo + hi >>> 1\n , end = ends[mid];\n if (cp < starts[mid]) hi = mid - 1;\n else if (cp > end >>> 5) lo = mid + 1;\n else return end & 31;\n }\n return 0;\n}\n\n/**\n * Decode {@link UnicodeDataEncoding} into a membership test table for\n * {@link findUnicodeRangeCategory}; every range takes category 1, so a\n * match is truthy and a miss is 0.\n *\n * @param {UnicodeDataEncoding} data\n * @return {UnicodeRangeTable}\n */\nexport function decodeUnicodeFlatData(data) {\n // Every range takes at least two characters,\n // so half the encoded length is a safe upper bound for the range count.\n let cap = data.length >> 1\n , starts = new Uint32Array(cap)\n , ends = new Uint32Array(cap)\n , n = 0;\n decodeUnicodeData(data, '', (from, to) => {\n starts[n] = from;\n ends[n++] = to << 5 | 1;\n });\n return [starts.slice(0, n), ends.slice(0, n)];\n}\n"],"names":["decodeUnicodeData","data","cats","emit","len","i","j","p","read","n","shift","d","from","findUnicodeRangeCategory","cp","starts","ends","lo","hi","mid","end"],"mappings":"AA2CO,SAASA,EAAkBC,GAAMC,GAAMC,GAAM;AAClD,MAAIC,IAAMH,EAAK,QACXI,IAAI,GACJC,IAAI,GACJC,IAAI,IACJC,IAAO,MAAM;AACf,QAAIC,IAAI,GAAGC,IAAQ,GAAGC;AACtB;AACE,MAAAA,IAAI,SAASV,EAAKI,GAAG,GAAG,EAAE,GAC1BI,MAAME,IAAI,OAAOD,GACjBA,KAAS;AAAA,WACFC,IAAI;AACb,WAAOF;AAAA,EACT;AACA,SAAOJ,IAAID,KAAK;AACd,QAAIQ,IAAOL,IAAI,IAAIC,EAAI;AACvB,IAAAL,EAAKS,GAAML,IAAIK,IAAOJ,EAAI,GAAW,SAASN,EAAKI,GAAG,GAAG,EAAE,CAAK;AAAA,EAClE;AACF;AAmCO,SAASO,EAAyBC,GAAIC,GAAQC,GAAM;AACzD,MAAIC,IAAK,GAAGC,IAAKH,EAAO,SAAS;AACjC,SAAOE,KAAMC,KAAI;AACf,QAAIC,IAAMF,IAAKC,MAAO,GAClBE,IAAMJ,EAAKG,CAAG;AAClB,QAAIL,IAAKC,EAAOI,CAAG,EAAG,CAAAD,IAAKC,IAAM;AAAA,aACxBL,IAAKM,MAAQ,EAAG,CAAAH,IAAKE,IAAM;AAAA,QAC/B,QAAOC,IAAM;AAAA,EACpB;AACA,SAAO;AACT;","x_google_ignoreList":[0]}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("./core.cjs"),F=require("./_grapheme_data.cjs"),D=new Uint8Array(12448),E=new Uint8Array(1440),y=new Uint8Array(2816);let B,g;{let e=(x,r,i,A,l)=>{let a=A-r+1,f=x.length;a>0&&i-r<f&&x.fill(l,i>r?i-r:0,a>f?f:a)},n=new Uint32Array(320),t=new Uint32Array(320),u=0;o.decodeUnicodeData(F.grapheme_data,F.grapheme_cats,(x,r,i)=>{e(D,0,x,r,i),e(E,42592,x,r,i),e(y,126976,x,r,i),r>=65040&&!(x>=126976&&r<=129791)&&(n[u]=x,t[u++]=r<<5|i)}),B=n.slice(0,u),g=t.slice(0,u)}function d(e){return e<12448?D[e]:e<42592?e===12951||e===12953?4:0:e<44032?E[e-42592]:e<55204?(e-44032)%28?8:7:e>=126976&&e<129792?y[e-126976]:e>>>4===4064?3:C(e)}function C(e){return e<57344?e<=55238?e>=55216?13:0:e>=55243&&e<=55291?12:0:e<65024?e===64286?3:0:e>=917504?e>921599?0:e>=917536&&e<917632||e>=917760&&e<918e3?3:2:o.findUnicodeRangeCategory(e,B,g)}const h=Uint8Array.from(F.grapheme_pairs);function U(e){return e===2381||e===2509||e===2765||e===2893||e===3149||e===3405||e===4153||e===6098||e===6752||e===6980||e===7083||e===43456||e===43766||e===68159||e===69939||e===70608||e===71998||e===72263||e===72345||e===73538}function _(e,n){return n===8204?e&21:e&8||U(n)?e&21|40:e&21|32}function s(e,n,t){return n===3?e&32?_(e,t):e&21:n===4?17:n===10?e&2^3:n===14?(e&16)>>2|e&41:n===15?33:1}function*w(e){let n=e.length;if(n===0)return;let t=e.codePointAt(0),u=t>65535?2:1,x=d(t),r=s(1,x,t),i=0;for(;u<n;){t=e.codePointAt(u);let A=d(t),l=!(r&h[x<<4|A]);r=s(r,A,t),l&&(yield e.slice(i,u),i=u),u+=t>65535?2:1,x=A}yield e.slice(i)}exports.splitGraphemes=w;
2
+ //# sourceMappingURL=grapheme.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grapheme.cjs","sources":["../../../node_modules/unicode-segmenter/grapheme.js"],"sourcesContent":["// @ts-check\n\nimport { decodeUnicodeData, findUnicodeRangeCategory } from './core.js';\nimport {\n GraphemeCategory,\n grapheme_cats,\n grapheme_data,\n grapheme_pairs,\n} from './_grapheme_data.js';\n\n/**\n * @typedef {import('./_grapheme_data.js').GC_Any} GC_Any\n *\n * @typedef {import('./_grapheme_data.js').GraphemeCategoryNum} GraphemeCategoryNum\n *\n * @typedef {object} GraphemeSegmentExtra\n * @property {number} _hd The first code point of the segment\n * @property {GraphemeCategoryNum} _catBegin Beginning Grapheme_Cluster_Break category of the segment\n * @property {GraphemeCategoryNum} _catEnd Ending Grapheme_Cluster_Break category of the segment\n *\n * @typedef {import('./core.js').SegmentOutput<GraphemeSegmentExtra>} GraphemeSegmentOutput\n * @typedef {import('./core.js').Segmenter<GraphemeSegmentExtra>} GraphemeSegmenter\n */\n\nexport { GraphemeCategory };\n\n// Every bound below is spelled out as a literal on purpose.\n//\n// A shared module-scope binding saves a few bundled bytes, but it is a mutable context slot\n// that engines cannot fold into the comparison; hoisting the hottest one into a `let` measured up to 25% slower on the count loop.\n\n// Direct category lookup tables for the hot Unicode regions, and a flat binary-search tail for everything rare.\n//\n// - T0: 0x0000-0x309F (ASCII, Latin, Greek, Cyrillic, Semitic, Indic, SEA, CJK punctuation and kana;\n// the table ends right after the last combining kana mark so that the CJK blocks need no lookup at all)\n// - 0x30A0-0xA65F (CJK, Yi, Lisu, Vai): only U+3297 and U+3299 are not `Any`\n// - T1: 0xA660-0xABFF\n// - 0xAC00-0xD7A3 (Hangul syllables): LV or LVT computed at runtime\n// - T2: 0x1F000-0x1FAFF (emoji)\n// - 0xFE00-0xFE0F (variation selectors): computed inline\n// - 0xD7A4-0xFDFF (Jamo Ext-B, surrogates, private use): {@link catRare}\n// - 0xE0000-0xE0FFF (tags, VS supplement): {@link catRare}\n// - everything else: binary search over the range tail (TAIL_S/TAIL_E)\n//\n// The `Indic_Conjunct_Break=Consonant` property is folded into the category\n// space as the 16th category (15) since it never overlaps other categories.\n// It shares break semantics with `Any` and never escapes to the public API.\n//\n// Total index size: ~19KiB of flat typed arrays, no retained JS objects.\nconst T0 = new Uint8Array(0x30A0);\nconst T1 = new Uint8Array(0x5A0);\nconst T2 = new Uint8Array(0xB00);\n/** @type {Uint32Array} Range starts of the binary-search tail */\nlet TAIL_S;\n/** @type {Uint32Array} Packed `end << 5 | category`, parallel to {@link TAIL_S} */\nlet TAIL_E;\n{\n let fill = (\n /** @type {Uint8Array} */ t,\n /** @type {number} */ lo,\n /** @type {number} */ from,\n /** @type {number} */ to,\n /** @type {number} */ cat,\n ) => {\n let end = to - lo + 1, len = t.length;\n if (end > 0 && from - lo < len) {\n t.fill(cat, from > lo ? from - lo : 0, end > len ? len : end);\n }\n };\n let starts = new Uint32Array(320), ends = new Uint32Array(320), n = 0;\n decodeUnicodeData(grapheme_data, grapheme_cats, (from, to, cat) => {\n fill(T0, 0, from, to, cat);\n fill(T1, 0xA660, from, to, cat);\n fill(T2, 0x1F000, from, to, cat);\n if (to >= 0xFE10 && !(from >= 0x1F000 && to <= 0x1FAFF)) {\n starts[n] = from;\n ends[n++] = to << 5 | cat;\n }\n });\n TAIL_S = starts.slice(0, n);\n TAIL_E = ends.slice(0, n);\n}\n\n/**\n * `Grapheme_Cluster_Break` property value of a given codepoint\n *\n * @see https://www.unicode.org/reports/tr29/tr29-45.html#Default_Grapheme_Cluster_Table\n *\n * @param {number} cp\n * @return {number} category number, {@link GraphemeCategoryNum} or 15 (`InCB=Consonant`)\n */\nfunction cat(cp) {\n if (cp < 0x30A0) return T0[cp];\n // CJK through Vai: U+3297 and U+3299 are the only two that are not `Any`\n if (cp < 0xA660) return cp === 0x3297 || cp === 0x3299 ? 4 : 0;\n if (cp < 0xAC00) return T1[cp - 0xA660];\n // Hangul syllables: 0xAC00-0xD7A3, LV at every 28th\n if (cp < 0xD7A4) return (cp - 0xAC00) % 28 ? 8 : 7;\n // Emoji: 0x1F000-0x1FAFF\n if (cp >= 0x1F000 && cp < 0x1FB00) return T2[cp - 0x1F000];\n // Variation selectors: 0xFE00-0xFE0F\n if (cp >>> 4 === 0xFE0) return 3;\n return catRare(cp);\n}\n\n/**\n * Cold half of {@link cat}.\n * Kept out of line so that the hot half stays well inside V8's 460-bytecode inlining limit.\n *\n * As a single function the ladder compiled to 453 bytecodes,\n * one comparison away from a cliff that cost 15-45% on every segmentation loop once `cat` stopped being inlined.\n *\n * @param {number} cp in 0xD7A4-0xDFFF, 0xE000-0xFDFF, 0xFE10-0x1EFFF or 0x1FB00+\n * @return {number} category number\n */\nfunction catRare(cp) {\n // Hangul Jamo Extended-B, unassigned and surrogates as Any\n if (cp < 0xE000) {\n if (cp <= 0xD7C6) return cp >= 0xD7B0 ? 13 : 0;\n return (cp >= 0xD7CB && cp <= 0xD7FB) ? 12 : 0;\n }\n // Private use\n if (cp < 0xFE00) return cp === 0xFB1E ? 3 : 0;\n // Tags and variation selectors supplement: 0xE0000-0xE0FFF\n if (cp >= 0xE0000) {\n if (cp > 0xE0FFF) return 0;\n return ((cp >= 0xE0020 && cp < 0xE0080) || (cp >= 0xE0100 && cp < 0xE01F0)) ? 3 : 2;\n }\n // The rare tail: 0xFE10-0xFFFF, 0x10000-0x1EFFF, 0x1FB00-0xDFFFF\n return findUnicodeRangeCategory(cp, TAIL_S, TAIL_E);\n}\n\n// Boundary mask table for category pairs, `PAIR[catBefore << 4 | catAfter]`.\n//\n// A boundary exists iff the mask shares no bit with the packed sequence state,\n// so the whole decision is `!(st & PAIR[...])`:\n//\n// - 0: boundary (GB999 and friends), no state bit can match\n// - 1: no boundary; bit 0 is always set in the state\n// - 2: GB12/GB13, no boundary iff odd run of RI precedes\n// - 4: GB11, no boundary iff the ZWJ was preceded by ExtPic Extend*\n// - 8: GB9c, no boundary iff InCB Consonant [Extend Linker]* Linker [Extend Linker]* precedes\nconst PAIR = Uint8Array.from(grapheme_pairs);\n\n/**\n * The Unicode `Indic_Conjunct_Break=Linker` set\n *\n * @param {number} cp\n * @return {boolean}\n */\nfunction isLinker(cp) {\n return cp === 0x094D // Devanagari Sign Virama\n || cp === 0x09CD // Bengali Sign Virama\n || cp === 0x0ACD // Gujarati Sign Virama\n || cp === 0x0B4D // Oriya Sign Virama\n || cp === 0x0C4D // Telugu Sign Virama\n || cp === 0x0D4D // Malayalam Sign Virama\n || cp === 0x1039 // Myanmar Sign Virama\n || cp === 0x17D2 // Khmer Sign Coeng\n || cp === 0x1A60 // Tai Tham Sign Sakot\n || cp === 0x1B44 // Balinese Adeg Adeg\n || cp === 0x1BAB // Sundanese Sign Virama\n || cp === 0xA9C0 // Javanese Pangkon\n || cp === 0xAAF6 // Meetei Mayek Virama\n || cp === 0x10A3F // Kharoshthi Virama\n || cp === 0x11133 // Chakma Virama\n || cp === 0x113D0 // Tulu-Tigalari Conjoiner\n || cp === 0x1193E // Dives Akuru Virama\n || cp === 0x11A47 // Zanabazar Square Subjoiner\n || cp === 0x11A99 // Soyombo Subjoiner\n || cp === 0x11F42; // Kawi Conjoiner\n}\n\n// Sequence state, packed in a small int. The bits a boundary rule can ask\n// about are laid out so that each {@link PAIR} mask selects exactly one:\n//\n// bit 0 (1) : always set, so the no-boundary mask always matches\n// bit 1 (2) : odd run of Regional_Indicator immediately precedes (GB12, GB13)\n// bit 2 (4) : the last consumed ZWJ was preceded by ExtPic Extend* (GB11)\n// bit 3 (8) : the InCB Consonant run contains a Linker (GB9c)\n// bit 4 (16) : ExtPic Extend* immediately precedes (feeds bit 2 on ZWJ)\n// bit 5 (32) : InCB Consonant [Extend Linker]* precedes\n//\n// It is a pure function of the consumed code point sequence,\n// so it carries across segment boundaries without any reset.\n// Non-stateful categories reset the state to 1 inside {@link nextState}.\n\n/**\n * State transition on consuming an Extend code point (category 3) that continues an InCB Consonant run.\n * The cp-dependent ZWNJ / `isLinker` branches are extracted here so that {@link nextState} stays small enough to inline.\n *\n * @param {number} st packed state\n * @param {number} cp the consumed Extend code point\n * @return {number} next packed state\n */\nfunction nextExtend(st, cp) {\n if (cp === 0x200C) return st & 21; // ZWNJ has InCB=None\n if (st & 8 || isLinker(cp)) return st & 21 | 40;\n return st & 21 | 32;\n}\n\n/**\n * State transition on consuming a code point.\n *\n * Extend (cat 3) is cp-dependent within an InCB Consonant run and delegates to {@link nextExtend};\n * the remaining stateful categories (4, 10, 14, 15) are inline; everything else resets to 1.\n *\n * @remarks\n * > Keep this body at or below 99 bytecodes (`node --print-bytecode -print-bytecode-filter=nextState`):\n * > Maglev refuses to inline anything from 100 bytecodes up, and the resulting call per code point measured 8-26% slower there.\n * > That is also why the tests are an `if` chain rather than a `switch`, which spends 3 extra bytecodes on the discriminant.\n *\n * @param {number} st packed state\n * @param {number} c category of the consumed code point\n * @param {number} cp the consumed code point\n * @return {number} next packed state\n */\nfunction nextState(st, c, cp) {\n if (c === 3) return st & 32 ? nextExtend(st, cp) : st & 21;\n if (c === 4) return 17; // Extended_Pictographic\n if (c === 10) return (st & 2) ^ 3; // Regional_Indicator\n if (c === 14) return (st & 16) >> 2 | st & 41; // ZWJ\n if (c === 15) return 33; // InCB=Consonant\n return 1;\n}\n\n/**\n * Unicode segmentation by extended grapheme rules.\n *\n * This is fully compatible with the {@link Intl.Segmenter.segment} API\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Segmenter/segment\n *\n * @param {string} input\n * @return {GraphemeSegmenter} iterator for grapheme cluster segments\n */\nexport function* graphemeSegments(input) {\n let len = input.length;\n if (len === 0) return;\n\n let cp = /** @type {number} */ (input.codePointAt(0));\n let cursor = cp > 0xFFFF ? 2 : 1;\n\n /** Category of the last consumed code point */\n let catBefore = cat(cp);\n\n /** Packed sequence state, seeded with the always-set bit 0 */\n let st = nextState(1, catBefore, cp);\n\n /** Start index of the current segment */\n let index = 0;\n\n /** Head code point of the current segment */\n let hd = cp;\n\n /** Category of the head */\n let catBegin = catBefore;\n\n while (cursor < len) {\n cp = /** @type {number} */ (input.codePointAt(cursor));\n let catAfter = cat(cp);\n let boundary = !(st & PAIR[catBefore << 4 | catAfter]);\n\n st = nextState(st, catAfter, cp);\n\n if (boundary) {\n yield {\n segment: input.slice(index, cursor),\n index,\n input,\n _hd: hd,\n _catBegin: /** @type {GraphemeCategoryNum} */ (catBegin === 15 ? 0 : catBegin),\n _catEnd: /** @type {GraphemeCategoryNum} */ (catBefore === 15 ? 0 : catBefore),\n };\n index = cursor;\n hd = cp;\n catBegin = catAfter;\n }\n cursor += cp > 0xFFFF ? 2 : 1;\n catBefore = catAfter;\n }\n\n yield {\n segment: input.slice(index),\n index,\n input,\n _hd: hd,\n _catBegin: /** @type {GraphemeCategoryNum} */ (catBegin === 15 ? 0 : catBegin),\n _catEnd: /** @type {GraphemeCategoryNum} */ (catBefore === 15 ? 0 : catBefore),\n };\n}\n\n/**\n * Count number of extended grapheme clusters in given text.\n *\n * @param {string} input\n * @return {number} count of grapheme clusters\n */\nexport function countGraphemes(input) {\n let len = input.length;\n if (len === 0) return 0;\n\n let cp = /** @type {number} */ (input.codePointAt(0));\n let cursor = cp > 0xFFFF ? 2 : 1;\n\n /** Category of the last consumed code point */\n let catBefore = cat(cp);\n\n /** Packed sequence state, seeded with the always-set bit 0 */\n let st = nextState(1, catBefore, cp);\n\n /** The segment being scanned counts, whether or not a boundary follows */\n let count = 1;\n\n while (cursor < len) {\n cp = /** @type {number} */ (input.codePointAt(cursor));\n let catAfter = cat(cp);\n let boundary = !(st & PAIR[catBefore << 4 | catAfter]);\n\n st = nextState(st, catAfter, cp);\n\n // NOTE: While TurboFan opts well coercion here, so the branchless form may faster here\n // ```\n // count += +!(st & PAIR[catBefore << 4 | catAfter]);\n // ```\n // However, Maglev doesn't.\n // A segmenter called a few hundred times per interaction lives there.\n if (boundary) count += 1;\n\n cursor += cp > 0xFFFF ? 2 : 1;\n catBefore = catAfter;\n }\n\n return count;\n}\n\nexport {\n /**\n * @deprecated use {@link countGraphemes}\n */\n countGraphemes as countGrapheme,\n};\n\n/**\n * Split given text into extended grapheme clusters.\n *\n * @param {string} input\n * @return {IterableIterator<string>} iterator for grapheme clusters\n *\n * @see {@link graphemeSegments} if you need extra information.\n *\n * @example\n * [...splitGraphemes('abc')] // => ['a', 'b', 'c']\n */\nexport function* splitGraphemes(input) {\n let len = input.length;\n if (len === 0) return;\n\n let cp = /** @type {number} */ (input.codePointAt(0));\n let cursor = cp > 0xFFFF ? 2 : 1;\n\n /** Category of the last consumed code point */\n let catBefore = cat(cp);\n\n /** Packed sequence state, seeded with the always-set bit 0 */\n let st = nextState(1, catBefore, cp);\n\n /** Start index of the current segment */\n let index = 0;\n\n while (cursor < len) {\n cp = /** @type {number} */ (input.codePointAt(cursor));\n let catAfter = cat(cp);\n let boundary = !(st & PAIR[catBefore << 4 | catAfter]);\n\n st = nextState(st, catAfter, cp);\n\n if (boundary) {\n yield input.slice(index, cursor);\n index = cursor;\n }\n cursor += cp > 0xFFFF ? 2 : 1;\n catBefore = catAfter;\n }\n\n yield input.slice(index);\n}\n\n/**\n * Collect all extended grapheme clusters in given text.\n *\n * This is a faster alternative to {@link splitGraphemes}, as it packs sliced segments directly into the result array.\n * However, for large inputs, using the {@link splitGraphemes} is more memory-efficient.\n *\n * @param {string} input\n * @return {string[]} array of grapheme clusters\n *\n * @see {@link splitGraphemes} for a large text input.\n *\n * @example\n * collectGraphemes('abc') // => ['a', 'b', 'c']\n */\nexport function collectGraphemes(input) {\n /** @type {string[]} */\n let result = [];\n\n let len = input.length;\n if (len === 0) return result;\n\n let cp = /** @type {number} */ (input.codePointAt(0));\n let cursor = cp > 0xFFFF ? 2 : 1;\n\n /** Category of the last consumed code point */\n let catBefore = cat(cp);\n\n /** Packed sequence state, seeded with the always-set bit 0 */\n let st = nextState(1, catBefore, cp);\n\n /** Start index of the current segment */\n let index = 0;\n\n while (cursor < len) {\n cp = /** @type {number} */ (input.codePointAt(cursor));\n let catAfter = cat(cp);\n let boundary = !(st & PAIR[catBefore << 4 | catAfter]);\n\n st = nextState(st, catAfter, cp);\n\n if (boundary) {\n result.push(input.slice(index, cursor));\n index = cursor;\n }\n cursor += cp > 0xFFFF ? 2 : 1;\n catBefore = catAfter;\n }\n\n result.push(input.slice(index));\n return result;\n}\n"],"names":["T0","T1","T2","TAIL_S","TAIL_E","fill","t","lo","from","to","cat","end","len","starts","ends","n","decodeUnicodeData","grapheme_data","grapheme_cats","cp","catRare","findUnicodeRangeCategory","PAIR","grapheme_pairs","isLinker","nextExtend","st","nextState","c","splitGraphemes","input","cursor","catBefore","index","catAfter","boundary"],"mappings":"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","x_google_ignoreList":[0]}
@@ -0,0 +1,48 @@
1
+ import { findUnicodeRangeCategory as y, decodeUnicodeData as C } from "./core.es.js";
2
+ import { grapheme_pairs as U, grapheme_cats as g, grapheme_data as h } from "./_grapheme_data.es.js";
3
+ const D = new Uint8Array(12448), E = new Uint8Array(1440), o = new Uint8Array(2816);
4
+ let B, s;
5
+ {
6
+ let e = (t, r, i, f, u) => {
7
+ let F = f - r + 1, l = t.length;
8
+ F > 0 && i - r < l && t.fill(u, i > r ? i - r : 0, F > l ? l : F);
9
+ }, n = new Uint32Array(320), x = new Uint32Array(320), A = 0;
10
+ C(h, g, (t, r, i) => {
11
+ e(D, 0, t, r, i), e(E, 42592, t, r, i), e(o, 126976, t, r, i), r >= 65040 && !(t >= 126976 && r <= 129791) && (n[A] = t, x[A++] = r << 5 | i);
12
+ }), B = n.slice(0, A), s = x.slice(0, A);
13
+ }
14
+ function a(e) {
15
+ return e < 12448 ? D[e] : e < 42592 ? e === 12951 || e === 12953 ? 4 : 0 : e < 44032 ? E[e - 42592] : e < 55204 ? (e - 44032) % 28 ? 8 : 7 : e >= 126976 && e < 129792 ? o[e - 126976] : e >>> 4 === 4064 ? 3 : w(e);
16
+ }
17
+ function w(e) {
18
+ return e < 57344 ? e <= 55238 ? e >= 55216 ? 13 : 0 : e >= 55243 && e <= 55291 ? 12 : 0 : e < 65024 ? e === 64286 ? 3 : 0 : e >= 917504 ? e > 921599 ? 0 : e >= 917536 && e < 917632 || e >= 917760 && e < 918e3 ? 3 : 2 : y(e, B, s);
19
+ }
20
+ const T = Uint8Array.from(U);
21
+ function _(e) {
22
+ return e === 2381 || e === 2509 || e === 2765 || e === 2893 || e === 3149 || e === 3405 || e === 4153 || e === 6098 || e === 6752 || e === 6980 || e === 7083 || e === 43456 || e === 43766 || e === 68159 || e === 69939 || e === 70608 || e === 71998 || e === 72263 || e === 72345 || e === 73538;
23
+ }
24
+ function m(e, n) {
25
+ return n === 8204 ? e & 21 : e & 8 || _(n) ? e & 21 | 40 : e & 21 | 32;
26
+ }
27
+ function d(e, n, x) {
28
+ return n === 3 ? e & 32 ? m(e, x) : e & 21 : n === 4 ? 17 : n === 10 ? e & 2 ^ 3 : n === 14 ? (e & 16) >> 2 | e & 41 : n === 15 ? 33 : 1;
29
+ }
30
+ function* P(e) {
31
+ let n = e.length;
32
+ if (n === 0) return;
33
+ let x = (
34
+ /** @type {number} */
35
+ e.codePointAt(0)
36
+ ), A = x > 65535 ? 2 : 1, t = a(x), r = d(1, t, x), i = 0;
37
+ for (; A < n; ) {
38
+ x = /** @type {number} */
39
+ e.codePointAt(A);
40
+ let f = a(x), u = !(r & T[t << 4 | f]);
41
+ r = d(r, f, x), u && (yield e.slice(i, A), i = A), A += x > 65535 ? 2 : 1, t = f;
42
+ }
43
+ yield e.slice(i);
44
+ }
45
+ export {
46
+ P as splitGraphemes
47
+ };
48
+ //# sourceMappingURL=grapheme.es.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grapheme.es.js","sources":["../../../node_modules/unicode-segmenter/grapheme.js"],"sourcesContent":["// @ts-check\n\nimport { decodeUnicodeData, findUnicodeRangeCategory } from './core.js';\nimport {\n GraphemeCategory,\n grapheme_cats,\n grapheme_data,\n grapheme_pairs,\n} from './_grapheme_data.js';\n\n/**\n * @typedef {import('./_grapheme_data.js').GC_Any} GC_Any\n *\n * @typedef {import('./_grapheme_data.js').GraphemeCategoryNum} GraphemeCategoryNum\n *\n * @typedef {object} GraphemeSegmentExtra\n * @property {number} _hd The first code point of the segment\n * @property {GraphemeCategoryNum} _catBegin Beginning Grapheme_Cluster_Break category of the segment\n * @property {GraphemeCategoryNum} _catEnd Ending Grapheme_Cluster_Break category of the segment\n *\n * @typedef {import('./core.js').SegmentOutput<GraphemeSegmentExtra>} GraphemeSegmentOutput\n * @typedef {import('./core.js').Segmenter<GraphemeSegmentExtra>} GraphemeSegmenter\n */\n\nexport { GraphemeCategory };\n\n// Every bound below is spelled out as a literal on purpose.\n//\n// A shared module-scope binding saves a few bundled bytes, but it is a mutable context slot\n// that engines cannot fold into the comparison; hoisting the hottest one into a `let` measured up to 25% slower on the count loop.\n\n// Direct category lookup tables for the hot Unicode regions, and a flat binary-search tail for everything rare.\n//\n// - T0: 0x0000-0x309F (ASCII, Latin, Greek, Cyrillic, Semitic, Indic, SEA, CJK punctuation and kana;\n// the table ends right after the last combining kana mark so that the CJK blocks need no lookup at all)\n// - 0x30A0-0xA65F (CJK, Yi, Lisu, Vai): only U+3297 and U+3299 are not `Any`\n// - T1: 0xA660-0xABFF\n// - 0xAC00-0xD7A3 (Hangul syllables): LV or LVT computed at runtime\n// - T2: 0x1F000-0x1FAFF (emoji)\n// - 0xFE00-0xFE0F (variation selectors): computed inline\n// - 0xD7A4-0xFDFF (Jamo Ext-B, surrogates, private use): {@link catRare}\n// - 0xE0000-0xE0FFF (tags, VS supplement): {@link catRare}\n// - everything else: binary search over the range tail (TAIL_S/TAIL_E)\n//\n// The `Indic_Conjunct_Break=Consonant` property is folded into the category\n// space as the 16th category (15) since it never overlaps other categories.\n// It shares break semantics with `Any` and never escapes to the public API.\n//\n// Total index size: ~19KiB of flat typed arrays, no retained JS objects.\nconst T0 = new Uint8Array(0x30A0);\nconst T1 = new Uint8Array(0x5A0);\nconst T2 = new Uint8Array(0xB00);\n/** @type {Uint32Array} Range starts of the binary-search tail */\nlet TAIL_S;\n/** @type {Uint32Array} Packed `end << 5 | category`, parallel to {@link TAIL_S} */\nlet TAIL_E;\n{\n let fill = (\n /** @type {Uint8Array} */ t,\n /** @type {number} */ lo,\n /** @type {number} */ from,\n /** @type {number} */ to,\n /** @type {number} */ cat,\n ) => {\n let end = to - lo + 1, len = t.length;\n if (end > 0 && from - lo < len) {\n t.fill(cat, from > lo ? from - lo : 0, end > len ? len : end);\n }\n };\n let starts = new Uint32Array(320), ends = new Uint32Array(320), n = 0;\n decodeUnicodeData(grapheme_data, grapheme_cats, (from, to, cat) => {\n fill(T0, 0, from, to, cat);\n fill(T1, 0xA660, from, to, cat);\n fill(T2, 0x1F000, from, to, cat);\n if (to >= 0xFE10 && !(from >= 0x1F000 && to <= 0x1FAFF)) {\n starts[n] = from;\n ends[n++] = to << 5 | cat;\n }\n });\n TAIL_S = starts.slice(0, n);\n TAIL_E = ends.slice(0, n);\n}\n\n/**\n * `Grapheme_Cluster_Break` property value of a given codepoint\n *\n * @see https://www.unicode.org/reports/tr29/tr29-45.html#Default_Grapheme_Cluster_Table\n *\n * @param {number} cp\n * @return {number} category number, {@link GraphemeCategoryNum} or 15 (`InCB=Consonant`)\n */\nfunction cat(cp) {\n if (cp < 0x30A0) return T0[cp];\n // CJK through Vai: U+3297 and U+3299 are the only two that are not `Any`\n if (cp < 0xA660) return cp === 0x3297 || cp === 0x3299 ? 4 : 0;\n if (cp < 0xAC00) return T1[cp - 0xA660];\n // Hangul syllables: 0xAC00-0xD7A3, LV at every 28th\n if (cp < 0xD7A4) return (cp - 0xAC00) % 28 ? 8 : 7;\n // Emoji: 0x1F000-0x1FAFF\n if (cp >= 0x1F000 && cp < 0x1FB00) return T2[cp - 0x1F000];\n // Variation selectors: 0xFE00-0xFE0F\n if (cp >>> 4 === 0xFE0) return 3;\n return catRare(cp);\n}\n\n/**\n * Cold half of {@link cat}.\n * Kept out of line so that the hot half stays well inside V8's 460-bytecode inlining limit.\n *\n * As a single function the ladder compiled to 453 bytecodes,\n * one comparison away from a cliff that cost 15-45% on every segmentation loop once `cat` stopped being inlined.\n *\n * @param {number} cp in 0xD7A4-0xDFFF, 0xE000-0xFDFF, 0xFE10-0x1EFFF or 0x1FB00+\n * @return {number} category number\n */\nfunction catRare(cp) {\n // Hangul Jamo Extended-B, unassigned and surrogates as Any\n if (cp < 0xE000) {\n if (cp <= 0xD7C6) return cp >= 0xD7B0 ? 13 : 0;\n return (cp >= 0xD7CB && cp <= 0xD7FB) ? 12 : 0;\n }\n // Private use\n if (cp < 0xFE00) return cp === 0xFB1E ? 3 : 0;\n // Tags and variation selectors supplement: 0xE0000-0xE0FFF\n if (cp >= 0xE0000) {\n if (cp > 0xE0FFF) return 0;\n return ((cp >= 0xE0020 && cp < 0xE0080) || (cp >= 0xE0100 && cp < 0xE01F0)) ? 3 : 2;\n }\n // The rare tail: 0xFE10-0xFFFF, 0x10000-0x1EFFF, 0x1FB00-0xDFFFF\n return findUnicodeRangeCategory(cp, TAIL_S, TAIL_E);\n}\n\n// Boundary mask table for category pairs, `PAIR[catBefore << 4 | catAfter]`.\n//\n// A boundary exists iff the mask shares no bit with the packed sequence state,\n// so the whole decision is `!(st & PAIR[...])`:\n//\n// - 0: boundary (GB999 and friends), no state bit can match\n// - 1: no boundary; bit 0 is always set in the state\n// - 2: GB12/GB13, no boundary iff odd run of RI precedes\n// - 4: GB11, no boundary iff the ZWJ was preceded by ExtPic Extend*\n// - 8: GB9c, no boundary iff InCB Consonant [Extend Linker]* Linker [Extend Linker]* precedes\nconst PAIR = Uint8Array.from(grapheme_pairs);\n\n/**\n * The Unicode `Indic_Conjunct_Break=Linker` set\n *\n * @param {number} cp\n * @return {boolean}\n */\nfunction isLinker(cp) {\n return cp === 0x094D // Devanagari Sign Virama\n || cp === 0x09CD // Bengali Sign Virama\n || cp === 0x0ACD // Gujarati Sign Virama\n || cp === 0x0B4D // Oriya Sign Virama\n || cp === 0x0C4D // Telugu Sign Virama\n || cp === 0x0D4D // Malayalam Sign Virama\n || cp === 0x1039 // Myanmar Sign Virama\n || cp === 0x17D2 // Khmer Sign Coeng\n || cp === 0x1A60 // Tai Tham Sign Sakot\n || cp === 0x1B44 // Balinese Adeg Adeg\n || cp === 0x1BAB // Sundanese Sign Virama\n || cp === 0xA9C0 // Javanese Pangkon\n || cp === 0xAAF6 // Meetei Mayek Virama\n || cp === 0x10A3F // Kharoshthi Virama\n || cp === 0x11133 // Chakma Virama\n || cp === 0x113D0 // Tulu-Tigalari Conjoiner\n || cp === 0x1193E // Dives Akuru Virama\n || cp === 0x11A47 // Zanabazar Square Subjoiner\n || cp === 0x11A99 // Soyombo Subjoiner\n || cp === 0x11F42; // Kawi Conjoiner\n}\n\n// Sequence state, packed in a small int. The bits a boundary rule can ask\n// about are laid out so that each {@link PAIR} mask selects exactly one:\n//\n// bit 0 (1) : always set, so the no-boundary mask always matches\n// bit 1 (2) : odd run of Regional_Indicator immediately precedes (GB12, GB13)\n// bit 2 (4) : the last consumed ZWJ was preceded by ExtPic Extend* (GB11)\n// bit 3 (8) : the InCB Consonant run contains a Linker (GB9c)\n// bit 4 (16) : ExtPic Extend* immediately precedes (feeds bit 2 on ZWJ)\n// bit 5 (32) : InCB Consonant [Extend Linker]* precedes\n//\n// It is a pure function of the consumed code point sequence,\n// so it carries across segment boundaries without any reset.\n// Non-stateful categories reset the state to 1 inside {@link nextState}.\n\n/**\n * State transition on consuming an Extend code point (category 3) that continues an InCB Consonant run.\n * The cp-dependent ZWNJ / `isLinker` branches are extracted here so that {@link nextState} stays small enough to inline.\n *\n * @param {number} st packed state\n * @param {number} cp the consumed Extend code point\n * @return {number} next packed state\n */\nfunction nextExtend(st, cp) {\n if (cp === 0x200C) return st & 21; // ZWNJ has InCB=None\n if (st & 8 || isLinker(cp)) return st & 21 | 40;\n return st & 21 | 32;\n}\n\n/**\n * State transition on consuming a code point.\n *\n * Extend (cat 3) is cp-dependent within an InCB Consonant run and delegates to {@link nextExtend};\n * the remaining stateful categories (4, 10, 14, 15) are inline; everything else resets to 1.\n *\n * @remarks\n * > Keep this body at or below 99 bytecodes (`node --print-bytecode -print-bytecode-filter=nextState`):\n * > Maglev refuses to inline anything from 100 bytecodes up, and the resulting call per code point measured 8-26% slower there.\n * > That is also why the tests are an `if` chain rather than a `switch`, which spends 3 extra bytecodes on the discriminant.\n *\n * @param {number} st packed state\n * @param {number} c category of the consumed code point\n * @param {number} cp the consumed code point\n * @return {number} next packed state\n */\nfunction nextState(st, c, cp) {\n if (c === 3) return st & 32 ? nextExtend(st, cp) : st & 21;\n if (c === 4) return 17; // Extended_Pictographic\n if (c === 10) return (st & 2) ^ 3; // Regional_Indicator\n if (c === 14) return (st & 16) >> 2 | st & 41; // ZWJ\n if (c === 15) return 33; // InCB=Consonant\n return 1;\n}\n\n/**\n * Unicode segmentation by extended grapheme rules.\n *\n * This is fully compatible with the {@link Intl.Segmenter.segment} API\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Segmenter/segment\n *\n * @param {string} input\n * @return {GraphemeSegmenter} iterator for grapheme cluster segments\n */\nexport function* graphemeSegments(input) {\n let len = input.length;\n if (len === 0) return;\n\n let cp = /** @type {number} */ (input.codePointAt(0));\n let cursor = cp > 0xFFFF ? 2 : 1;\n\n /** Category of the last consumed code point */\n let catBefore = cat(cp);\n\n /** Packed sequence state, seeded with the always-set bit 0 */\n let st = nextState(1, catBefore, cp);\n\n /** Start index of the current segment */\n let index = 0;\n\n /** Head code point of the current segment */\n let hd = cp;\n\n /** Category of the head */\n let catBegin = catBefore;\n\n while (cursor < len) {\n cp = /** @type {number} */ (input.codePointAt(cursor));\n let catAfter = cat(cp);\n let boundary = !(st & PAIR[catBefore << 4 | catAfter]);\n\n st = nextState(st, catAfter, cp);\n\n if (boundary) {\n yield {\n segment: input.slice(index, cursor),\n index,\n input,\n _hd: hd,\n _catBegin: /** @type {GraphemeCategoryNum} */ (catBegin === 15 ? 0 : catBegin),\n _catEnd: /** @type {GraphemeCategoryNum} */ (catBefore === 15 ? 0 : catBefore),\n };\n index = cursor;\n hd = cp;\n catBegin = catAfter;\n }\n cursor += cp > 0xFFFF ? 2 : 1;\n catBefore = catAfter;\n }\n\n yield {\n segment: input.slice(index),\n index,\n input,\n _hd: hd,\n _catBegin: /** @type {GraphemeCategoryNum} */ (catBegin === 15 ? 0 : catBegin),\n _catEnd: /** @type {GraphemeCategoryNum} */ (catBefore === 15 ? 0 : catBefore),\n };\n}\n\n/**\n * Count number of extended grapheme clusters in given text.\n *\n * @param {string} input\n * @return {number} count of grapheme clusters\n */\nexport function countGraphemes(input) {\n let len = input.length;\n if (len === 0) return 0;\n\n let cp = /** @type {number} */ (input.codePointAt(0));\n let cursor = cp > 0xFFFF ? 2 : 1;\n\n /** Category of the last consumed code point */\n let catBefore = cat(cp);\n\n /** Packed sequence state, seeded with the always-set bit 0 */\n let st = nextState(1, catBefore, cp);\n\n /** The segment being scanned counts, whether or not a boundary follows */\n let count = 1;\n\n while (cursor < len) {\n cp = /** @type {number} */ (input.codePointAt(cursor));\n let catAfter = cat(cp);\n let boundary = !(st & PAIR[catBefore << 4 | catAfter]);\n\n st = nextState(st, catAfter, cp);\n\n // NOTE: While TurboFan opts well coercion here, so the branchless form may faster here\n // ```\n // count += +!(st & PAIR[catBefore << 4 | catAfter]);\n // ```\n // However, Maglev doesn't.\n // A segmenter called a few hundred times per interaction lives there.\n if (boundary) count += 1;\n\n cursor += cp > 0xFFFF ? 2 : 1;\n catBefore = catAfter;\n }\n\n return count;\n}\n\nexport {\n /**\n * @deprecated use {@link countGraphemes}\n */\n countGraphemes as countGrapheme,\n};\n\n/**\n * Split given text into extended grapheme clusters.\n *\n * @param {string} input\n * @return {IterableIterator<string>} iterator for grapheme clusters\n *\n * @see {@link graphemeSegments} if you need extra information.\n *\n * @example\n * [...splitGraphemes('abc')] // => ['a', 'b', 'c']\n */\nexport function* splitGraphemes(input) {\n let len = input.length;\n if (len === 0) return;\n\n let cp = /** @type {number} */ (input.codePointAt(0));\n let cursor = cp > 0xFFFF ? 2 : 1;\n\n /** Category of the last consumed code point */\n let catBefore = cat(cp);\n\n /** Packed sequence state, seeded with the always-set bit 0 */\n let st = nextState(1, catBefore, cp);\n\n /** Start index of the current segment */\n let index = 0;\n\n while (cursor < len) {\n cp = /** @type {number} */ (input.codePointAt(cursor));\n let catAfter = cat(cp);\n let boundary = !(st & PAIR[catBefore << 4 | catAfter]);\n\n st = nextState(st, catAfter, cp);\n\n if (boundary) {\n yield input.slice(index, cursor);\n index = cursor;\n }\n cursor += cp > 0xFFFF ? 2 : 1;\n catBefore = catAfter;\n }\n\n yield input.slice(index);\n}\n\n/**\n * Collect all extended grapheme clusters in given text.\n *\n * This is a faster alternative to {@link splitGraphemes}, as it packs sliced segments directly into the result array.\n * However, for large inputs, using the {@link splitGraphemes} is more memory-efficient.\n *\n * @param {string} input\n * @return {string[]} array of grapheme clusters\n *\n * @see {@link splitGraphemes} for a large text input.\n *\n * @example\n * collectGraphemes('abc') // => ['a', 'b', 'c']\n */\nexport function collectGraphemes(input) {\n /** @type {string[]} */\n let result = [];\n\n let len = input.length;\n if (len === 0) return result;\n\n let cp = /** @type {number} */ (input.codePointAt(0));\n let cursor = cp > 0xFFFF ? 2 : 1;\n\n /** Category of the last consumed code point */\n let catBefore = cat(cp);\n\n /** Packed sequence state, seeded with the always-set bit 0 */\n let st = nextState(1, catBefore, cp);\n\n /** Start index of the current segment */\n let index = 0;\n\n while (cursor < len) {\n cp = /** @type {number} */ (input.codePointAt(cursor));\n let catAfter = cat(cp);\n let boundary = !(st & PAIR[catBefore << 4 | catAfter]);\n\n st = nextState(st, catAfter, cp);\n\n if (boundary) {\n result.push(input.slice(index, cursor));\n index = cursor;\n }\n cursor += cp > 0xFFFF ? 2 : 1;\n catBefore = catAfter;\n }\n\n result.push(input.slice(index));\n return result;\n}\n"],"names":["T0","T1","T2","TAIL_S","TAIL_E","fill","lo","from","to","cat","end","len","starts","ends","n","decodeUnicodeData","grapheme_data","grapheme_cats","cp","catRare","findUnicodeRangeCategory","PAIR","grapheme_pairs","isLinker","nextExtend","st","nextState","c","splitGraphemes","input","cursor","catBefore","index","catAfter","boundary"],"mappings":"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","x_google_ignoreList":[0]}
package/package.json CHANGED
@@ -42,6 +42,7 @@
42
42
  "remark-gfm": "^4.0.1",
43
43
  "remark-math": "^6.0.0",
44
44
  "tailwind-merge": "^3.3.1",
45
+ "unicode-segmenter": "0.17.3",
45
46
  "unified": "^11.0.5",
46
47
  "unist": "^0.0.1",
47
48
  "unist-util-visit": "^5.0.0"
@@ -181,7 +182,7 @@
181
182
  ]
182
183
  }
183
184
  },
184
- "version": "0.2.16-dev.1",
185
+ "version": "0.2.17-dev.1",
185
186
  "type": "module",
186
187
  "exports": {
187
188
  ".": {