postext 1.58.2 → 1.59.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/config.test.d.ts +2 -0
- package/dist/__tests__/exercises/config.test.d.ts.map +1 -0
- package/dist/__tests__/exercises/config.test.js +63 -0
- package/dist/__tests__/exercises/config.test.js.map +1 -0
- package/dist/__tests__/exercises/digital.test.d.ts +2 -0
- package/dist/__tests__/exercises/digital.test.d.ts.map +1 -0
- package/dist/__tests__/exercises/digital.test.js +163 -0
- package/dist/__tests__/exercises/digital.test.js.map +1 -0
- package/dist/__tests__/exercises/languages.test.d.ts +2 -0
- package/dist/__tests__/exercises/languages.test.d.ts.map +1 -0
- package/dist/__tests__/exercises/languages.test.js +109 -0
- package/dist/__tests__/exercises/languages.test.js.map +1 -0
- package/dist/__tests__/exercises/layout.test.d.ts +2 -0
- package/dist/__tests__/exercises/layout.test.d.ts.map +1 -0
- package/dist/__tests__/exercises/layout.test.js +77 -0
- package/dist/__tests__/exercises/layout.test.js.map +1 -0
- package/dist/__tests__/exercises/model.test.d.ts +2 -0
- package/dist/__tests__/exercises/model.test.d.ts.map +1 -0
- package/dist/__tests__/exercises/model.test.js +90 -0
- package/dist/__tests__/exercises/model.test.js.map +1 -0
- package/dist/__tests__/exercises/parse.test.d.ts +2 -0
- package/dist/__tests__/exercises/parse.test.d.ts.map +1 -0
- package/dist/__tests__/exercises/parse.test.js +37 -0
- package/dist/__tests__/exercises/parse.test.js.map +1 -0
- package/dist/__tests__/exercises/refs.test.d.ts +2 -0
- package/dist/__tests__/exercises/refs.test.d.ts.map +1 -0
- package/dist/__tests__/exercises/refs.test.js +46 -0
- package/dist/__tests__/exercises/refs.test.js.map +1 -0
- package/dist/__tests__/exercises/solutions.test.d.ts +2 -0
- package/dist/__tests__/exercises/solutions.test.d.ts.map +1 -0
- package/dist/__tests__/exercises/solutions.test.js +53 -0
- package/dist/__tests__/exercises/solutions.test.js.map +1 -0
- package/dist/__tests__/exports.test.js +14 -0
- package/dist/__tests__/exports.test.js.map +1 -1
- package/dist/__tests__/parse/containers.test.js +2 -2
- package/dist/__tests__/parse/containers.test.js.map +1 -1
- package/dist/__tests__/pipeline/pageShorterThanLine.test.d.ts +2 -0
- package/dist/__tests__/pipeline/pageShorterThanLine.test.d.ts.map +1 -0
- package/dist/__tests__/pipeline/pageShorterThanLine.test.js +29 -0
- package/dist/__tests__/pipeline/pageShorterThanLine.test.js.map +1 -0
- package/dist/__tests__/pipeline/spanHeadingMidPage.test.js +11 -0
- package/dist/__tests__/pipeline/spanHeadingMidPage.test.js.map +1 -1
- package/dist/canvas-backend/blockRender.d.ts.map +1 -1
- package/dist/canvas-backend/blockRender.js +18 -0
- package/dist/canvas-backend/blockRender.js.map +1 -1
- package/dist/canvas-backend/chip.d.ts +3 -0
- package/dist/canvas-backend/chip.d.ts.map +1 -1
- package/dist/canvas-backend/chip.js +31 -1
- package/dist/canvas-backend/chip.js.map +1 -1
- package/dist/configWarnings.d.ts +3 -1
- package/dist/configWarnings.d.ts.map +1 -1
- package/dist/configWarnings.js +5 -1
- package/dist/configWarnings.js.map +1 -1
- package/dist/defaults/chipStyles.d.ts.map +1 -1
- package/dist/defaults/chipStyles.js +7 -0
- package/dist/defaults/chipStyles.js.map +1 -1
- package/dist/defaults/exercises.d.ts +111 -0
- package/dist/defaults/exercises.d.ts.map +1 -0
- package/dist/defaults/exercises.js +255 -0
- package/dist/defaults/exercises.js.map +1 -0
- package/dist/defaults/index.d.ts +2 -0
- package/dist/defaults/index.d.ts.map +1 -1
- package/dist/defaults/index.js +16 -0
- package/dist/defaults/index.js.map +1 -1
- package/dist/defaults/shared.d.ts +4 -0
- package/dist/defaults/shared.d.ts.map +1 -1
- package/dist/defaults/shared.js +6 -0
- package/dist/defaults/shared.js.map +1 -1
- package/dist/design/elementKeys.d.ts +2 -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 +60 -0
- package/dist/exercises/build.d.ts.map +1 -0
- package/dist/exercises/build.js +177 -0
- package/dist/exercises/build.js.map +1 -0
- package/dist/exercises/configWarnings.d.ts +11 -0
- package/dist/exercises/configWarnings.d.ts.map +1 -0
- package/dist/exercises/configWarnings.js +175 -0
- package/dist/exercises/configWarnings.js.map +1 -0
- package/dist/exercises/designs.d.ts +38 -0
- package/dist/exercises/designs.d.ts.map +1 -0
- package/dist/exercises/designs.js +143 -0
- package/dist/exercises/designs.js.map +1 -0
- package/dist/exercises/digital.d.ts +69 -0
- package/dist/exercises/digital.d.ts.map +1 -0
- package/dist/exercises/digital.js +58 -0
- package/dist/exercises/digital.js.map +1 -0
- package/dist/exercises/expand.d.ts +74 -0
- package/dist/exercises/expand.d.ts.map +1 -0
- package/dist/exercises/expand.js +1089 -0
- package/dist/exercises/expand.js.map +1 -0
- package/dist/exercises/grids.d.ts +62 -0
- package/dist/exercises/grids.d.ts.map +1 -0
- package/dist/exercises/grids.js +535 -0
- package/dist/exercises/grids.js.map +1 -0
- package/dist/exercises/model.d.ts +24 -0
- package/dist/exercises/model.d.ts.map +1 -0
- package/dist/exercises/model.js +360 -0
- package/dist/exercises/model.js.map +1 -0
- package/dist/exercises/record.d.ts +94 -0
- package/dist/exercises/record.d.ts.map +1 -0
- package/dist/exercises/record.js +9 -0
- package/dist/exercises/record.js.map +1 -0
- package/dist/exercises/runtime.d.ts +65 -0
- package/dist/exercises/runtime.d.ts.map +1 -0
- package/dist/exercises/runtime.js +1261 -0
- package/dist/exercises/runtime.js.map +1 -0
- package/dist/exercises/shuffle.d.ts +13 -0
- package/dist/exercises/shuffle.d.ts.map +1 -0
- package/dist/exercises/shuffle.js +56 -0
- package/dist/exercises/shuffle.js.map +1 -0
- package/dist/exercises/styles.d.ts +51 -0
- package/dist/exercises/styles.d.ts.map +1 -0
- package/dist/exercises/styles.js +221 -0
- package/dist/exercises/styles.js.map +1 -0
- package/dist/exercises/text.d.ts +31 -0
- package/dist/exercises/text.d.ts.map +1 -0
- package/dist/exercises/text.js +82 -0
- package/dist/exercises/text.js.map +1 -0
- package/dist/exercises/types.d.ts +125 -0
- package/dist/exercises/types.d.ts.map +1 -0
- package/dist/exercises/types.js +9 -0
- package/dist/exercises/types.js.map +1 -0
- package/dist/exercises/warnings.d.ts +16 -0
- package/dist/exercises/warnings.d.ts.map +1 -0
- package/dist/exercises/warnings.js +55 -0
- package/dist/exercises/warnings.js.map +1 -0
- package/dist/html-backend.d.ts +6 -0
- package/dist/html-backend.d.ts.map +1 -1
- package/dist/html-backend.js +67 -6
- package/dist/html-backend.js.map +1 -1
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/measure/cache.d.ts.map +1 -1
- package/dist/measure/cache.js +6 -1
- package/dist/measure/cache.js.map +1 -1
- package/dist/measure/rich.d.ts.map +1 -1
- package/dist/measure/rich.js +11 -1
- package/dist/measure/rich.js.map +1 -1
- package/dist/migrate/markdownRuns.js +1 -1
- package/dist/migrate/markdownRuns.js.map +1 -1
- package/dist/numbering.d.ts +3 -0
- package/dist/numbering.d.ts.map +1 -1
- package/dist/numbering.js +6 -0
- package/dist/numbering.js.map +1 -1
- package/dist/parse/blockParser.d.ts.map +1 -1
- package/dist/parse/blockParser.js +47 -4
- package/dist/parse/blockParser.js.map +1 -1
- package/dist/parse/exerciseGaps.d.ts +50 -0
- package/dist/parse/exerciseGaps.d.ts.map +1 -0
- package/dist/parse/exerciseGaps.js +151 -0
- package/dist/parse/exerciseGaps.js.map +1 -0
- package/dist/parse/index.d.ts +1 -1
- package/dist/parse/index.d.ts.map +1 -1
- package/dist/parse/index.js.map +1 -1
- package/dist/parse/sourceMapping.d.ts.map +1 -1
- package/dist/parse/sourceMapping.js +21 -0
- package/dist/parse/sourceMapping.js.map +1 -1
- package/dist/parse/types.d.ts +49 -1
- package/dist/parse/types.d.ts.map +1 -1
- package/dist/pipeline/build.d.ts.map +1 -1
- package/dist/pipeline/build.js +51 -9
- package/dist/pipeline/build.js.map +1 -1
- package/dist/pipeline/calloutLayout.d.ts.map +1 -1
- package/dist/pipeline/calloutLayout.js +1 -0
- package/dist/pipeline/calloutLayout.js.map +1 -1
- package/dist/pipeline/chips.d.ts.map +1 -1
- package/dist/pipeline/chips.js +2 -0
- package/dist/pipeline/chips.js.map +1 -1
- package/dist/pipeline/config.d.ts.map +1 -1
- package/dist/pipeline/config.js +6 -0
- package/dist/pipeline/config.js.map +1 -1
- package/dist/pipeline/contentWarnings.d.ts.map +1 -1
- package/dist/pipeline/contentWarnings.js +29 -1
- package/dist/pipeline/contentWarnings.js.map +1 -1
- package/dist/pipeline/continuation.d.ts.map +1 -1
- package/dist/pipeline/continuation.js +21 -6
- package/dist/pipeline/continuation.js.map +1 -1
- package/dist/pipeline/measureContentBlock.d.ts.map +1 -1
- package/dist/pipeline/measureContentBlock.js +3 -2
- package/dist/pipeline/measureContentBlock.js.map +1 -1
- package/dist/pipeline/outline.d.ts.map +1 -1
- package/dist/pipeline/outline.js +1 -0
- package/dist/pipeline/outline.js.map +1 -1
- package/dist/pipeline/textWrap.js +1 -1
- package/dist/pipeline/textWrap.js.map +1 -1
- package/dist/types.d.ts +303 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/vdt.d.ts +67 -0
- package/dist/vdt.d.ts.map +1 -1
- package/dist/vdt.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The checks of the exercise settings (#1226): a key an exercise style, one
|
|
3
|
+
* of its parts or the book's `exercises` do not have (`unknownConfigKey`),
|
|
4
|
+
* a word outside a setting's choices (`unknownConfigValue`, `used` the
|
|
5
|
+
* default the engine reads instead) and a numbering style it does not know
|
|
6
|
+
* (`unknownNumberFormat`).
|
|
7
|
+
*/
|
|
8
|
+
import { closestKey } from '../util/closestKey.js';
|
|
9
|
+
import { isCounterStyle } from '../numbering.js';
|
|
10
|
+
import { isResourceCounterReset } from '../defaults/resourceTypes.js';
|
|
11
|
+
// The keys of each part, checked against its type: a key added to a type
|
|
12
|
+
// fails to compile until it is listed here.
|
|
13
|
+
const STYLE_KEYS = {
|
|
14
|
+
id: true, name: true, extends: true, box: true, number: true, instruction: true, options: true, blank: true,
|
|
15
|
+
trueFalse: true, match: true, bank: true, area: true, grid: true, arithmetic: true, level: true, icons: true,
|
|
16
|
+
answers: true, solutions: true, digital: true, marginTop: true, marginBottom: true, itemSpacing: true,
|
|
17
|
+
};
|
|
18
|
+
const NUMBER_KEYS = {
|
|
19
|
+
show: true, label: true, shape: true, color: true, background: true, fontFamily: true, fontSize: true,
|
|
20
|
+
fontWeight: true, suffix: true, template: true, resetOn: true, counter: true, format: true,
|
|
21
|
+
};
|
|
22
|
+
const INSTRUCTION_KEYS = { bold: true, italic: true, color: true, fontFamily: true, fontSize: true };
|
|
23
|
+
const OPTIONS_KEYS = {
|
|
24
|
+
labels: true, prefix: true, suffix: true, marker: true, layout: true, columns: true, shuffle: true, indent: true, bracket: true,
|
|
25
|
+
};
|
|
26
|
+
const BLANK_KEYS = { look: true, width: true, extra: true, minWidth: true, color: true, weight: true };
|
|
27
|
+
const TRUE_FALSE_KEYS = { labels: true, look: true };
|
|
28
|
+
const MATCH_KEYS = { look: true, gap: true, dotSize: true, color: true };
|
|
29
|
+
const BANK_KEYS = { box: true, order: true, separator: true };
|
|
30
|
+
const AREA_KEYS = { kind: true, lines: true, spacing: true, color: true, weight: true };
|
|
31
|
+
const GRID_KEYS = {
|
|
32
|
+
cell: true, fontFamily: true, fontSize: true, color: true, rule: true, ruleWidth: true, blocked: true, uppercase: true,
|
|
33
|
+
};
|
|
34
|
+
const ARITHMETIC_KEYS = { division: true, columns: true };
|
|
35
|
+
const LEVEL_KEYS = { glyph: true, empty: true, max: true, color: true };
|
|
36
|
+
const ICON_KEYS = { resourceId: true, glyph: true, fontFamily: true, color: true, alt: true, size: true };
|
|
37
|
+
const ANSWERS_KEYS = { color: true, fontFamily: true, italic: true };
|
|
38
|
+
const SOLUTIONS_KEYS = { placement: true, box: true, heading: true, layout: true };
|
|
39
|
+
const DIGITAL_KEYS = { correctColor: true, wrongColor: true };
|
|
40
|
+
const EXERCISES_KEYS = { edition: true, solutions: true, seed: true, digital: true };
|
|
41
|
+
const EXERCISES_DIGITAL_KEYS = { interactive: true, persist: true, check: true };
|
|
42
|
+
/** The words each setting takes, and the one read in place of another. */
|
|
43
|
+
const CHOICES = {
|
|
44
|
+
shape: [['none', 'disc', 'square', 'rounded'], 'none'],
|
|
45
|
+
marker: [['none', 'box', 'circle'], 'none'],
|
|
46
|
+
layout: [['stack', 'row'], 'stack'],
|
|
47
|
+
blankLook: [['line', 'dots', 'box', 'none'], 'line'],
|
|
48
|
+
blankWidth: [['answer', 'longest'], 'longest'],
|
|
49
|
+
trueFalseLook: [['boxes', 'bracket'], 'boxes'],
|
|
50
|
+
matchLook: [['dots', 'letters'], 'dots'],
|
|
51
|
+
order: [['shuffle', 'alpha', 'written'], 'shuffle'],
|
|
52
|
+
area: [['lines', 'dots', 'grid', 'seyes', 'tianzige', 'box', 'none'], 'lines'],
|
|
53
|
+
division: [['bracket', 'potence', 'inline'], 'bracket'],
|
|
54
|
+
placement: [['none', 'after', 'inverted', 'chapterEnd', 'directive'], 'none'],
|
|
55
|
+
solutionsLayout: [['key', 'full'], 'full'],
|
|
56
|
+
edition: [['student', 'teacher'], 'student'],
|
|
57
|
+
check: [['button', 'instant'], 'button'],
|
|
58
|
+
};
|
|
59
|
+
const record = (v) => v && typeof v === 'object' && !Array.isArray(v) ? v : undefined;
|
|
60
|
+
export function exerciseConfigWarnings(config) {
|
|
61
|
+
const out = [];
|
|
62
|
+
const keys = (node, known, path) => {
|
|
63
|
+
const r = record(node);
|
|
64
|
+
if (!r)
|
|
65
|
+
return;
|
|
66
|
+
const names = Object.keys(known);
|
|
67
|
+
for (const [key, value] of Object.entries(r)) {
|
|
68
|
+
if (value === undefined || Object.prototype.hasOwnProperty.call(known, key))
|
|
69
|
+
continue;
|
|
70
|
+
const suggestion = closestKey(key, names);
|
|
71
|
+
out.push({ kind: 'unknownConfigKey', path: `${path}.${key}`, value: key, used: '', ...(suggestion ? { suggestion } : {}) });
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
const choice = (value, [choices, used], path) => {
|
|
75
|
+
if (value === undefined || (typeof value === 'string' && choices.includes(value)))
|
|
76
|
+
return;
|
|
77
|
+
const written = String(value);
|
|
78
|
+
const suggestion = closestKey(written, [...choices]);
|
|
79
|
+
out.push({ kind: 'unknownConfigValue', path, value: written, used, ...(suggestion ? { suggestion } : {}) });
|
|
80
|
+
};
|
|
81
|
+
const format = (value, path, none) => {
|
|
82
|
+
if (value === undefined || (none && value === 'none') || (typeof value === 'string' && isCounterStyle(value)))
|
|
83
|
+
return;
|
|
84
|
+
out.push({ kind: 'unknownNumberFormat', path, value: String(value), used: 'decimal' });
|
|
85
|
+
};
|
|
86
|
+
const solutions = (node, path) => {
|
|
87
|
+
const s = record(node);
|
|
88
|
+
if (!s)
|
|
89
|
+
return;
|
|
90
|
+
keys(s, SOLUTIONS_KEYS, path);
|
|
91
|
+
choice(s.placement, CHOICES.placement, `${path}.placement`);
|
|
92
|
+
choice(s.layout, CHOICES.solutionsLayout, `${path}.layout`);
|
|
93
|
+
};
|
|
94
|
+
if (Array.isArray(config.exerciseStyles)) {
|
|
95
|
+
config.exerciseStyles.forEach((raw, i) => {
|
|
96
|
+
const s = record(raw);
|
|
97
|
+
if (!s)
|
|
98
|
+
return;
|
|
99
|
+
const at = `exerciseStyles[${i}]`;
|
|
100
|
+
keys(s, STYLE_KEYS, at);
|
|
101
|
+
const number = record(s.number);
|
|
102
|
+
if (number) {
|
|
103
|
+
keys(number, NUMBER_KEYS, `${at}.number`);
|
|
104
|
+
choice(number.shape, CHOICES.shape, `${at}.number.shape`);
|
|
105
|
+
if (number.resetOn !== undefined && !isResourceCounterReset(number.resetOn)) {
|
|
106
|
+
out.push({ kind: 'unknownConfigValue', path: `${at}.number.resetOn`, value: String(number.resetOn), used: 'h1' });
|
|
107
|
+
}
|
|
108
|
+
format(number.format, `${at}.number.format`, false);
|
|
109
|
+
}
|
|
110
|
+
keys(s.instruction, INSTRUCTION_KEYS, `${at}.instruction`);
|
|
111
|
+
const options = record(s.options);
|
|
112
|
+
if (options) {
|
|
113
|
+
keys(options, OPTIONS_KEYS, `${at}.options`);
|
|
114
|
+
format(options.labels, `${at}.options.labels`, true);
|
|
115
|
+
choice(options.marker, CHOICES.marker, `${at}.options.marker`);
|
|
116
|
+
choice(options.layout, CHOICES.layout, `${at}.options.layout`);
|
|
117
|
+
}
|
|
118
|
+
const blank = record(s.blank);
|
|
119
|
+
if (blank) {
|
|
120
|
+
keys(blank, BLANK_KEYS, `${at}.blank`);
|
|
121
|
+
choice(blank.look, CHOICES.blankLook, `${at}.blank.look`);
|
|
122
|
+
// A length, or one of two words.
|
|
123
|
+
if (typeof blank.width === 'string')
|
|
124
|
+
choice(blank.width, CHOICES.blankWidth, `${at}.blank.width`);
|
|
125
|
+
}
|
|
126
|
+
const trueFalse = record(s.trueFalse);
|
|
127
|
+
if (trueFalse) {
|
|
128
|
+
keys(trueFalse, TRUE_FALSE_KEYS, `${at}.trueFalse`);
|
|
129
|
+
choice(trueFalse.look, CHOICES.trueFalseLook, `${at}.trueFalse.look`);
|
|
130
|
+
}
|
|
131
|
+
const match = record(s.match);
|
|
132
|
+
if (match) {
|
|
133
|
+
keys(match, MATCH_KEYS, `${at}.match`);
|
|
134
|
+
choice(match.look, CHOICES.matchLook, `${at}.match.look`);
|
|
135
|
+
}
|
|
136
|
+
const bank = record(s.bank);
|
|
137
|
+
if (bank) {
|
|
138
|
+
keys(bank, BANK_KEYS, `${at}.bank`);
|
|
139
|
+
choice(bank.order, CHOICES.order, `${at}.bank.order`);
|
|
140
|
+
}
|
|
141
|
+
const area = record(s.area);
|
|
142
|
+
if (area) {
|
|
143
|
+
keys(area, AREA_KEYS, `${at}.area`);
|
|
144
|
+
choice(area.kind, CHOICES.area, `${at}.area.kind`);
|
|
145
|
+
}
|
|
146
|
+
keys(s.grid, GRID_KEYS, `${at}.grid`);
|
|
147
|
+
const arithmetic = record(s.arithmetic);
|
|
148
|
+
if (arithmetic) {
|
|
149
|
+
keys(arithmetic, ARITHMETIC_KEYS, `${at}.arithmetic`);
|
|
150
|
+
choice(arithmetic.division, CHOICES.division, `${at}.arithmetic.division`);
|
|
151
|
+
}
|
|
152
|
+
keys(s.level, LEVEL_KEYS, `${at}.level`);
|
|
153
|
+
const icons = record(s.icons);
|
|
154
|
+
if (icons)
|
|
155
|
+
for (const [id, icon] of Object.entries(icons))
|
|
156
|
+
keys(icon, ICON_KEYS, `${at}.icons.${id}`);
|
|
157
|
+
keys(s.answers, ANSWERS_KEYS, `${at}.answers`);
|
|
158
|
+
solutions(s.solutions, `${at}.solutions`);
|
|
159
|
+
keys(s.digital, DIGITAL_KEYS, `${at}.digital`);
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
const book = record(config.exercises);
|
|
163
|
+
if (book) {
|
|
164
|
+
keys(book, EXERCISES_KEYS, 'exercises');
|
|
165
|
+
choice(book.edition, CHOICES.edition, 'exercises.edition');
|
|
166
|
+
solutions(book.solutions, 'exercises.solutions');
|
|
167
|
+
const digital = record(book.digital);
|
|
168
|
+
if (digital) {
|
|
169
|
+
keys(digital, EXERCISES_DIGITAL_KEYS, 'exercises.digital');
|
|
170
|
+
choice(digital.check, CHOICES.check, 'exercises.digital.check');
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return out;
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=configWarnings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configWarnings.js","sourceRoot":"","sources":["../../src/exercises/configWarnings.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The drawn parts of an exercise (#1227, #1228): writing areas, and the
|
|
3
|
+
* grids of word searches, crosswords and operations in columns. Each is a
|
|
4
|
+
* frameless box whose design draws it — paths for the rules, texts for the
|
|
5
|
+
* letters — so every output paints it as it paints any box design, a
|
|
6
|
+
* right-to-left page mirrors it, and the layout places and keeps it whole.
|
|
7
|
+
* Lengths are given in points.
|
|
8
|
+
*/
|
|
9
|
+
import type { CalloutStyleConfig, ColorValue, DesignElement, DesignPathElement, DesignTextElement } from '../types.js';
|
|
10
|
+
/** A frameless box drawn by `elements`, `heightPt` tall. */
|
|
11
|
+
export declare function drawnBox(id: string, elements: DesignElement[], heightPt: number, marginTopPt?: number, marginBottomPt?: number): CalloutStyleConfig;
|
|
12
|
+
/** A path element over `[0, w] × [0, h]` points, from the box's top left. */
|
|
13
|
+
export declare function pathElement(id: string, d: string, wPt: number, hPt: number, stroke: ColorValue, widthPt: number, extra?: Partial<DesignPathElement>): DesignPathElement;
|
|
14
|
+
/** A text element: `content` set in a box `wPt` × `hPt` at (`xPt`, `yPt`). */
|
|
15
|
+
export declare function textElement(id: string, content: string, xPt: number, yPt: number, wPt: number, hPt: number, sizePt: number, extra?: Partial<DesignTextElement>): DesignTextElement;
|
|
16
|
+
export type AreaKind = 'lines' | 'dots' | 'grid' | 'seyes' | 'tianzige' | 'box' | 'none';
|
|
17
|
+
export interface AreaSpec {
|
|
18
|
+
kind: AreaKind;
|
|
19
|
+
lines: number;
|
|
20
|
+
/** Distance between two lines (the side of a grid's square), points. */
|
|
21
|
+
spacingPt: number;
|
|
22
|
+
/** The room the area may take across, points. */
|
|
23
|
+
widthPt: number;
|
|
24
|
+
color: ColorValue;
|
|
25
|
+
weightPt: number;
|
|
26
|
+
/** Answers written on the lines (a teacher's edition), one a line, in
|
|
27
|
+
* `answerColor`. */
|
|
28
|
+
answers?: string[];
|
|
29
|
+
answerColor?: ColorValue;
|
|
30
|
+
answerSizePt?: number;
|
|
31
|
+
answerFont?: string;
|
|
32
|
+
}
|
|
33
|
+
/** The elements and height of a writing area. */
|
|
34
|
+
export declare function areaElements(a: AreaSpec): {
|
|
35
|
+
elements: DesignElement[];
|
|
36
|
+
heightPt: number;
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=designs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"designs.d.ts","sourceRoot":"","sources":["../../src/exercises/designs.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,UAAU,EAAE,aAAa,EAAE,iBAAiB,EAAE,iBAAiB,EAAa,MAAM,aAAa,CAAC;AAMlI,4DAA4D;AAC5D,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,SAAI,EAAE,cAAc,SAAI,GAAG,kBAAkB,CAgBzI;AAED,6EAA6E;AAC7E,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,GAAE,OAAO,CAAC,iBAAiB,CAAM,GAAG,iBAAiB,CAW3K;AAED,8EAA8E;AAC9E,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,GAAE,OAAO,CAAC,iBAAiB,CAAM,GAAG,iBAAiB,CAYtL;AAID,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,UAAU,GAAG,KAAK,GAAG,MAAM,CAAC;AAEzF,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,wEAAwE;IACxE,SAAS,EAAE,MAAM,CAAC;IAClB,iDAAiD;IACjD,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,UAAU,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB;yBACqB;IACrB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,CAAC,EAAE,UAAU,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,iDAAiD;AACjD,wBAAgB,YAAY,CAAC,CAAC,EAAE,QAAQ,GAAG;IAAE,QAAQ,EAAE,aAAa,EAAE,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAuEzF"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The drawn parts of an exercise (#1227, #1228): writing areas, and the
|
|
3
|
+
* grids of word searches, crosswords and operations in columns. Each is a
|
|
4
|
+
* frameless box whose design draws it — paths for the rules, texts for the
|
|
5
|
+
* letters — so every output paints it as it paints any box design, a
|
|
6
|
+
* right-to-left page mirrors it, and the layout places and keeps it whole.
|
|
7
|
+
* Lengths are given in points.
|
|
8
|
+
*/
|
|
9
|
+
import { graphemesOf } from '../measure/graphemes.js';
|
|
10
|
+
const PT = (value) => ({ value: Math.round(value * 1000) / 1000, unit: 'pt' });
|
|
11
|
+
const ZERO = PT(0);
|
|
12
|
+
/** A frameless box drawn by `elements`, `heightPt` tall. */
|
|
13
|
+
export function drawnBox(id, elements, heightPt, marginTopPt = 3, marginBottomPt = 3) {
|
|
14
|
+
return {
|
|
15
|
+
id,
|
|
16
|
+
title: '',
|
|
17
|
+
backgroundEnabled: false,
|
|
18
|
+
border: { enabled: false },
|
|
19
|
+
padding: { top: ZERO, right: ZERO, bottom: ZERO, left: ZERO },
|
|
20
|
+
stripe: { enabled: false },
|
|
21
|
+
icon: { kind: 'none' },
|
|
22
|
+
marker: { kind: 'none' },
|
|
23
|
+
marginTop: PT(marginTopPt),
|
|
24
|
+
marginBottom: PT(marginBottomPt),
|
|
25
|
+
snapToGrid: false,
|
|
26
|
+
keepTogether: true,
|
|
27
|
+
design: { enabled: true, slot: { elements }, minHeight: PT(heightPt) },
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
/** A path element over `[0, w] × [0, h]` points, from the box's top left. */
|
|
31
|
+
export function pathElement(id, d, wPt, hPt, stroke, widthPt, extra = {}) {
|
|
32
|
+
return {
|
|
33
|
+
kind: 'path',
|
|
34
|
+
id,
|
|
35
|
+
placement: { anchor: { to: 'container', edge: 'top-left' }, size: { width: PT(wPt), height: PT(hPt) } },
|
|
36
|
+
d,
|
|
37
|
+
viewBox: [Math.max(0.001, wPt), Math.max(0.001, hPt)],
|
|
38
|
+
stroke,
|
|
39
|
+
width: PT(widthPt),
|
|
40
|
+
...extra,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/** A text element: `content` set in a box `wPt` × `hPt` at (`xPt`, `yPt`). */
|
|
44
|
+
export function textElement(id, content, xPt, yPt, wPt, hPt, sizePt, extra = {}) {
|
|
45
|
+
return {
|
|
46
|
+
kind: 'text',
|
|
47
|
+
id,
|
|
48
|
+
content: content.replace(/[{}]/g, (c) => (c === '{' ? '\uFF5B' : '\uFF5D')),
|
|
49
|
+
fontSize: PT(sizePt),
|
|
50
|
+
align: 'center',
|
|
51
|
+
verticalAlign: 'middle',
|
|
52
|
+
overflow: 'clip',
|
|
53
|
+
placement: { anchor: { to: 'container', edge: 'top-left' }, offset: { x: PT(xPt), y: PT(yPt) }, size: { width: PT(wPt), height: PT(hPt) } },
|
|
54
|
+
...extra,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
const r = (n) => String(Math.round(n * 100) / 100);
|
|
58
|
+
/** The elements and height of a writing area. */
|
|
59
|
+
export function areaElements(a) {
|
|
60
|
+
const n = Math.max(1, Math.floor(a.lines));
|
|
61
|
+
const sp = a.spacingPt;
|
|
62
|
+
const w = a.widthPt;
|
|
63
|
+
const els = [];
|
|
64
|
+
let h = n * sp;
|
|
65
|
+
switch (a.kind) {
|
|
66
|
+
case 'lines':
|
|
67
|
+
case 'dots': {
|
|
68
|
+
let d = '';
|
|
69
|
+
for (let i = 0; i < n; i++)
|
|
70
|
+
d += `M0 ${r((i + 0.85) * sp)}H${r(w)}`;
|
|
71
|
+
els.push(pathElement('area', d, w, h, a.color, a.weightPt, a.kind === 'dots' ? { dash: [PT(a.weightPt * 1.2), PT(a.weightPt * 3)] } : {}));
|
|
72
|
+
break;
|
|
73
|
+
}
|
|
74
|
+
case 'grid':
|
|
75
|
+
case 'tianzige': {
|
|
76
|
+
const cols = Math.max(1, Math.floor(w / sp));
|
|
77
|
+
const gw = cols * sp;
|
|
78
|
+
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 = '';
|
|
86
|
+
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)] }));
|
|
91
|
+
}
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
case 'seyes': {
|
|
95
|
+
// French Seyès ruling: a heavy line every `sp`, three light ones
|
|
96
|
+
// between, light verticals every `sp`, a margin line on the left.
|
|
97
|
+
let heavy = '';
|
|
98
|
+
let light = '';
|
|
99
|
+
const cols = Math.max(1, Math.floor(w / sp));
|
|
100
|
+
for (let i = 0; i < n; i++) {
|
|
101
|
+
heavy += `M0 ${r((i + 1) * sp)}H${r(w)}`;
|
|
102
|
+
for (let k = 1; k < 4; k++)
|
|
103
|
+
light += `M0 ${r((i + k / 4) * sp)}H${r(w)}`;
|
|
104
|
+
}
|
|
105
|
+
for (let j = 1; j <= cols; j++)
|
|
106
|
+
light += `M${r(j * sp)} 0V${r(h)}`;
|
|
107
|
+
h = n * sp + a.weightPt;
|
|
108
|
+
els.push(pathElement('light', light, w, h, a.color, a.weightPt * 0.5));
|
|
109
|
+
els.push(pathElement('heavy', heavy, w, h, a.color, a.weightPt));
|
|
110
|
+
break;
|
|
111
|
+
}
|
|
112
|
+
case 'box':
|
|
113
|
+
els.push(pathElement('area', `M0 0H${r(w)}V${r(h)}H0Z`, w, h, a.color, a.weightPt));
|
|
114
|
+
break;
|
|
115
|
+
case 'none':
|
|
116
|
+
break;
|
|
117
|
+
}
|
|
118
|
+
if (a.answers && a.answerColor && (a.kind === 'grid' || a.kind === 'tianzige')) {
|
|
119
|
+
// On squares a model answer is written a character to a square, row
|
|
120
|
+
// after row, as a pupil writes on 田字格 or squared paper.
|
|
121
|
+
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) => {
|
|
124
|
+
if (ch.trim() === '')
|
|
125
|
+
return;
|
|
126
|
+
els.push(textElement(`answer${k}`, ch, (k % cols) * sp, Math.floor(k / cols) * sp, sp, sp, sp * 0.62, {
|
|
127
|
+
color: a.answerColor, overflow: 'clip', ...(a.answerFont ? { fontFamily: a.answerFont } : {}),
|
|
128
|
+
}));
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
else if (a.answers && a.answerColor) {
|
|
132
|
+
const size = a.answerSizePt ?? sp * 0.6;
|
|
133
|
+
a.answers.slice(0, n).forEach((text, i) => {
|
|
134
|
+
if (!text)
|
|
135
|
+
return;
|
|
136
|
+
els.push(textElement(`answer${i}`, text, sp * 0.15, i * sp, w - sp * 0.3, sp * 0.85, size, {
|
|
137
|
+
align: 'start', verticalAlign: 'bottom', color: a.answerColor, overflow: 'ellipsis-end', ...(a.answerFont ? { fontFamily: a.answerFont } : {}),
|
|
138
|
+
}));
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
return { elements: els, heightPt: h };
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=designs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"designs.js","sourceRoot":"","sources":["../../src/exercises/designs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What the digital outputs (#1230, #1231) need beside the records: the
|
|
3
|
+
* words of the exercise bar, how answers are checked and kept, and each
|
|
4
|
+
* style's colours. The layout carries it on `VDTDocument.exerciseDigital`;
|
|
5
|
+
* `exerciseDataOf` joins it with the records into the JSON the HTML output
|
|
6
|
+
* writes for the exercise script (`attachExercises`, `EXERCISE_SCRIPT`).
|
|
7
|
+
*/
|
|
8
|
+
import type { ExerciseSettings, ExerciseWords } from '../defaults/exercises.js';
|
|
9
|
+
import type { ExerciseRecord } from './record.js';
|
|
10
|
+
import type { Dimension } from '../types.js';
|
|
11
|
+
/** The words of the digital outputs, in the document language. */
|
|
12
|
+
export type ExerciseDigitalWords = Pick<ExerciseWords, 'exercise' | 'trueFalse' | 'check' | 'showSolution' | 'hideSolution' | 'reset' | 'correct' | 'wrong' | 'hint' | 'blank' | 'score'>;
|
|
13
|
+
/** How one exercise style looks answered. */
|
|
14
|
+
export interface ExerciseDigitalStyleInfo {
|
|
15
|
+
/** Right and wrong feedback, and the answers a solution shows. */
|
|
16
|
+
correct: string;
|
|
17
|
+
wrong: string;
|
|
18
|
+
answer: string;
|
|
19
|
+
/** The option marker (`options.marker`): a box or a ring is ticked, a
|
|
20
|
+
* bare label is ringed. */
|
|
21
|
+
marker: 'none' | 'box' | 'circle';
|
|
22
|
+
/** The true and false labels (`trueFalse.labels`). */
|
|
23
|
+
trueFalse: [string, string];
|
|
24
|
+
}
|
|
25
|
+
export interface ExerciseDigital {
|
|
26
|
+
words: ExerciseDigitalWords;
|
|
27
|
+
/** `exercises.digital`. */
|
|
28
|
+
interactive: boolean;
|
|
29
|
+
persist: boolean;
|
|
30
|
+
check: 'button' | 'instant';
|
|
31
|
+
styles: Record<string, ExerciseDigitalStyleInfo>;
|
|
32
|
+
}
|
|
33
|
+
/** The digital part of a document's exercise settings. */
|
|
34
|
+
export declare function exerciseDigitalOf(settings: ExerciseSettings): ExerciseDigital;
|
|
35
|
+
/** The JSON an HTML output writes for the exercise script
|
|
36
|
+
* (`<script type="application/json" class="pt-exercises">`). */
|
|
37
|
+
export interface ExerciseData extends ExerciseDigital {
|
|
38
|
+
/** Page pixels to a point: grid geometry in the records is in points
|
|
39
|
+
* from a drawn box's top left. */
|
|
40
|
+
pxPerPt: number;
|
|
41
|
+
/** The body text's size, page pixels: the size of the exercise bar. */
|
|
42
|
+
bodyPx: number;
|
|
43
|
+
/** The boxes stand in the text's flow (a reflowable book) rather than
|
|
44
|
+
* on a positioned page: the bar and the solution follow the box, sized
|
|
45
|
+
* in ems of its text. */
|
|
46
|
+
flow?: boolean;
|
|
47
|
+
exercises: ExerciseRecord[];
|
|
48
|
+
}
|
|
49
|
+
/** The exercise data of a laid-out document, or `undefined` when it has
|
|
50
|
+
* no exercises (or its exercises are not answerable,
|
|
51
|
+
* `exercises.digital.interactive: false`). */
|
|
52
|
+
export declare function exerciseDataOf(doc: {
|
|
53
|
+
exercises?: ExerciseRecord[];
|
|
54
|
+
exerciseDigital?: ExerciseDigital;
|
|
55
|
+
config: {
|
|
56
|
+
page: {
|
|
57
|
+
dpi: number;
|
|
58
|
+
};
|
|
59
|
+
bodyText: {
|
|
60
|
+
fontSize: Dimension;
|
|
61
|
+
};
|
|
62
|
+
};
|
|
63
|
+
}): ExerciseData | undefined;
|
|
64
|
+
/** `data` as the text of a `<script type="application/json">`, in HTML
|
|
65
|
+
* or XHTML: no `<` that would close the element early, no `&` an XML
|
|
66
|
+
* parser would read as a reference, no line separators a reader might
|
|
67
|
+
* trip on. */
|
|
68
|
+
export declare function exerciseDataJson(data: ExerciseData): string;
|
|
69
|
+
//# sourceMappingURL=digital.d.ts.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What the digital outputs (#1230, #1231) need beside the records: the
|
|
3
|
+
* words of the exercise bar, how answers are checked and kept, and each
|
|
4
|
+
* style's colours. The layout carries it on `VDTDocument.exerciseDigital`;
|
|
5
|
+
* `exerciseDataOf` joins it with the records into the JSON the HTML output
|
|
6
|
+
* writes for the exercise script (`attachExercises`, `EXERCISE_SCRIPT`).
|
|
7
|
+
*/
|
|
8
|
+
import { dimensionToPx } from '../units.js';
|
|
9
|
+
/** The digital part of a document's exercise settings. */
|
|
10
|
+
export function exerciseDigitalOf(settings) {
|
|
11
|
+
const w = settings.exercises.words;
|
|
12
|
+
const styles = {};
|
|
13
|
+
for (const s of settings.styles) {
|
|
14
|
+
if (styles[s.id])
|
|
15
|
+
continue;
|
|
16
|
+
styles[s.id] = {
|
|
17
|
+
correct: s.digital.correctColor.hex,
|
|
18
|
+
wrong: s.digital.wrongColor.hex,
|
|
19
|
+
answer: s.answers.color.hex,
|
|
20
|
+
marker: s.options.marker === 'box' || s.options.marker === 'circle' ? s.options.marker : 'none',
|
|
21
|
+
trueFalse: [s.trueFalse.labels[0], s.trueFalse.labels[1]],
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
return {
|
|
25
|
+
words: {
|
|
26
|
+
exercise: w.exercise, trueFalse: w.trueFalse, check: w.check, showSolution: w.showSolution, hideSolution: w.hideSolution,
|
|
27
|
+
reset: w.reset, correct: w.correct, wrong: w.wrong, hint: w.hint, blank: w.blank, score: w.score,
|
|
28
|
+
},
|
|
29
|
+
interactive: settings.exercises.digital.interactive,
|
|
30
|
+
persist: settings.exercises.digital.persist,
|
|
31
|
+
check: settings.exercises.digital.check,
|
|
32
|
+
styles,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/** The exercise data of a laid-out document, or `undefined` when it has
|
|
36
|
+
* no exercises (or its exercises are not answerable,
|
|
37
|
+
* `exercises.digital.interactive: false`). */
|
|
38
|
+
export function exerciseDataOf(doc) {
|
|
39
|
+
const records = doc.exercises;
|
|
40
|
+
const digital = doc.exerciseDigital;
|
|
41
|
+
if (!records || records.length === 0 || !digital || !digital.interactive)
|
|
42
|
+
return undefined;
|
|
43
|
+
const pxPerPt = doc.config.page.dpi / 72;
|
|
44
|
+
return { ...digital, pxPerPt, bodyPx: dimensionToPx(doc.config.bodyText.fontSize, doc.config.page.dpi), exercises: records };
|
|
45
|
+
}
|
|
46
|
+
/** `data` as the text of a `<script type="application/json">`, in HTML
|
|
47
|
+
* or XHTML: no `<` that would close the element early, no `&` an XML
|
|
48
|
+
* parser would read as a reference, no line separators a reader might
|
|
49
|
+
* trip on. */
|
|
50
|
+
export function exerciseDataJson(data) {
|
|
51
|
+
return JSON.stringify(data)
|
|
52
|
+
.replace(/</g, '\\u003c')
|
|
53
|
+
.replace(/>/g, '\\u003e')
|
|
54
|
+
.replace(/&/g, '\\u0026')
|
|
55
|
+
.replace(/\u2028/g, '\\u2028')
|
|
56
|
+
.replace(/\u2029/g, '\\u2029');
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=digital.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"digital.js","sourceRoot":"","sources":["../../src/exercises/digital.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The exercises of a document set as ordinary blocks (#1227): each
|
|
3
|
+
* `:::exercise` becomes a box (its style's `box`, or a frameless one) of
|
|
4
|
+
* paragraphs, chips and drawn boxes the layout already knows — so an
|
|
5
|
+
* exercise is placed, split, balanced, tagged and painted as any box is.
|
|
6
|
+
* Its solutions go where the book says (#1229), and every exercise leaves
|
|
7
|
+
* a record of what it asks and answers for the digital outputs (#1230).
|
|
8
|
+
*/
|
|
9
|
+
import type { ContentBlock } from '../parse/index.js';
|
|
10
|
+
import type { CalloutStyleConfig, ChipStyleConfig, DigitSystem, HeadingCounters, OutlineEntry, ParagraphStyleConfig } from '../types.js';
|
|
11
|
+
import type { ExerciseSettings } from '../defaults/exercises.js';
|
|
12
|
+
import type { ExerciseIssue, ExerciseModel } from './types.js';
|
|
13
|
+
import type { ExerciseRecord } from './record.js';
|
|
14
|
+
/** Container ids of the synthetic boxes and groups (clear of the parser's
|
|
15
|
+
* and of the other synthetic bases: 1e9 chapter-end notes, 1.5e9
|
|
16
|
+
* listings, 1.75e9 flow columns, 1.8e9 frames, 1.9e9 comic text, 2e9
|
|
17
|
+
* page-span embeds). */
|
|
18
|
+
export declare const EXERCISE_CONTAINER_BASE = 1600000000;
|
|
19
|
+
/** What the expansion needs from the document. */
|
|
20
|
+
export interface ExpandContext {
|
|
21
|
+
settings: ExerciseSettings;
|
|
22
|
+
/** The document's locale and digits. */
|
|
23
|
+
locale?: string;
|
|
24
|
+
digits?: DigitSystem;
|
|
25
|
+
/** Heading counters before the document (a book's earlier chapters). */
|
|
26
|
+
headings?: HeadingCounters;
|
|
27
|
+
/** Exercise counters carried from earlier chapters, by counter name. */
|
|
28
|
+
counters?: Record<string, number>;
|
|
29
|
+
/** The size of the text, points, and the room across a column. */
|
|
30
|
+
bodySizePt: number;
|
|
31
|
+
lineHeightPt: number;
|
|
32
|
+
measurePt: number;
|
|
33
|
+
/** A right-to-left document (its designs are mirrored). */
|
|
34
|
+
rtl?: boolean;
|
|
35
|
+
/** The text's font family: drawn letters (grids, matching) use it. */
|
|
36
|
+
bodyFont?: string;
|
|
37
|
+
/** Ids of the configured box styles (a style's `box` must name one). */
|
|
38
|
+
boxIds: ReadonlySet<string>;
|
|
39
|
+
/** The room a box style takes across (its side padding and border),
|
|
40
|
+
* points, by id: what an exercise set on that box has less to draw on. */
|
|
41
|
+
boxInsets?: ReadonlyMap<string, number>;
|
|
42
|
+
/** The book's outline, whose `exercise` entries a
|
|
43
|
+
* `:::solutions{scope="book"}` prints (#1229). */
|
|
44
|
+
outline?: readonly OutlineEntry[];
|
|
45
|
+
}
|
|
46
|
+
export interface ExerciseExpansion {
|
|
47
|
+
blocks: ContentBlock[];
|
|
48
|
+
/** Whether any exercise was set. */
|
|
49
|
+
wrapped: boolean;
|
|
50
|
+
boxes: CalloutStyleConfig[];
|
|
51
|
+
paragraphStyles: ParagraphStyleConfig[];
|
|
52
|
+
chipStyles: ChipStyleConfig[];
|
|
53
|
+
records: ExerciseRecord[];
|
|
54
|
+
issues: ExerciseIssue[];
|
|
55
|
+
/** The counters after the document, for the next chapter. */
|
|
56
|
+
counters: Record<string, number>;
|
|
57
|
+
}
|
|
58
|
+
/** The exercise numbers of a document, each exercise's own counter reset
|
|
59
|
+
* by the heading level its style names. */
|
|
60
|
+
export declare function numberExercises(blocks: readonly ContentBlock[], exercises: ExerciseModel[], ctx: ExpandContext): {
|
|
61
|
+
numbers: Map<number, string>;
|
|
62
|
+
counters: Record<string, number>;
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* Set the exercises of `blocks`. Blocks outside exercises pass as they are;
|
|
66
|
+
* a `:::solutions` line becomes the solutions the book prints there.
|
|
67
|
+
*/
|
|
68
|
+
export declare function expandExercises(blocks: readonly ContentBlock[], ctx: ExpandContext): ExerciseExpansion;
|
|
69
|
+
/** A length in points, `em` read against `sizePt`. */
|
|
70
|
+
export declare function dimPt(d: {
|
|
71
|
+
value: number;
|
|
72
|
+
unit: string;
|
|
73
|
+
}, sizePt: number): number;
|
|
74
|
+
//# sourceMappingURL=expand.d.ts.map
|
|
@@ -0,0 +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;AAi1BD,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"}
|