rapier-markdown-kit 1.1.102 → 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.
- package/LICENSE +2 -2
- package/README.md +213 -53
- package/dist/agent/vendor/hyphen-en-us/LICENSE +14 -0
- package/dist/agent/vendor/hyphen-en-us/SOURCE.json +33 -0
- package/dist/agent/vendor/hyphen-en-us/hyph-en-us.hyp.txt +14 -0
- package/dist/agent/vendor/hyphen-en-us/hyph-en-us.pat.txt +4938 -0
- package/dist/agent/vendor/hyphen-en-us/patterns.js +25 -0
- package/dist/agent/vendor/pretext/LICENSE +208 -0
- package/dist/agent/vendor/pretext/NOTICE +26 -13
- package/dist/agent/vendor/pretext/SOURCE.json +213 -45
- package/dist/agent/vendor/pretext/analysis.js +675 -1224
- package/dist/agent/vendor/pretext/entry-geometry.js +183 -0
- package/dist/agent/vendor/pretext/gecko-line-breaks.js +688 -0
- package/dist/agent/vendor/pretext/generated/engine-break-data.js +57 -0
- package/dist/agent/vendor/pretext/generated/webkit-generic-families.js +80 -0
- package/dist/agent/vendor/pretext/graphemes.js +98 -0
- package/dist/agent/vendor/pretext/han-kerning.js +253 -0
- package/dist/agent/vendor/pretext/layout.js +352 -290
- package/dist/agent/vendor/pretext/line-break.js +1154 -588
- package/dist/agent/vendor/pretext/line-breaks.js +892 -0
- package/dist/agent/vendor/pretext/line-text.js +81 -39
- package/dist/agent/vendor/pretext/measurement.js +1105 -176
- package/dist/agent/vendor/pretext/prepare.js +807 -0
- package/dist/agent/vendor/pretext/rich-inline.js +1242 -273
- package/dist/agent/will.mjs +2 -0
- package/dist/kit/assets.mjs +5 -1
- package/dist/kit/conformance/run.mjs +4 -4
- package/dist/kit/export-fonts.mjs +26 -11
- package/dist/kit/index.mjs +1 -0
- package/dist/kit/ledger/carried.mjs +9 -7
- package/dist/kit/ledger/data.mjs +73 -13
- package/dist/kit/ledger/format.mjs +166 -53
- package/dist/kit/ledger/hash.mjs +75 -18
- package/dist/kit/ledger/history.mjs +143 -115
- package/dist/kit/ledger/inverse-source.mjs +158 -19
- package/dist/kit/ledger/journal-records.mjs +292 -67
- package/dist/kit/model.mjs +1 -1
- package/dist/kit/pdf-glyphs.mjs +4 -4
- package/dist/kit/render-markdown.mjs +259 -122
- package/dist/kit/render-sanitize.mjs +24 -4
- package/dist/kit/render-work.mjs +99 -20
- package/dist/kit/render.mjs +101 -65
- package/dist/kit/typography.mjs +2 -0
- package/dist/layout/hyphenation.mjs +127 -0
- package/dist/layout/line-plan.mjs +88 -96
- package/dist/layout/model.mjs +61 -80
- package/dist/layout/paragraph-fit.mjs +191 -0
- package/dist/layout/preparation.mjs +373 -0
- package/dist/layout/prepared-paragraph.mjs +223 -0
- package/dist/layout/typography.mjs +345 -111
- package/dist/packages/rapier-diff/index.mjs +288 -196
- package/dist/spec/document-fonts.mjs +13 -4
- package/dist/spec/md-assets.mjs +149 -30
- package/dist/spec/md-layout.mjs +5 -2
- package/dist/spec/md-marks.mjs +218 -3
- package/dist/spec/md-source.mjs +122 -0
- package/package.json +2 -1
- package/style.css +9 -0
- package/dist/agent/vendor/pretext/bidi.js +0 -151
- 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
|
+
}
|