rapier-markdown-kit 1.1.101 → 1.1.104

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.
Files changed (60) hide show
  1. package/LICENSE +2 -2
  2. package/README.md +213 -53
  3. package/dist/agent/vendor/hyphen-en-us/LICENSE +14 -0
  4. package/dist/agent/vendor/hyphen-en-us/SOURCE.json +33 -0
  5. package/dist/agent/vendor/hyphen-en-us/hyph-en-us.hyp.txt +14 -0
  6. package/dist/agent/vendor/hyphen-en-us/hyph-en-us.pat.txt +4938 -0
  7. package/dist/agent/vendor/hyphen-en-us/patterns.js +25 -0
  8. package/dist/agent/vendor/pretext/LICENSE +208 -0
  9. package/dist/agent/vendor/pretext/NOTICE +26 -13
  10. package/dist/agent/vendor/pretext/SOURCE.json +213 -45
  11. package/dist/agent/vendor/pretext/analysis.js +675 -1224
  12. package/dist/agent/vendor/pretext/entry-geometry.js +183 -0
  13. package/dist/agent/vendor/pretext/gecko-line-breaks.js +688 -0
  14. package/dist/agent/vendor/pretext/generated/engine-break-data.js +57 -0
  15. package/dist/agent/vendor/pretext/generated/webkit-generic-families.js +80 -0
  16. package/dist/agent/vendor/pretext/graphemes.js +98 -0
  17. package/dist/agent/vendor/pretext/han-kerning.js +253 -0
  18. package/dist/agent/vendor/pretext/layout.js +352 -290
  19. package/dist/agent/vendor/pretext/line-break.js +1154 -588
  20. package/dist/agent/vendor/pretext/line-breaks.js +892 -0
  21. package/dist/agent/vendor/pretext/line-text.js +81 -39
  22. package/dist/agent/vendor/pretext/measurement.js +1105 -176
  23. package/dist/agent/vendor/pretext/prepare.js +807 -0
  24. package/dist/agent/vendor/pretext/rich-inline.js +1242 -273
  25. package/dist/agent/will.mjs +2 -0
  26. package/dist/kit/assets.mjs +5 -1
  27. package/dist/kit/conformance/run.mjs +4 -4
  28. package/dist/kit/export-fonts.mjs +26 -11
  29. package/dist/kit/index.mjs +1 -0
  30. package/dist/kit/ledger/carried.mjs +9 -7
  31. package/dist/kit/ledger/data.mjs +73 -13
  32. package/dist/kit/ledger/format.mjs +166 -53
  33. package/dist/kit/ledger/hash.mjs +75 -18
  34. package/dist/kit/ledger/history.mjs +143 -115
  35. package/dist/kit/ledger/inverse-source.mjs +158 -19
  36. package/dist/kit/ledger/journal-records.mjs +292 -67
  37. package/dist/kit/model.mjs +1 -1
  38. package/dist/kit/pdf-glyphs.mjs +4 -4
  39. package/dist/kit/render-markdown.mjs +259 -122
  40. package/dist/kit/render-sanitize.mjs +24 -4
  41. package/dist/kit/render-work.mjs +99 -20
  42. package/dist/kit/render.mjs +101 -65
  43. package/dist/kit/typography.mjs +2 -0
  44. package/dist/layout/hyphenation.mjs +127 -0
  45. package/dist/layout/line-plan.mjs +88 -96
  46. package/dist/layout/model.mjs +61 -80
  47. package/dist/layout/paragraph-fit.mjs +191 -0
  48. package/dist/layout/preparation.mjs +373 -0
  49. package/dist/layout/prepared-paragraph.mjs +223 -0
  50. package/dist/layout/typography.mjs +345 -111
  51. package/dist/packages/rapier-diff/index.mjs +288 -196
  52. package/dist/spec/document-fonts.mjs +13 -4
  53. package/dist/spec/md-assets.mjs +149 -30
  54. package/dist/spec/md-layout.mjs +5 -2
  55. package/dist/spec/md-marks.mjs +218 -3
  56. package/dist/spec/md-source.mjs +122 -0
  57. package/package.json +2 -1
  58. package/style.css +9 -0
  59. package/dist/agent/vendor/pretext/bidi.js +0 -151
  60. package/dist/agent/vendor/pretext/generated/bidi-data.js +0 -3831
@@ -0,0 +1,57 @@
1
+ /*! Pretext Unreleased (bac1774c0) | MIT; BSD/Unicode/ICU notices in LICENSE | Copyright (c) 2026 Pretext contributors */
2
+ // Generated by scripts/generate-engine-break-data.ts from scripts/engine-data/.
3
+ // Do not edit by hand. Regenerate with `bun run generate:engine-break-data`.
4
+
5
+ // A string named ...Packed is a table in unpackTable's form, the others are varints in base64
6
+ // (unpackVarints), both in src/line-breaks.ts.
7
+
8
+ // Chrome 153's line_normal.brk and line_normal_cj.brk (ICU 78.2) and libicucore 78.1's line.brk,
9
+ // line_normal.brk and line_cj.brk: ICU's line rules. Chrome 153's and libicucore 78.1's char.brk:
10
+ // ICU's grapheme cluster rules. libicucore's character classes U+F870..U+F87F, U+F884..U+F899, U+F89F
11
+ // apart from Chrome's.
12
+
13
+
14
+
15
+
16
+ // A class for every code point: each rule table's categories, for Firefox the Line_Break
17
+ // values of its baked ICU4X line data and icu_properties 2.1.2's East_Asian_Width H (2), F (3)
18
+ // and W (5), 0 otherwise, in ICU4C numbering, and a script class, an index into scriptClassFacts
19
+ // below. For each map, its row in the remaps and how many blocks its table takes; then one list
20
+ // of runs for all maps and the remaps, a byte per joint class and map (unpackClassRuns in
21
+ // src/line-breaks.ts).
22
+
23
+ export const classMaps = {"chromium/line_normal":[0,182],"chromium/line_normal_cj":[1,182],"apple/line_normal":[2,183],"apple/line":[3,183],"apple/line_cj":[4,183],"chromium/char":[5,148],"apple/char":[6,149],"gecko/line":[7,196],"gecko/east_asian_width":[8,38],"chromium/script":[9,80]}
24
+ export const jointClassCount = 248
25
+ export const classRunsVarints = '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AAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoDAAIaAwACGgMAAhoD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'
26
+ export const classRemapsPacked = 'sBPUAQsLMzQDCwMLKgQLIiIqEw4LC0ALCz8wFAMqKjstAwM/BBcMCx8NA0AsA0AfKgMWKgsaIisYCwkLKywDPgoMIQMyFSoDDg4NEwsLLxMUCRADCQ0tCwsMFwMVGQMLFSAhGSssLQ8rISotCxMVAxMNCQsOFEAXBB4LCwsLKSI5DhQDBAYTEAM/GxwdBAMmJx4oLDIDAyoLNTU3LCwqLCwgExUhCwUHCA8REg8UBgsLAwMVEBADCwwEHgQVExUjCwMXJAMlFhgVBAspLgkEFBQZBDErAyoEAF4kFA4sMjYVMik3MissMioyLTgnGQQ5FR8gOToyLRMDPD0LCzQ1CvgBBEELC0AB+AEFPC0DA0AD+AEEQSwDQQz4AQE/MvgBAUEF+AEBOgT4AQFABvgBATMA+AEDNjY4JvgBAg4UFPgBBTcVMik4A/gBCjknGQQ6FR8gOjsA+AECPT5y8AMEAy0qMhbwAwMsNjY58AMEDDE1KwD4AQE1GfADABT4AQEyxgH4AQEy0AH4AQAO6AUAIPgBCgYGEhMIBgoGBwYAAwUGBgcLCAAGCQYIBgYHBwgICwENAAAOBQwKCwYDAiQAAgEBCAAMAggGAD0AAAEBAwEbAQgEHQcIBggJBgwGAj8BCwIUAQkBBwEMBUINCQMDCAMDCQYICg0ODwFyAQMAOgAGZAcICQMGDgQFAg0AARwFCAYGAwkAcgEDAGMFCgYDEBEDHAAHmgEABkAACwkECAsMCQALAwgUCHL4AQEQffgB1AE0AxUWDgMOARkIAxkZGSMlAwMuAwMuEQ0OGQwaAw40LggJKAECJg4uDQ4uAhkOLBoBFxkkKwMTNCQNDhoqKAYOIg4ZNCUlJyM0NBE0DRMcDhMmAzQaKQkOFAgOAxQyGQgkDQENJDQ0AxkjFA4jJhMDJQ0uCTQiNDQ0NCk0BSUNDggKIxw0Lh0fHgg0BxsiMw0iDg4ZNBMTJw0NGQ0NMiMUNDQgEC8PGDAPDSEBAw4UFBwcDgMoCCIIFC40MTQOCTUONiwrFAgDKAQTAw0NCAgIJA40CABeGQ0lHBwbDiIpJyIkDSIMIgMLGzQ0BRQ0NDQABAsOLRIAAAUFAAAAAAYFAAMJAgUFBg8AAxsBAwIHAAIrAQUEGAICAAoBAQUKDgQFBQADBS4ACAEBAxA0AQUAAQMABQMBAQICACUBAAQrAgMFBWsAAUkEBQUDAgEBAAmRAQQAAAUHAAEZAAcAAAcQAAAHBwEABwcDDgcAAgsABwcAEAMbBAAKBwAAJwAAWQAABwYPBwATFA8AFAMVBwsBGQIQEAAOBQAACRAHAdEBBAgLBxIBWgUWAgACFgI8CA0AEBERExQHASsBBwMFAAA7ARAACgIRCwBfAABSAAEWBwIAAwQHBwcEDQsABAQABQYMCwoHEQEwDxAQBwsHDwAOAAsLAAADDgE7BBcYAw8AhQEBAwFPBREAAAAPABgCExQBRQQHBxAHAwEEAA4AAA=='
27
+
28
+ // What ICU 78.2's Script, Script_Extensions, East_Asian_Width and bracket pairs (Unicode 17) say
29
+ // of the code points of each script class, as the bits src/prepare.ts names: the scripts Blink's
30
+ // script runs read a character as, the ones a mark gives the character before it, whether it is
31
+ // a paired bracket, and how far before a closing bracket's code its opening bracket's is.
32
+ export const scriptClassFacts = [1055,5151,25631,8,42015,12,10,1,479,351,287,31,415,159,4,2,2064,16,543,4097,24577,63,5121,-7137,58399]
33
+
34
+ // Each rule table's forward state table: its categories, first dictionary category, look-ahead
35
+ // slots and states, then the table its rows start from, if any, and the rows' differences
36
+ // (unpackStateRows in src/line-breaks.ts).
37
+ export const ruleTables = {"chromium/line_normal":[65,63,11,365,null,"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"],"chromium/line_normal_cj":[66,64,11,367,null,"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"],"apple/line_normal":[65,63,11,365,"chromium/line_normal","BgACOAAAKicAAjgAACoLAAI4AAAqDgACOAAAKi0AAjh2APMBAQACOAAAKhtnARumAVq2AQEAAw=="],"apple/line":[65,63,11,365,"apple/line_normal",""],"apple/line_cj":[65,63,11,365,"apple/line_normal",""],"chromium/char":[21,21,3,16,null,"AQASBgIAAgADAAQABQAEAAYABAAHAAQACAAJAAoABAAEAAkACgALAAABAAEAAQEHAgACBQsEAQQBBAMEAAQAAQQLBQMFAwUADAAFBAABBQAAAAAAAAMDCwcDDQQHAAQEEAgACQMJAAoABQIRCQAKAAEBEQAABwEXDgAIAQoFAAYDCw0CBwUNAAMCAQIVDwAAAQAC"],"apple/char":[21,21,3,16,"chromium/char",""]}
38
+
39
+ // Chromium's generated kFastLineBreakTable, a bit per U+0021..U+00FF pair where a line may
40
+ // start between them (character_property_data_generator.cc:422-551).
41
+ export const blinkLinePairsPacked = '5DAIgAAACAAAAAQDBAYA/+v/+/8CAQF/DBwACAEADhwCCAAUAQQfgAlAFDgAGBwAGFQAJAEANHAAKDgACBwM9hYAuP///+////9vACsAJDgADAEACIgDAA4eABiYAgDmARwANKQDAChUACQcBLyW/7kH+AMAoQLAAwDqAxwBAFm4BwCeBhwAFYAHAYAY9BMAGpAUAK4BmAIB/xYBAX/wBYwIABgBAZgC5gcBDBCMDwBQHAC2AbQCAAeIGAGGBYgYAScM3AoANIwBAH7QAgEA2wH0BQDAAXAAlg0cAA=='
42
+
43
+ // WebKit's LineBreakTable, BreakablePositions.cpp:42-269.
44
+ export const webkitLinePairsPacked = '5DAIgAAACAAAAAQDBAYA/+v/+/8CAQF/DBwACAEADhwCCAAUAQQfgAlAFDgAGBwAGFQAJAEANHAAKDgACBwE/1cA/gTAAgAAKwQfgAnAAxAB/xg4AAwBAAiIAwAOHgAYmAIA5gEcADSkAwAoVAAkHAy8lv+5////7////2+kAsADAOoDHAEAWbgHAJ4GHAAVgAcBgBj0EwAakBQArgGYAgH/FgEBf/AFjAgAGAEBmALmBwEMEIwPAFAcALYBtAIAB4gYAYYFiBgBJwzcCgA0jAEAftACAQDbAfQFAMABcACWDRwA'
45
+
46
+ // libicucore's quotation remaps by locale name (apple-rbbi.cpp:406-487): a code point, then
47
+ // 0 for the category of U+007B or 1 for U+007D. A locale without an entry takes its parent's.
48
+ export const appleQuoteRemaps = {"":[8220,0,8221,1,8216,0],"agq":[8221,1],"am":[171,0,187,1,8249,0,8250,1],"ar":[],"ast":[171,0,187,1,8220,0,8221,1],"bas":[171,0,187,1,8221,1],"be":[171,0,187,1,8221,1],"bg":[8221,1,8221,1],"blo":[171,0,187,1,8220,0,8221,1],"bm":[171,0,187,1,8220,0,8221,1],"br":[171,0,187,1,8220,0,8221,1],"bs":[8221,1,8216,0],"bua":[171,0,187,1,8221,1],"ca":[171,0,187,1,8220,0,8221,1],"cs":[8221,1],"cv":[171,0,187,1,8220,0,8221,1],"da":[],"de":[8221,1],"dsb":[8221,1],"dua":[171,0,187,1,8216,0],"dyo":[171,0,187,1,8220,0,8221,1],"el":[171,0,187,1,8220,0,8221,1],"eo":[8220,0,8221,1,171,0,187,1],"et":[8221,1],"eu":[171,0,187,1,8220,0,8221,1],"ewo":[171,0,187,1,8220,0,8221,1],"fa":[171,0,187,1,8249,0,8250,1],"ff":[8221,1],"fi":[],"fr":[171,0,187,1,171,0,187,1],"fur":[8216,0,8220,0,8221,1],"gsw":[171,0,187,1,8249,0,8250,1],"he":[],"hr":[8221,1],"hsb":[8221,1],"hu":[8221,1,187,0,171,1],"hy":[171,0,187,1,171,0,187,1],"ia":[8216,0,8220,0,8221,1],"ie":[171,0,187,1,8220,0,8221,1],"is":[8221,1],"it":[171,0,187,1,8220,0,8221,1],"ja":[],"jgo":[171,0,187,1,8249,0,8250,1],"ka":[8221,1,171,0,187,1],"kab":[171,0,187,1,8220,0,8221,1],"kk":[171,0,187,1,8220,0,8221,1],"kkj":[171,0,187,1,8249,0,8250,1],"ksf":[171,0,187,1,8216,0],"ksh":[8221,1],"ky":[171,0,187,1,8221,1],"lag":[],"lb":[8221,1],"lij":[171,0,187,1,8220,0,8221,1],"lt":[8221,1,8221,1],"luy":[8221,1],"mg":[171,0,187,1,8220,0,8221,1],"mk":[8221,1],"mua":[171,0,187,1,8220,0,8221,1],"mzn":[171,0,187,1,8249,0,8250,1],"nb":[171,0,187,1,8216,0],"nds":[8221,1],"nl":[8216,0,8216,0],"nmg":[8221,1,171,0,187,1],"nn":[171,0,187,1,8216,0],"nnh":[171,0,187,1,8220,0,8221,1],"no":[171,0,187,1,8216,0],"oc":[171,0,187,1,171,0,187,1],"os":[171,0,187,1,8221,1],"pl":[8221,1,171,0,187,1],"pms":[171,0,187,1,8220,0,8221,1],"prg":[8221,1,8221,1],"rm":[171,0,187,1,8249,0,8250,1],"rn":[],"ro":[8221,1,171,0,187,1],"ru":[171,0,187,1,8221,1],"rw":[171,0,187,1,8216,0],"sah":[171,0,187,1,8221,1],"sc":[171,0,187,1,8220,0,8221,1],"se":[],"sg":[171,0,187,1,8220,0,8221,1],"shi":[171,0,187,1,8221,1],"sk":[8221,1],"sl":[8221,1],"sn":[],"sr":[8221,1],"ss":[8216,0,8220,0,8221,1],"st":[8216,0,8220,0,8221,1],"sv":[],"syr":[],"szl":[8221,1,187,0,171,1],"ti":[171,0,187,1,8220,0,8221,1],"tk":[8220,0,8221,1,8220,0,8221,1],"tn":[8216,0,8220,0,8221,1],"ts":[8216,0,8220,0,8221,1],"tyv":[171,0,187,1,8221,1],"ug":[187,0,171,1,8250,0,8249,1],"uk":[171,0,187,1,8221,1],"ur":[],"uz":[8220,0,8221,1],"ve":[8216,0,8220,0,8221,1],"wae":[171,0,187,1,8249,0,8250,1],"yav":[171,0,187,1,171,0,187,1],"yi":[],"yue":[],"zgh":[171,0,187,1,8221,1],"az_Cyrl":[171,0,187,1,8249,0,8250,1],"bs_Cyrl":[8221,1],"ff_Adlm":[8220,0,8221,1,8216,0],"fr_CA":[171,0,187,1],"fr_CH":[171,0,187,1,8249,0,8250,1],"kk_Arab":[187,0,171,1,8250,0,8249,1],"ms_Arab":[],"pt_AO":[171,0,187,1,8220,0,8221,1],"pt_CH":[171,0,187,1,8220,0,8221,1],"pt_CV":[171,0,187,1,8220,0,8221,1],"pt_FR":[171,0,187,1,8220,0,8221,1],"pt_GQ":[171,0,187,1,8220,0,8221,1],"pt_GW":[171,0,187,1,8220,0,8221,1],"pt_LU":[171,0,187,1,8220,0,8221,1],"pt_MO":[171,0,187,1,8220,0,8221,1],"pt_MZ":[171,0,187,1,8220,0,8221,1],"pt_PT":[171,0,187,1,8220,0,8221,1],"pt_ST":[171,0,187,1,8220,0,8221,1],"pt_TL":[171,0,187,1,8220,0,8221,1],"ti_ER":[8216,0,8220,0,8221,1],"uz_Arab":[8220,0,8221,1,8216,0],"uz_Cyrl":[8220,0,8221,1,8216,0],"zh_Hant":[]}
49
+
50
+ // Firefox's baked ICU4X line data: the BreakState byte of each pair of properties (icu_segmenter
51
+ // 2.1.2 src/provider/mod.rs:288-310).
52
+ export const geckoLinePropertyCount = 68
53
+ export const geckoLineLastCodepointProperty = 54
54
+ export const geckoLineEotProperty = 67
55
+ export const geckoLineBreakStatesPacked = 'kCQB/QMBAf8AAgABAwABBAH9BQgAAQYB/QQKAAEEAf0EEwAHPQH/DkQB/wdEAf8BBQT///8qBEgADEQC/T8BAgAgiAEBKgEPAT5SiAEE/z//QA6IAQAWRAL/Pg/MAQH/BgIAIMwBABDUAgBAkAIABCEAIkQBPBKIAQAOoAQB/SvMAQH/BgEACAwAEQEBKhIXAf1KAQH/BKwEAAa+AQH9Bw0D/f+yFpgDACawBgA6RAAE5AQC/TtV9AYAIEQABYgBAv87ErgHAB3qAgAnLAAEiAEB/xGQAgBA1AIAPkQAJewFADQBABuIAQAEJAA4zAEB/yKQAgADoAQBPQugBAE9KdgLAB3ACAH/RLAGACpEAf9xoAQAIvQGAAREACbUAgABiwMAAiwAZqAEAEeoBQCEAQEAXdwDABuwBgArrAgBNxDACABARAAgzAEAArwBADrgDAAtRAAVswoAWkQAQNgLAAoPASs/RAEsHDABOC7gDAAL7AUBQVj0FwAOkBMB/RGQEwP9Of0qhAkB/07gDABeRAAoiQQAFagWAEyYAwAPxBMACzABNRIlAGmMCgErQ4wKABGwBgH+BQEB/wADAf8ABgH/BhIABg0C/v8EHAT//v/+CAEASZgUAf0LzBIABrAGAAUPArH9FLgYAAfxBgAb9AYAAEQBPFbQGwACVwA4sAYB/iwBAf8OEwATogIB/xAOASoFtwIAVsAIAHwBAA=='
56
+
57
+
@@ -0,0 +1,80 @@
1
+ /*! Pretext Unreleased (bac1774c0) | MIT; BSD/Unicode/ICU notices in LICENSE | Copyright (c) 2026 Pretext contributors */
2
+ // Generated by scripts/generate-webkit-generic-families.ts from scripts/engine-data/safari-27.0/.
3
+ // Do not edit by hand. Regenerate with `bun run generate:webkit-generic-families`.
4
+
5
+ // The languages and ISO 15924 subtags WebKit gives a script other than Common, zh and hani being
6
+ // plain Han (localeToScriptCode, LocaleToScriptMapping.cpp), lower case with '-', between spaces.
7
+ export const webkitScriptLanguages = ' aa ab ady af ak am ar as ast av ay az ba be bg bi bn bo bs ca ce ceb ch chk cs cy da de dv dz ee efi el en es et eu fa fi fil fj fo fr fur fy ga gaa gd gil gl gn gsw gu ha haw he hi hil ho hr ht hu hy id ig ii ilo inh is it iu ja jv ka kaj kam kbd kha kk kl km kn ko kok kos kpe krc ks ku kum ky la lah lb lez ln lo lt lv mai mdf mg mh mi mk ml mn mr ms mt my myv na nb ne niu nl nn nr nso ny oc om or os pa pag pap pau pl pon ps pt qu rm rn ro ru rw sa sah sat sd se sg si sid sk sl sm so sq sr ss st su sv sw ta te tet tg th ti tig tk tkl tl tn to tpi tr trv ts tt tvl tw ty tyv udm ug uk und ur uz ve vi wal war wo xh yap yo za zh zh-hk zh-tw zu '
8
+ export const webkitScriptSubtags = ' arab armn bali batk beng blis bopo brah brai bugi buhd cans cham cher cirt copt cprt cyrl cyrs deva dsrt egyd egyh egyp ethi geok geor glag goth grek gujr guru hang hani hano hans hant hebr hira hmng hrkt hung inds ital java jpan kali kana khar khmr knda kore laoo latf latg latn lepc limb lina linb mand maya mero mlym mong mymr nkoo ogam orkh orya osma perm phag phnx plrd qaai roro runr sara shaw sinh sylo syrc syre syrj syrn tagb tale talu taml telu teng tfng tglg thaa thai tibt ugar vaii visp xpeo xsux yiii zxxx '
9
+
10
+ // Per language, lower case, the family of serif, sans-serif, cursive, fantasy and monospace as
11
+ // indices into webkitGenericFamilyNames: a family, or macOS's and iOS's joined by '|', macOS's
12
+ // being one iOS's Safari lacks; 0 where the keyword resolves as in Canvas. A language without an
13
+ // entry takes its parent's, the identifier less its last subtag, and '' at the end. macOS's
14
+ // families of the pairs:
15
+ // Apple Chancery, AppleMyungjo, ITF Devanagari, Kannada MN, Khmer MN, Kokonor, Lao MN, Lucida
16
+ // Grande, Malayalam MN, Noto Serif Myanmar, Oriya MN, Sinhala MN, Songti SC, Songti TC
17
+ export const webkitGenericFamilyNames = ['', 'Zapfino', 'Menlo', 'Kefa III', 'Geeza Pro', 'Snell Roundhand', 'Kohinoor Bangla', 'Kokonor|Kailasa', 'Kailasa', 'Galvji', 'Noto Sans Tagalog', 'Kohinoor Gujarati', 'Lucida Grande|Arial Hebrew', 'Apple Chancery|Arial Hebrew', 'Courier New', 'ITF Devanagari|Kohinoor Devanagari', 'Kohinoor Devanagari', 'Noto Sans Armenian', 'Euphemia UCAS', 'Hiragino Mincho ProN', 'Hiragino Sans', 'Helvetica', 'Khmer MN|Khmer Sangam MN', 'Khmer Sangam MN', 'Kannada MN|Noto Sans Kannada', 'Noto Sans Kannada', 'AppleMyungjo|Apple SD Gothic Neo', 'Apple SD Gothic Neo', 'Noto Nastaliq Urdu', 'Lao MN|Lao Sangam MN', 'Lao Sangam MN', 'Malayalam MN|Malayalam Sangam MN', 'Malayalam Sangam MN', 'Noto Serif Myanmar|Noto Sans Myanmar', 'Noto Sans Myanmar', 'Oriya MN|Noto Sans Oriya', 'Noto Sans Oriya', 'Mukta Mahee', 'Sinhala MN|Sinhala Sangam MN', 'Sinhala Sangam MN', 'Tamil Sangam MN', 'Kohinoor Telugu', 'Thonburi', 'Songti TC|PingFang HK', 'PingFang HK', 'Songti SC|PingFang SC', 'PingFang SC', 'Songti TC|PingFang TC', 'PingFang TC', 'Songti TC|PingFang MO', 'PingFang MO']
18
+ export const webkitGenericFamilies = {
19
+ '': [0, 0, 0, 1, 2],
20
+ 'am': [3, 3, 3, 3, 2],
21
+ 'ar': [4, 4, 4, 4, 2],
22
+ 'bg': [0, 0, 5, 5, 2],
23
+ 'bn': [6, 6, 6, 6, 2],
24
+ 'bo': [7, 8, 7, 7, 2],
25
+ 'chr': [9, 9, 9, 9, 2],
26
+ 'ckb': [4, 4, 4, 4, 2],
27
+ 'fa': [4, 4, 4, 4, 2],
28
+ 'fil': [10, 10, 10, 10, 2],
29
+ 'gu': [11, 11, 11, 11, 2],
30
+ 'he': [0, 12, 13, 0, 14],
31
+ 'hi': [15, 16, 16, 16, 2],
32
+ 'hy': [17, 17, 17, 17, 2],
33
+ 'iu': [18, 18, 18, 18, 2],
34
+ 'ja': [19, 20, 19, 19, 2],
35
+ 'ka': [21, 0, 21, 21, 2],
36
+ 'km': [22, 23, 22, 22, 2],
37
+ 'kn': [24, 25, 24, 24, 2],
38
+ 'ko': [26, 27, 26, 26, 2],
39
+ 'ks': [28, 28, 28, 28, 2],
40
+ 'lo': [29, 30, 29, 29, 2],
41
+ 'lrc': [4, 4, 4, 4, 2],
42
+ 'ml': [31, 32, 31, 31, 2],
43
+ 'my': [33, 34, 33, 33, 2],
44
+ 'mzn': [4, 4, 4, 4, 2],
45
+ 'or': [35, 36, 35, 35, 2],
46
+ 'pa': [37, 37, 37, 37, 2],
47
+ 'ps': [4, 4, 4, 4, 2],
48
+ 'ro': [0, 0, 5, 5, 2],
49
+ 'ru': [0, 0, 5, 5, 2],
50
+ 'sd': [4, 4, 4, 4, 2],
51
+ 'si': [38, 39, 38, 38, 2],
52
+ 'sr': [0, 0, 5, 5, 2],
53
+ 'ta': [40, 40, 40, 40, 2],
54
+ 'te': [41, 41, 41, 41, 2],
55
+ 'th': [42, 42, 42, 42, 2],
56
+ 'tr': [0, 0, 5, 5, 2],
57
+ 'ug': [4, 4, 4, 4, 2],
58
+ 'uk': [0, 0, 5, 5, 2],
59
+ 'ur': [28, 28, 28, 28, 2],
60
+ 'yi': [0, 12, 13, 0, 14],
61
+ 'yue': [43, 44, 43, 43, 2],
62
+ 'zh': [45, 46, 45, 45, 2],
63
+ 'kk-arab': [4, 4, 4, 4, 2],
64
+ 'ks-arab': [4, 4, 4, 4, 2],
65
+ 'ks-deva': [0, 0, 0, 1, 2],
66
+ 'ms-arab': [4, 4, 4, 4, 2],
67
+ 'pa-arab': [4, 4, 4, 4, 2],
68
+ 'sd-deva': [0, 0, 0, 1, 2],
69
+ 'ur-arab': [4, 4, 4, 4, 2],
70
+ 'uz-arab': [4, 4, 4, 4, 2],
71
+ 'yue-hans': [45, 46, 45, 45, 2],
72
+ 'zh-hant': [47, 48, 47, 47, 2],
73
+ 'zh-hk': [43, 44, 43, 43, 2],
74
+ 'zh-mo': [49, 50, 49, 49, 2],
75
+ 'zh-tw': [47, 48, 47, 47, 2],
76
+ 'pa-aran-pk': [28, 28, 28, 28, 2],
77
+ 'yue-hant-mo': [49, 50, 49, 49, 2],
78
+ 'zh-hant-hk': [43, 44, 43, 43, 2],
79
+ 'zh-hant-mo': [49, 50, 49, 49, 2],
80
+ }
@@ -0,0 +1,98 @@
1
+ /*! Pretext Unreleased (bac1774c0) | MIT; BSD/Unicode/ICU notices in LICENSE | Copyright (c) 2026 Pretext contributors */
2
+ // Grapheme clusters as each engine's Intl.Segmenter finds them: ICU's character rules
3
+ // (char.brk) as Chrome and libicucore ship them, which scripts/generate-engine-break-data.ts
4
+ // writes to src/generated/engine-break-data.ts. Firefox's ICU4X data gives the same clusters
5
+ // as Chrome's table, which the generator checks, so Firefox takes Chrome's. The rules are
6
+ // Unicode 17's and don't follow a browser to another version (RESEARCH.md, Decisions Log,
7
+ // 2026-09-24).
8
+ //
9
+ // Firefox finds clusters in its text run, which leaves out soft hyphens and bidi controls
10
+ // (IsDiscardable, nsTextFrameUtils.cpp:32-49). So the Gecko profile's table, 'gecko/char', runs
11
+ // Chrome's rules past them: one goes with the cluster before it, or at the start with the one
12
+ // after it, and text of only such characters holds no cluster.
13
+
14
+
15
+ import { getBreakRules, getClass, START_STATE, } from './line-breaks.js'
16
+
17
+ const CLUSTER_END = 0x80
18
+
19
+
20
+
21
+
22
+
23
+
24
+
25
+
26
+
27
+
28
+
29
+
30
+
31
+ // ICU's handleNext (rbbi.cpp:779-952) ends a cluster at the last accepting position before
32
+ // its forward table stops. In the character rules every state but the start state accepts,
33
+ // except a look-ahead state after a regional indicator pair, whose only way in records its
34
+ // position one code point back; the generator checks both. So a cluster ends right before the
35
+ // code point whose transition stops or enters that state, and the next cluster starts at that
36
+ // code point from the start state. One pass over the text finds every cluster.
37
+ function parseGraphemeRules(table ) {
38
+ const rules = getBreakRules(table === 'gecko/char' ? 'chromium/char' : table)
39
+ const width = rules.rowWidth
40
+ const rows = rules.rows
41
+ const states = rows.length / width
42
+ const transitions = new Uint8Array(states * rules.catCount)
43
+ for (let state = 0; state < states; state++) {
44
+ for (let category = 0; category < rules.catCount; category++) {
45
+ const next = rows[state * width + 3 + category]
46
+ transitions[state * rules.catCount + category] = next === 0 || rows[next * width] > 1
47
+ ? CLUSTER_END | rows[START_STATE * width + 3 + category]
48
+ : next
49
+ }
50
+ }
51
+ return { rules, transitions, skipped: table === 'gecko/char' ? getClass(rules.classes, 0x00ad) : -1 }
52
+ }
53
+
54
+ const graphemeRules = {}
55
+
56
+ // nsBidiUtils.h:84-90
57
+ export function isBidiControl(cp ) {
58
+ return ((cp & 0xff00) === 0x2000 && ((cp >= 0x202a && cp <= 0x202e) || (cp >= 0x2066 && cp <= 0x2069) || (cp & ~1) === 0x200e)) ||
59
+ cp === 0x061c
60
+ }
61
+
62
+ // The number of grapheme clusters in text[start, end), read as if the text began at `start`
63
+ // and ended at `end`. Unless `ends` is null, writes where each cluster ends to it from index
64
+ // 0; it needs room for end - start values.
65
+ export function findGraphemeEnds(table , text , start , end , ends ) {
66
+ const { rules, transitions, skipped } = graphemeRules[table] ?? (graphemeRules[table] = parseGraphemeRules(table))
67
+ const catCount = rules.catCount
68
+ let state = START_STATE
69
+ let count = 0
70
+ for (let i = start; i < end;) {
71
+ let c = text.charCodeAt(i)
72
+ let next = i + 1
73
+ if ((c & 0xfc00) === 0xd800 && next < end) {
74
+ const trail = text.charCodeAt(next)
75
+ if ((trail & 0xfc00) === 0xdc00) { next++; c = ((c - 0xd800) << 10) + trail - 0xdc00 + 0x10000 }
76
+ }
77
+ const category = getClass(rules.classes, c)
78
+ if (category === skipped && (c === 0x00ad || isBidiControl(c))) {
79
+ i = next
80
+ continue
81
+ }
82
+ // The start state takes every code point without CLUSTER_END, so none is set at `start`.
83
+ const transition = transitions[state * catCount + category]
84
+ if ((transition & CLUSTER_END) !== 0) {
85
+ if (ends !== null) ends[count] = i
86
+ count++
87
+ }
88
+ state = transition & ~CLUSTER_END
89
+ i = next
90
+ }
91
+ // Every code point takes the state to an accepting one, never the start state, which the
92
+ // generator checks, so a cluster is open here once one was read.
93
+ if (state !== START_STATE) {
94
+ if (ends !== null) ends[count] = end
95
+ count++
96
+ }
97
+ return count
98
+ }
@@ -0,0 +1,253 @@
1
+ /*! Pretext Unreleased (bac1774c0) | MIT; BSD/Unicode/ICU notices in LICENSE | Copyright (c) 2026 Pretext contributors */
2
+ // Blink's HanKerning under the default text-spacing-trim: normal (han_kerning.cc/.h,
3
+ // han_kerning_char_type.h and shaping_line_breaker.cc at Chrome 153). Blink halts a fullwidth
4
+ // opening mark after an opening, middle, closing or narrow opening mark, and a closing mark
5
+ // before a closing, middle or narrow closing mark (HanKerning::ShouldKern and ShouldKernLast,
6
+ // han_kerning.h:164-174), reading the characters on both sides of each shaped range, except
7
+ // at a wrapped line start: text-spacing-trim: normal doesn't trim there
8
+ // (text_spacing_trim.h:31-34), and the line start is reshaped with is_line_start, which skips
9
+ // the character before it (shaping_line_breaker.cc:91-109, 307-324; harfbuzz_shaper.cc:1019-1030;
10
+ // han_kerning.cc:266). At a line end it halts a closing mark that doesn't otherwise fit, where
11
+ // a break follows it (shaping_line_breaker.cc:342-363). The scan gives none before a space, tab
12
+ // or line feed (text_break_iterator.cc:284-291), but under overflow-wrap: break-word a line that
13
+ // no break of the scan's fits is laid out again with a break after every grapheme (HandleOverflow,
14
+ // line_breaker.cc:4259-4263, 4617-4625), so there the halt applies before anything.
15
+ //
16
+ // Canvas applies the pair rules only inside what it shapes as one word: Blink's Canvas cuts a
17
+ // string before and after CJK ideographs and symbols and shapes each word alone
18
+ // (plain_text_node.cc:93-155, 377-400). So preparation adds the halts the page gives across
19
+ // segment boundaries and across those cuts. A segment's width leaves out the halt of its first
20
+ // character after the text before it, which a line start takes back, the halts of pairs it
21
+ // holds across a cut, such as `(「`, and the halt of its last character before the text after
22
+ // it; a line end can halt its last closing mark. Every character type and trim is read from
23
+ // Canvas once per font: in `cc` HanKerning halts exactly one of the two, so a character's trim
24
+ // is 2 W(c) - W(cc), and the types of dots, colons, semicolons and quotes follow their ink
25
+ // bounds under the page's Han script (han_kerning.cc:47-168, 400-535).
26
+ import { KIND_BITS, TEXT, UNBROKEN, } from './analysis.js'
27
+ import { hasProperty, PUNCTUATION } from './line-breaks.js'
28
+ import { getContext, getSegmentMetrics, zeros, } from './measurement.js'
29
+
30
+ const OTHER = 0
31
+ const OPEN = 1
32
+ const CLOSE = 2
33
+ const MIDDLE = 3
34
+ const OPEN_NARROW = 4
35
+ const CLOSE_NARROW = 5
36
+ const DOT = 6
37
+ const COLON = 7
38
+ const SEMICOLON = 8
39
+ const OPEN_QUOTE = 9
40
+ const CLOSE_QUOTE = 10
41
+
42
+ // Sticky, to test a code unit where it sits in the text.
43
+ const openPunctuationRe = /\p{Ps}/uy
44
+ const closePunctuationRe = /\p{Pe}/uy
45
+
46
+ // Character::MaybeHanKerningOpenOrCloseFast (character.h:138-141): every fullwidth opening
47
+ // and closing mark and every quote is in these ranges.
48
+ const maybeHanKerningRe = /[\u2018-\u301F\uFF08-\uFF60]/
49
+
50
+ function maybeHanKerns(c ) {
51
+ return (c >= 0x2018 && c <= 0x301F) || (c >= 0xFF08 && c <= 0xFF60)
52
+ }
53
+
54
+ export function textMayHanKern(text ) {
55
+ return maybeHanKerningRe.test(text)
56
+ }
57
+
58
+ // HanKerningCharType (character_property_data_generator.cc:143-167, han_kerning_char_type.h:17-44)
59
+ // of the code unit at `index`: the listed quotes, dots, colon, semicolon and middles, then Ps and Pe,
60
+ // fullwidth when in the CJK Symbols block or East_Asian_Width F.
61
+ function getStaticCharType(text , index ) {
62
+ const c = text.charCodeAt(index)
63
+ switch (c) {
64
+ case 0x2018: case 0x201C: return OPEN_QUOTE
65
+ case 0x2019: case 0x201D: return CLOSE_QUOTE
66
+ case 0x3001: case 0x3002: case 0xFF0C: case 0xFF0E: return DOT
67
+ case 0xFF1A: return COLON
68
+ case 0xFF1B: return SEMICOLON
69
+ case 0x00B7: case 0x2027: case 0x3000: case 0x30FB: return MIDDLE
70
+ default: {
71
+ if (c < 0x28 || !hasProperty(c, PUNCTUATION)) return OTHER
72
+ const wide = (c >= 0x3000 && c <= 0x303F) || (c >= 0xFF01 && c <= 0xFF60) || (c >= 0xFFE0 && c <= 0xFFE6)
73
+ openPunctuationRe.lastIndex = closePunctuationRe.lastIndex = index
74
+ if (openPunctuationRe.test(text)) return wide ? OPEN : OPEN_NARROW
75
+ if (closePunctuationRe.test(text)) return wide ? CLOSE : CLOSE_NARROW
76
+ return OTHER
77
+ }
78
+ }
79
+ }
80
+
81
+
82
+
83
+
84
+
85
+
86
+
87
+
88
+
89
+ // CharTypeFromBounds (han_kerning.cc:48-73), horizontal, of c as HanKerning::FontData
90
+ // shapes it: under the locale's Han script (han_kerning.cc:462), where `locl` can move
91
+ // punctuation. Under zh-Hans, PingFang TC draws `。` in the left half of its em, and alone
92
+ // centered. Canvas shapes a CJK symbol next to 中 as Han, so its right edge comes from `中c`
93
+ // and its left edge from `c中`, where 中's ink covers neither. Curly quotes and U+FF1B are
94
+ // words of their own in Canvas (NextWordEndIndex) and are measured alone.
95
+ function getTypeFromBounds(ctx , c , hanWidth ) {
96
+ const s = String.fromCharCode(c)
97
+ let advance
98
+ let left
99
+ let right
100
+ if (isCanvasCjkSymbol(c)) {
101
+ const after = ctx.measureText('\u4E2D' + s)
102
+ advance = after.width - hanWidth
103
+ right = after.actualBoundingBoxRight - hanWidth
104
+ left = -ctx.measureText(s + '\u4E2D').actualBoundingBoxLeft
105
+ } else {
106
+ const metrics = ctx.measureText(s)
107
+ advance = metrics.width
108
+ left = -metrics.actualBoundingBoxLeft
109
+ right = metrics.actualBoundingBoxRight
110
+ }
111
+ const halfEm = advance / 2
112
+ const type = right <= halfEm ? CLOSE : left >= halfEm ? OPEN : right - left <= halfEm && left >= halfEm / 2 ? MIDDLE : OTHER
113
+ return { advance, type }
114
+ }
115
+
116
+ function getTrim(data , c , measurement ) {
117
+ let trim = data.trims.get(c)
118
+ if (trim === undefined) {
119
+ const one = String.fromCharCode(c)
120
+ trim = 2 * getSegmentMetrics(one, measurement).width - getSegmentMetrics(one + one, measurement).width
121
+ data.trims.set(c, trim)
122
+ }
123
+ return trim
124
+ }
125
+
126
+ // HanKerning::FontData (han_kerning.cc:400-535); null where the font that draws 「 has no halt.
127
+ function getFontData(measurement ) {
128
+ if (measurement.hanKerning !== undefined) return measurement.hanKerning
129
+ const data = { typeForDot: OTHER, typeForColon: OTHER, typeForSemicolon: OTHER, quoteFullwidth: false, trims: new Map() }
130
+ if (getTrim(data, 0x300C, measurement) <= 1e-3) {
131
+ measurement.hanKerning = null
132
+ return null
133
+ }
134
+ const hanWidth = getSegmentMetrics('\u4E2D', measurement).width
135
+ const ctx = getContext(measurement)
136
+ const glyphs = [0x3001, 0x3002, 0xFF0C, 0xFF0E, 0xFF1A, 0xFF1B, 0x201C, 0x2018, 0x201D, 0x2019].map(c => getTypeFromBounds(ctx, c, hanWidth))
137
+ // A group has one type only when its glyphs share the advance and the type (han_kerning.cc:88-135).
138
+ const group = (from , to ) => {
139
+ for (let i = from + 1; i < to; i++) {
140
+ if (glyphs[i] .advance !== glyphs[from] .advance || glyphs[i] .type !== glyphs[from] .type) return OTHER
141
+ }
142
+ return glyphs[from] .type
143
+ }
144
+ data.typeForDot = group(0, 4)
145
+ data.typeForColon = glyphs[4] .type
146
+ data.typeForSemicolon = glyphs[5] .type
147
+ data.quoteFullwidth = group(6, 8) === OPEN && group(8, 10) === CLOSE
148
+ measurement.hanKerning = data
149
+ return data
150
+ }
151
+
152
+ // HanKerning::GetCharType (han_kerning.cc:142-168).
153
+ function getCharType(data , text , index ) {
154
+ const type = getStaticCharType(text, index)
155
+ switch (type) {
156
+ case DOT: return data.typeForDot
157
+ case COLON: return data.typeForColon
158
+ case SEMICOLON: return data.typeForSemicolon
159
+ case OPEN_QUOTE: return data.quoteFullwidth ? OPEN : OPEN_NARROW
160
+ case CLOSE_QUOTE: return data.quoteFullwidth ? CLOSE : CLOSE_NARROW
161
+ default: return type
162
+ }
163
+ }
164
+
165
+ // HanKerning::ShouldKern and ShouldKernLast (han_kerning.h:164-174): the halted character of
166
+ // the pair (earlier, later), 1 for the later, -1 for the earlier, 0 for neither.
167
+ function haltedSide(earlier , later ) {
168
+ if (later === OPEN && (earlier === OPEN || earlier === MIDDLE || earlier === CLOSE || earlier === OPEN_NARROW)) return 1
169
+ if (earlier === CLOSE && (later === CLOSE || later === MIDDLE || later === CLOSE_NARROW)) return -1
170
+ return 0
171
+ }
172
+
173
+ // Character::IsCjkIdeographOrSymbol (character_property_data.h:17-110) for the characters
174
+ // HanKerning types. Canvas starts a word where exactly one of two such characters is a CJK
175
+ // symbol (NextWordEndIndex, plain_text_node.cc:93-155): curly quotes, U+00B7, U+2027, U+FF1B
176
+ // and the narrow brackets aren't.
177
+ function isCanvasCjkSymbol(c ) {
178
+ return (c >= 0x3000 && c <= 0x30FF) || (c >= 0xFE30 && c <= 0xFE6F) || (c >= 0xFF00 && c <= 0xFFEF && c !== 0xFF1B)
179
+ }
180
+
181
+
182
+
183
+
184
+
185
+
186
+
187
+
188
+
189
+
190
+
191
+
192
+
193
+
194
+
195
+
196
+ // The trims of an analysis' text segments, read from the characters before and after each. For a
197
+ // rich-inline item, those of its segments, [from, to) of its paragraph's analysis, in lists that
198
+ // start at `from`: Blink reads the character before a shaped run and the one after it from the
199
+ // paragraph's text, whatever items they are in, and types both by the font of the run it shapes
200
+ // (HanKerning::AppendFontFeatures, han_kerning.cc:242-243, 266-273, 288-294, 314-319), so a pair
201
+ // of marks an item start splits halts as in one text, each mark by its own item's font.
202
+ export function getHanKerningTrims(measurement , analysis , from , to ) {
203
+ const out = { widthTrims: null, lineStartExtras: null, lineEndTrims: null, overflowLineEndTrims: null }
204
+ const data = getFontData(measurement)
205
+ if (data === null) return out
206
+ const { flags, starts, normalized } = analysis
207
+ const count = flags.length
208
+ const addWidthTrim = (i , trim ) => {
209
+ out.widthTrims ??= zeros(to - from)
210
+ out.widthTrims[i - from] = out.widthTrims[i - from] + trim
211
+ }
212
+ for (let i = from; i < to; i++) {
213
+ if ((flags[i] & KIND_BITS) !== TEXT) continue
214
+ const start = starts[i]
215
+ const end = i + 1 < count ? starts[i + 1] : normalized.length
216
+ const first = normalized.charCodeAt(start)
217
+ if (i > 0 && maybeHanKerns(first) && haltedSide(getCharType(data, normalized, start - 1), getCharType(data, normalized, start)) === 1) {
218
+ const trim = getTrim(data, first, measurement)
219
+ out.lineStartExtras ??= zeros(to - from)
220
+ out.lineStartExtras[i - from] = trim
221
+ addWidthTrim(i, trim)
222
+ }
223
+ for (let k = start + 1; k < end; k++) {
224
+ const earlier = normalized.charCodeAt(k - 1)
225
+ const later = normalized.charCodeAt(k)
226
+ if (!(maybeHanKerns(earlier) || maybeHanKerns(later)) || isCanvasCjkSymbol(earlier) === isCanvasCjkSymbol(later)) continue
227
+ const side = haltedSide(getCharType(data, normalized, k - 1), getCharType(data, normalized, k))
228
+ if (side !== 0) addWidthTrim(i, getTrim(data, side === 1 ? later : earlier, measurement))
229
+ }
230
+ const last = normalized.charCodeAt(end - 1)
231
+ if (!maybeHanKerns(last)) continue
232
+ // The text after it halts a closing mark wherever the line ends.
233
+ const atEnd = i + 1 === count
234
+ if (!atEnd && haltedSide(getCharType(data, normalized, end - 1), getCharType(data, normalized, end)) === -1) {
235
+ addWidthTrim(i, getTrim(data, last, measurement))
236
+ continue
237
+ }
238
+ // Character::MaybeHanKerningClose (character.h:131-133, character.cc:130-135). Blink then
239
+ // halts the character whatever the font types it (han_kerning.cc:284-285, 312-313); the
240
+ // port asks for a closing type, since only then does 2 W(c) - W(cc) measure the halt.
241
+ const lastType = getStaticCharType(normalized, end - 1)
242
+ if ((lastType !== CLOSE && lastType !== CLOSE_QUOTE) || getCharType(data, normalized, end - 1) !== CLOSE) continue
243
+ // A break directly after the segment: text after a break, or the end of the text.
244
+ if (atEnd || ((flags[i + 1] & KIND_BITS) === TEXT && (flags[i + 1] & UNBROKEN) === 0)) {
245
+ out.lineEndTrims ??= zeros(to - from)
246
+ out.lineEndTrims[i - from] = getTrim(data, last, measurement)
247
+ } else {
248
+ out.overflowLineEndTrims ??= zeros(to - from)
249
+ out.overflowLineEndTrims[i - from] = getTrim(data, last, measurement)
250
+ }
251
+ }
252
+ return out
253
+ }