postext 1.26.0 → 1.26.2
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/dist/__tests__/trackedLigatures.test.js +361 -4
- package/dist/__tests__/trackedLigatures.test.js.map +1 -1
- package/dist/canvas-backend/mirrorFrame.d.ts +14 -1
- package/dist/canvas-backend/mirrorFrame.d.ts.map +1 -1
- package/dist/canvas-backend/mirrorFrame.js +51 -7
- package/dist/canvas-backend/mirrorFrame.js.map +1 -1
- package/dist/canvas-backend/trackedText.d.ts +22 -5
- package/dist/canvas-backend/trackedText.d.ts.map +1 -1
- package/dist/canvas-backend/trackedText.js +52 -31
- package/dist/canvas-backend/trackedText.js.map +1 -1
- package/dist/canvas-backend/wordRuns.d.ts +3 -1
- package/dist/canvas-backend/wordRuns.d.ts.map +1 -1
- package/dist/canvas-backend/wordRuns.js +3 -1
- package/dist/canvas-backend/wordRuns.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { renderPageToCanvas } from '../canvas-backend';
|
|
2
3
|
import { renderBlock } from '../canvas-backend/blockRender';
|
|
3
|
-
import {
|
|
4
|
+
import { beginMirroredFlow } from '../canvas-backend/mirrorFrame';
|
|
5
|
+
import { fillTrackedWord, trackedPieces, shapedOtherwise } from '../canvas-backend/trackedText';
|
|
4
6
|
import { renderToHtml } from '../html-backend';
|
|
5
7
|
import { buildDocument } from '../pipeline';
|
|
6
8
|
// #663: a tracked word is measured at its natural width, ligatures counted,
|
|
@@ -21,7 +23,13 @@ const ADVANCE = (ch) => {
|
|
|
21
23
|
return 0.66;
|
|
22
24
|
return 0.5;
|
|
23
25
|
};
|
|
24
|
-
|
|
26
|
+
// An Arabic and a Hebrew word, and the ligature each holds in this face
|
|
27
|
+
// (lam + alef, alef + lamed), which the letter-spacing turns off as well.
|
|
28
|
+
const SALAM = '\u0633\u0644\u0627\u0645';
|
|
29
|
+
const ISRAEL = '\u05D9\u05E9\u05E8\u05D0\u05DC';
|
|
30
|
+
/** A Hebrew word with no ligature. */
|
|
31
|
+
const SHALOM = '\u05E9\u05DC\u05D5\u05DD';
|
|
32
|
+
const LIGATURES = [['ffi', 0.75], ['ff', 0.5], ['fi', 0.5], ['fl', 0.5], ['\u0644\u0627', 0.5], ['\u05D0\u05DC', 0.5]];
|
|
25
33
|
function naturalWidth(text, size, ligatures) {
|
|
26
34
|
let w = 0;
|
|
27
35
|
for (let i = 0; i < text.length;) {
|
|
@@ -38,15 +46,20 @@ function naturalWidth(text, size, ligatures) {
|
|
|
38
46
|
return w;
|
|
39
47
|
}
|
|
40
48
|
const sizeOf = (font) => parseFloat(/(\d*\.?\d+)px/.exec(font)?.[1] ?? '10');
|
|
41
|
-
/** The measuring half of a browser's 2D context.
|
|
49
|
+
/** The measuring half of a browser's 2D context. `keeps`: a browser that
|
|
50
|
+
* keeps the ligatures under a letter-spacing, so no word is cut. */
|
|
42
51
|
class BrowserCtx {
|
|
52
|
+
keeps;
|
|
43
53
|
font = '10px Body';
|
|
44
54
|
letterSpacing = '0px';
|
|
45
55
|
measured = 0;
|
|
56
|
+
constructor(keeps = false) {
|
|
57
|
+
this.keeps = keeps;
|
|
58
|
+
}
|
|
46
59
|
measureText(s) {
|
|
47
60
|
this.measured++;
|
|
48
61
|
const spacing = parseFloat(this.letterSpacing) || 0;
|
|
49
|
-
return { width: naturalWidth(s, sizeOf(this.font), spacing === 0) + spacing * s.length };
|
|
62
|
+
return { width: naturalWidth(s, sizeOf(this.font), this.keeps || spacing === 0) + spacing * s.length };
|
|
50
63
|
}
|
|
51
64
|
}
|
|
52
65
|
function paintingCtx() {
|
|
@@ -227,4 +240,348 @@ describe('a tracked line in HTML (#663)', () => {
|
|
|
227
240
|
expect(html).not.toContain("'liga'");
|
|
228
241
|
});
|
|
229
242
|
});
|
|
243
|
+
const mul = (m, n) => [
|
|
244
|
+
m[0] * n[0] + m[2] * n[1], m[1] * n[0] + m[3] * n[1],
|
|
245
|
+
m[0] * n[2] + m[2] * n[3], m[1] * n[2] + m[3] * n[3],
|
|
246
|
+
m[0] * n[4] + m[2] * n[5] + m[4], m[1] * n[4] + m[3] * n[5] + m[5],
|
|
247
|
+
];
|
|
248
|
+
const leftOf = (r) => Math.min(r.x, r.x + r.ux * r.width);
|
|
249
|
+
const rightOf = (r) => Math.max(r.x, r.x + r.ux * r.width);
|
|
250
|
+
/** A browser's 2D context (the measurer above) that keeps its transform
|
|
251
|
+
* and its state. `keeps`: see {@link BrowserCtx}; its fonts carry another
|
|
252
|
+
* name, so what is known of a word in one browser is not taken for the
|
|
253
|
+
* other. */
|
|
254
|
+
function sheetCanvas(keeps = false) {
|
|
255
|
+
const runs = [];
|
|
256
|
+
let m = [1, 0, 0, 1, 0, 0];
|
|
257
|
+
const stack = [];
|
|
258
|
+
const measure = new BrowserCtx(keeps);
|
|
259
|
+
const state = { font: '10px Body', textAlign: 'left', direction: 'ltr', textBaseline: 'alphabetic', letterSpacing: '0px', fillStyle: '' };
|
|
260
|
+
const measureText = (s) => {
|
|
261
|
+
measure.font = state.font;
|
|
262
|
+
measure.letterSpacing = state.letterSpacing;
|
|
263
|
+
return measure.measureText(s);
|
|
264
|
+
};
|
|
265
|
+
const api = {
|
|
266
|
+
save() { stack.push({ m, state: { ...state } }); },
|
|
267
|
+
restore() {
|
|
268
|
+
const top = stack.pop();
|
|
269
|
+
if (!top)
|
|
270
|
+
return;
|
|
271
|
+
m = top.m;
|
|
272
|
+
Object.assign(state, top.state);
|
|
273
|
+
},
|
|
274
|
+
transform(a, b, c, d, e, f) { m = mul(m, [a, b, c, d, e, f]); },
|
|
275
|
+
translate(x, y) { m = mul(m, [1, 0, 0, 1, x, y]); },
|
|
276
|
+
scale(x, y) { m = mul(m, [x, 0, 0, y, 0, 0]); },
|
|
277
|
+
rotate(t) { m = mul(m, [Math.cos(t), Math.sin(t), -Math.sin(t), Math.cos(t), 0, 0]); },
|
|
278
|
+
measureText,
|
|
279
|
+
fillText(text, x, y) {
|
|
280
|
+
const width = measureText(text).width;
|
|
281
|
+
// The run's box from its alignment, as a browser places it.
|
|
282
|
+
const rtl = state.direction === 'rtl';
|
|
283
|
+
const from = state.textAlign === 'right' || (state.textAlign === 'start' && rtl) || (state.textAlign === 'end' && !rtl) ? x - width : x;
|
|
284
|
+
runs.push({
|
|
285
|
+
text, x: m[0] * from + m[2] * y + m[4], y: m[1] * from + m[3] * y + m[5], ux: m[0], uy: m[1], det: m[0] * m[3] - m[1] * m[2],
|
|
286
|
+
width, baseline: y, spacing: parseFloat(state.letterSpacing) || 0, direction: state.direction, font: state.font,
|
|
287
|
+
});
|
|
288
|
+
},
|
|
289
|
+
};
|
|
290
|
+
const ctx = new Proxy(state, {
|
|
291
|
+
get(target, key) {
|
|
292
|
+
if (typeof key === 'string' && key in api)
|
|
293
|
+
return api[key];
|
|
294
|
+
if (typeof key === 'string' && key in target)
|
|
295
|
+
return target[key];
|
|
296
|
+
return () => undefined;
|
|
297
|
+
},
|
|
298
|
+
set(target, key, value) {
|
|
299
|
+
// The mirrored frame puts its own `fillText` on the context.
|
|
300
|
+
if (typeof key === 'string' && key in api)
|
|
301
|
+
api[key] = value;
|
|
302
|
+
else
|
|
303
|
+
target[key] = key === 'font' && keeps ? `${value}, Keeps` : value;
|
|
304
|
+
return true;
|
|
305
|
+
},
|
|
306
|
+
has(target, key) { return typeof key === 'string' && (key in api || key in target); },
|
|
307
|
+
deleteProperty() { return true; },
|
|
308
|
+
getOwnPropertyDescriptor() { return undefined; },
|
|
309
|
+
});
|
|
310
|
+
const canvas = { width: 0, height: 0, getContext: () => ctx };
|
|
311
|
+
return { canvas, ctx, runs };
|
|
312
|
+
}
|
|
313
|
+
function runsOn(doc, page = 0, keeps = false) {
|
|
314
|
+
const { canvas, runs } = sheetCanvas(keeps);
|
|
315
|
+
renderPageToCanvas(doc.pages[page], doc, canvas);
|
|
316
|
+
return runs;
|
|
317
|
+
}
|
|
318
|
+
/** The runs on each baseline of an upright page, from the sheet's left. */
|
|
319
|
+
function rows(runs) {
|
|
320
|
+
const by = new Map();
|
|
321
|
+
for (const r of runs)
|
|
322
|
+
by.set(r.baseline, [...(by.get(r.baseline) ?? []), r]);
|
|
323
|
+
return [...by.entries()].sort((a, b) => a[0] - b[0]).map(([, row]) => row.sort((a, b) => leftOf(a) - leftOf(b)));
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* The page painted by a browser that drops the ligatures of a tracked word
|
|
327
|
+
* against the same page painted by one that keeps them, which paints every
|
|
328
|
+
* word whole and so where the frame, the line's order and any turn of the
|
|
329
|
+
* block put it. A word in pieces must start where the whole word starts,
|
|
330
|
+
* read the same way, and hold its pieces at their places in the natural
|
|
331
|
+
* shaping. Returns the words painted in pieces. For pages whose tracked
|
|
332
|
+
* lines are painted word by word in either browser.
|
|
333
|
+
*/
|
|
334
|
+
function againstWholeWords(doc, page = 0) {
|
|
335
|
+
const cut = runsOn(doc, page);
|
|
336
|
+
const whole = runsOn(doc, page, true);
|
|
337
|
+
const words = [];
|
|
338
|
+
let j = 0;
|
|
339
|
+
for (const w of whole) {
|
|
340
|
+
const pieces = [];
|
|
341
|
+
let text = '';
|
|
342
|
+
while (text.length < w.text.length && j < cut.length) {
|
|
343
|
+
pieces.push(cut[j]);
|
|
344
|
+
text += cut[j++].text;
|
|
345
|
+
}
|
|
346
|
+
expect(text).toBe(w.text);
|
|
347
|
+
const first = pieces[0];
|
|
348
|
+
const known = pieces.length > 1 ? trackedPieces(Object.assign(paintingCtx().ctx, { font: first.font }), w.text) : undefined;
|
|
349
|
+
pieces.forEach((p, k) => {
|
|
350
|
+
const at = known ? known[k].offset + w.spacing * known[k].glyphsBefore : 0;
|
|
351
|
+
expect(p.x).toBeCloseTo(w.x + w.ux * at, 6);
|
|
352
|
+
expect(p.y).toBeCloseTo(w.y + w.uy * at, 6);
|
|
353
|
+
expect(p.ux).toBeCloseTo(w.ux, 9);
|
|
354
|
+
expect(p.uy).toBeCloseTo(w.uy, 9);
|
|
355
|
+
// Read as written, never through the mirror.
|
|
356
|
+
expect(p.det).toBeGreaterThan(0);
|
|
357
|
+
expect(p.direction).toBe(w.direction);
|
|
358
|
+
expect(p.spacing).toBe(known?.[k].ligature ? 0 : w.spacing);
|
|
359
|
+
});
|
|
360
|
+
if (pieces.length > 1)
|
|
361
|
+
words.push(pieces);
|
|
362
|
+
}
|
|
363
|
+
expect(j).toBe(cut.length);
|
|
364
|
+
return words;
|
|
365
|
+
}
|
|
366
|
+
const RTL = { ...CONFIG, direction: 'rtl' };
|
|
367
|
+
const RTL_LEFT = { ...LEFT, direction: 'rtl' };
|
|
368
|
+
const ltrBlock = (text) => `:::paragraphs{dir=ltr}\n${text}\n:::`;
|
|
369
|
+
describe('a word in pieces inside a mirrored frame (#685)', () => {
|
|
370
|
+
it('is turned once, about its box: the pieces in reading order from the box\'s left', () => {
|
|
371
|
+
const { ctx, runs } = sheetCanvas();
|
|
372
|
+
const t = -0.1;
|
|
373
|
+
ctx.letterSpacing = `${t}px`;
|
|
374
|
+
const end = beginMirroredFlow(ctx, 200);
|
|
375
|
+
const paint = (text, x, y) => ctx.fillText(text, x, y);
|
|
376
|
+
fillTrackedWord(ctx, 'first', 40, 50, t, paint);
|
|
377
|
+
// A word with no ligature beside it: one `fillText`, turned by the frame.
|
|
378
|
+
fillTrackedWord(ctx, 'hands', 100, 50, t, paint);
|
|
379
|
+
expect(ctx.letterSpacing).toBe(`${t}px`);
|
|
380
|
+
end();
|
|
381
|
+
expect(runs.map((r) => r.text)).toEqual(['fi', 'rst', 'hands']);
|
|
382
|
+
const [fi, rst, hands] = runs;
|
|
383
|
+
// "first" was measured 20 px wide and five letters tracked: its box is
|
|
384
|
+
// [40, 59.5] in the flow, [140.5, 160] on the sheet.
|
|
385
|
+
expect(leftOf(fi)).toBeCloseTo(200 - 40 - (20 + 5 * t), 6);
|
|
386
|
+
expect(fi.spacing).toBe(0);
|
|
387
|
+
// The rest after the ligature and its one glyph of tracking.
|
|
388
|
+
expect(leftOf(rst)).toBeCloseTo(leftOf(fi) + 5 + t, 6);
|
|
389
|
+
expect(rst.spacing).toBe(t);
|
|
390
|
+
// It ends at the box's right, less the tracking the ligature's second
|
|
391
|
+
// letter does not take (one glyph, as on a left-to-right page).
|
|
392
|
+
expect(rightOf(rst)).toBeCloseTo(200 - 40 - t, 6);
|
|
393
|
+
expect(runs.every((r) => r.det > 0 && r.ux === 1)).toBe(true);
|
|
394
|
+
// The whole word stands as the frame always put it.
|
|
395
|
+
expect(leftOf(hands)).toBeCloseTo(200 - 100 - (25 + 5 * t), 6);
|
|
396
|
+
expect(rightOf(hands)).toBeCloseTo(100, 6);
|
|
397
|
+
});
|
|
398
|
+
it('outside a mirrored frame the pieces start at the word\'s left', () => {
|
|
399
|
+
const { ctx, runs } = sheetCanvas();
|
|
400
|
+
ctx.letterSpacing = '-0.1px';
|
|
401
|
+
fillTrackedWord(ctx, 'first', 40, 50, -0.1, (text, x, y) => ctx.fillText(text, x, y));
|
|
402
|
+
expect(runs.map((r) => [r.text, +leftOf(r).toFixed(6), r.spacing])).toEqual([['fi', 40, 0], ['rst', 44.9, -0.1]]);
|
|
403
|
+
});
|
|
404
|
+
});
|
|
405
|
+
describe('a tracked left-to-right paragraph on a right-to-left page (#685)', () => {
|
|
406
|
+
for (const [name, text, ltr, rtl] of [['justified', JUSTIFIED, CONFIG, RTL], ['ragged', RAGGED, LEFT, RTL_LEFT]]) {
|
|
407
|
+
it(`${name}: every piece lands where a left-to-right page puts it`, () => {
|
|
408
|
+
const plain = buildDocument({ markdown: text }, ltr);
|
|
409
|
+
const mirrored = buildDocument({ markdown: ltrBlock(text) }, rtl);
|
|
410
|
+
expect(mirrored.pages[0].flow?.writingMode).toBe('horizontal-tb');
|
|
411
|
+
const block = paragraph(mirrored);
|
|
412
|
+
const t = block.letterSpacing;
|
|
413
|
+
expect(t).toBeCloseTo(-0.1, 5);
|
|
414
|
+
const a = rows(runsOn(plain));
|
|
415
|
+
const b = rows(runsOn(mirrored));
|
|
416
|
+
expect(b.length).toBe(block.lines.length);
|
|
417
|
+
expect(b.length).toBe(a.length);
|
|
418
|
+
b.forEach((row, i) => {
|
|
419
|
+
// From the sheet's left the pieces spell the line: "fi" before
|
|
420
|
+
// "rst", never after it.
|
|
421
|
+
expect(row.map((r) => r.text).join('')).toBe(block.lines[i].text.replace(/ /g, ''));
|
|
422
|
+
expect(row.every((r) => r.det > 0)).toBe(true);
|
|
423
|
+
// The margins are equal, so the line stands as on the left-to-right
|
|
424
|
+
// page; a ragged line of the mirrored page starts the tracking of
|
|
425
|
+
// one glyph further in (it is aligned by its other end), words in
|
|
426
|
+
// pieces and whole words alike.
|
|
427
|
+
const shift = leftOf(row[0]) - leftOf(a[i][0]);
|
|
428
|
+
expect(Math.abs(shift)).toBeLessThanOrEqual(Math.abs(t) + 1e-9);
|
|
429
|
+
if (a[i].length === 1) {
|
|
430
|
+
// A line with no ligature: one text on the left-to-right page,
|
|
431
|
+
// word by word on the mirrored one, over the same stretch.
|
|
432
|
+
expect(rightOf(row[row.length - 1]) - shift).toBeCloseTo(rightOf(a[i][0]), 6);
|
|
433
|
+
return;
|
|
434
|
+
}
|
|
435
|
+
expect(row.length).toBe(a[i].length);
|
|
436
|
+
row.forEach((r, k) => {
|
|
437
|
+
const q = a[i][k];
|
|
438
|
+
expect(r.text).toBe(q.text);
|
|
439
|
+
expect(r.spacing).toBe(q.spacing);
|
|
440
|
+
expect(leftOf(r) - shift).toBeCloseTo(leftOf(q), 6);
|
|
441
|
+
expect(rightOf(r) - shift).toBeCloseTo(rightOf(q), 6);
|
|
442
|
+
});
|
|
443
|
+
});
|
|
444
|
+
expect(b.flat().filter((r) => r.text === 'fi' || r.text === 'ffi').length).toBeGreaterThan(3);
|
|
445
|
+
});
|
|
446
|
+
}
|
|
447
|
+
});
|
|
448
|
+
/** A page whose level-2 headings are tracked: half a point after each letter. */
|
|
449
|
+
const tracked2 = (config) => ({
|
|
450
|
+
...config,
|
|
451
|
+
page: { ...config.page, width: pt(400) },
|
|
452
|
+
headings: { levels: [{ level: 2, letterSpacing: pt(0.5) }] },
|
|
453
|
+
});
|
|
454
|
+
const headingOf = (doc) => doc.blocks.find((b) => b.type === 'heading');
|
|
455
|
+
describe('right-to-left words on a tracked line (#685)', () => {
|
|
456
|
+
it('an Arabic or a Hebrew word is never cut, though its face has ligatures', () => {
|
|
457
|
+
const { ctx } = paintingCtx();
|
|
458
|
+
for (const word of [SALAM, ISRAEL, `first${SALAM}`, `${ISRAEL}first`]) {
|
|
459
|
+
// The browser shapes it otherwise under a letter-spacing…
|
|
460
|
+
expect(shapedOtherwise(ctx, word)).toBe(true);
|
|
461
|
+
// …and it is still painted whole, with one `fillText`.
|
|
462
|
+
expect(trackedPieces(ctx, word)).toBeNull();
|
|
463
|
+
const seen = [];
|
|
464
|
+
ctx.letterSpacing = '0.5px';
|
|
465
|
+
fillTrackedWord(ctx, word, 10, 20, 0.5, (text, x, y) => seen.push([text, x, y]));
|
|
466
|
+
expect(seen).toEqual([[word, 10, 20]]);
|
|
467
|
+
expect(ctx.letterSpacing).toBe('0.5px');
|
|
468
|
+
}
|
|
469
|
+
});
|
|
470
|
+
for (const [name, config, dir] of [['a right-to-left line of a left-to-right page', CONFIG, ' {dir=rtl}'], ['a line of a right-to-left page', RTL, '']]) {
|
|
471
|
+
it(`${name}: the Arabic word untracked, the Hebrew ones whole, the Latin ones in reading order`, () => {
|
|
472
|
+
const doc = buildDocument({ markdown: `## ${SHALOM} first ${SALAM} office ${SHALOM}${dir}` }, tracked2(config));
|
|
473
|
+
const line = headingOf(doc).lines[0];
|
|
474
|
+
expect(line.segments.filter((s) => s.rtl && s.kind !== 'space').map((s) => s.text)).toEqual([SHALOM, SALAM, SHALOM]);
|
|
475
|
+
const runs = runsOn(doc);
|
|
476
|
+
// Arabic: one `fillText`, no letter-spacing, right to left.
|
|
477
|
+
expect(runs.filter((r) => r.text.includes('\u0644\u0627')).map((r) => [r.text, r.spacing, r.direction])).toEqual([[SALAM, 0, 'rtl']]);
|
|
478
|
+
// Hebrew: one `fillText` a word, tracked as measured, right to left.
|
|
479
|
+
expect(runs.filter((r) => r.text.includes('\u05E9')).map((r) => [r.text, r.spacing, r.direction])).toEqual([[SHALOM, 0.5, 'rtl'], [SHALOM, 0.5, 'rtl']]);
|
|
480
|
+
// The Latin words: in pieces, where the whole words would stand.
|
|
481
|
+
const words = againstWholeWords(doc);
|
|
482
|
+
const first = words.find((w) => w[0].text === 'fi');
|
|
483
|
+
const office = words.find((w) => w[0].text === 'o');
|
|
484
|
+
expect(words).toHaveLength(2);
|
|
485
|
+
expect(first.map((r) => r.text)).toEqual(['fi', 'rst']);
|
|
486
|
+
expect(office.map((r) => r.text)).toEqual(['o', 'ffi', 'ce']);
|
|
487
|
+
for (const w of words)
|
|
488
|
+
for (let k = 1; k < w.length; k++)
|
|
489
|
+
expect(leftOf(w[k])).toBeGreaterThan(leftOf(w[k - 1]));
|
|
490
|
+
// The line reads from the right: "first" stands right of "office",
|
|
491
|
+
// the Arabic word between them.
|
|
492
|
+
const salam = runs.find((r) => r.text === SALAM);
|
|
493
|
+
expect(leftOf(first[0])).toBeGreaterThanOrEqual(rightOf(salam) - 1e-6);
|
|
494
|
+
expect(leftOf(salam)).toBeGreaterThanOrEqual(rightOf(office[2]) - 1);
|
|
495
|
+
});
|
|
496
|
+
}
|
|
497
|
+
});
|
|
498
|
+
const cell = (content) => ({ content });
|
|
499
|
+
/** A table whose header cells are tracked (`headerLetterSpacing`). */
|
|
500
|
+
const table = (extra = {}, direction) => ({
|
|
501
|
+
id: 'tab', typeId: 'table', kind: 'table', caption: 'A table', createdAt: 0, updatedAt: 0,
|
|
502
|
+
table: {
|
|
503
|
+
model: { headerRowCount: 1, rows: [[cell('first office'), cell('fire lets')], [cell('stood'), cell('is')]] },
|
|
504
|
+
...(direction ? { direction } : {}),
|
|
505
|
+
},
|
|
506
|
+
placement: { position: 'here' },
|
|
507
|
+
...extra,
|
|
508
|
+
});
|
|
509
|
+
const withTable = (config) => ({
|
|
510
|
+
...config,
|
|
511
|
+
page: { ...config.page, width: pt(300), height: pt(400) },
|
|
512
|
+
tableStyle: { headerLetterSpacing: pt(0.5) },
|
|
513
|
+
});
|
|
514
|
+
const TABLE_MD = 'Text.\n\n::resource{id="tab"}\n\nMore.';
|
|
515
|
+
/** The page that holds the table, in the flow or as a float. */
|
|
516
|
+
const tablePage = (doc) => doc.pages.findIndex((p) => [...p.columns.flatMap((c) => c.blocks), ...(p.floats ?? [])].some((b) => b.resourceBlock?.resource.id === 'tab'));
|
|
517
|
+
describe('tracked header cells in either direction (#685)', () => {
|
|
518
|
+
const header = [['fi', 'rst'], ['o', 'ffi', 'ce'], ['fi', 're']];
|
|
519
|
+
for (const [name, config, direction] of [
|
|
520
|
+
['a table of a left-to-right page', CONFIG, undefined],
|
|
521
|
+
['a table of a right-to-left page', RTL, undefined],
|
|
522
|
+
['a left-to-right table of a right-to-left page', RTL, 'ltr'],
|
|
523
|
+
['a right-to-left table of a left-to-right page', CONFIG, 'rtl'],
|
|
524
|
+
]) {
|
|
525
|
+
it(`${name}: the words in pieces stand where the whole words would`, () => {
|
|
526
|
+
const doc = buildDocument({ markdown: TABLE_MD, resources: [table({}, direction)] }, withTable(config));
|
|
527
|
+
const words = againstWholeWords(doc, tablePage(doc));
|
|
528
|
+
expect(words.map((w) => w.map((r) => r.text)).sort()).toEqual([...header].sort());
|
|
529
|
+
// Upright: each word reads from the sheet's left.
|
|
530
|
+
for (const w of words)
|
|
531
|
+
for (let k = 1; k < w.length; k++)
|
|
532
|
+
expect(leftOf(w[k])).toBeGreaterThan(leftOf(w[k - 1]));
|
|
533
|
+
});
|
|
534
|
+
}
|
|
535
|
+
for (const rotate of ['ccw', 'cw']) {
|
|
536
|
+
for (const [name, config] of [['left-to-right', CONFIG], ['right-to-left', RTL]]) {
|
|
537
|
+
it(`a table turned ${rotate} on a ${name} page: the pieces follow the turn`, () => {
|
|
538
|
+
const doc = buildDocument({ markdown: TABLE_MD, resources: [table({ placement: { rotate } })] }, withTable(config));
|
|
539
|
+
const page = tablePage(doc);
|
|
540
|
+
expect(page).toBeGreaterThanOrEqual(0);
|
|
541
|
+
const words = againstWholeWords(doc, page);
|
|
542
|
+
expect(words.map((w) => w.map((r) => r.text)).sort()).toEqual([...header].sort());
|
|
543
|
+
for (const w of words) {
|
|
544
|
+
// Turned a quarter: the letters advance up or down the sheet,
|
|
545
|
+
// each piece further along than the one before.
|
|
546
|
+
expect(Math.abs(w[0].ux)).toBeLessThan(1e-9);
|
|
547
|
+
for (let k = 1; k < w.length; k++)
|
|
548
|
+
expect((w[k].y - w[k - 1].y) * w[0].uy).toBeGreaterThan(0);
|
|
549
|
+
}
|
|
550
|
+
});
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
});
|
|
554
|
+
describe('lines that are never cut (#685)', () => {
|
|
555
|
+
it('a vertical line is painted the same whether the browser drops ligatures or not', () => {
|
|
556
|
+
const doc = buildDocument({ markdown: '## first office fire' }, tracked2({ ...CONFIG, layout: { writingMode: 'vertical-rl', layoutType: 'single' } }));
|
|
557
|
+
expect(headingOf(doc).letterSpacing ?? headingOf(doc).lines[0].letterSpacing).toBeCloseTo(0.5, 6);
|
|
558
|
+
// What was painted and where; the two browsers measure the run apart.
|
|
559
|
+
const put = (r) => ({ ...r, font: r.font.replace(', Keeps', ''), width: 0 });
|
|
560
|
+
const cut = runsOn(doc).map(put);
|
|
561
|
+
expect(cut.length).toBeGreaterThan(0);
|
|
562
|
+
expect(cut).toEqual(runsOn(doc, 0, true).map(put));
|
|
563
|
+
// The words with their neighbours, tracked: no ligature set apart.
|
|
564
|
+
expect(cut.map((r) => r.text).join(' ')).toContain('first');
|
|
565
|
+
expect(cut.some((r) => r.text === 'fi' || r.text === 'ffi' || r.spacing === 0)).toBe(false);
|
|
566
|
+
});
|
|
567
|
+
});
|
|
568
|
+
describe('a tracked line in HTML, either direction (#685)', () => {
|
|
569
|
+
it('a left-to-right paragraph of a right-to-left page asks for its ligatures as on a left-to-right page', () => {
|
|
570
|
+
const plain = renderToHtml(buildDocument({ markdown: JUSTIFIED }, CONFIG));
|
|
571
|
+
const mirrored = renderToHtml(buildDocument({ markdown: ltrBlock(JUSTIFIED) }, RTL));
|
|
572
|
+
const asked = (html) => html.split("font-feature-settings:'liga' 1,'clig' 1;").length - 1;
|
|
573
|
+
expect(asked(plain)).toBe(3);
|
|
574
|
+
expect(asked(mirrored)).toBe(3);
|
|
575
|
+
// The words are whole in the markup: nothing to put in order.
|
|
576
|
+
for (const word of ['first', 'offices', 'fire'])
|
|
577
|
+
expect(mirrored).toContain(word);
|
|
578
|
+
});
|
|
579
|
+
it('an Arabic word of a tracked line takes no letter-spacing; a Hebrew one keeps the line\'s', () => {
|
|
580
|
+
const html = renderToHtml(buildDocument({ markdown: `## ${SHALOM} first ${SALAM} office ${SHALOM}` }, tracked2(RTL)));
|
|
581
|
+
expect(html).toContain("letter-spacing:0.5px;font-feature-settings:'liga' 1,'clig' 1;");
|
|
582
|
+
expect(html).toMatch(new RegExp(`<span[^>]*letter-spacing:0;[^>]*>${SALAM}</span>`));
|
|
583
|
+
expect(html).toContain(SHALOM);
|
|
584
|
+
expect(html).not.toMatch(new RegExp(`<span[^>]*letter-spacing:0;[^>]*>${SHALOM}</span>`));
|
|
585
|
+
});
|
|
586
|
+
});
|
|
230
587
|
//# sourceMappingURL=trackedLigatures.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trackedLigatures.test.js","sourceRoot":"","sources":["../../src/__tests__/trackedLigatures.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"trackedLigatures.test.js","sourceRoot":"","sources":["../../src/__tests__/trackedLigatures.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,7 +16,10 @@
|
|
|
16
16
|
* painter sets right to left (`ctx.direction = 'rtl'`) is turned about the
|
|
17
17
|
* box its direction and alignment give it, and shapes as it would on a
|
|
18
18
|
* left-to-right page. A formula drawn as paths rather than a bitmap asks
|
|
19
|
-
* {@link counterFlipBox} itself
|
|
19
|
+
* {@link counterFlipBox} itself, and a word painted with several
|
|
20
|
+
* `fillText`s (a tracked word in pieces, #663) asks {@link paintAsOneRun}:
|
|
21
|
+
* turned piece by piece, its pieces would stand in the mirror's order
|
|
22
|
+
* ("five" as "vefi", #685).
|
|
20
23
|
*
|
|
21
24
|
* The interception is an own property on the context instance, set for
|
|
22
25
|
* the flow pass and removed after it: running heads, folios and crop marks
|
|
@@ -28,6 +31,16 @@ export declare function mirroredPaintActive(): boolean;
|
|
|
28
31
|
* the layout put it and its content reads unmirrored. Outside a mirrored
|
|
29
32
|
* frame it just paints. */
|
|
30
33
|
export declare function counterFlipBox(ctx: CanvasRenderingContext2D, left: number, width: number, paint: () => void): void;
|
|
34
|
+
/**
|
|
35
|
+
* Paint, with `paint`, a run made of several `fillText`s (the pieces of a
|
|
36
|
+
* word) whose box is `[left, left + width]`: inside a mirrored frame the
|
|
37
|
+
* run is turned back once, about that box, and each call of `paint` lands
|
|
38
|
+
* as on a left-to-right page, so the pieces keep their reading order and
|
|
39
|
+
* their places in the run. Turned one by one, each about its own box, they
|
|
40
|
+
* would stand where the mirror puts them: the first at the right end.
|
|
41
|
+
* Outside a mirrored frame it just paints.
|
|
42
|
+
*/
|
|
43
|
+
export declare function paintAsOneRun(ctx: CanvasRenderingContext2D, left: number, width: number, paint: () => void): void;
|
|
31
44
|
/**
|
|
32
45
|
* Begin painting the flow of a page mirrored about `originX` (its
|
|
33
46
|
* `flow.mirror.originX`): saves the context, applies the frame and turns
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mirrorFrame.d.ts","sourceRoot":"","sources":["../../src/canvas-backend/mirrorFrame.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"mirrorFrame.d.ts","sourceRoot":"","sources":["../../src/canvas-backend/mirrorFrame.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAMH,wBAAgB,mBAAmB,IAAI,OAAO,CAE7C;AAsBD;;;4BAG4B;AAC5B,wBAAgB,cAAc,CAAC,GAAG,EAAE,wBAAwB,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,IAAI,GAAG,IAAI,CAalH;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,wBAAwB,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,IAAI,GAAG,IAAI,CAWjH;AAWD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,wBAAwB,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,IAAI,CAwD5F"}
|
|
@@ -16,7 +16,10 @@
|
|
|
16
16
|
* painter sets right to left (`ctx.direction = 'rtl'`) is turned about the
|
|
17
17
|
* box its direction and alignment give it, and shapes as it would on a
|
|
18
18
|
* left-to-right page. A formula drawn as paths rather than a bitmap asks
|
|
19
|
-
* {@link counterFlipBox} itself
|
|
19
|
+
* {@link counterFlipBox} itself, and a word painted with several
|
|
20
|
+
* `fillText`s (a tracked word in pieces, #663) asks {@link paintAsOneRun}:
|
|
21
|
+
* turned piece by piece, its pieces would stand in the mirror's order
|
|
22
|
+
* ("five" as "vefi", #685).
|
|
20
23
|
*
|
|
21
24
|
* The interception is an own property on the context instance, set for
|
|
22
25
|
* the flow pass and removed after it: running heads, folios and crop marks
|
|
@@ -28,6 +31,10 @@ let active = 0;
|
|
|
28
31
|
export function mirroredPaintActive() {
|
|
29
32
|
return active > 0;
|
|
30
33
|
}
|
|
34
|
+
/** Whether a run painted in several calls is being painted (see
|
|
35
|
+
* {@link paintAsOneRun}): the frame turned the whole of it back, so the
|
|
36
|
+
* calls inside paint as on a left-to-right page. */
|
|
37
|
+
let whole = 0;
|
|
31
38
|
const PATCHED = ['fillText', 'strokeText', 'drawImage'];
|
|
32
39
|
/** Left edge and width of the run `text` painted at `x` with the context's
|
|
33
40
|
* alignment and direction. */
|
|
@@ -60,6 +67,28 @@ export function counterFlipBox(ctx, left, width, paint) {
|
|
|
60
67
|
ctx.restore();
|
|
61
68
|
}
|
|
62
69
|
}
|
|
70
|
+
/**
|
|
71
|
+
* Paint, with `paint`, a run made of several `fillText`s (the pieces of a
|
|
72
|
+
* word) whose box is `[left, left + width]`: inside a mirrored frame the
|
|
73
|
+
* run is turned back once, about that box, and each call of `paint` lands
|
|
74
|
+
* as on a left-to-right page, so the pieces keep their reading order and
|
|
75
|
+
* their places in the run. Turned one by one, each about its own box, they
|
|
76
|
+
* would stand where the mirror puts them: the first at the right end.
|
|
77
|
+
* Outside a mirrored frame it just paints.
|
|
78
|
+
*/
|
|
79
|
+
export function paintAsOneRun(ctx, left, width, paint) {
|
|
80
|
+
if (!mirroredPaintActive() || whole > 0) {
|
|
81
|
+
paint();
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
whole++;
|
|
85
|
+
try {
|
|
86
|
+
counterFlipBox(ctx, left, width, paint);
|
|
87
|
+
}
|
|
88
|
+
finally {
|
|
89
|
+
whole--;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
63
92
|
/** Width of an image source as `drawImage` with no size takes it. */
|
|
64
93
|
function sourceWidth(image) {
|
|
65
94
|
const s = image;
|
|
@@ -88,24 +117,39 @@ export function beginMirroredFlow(ctx, originX) {
|
|
|
88
117
|
const drawImage = ctx.drawImage;
|
|
89
118
|
const target = ctx;
|
|
90
119
|
target.fillText = function (text, x, y, maxWidth) {
|
|
91
|
-
const
|
|
92
|
-
counterFlipBox(ctx, left, width, () => {
|
|
120
|
+
const put = () => {
|
|
93
121
|
if (maxWidth === undefined)
|
|
94
122
|
fillText.call(ctx, text, x, y);
|
|
95
123
|
else
|
|
96
124
|
fillText.call(ctx, text, x, y, maxWidth);
|
|
97
|
-
}
|
|
125
|
+
};
|
|
126
|
+
// A piece of a run already turned back (`paintAsOneRun`).
|
|
127
|
+
if (whole > 0) {
|
|
128
|
+
put();
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
const { left, width } = runBox(ctx, text, x, maxWidth);
|
|
132
|
+
counterFlipBox(ctx, left, width, put);
|
|
98
133
|
};
|
|
99
134
|
target.strokeText = function (text, x, y, maxWidth) {
|
|
100
|
-
const
|
|
101
|
-
counterFlipBox(ctx, left, width, () => {
|
|
135
|
+
const put = () => {
|
|
102
136
|
if (maxWidth === undefined)
|
|
103
137
|
strokeText.call(ctx, text, x, y);
|
|
104
138
|
else
|
|
105
139
|
strokeText.call(ctx, text, x, y, maxWidth);
|
|
106
|
-
}
|
|
140
|
+
};
|
|
141
|
+
if (whole > 0) {
|
|
142
|
+
put();
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
const { left, width } = runBox(ctx, text, x, maxWidth);
|
|
146
|
+
counterFlipBox(ctx, left, width, put);
|
|
107
147
|
};
|
|
108
148
|
target.drawImage = function (...args) {
|
|
149
|
+
if (whole > 0) {
|
|
150
|
+
drawImage.apply(ctx, args);
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
109
153
|
const image = args[0];
|
|
110
154
|
// drawImage(image, dx, dy[, dw, dh]) or (image, sx, sy, sw, sh, dx, dy, dw, dh).
|
|
111
155
|
const dx = (args.length >= 9 ? args[5] : args[1]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mirrorFrame.js","sourceRoot":"","sources":["../../src/canvas-backend/mirrorFrame.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"mirrorFrame.js","sourceRoot":"","sources":["../../src/canvas-backend/mirrorFrame.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,6 +17,19 @@
|
|
|
17
17
|
* letter-spacing, is not their natural width. A word the browser shapes
|
|
18
18
|
* the same either way (nearly all of them) is painted as before, with one
|
|
19
19
|
* `fillText`.
|
|
20
|
+
*
|
|
21
|
+
* Two rules of direction (#685):
|
|
22
|
+
* - the pieces are one run. On a right-to-left page, painted through a
|
|
23
|
+
* mirror that turns every `fillText` back about its own box
|
|
24
|
+
* (`mirrorFrame.ts`), the word is turned once, about the box it was
|
|
25
|
+
* measured in, and its pieces are set inside it from its left end, as on
|
|
26
|
+
* a left-to-right page. Turned one by one they stood in the mirror's
|
|
27
|
+
* order: "five" read "vefi";
|
|
28
|
+
* - a word that holds a right-to-left letter (Hebrew, Arabic…) or a letter
|
|
29
|
+
* of a joining script is never cut, whoever asks: its letters run the
|
|
30
|
+
* other way, and an Arabic word painted in pieces loses its joins. The
|
|
31
|
+
* painters already keep such words away (`fillSegmentWord`); this is the
|
|
32
|
+
* rule where the cut is made.
|
|
20
33
|
*/
|
|
21
34
|
/** One piece of a word painted apart from the rest. */
|
|
22
35
|
export interface TrackedPiece {
|
|
@@ -41,15 +54,19 @@ export declare function shapedOtherwise(ctx: CanvasRenderingContext2D, text: str
|
|
|
41
54
|
/**
|
|
42
55
|
* The pieces a tracked word is painted in, in the context's font, or null
|
|
43
56
|
* when it is painted whole (the browser shapes it the same under
|
|
44
|
-
* letter-spacing,
|
|
45
|
-
* `letterSpacing` is put
|
|
57
|
+
* letter-spacing, the context measures none, or the word holds a
|
|
58
|
+
* right-to-left or joining letter). The context's `letterSpacing` is put
|
|
59
|
+
* back as it was found.
|
|
46
60
|
*/
|
|
47
61
|
export declare function trackedPieces(ctx: CanvasRenderingContext2D, text: string): readonly TrackedPiece[] | null;
|
|
48
62
|
/**
|
|
49
63
|
* Paint a word of a tracked line with `paint` (the caller's `fillText`) at
|
|
50
|
-
* `x`, `y
|
|
51
|
-
*
|
|
52
|
-
*
|
|
64
|
+
* `x`, `y`: its left end on a left-to-right page, the start of its box in
|
|
65
|
+
* a mirrored frame. `tracking` is the context's `letterSpacing` on entry,
|
|
66
|
+
* px, and on return. A word that would lose its ligatures to it is painted
|
|
67
|
+
* in its {@link trackedPieces}, as one run (`paintAsOneRun`): its box is
|
|
68
|
+
* the one the frame turns a word painted whole about, its natural width
|
|
69
|
+
* and the tracking after each letter. Any other word with one `paint`.
|
|
53
70
|
*/
|
|
54
71
|
export declare function fillTrackedWord(ctx: CanvasRenderingContext2D, text: string, x: number, y: number, tracking: number, paint: (text: string, x: number, y: number) => void): void;
|
|
55
72
|
//# sourceMappingURL=trackedText.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trackedText.d.ts","sourceRoot":"","sources":["../../src/canvas-backend/trackedText.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"trackedText.d.ts","sourceRoot":"","sources":["../../src/canvas-backend/trackedText.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,uDAAuD;AACvD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,+EAA+E;IAC/E,MAAM,EAAE,MAAM,CAAC;IACf;iDAC6C;IAC7C,YAAY,EAAE,MAAM,CAAC;IACrB,kDAAkD;IAClD,QAAQ,EAAE,OAAO,CAAC;CACnB;AA+HD;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,wBAAwB,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAMpF;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,wBAAwB,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,YAAY,EAAE,GAAG,IAAI,CAEzG;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,wBAAwB,EAC7B,IAAI,EAAE,MAAM,EACZ,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,IAAI,GAClD,IAAI,CAaN"}
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
+
import { needsBidi } from '../bidi';
|
|
1
2
|
import { graphemesOf } from '../measure/graphemes';
|
|
3
|
+
import { joiningScriptIn } from '../measure/joining';
|
|
4
|
+
import { paintAsOneRun } from './mirrorFrame';
|
|
2
5
|
/** Letter-spacing the words are probed with, px. */
|
|
3
6
|
const PROBE = 1;
|
|
4
7
|
/** Least difference, px, between a word's natural width and its width
|
|
@@ -12,9 +15,14 @@ const knownByFont = new Map();
|
|
|
12
15
|
function known(font) {
|
|
13
16
|
let k = knownByFont.get(font);
|
|
14
17
|
if (!k)
|
|
15
|
-
knownByFont.set(font, k = { otherwise: new Map(),
|
|
18
|
+
knownByFont.set(font, k = { otherwise: new Map(), words: new Map() });
|
|
16
19
|
return k;
|
|
17
20
|
}
|
|
21
|
+
/** Whether `text` may be painted in pieces at all: no right-to-left letter
|
|
22
|
+
* in it and no letter of a joining script (see the module comment). */
|
|
23
|
+
function divisible(text) {
|
|
24
|
+
return !needsBidi(text) && !joiningScriptIn(text);
|
|
25
|
+
}
|
|
18
26
|
function widthAt(ctx, text, spacing) {
|
|
19
27
|
ctx.letterSpacing = `${spacing}px`;
|
|
20
28
|
return ctx.measureText(text).width;
|
|
@@ -43,7 +51,9 @@ function otherwise(ctx, font, text) {
|
|
|
43
51
|
}
|
|
44
52
|
return changed;
|
|
45
53
|
}
|
|
46
|
-
function
|
|
54
|
+
function wordOf(ctx, font, text) {
|
|
55
|
+
if (!divisible(text))
|
|
56
|
+
return null;
|
|
47
57
|
const letters = graphemesOf(text);
|
|
48
58
|
if (letters.length < 2 || !otherwise(ctx, font, text))
|
|
49
59
|
return null;
|
|
@@ -71,7 +81,7 @@ function piecesOf(ctx, font, text) {
|
|
|
71
81
|
ctx.letterSpacing = '0px';
|
|
72
82
|
const natural = (from, to) => ctx.measureText(letters.slice(from, to).join('')).width;
|
|
73
83
|
let glyphs = 0;
|
|
74
|
-
|
|
84
|
+
const pieces = groups.map((g) => {
|
|
75
85
|
// Up to the piece's first letter in the natural shaping, the kerning
|
|
76
86
|
// before it counted: the pieces meet as the whole word's letters do.
|
|
77
87
|
const offset = g.start === 0 ? 0 : natural(0, g.start + 1) - natural(g.start, g.start + 1);
|
|
@@ -79,6 +89,24 @@ function piecesOf(ctx, font, text) {
|
|
|
79
89
|
glyphs += g.ligature ? 1 : g.end - g.start;
|
|
80
90
|
return piece;
|
|
81
91
|
});
|
|
92
|
+
return { pieces, natural: natural(0, letters.length), letters: letters.length };
|
|
93
|
+
}
|
|
94
|
+
/** {@link trackedPieces} with the word's measures. */
|
|
95
|
+
function trackedWord(ctx, text) {
|
|
96
|
+
if (text.length < 2 || !measures(ctx))
|
|
97
|
+
return null;
|
|
98
|
+
const font = ctx.font;
|
|
99
|
+
const { words } = known(font);
|
|
100
|
+
let word = words.get(text);
|
|
101
|
+
if (word === undefined) {
|
|
102
|
+
const spacing = ctx.letterSpacing;
|
|
103
|
+
word = wordOf(ctx, font, text);
|
|
104
|
+
ctx.letterSpacing = spacing;
|
|
105
|
+
if (words.size >= MAX_WORDS)
|
|
106
|
+
words.clear();
|
|
107
|
+
words.set(text, word);
|
|
108
|
+
}
|
|
109
|
+
return word;
|
|
82
110
|
}
|
|
83
111
|
/** Whether the context can be asked: it has a `letterSpacing` and measures. */
|
|
84
112
|
function measures(ctx) {
|
|
@@ -103,43 +131,36 @@ export function shapedOtherwise(ctx, text) {
|
|
|
103
131
|
/**
|
|
104
132
|
* The pieces a tracked word is painted in, in the context's font, or null
|
|
105
133
|
* when it is painted whole (the browser shapes it the same under
|
|
106
|
-
* letter-spacing,
|
|
107
|
-
* `letterSpacing` is put
|
|
134
|
+
* letter-spacing, the context measures none, or the word holds a
|
|
135
|
+
* right-to-left or joining letter). The context's `letterSpacing` is put
|
|
136
|
+
* back as it was found.
|
|
108
137
|
*/
|
|
109
138
|
export function trackedPieces(ctx, text) {
|
|
110
|
-
|
|
111
|
-
return null;
|
|
112
|
-
const font = ctx.font;
|
|
113
|
-
const { pieces: words } = known(font);
|
|
114
|
-
let pieces = words.get(text);
|
|
115
|
-
if (pieces === undefined) {
|
|
116
|
-
const spacing = ctx.letterSpacing;
|
|
117
|
-
pieces = piecesOf(ctx, font, text);
|
|
118
|
-
ctx.letterSpacing = spacing;
|
|
119
|
-
if (words.size >= MAX_WORDS)
|
|
120
|
-
words.clear();
|
|
121
|
-
words.set(text, pieces);
|
|
122
|
-
}
|
|
123
|
-
return pieces;
|
|
139
|
+
return trackedWord(ctx, text)?.pieces ?? null;
|
|
124
140
|
}
|
|
125
141
|
/**
|
|
126
142
|
* Paint a word of a tracked line with `paint` (the caller's `fillText`) at
|
|
127
|
-
* `x`, `y
|
|
128
|
-
*
|
|
129
|
-
*
|
|
143
|
+
* `x`, `y`: its left end on a left-to-right page, the start of its box in
|
|
144
|
+
* a mirrored frame. `tracking` is the context's `letterSpacing` on entry,
|
|
145
|
+
* px, and on return. A word that would lose its ligatures to it is painted
|
|
146
|
+
* in its {@link trackedPieces}, as one run (`paintAsOneRun`): its box is
|
|
147
|
+
* the one the frame turns a word painted whole about, its natural width
|
|
148
|
+
* and the tracking after each letter. Any other word with one `paint`.
|
|
130
149
|
*/
|
|
131
150
|
export function fillTrackedWord(ctx, text, x, y, tracking, paint) {
|
|
132
|
-
const
|
|
133
|
-
if (!
|
|
151
|
+
const word = tracking !== 0 ? trackedWord(ctx, text) : null;
|
|
152
|
+
if (!word) {
|
|
134
153
|
paint(text, x, y);
|
|
135
154
|
return;
|
|
136
155
|
}
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
156
|
+
paintAsOneRun(ctx, x, word.natural + tracking * word.letters, () => {
|
|
157
|
+
for (const piece of word.pieces) {
|
|
158
|
+
if (piece.ligature)
|
|
159
|
+
ctx.letterSpacing = '0px';
|
|
160
|
+
paint(piece.text, x + piece.offset + tracking * piece.glyphsBefore, y);
|
|
161
|
+
if (piece.ligature)
|
|
162
|
+
ctx.letterSpacing = `${tracking}px`;
|
|
163
|
+
}
|
|
164
|
+
});
|
|
144
165
|
}
|
|
145
166
|
//# sourceMappingURL=trackedText.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trackedText.js","sourceRoot":"","sources":["../../src/canvas-backend/trackedText.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"trackedText.js","sourceRoot":"","sources":["../../src/canvas-backend/trackedText.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,7 +19,9 @@ export type WordRun = NonNullable<VDTLineSegment['runs']>[number];
|
|
|
19
19
|
*
|
|
20
20
|
* A left-to-right word of a tracked line that the browser would shape
|
|
21
21
|
* without its ligatures under letter-spacing is painted with them, as it
|
|
22
|
-
* was measured (`fillTrackedWord`, #663)
|
|
22
|
+
* was measured (`fillTrackedWord`, #663): in pieces, which a mirrored page
|
|
23
|
+
* turns back as one run (#685). A right-to-left word and a word of a
|
|
24
|
+
* joining script are never painted in pieces.
|
|
23
25
|
*/
|
|
24
26
|
export declare function fillSegmentWord(ctx: CanvasRenderingContext2D, seg: VDTLineSegment, x: number, y: number, tracking: number, paint: (text: string, x: number, y: number) => void, runStyle: (run: WordRun) => {
|
|
25
27
|
font: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wordRuns.d.ts","sourceRoot":"","sources":["../../src/canvas-backend/wordRuns.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAK7C,8EAA8E;AAC9E,MAAM,MAAM,OAAO,GAAG,WAAW,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AAQlE
|
|
1
|
+
{"version":3,"file":"wordRuns.d.ts","sourceRoot":"","sources":["../../src/canvas-backend/wordRuns.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAK7C,8EAA8E;AAC9E,MAAM,MAAM,OAAO,GAAG,WAAW,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AAQlE;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,wBAAwB,EAC7B,GAAG,EAAE,cAAc,EACnB,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,IAAI,EACnD,QAAQ,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACzD,IAAI,CAkBN;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,aAAa,CAC3B,GAAG,EAAE,wBAAwB,EAC7B,GAAG,EAAE,cAAc,EACnB,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,IAAI,EACnD,QAAQ,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACzD,IAAI,CAsCN"}
|
|
@@ -23,7 +23,9 @@ const MARK_RE = /\p{M}/u;
|
|
|
23
23
|
*
|
|
24
24
|
* A left-to-right word of a tracked line that the browser would shape
|
|
25
25
|
* without its ligatures under letter-spacing is painted with them, as it
|
|
26
|
-
* was measured (`fillTrackedWord`, #663)
|
|
26
|
+
* was measured (`fillTrackedWord`, #663): in pieces, which a mirrored page
|
|
27
|
+
* turns back as one run (#685). A right-to-left word and a word of a
|
|
28
|
+
* joining script are never painted in pieces.
|
|
27
29
|
*/
|
|
28
30
|
export function fillSegmentWord(ctx, seg, x, y, tracking, paint, runStyle) {
|
|
29
31
|
const untracked = tracking !== 0 && joiningScriptIn(seg.text);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wordRuns.js","sourceRoot":"","sources":["../../src/canvas-backend/wordRuns.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAKhD;iDACiD;AACjD,MAAM,UAAU,GAAG,IAAI,CAAC;AAExB,MAAM,OAAO,GAAG,QAAQ,CAAC;AAEzB
|
|
1
|
+
{"version":3,"file":"wordRuns.js","sourceRoot":"","sources":["../../src/canvas-backend/wordRuns.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "postext",
|
|
3
3
|
"description": "A programmable typesetter for the web. Layout engine that applies professional editorial rules — columns, orphan/widow prevention, balanced columns, resource placement, running heads — to semantic content. Built on @chenglou/pretext for DOM-free text measurement.",
|
|
4
|
-
"version": "1.26.
|
|
4
|
+
"version": "1.26.2",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"homepage": "https://postext.dev/",
|