postext 1.59.2 → 1.61.0
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__/exercises/digital.test.js +38 -1
- package/dist/__tests__/exercises/digital.test.js.map +1 -1
- package/dist/__tests__/exercises/followups.test.d.ts +2 -0
- package/dist/__tests__/exercises/followups.test.d.ts.map +1 -0
- package/dist/__tests__/exercises/followups.test.js +235 -0
- package/dist/__tests__/exercises/followups.test.js.map +1 -0
- package/dist/__tests__/exports.test.js +16 -0
- package/dist/__tests__/exports.test.js.map +1 -1
- package/dist/__tests__/figureStyle.test.d.ts +2 -0
- package/dist/__tests__/figureStyle.test.d.ts.map +1 -0
- package/dist/__tests__/figureStyle.test.js +218 -0
- package/dist/__tests__/figureStyle.test.js.map +1 -0
- package/dist/__tests__/headingLetterSpacing.test.js +1 -1
- package/dist/__tests__/headingLetterSpacing.test.js.map +1 -1
- package/dist/__tests__/pipeline/paragraphStyleFaces.test.js +1 -1
- package/dist/__tests__/pipeline/paragraphStyleFaces.test.js.map +1 -1
- package/dist/__tests__/pipeline/spanHeadingMidPage.test.js +76 -0
- package/dist/__tests__/pipeline/spanHeadingMidPage.test.js.map +1 -1
- package/dist/canvas-backend/annotations.d.ts +4 -1
- package/dist/canvas-backend/annotations.d.ts.map +1 -1
- package/dist/canvas-backend/annotations.js +5 -0
- package/dist/canvas-backend/annotations.js.map +1 -1
- package/dist/canvas-backend/chip.d.ts.map +1 -1
- package/dist/canvas-backend/chip.js +4 -0
- package/dist/canvas-backend/chip.js.map +1 -1
- package/dist/canvas-backend/verticalText.d.ts.map +1 -1
- package/dist/canvas-backend/verticalText.js +5 -2
- package/dist/canvas-backend/verticalText.js.map +1 -1
- package/dist/configWarnings.d.ts.map +1 -1
- package/dist/configWarnings.js +18 -4
- package/dist/configWarnings.js.map +1 -1
- package/dist/defaults/bodyText.d.ts.map +1 -1
- package/dist/defaults/bodyText.js +8 -1
- package/dist/defaults/bodyText.js.map +1 -1
- package/dist/defaults/captionStyle.d.ts.map +1 -1
- package/dist/defaults/captionStyle.js +7 -2
- package/dist/defaults/captionStyle.js.map +1 -1
- package/dist/defaults/exercises.d.ts.map +1 -1
- package/dist/defaults/exercises.js +15 -9
- package/dist/defaults/exercises.js.map +1 -1
- package/dist/defaults/headerFooter.d.ts.map +1 -1
- package/dist/defaults/headerFooter.js +3 -1
- package/dist/defaults/headerFooter.js.map +1 -1
- package/dist/defaults/headings.d.ts.map +1 -1
- package/dist/defaults/headings.js +15 -3
- package/dist/defaults/headings.js.map +1 -1
- package/dist/defaults/paragraphStyles.d.ts.map +1 -1
- package/dist/defaults/paragraphStyles.js +4 -1
- package/dist/defaults/paragraphStyles.js.map +1 -1
- package/dist/defaults/tableStyle.d.ts.map +1 -1
- package/dist/defaults/tableStyle.js +5 -2
- package/dist/defaults/tableStyle.js.map +1 -1
- package/dist/design/elementKeys.d.ts +1 -0
- package/dist/design/elementKeys.d.ts.map +1 -1
- package/dist/design/elementKeys.js +1 -1
- package/dist/design/elementKeys.js.map +1 -1
- package/dist/exercises/build.d.ts.map +1 -1
- package/dist/exercises/build.js +1 -0
- package/dist/exercises/build.js.map +1 -1
- package/dist/exercises/configWarnings.d.ts.map +1 -1
- package/dist/exercises/configWarnings.js +6 -2
- package/dist/exercises/configWarnings.js.map +1 -1
- package/dist/exercises/designs.d.ts +5 -0
- package/dist/exercises/designs.d.ts.map +1 -1
- package/dist/exercises/designs.js +45 -16
- package/dist/exercises/designs.js.map +1 -1
- package/dist/exercises/digital.d.ts +7 -0
- package/dist/exercises/digital.d.ts.map +1 -1
- package/dist/exercises/digital.js +8 -1
- package/dist/exercises/digital.js.map +1 -1
- package/dist/exercises/expand.d.ts +6 -0
- package/dist/exercises/expand.d.ts.map +1 -1
- package/dist/exercises/expand.js +108 -20
- package/dist/exercises/expand.js.map +1 -1
- package/dist/exercises/grids.d.ts.map +1 -1
- package/dist/exercises/grids.js +76 -16
- package/dist/exercises/grids.js.map +1 -1
- package/dist/exercises/model.d.ts +4 -1
- package/dist/exercises/model.d.ts.map +1 -1
- package/dist/exercises/model.js +56 -15
- package/dist/exercises/model.js.map +1 -1
- package/dist/exercises/record.d.ts +9 -1
- package/dist/exercises/record.d.ts.map +1 -1
- package/dist/exercises/runtime.d.ts +6 -0
- package/dist/exercises/runtime.d.ts.map +1 -1
- package/dist/exercises/runtime.js +485 -69
- package/dist/exercises/runtime.js.map +1 -1
- package/dist/exercises/styles.d.ts +1 -0
- package/dist/exercises/styles.d.ts.map +1 -1
- package/dist/exercises/styles.js +3 -0
- package/dist/exercises/styles.js.map +1 -1
- package/dist/fonts/featureFaces.d.ts +32 -0
- package/dist/fonts/featureFaces.d.ts.map +1 -0
- package/dist/fonts/featureFaces.js +166 -0
- package/dist/fonts/featureFaces.js.map +1 -0
- package/dist/fonts/figureStyle.d.ts +69 -0
- package/dist/fonts/figureStyle.d.ts.map +1 -0
- package/dist/fonts/figureStyle.js +196 -0
- package/dist/fonts/figureStyle.js.map +1 -0
- package/dist/fonts/freezeFeatures.d.ts +10 -0
- package/dist/fonts/freezeFeatures.d.ts.map +1 -0
- package/dist/fonts/freezeFeatures.js +372 -0
- package/dist/fonts/freezeFeatures.js.map +1 -0
- package/dist/fonts/glyphFallback.d.ts.map +1 -1
- package/dist/fonts/glyphFallback.js +6 -3
- package/dist/fonts/glyphFallback.js.map +1 -1
- package/dist/fonts/prepare.d.ts.map +1 -1
- package/dist/fonts/prepare.js +22 -4
- package/dist/fonts/prepare.js.map +1 -1
- package/dist/fonts/usage.d.ts +10 -0
- package/dist/fonts/usage.d.ts.map +1 -1
- package/dist/fonts/usage.js +97 -0
- package/dist/fonts/usage.js.map +1 -1
- package/dist/html-backend.d.ts.map +1 -1
- package/dist/html-backend.js +27 -16
- package/dist/html-backend.js.map +1 -1
- package/dist/htmlAnnotations.d.ts +5 -1
- package/dist/htmlAnnotations.d.ts.map +1 -1
- package/dist/htmlAnnotations.js +6 -0
- package/dist/htmlAnnotations.js.map +1 -1
- package/dist/index.d.ts +7 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/measure/cache.js +3 -3
- package/dist/measure/cache.js.map +1 -1
- package/dist/measure/rich.d.ts.map +1 -1
- package/dist/measure/rich.js +72 -4
- package/dist/measure/rich.js.map +1 -1
- package/dist/parse/types.d.ts +3 -0
- package/dist/parse/types.d.ts.map +1 -1
- package/dist/pipeline/build.d.ts.map +1 -1
- package/dist/pipeline/build.js +38 -7
- package/dist/pipeline/build.js.map +1 -1
- package/dist/pipeline/headingStyles.d.ts.map +1 -1
- package/dist/pipeline/headingStyles.js +3 -0
- package/dist/pipeline/headingStyles.js.map +1 -1
- package/dist/types.d.ts +61 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/vdt.d.ts +5 -0
- package/dist/vdt.d.ts.map +1 -1
- package/dist/vdt.js.map +1 -1
- package/dist/worker/client.d.ts.map +1 -1
- package/dist/worker/client.js +13 -2
- package/dist/worker/client.js.map +1 -1
- package/dist/worker/fonts.d.ts +1 -1
- package/dist/worker/fonts.d.ts.map +1 -1
- package/dist/worker/fonts.js +1 -1
- package/dist/worker/fonts.js.map +1 -1
- package/dist/worker/protocol.d.ts +4 -0
- package/dist/worker/protocol.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -55,6 +55,24 @@ export function textElement(id, content, xPt, yPt, wPt, hPt, sizePt, extra = {})
|
|
|
55
55
|
};
|
|
56
56
|
}
|
|
57
57
|
const r = (n) => String(Math.round(n * 100) / 100);
|
|
58
|
+
/** Where the groups of an area's squares stand (see {@link AreaSpec.cells}):
|
|
59
|
+
* each one's first cell, column and row of cells, a cell and the rows of
|
|
60
|
+
* a group apart. */
|
|
61
|
+
function cellGroups(cells, cols, lines) {
|
|
62
|
+
const at = [];
|
|
63
|
+
let c = 0;
|
|
64
|
+
let r = 0;
|
|
65
|
+
for (const n0 of cells) {
|
|
66
|
+
const n = Math.max(1, Math.min(cols, Math.floor(n0)));
|
|
67
|
+
if (c > 0 && c + n > cols) {
|
|
68
|
+
c = 0;
|
|
69
|
+
r += lines + 0.5;
|
|
70
|
+
}
|
|
71
|
+
at.push({ c, r, n });
|
|
72
|
+
c += n + 1;
|
|
73
|
+
}
|
|
74
|
+
return { at, rows: r + lines };
|
|
75
|
+
}
|
|
58
76
|
/** The elements and height of a writing area. */
|
|
59
77
|
export function areaElements(a) {
|
|
60
78
|
const n = Math.max(1, Math.floor(a.lines));
|
|
@@ -74,21 +92,29 @@ export function areaElements(a) {
|
|
|
74
92
|
case 'grid':
|
|
75
93
|
case 'tianzige': {
|
|
76
94
|
const cols = Math.max(1, Math.floor(w / sp));
|
|
77
|
-
|
|
95
|
+
// The groups of squares (`cells`), else one as wide as the measure.
|
|
96
|
+
const groups = a.cells && a.cells.length > 0 ? cellGroups(a.cells, cols, n) : { at: [{ c: 0, r: 0, n: cols }], rows: n };
|
|
97
|
+
h = groups.rows * sp;
|
|
98
|
+
const gw = Math.max(...groups.at.map((g) => (g.c + g.n) * sp));
|
|
78
99
|
let d = '';
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
let
|
|
100
|
+
let x = '';
|
|
101
|
+
for (const g of groups.at) {
|
|
102
|
+
const x0 = g.c * sp;
|
|
103
|
+
const y0 = g.r * sp;
|
|
104
|
+
const x1 = (g.c + g.n) * sp;
|
|
105
|
+
const y1 = (g.r + n) * sp;
|
|
106
|
+
for (let i = 0; i <= n; i++)
|
|
107
|
+
d += `M${r(x0)} ${r(y0 + i * sp)}H${r(x1)}`;
|
|
108
|
+
for (let j = 0; j <= g.n; j++)
|
|
109
|
+
d += `M${r(x0 + j * sp)} ${r(y0)}V${r(y1)}`;
|
|
86
110
|
for (let i = 0; i < n; i++)
|
|
87
|
-
x += `
|
|
88
|
-
for (let j = 0; j <
|
|
89
|
-
x += `M${r((j + 0.5) * sp)}
|
|
90
|
-
els.push(pathElement('cross', x, gw, h, a.color, a.weightPt * 0.6, { dash: [PT(a.weightPt * 3), PT(a.weightPt * 3)] }));
|
|
111
|
+
x += `M${r(x0)} ${r(y0 + (i + 0.5) * sp)}H${r(x1)}`;
|
|
112
|
+
for (let j = 0; j < g.n; j++)
|
|
113
|
+
x += `M${r(x0 + (j + 0.5) * sp)} ${r(y0)}V${r(y1)}`;
|
|
91
114
|
}
|
|
115
|
+
els.push(pathElement('area', d, gw, h, a.color, a.weightPt));
|
|
116
|
+
if (a.kind === 'tianzige')
|
|
117
|
+
els.push(pathElement('cross', x, gw, h, a.color, a.weightPt * 0.6, { dash: [PT(a.weightPt * 3), PT(a.weightPt * 3)] }));
|
|
92
118
|
break;
|
|
93
119
|
}
|
|
94
120
|
case 'seyes': {
|
|
@@ -117,13 +143,16 @@ export function areaElements(a) {
|
|
|
117
143
|
}
|
|
118
144
|
if (a.answers && a.answerColor && (a.kind === 'grid' || a.kind === 'tianzige')) {
|
|
119
145
|
// On squares a model answer is written a character to a square, row
|
|
120
|
-
// after row, as a pupil writes on 田字格 or
|
|
146
|
+
// after row (group after group), as a pupil writes on 田字格 or
|
|
147
|
+
// squared paper.
|
|
121
148
|
const cols = Math.max(1, Math.floor(w / sp));
|
|
122
|
-
const
|
|
123
|
-
|
|
149
|
+
const groups = a.cells && a.cells.length > 0 ? cellGroups(a.cells, cols, n).at : [{ c: 0, r: 0, n: cols }];
|
|
150
|
+
const squares = groups.flatMap((g) => Array.from({ length: g.n * n }, (_, k) => ({ x: (g.c + (k % g.n)) * sp, y: (g.r + Math.floor(k / g.n)) * sp })));
|
|
151
|
+
const chars = graphemesOf(a.answers.join('')).filter((ch) => !(a.cells && ch.trim() === ''));
|
|
152
|
+
chars.slice(0, squares.length).forEach((ch, k) => {
|
|
124
153
|
if (ch.trim() === '')
|
|
125
154
|
return;
|
|
126
|
-
els.push(textElement(`answer${k}`, ch,
|
|
155
|
+
els.push(textElement(`answer${k}`, ch, squares[k].x, squares[k].y, sp, sp, sp * 0.62, {
|
|
127
156
|
color: a.answerColor, overflow: 'clip', ...(a.answerFont ? { fontFamily: a.answerFont } : {}),
|
|
128
157
|
}));
|
|
129
158
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"designs.js","sourceRoot":"","sources":["../../src/exercises/designs.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"designs.js","sourceRoot":"","sources":["../../src/exercises/designs.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,6 +21,8 @@ export interface ExerciseDigitalStyleInfo {
|
|
|
21
21
|
marker: 'none' | 'box' | 'circle';
|
|
22
22
|
/** The true and false labels (`trueFalse.labels`). */
|
|
23
23
|
trueFalse: [string, string];
|
|
24
|
+
/** The matching dots' colour (`match.color`): the lines a reader draws. */
|
|
25
|
+
ink: string;
|
|
24
26
|
}
|
|
25
27
|
export interface ExerciseDigital {
|
|
26
28
|
words: ExerciseDigitalWords;
|
|
@@ -40,6 +42,8 @@ export interface ExerciseData extends ExerciseDigital {
|
|
|
40
42
|
pxPerPt: number;
|
|
41
43
|
/** The body text's size, page pixels: the size of the exercise bar. */
|
|
42
44
|
bodyPx: number;
|
|
45
|
+
/** The body text's colour: what a reader types is set in it. */
|
|
46
|
+
text?: string;
|
|
43
47
|
/** The boxes stand in the text's flow (a reflowable book) rather than
|
|
44
48
|
* on a positioned page: the bar and the solution follow the box, sized
|
|
45
49
|
* in ems of its text. */
|
|
@@ -58,6 +62,9 @@ export declare function exerciseDataOf(doc: {
|
|
|
58
62
|
};
|
|
59
63
|
bodyText: {
|
|
60
64
|
fontSize: Dimension;
|
|
65
|
+
color?: {
|
|
66
|
+
hex: string;
|
|
67
|
+
};
|
|
61
68
|
};
|
|
62
69
|
};
|
|
63
70
|
}): ExerciseData | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"digital.d.ts","sourceRoot":"","sources":["../../src/exercises/digital.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAChF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAG7C,kEAAkE;AAClE,MAAM,MAAM,oBAAoB,GAAG,IAAI,CAAC,aAAa,EACnD,UAAU,GAAG,WAAW,GAAG,OAAO,GAAG,cAAc,GAAG,cAAc,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC,CAAC;AAErI,6CAA6C;AAC7C,MAAM,WAAW,wBAAwB;IACvC,kEAAkE;IAClE,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf;gCAC4B;IAC5B,MAAM,EAAE,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAC;IAClC,sDAAsD;IACtD,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"digital.d.ts","sourceRoot":"","sources":["../../src/exercises/digital.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAChF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAG7C,kEAAkE;AAClE,MAAM,MAAM,oBAAoB,GAAG,IAAI,CAAC,aAAa,EACnD,UAAU,GAAG,WAAW,GAAG,OAAO,GAAG,cAAc,GAAG,cAAc,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC,CAAC;AAErI,6CAA6C;AAC7C,MAAM,WAAW,wBAAwB;IACvC,kEAAkE;IAClE,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf;gCAC4B;IAC5B,MAAM,EAAE,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAC;IAClC,sDAAsD;IACtD,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,2EAA2E;IAC3E,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,oBAAoB,CAAC;IAC5B,2BAA2B;IAC3B,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC;CAClD;AAED,0DAA0D;AAC1D,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,eAAe,CAwB7E;AAED;iEACiE;AACjE,MAAM,WAAW,YAAa,SAAQ,eAAe;IACnD;uCACmC;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,uEAAuE;IACvE,MAAM,EAAE,MAAM,CAAC;IACf,gEAAgE;IAChE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;8BAE0B;IAC1B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,cAAc,EAAE,CAAC;CAC7B;AAED;;+CAE+C;AAC/C,wBAAgB,cAAc,CAAC,GAAG,EAAE;IAClC,SAAS,CAAC,EAAE,cAAc,EAAE,CAAC;IAC7B,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,MAAM,EAAE;QAAE,IAAI,EAAE;YAAE,GAAG,EAAE,MAAM,CAAA;SAAE,CAAC;QAAC,QAAQ,EAAE;YAAE,QAAQ,EAAE,SAAS,CAAC;YAAC,KAAK,CAAC,EAAE;gBAAE,GAAG,EAAE,MAAM,CAAA;aAAE,CAAA;SAAE,CAAA;KAAE,CAAC;CAC/F,GAAG,YAAY,GAAG,SAAS,CAY3B;AAED;;;eAGe;AACf,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAO3D"}
|
|
@@ -19,6 +19,7 @@ export function exerciseDigitalOf(settings) {
|
|
|
19
19
|
answer: s.answers.color.hex,
|
|
20
20
|
marker: s.options.marker === 'box' || s.options.marker === 'circle' ? s.options.marker : 'none',
|
|
21
21
|
trueFalse: [s.trueFalse.labels[0], s.trueFalse.labels[1]],
|
|
22
|
+
ink: s.match.color.hex,
|
|
22
23
|
};
|
|
23
24
|
}
|
|
24
25
|
return {
|
|
@@ -41,7 +42,13 @@ export function exerciseDataOf(doc) {
|
|
|
41
42
|
if (!records || records.length === 0 || !digital || !digital.interactive)
|
|
42
43
|
return undefined;
|
|
43
44
|
const pxPerPt = doc.config.page.dpi / 72;
|
|
44
|
-
return {
|
|
45
|
+
return {
|
|
46
|
+
...digital,
|
|
47
|
+
pxPerPt,
|
|
48
|
+
bodyPx: dimensionToPx(doc.config.bodyText.fontSize, doc.config.page.dpi),
|
|
49
|
+
...(doc.config.bodyText.color ? { text: doc.config.bodyText.color.hex } : {}),
|
|
50
|
+
exercises: records,
|
|
51
|
+
};
|
|
45
52
|
}
|
|
46
53
|
/** `data` as the text of a `<script type="application/json">`, in HTML
|
|
47
54
|
* or XHTML: no `<` that would close the element early, no `&` an XML
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"digital.js","sourceRoot":"","sources":["../../src/exercises/digital.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"digital.js","sourceRoot":"","sources":["../../src/exercises/digital.ts"],"names":[],"mappings":"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"}
|
|
@@ -32,6 +32,8 @@ export interface ExpandContext {
|
|
|
32
32
|
measurePt: number;
|
|
33
33
|
/** A right-to-left document (its designs are mirrored). */
|
|
34
34
|
rtl?: boolean;
|
|
35
|
+
/** A vertical page (縦組み): items are numbered ①, ②. */
|
|
36
|
+
vertical?: boolean;
|
|
35
37
|
/** The text's font family: drawn letters (grids, matching) use it. */
|
|
36
38
|
bodyFont?: string;
|
|
37
39
|
/** Ids of the configured box styles (a style's `box` must name one). */
|
|
@@ -66,6 +68,10 @@ export declare function numberExercises(blocks: readonly ContentBlock[], exercis
|
|
|
66
68
|
* a `:::solutions` line becomes the solutions the book prints there.
|
|
67
69
|
*/
|
|
68
70
|
export declare function expandExercises(blocks: readonly ContentBlock[], ctx: ExpandContext): ExerciseExpansion;
|
|
71
|
+
/** The words of `text` (start and end), as the language divides them:
|
|
72
|
+
* `Intl.Segmenter` where the runtime has it (Chinese and Japanese words
|
|
73
|
+
* too), else runs of letters and digits. */
|
|
74
|
+
export declare function wordRanges(text: string, locale?: string): Array<[number, number]>;
|
|
69
75
|
/** A length in points, `em` read against `sizePt`. */
|
|
70
76
|
export declare function dimPt(d: {
|
|
71
77
|
value: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expand.d.ts","sourceRoot":"","sources":["../../src/exercises/expand.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAuD,MAAM,mBAAmB,CAAC;AAE3G,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,WAAW,EAAE,eAAe,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACzI,OAAO,KAAK,EAAE,gBAAgB,EAAkD,MAAM,0BAA0B,CAAC;AAIjH,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAM/D,OAAO,KAAK,EAAoB,cAAc,EAAgB,MAAM,aAAa,CAAC;AAElF;;;yBAGyB;AACzB,eAAO,MAAM,uBAAuB,aAAgB,CAAC;AAErD,kDAAkD;AAClD,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,wCAAwC;IACxC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,wEAAwE;IACxE,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,wEAAwE;IACxE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,kEAAkE;IAClE,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,2DAA2D;IAC3D,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,sEAAsE;IACtE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wEAAwE;IACxE,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC5B;+EAC2E;IAC3E,SAAS,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC;uDACmD;IACnD,OAAO,CAAC,EAAE,SAAS,YAAY,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,oCAAoC;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAC5B,eAAe,EAAE,oBAAoB,EAAE,CAAC;IACxC,UAAU,EAAE,eAAe,EAAE,CAAC;IAC9B,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,6DAA6D;IAC7D,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAyCD;4CAC4C;AAC5C,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,EAAE,SAAS,EAAE,aAAa,EAAE,EAAE,GAAG,EAAE,aAAa,GAAG;IAAE,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CA6BnL;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,EAAE,GAAG,EAAE,aAAa,GAAG,iBAAiB,CAmGtG;
|
|
1
|
+
{"version":3,"file":"expand.d.ts","sourceRoot":"","sources":["../../src/exercises/expand.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAuD,MAAM,mBAAmB,CAAC;AAE3G,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,WAAW,EAAE,eAAe,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACzI,OAAO,KAAK,EAAE,gBAAgB,EAAkD,MAAM,0BAA0B,CAAC;AAIjH,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAM/D,OAAO,KAAK,EAAoB,cAAc,EAAgB,MAAM,aAAa,CAAC;AAElF;;;yBAGyB;AACzB,eAAO,MAAM,uBAAuB,aAAgB,CAAC;AAErD,kDAAkD;AAClD,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,wCAAwC;IACxC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,wEAAwE;IACxE,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,wEAAwE;IACxE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,kEAAkE;IAClE,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,2DAA2D;IAC3D,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,sDAAsD;IACtD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,sEAAsE;IACtE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wEAAwE;IACxE,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC5B;+EAC2E;IAC3E,SAAS,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC;uDACmD;IACnD,OAAO,CAAC,EAAE,SAAS,YAAY,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,oCAAoC;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAC5B,eAAe,EAAE,oBAAoB,EAAE,CAAC;IACxC,UAAU,EAAE,eAAe,EAAE,CAAC;IAC9B,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,6DAA6D;IAC7D,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAyCD;4CAC4C;AAC5C,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,EAAE,SAAS,EAAE,aAAa,EAAE,EAAE,GAAG,EAAE,aAAa,GAAG;IAAE,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CA6BnL;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,EAAE,GAAG,EAAE,aAAa,GAAG,iBAAiB,CAmGtG;AAw6BD;;6CAE6C;AAC7C,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAUjF;AAED,sDAAsD;AACtD,wBAAgB,KAAK,CAAC,CAAC,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAShF"}
|
package/dist/exercises/expand.js
CHANGED
|
@@ -217,7 +217,7 @@ function bookSolutions(entries, style, book, heading, at, newId, ctx) {
|
|
|
217
217
|
}
|
|
218
218
|
const lines = [ex.key, ...(sol.layout === 'full' ? ex.solution ?? [] : [])].filter(Boolean);
|
|
219
219
|
lines.forEach((line, k) => {
|
|
220
|
-
const lead = k === 0 ? textRun(`${e.number}${style.number.suffix || '.'}`, at, { bold:
|
|
220
|
+
const lead = k === 0 ? textRun(`${e.number}${style.number.suffix || '.'}`, at, { bold: style.number.fontWeight >= 600 }) : EMPTY_RUN;
|
|
221
221
|
out.push(blockOfRun('paragraph', joinRuns(lead, tabRun(at), textRun(line, at)), { sourceStart: at, sourceEnd: at }));
|
|
222
222
|
});
|
|
223
223
|
}
|
|
@@ -244,6 +244,8 @@ class Emitter {
|
|
|
244
244
|
/** The key, one run per item. */
|
|
245
245
|
key = [];
|
|
246
246
|
bankWords = [];
|
|
247
|
+
/** The words of a mark exercise's text that are not to be marked. */
|
|
248
|
+
markWords = 0;
|
|
247
249
|
/** The number, marks, icons and title, before the instruction. */
|
|
248
250
|
leadRun;
|
|
249
251
|
/** Whether the lead ends in a number whose suffix is a full-width mark
|
|
@@ -286,6 +288,17 @@ class Emitter {
|
|
|
286
288
|
num(n) {
|
|
287
289
|
return formatCounter(n, counterStyleOf('decimal', this.ctx.locale), this.ctx.locale, this.ctx.digits);
|
|
288
290
|
}
|
|
291
|
+
/** An item's label: `1.`; on a vertical page a circled number (`①`),
|
|
292
|
+
* which stands upright in the column where a Latin full stop would not
|
|
293
|
+
* (#1244). */
|
|
294
|
+
item(n) {
|
|
295
|
+
return this.ctx.vertical ? formatCounter(n, 'circled-decimal', this.ctx.locale) : `${this.num(n)}.`;
|
|
296
|
+
}
|
|
297
|
+
/** Item and solution numbers are bold when the exercise number is (its
|
|
298
|
+
* `number.fontWeight`): a face with no bold cut sets both regular. */
|
|
299
|
+
get numberBold() {
|
|
300
|
+
return this.style.number.fontWeight >= 600;
|
|
301
|
+
}
|
|
289
302
|
label(k) {
|
|
290
303
|
return optionLabel(this.style, k, this.ctx.locale, this.ctx.digits);
|
|
291
304
|
}
|
|
@@ -346,17 +359,18 @@ class Emitter {
|
|
|
346
359
|
}
|
|
347
360
|
/** A writing area of `lines` lines, the answers written in a teacher's
|
|
348
361
|
* edition. */
|
|
349
|
-
area(lines, slot, answers, kind, widthPt, shown = false) {
|
|
362
|
+
area(lines, slot, answers, kind, widthPt, shown = false, cells) {
|
|
350
363
|
const a = this.style.area;
|
|
351
364
|
const k = kind ?? a.kind;
|
|
352
365
|
const spacing = a.spacing ? dimPt(a.spacing, this.dpiFree.size) : this.dpiFree.line * (k === 'grid' || k === 'tianzige' ? 1.2 : 1.35);
|
|
353
366
|
const { elements, heightPt } = areaElements({
|
|
354
367
|
kind: k, lines, spacingPt: spacing, widthPt: widthPt ?? this.dpiFree.measure, color: a.color, weightPt: dimPt(a.weight, this.dpiFree.size),
|
|
368
|
+
...(cells && cells.length > 0 ? { cells } : {}),
|
|
355
369
|
...((this.teacher || shown) && answers ? { answers, answerColor: this.style.answers.color, answerSizePt: this.dpiFree.size * 0.95, ...(this.style.answers.fontFamily ?? this.ctx.bodyFont ? { answerFont: this.style.answers.fontFamily ?? this.ctx.bodyFont } : {}) } : {}),
|
|
356
370
|
});
|
|
357
371
|
const id = `${this.ids.frame}-area-${this.ex.ordinal}-${slot}`;
|
|
358
372
|
const blocks = this.drawn(drawnBox(id, elements, heightPt));
|
|
359
|
-
this.slots.push({ key: slot, kind: 'text', accept: answers?.filter((s) => s !== '') ?? [], box: blocks[0].containerId, linePt: spacing });
|
|
373
|
+
this.slots.push({ key: slot, kind: 'text', accept: answers?.filter((s) => s !== '') ?? [], box: blocks[0].containerId, linePt: spacing, ...(kind === 'none' && this.ex.attrs.area?.trim() === 'none' ? { bare: true } : {}) });
|
|
360
374
|
return blocks;
|
|
361
375
|
}
|
|
362
376
|
// --- The exercise ---------------------------------------------------------
|
|
@@ -434,7 +448,8 @@ class Emitter {
|
|
|
434
448
|
const tight = /[\u3001\u3002\uFF0C\uFF0E\uFF1A]$/u.test(n.suffix);
|
|
435
449
|
if (n.show && this.number) {
|
|
436
450
|
const text = `${n.label ? `${n.label} ` : ''}${this.number}${n.suffix}`;
|
|
437
|
-
|
|
451
|
+
// A number stands upright under an italic instruction (#1244).
|
|
452
|
+
lead.push(chipRun(this.ids.number, textRun(text, this.at), this.at, { upright: true }));
|
|
438
453
|
}
|
|
439
454
|
const level = ex.attrs.level !== undefined ? Math.max(0, Math.min(this.style.level.max, parseInt(ex.attrs.level, 10) || 0)) : 0;
|
|
440
455
|
if (level > 0) {
|
|
@@ -580,14 +595,14 @@ class Emitter {
|
|
|
580
595
|
out.push(set);
|
|
581
596
|
// An open question: lines under each item of the list.
|
|
582
597
|
if (ex.kind === 'open' && b.type === 'listItem' && (b.depth ?? 1) <= 1) {
|
|
583
|
-
out.push(...this.area(this.openLines(), `t${lists.indexOf(k) + 1}`, this.openAnswer(lists.indexOf(k)), this.openArea()));
|
|
598
|
+
out.push(...this.area(this.openLines(), `t${lists.indexOf(k) + 1}`, this.openAnswer(lists.indexOf(k)), this.openArea(), undefined, false, this.openCells()));
|
|
584
599
|
}
|
|
585
600
|
}
|
|
586
601
|
flush();
|
|
587
602
|
if (bankAt !== undefined && !bankPlaced)
|
|
588
603
|
out.push(BANK_SLOT);
|
|
589
604
|
if (ex.kind === 'open' && lists.length === 0)
|
|
590
|
-
out.push(...this.area(this.openLines(), 't1', this.openAnswer(0), this.openArea()));
|
|
605
|
+
out.push(...this.area(this.openLines(), 't1', this.openAnswer(0), this.openArea(), undefined, false, this.openCells()));
|
|
591
606
|
if (ex.kind === 'gaps' || ex.kind === 'choice' || ex.kind === 'mark')
|
|
592
607
|
this.keyOfGaps();
|
|
593
608
|
return out;
|
|
@@ -596,7 +611,16 @@ class Emitter {
|
|
|
596
611
|
* style's. */
|
|
597
612
|
openArea() {
|
|
598
613
|
const k = this.ex.attrs.area?.trim();
|
|
599
|
-
|
|
614
|
+
if (k === 'lines' || k === 'dots' || k === 'grid' || k === 'seyes' || k === 'tianzige' || k === 'box' || k === 'none')
|
|
615
|
+
return k;
|
|
616
|
+
// Cells asked of an area of lines: squares.
|
|
617
|
+
return this.openCells() && this.style.area.kind !== 'grid' && this.style.area.kind !== 'tianzige' ? 'grid' : undefined;
|
|
618
|
+
}
|
|
619
|
+
/** The squares an open question's area is sized to (`cells=4`), or set
|
|
620
|
+
* in groups side by side (`cells="2 2 3"`, a word's 田字格 each). */
|
|
621
|
+
openCells() {
|
|
622
|
+
const cells = (this.ex.attrs.cells ?? '').split(/[\s,]+/).map((n) => parseInt(n, 10)).filter((n) => Number.isFinite(n) && n > 0);
|
|
623
|
+
return cells.length > 0 ? cells : undefined;
|
|
600
624
|
}
|
|
601
625
|
openLines() {
|
|
602
626
|
const n = parseInt(this.ex.attrs.lines ?? '', 10);
|
|
@@ -622,9 +646,11 @@ class Emitter {
|
|
|
622
646
|
// A question's stem ends in a bracket to write the letter in (Chinese
|
|
623
647
|
// and Japanese tests), its answer written in a teacher's edition.
|
|
624
648
|
const qi = this.style.options.bracket ? this.ex.questions.findIndex((q) => q.stem === k) : -1;
|
|
625
|
-
|
|
649
|
+
const marks = this.ex.kind === 'mark' && (b.type === 'paragraph' || b.type === 'listItem' || b.type === 'blockquote');
|
|
650
|
+
if (!b.spans.some((s) => s.chip?.gap) && qi < 0 && !marks)
|
|
626
651
|
return b;
|
|
627
|
-
|
|
652
|
+
// A mark exercise's text: each of its words is one to mark or not.
|
|
653
|
+
let run = marks ? this.markText(runOf(b)) : this.gapsOf(runOf(b));
|
|
628
654
|
if (qi >= 0) {
|
|
629
655
|
const at = b.sourceEnd;
|
|
630
656
|
const answer = this.bracketAnswer(qi);
|
|
@@ -656,6 +682,8 @@ class Emitter {
|
|
|
656
682
|
gapsOf(run) {
|
|
657
683
|
if (!run.spans.some((s) => s.chip?.gap))
|
|
658
684
|
return run;
|
|
685
|
+
if (this.ex.kind === 'mark')
|
|
686
|
+
return this.markText(run);
|
|
659
687
|
const pieces = [];
|
|
660
688
|
let at = 0;
|
|
661
689
|
for (const span of run.spans) {
|
|
@@ -670,7 +698,7 @@ class Emitter {
|
|
|
670
698
|
}
|
|
671
699
|
const ref = this.ex.gaps.find((g) => g.gap === gap);
|
|
672
700
|
const n = ref?.n ?? 0;
|
|
673
|
-
pieces.push(
|
|
701
|
+
pieces.push(gap.choice ? this.choiceRun(gap, n, src) : this.blankRun(gap, n, src, span.bold, span.italic));
|
|
674
702
|
}
|
|
675
703
|
return joinRuns(...pieces);
|
|
676
704
|
}
|
|
@@ -716,6 +744,44 @@ class Emitter {
|
|
|
716
744
|
this.slots.push({ key: `g${n}`, kind: 'choice', options: gap.options.length, correct: gap.correct.map((k) => k + 1), multiple: false });
|
|
717
745
|
return joinRuns(...parts);
|
|
718
746
|
}
|
|
747
|
+
/** A mark exercise's text: every word is a slot the reader may mark, so
|
|
748
|
+
* the words to mark are not the only ones that answer a click, and all
|
|
749
|
+
* are set alike so the page gives none away. The `[[…]]` words are the
|
|
750
|
+
* right ones; any other marked counts as wrong. */
|
|
751
|
+
markText(run) {
|
|
752
|
+
const out = [];
|
|
753
|
+
let at = 0;
|
|
754
|
+
for (const span of run.spans) {
|
|
755
|
+
const len = span.text.length;
|
|
756
|
+
const piece = sliceRun(run, at, at + len);
|
|
757
|
+
const src = run.sourceMap[at] ?? this.at;
|
|
758
|
+
at += len;
|
|
759
|
+
const gap = span.chip?.gap;
|
|
760
|
+
if (gap) {
|
|
761
|
+
const n = this.ex.gaps.find((g) => g.gap === gap)?.n ?? 0;
|
|
762
|
+
out.push(this.markRun(gap, n, src));
|
|
763
|
+
continue;
|
|
764
|
+
}
|
|
765
|
+
// A chip, a formula, a reference, a note, a tab… stays as it is.
|
|
766
|
+
if (span.chip || span.math || span.ref || span.footnote || span.tab || span.swatch || span.citation) {
|
|
767
|
+
out.push(piece);
|
|
768
|
+
continue;
|
|
769
|
+
}
|
|
770
|
+
let last = 0;
|
|
771
|
+
for (const [a, b] of wordRanges(span.text, this.ctx.locale)) {
|
|
772
|
+
if (a > last)
|
|
773
|
+
out.push(sliceRun(piece, last, a));
|
|
774
|
+
const word = sliceRun(piece, a, b);
|
|
775
|
+
const slot = `x${++this.markWords}`;
|
|
776
|
+
this.slots.push({ key: slot, kind: 'mark', correct: [] });
|
|
777
|
+
out.push(chipRun(this.ids.markPlain, word, word.sourceMap[0] ?? src, { exercise: { ex: this.ex.id, slot } }));
|
|
778
|
+
last = b;
|
|
779
|
+
}
|
|
780
|
+
if (last < len)
|
|
781
|
+
out.push(sliceRun(piece, last));
|
|
782
|
+
}
|
|
783
|
+
return joinRuns(...out);
|
|
784
|
+
}
|
|
719
785
|
markRun(gap, n, at) {
|
|
720
786
|
const words = { text: gap.texts[0] ?? '', spans: gap.options[0] ?? [], sourceMap: [] };
|
|
721
787
|
this.slots.push({ key: `m${n}`, kind: 'mark', correct: [1] });
|
|
@@ -829,7 +895,7 @@ class Emitter {
|
|
|
829
895
|
const stem = this.passThrough(this.blocks[q.stem], q.stem);
|
|
830
896
|
const at = stem.sourceStart;
|
|
831
897
|
const n = this.ex.questions.filter((x) => x.stem !== undefined).indexOf(q) + 1;
|
|
832
|
-
blocks.push(...this.paragraphs(this.ids.item, [joinRuns(textRun(
|
|
898
|
+
blocks.push(...this.paragraphs(this.ids.item, [joinRuns(textRun(this.item(n), at, { bold: this.numberBold }), tabRun(at), runOf(stem))]));
|
|
833
899
|
}
|
|
834
900
|
const optionStyle = q.stem !== undefined ? this.ids.optionUnder : this.ids.option;
|
|
835
901
|
// `columns=3` on the fence, or a row layout: the options side by side.
|
|
@@ -854,21 +920,26 @@ class Emitter {
|
|
|
854
920
|
const at = this.blocks[opt.block].sourceStart;
|
|
855
921
|
const slot = `tf${k + 1}`;
|
|
856
922
|
this.slots.push({ key: slot, kind: 'truefalse', correct: [opt.correct ? 1 : 2] });
|
|
857
|
-
const
|
|
923
|
+
const marks = [];
|
|
858
924
|
if (this.style.trueFalse.look === 'bracket') {
|
|
859
|
-
// One bracket
|
|
860
|
-
//
|
|
925
|
+
// One bracket to write the answer in: full width in Chinese and
|
|
926
|
+
// Japanese, `( )`.
|
|
861
927
|
const wide = this.book.language === 'zh' || this.book.language === 'ja';
|
|
862
928
|
const answer = textRun(opt.correct ? t : f, at);
|
|
863
929
|
const shown = this.answered(k === 0);
|
|
864
|
-
|
|
930
|
+
marks.push(textRun(wide ? '\uFF08' : '(', at), chipRun(shown ? this.ids.answer : this.ids.icon, answer, at, {
|
|
865
931
|
widthText: `${t.length > f.length ? t : f}\u2003`, ...(shown ? {} : { blank: true, blankLabel: this.book.words.blank }), ...this.hit(slot, k === 0),
|
|
866
932
|
}), textRun(wide ? '\uFF09' : ')', at));
|
|
867
933
|
}
|
|
868
934
|
else {
|
|
869
|
-
|
|
870
|
-
|
|
935
|
+
marks.push(textRun(`${t}\u00A0`, at), chipRun(this.answered(k === 0) && opt.correct ? this.ids.tickOn : this.ids.tick, textRun('\u00A0', at), at, this.hit(`${slot}t`, k === 0)));
|
|
936
|
+
marks.push(textRun(`\u2003${f}\u00A0`, at), chipRun(this.answered(k === 0) && !opt.correct ? this.ids.tickOn : this.ids.tick, textRun('\u00A0', at), at, this.hit(`${slot}f`, k === 0)));
|
|
871
937
|
}
|
|
938
|
+
// Before the statement (`place: 'start'`, a Brazilian `( ) frase`),
|
|
939
|
+
// else flush with the line's end.
|
|
940
|
+
const parts = this.style.trueFalse.place === 'start'
|
|
941
|
+
? [textRun(this.item(k + 1), at), tabRun(at), ...marks, textRun(SPACE, at), this.optionText(opt.block)]
|
|
942
|
+
: [textRun(this.item(k + 1), at), tabRun(at), this.optionText(opt.block), tabRun(at), ...marks];
|
|
872
943
|
runs.push(joinRuns(...parts));
|
|
873
944
|
this.key.push(textRun(`${this.num(k + 1)} ${opt.correct ? t : f}`, this.at));
|
|
874
945
|
});
|
|
@@ -908,7 +979,7 @@ class Emitter {
|
|
|
908
979
|
const p = lefts[i];
|
|
909
980
|
if (p) {
|
|
910
981
|
const pos = posOf.get(pairs.indexOf(p));
|
|
911
|
-
parts.push(textRun(`${this.
|
|
982
|
+
parts.push(textRun(`${this.item(i + 1)} `, this.at), this.gapsOf(p.left), textRun(' ', this.at));
|
|
912
983
|
parts.push(chipRun(this.answered(i === 0) ? this.ids.blankAnswer : this.ids.blank, textRun(this.bareLabel(pos) || this.num(pos + 1), this.at), this.at, {
|
|
913
984
|
widthText: '\u2003\u2003', ...(this.answered(i === 0) ? {} : { blank: true, blankLabel: this.book.words.blank }), ...this.hit(`p${i + 1}`, i === 0),
|
|
914
985
|
}));
|
|
@@ -941,7 +1012,7 @@ class Emitter {
|
|
|
941
1012
|
const at = this.blocks[s.block].sourceStart;
|
|
942
1013
|
const order = shuffledOrder(s.pieces.length, seededRandom(this.book.seed, this.ex.ordinal, 'scramble', k));
|
|
943
1014
|
const words = order.flatMap((j, pos) => (pos > 0 ? [textRun(' / ', at), s.pieces[j]] : [s.pieces[j]]));
|
|
944
|
-
out.push(...this.paragraphs(this.ids.item, [joinRuns(textRun(
|
|
1015
|
+
out.push(...this.paragraphs(this.ids.item, [joinRuns(textRun(this.item(k + 1), at), tabRun(at), ...words)]));
|
|
945
1016
|
const sentence = s.pieces.map((p) => plain(p)).join(' ');
|
|
946
1017
|
out.push(...this.area(1, `sc${k + 1}`, [sentence], this.style.area.kind === 'none' ? 'lines' : this.style.area.kind, undefined, this.example && k === 0));
|
|
947
1018
|
this.key.push(textRun(`${this.num(k + 1)} ${sentence}`, at));
|
|
@@ -1002,7 +1073,7 @@ class Emitter {
|
|
|
1002
1073
|
if (this.key.length === 0)
|
|
1003
1074
|
this.exerciseBlocks();
|
|
1004
1075
|
const sol = solutionsOf(this.style, this.book);
|
|
1005
|
-
const lead = listed && this.number ? [textRun(`${this.number}${this.style.number.suffix || '.'}`, this.at, { bold:
|
|
1076
|
+
const lead = listed && this.number ? [textRun(`${this.number}${this.style.number.suffix || '.'}`, this.at, { bold: this.numberBold }), tabRun(this.at)] : [];
|
|
1006
1077
|
const keyRun = this.key.length > 0 ? joinRuns(...this.key.flatMap((r, k) => (k > 0 ? [textRun(this.sep, this.at), r] : [r]))) : EMPTY_RUN;
|
|
1007
1078
|
const out = [];
|
|
1008
1079
|
const worked = [];
|
|
@@ -1092,6 +1163,23 @@ class Emitter {
|
|
|
1092
1163
|
function round3(v) {
|
|
1093
1164
|
return Math.round(v * 1000) / 1000;
|
|
1094
1165
|
}
|
|
1166
|
+
/** The words of `text` (start and end), as the language divides them:
|
|
1167
|
+
* `Intl.Segmenter` where the runtime has it (Chinese and Japanese words
|
|
1168
|
+
* too), else runs of letters and digits. */
|
|
1169
|
+
export function wordRanges(text, locale) {
|
|
1170
|
+
const out = [];
|
|
1171
|
+
const Segmenter = Intl.Segmenter;
|
|
1172
|
+
if (Segmenter) {
|
|
1173
|
+
for (const s of new Segmenter(locale, { granularity: 'word' }).segment(text))
|
|
1174
|
+
if (s.isWordLike)
|
|
1175
|
+
out.push([s.index, s.index + s.segment.length]);
|
|
1176
|
+
return out;
|
|
1177
|
+
}
|
|
1178
|
+
const re = /[\p{L}\p{N}][\p{L}\p{N}\p{M}'\u2019-]*/gu;
|
|
1179
|
+
for (let m = re.exec(text); m; m = re.exec(text))
|
|
1180
|
+
out.push([m.index, m.index + m[0].length]);
|
|
1181
|
+
return out;
|
|
1182
|
+
}
|
|
1095
1183
|
/** A length in points, `em` read against `sizePt`. */
|
|
1096
1184
|
export function dimPt(d, sizePt) {
|
|
1097
1185
|
switch (d.unit) {
|