@weft-js/text 0.0.0-stage → 0.1.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.
- package/LICENSE +38 -0
- package/README.md +103 -2
- package/dist/LICENSE +38 -0
- package/dist/LICENSE-pretext +229 -0
- package/dist/blink/chunk-2UTDV3NY.js +1 -0
- package/dist/blink/chunk-AVLP4LK4.js +1 -0
- package/dist/blink/chunk-LBFXENHK.js +1 -0
- package/dist/blink/chunk-LCLBVK2G.js +1 -0
- package/dist/blink/chunk-M5EVTPT6.js +1 -0
- package/dist/blink/engine.js +1 -0
- package/dist/blink/exact-SQQRYG6J.js +1 -0
- package/dist/blink/meta.json +1 -0
- package/dist/blink/pack-complex-TZ3EEWXH.js +1 -0
- package/dist/blink/pack-families-E2YTVA25.js +0 -0
- package/dist/blink/pack-rare-3377IVPF.js +0 -0
- package/dist/blink/pack-scripts-6AZOGP44.js +1 -0
- package/dist/blink/pack-spacing-ZXHYQEXD.js +1 -0
- package/dist/gecko/chunk-SWBCNRDA.js +1 -0
- package/dist/gecko/chunk-VN7PBWFN.js +1 -0
- package/dist/gecko/chunk-XRF67SWC.js +1 -0
- package/dist/gecko/engine.js +1 -0
- package/dist/gecko/meta.json +1 -0
- package/dist/gecko/pack-complex-ZRH5NAPR.js +1 -0
- package/dist/gecko/pack-families-34KO3CLI.js +0 -0
- package/dist/gecko/pack-rare-FDYU357Z.js +0 -0
- package/dist/gecko/pack-scripts-JJOHXLOT.js +1 -0
- package/dist/gecko/pack-spacing-CAG6CLVB.js +1 -0
- package/dist/index.js +1 -0
- package/dist/webkit/chunk-A4DB6TWP.js +1 -0
- package/dist/webkit/chunk-B3WIVP7S.js +1 -0
- package/dist/webkit/chunk-FEELTLSH.js +1 -0
- package/dist/webkit/chunk-JQWGQSV3.js +1 -0
- package/dist/webkit/chunk-M5EVTPT6.js +1 -0
- package/dist/webkit/chunk-SCKMN2PN.js +1 -0
- package/dist/webkit/engine.js +1 -0
- package/dist/webkit/exact-NKXB5V2W.js +1 -0
- package/dist/webkit/meta.json +1 -0
- package/dist/webkit/pack-complex-ZCMCV5WM.js +1 -0
- package/dist/webkit/pack-families-KIE64YFZ.js +1 -0
- package/dist/webkit/pack-rare-SSJ2B7KP.js +0 -0
- package/dist/webkit/pack-scripts-WIXSLWBC.js +1 -0
- package/dist/webkit/pack-spacing-UGCQZTVO.js +1 -0
- package/package.json +51 -4
- package/plugin/build.mjs +225 -0
- package/plugin/index.d.ts +40 -0
- package/plugin/index.mjs +79 -0
- package/plugin/measure.mjs +20 -0
- package/vendor/pretext/LICENSE +229 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"inputs":{"src/alphabet.json":{"bytes":237,"imports":[]},"src/alphabet.ts":{"bytes":1771,"imports":[{"path":"src/alphabet.json","kind":"import-statement","original":"./alphabet.json"}],"format":"esm"},"gen/webkit/packs.ts":{"bytes":366,"imports":[{"path":"<runtime>","kind":"import-statement","external":true}],"format":"esm"},"gen/webkit/generated/engine-break-data.ts":{"bytes":10399,"imports":[],"format":"esm"},"gen/webkit/line-breaks.ts":{"bytes":38236,"imports":[{"path":"gen/webkit/packs.ts","kind":"import-statement","original":"./packs.js"},{"path":"gen/webkit/generated/engine-break-data.ts","kind":"import-statement","original":"./generated/engine-break-data.js"}],"format":"esm"},"src/lite.ts":{"bytes":13717,"imports":[{"path":"gen/webkit/line-breaks.ts","kind":"import-statement","original":"@engine/line-breaks.js"},{"path":"gen/webkit/packs.ts","kind":"import-statement","original":"@engine/packs.js"}],"format":"esm"},"gen/webkit/graphemes.ts":{"bytes":4921,"imports":[{"path":"gen/webkit/line-breaks.ts","kind":"import-statement","original":"./line-breaks.js"}],"format":"esm"},"gen/webkit/gecko-line-breaks.ts":{"bytes":33967,"imports":[{"path":"gen/webkit/generated/engine-break-data.ts","kind":"import-statement","original":"./generated/engine-break-data.js"},{"path":"gen/webkit/graphemes.ts","kind":"import-statement","original":"./graphemes.js"},{"path":"gen/webkit/line-breaks.ts","kind":"import-statement","original":"./line-breaks.js"}],"format":"esm"},"gen/webkit/analysis.ts":{"bytes":37076,"imports":[{"path":"gen/webkit/packs.ts","kind":"import-statement","original":"./packs.js"},{"path":"gen/webkit/gecko-line-breaks.ts","kind":"import-statement","original":"./gecko-line-breaks.js"},{"path":"gen/webkit/graphemes.ts","kind":"import-statement","original":"./graphemes.js"},{"path":"gen/webkit/line-breaks.ts","kind":"import-statement","original":"./line-breaks.js"}],"format":"esm"},"gen/webkit/measurement.ts":{"bytes":84167,"imports":[{"path":"gen/webkit/packs.ts","kind":"import-statement","original":"./packs.js"},{"path":"gen/webkit/graphemes.ts","kind":"import-statement","original":"./graphemes.js"},{"path":"gen/webkit/line-breaks.ts","kind":"import-statement","original":"./line-breaks.js"},{"path":"./generated/webkit-generic-families.js","kind":"import-statement","external":true}],"format":"esm"},"gen/webkit/han-kerning.ts":{"bytes":13356,"imports":[{"path":"gen/webkit/analysis.ts","kind":"import-statement","original":"./analysis.js"},{"path":"gen/webkit/line-breaks.ts","kind":"import-statement","original":"./line-breaks.js"},{"path":"gen/webkit/measurement.ts","kind":"import-statement","original":"./measurement.js"}],"format":"esm"},"gen/webkit/prepare.ts":{"bytes":40798,"imports":[{"path":"gen/webkit/packs.ts","kind":"import-statement","original":"./packs.js"},{"path":"gen/webkit/han-kerning.ts","kind":"import-statement","original":"./han-kerning.js"},{"path":"gen/webkit/graphemes.ts","kind":"import-statement","original":"./graphemes.js"},{"path":"gen/webkit/generated/engine-break-data.ts","kind":"import-statement","original":"./generated/engine-break-data.js"},{"path":"gen/webkit/line-breaks.ts","kind":"import-statement","original":"./line-breaks.js"},{"path":"gen/webkit/analysis.ts","kind":"import-statement","original":"./analysis.js"},{"path":"gen/webkit/measurement.ts","kind":"import-statement","original":"./measurement.js"}],"format":"esm"},"gen/webkit/line-break.ts":{"bytes":25561,"imports":[{"path":"gen/webkit/packs.ts","kind":"import-statement","original":"./packs.js"},{"path":"gen/webkit/analysis.ts","kind":"import-statement","original":"./analysis.js"},{"path":"./measurement.js","kind":"import-statement","external":true}],"format":"esm"},"gen/webkit/line-text.ts":{"bytes":3753,"imports":[{"path":"gen/webkit/graphemes.ts","kind":"import-statement","original":"./graphemes.js"},{"path":"gen/webkit/analysis.ts","kind":"import-statement","original":"./analysis.js"},{"path":"gen/webkit/line-break.ts","kind":"import-statement","original":"./line-break.js"},{"path":"./measurement.js","kind":"import-statement","external":true}],"format":"esm"},"gen/webkit/layout.ts":{"bytes":14402,"imports":[{"path":"gen/webkit/line-breaks.ts","kind":"import-statement","original":"./line-breaks.js"},{"path":"gen/webkit/analysis.ts","kind":"import-statement","original":"./analysis.js"},{"path":"gen/webkit/measurement.ts","kind":"import-statement","original":"./measurement.js"},{"path":"gen/webkit/prepare.ts","kind":"import-statement","original":"./prepare.js"},{"path":"gen/webkit/line-break.ts","kind":"import-statement","original":"./line-break.js"},{"path":"gen/webkit/line-text.ts","kind":"import-statement","original":"./line-text.js"}],"format":"esm"},"gen/webkit/line-break.complex.ts":{"bytes":36572,"imports":[{"path":"gen/webkit/analysis.ts","kind":"import-statement","original":"./analysis.js"},{"path":"gen/webkit/measurement.ts","kind":"import-statement","original":"./measurement.js"},{"path":"gen/webkit/line-break.ts","kind":"import-statement","original":"./line-break.js"}],"format":"esm"},"gen/webkit/pack-complex.ts":{"bytes":160,"imports":[{"path":"gen/webkit/packs.ts","kind":"import-statement","original":"./packs.js"},{"path":"gen/webkit/line-break.complex.ts","kind":"import-statement","original":"./line-break.complex.js"}],"format":"esm"},"gen/webkit/line-breaks.scripts.ts":{"bytes":2555,"imports":[{"path":"./generated/engine-break-data.js","kind":"import-statement","external":true},{"path":"gen/webkit/line-breaks.ts","kind":"import-statement","original":"./line-breaks.js"}],"format":"esm"},"gen/webkit/measurement.scripts.ts":{"bytes":6021,"imports":[{"path":"./graphemes.js","kind":"import-statement","external":true},{"path":"./line-breaks.js","kind":"import-statement","external":true},{"path":"./generated/webkit-generic-families.js","kind":"import-statement","external":true},{"path":"gen/webkit/measurement.ts","kind":"import-statement","original":"./measurement.js"}],"format":"esm"},"gen/webkit/prepare.scripts.ts":{"bytes":4284,"imports":[{"path":"./han-kerning.js","kind":"import-statement","external":true},{"path":"./graphemes.js","kind":"import-statement","external":true},{"path":"./generated/engine-break-data.js","kind":"import-statement","external":true},{"path":"./line-breaks.js","kind":"import-statement","external":true},{"path":"gen/webkit/analysis.ts","kind":"import-statement","original":"./analysis.js"},{"path":"gen/webkit/measurement.ts","kind":"import-statement","original":"./measurement.js"},{"path":"./prepare.js","kind":"import-statement","external":true}],"format":"esm"},"gen/webkit/generated/engine-break-data.full.ts":{"bytes":23705,"imports":[],"format":"esm"},"gen/webkit/pack-scripts.ts":{"bytes":782,"imports":[{"path":"gen/webkit/packs.ts","kind":"import-statement","original":"./packs.js"},{"path":"gen/webkit/line-breaks.scripts.ts","kind":"import-statement","original":"./line-breaks.scripts.js"},{"path":"gen/webkit/measurement.scripts.ts","kind":"import-statement","original":"./measurement.scripts.js"},{"path":"gen/webkit/prepare.scripts.ts","kind":"import-statement","original":"./prepare.scripts.js"},{"path":"gen/webkit/generated/engine-break-data.full.ts","kind":"import-statement","original":"./generated/engine-break-data.full.js"},{"path":"gen/webkit/generated/engine-break-data.ts","kind":"import-statement","original":"./generated/engine-break-data.js"},{"path":"gen/webkit/line-breaks.ts","kind":"import-statement","original":"./line-breaks.js"},{"path":"gen/webkit/graphemes.ts","kind":"import-statement","original":"./graphemes.js"},{"path":"gen/webkit/prepare.ts","kind":"import-statement","original":"./prepare.js"},{"path":"gen/webkit/gecko-line-breaks.ts","kind":"import-statement","original":"./gecko-line-breaks.js"}],"format":"esm"},"gen/webkit/line-break.spacing.ts":{"bytes":2650,"imports":[{"path":"gen/webkit/analysis.ts","kind":"import-statement","original":"./analysis.js"},{"path":"./measurement.js","kind":"import-statement","external":true},{"path":"gen/webkit/line-break.ts","kind":"import-statement","original":"./line-break.js"}],"format":"esm"},"gen/webkit/measurement.spacing.ts":{"bytes":3311,"imports":[{"path":"gen/webkit/graphemes.ts","kind":"import-statement","original":"./graphemes.js"},{"path":"./line-breaks.js","kind":"import-statement","external":true},{"path":"./generated/webkit-generic-families.js","kind":"import-statement","external":true},{"path":"gen/webkit/measurement.ts","kind":"import-statement","original":"./measurement.js"}],"format":"esm"},"gen/webkit/prepare.spacing.ts":{"bytes":2757,"imports":[{"path":"./han-kerning.js","kind":"import-statement","external":true},{"path":"gen/webkit/graphemes.ts","kind":"import-statement","original":"./graphemes.js"},{"path":"./generated/engine-break-data.js","kind":"import-statement","external":true},{"path":"./line-breaks.js","kind":"import-statement","external":true},{"path":"./analysis.js","kind":"import-statement","external":true},{"path":"./measurement.js","kind":"import-statement","external":true},{"path":"gen/webkit/prepare.ts","kind":"import-statement","original":"./prepare.js"}],"format":"esm"},"gen/webkit/pack-spacing.ts":{"bytes":258,"imports":[{"path":"gen/webkit/packs.ts","kind":"import-statement","original":"./packs.js"},{"path":"gen/webkit/line-break.spacing.ts","kind":"import-statement","original":"./line-break.spacing.js"},{"path":"gen/webkit/measurement.spacing.ts","kind":"import-statement","original":"./measurement.spacing.js"},{"path":"gen/webkit/prepare.spacing.ts","kind":"import-statement","original":"./prepare.spacing.js"}],"format":"esm"},"gen/webkit/generated/webkit-generic-families.ts":{"bytes":5190,"imports":[],"format":"esm"},"gen/webkit/measurement.families.ts":{"bytes":3615,"imports":[{"path":"./graphemes.js","kind":"import-statement","external":true},{"path":"./line-breaks.js","kind":"import-statement","external":true},{"path":"gen/webkit/generated/webkit-generic-families.ts","kind":"import-statement","original":"./generated/webkit-generic-families.js"},{"path":"./measurement.js","kind":"import-statement","external":true}],"format":"esm"},"gen/webkit/pack-families.ts":{"bytes":163,"imports":[{"path":"gen/webkit/packs.ts","kind":"import-statement","original":"./packs.js"},{"path":"gen/webkit/measurement.families.ts","kind":"import-statement","original":"./measurement.families.js"}],"format":"esm"},"gen/webkit/pack-rare.ts":{"bytes":57,"imports":[],"format":"esm"},"src/exact.ts":{"bytes":5060,"imports":[{"path":"gen/webkit/layout.ts","kind":"import-statement","original":"@engine/layout.js"},{"path":"gen/webkit/packs.ts","kind":"import-statement","original":"@engine/packs.js"},{"path":"src/alphabet.ts","kind":"import-statement","original":"./alphabet.js"},{"path":"gen/webkit/pack-complex.ts","kind":"dynamic-import","original":"@engine/pack-complex.js"},{"path":"gen/webkit/pack-scripts.ts","kind":"dynamic-import","original":"@engine/pack-scripts.js"},{"path":"gen/webkit/pack-spacing.ts","kind":"dynamic-import","original":"@engine/pack-spacing.js"},{"path":"gen/webkit/pack-families.ts","kind":"dynamic-import","original":"@engine/pack-families.js"},{"path":"gen/webkit/pack-rare.ts","kind":"dynamic-import","original":"@engine/pack-rare.js"},{"path":"<runtime>","kind":"import-statement","external":true}],"format":"esm"},"src/engine.ts":{"bytes":5213,"imports":[{"path":"src/alphabet.ts","kind":"import-statement","original":"./alphabet.js"},{"path":"src/lite.ts","kind":"import-statement","original":"./lite.js"},{"path":"src/exact.ts","kind":"dynamic-import","original":"./exact.js"},{"path":"<runtime>","kind":"import-statement","external":true}],"format":"esm"}},"outputs":{"dist/webkit/engine.js":{"imports":[{"path":"dist/webkit/chunk-M5EVTPT6.js","kind":"import-statement"},{"path":"dist/webkit/chunk-JQWGQSV3.js","kind":"import-statement"},{"path":"dist/webkit/chunk-FEELTLSH.js","kind":"import-statement"},{"path":"dist/webkit/exact-NKXB5V2W.js","kind":"dynamic-import"}],"exports":["engine"],"entryPoint":"src/engine.ts","inputs":{"src/lite.ts":{"bytesInOutput":3083},"src/engine.ts":{"bytesInOutput":2164}},"bytes":5396},"dist/webkit/pack-complex-ZCMCV5WM.js":{"imports":[{"path":"dist/webkit/chunk-SCKMN2PN.js","kind":"import-statement"},{"path":"dist/webkit/chunk-A4DB6TWP.js","kind":"import-statement"},{"path":"dist/webkit/chunk-JQWGQSV3.js","kind":"import-statement"},{"path":"dist/webkit/chunk-FEELTLSH.js","kind":"import-statement"}],"exports":[],"entryPoint":"gen/webkit/pack-complex.ts","inputs":{"gen/webkit/line-break.complex.ts":{"bytesInOutput":4992},"gen/webkit/pack-complex.ts":{"bytesInOutput":21}},"bytes":5320},"dist/webkit/pack-scripts-WIXSLWBC.js":{"imports":[{"path":"dist/webkit/chunk-B3WIVP7S.js","kind":"import-statement"},{"path":"dist/webkit/chunk-A4DB6TWP.js","kind":"import-statement"},{"path":"dist/webkit/chunk-JQWGQSV3.js","kind":"import-statement"},{"path":"dist/webkit/chunk-FEELTLSH.js","kind":"import-statement"}],"exports":[],"entryPoint":"gen/webkit/pack-scripts.ts","inputs":{"gen/webkit/line-breaks.scripts.ts":{"bytesInOutput":381},"gen/webkit/measurement.scripts.ts":{"bytesInOutput":1942},"gen/webkit/prepare.scripts.ts":{"bytesInOutput":818},"gen/webkit/generated/engine-break-data.full.ts":{"bytesInOutput":23193},"gen/webkit/pack-scripts.ts":{"bytesInOutput":44}},"bytes":26658},"dist/webkit/pack-spacing-UGCQZTVO.js":{"imports":[{"path":"dist/webkit/chunk-SCKMN2PN.js","kind":"import-statement"},{"path":"dist/webkit/chunk-B3WIVP7S.js","kind":"import-statement"},{"path":"dist/webkit/chunk-A4DB6TWP.js","kind":"import-statement"},{"path":"dist/webkit/chunk-JQWGQSV3.js","kind":"import-statement"},{"path":"dist/webkit/chunk-FEELTLSH.js","kind":"import-statement"}],"exports":[],"entryPoint":"gen/webkit/pack-spacing.ts","inputs":{"gen/webkit/line-break.spacing.ts":{"bytesInOutput":400},"gen/webkit/measurement.spacing.ts":{"bytesInOutput":558},"gen/webkit/prepare.spacing.ts":{"bytesInOutput":249},"gen/webkit/pack-spacing.ts":{"bytesInOutput":23}},"bytes":1524},"dist/webkit/pack-families-KIE64YFZ.js":{"imports":[{"path":"dist/webkit/chunk-FEELTLSH.js","kind":"import-statement"}],"exports":[],"entryPoint":"gen/webkit/pack-families.ts","inputs":{"gen/webkit/measurement.families.ts":{"bytesInOutput":913},"gen/webkit/generated/webkit-generic-families.ts":{"bytesInOutput":3389},"gen/webkit/pack-families.ts":{"bytesInOutput":19}},"bytes":4369},"dist/webkit/pack-rare-SSJ2B7KP.js":{"imports":[],"exports":[],"entryPoint":"gen/webkit/pack-rare.ts","inputs":{"gen/webkit/pack-rare.ts":{"bytesInOutput":0}},"bytes":0},"dist/webkit/exact-NKXB5V2W.js":{"imports":[{"path":"dist/webkit/chunk-M5EVTPT6.js","kind":"import-statement"},{"path":"dist/webkit/chunk-SCKMN2PN.js","kind":"import-statement"},{"path":"dist/webkit/chunk-B3WIVP7S.js","kind":"import-statement"},{"path":"dist/webkit/chunk-A4DB6TWP.js","kind":"import-statement"},{"path":"dist/webkit/chunk-JQWGQSV3.js","kind":"import-statement"},{"path":"dist/webkit/chunk-FEELTLSH.js","kind":"import-statement"},{"path":"dist/webkit/pack-complex-ZCMCV5WM.js","kind":"dynamic-import"},{"path":"dist/webkit/pack-scripts-WIXSLWBC.js","kind":"dynamic-import"},{"path":"dist/webkit/pack-spacing-UGCQZTVO.js","kind":"dynamic-import"},{"path":"dist/webkit/pack-families-KIE64YFZ.js","kind":"dynamic-import"},{"path":"dist/webkit/pack-rare-SSJ2B7KP.js","kind":"dynamic-import"}],"exports":["exact"],"entryPoint":"src/exact.ts","inputs":{"gen/webkit/line-text.ts":{"bytesInOutput":663},"gen/webkit/layout.ts":{"bytesInOutput":893},"src/exact.ts":{"bytesInOutput":1987}},"bytes":3911},"dist/webkit/chunk-M5EVTPT6.js":{"imports":[],"exports":["a"],"inputs":{"src/alphabet.json":{"bytesInOutput":243},"src/alphabet.ts":{"bytesInOutput":447}},"bytes":706},"dist/webkit/chunk-SCKMN2PN.js":{"imports":[{"path":"dist/webkit/chunk-A4DB6TWP.js","kind":"import-statement"},{"path":"dist/webkit/chunk-FEELTLSH.js","kind":"import-statement"}],"exports":["a","b","c","d","e","f","g","h","i","j"],"inputs":{"gen/webkit/line-break.ts":{"bytesInOutput":3489}},"bytes":3711},"dist/webkit/chunk-B3WIVP7S.js":{"imports":[{"path":"dist/webkit/chunk-A4DB6TWP.js","kind":"import-statement"},{"path":"dist/webkit/chunk-JQWGQSV3.js","kind":"import-statement"},{"path":"dist/webkit/chunk-FEELTLSH.js","kind":"import-statement"}],"exports":["a","b","c","d","e","f"],"inputs":{"gen/webkit/prepare.ts":{"bytesInOutput":5485}},"bytes":5921},"dist/webkit/chunk-A4DB6TWP.js":{"imports":[{"path":"dist/webkit/chunk-JQWGQSV3.js","kind":"import-statement"},{"path":"dist/webkit/chunk-FEELTLSH.js","kind":"import-statement"}],"exports":["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"],"inputs":{"gen/webkit/graphemes.ts":{"bytesInOutput":890},"gen/webkit/gecko-line-breaks.ts":{"bytesInOutput":1003},"gen/webkit/analysis.ts":{"bytesInOutput":3980},"gen/webkit/measurement.ts":{"bytesInOutput":7765}},"bytes":14221},"dist/webkit/chunk-JQWGQSV3.js":{"imports":[{"path":"dist/webkit/chunk-FEELTLSH.js","kind":"import-statement"}],"exports":["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x"],"inputs":{"gen/webkit/generated/engine-break-data.ts":{"bytesInOutput":8513},"gen/webkit/line-breaks.ts":{"bytesInOutput":7980}},"bytes":16741},"dist/webkit/chunk-FEELTLSH.js":{"imports":[],"exports":["a","b","c","d","e"],"inputs":{"gen/webkit/packs.ts":{"bytesInOutput":162}},"bytes":432}}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as e,b as l,d as n,e as t,f as i,h as a}from"./chunk-SCKMN2PN.js";import{M as r,d as s,e as u,f as o,g as f,h as d,i as m,j as h,k as c,l as p,m as b,n as g,o as x,p as k,q as v}from"./chunk-A4DB6TWP.js";import"./chunk-JQWGQSV3.js";import{a as y,c as M}from"./chunk-FEELTLSH.js";var E={};function j(e,l,n,t){let i=n+1;for(;i<l&&1<<(e[i]&g)&t;)i++;return i===l||(e[i]&g)!==m}function I(e,l,n,t,i,a){let{discretionaryHyphenContexts:r,segmentFlags:s}=e,u=n-1;if(u<l||(s[u]&g)!==f||t<=i)return!1;let o=t-i,d=0,m=a?u:u-1;if(null!==r)for(let e=l;e<=m;e++)d+=r[e];return d<o}function S(y,M,E,S,L,H=!1){let{widths:W,segmentFlags:A,breakableFitAdvances:C,discretionaryHyphenWidth:F,letterSpacing:T,lineStartExtras:O,lineEndTrims:w,overflowLineEndTrims:P,tabStopAdvance:N,minimumTabAdvance:Q}=y,R=W.length,q=y.items,B=void 0===q?null:q.hyphenWidths,D=void 0===q?null:q.hyphenRooms,G=void 0===q?null:q.itemEndHalts,J=void 0===q?null:q.insideExtras,K=void 0===q?null:q.fillExtras,U=void 0===q?null:q.openingEdges,V=void 0===q?null:q.emptyObjectSpaces,z=void 0===q?null:q.emptyObjectReturns,X=(r(),1<<d|1<<m),Y=void 0!==q&&!1,Z=!1,$=Math.max(0,E),_=$+.015625,ee=null!==y.discretionaryHyphenContexts,le=ee&&!0,ne=null;for(;;){let r=M.segmentIndex,E=M.graphemeIndex,te=0,ie=!1,ae=r,re=E,se=-1,ue=0,oe=-1,fe=0,de=-1,me=0,he=!1,ce=0,pe=0,be=!0,ge=!1,xe=-1,ke=0,ve=0,ye=!1,Me=null;if((A[r]&g)===p)M.segmentIndex=r+1,M.graphemeIndex=0,Me=null===O?0:O[r];else{e:{let i;for(let a=r;;a++){if(a>=R){i=R;break}let M,I=0,S=A[a],L=S&g;if(L===p){i=a+1;break}let H=0!==(S&x),ne=!!(1<<L&e),Me=a===r?E:0,Ee=0===T||!ie||be||ge?0:T,je=0;0!==T&&(H||L===c||L===m||L===b||null!==U&&0!==U[a])&&(je=Ee,ge=!H),L!==o&&L!==h&&(be=!1);let Ie=L!==m?W[a]:void 0===q?n(te+je,N,Q,Z):t(y,q,a,ie?te+je:null===O?0:O[a],Z),Se=je+Ie,Le=null===w?0:w[a];if(L===f&&0===Me){if(ie){let e=F,l=!0;void 0!==q&&(ee&&a>r&&(A[a-1]&g)===b&&(oe=a,fe=te),Y&&de===a&&(de=a+1,me=Math.max(me,Math.min(te,$))),null!==B&&(e=B[a]),l=a+1===R||(A[a+1]&g)!==b||null!==U&&0!==U[a+1]),ae=a+1,re=0,a+1<R&&(A[a+1]&g)!==p&&(se=a+1,ue=te+e,ee&&((l?ue:te)<=_||le&&oe<0)&&(oe=se,fe=ue))}continue}let He=0;if(0===T||H||ne||L===c){if(ne?L===m:0!==Ie||L===c){let e=Ie+(H?T:0);0!==e&&(He=je+e)}}else He=Ee+Ie;let We=!!(1<<L&X);if(Y&&L===o&&de===a&&(We=!0),We&&(de!==a&&(me=te-pe+je,he=!1,void 0!==q&&a>r&&(A[a-1]&g)===b&&(he=j(A,R,a,X),he||(se=a,ue=te-pe)),ce=0),de=a+1,null!==U&&(me+=U[a],ce+=U[a])),ie){let e=We?me-ce:te+He,n=e-Le>_;if(void 0!==q){let l=!1;if(null!==V&&L===b&&0===Ie&&e>_){let e=de===a?me:te,n=V[a];l=e<=_||!(n>=0&&e-n>_||1===z[a])}n=(n||He<0&&te-pe>_)&&!(We&&he)&&!l,Y&&!n&&de===a&&L===b&&0===Ie&&(de=a+1,me=Math.max(me,Math.min(te+Se,$)))}if(!n){0!==(S&v)&&!ne&&se!==a&&(se=a,ue=te),ee&&!ne&&0===(S&k)&&a>r&&!l(A[a-1]&g)&&(oe=a,fe=te),ae=a+1,re=0,null!==G&&e>_&&0!==G[a]?(te+=Se-Le,pe=0):(te+=Se,0!==He&&!We&&(pe=e>_&&L!==b?Le:0)),ne&&(a+1===R||0===(A[a+1]&k))&&(se=a+1,ue=We?me:L===m?te:te-Se-pe),ee&&ne&&ue+(null===D||se<0?0:D[se])<=_&&(oe=se,fe=ue);continue}{let l=te-pe;if(ne&&(We||L!==m)&&(l<=_||se<0&&(L===u||L===o)||L===o&&(A[a-1]&g)===b)){ve=We?me:l,te+=Se,xe=a+1,ke=0;break e}if(L===m&&!We&&se<0){xe=a,ke=0,ve=de===a&&a>r?me:l;break e}let n=0!==(S&k);if(L===b&&n&&de===a&&me-ce+Ie-Le<=_){de=a+1,me+=Ie,ce+=Ie,te+=Se,ae=a+1,re=0;continue}if(n&&se>=0&&(ae=se,re=0),!n||se>=0){ye=!0;break e}if(null!==P&&e-P[a]<=_){te+=Se,ae=a+1,re=0,pe=P[a],null!==G&&0!==G[a]&&(te-=pe,pe=0);continue}if(L===b&&a+1<R&&(A[a+1]&g)===p){let e=A[a-1],l=e&g,n=l===d?C[a-1]:null;if(null!==n){let e=n.length,l=n[0],t=te<=_?1:l>0?Math.min(e,Math.ceil((te-_)/l)):e;if(a-1>(null!==U&&0!==U[r]?r+1:r)||e-t>E){xe=a-1,ke=e-t,ve=me;break e}}let t=l===s||l===c?C[a-1]:null,i=0!==(e&x)?T:0;if(null!==t&&(a-1>r||t.length-1>E)){xe=a-1,ke=t.length-1,ve=te-t[ke]-i;break e}if(null===t&&(l===s||l===c)&&a-1>r){xe=a-1,ke=0,ve=te-W[a-1]-i;break e}if(null!==n||l!==d&&l!==m){te+=Se,ae=a+1,re=0,pe=0;continue}}if(null===C[a]){ye=!0;break e}M=0,I=je}}else if(Me>0)M=Me;else{let e=null===O?0:O[a],l=null!==P&&He+e-P[a]<=_?P[a]:Le;if(!(He+e-l>_&&null!==C[a])||We){ie=!0,ae=a+1,re=0,te=Ie+e,We&&(me+=e),pe=He+e>_&&L!==b?l:0,null!==G&&0!==pe&&0!==G[a]&&(te-=pe,pe=0),ne&&(a+1===R||0===(A[a+1]&k))&&(se=a+1,ue=We?me:L===m?te:te-Se),ee&&ne&&ue+(null===D||se<0?0:D[se])<=_&&(oe=se,fe=ue);continue}M=0}let Ae=C[a],Ce=Ae.length;for(let e=M;e<Ce;e++){let l=Ae[e];if(ie){let n=te+(l+(e>M?T:I));if(n+T>_)break e;te=n,ae=a,re=e+1}else{ie=!0,ae=a,re=e+1;let n=y.breakableLineStartExtras?.[a]??null;te=null===n?l:l+n[e],(e>0?null!==J:null!==K)&&(te+=e>0?J[a]:K[a])}}ie&&ae===a&&re===Ce&&(ae=a+1,re=0)}xe=i,ke=0,se===i&&0===re?(ve=ue,ye=!0):ve=te-pe}if(ie){ye&&oe>=0&&se===ae&&0===re&&I(y,r,ae,ue,_,!1)?(xe=oe,ke=0,ve=fe):xe<0&&(xe=ae,ke=re,ve=se===ae&&0===re?ue:void 0!==q&&de===ae&&0===re?me:te-pe),M.segmentIndex=xe,M.graphemeIndex=ke;let e=0===ke&&de>=0&&(xe===de||xe===de+1)&&(de===R||(A[de]&g)===p),l=(e?te-pe:ve)+i(y,U,X,r,E,xe,ke);Me=e?Math.max(me,Math.min(l,$)):l}}if(null===Me||(ne=Me,null!==L&&(L.lineCount++,Me>L.maxLineWidth&&(L.maxLineWidth=Me)),S?.(Me,r,E,M.segmentIndex,M.graphemeIndex),H||!a(y,M)))break}return ne}y(E,{returnsFromUnfitHyphen(){return I},staysAfterObject(){return j},walkPreparedComplexLines(){return S}}),Object.assign(M,E);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a,c as n}from"./chunk-FEELTLSH.js";var r={};a(r,{familyProbeText(){return h},getWebKitGenericFamilies(){return l},hasFamily(){return s}});var e=" 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 ",i=" 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 ",o=["","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"],t={"":[0,0,0,1,2],am:[3,3,3,3,2],ar:[4,4,4,4,2],bg:[0,0,5,5,2],bn:[6,6,6,6,2],bo:[7,8,7,7,2],chr:[9,9,9,9,2],ckb:[4,4,4,4,2],fa:[4,4,4,4,2],fil:[10,10,10,10,2],gu:[11,11,11,11,2],he:[0,12,13,0,14],hi:[15,16,16,16,2],hy:[17,17,17,17,2],iu:[18,18,18,18,2],ja:[19,20,19,19,2],ka:[21,0,21,21,2],km:[22,23,22,22,2],kn:[24,25,24,24,2],ko:[26,27,26,26,2],ks:[28,28,28,28,2],lo:[29,30,29,29,2],lrc:[4,4,4,4,2],ml:[31,32,31,31,2],my:[33,34,33,33,2],mzn:[4,4,4,4,2],or:[35,36,35,35,2],pa:[37,37,37,37,2],ps:[4,4,4,4,2],ro:[0,0,5,5,2],ru:[0,0,5,5,2],sd:[4,4,4,4,2],si:[38,39,38,38,2],sr:[0,0,5,5,2],ta:[40,40,40,40,2],te:[41,41,41,41,2],th:[42,42,42,42,2],tr:[0,0,5,5,2],ug:[4,4,4,4,2],uk:[0,0,5,5,2],ur:[28,28,28,28,2],yi:[0,12,13,0,14],yue:[43,44,43,43,2],zh:[45,46,45,45,2],"kk-arab":[4,4,4,4,2],"ks-arab":[4,4,4,4,2],"ks-deva":[0,0,0,1,2],"ms-arab":[4,4,4,4,2],"pa-arab":[4,4,4,4,2],"sd-deva":[0,0,0,1,2],"ur-arab":[4,4,4,4,2],"uz-arab":[4,4,4,4,2],"yue-hans":[45,46,45,45,2],"zh-hant":[47,48,47,47,2],"zh-hk":[43,44,43,43,2],"zh-mo":[49,50,49,49,2],"zh-tw":[47,48,47,47,2],"pa-aran-pk":[28,28,28,28,2],"yue-hant-mo":[49,50,49,49,2],"zh-hant-hk":[43,44,43,43,2],"zh-hant-mo":[49,50,49,49,2]};function l(a,n){let r=a.toLowerCase().replaceAll("_","-"),l=null;for(let a=r;null===l;)if(e.includes(` ${a} `))l="zh"===a;else{let n=a.lastIndexOf("-");if(n<0||a.endsWith("-zyyy"))return null;i.includes(` ${a.slice(n+1)} `)&&(l=a.endsWith("-hani")),a=a.slice(0,n)}l&&(r="zh-hans");let h=t[r];for(;void 0===h;)r=r.slice(0,Math.max(0,r.lastIndexOf("-"))),h=t[r];let g=[];for(let a=0;a<h.length;a++){let r=h.indexOf(h[a]);if(r<a){g.push(g[r]);continue}let e=o[h[a]],i=e.indexOf("|"),t=i<0?e:s(n,e.slice(0,i))?e.slice(0,i):e.slice(i+1);g.push(""===t?"":`"${t}"`)}return g}var h="Hamburg 한中 नम សួ ನಮ ສະ നമ မင ନମ ආය བཀ";function s(a,n){for(let r of["monospace","serif"]){a.font=`16px ${r}`;let e=a.measureText(h).width;if(a.font=`16px "${n}", ${r}`,a.measureText(h).width!==e)return!0}return!1}Object.assign(n,r);
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{f as A}from"./chunk-B3WIVP7S.js";import{B as Q,E as B,H as C,K as E,T as g,b as R,c as w,d as I,e as P,l as q,n as O,p as H,v as d,w as G}from"./chunk-A4DB6TWP.js";import{b as s,r as D,v as t,x as a}from"./chunk-JQWGQSV3.js";import{a as e,c}from"./chunk-FEELTLSH.js";var M={};function n(A,Q,B,C,E){let g=-1;for(let R=B;R<=C;){let B=!1,w=1;if(R<C){let C=Q.charCodeAt(R);55296==(64512&C)&&R+1<Q.length&&56320==(64512&Q.charCodeAt(R+1))&&(C=(C-55296<<10)+Q.charCodeAt(R+1)-56320+65536,w=2),B=t(A,C)}if(B)g<0&&(g=R);else if(g>=0){if(R-g>1)for(let A of D().segment(Q.slice(g,R)))A.index>0&&(E[g+A.index]=1);g=-1}R+=w}}e(M,{markDictionaryWords(){return n}});var r={};e(r,{KANA_COUNT(){return o},KANA_PROBE(){return F},getFontKanaKerning(){return l},getKanaKerning(){return L},getWholeRunContext(){return h},measureKanaKerning(){return k},sameInk(){return Y}});var o=191,F="プダグタノムブイメえずぺ";function h(A){let Q=A.state;return null===Q.wholeRunContext&&(Q.wholeRunContext=g(Q.language),Q.wholeRunContext.textRendering="optimizeLegibility"),Q.wholeRunFont!==A.kanaFont&&(Q.wholeRunContext.font=Q.wholeRunFont=A.kanaFont),Q.wholeRunContext}function Y(A,Q){let B=A.width/4194304;return Math.abs(A.width-Q.width)<=B&&Math.abs(A.actualBoundingBoxLeft-Q.actualBoundingBoxLeft)<=B&&Math.abs(A.actualBoundingBoxRight-Q.actualBoundingBoxRight)<=B}function l(A){if(void 0===A.kanaKerning){A.kanaKerning=null;let Q=A.canvasFont,B=d.exec(Q),C=null===B?0:B.index+B[0].length,E=null===B?null:Q.slice(C).match(G),g=null===E?1:E.length,R=null;for(let B=0;B<g;B++){let g=0===B?Q:Q.slice(0,C)+E.slice(B).join(",");A.kanaFont=g;let w=h(A),I=w.measureText(F).width;w.fontKerning="none";let P=w.measureText(F);if(w.fontKerning="auto",null===R)R=P;else if(!Y(R,P))break;if(I!==P.width){if(B>0){let B="";for(let A=12353;A<=12438;A++)B+=String.fromCharCode(A,12290);let C=w.measureText(B).width;A.kanaFont=Q;let E=h(A),R=E.measureText(B).width;E.fontKerning="none";let I=E.measureText(B).width;if(E.fontKerning="auto",R===I||Math.abs(C-R)>R/4194304)break;A.kanaFont=g}A.kanaKerning=new Float64Array(o*o).fill(NaN);break}}null===A.kanaKerning&&(A.kanaFont=Q)}return A.kanaKerning}function L(A,Q,B,E,g){let R=A.charCodeAt(B);if(R<12353||R>12543)return 0;let w=A.charCodeAt(B-1);if(w<12353||w>12543)return 0;if(B>Q){if(!C(R))return 0;let E=B-1,g=w;for(;g>=12353&&g<=12543&&!C(g);){if(E===Q)return 0;g=A.charCodeAt(--E)}if(g>=11904&&!C(g))return 0}let I=(w-12353)*o+R-12353,P=g[I];return Number.isNaN(P)?g[I]=k(A.slice(B-1,B+1),E):P}function k(A,Q){let C=h(Q).measureText(A).width,E=C-B(A[0],Q).width-B(A[1],Q).width;return Math.abs(E)<=C/4194304?0:E}var i={};function U(A,B,C,g,R,w,P,q){let{normalized:H,starts:d,flags:G}=g;for(let g=R;g<w;g++){if((G[g]&O)!==I)continue;let s=d[g],D=g+1<G.length?d[g+1]:H.length,t=C+g-R;for(let C=g>R?s:s+1;C<D;C++){let I=E(H,s,C,P,q);0!==I&&(C>s?B[t]=B[t]+I:I>0?B[t-1]=B[t-1]+I:(B[t]=B[t]+I,A??(A=Q(w-R)),A[g-R]=A[g-R]-I))}}return A}function u(A,C,E,g,R,w,d){let{normalized:G,starts:s,flags:D}=C;for(let C=w;C<d;C++){let t=C+1<D.length?s[C+1]:G.length;if((D[C]&O)!==I||12288!==G.charCodeAt(t-1))continue;if(C+1<d){let A=D[C+1]&O;if(A!==q&&A!==P&&(A!==I||0!==(D[C+1]&H)))continue}let a=t-1;for(;a>s[C]&&12288===G.charCodeAt(a-1);)a--;let e=G.slice(a,t),c=C>0&&a===s[C]&&173===G.charCodeAt(a-1),M=B(e,E).width+e.length*g-(c?R:0);M<=0||(A??(A=Q(d-w)),A[C-w]=A[C-w]+M)}return A}e(i,{addIdeographicSpaceHangs(){return u},addKanaKerning(){return U}});var K={};e(K,{appleQuoteRemaps(){return z},blinkLinePairsPacked(){return f},classMaps(){return p},classRemapsPacked(){return J},classRunsVarints(){return m},geckoLineBreakStatesPacked(){return V},geckoLineEotProperty(){return j},geckoLineLastCodepointProperty(){return X},geckoLinePropertyCount(){return N},jointClassCount(){return x},ruleTables(){return S},scriptClassFacts(){return b},webkitLinePairsPacked(){return T}});var p={"apple/line_normal":[0,183],"apple/line":[1,183],"apple/line_cj":[2,183],"apple/char":[3,149],"chromium/script":[4,80]},x=181,m="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ARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQCOARqPAQsdFlIDHTBT80AdD5ABAZEBAR0VkAEEHQCQAQArEpEBAoQBAIIBAIYBAJIBAIYBAJEBAIIBAJMBAIkBAIQBAIIBFYYBKB3/A4IBBhEVHQAuACwJLgAdDC4AHQQuAB0ALgAdAS4AHQEuAB0JLu0DMQCUAQCVAY8BMR8dCzEAMgIxDyEClgEBlwEBmAEAmQEAlgEAmgEFHQAkACEAJAAhACQAIQEkACEAJAAhACQAIQAkAJsBACgEhQEAmQEAlgEAmQEAlgEAmQEAlgEAmQEAlgEAmQEAlgEAmQEAlgEAmQEAlgEAmQEAlgEBggEAmQEAlgEGhQEAlgEAhQEAlgEAHQGXAQGYAQCFAQB0AHUAdAB1AHQAdQeFAQAdAIUBAHIAnAEAhQEDHQQxAB2GATEBHQBvAB0AmAEBhQEAcgCcAQGFAQB0AHUBhQEAlgEAhQEAlgEKhQEBlwEChQEAmAEAhQEZnQEAdACFAQCeAQKFARmdAQB0AIUBAJ4BAIUBAHQAdQCEAQCHAQCIAQCEAQCGAQCCAQmMASyCAQGfAR6CAQIdBYIBAR0FggEBHQWCAQEdAoIBAh0AnAEAcgKFAQFyAB0GewAdCHECAACgAQAIgQIdAkE8HU4m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dgEICXYSCDexARmyAQCCAQFzDLEBCYUBAHMThQEAcwGFAQhzAIUBA7EBCIUBBrEBAXMNsQEFhQGZAbEBIHMAdwF5CHcIcwB3RXMAdwZzAHwNcwF5AXcAeQJ3AQgBdxRzAXYEcwB2BHMCfAFzAHwBcwB8AXoBdwRzC3cQcwF5AHcAcwB3AHkAdwJzBLMBPnMAdwBzAHcBfAFzCnwUcxJ8AnMAfANzAnwAcwJ8BnMAfABzAHwNcwB2AHMAdgBzAHYEcwB8A3MAdgBzAXZJcwB3AHkAcwZ2D3MNdgxzC3YKCAAXAHcDcwB5F3MGeQF3AXkAdwF6A3cAfAt5AHcBeQN3AXkAegN5AXwMeQBzAHcBeQB3B3kBdwh5AHcEeQJ3C3kCdwcIAncBeQB3AHkAdwN5AHcFeQB3AnkAdwUIAHdJcwJ8AnMEfCUIAgcCbAMIInMAfA9zAnwIcwB8BHMEeQB3AHwCdwJzAXkDcwKxAQNzBXcCeQB3AHkBcwKxAQB3AXkAdwhzArEBcwgCeQMIBHlUCAR5BbEBC3MDsQEAcw6xAQsIA7QBNwgHtAEJCAW0AScIB7QBHQgBtAELCAO0AQEIDbQBCAgmtAELCAB8AXMAfAdzB3wFcwB8CHMJfABzAHkCfAZzAHkvcwB8PHMBfABzAXwAcwB8EHMCfABzDHwhc1cIB7EBDXkBsQEMcwKxAQpzArEBNHMCfABzALEBAHMDsQEPcwGxAQtzA7EBAHMIfAaxAZIBCAAdWwgJEAAIBB39B7EBAR39/wOCAQEd/f8DggGBgCgdAHEAAB1xX68Bf3HvASGPHHH/3wsd",J="iQe1AQMEBQYHCAkKCwwNDg8QERITCw8EFBUOCxYXCxgLCwMDAwMDAxUVCwsDEBkMAwkaExMLDRAQAwkDCQsDEwsMAwsDBBMNFws/QD8VDhQEP0BAQBscHR4EBBcVHx8gISIjAwMXJAMlGSYWGCcVHh4UBCgLCykqKywtIi4iLy0wCRQUGQQqMSwqMissKyoDKgQzNAMtMTUUDiwyNis1FTcqLDI4JzkgFRMhOQ4UFQ4UCzoDAzs8PT6IAbUBATKLAbUBAg4USbUBBQMEAwUGDQEBBwITAQgDAT8GBggGBgYIBgYJCQYGBgYIBgMGBggGCQYKCwwGBgYGCQYICgYGBgoLBgoMDQ4PBgYGBgMGCwwGBggICgYDEBEGVA4DAwMGBwYGBwcGBgcGBwNmAAZzAxITEAaMAQADcxQGCAgJCwkGBgMDAw4ICAgHFAgHAAYBEQECAAAAAAMEAAQAAAAAAAUABO0FEAsKDg8PBwcHBwcHEAAQEBECAwQSEBAQAhUAAhsCExQFDgIQEQQbFxUADgALCwAAAAAAAwAAAg4AAAcAABYCBHYIFxgDDwcABwADPQEDAmUNEREAAAAAAA8AAwQHAAhjCAcHAA4HAAAH",b=[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],S={"apple/line_normal":[65,63,11,365,null,"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"],"apple/line":[65,63,11,365,"apple/line_normal",""],"apple/line_cj":[65,63,11,365,"apple/line_normal",""],"apple/char":[21,21,3,16,null,"AQASBgIAAgADAAQABQAEAAYABAAHAAQACAAJAAoABAAEAAkACgALAAABAAEAAAIAAQYCAAAGAAEKBAEEAQQDBAAEAAEECwUDBQMFAAwABQQAAQUAAAAAAAADAwsHAw0EBwAEBBAIAAkDCQAKAAUCEQkACgAGARIKAAcBFw4ACAEKBQAJBAsNAgcADQQNAAoCAQIVDwAAAQAC"]},f="",T="5DAIgAAACAAAAAQDBAYA/+v/+/8CAQF/DBwACAEADhwCCAAUAQQfgAlAFDgAGBwAGFQAJAEANHAAKDgACBwE/1cA/gTAAgAAKwQfgAnAAxAB/xg4AAwBAAiIAwAOHgAYmAIA5gEcADSkAwAoVAAkHAy8lv+5////7////2+kAsADAOoDHAEAWbgHAJ4GHAAVgAcBgBj0EwAakBQArgGYAgH/FgEBf/AFjAgAGAEBmALmBwEMEIwPAFAcALYBtAIAB4gYAYYFiBgBJwzcCgA0jAEAftACAQDbAfQFAMABcACWDRwA",z={"":[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:[]},N=0,X=0,j=0,V="";s(K),a(),R(),A(),w(),Object.assign(c,M,r,i);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{c as t}from"./chunk-SCKMN2PN.js";import{a as e,b as r,c as n,d as a}from"./chunk-B3WIVP7S.js";import{B as l,C as s,S as u,a as i,e as c,i as o,k as g,l as p,m as h,n as f,o as m,u as S}from"./chunk-A4DB6TWP.js";import"./chunk-JQWGQSV3.js";import{a as d,c as k}from"./chunk-FEELTLSH.js";var j={};function A(e,r,n,a,l,s,u){let{letterSpacing:i,segmentFlags:S}=e;if(0===i)return 0;if(u>0)return 0!==(S[s]&m)?i:0;let d=e.widths.length;if(t(S,d,s,u)||s>a&&s<d&&(S[s]&f)!==p&&1<<(S[s-1]&f)&n)return 0;for(let t=s-1;t>=a;t--){let e=S[t],n=e&f;if(n!==c&&(n===g||n===o||0!==(e&m)||n===h||null!==r&&0!==r[t]))return t===a&&l>0||0!==(e&m)?i:0}return 0}d(j,{getTerminalLetterSpacing(){return A}});var C={};d(C,{GLYPH_COUNT_SPACING(){return P},getExtraSpacings(){return v}});var P=2**20;function v(t,e){if(!e.state.takesLetterSpacing)return s;let r=new Int32Array(t.length),n=i("apple/char",t,0,t.length,r),a=n<=S,c=e.glyphCounts,o=null,g=s;try{let s=0;for(let i=0,p=0;i<n;p=r[i++]){let h=t.slice(a?0:p,r[i]),f=c.get(h);void 0===f&&(null===o&&(o=u(e),o.letterSpacing=`${P}px`),f=Math.round(o.measureText(h).width/P),c.set(h,f));let m=f-(a?s:0)-1;s=f,(0!==m||0!==g.length)&&(0===g.length&&(g=l(n)),g[i]=m)}}finally{null!==o&&(o.letterSpacing=e.letterSpacing)}return g}var y={};function L(t,l,s,u,c){let o=new Int32Array(s-l),g=i(u,t,l,s,o),p=null;for(let s=0,u=l;s<g;u=o[s++])(null===c?0!==(n(t.codePointAt(u))&r):a(c,t,u+1)===e&&160!==t.charCodeAt(u))&&(p??(p=[])).push(s);return p}d(y,{getUnspacedGraphemes(){return L}}),Object.assign(k,j,C,y);
|
package/package.json
CHANGED
|
@@ -1,6 +1,53 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@weft-js/text",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "weft's text: fonts for the build (subsets, matched fallbacks) and exact line breaking in the browser, on Pretext by Cheng Lou (@chenglou/pretext 1.0.0, MIT)",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"sideEffects": [
|
|
8
|
+
"./gen/*/pack-*.ts",
|
|
9
|
+
"./dist/**",
|
|
10
|
+
"./test/**"
|
|
11
|
+
],
|
|
12
|
+
"exports": {
|
|
13
|
+
".": {
|
|
14
|
+
"types": "./plugin/index.d.ts",
|
|
15
|
+
"default": "./plugin/index.mjs"
|
|
16
|
+
},
|
|
17
|
+
"./build": "./plugin/build.mjs",
|
|
18
|
+
"./measure": "./plugin/measure.mjs",
|
|
19
|
+
"./engine": "./dist/index.js"
|
|
20
|
+
},
|
|
21
|
+
"pretext": {
|
|
22
|
+
"version": "1.0.0",
|
|
23
|
+
"tarball": "https://registry.npmjs.org/@chenglou/pretext/-/pretext-1.0.0.tgz",
|
|
24
|
+
"sha256": "f1d9ac427846d40d3500854f4ff935272abe657d898e70ec75077065633c060a",
|
|
25
|
+
"integrity": "sha512-BxKiDMxWJhyzL8asvcgg3T9YnUU7OUFsKO8oRaR2SYAPX4Sh2wM9gqTBjrBaZ4fnl84cEQ8czC0Q1M83z3chsA=="
|
|
26
|
+
},
|
|
27
|
+
"dependencies": {
|
|
28
|
+
"@capsizecss/metrics": "4.4.0",
|
|
29
|
+
"@capsizecss/unpack": "4.0.1",
|
|
30
|
+
"@chenglou/pretext": "1.0.0",
|
|
31
|
+
"fontverter": "2.0.0",
|
|
32
|
+
"subset-font": "2.9.0"
|
|
33
|
+
},
|
|
34
|
+
"peerDependencies": {
|
|
35
|
+
"@weft-js/core": "^0.1.1"
|
|
36
|
+
},
|
|
37
|
+
"engines": {
|
|
38
|
+
"node": ">=26"
|
|
39
|
+
},
|
|
40
|
+
"keywords": [
|
|
41
|
+
"weft"
|
|
42
|
+
],
|
|
43
|
+
"files": [
|
|
44
|
+
"dist",
|
|
45
|
+
"plugin",
|
|
46
|
+
"vendor/pretext/LICENSE",
|
|
47
|
+
"README.md",
|
|
48
|
+
"LICENSE"
|
|
49
|
+
],
|
|
50
|
+
"publishConfig": {
|
|
51
|
+
"access": "public"
|
|
52
|
+
}
|
|
53
|
+
}
|
package/plugin/build.mjs
ADDED
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
// font.build@1 (research 11 §8.2, research 26 §3): subset each face per unicode-range (HarfBuzz via subset-font),
|
|
2
|
+
// generate a metric-matched "<Family> Fallback" face (Capsize's method: size-adjust from the average glyph width,
|
|
3
|
+
// then the vertical overrides divided by it), and list the preloads. Cached by content hash under `cacheDir`.
|
|
4
|
+
//
|
|
5
|
+
// Trimming (on in a build, off in dev, `trim: false` turns it off): font bytes are what set LCP on a text hero. Two
|
|
6
|
+
// cuts keep the design and every character. Custom axes (SOFT, WONK, GRAD…) the source never varies are pinned, and
|
|
7
|
+
// `latin` splits in two: a preloaded core (ASCII, common punctuation, what the source uses) and the rest, which a
|
|
8
|
+
// browser fetches through `unicode-range` only when a page holds one of those characters, so text from a database
|
|
9
|
+
// still gets the face.
|
|
10
|
+
import { createHash } from 'node:crypto'
|
|
11
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'
|
|
12
|
+
import { isAbsolute, join } from 'node:path'
|
|
13
|
+
import { brotliCompressSync } from 'node:zlib'
|
|
14
|
+
import { fromBuffer } from '@capsizecss/unpack'
|
|
15
|
+
import fontverter from 'fontverter'
|
|
16
|
+
import subsetFont from 'subset-font'
|
|
17
|
+
|
|
18
|
+
/** Google Fonts' subset ranges (the same tables @fontsource ships). */
|
|
19
|
+
export const RANGES = {
|
|
20
|
+
latin: 'U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD',
|
|
21
|
+
'latin-ext': 'U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF',
|
|
22
|
+
cyrillic: 'U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116',
|
|
23
|
+
'cyrillic-ext': 'U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F',
|
|
24
|
+
greek: 'U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF',
|
|
25
|
+
'greek-ext': 'U+1F00-1FFF',
|
|
26
|
+
vietnamese: 'U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB',
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/** Budgets (research 11 §8.4): preloaded bytes above the fold, and the generated CSS inlined in the head. */
|
|
30
|
+
export const BUDGET = { preloadBytes: 100 * 1024, cssBrotli: 1536 }
|
|
31
|
+
const VERSION = 2 // bump when the output for the same input changes
|
|
32
|
+
|
|
33
|
+
/** Every code point a `unicode-range` covers, as a string subset-font keeps. */
|
|
34
|
+
export function rangeText(range) {
|
|
35
|
+
let out = ''
|
|
36
|
+
for (const part of range.split(',')) {
|
|
37
|
+
const [a, b = a] = part.trim().replace(/^U\+/i, '').split('-').map(h => parseInt(h, 16))
|
|
38
|
+
for (let c = a; c <= b; c++) if ((c < 0xd800 || c > 0xdfff) && c !== 0) out += String.fromCodePoint(c)
|
|
39
|
+
}
|
|
40
|
+
return out
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** `latin`'s preloaded part before the source adds to it: ASCII, and the punctuation any prose uses. */
|
|
44
|
+
const CORE = 'U+0020-007E,U+00A0,U+00AD,U+2013-2014,U+2018-2019,U+201C-201D,U+2026'
|
|
45
|
+
/** CSS drives these through font-weight, font-stretch, font-style and font-optical-sizing: never pinned. */
|
|
46
|
+
const REGISTERED = new Set(['wght', 'wdth', 'opsz', 'slnt', 'ital'])
|
|
47
|
+
|
|
48
|
+
/** A `unicode-range` for a string of code points. */
|
|
49
|
+
export function toRange(text) {
|
|
50
|
+
const hex = n => n.toString(16).toUpperCase().padStart(4, '0')
|
|
51
|
+
const runs = []
|
|
52
|
+
for (const c of [...new Set(Array.from(text, ch => ch.codePointAt(0)))].sort((a, b) => a - b)) {
|
|
53
|
+
const last = runs.at(-1)
|
|
54
|
+
if (last?.[1] === c - 1) last[1] = c
|
|
55
|
+
else runs.push([c, c])
|
|
56
|
+
}
|
|
57
|
+
return runs.map(([a, b]) => (a === b ? `U+${hex(a)}` : `U+${hex(a)}-${hex(b)}`)).join(',')
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Every `font-variation-settings` in the source: the literal values per axis, and whether any value can't be read
|
|
62
|
+
* from the text (a `var()`, a template, an expression), which keeps every axis.
|
|
63
|
+
*/
|
|
64
|
+
export function scanAxes(source) {
|
|
65
|
+
const values = new Map()
|
|
66
|
+
let dynamic = false
|
|
67
|
+
for (const m of source.matchAll(/font-?variation-?settings['"`]?([^;}\]\n]*)/gi)) {
|
|
68
|
+
const pairs = /["'`]([\w ]{4})["'`][\s_]+(-?\d*\.?\d+)/g
|
|
69
|
+
for (const [, tag, value] of m[1].matchAll(pairs)) (values.get(tag) ?? values.set(tag, new Set()).get(tag)).add(Number(value))
|
|
70
|
+
if (/[\w$(]/.test(m[1].replace(pairs, '').replace(/\b(?:normal|inherit|initial|unset|revert(?:-layer)?|important)\b/g, ''))) dynamic = true
|
|
71
|
+
}
|
|
72
|
+
return { values, dynamic }
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/** The axes in a font's `fvar` table (a table-directory read: nothing else needs parsing). */
|
|
76
|
+
export async function readAxes(bytes) {
|
|
77
|
+
const font = Buffer.from(await fontverter.convert(bytes, 'truetype'))
|
|
78
|
+
for (let i = 0, n = font.readUInt16BE(4); i < n; i++) {
|
|
79
|
+
const entry = 12 + i * 16
|
|
80
|
+
if (font.toString('latin1', entry, entry + 4) !== 'fvar') continue
|
|
81
|
+
const table = font.readUInt32BE(entry + 8)
|
|
82
|
+
const first = table + font.readUInt16BE(table + 4)
|
|
83
|
+
const fixed = at => font.readInt32BE(at) / 65536
|
|
84
|
+
return Array.from({ length: font.readUInt16BE(table + 8) }, (_, a) => {
|
|
85
|
+
const at = first + a * font.readUInt16BE(table + 10)
|
|
86
|
+
return { tag: font.toString('latin1', at, at + 4), min: fixed(at + 4), default: fixed(at + 8), max: fixed(at + 12) }
|
|
87
|
+
})
|
|
88
|
+
}
|
|
89
|
+
return []
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/** The custom axes to pin: the value the source sets, or the default when it sets none. `declared` keeps an axis. */
|
|
93
|
+
export function pinned(axes, declared, { values, dynamic }) {
|
|
94
|
+
const pins = {}
|
|
95
|
+
if (dynamic) return pins
|
|
96
|
+
for (const a of axes) {
|
|
97
|
+
if (REGISTERED.has(a.tag) || declared[a.tag]) continue
|
|
98
|
+
const used = values.get(a.tag)
|
|
99
|
+
if (!used) pins[a.tag] = a.default
|
|
100
|
+
else if (used.size === 1) pins[a.tag] = Math.min(a.max, Math.max(a.min, [...used][0]))
|
|
101
|
+
}
|
|
102
|
+
return pins
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
const camel = name => name.toLowerCase().replace(/[^a-z0-9]+(.)/g, (_, c) => c.toUpperCase())
|
|
106
|
+
const pct = n => `${Math.round(n * 10000) / 100}%`
|
|
107
|
+
const slug = s => s.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '')
|
|
108
|
+
|
|
109
|
+
/** Metrics of a system fallback (Capsize's collection), by family name: Arial, Times New Roman, Courier New… */
|
|
110
|
+
async function systemMetrics(family) {
|
|
111
|
+
try {
|
|
112
|
+
return (await import(`@capsizecss/metrics/${camel(family)}`)).default
|
|
113
|
+
} catch {
|
|
114
|
+
throw Object.assign(new Error(`text(): no metrics for fallback "${family}". Use a common system face: Arial, Helvetica, Times New Roman, Georgia, Courier New, Verdana.`), { code: 'P115' })
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
const avgWidth = m => (m.subsets?.latin?.xWidthAvg ?? m.xWidthAvg) / m.unitsPerEm
|
|
119
|
+
|
|
120
|
+
/** The fallback face's descriptors that make `fallback` take the same space as `font` (Capsize / next/font). */
|
|
121
|
+
export function fallbackFace(font, fallback) {
|
|
122
|
+
const sizeAdjust = avgWidth(font) / avgWidth(fallback)
|
|
123
|
+
const k = font.unitsPerEm * sizeAdjust
|
|
124
|
+
return {
|
|
125
|
+
sizeAdjust: pct(sizeAdjust),
|
|
126
|
+
ascentOverride: pct(font.ascent / k),
|
|
127
|
+
descentOverride: pct(Math.abs(font.descent) / k),
|
|
128
|
+
lineGapOverride: pct(font.lineGap / k),
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* @param {{ fonts: Record<string, { family: string, src: string, fallback: string, display: string, weight: number, style: string, axes: Record<string, [number, number]>, preload: boolean }>, subsets: string[] }} options
|
|
134
|
+
*/
|
|
135
|
+
export function createFontBuild({ fonts, subsets, trim = true }) {
|
|
136
|
+
return {
|
|
137
|
+
/** @param {{ root: string, cacheDir: string, url: (name: string) => string, dev?: boolean, source?: string }} input */
|
|
138
|
+
async build({ root, cacheDir, url, dev = false, source = '' }) {
|
|
139
|
+
mkdirSync(cacheDir, { recursive: true })
|
|
140
|
+
const trimming = trim && !dev
|
|
141
|
+
const scan = scanAxes(source)
|
|
142
|
+
const latin = rangeText(RANGES.latin)
|
|
143
|
+
const core = trimming ? rangeText(CORE) + [...new Set(source)].filter(c => c > '~' && latin.includes(c)).join('') : ''
|
|
144
|
+
const coreSet = new Set(core)
|
|
145
|
+
const parts = subset => trimming && subset === 'latin'
|
|
146
|
+
? [{ subset, text: core }, { subset: 'latin-rest', text: Array.from(latin).filter(c => !coreSet.has(c)).join('') }].map(p => ({ ...p, range: toRange(p.text) }))
|
|
147
|
+
: [{ subset, text: rangeText(RANGES[subset]), range: RANGES[subset] }]
|
|
148
|
+
const files = []
|
|
149
|
+
const preloads = []
|
|
150
|
+
const metrics = {}
|
|
151
|
+
const faces = []
|
|
152
|
+
const fallbacks = new Map()
|
|
153
|
+
const rules = []
|
|
154
|
+
const seen = new Map() // family+src → its preload flag, so two roles on one face emit it once
|
|
155
|
+
|
|
156
|
+
for (const [role, f] of Object.entries(fonts)) {
|
|
157
|
+
const key = `${f.family}\0${f.src}\0${f.weight}\0${f.style}`
|
|
158
|
+
if (seen.has(key)) {
|
|
159
|
+
if (f.preload && !seen.get(key).preload) seen.get(key).preload = true
|
|
160
|
+
continue
|
|
161
|
+
}
|
|
162
|
+
const entry = { ...f, role, files: [] }
|
|
163
|
+
seen.set(key, entry)
|
|
164
|
+
const bytes = readFileSync(isAbsolute(f.src) ? f.src : join(root, f.src))
|
|
165
|
+
const m = await fromBuffer(bytes)
|
|
166
|
+
metrics[f.family] ??= {
|
|
167
|
+
unitsPerEm: m.unitsPerEm,
|
|
168
|
+
ascent: m.ascent / m.unitsPerEm,
|
|
169
|
+
descent: m.descent / m.unitsPerEm,
|
|
170
|
+
lineGap: m.lineGap / m.unitsPerEm,
|
|
171
|
+
capHeight: m.capHeight / m.unitsPerEm,
|
|
172
|
+
xHeight: m.xHeight / m.unitsPerEm,
|
|
173
|
+
xWidthAvg: avgWidth(m),
|
|
174
|
+
}
|
|
175
|
+
if (!fallbacks.has(f.family)) fallbacks.set(f.family, { fallback: f.fallback, ...fallbackFace(m, await systemMetrics(f.fallback)) })
|
|
176
|
+
|
|
177
|
+
const hash = createHash('sha256').update(bytes).digest('hex').slice(0, 16)
|
|
178
|
+
const pins = trimming ? pinned(await readAxes(bytes), f.axes, scan) : {}
|
|
179
|
+
entry.pins = pins
|
|
180
|
+
for (const { subset, text, range } of subsets.flatMap(parts)) {
|
|
181
|
+
const inputs = createHash('sha256').update(text).update(JSON.stringify(pins)).digest('hex').slice(0, 8)
|
|
182
|
+
const cached = join(cacheDir, `${hash}-${subset}-${inputs}-v${VERSION}.woff2`)
|
|
183
|
+
let out
|
|
184
|
+
if (existsSync(cached)) out = readFileSync(cached)
|
|
185
|
+
else {
|
|
186
|
+
out = await subsetFont(bytes, text, { targetFormat: 'woff2', ...(Object.keys(pins).length && { variationAxes: pins }) })
|
|
187
|
+
writeFileSync(cached, out)
|
|
188
|
+
}
|
|
189
|
+
const name = `${slug(f.family)}-${f.weight}${f.style === 'italic' ? 'i' : ''}-${subset}-${createHash('sha256').update(out).digest('hex').slice(0, 8)}.woff2`
|
|
190
|
+
files.push({ name, bytes: new Uint8Array(out) })
|
|
191
|
+
entry.files.push({ subset, name, range, bytes: out.length })
|
|
192
|
+
}
|
|
193
|
+
faces.push(entry)
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
for (const f of faces) {
|
|
197
|
+
const weight = f.axes.wght ? `${f.axes.wght[0]} ${f.axes.wght[1]}` : f.weight
|
|
198
|
+
for (const file of f.files) {
|
|
199
|
+
rules.push(`@font-face{font-family:"${f.family}";src:url(${url(file.name)}) format("woff2");font-weight:${weight};font-style:${f.style};font-display:${f.display};unicode-range:${file.range}}`)
|
|
200
|
+
}
|
|
201
|
+
const first = f.files.find(x => x.subset === 'latin') ?? f.files[0]
|
|
202
|
+
if (f.preload && first) preloads.push({ href: url(first.name), type: 'font/woff2', bytes: first.bytes })
|
|
203
|
+
}
|
|
204
|
+
for (const [family, fb] of fallbacks) {
|
|
205
|
+
rules.push(`@font-face{font-family:"${family} Fallback";src:local("${fb.fallback}");size-adjust:${fb.sizeAdjust};ascent-override:${fb.ascentOverride};descent-override:${fb.descentOverride};line-gap-override:${fb.lineGapOverride}}`)
|
|
206
|
+
}
|
|
207
|
+
const css = rules.join('\n') + (rules.length ? '\n' : '')
|
|
208
|
+
|
|
209
|
+
const preloadBytes = preloads.reduce((n, p) => n + p.bytes, 0)
|
|
210
|
+
const cssBrotli = brotliCompressSync(css).length
|
|
211
|
+
const overBudget = []
|
|
212
|
+
// Dev keeps whole faces, so its sizes say nothing about what ships.
|
|
213
|
+
if (!dev && preloadBytes > BUDGET.preloadBytes) overBudget.push(['X022', `The preloaded fonts are ${Math.round(preloadBytes / 1024)} KB, over the 100 KB budget for text above the fold: preload fewer faces (\`preload: false\`) or use fewer weights.`])
|
|
214
|
+
if (cssBrotli > BUDGET.cssBrotli) overBudget.push(['X022', `The generated font CSS is ${cssBrotli} B brotli, over the 1.5 KB budget: fewer faces or subsets.`])
|
|
215
|
+
|
|
216
|
+
return {
|
|
217
|
+
css,
|
|
218
|
+
preloads: preloads.map(({ href, type }) => ({ href, type })),
|
|
219
|
+
files,
|
|
220
|
+
metrics,
|
|
221
|
+
report: { faces: faces.map(f => ({ family: f.family, role: f.role, pinned: f.pins, files: f.files.map(({ subset, bytes }) => ({ subset, bytes })) })), preloadBytes, cssBrotli, overBudget },
|
|
222
|
+
}
|
|
223
|
+
},
|
|
224
|
+
}
|
|
225
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { PluginInstance } from '@weft-js/core/plugin'
|
|
2
|
+
|
|
3
|
+
/** One font file and how it's used. */
|
|
4
|
+
export interface Face {
|
|
5
|
+
family: string
|
|
6
|
+
/** The font file, relative to the project root (woff2, woff, ttf or otf). */
|
|
7
|
+
src: string
|
|
8
|
+
/** The system face the fallback is matched to: Arial, Helvetica, Times New Roman, Georgia, Courier New, Verdana… */
|
|
9
|
+
fallback: string
|
|
10
|
+
/** Never `block` or `auto` (X021). Default `swap`. */
|
|
11
|
+
display?: 'swap' | 'optional' | 'fallback'
|
|
12
|
+
weight?: number
|
|
13
|
+
style?: 'normal' | 'italic'
|
|
14
|
+
/** `{ wght: [400, 700] }` sets the face's weight range. A custom axis named here is kept whatever the source sets. */
|
|
15
|
+
axes?: Record<string, [number, number]>
|
|
16
|
+
/** Preload the latin subset. Default: true for `body` and `display`. */
|
|
17
|
+
preload?: boolean
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/** A Unicode range the fonts are cut to. */
|
|
21
|
+
export type Subset = 'latin' | 'latin-ext' | 'cyrillic' | 'cyrillic-ext' | 'greek' | 'greek-ext' | 'vietnamese'
|
|
22
|
+
|
|
23
|
+
/** Options of `text()`. */
|
|
24
|
+
export interface TextOptions {
|
|
25
|
+
/** Role → face. The only place font files are declared. */
|
|
26
|
+
fonts?: Record<string, Face>
|
|
27
|
+
/** Default `['latin']`. */
|
|
28
|
+
subsets?: Subset[]
|
|
29
|
+
/** `'auto'` provides `text.measure`, loaded lazily by what uses it; `'off'` leaves it unbound. */
|
|
30
|
+
measure?: 'auto' | 'off'
|
|
31
|
+
/** `'slim'` is @weft-js/text/engine; `'pretext'` is pinned upstream (33.9 KB br). */
|
|
32
|
+
engine?: 'slim' | 'pretext'
|
|
33
|
+
/** Pin the custom axes the source never varies and load uncommon latin characters on demand. Builds only. Default `true`. */
|
|
34
|
+
trim?: boolean
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** Every subset the build can cut. */
|
|
38
|
+
export declare const SUBSETS: Subset[]
|
|
39
|
+
/** The plugin for `weft.config.ts`: fonts, their fallbacks and `text.measure`. */
|
|
40
|
+
export declare function text(options?: TextOptions): PluginInstance<Required<TextOptions>>
|
package/plugin/index.mjs
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
// text() for weft.config.ts (research 13 §3.4, research 26 §3, research 33 §6): declares the app's fonts once and
|
|
2
|
+
// provides font.build@1 and text.measure@1. The build (src/build.mjs) runs in @weft-js/core/vite through
|
|
3
|
+
// `.weft/slots/font.build.build.json`; the engine (src/measure.mjs) loads only when something measures.
|
|
4
|
+
import { fileURLToPath } from 'node:url'
|
|
5
|
+
import { definePlugin, defineSlot, provide } from '@weft-js/core/plugin'
|
|
6
|
+
|
|
7
|
+
const fontBuild = defineSlot({ id: 'font.build', version: 1, cardinality: 'one', sides: ['build'] })
|
|
8
|
+
const textMeasure = defineSlot({ id: 'text.measure', version: 1, cardinality: 'one', sides: ['client', 'worker'] })
|
|
9
|
+
|
|
10
|
+
export const SUBSETS = ['latin', 'latin-ext', 'cyrillic', 'cyrillic-ext', 'greek', 'greek-ext', 'vietnamese']
|
|
11
|
+
const DISPLAYS = ['swap', 'optional', 'fallback']
|
|
12
|
+
const ENGINES = ['slim', 'pretext']
|
|
13
|
+
/** Roles preloaded unless a face says otherwise: the text above the fold at every dial stop. */
|
|
14
|
+
const PRELOADED = new Set(['body', 'display'])
|
|
15
|
+
|
|
16
|
+
const fail = (path, message) => {
|
|
17
|
+
throw Object.assign(new Error(message), { path })
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function face(role, f) {
|
|
21
|
+
const at = `fonts.${role}`
|
|
22
|
+
if (!f || typeof f !== 'object') fail(at, 'expected { family, src, fallback }')
|
|
23
|
+
for (const key of ['family', 'src', 'fallback']) if (typeof f[key] !== 'string' || !f[key]) fail(`${at}.${key}`, 'expected a non-empty string')
|
|
24
|
+
for (const key of Object.keys(f)) if (!['family', 'src', 'fallback', 'display', 'weight', 'style', 'axes', 'preload'].includes(key)) fail(`${at}.${key}`, 'unknown option')
|
|
25
|
+
const display = f.display ?? 'swap'
|
|
26
|
+
if (!DISPLAYS.includes(display)) fail(`${at}.display`, `must be ${DISPLAYS.map(d => `'${d}'`).join(' | ')}: \`block\` and \`auto\` hide text while the font loads (X021)`)
|
|
27
|
+
if (f.style !== undefined && f.style !== 'normal' && f.style !== 'italic') fail(`${at}.style`, "must be 'normal' or 'italic'")
|
|
28
|
+
if (f.weight !== undefined && !(Number.isInteger(f.weight) && f.weight >= 1 && f.weight <= 1000)) fail(`${at}.weight`, 'must be an integer 1–1000')
|
|
29
|
+
const axes = f.axes ?? {}
|
|
30
|
+
for (const [axis, range] of Object.entries(axes)) {
|
|
31
|
+
if (!Array.isArray(range) || range.length !== 2 || !range.every(Number.isFinite)) fail(`${at}.axes.${axis}`, 'expected [min, max]')
|
|
32
|
+
}
|
|
33
|
+
return { family: f.family, src: f.src, fallback: f.fallback, display, weight: f.weight ?? 400, style: f.style ?? 'normal', axes, preload: f.preload ?? PRELOADED.has(role) }
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function options(input) {
|
|
37
|
+
for (const key of Object.keys(input)) if (!['fonts', 'subsets', 'measure', 'engine', 'trim'].includes(key)) fail(key, 'unknown option')
|
|
38
|
+
const measure = input.measure ?? 'auto'
|
|
39
|
+
if (measure !== 'auto' && measure !== 'off') fail('measure', "must be 'auto' or 'off'")
|
|
40
|
+
const engine = input.engine ?? 'slim'
|
|
41
|
+
if (!ENGINES.includes(engine)) fail('engine', `must be ${ENGINES.map(e => `'${e}'`).join(' | ')}`)
|
|
42
|
+
const trim = input.trim ?? true
|
|
43
|
+
if (typeof trim !== 'boolean') fail('trim', 'must be true or false')
|
|
44
|
+
const subsets = input.subsets ?? ['latin']
|
|
45
|
+
if (!Array.isArray(subsets) || !subsets.length) fail('subsets', 'expected a non-empty array')
|
|
46
|
+
for (const [i, s] of subsets.entries()) if (!SUBSETS.includes(s)) fail(`subsets.${i}`, `unknown subset \`${s}\` (${SUBSETS.join(', ')})`)
|
|
47
|
+
const fonts = {}
|
|
48
|
+
for (const [role, f] of Object.entries(input.fonts ?? {})) fonts[role] = face(role, f)
|
|
49
|
+
return { fonts, subsets, measure, engine, trim }
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export const text = definePlugin({
|
|
53
|
+
name: '@weft-js/text',
|
|
54
|
+
version: '0.0.0',
|
|
55
|
+
weft: '*',
|
|
56
|
+
options,
|
|
57
|
+
permissions: { fs: { read: ['**/*.{woff2,woff,ttf,otf}'] } },
|
|
58
|
+
contribute: o => ({
|
|
59
|
+
// Generated share cards set their title and text in the app's faces.
|
|
60
|
+
card: { fonts: Object.fromEntries(['display', 'body'].filter(r => o.fonts?.[r]?.src).map(r => [r, { family: o.fonts[r].family, src: o.fonts[r].src, weight: o.fonts[r].weight }])) },
|
|
61
|
+
provides: [
|
|
62
|
+
provide(fontBuild, {
|
|
63
|
+
sides: { build: { module: fileURLToPath(new URL('./build.mjs', import.meta.url)), export: 'createFontBuild', options: { fonts: o.fonts, subsets: o.subsets, trim: o.trim } } },
|
|
64
|
+
}),
|
|
65
|
+
...(o.measure === 'off' ? [] : [provide(textMeasure, { sides: { client: { module: '@weft-js/text/measure', export: 'createMeasure', options: { engine: o.engine } } } })]),
|
|
66
|
+
],
|
|
67
|
+
agents: {
|
|
68
|
+
title: 'Fonts (@weft-js/text)',
|
|
69
|
+
text: [
|
|
70
|
+
'- Declare fonts once in `text({ fonts })` in weft.config.ts: `{ body: { family, src, fallback } }`. Never hand-write `@font-face` (X020).',
|
|
71
|
+
"- The build subsets each face by `unicode-range`, adds a metric-matched `\"<Family> Fallback\"` face and preloads `body` and `display`. `@weft-js/core/vite` loads them: no import. `weft docs fonts`.",
|
|
72
|
+
"- A build trims faces on its own: custom axes the source never varies are pinned, and uncommon latin characters load on demand. An axis set at runtime needs declaring in `axes`; `trim: false` turns it all off.",
|
|
73
|
+
'- `text.measure` is lazy: it costs nothing until something measures, a canvas `s.text()`, `measure()`, `lines()` or `fit()` from @weft-js/core/text, or a warp list given `text` (`measure: \'off\'` removes it).',
|
|
74
|
+
"- Font stacks name the fallback second: `font-family: \"Inter\", \"Inter Fallback\", sans-serif`. `font-display` is `swap` or `optional`, never `block` (X021).",
|
|
75
|
+
].join('\n'),
|
|
76
|
+
},
|
|
77
|
+
catalog: [{ name: 'text', import: '@weft-js/text', summary: 'font.build: subsets, matched fallback faces, preloads; text.measure: lazy line breaking for canvas text and exact row heights' }],
|
|
78
|
+
}),
|
|
79
|
+
})
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// text.measure@1 (research 33 §6). The slot's generated module calls this through `import()`, so nothing here is in an
|
|
2
|
+
// app until something measures. `slim` is @weft-js/text/engine, which already has the slot's shape.
|
|
3
|
+
|
|
4
|
+
/** Pretext's own lines carry their text, so `lineText` only has to hand it back. */
|
|
5
|
+
function pretext(P) {
|
|
6
|
+
return {
|
|
7
|
+
prepare: (text, font, opts) => Object.assign(P.prepareWithSegments(text, font, opts), { exact: true, ready: null }),
|
|
8
|
+
layout: (h, width, lineHeight) => P.layout(h, width, lineHeight),
|
|
9
|
+
lines: (h, width) => P.layoutWithLines(h, width, 1).lines,
|
|
10
|
+
lineText: (_, line) => line.text,
|
|
11
|
+
clear: P.clearCache,
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/** The `text.measure` provider: this package's engine, or upstream Pretext behind the same calls. */
|
|
16
|
+
export async function createMeasure({ engine = 'slim' } = {}) {
|
|
17
|
+
if (engine === 'pretext') return pretext(await import('@chenglou/pretext'))
|
|
18
|
+
const { loadTextEngine } = await import('../dist/index.js')
|
|
19
|
+
return loadTextEngine()
|
|
20
|
+
}
|