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.
Files changed (152) hide show
  1. package/dist/__tests__/exercises/digital.test.js +38 -1
  2. package/dist/__tests__/exercises/digital.test.js.map +1 -1
  3. package/dist/__tests__/exercises/followups.test.d.ts +2 -0
  4. package/dist/__tests__/exercises/followups.test.d.ts.map +1 -0
  5. package/dist/__tests__/exercises/followups.test.js +235 -0
  6. package/dist/__tests__/exercises/followups.test.js.map +1 -0
  7. package/dist/__tests__/exports.test.js +16 -0
  8. package/dist/__tests__/exports.test.js.map +1 -1
  9. package/dist/__tests__/figureStyle.test.d.ts +2 -0
  10. package/dist/__tests__/figureStyle.test.d.ts.map +1 -0
  11. package/dist/__tests__/figureStyle.test.js +218 -0
  12. package/dist/__tests__/figureStyle.test.js.map +1 -0
  13. package/dist/__tests__/headingLetterSpacing.test.js +1 -1
  14. package/dist/__tests__/headingLetterSpacing.test.js.map +1 -1
  15. package/dist/__tests__/pipeline/paragraphStyleFaces.test.js +1 -1
  16. package/dist/__tests__/pipeline/paragraphStyleFaces.test.js.map +1 -1
  17. package/dist/__tests__/pipeline/spanHeadingMidPage.test.js +76 -0
  18. package/dist/__tests__/pipeline/spanHeadingMidPage.test.js.map +1 -1
  19. package/dist/canvas-backend/annotations.d.ts +4 -1
  20. package/dist/canvas-backend/annotations.d.ts.map +1 -1
  21. package/dist/canvas-backend/annotations.js +5 -0
  22. package/dist/canvas-backend/annotations.js.map +1 -1
  23. package/dist/canvas-backend/chip.d.ts.map +1 -1
  24. package/dist/canvas-backend/chip.js +4 -0
  25. package/dist/canvas-backend/chip.js.map +1 -1
  26. package/dist/canvas-backend/verticalText.d.ts.map +1 -1
  27. package/dist/canvas-backend/verticalText.js +5 -2
  28. package/dist/canvas-backend/verticalText.js.map +1 -1
  29. package/dist/configWarnings.d.ts.map +1 -1
  30. package/dist/configWarnings.js +18 -4
  31. package/dist/configWarnings.js.map +1 -1
  32. package/dist/defaults/bodyText.d.ts.map +1 -1
  33. package/dist/defaults/bodyText.js +8 -1
  34. package/dist/defaults/bodyText.js.map +1 -1
  35. package/dist/defaults/captionStyle.d.ts.map +1 -1
  36. package/dist/defaults/captionStyle.js +7 -2
  37. package/dist/defaults/captionStyle.js.map +1 -1
  38. package/dist/defaults/exercises.d.ts.map +1 -1
  39. package/dist/defaults/exercises.js +15 -9
  40. package/dist/defaults/exercises.js.map +1 -1
  41. package/dist/defaults/headerFooter.d.ts.map +1 -1
  42. package/dist/defaults/headerFooter.js +3 -1
  43. package/dist/defaults/headerFooter.js.map +1 -1
  44. package/dist/defaults/headings.d.ts.map +1 -1
  45. package/dist/defaults/headings.js +15 -3
  46. package/dist/defaults/headings.js.map +1 -1
  47. package/dist/defaults/paragraphStyles.d.ts.map +1 -1
  48. package/dist/defaults/paragraphStyles.js +4 -1
  49. package/dist/defaults/paragraphStyles.js.map +1 -1
  50. package/dist/defaults/tableStyle.d.ts.map +1 -1
  51. package/dist/defaults/tableStyle.js +5 -2
  52. package/dist/defaults/tableStyle.js.map +1 -1
  53. package/dist/design/elementKeys.d.ts +1 -0
  54. package/dist/design/elementKeys.d.ts.map +1 -1
  55. package/dist/design/elementKeys.js +1 -1
  56. package/dist/design/elementKeys.js.map +1 -1
  57. package/dist/exercises/build.d.ts.map +1 -1
  58. package/dist/exercises/build.js +1 -0
  59. package/dist/exercises/build.js.map +1 -1
  60. package/dist/exercises/configWarnings.d.ts.map +1 -1
  61. package/dist/exercises/configWarnings.js +6 -2
  62. package/dist/exercises/configWarnings.js.map +1 -1
  63. package/dist/exercises/designs.d.ts +5 -0
  64. package/dist/exercises/designs.d.ts.map +1 -1
  65. package/dist/exercises/designs.js +45 -16
  66. package/dist/exercises/designs.js.map +1 -1
  67. package/dist/exercises/digital.d.ts +7 -0
  68. package/dist/exercises/digital.d.ts.map +1 -1
  69. package/dist/exercises/digital.js +8 -1
  70. package/dist/exercises/digital.js.map +1 -1
  71. package/dist/exercises/expand.d.ts +6 -0
  72. package/dist/exercises/expand.d.ts.map +1 -1
  73. package/dist/exercises/expand.js +108 -20
  74. package/dist/exercises/expand.js.map +1 -1
  75. package/dist/exercises/grids.d.ts.map +1 -1
  76. package/dist/exercises/grids.js +76 -16
  77. package/dist/exercises/grids.js.map +1 -1
  78. package/dist/exercises/model.d.ts +4 -1
  79. package/dist/exercises/model.d.ts.map +1 -1
  80. package/dist/exercises/model.js +56 -15
  81. package/dist/exercises/model.js.map +1 -1
  82. package/dist/exercises/record.d.ts +9 -1
  83. package/dist/exercises/record.d.ts.map +1 -1
  84. package/dist/exercises/runtime.d.ts +6 -0
  85. package/dist/exercises/runtime.d.ts.map +1 -1
  86. package/dist/exercises/runtime.js +485 -69
  87. package/dist/exercises/runtime.js.map +1 -1
  88. package/dist/exercises/styles.d.ts +1 -0
  89. package/dist/exercises/styles.d.ts.map +1 -1
  90. package/dist/exercises/styles.js +3 -0
  91. package/dist/exercises/styles.js.map +1 -1
  92. package/dist/fonts/featureFaces.d.ts +32 -0
  93. package/dist/fonts/featureFaces.d.ts.map +1 -0
  94. package/dist/fonts/featureFaces.js +166 -0
  95. package/dist/fonts/featureFaces.js.map +1 -0
  96. package/dist/fonts/figureStyle.d.ts +69 -0
  97. package/dist/fonts/figureStyle.d.ts.map +1 -0
  98. package/dist/fonts/figureStyle.js +196 -0
  99. package/dist/fonts/figureStyle.js.map +1 -0
  100. package/dist/fonts/freezeFeatures.d.ts +10 -0
  101. package/dist/fonts/freezeFeatures.d.ts.map +1 -0
  102. package/dist/fonts/freezeFeatures.js +372 -0
  103. package/dist/fonts/freezeFeatures.js.map +1 -0
  104. package/dist/fonts/glyphFallback.d.ts.map +1 -1
  105. package/dist/fonts/glyphFallback.js +6 -3
  106. package/dist/fonts/glyphFallback.js.map +1 -1
  107. package/dist/fonts/prepare.d.ts.map +1 -1
  108. package/dist/fonts/prepare.js +22 -4
  109. package/dist/fonts/prepare.js.map +1 -1
  110. package/dist/fonts/usage.d.ts +10 -0
  111. package/dist/fonts/usage.d.ts.map +1 -1
  112. package/dist/fonts/usage.js +97 -0
  113. package/dist/fonts/usage.js.map +1 -1
  114. package/dist/html-backend.d.ts.map +1 -1
  115. package/dist/html-backend.js +27 -16
  116. package/dist/html-backend.js.map +1 -1
  117. package/dist/htmlAnnotations.d.ts +5 -1
  118. package/dist/htmlAnnotations.d.ts.map +1 -1
  119. package/dist/htmlAnnotations.js +6 -0
  120. package/dist/htmlAnnotations.js.map +1 -1
  121. package/dist/index.d.ts +7 -2
  122. package/dist/index.d.ts.map +1 -1
  123. package/dist/index.js +4 -1
  124. package/dist/index.js.map +1 -1
  125. package/dist/measure/cache.js +3 -3
  126. package/dist/measure/cache.js.map +1 -1
  127. package/dist/measure/rich.d.ts.map +1 -1
  128. package/dist/measure/rich.js +72 -4
  129. package/dist/measure/rich.js.map +1 -1
  130. package/dist/parse/types.d.ts +3 -0
  131. package/dist/parse/types.d.ts.map +1 -1
  132. package/dist/pipeline/build.d.ts.map +1 -1
  133. package/dist/pipeline/build.js +38 -7
  134. package/dist/pipeline/build.js.map +1 -1
  135. package/dist/pipeline/headingStyles.d.ts.map +1 -1
  136. package/dist/pipeline/headingStyles.js +3 -0
  137. package/dist/pipeline/headingStyles.js.map +1 -1
  138. package/dist/types.d.ts +61 -0
  139. package/dist/types.d.ts.map +1 -1
  140. package/dist/vdt.d.ts +5 -0
  141. package/dist/vdt.d.ts.map +1 -1
  142. package/dist/vdt.js.map +1 -1
  143. package/dist/worker/client.d.ts.map +1 -1
  144. package/dist/worker/client.js +13 -2
  145. package/dist/worker/client.js.map +1 -1
  146. package/dist/worker/fonts.d.ts +1 -1
  147. package/dist/worker/fonts.d.ts.map +1 -1
  148. package/dist/worker/fonts.js +1 -1
  149. package/dist/worker/fonts.js.map +1 -1
  150. package/dist/worker/protocol.d.ts +4 -0
  151. package/dist/worker/protocol.d.ts.map +1 -1
  152. 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
- const gw = cols * sp;
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
- for (let i = 0; i <= n; i++)
80
- d += `M0 ${r(i * sp)}H${r(gw)}`;
81
- for (let j = 0; j <= cols; j++)
82
- d += `M${r(j * sp)} 0V${r(h)}`;
83
- els.push(pathElement('area', d, gw, h, a.color, a.weightPt));
84
- if (a.kind === 'tianzige') {
85
- let x = '';
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 += `M0 ${r((i + 0.5) * sp)}H${r(gw)}`;
88
- for (let j = 0; j < cols; j++)
89
- x += `M${r((j + 0.5) * sp)} 0V${r(h)}`;
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 squared paper.
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 chars = graphemesOf(a.answers.join(''));
123
- chars.slice(0, cols * n).forEach((ch, k) => {
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, (k % cols) * sp, Math.floor(k / cols) * sp, sp, sp, sp * 0.62, {
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;CAC7B;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,CAuB7E;AAED;iEACiE;AACjE,MAAM,WAAW,YAAa,SAAQ,eAAe;IACnD;uCACmC;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,uEAAuE;IACvE,MAAM,EAAE,MAAM,CAAC;IACf;;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,CAAA;SAAE,CAAA;KAAE,CAAC;CACtE,GAAG,YAAY,GAAG,SAAS,CAM3B;AAED;;;eAGe;AACf,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAO3D"}
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 { ...digital, pxPerPt, bodyPx: dimensionToPx(doc.config.bodyText.fontSize, doc.config.page.dpi), exercises: records };
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;AA4B5C,0DAA0D;AAC1D,MAAM,UAAU,iBAAiB,CAAC,QAA0B;IAC1D,MAAM,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC;IACnC,MAAM,MAAM,GAA6C,EAAE,CAAC;IAC5D,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;QAChC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;YAAE,SAAS;QAC3B,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG;YACb,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG;YACnC,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG;YAC/B,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG;YAC3B,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,KAAK,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;YAC/F,SAAS,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;SAC1D,CAAC;IACJ,CAAC;IACD,OAAO;QACL,KAAK,EAAE;YACL,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC,YAAY,EAAE,YAAY,EAAE,CAAC,CAAC,YAAY;YACxH,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK;SACjG;QACD,WAAW,EAAE,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,WAAW;QACnD,OAAO,EAAE,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO;QAC3C,KAAK,EAAE,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK;QACvC,MAAM;KACP,CAAC;AACJ,CAAC;AAiBD;;+CAE+C;AAC/C,MAAM,UAAU,cAAc,CAAC,GAI9B;IACC,MAAM,OAAO,GAAG,GAAG,CAAC,SAAS,CAAC;IAC9B,MAAM,OAAO,GAAG,GAAG,CAAC,eAAe,CAAC;IACpC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW;QAAE,OAAO,SAAS,CAAC;IAC3F,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;IACzC,OAAO,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;AAC/H,CAAC;AAED;;;eAGe;AACf,MAAM,UAAU,gBAAgB,CAAC,IAAkB;IACjD,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SACxB,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC;SACxB,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC;SACxB,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC;SACxB,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC;SAC7B,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;AACnC,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;AAo2BD,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"}
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"}
@@ -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: true }) : EMPTY_RUN;
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
- lead.push(chipRun(this.ids.number, textRun(text, this.at), this.at));
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
- return k === 'lines' || k === 'dots' || k === 'grid' || k === 'seyes' || k === 'tianzige' || k === 'box' || k === 'none' ? k : undefined;
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
- if (!b.spans.some((s) => s.chip?.gap) && qi < 0)
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
- let run = this.gapsOf(runOf(b));
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(this.ex.kind === 'mark' ? this.markRun(gap, n, src) : gap.choice ? this.choiceRun(gap, n, src) : this.blankRun(gap, n, src, span.bold, span.italic));
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(`${this.num(n)}.`, at, { bold: true }), tabRun(at), runOf(stem))]));
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 parts = [textRun(`${this.num(k + 1)}.`, at), tabRun(at), this.optionText(opt.block), tabRun(at)];
923
+ const marks = [];
858
924
  if (this.style.trueFalse.look === 'bracket') {
859
- // One bracket at the line's end to write the answer in: full width
860
- // in Chinese and Japanese, `( )`.
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
- parts.push(textRun(wide ? '\uFF08' : '(', at), chipRun(shown ? this.ids.answer : this.ids.icon, answer, at, {
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
- parts.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)));
870
- parts.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)));
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.num(i + 1)}. `, this.at), this.gapsOf(p.left), textRun(' ', this.at));
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(`${this.num(k + 1)}.`, at), tabRun(at), ...words)]));
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: true }), tabRun(this.at)] : [];
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) {