@longsightgroup/qti3-core 0.6.0 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/dist/index.d.ts +6 -1
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +5 -0
  4. package/dist/index.js.map +1 -1
  5. package/dist/parser.js +13 -1
  6. package/dist/parser.js.map +1 -1
  7. package/dist/shared-vocabulary-coverage-policy.d.ts +10 -0
  8. package/dist/shared-vocabulary-coverage-policy.d.ts.map +1 -0
  9. package/dist/shared-vocabulary-coverage-policy.js +61 -0
  10. package/dist/shared-vocabulary-coverage-policy.js.map +1 -0
  11. package/dist/shared-vocabulary-generated-families.d.ts +21 -0
  12. package/dist/shared-vocabulary-generated-families.d.ts.map +1 -0
  13. package/dist/shared-vocabulary-generated-families.js +194 -0
  14. package/dist/shared-vocabulary-generated-families.js.map +1 -0
  15. package/dist/shared-vocabulary-levels.d.ts +4 -0
  16. package/dist/shared-vocabulary-levels.d.ts.map +1 -0
  17. package/dist/shared-vocabulary-levels.js +4 -0
  18. package/dist/shared-vocabulary-levels.js.map +1 -0
  19. package/dist/shared-vocabulary-support.d.ts +3 -0
  20. package/dist/shared-vocabulary-support.d.ts.map +1 -0
  21. package/dist/shared-vocabulary-support.js +208 -0
  22. package/dist/shared-vocabulary-support.js.map +1 -0
  23. package/dist/shared-vocabulary-validation.d.ts +40 -0
  24. package/dist/shared-vocabulary-validation.d.ts.map +1 -0
  25. package/dist/shared-vocabulary-validation.js +108 -0
  26. package/dist/shared-vocabulary-validation.js.map +1 -0
  27. package/dist/shared-vocabulary.d.ts +35 -0
  28. package/dist/shared-vocabulary.d.ts.map +1 -0
  29. package/dist/shared-vocabulary.js +128 -0
  30. package/dist/shared-vocabulary.js.map +1 -0
  31. package/dist/types.d.ts +10 -0
  32. package/dist/types.d.ts.map +1 -1
  33. package/dist/validation.d.ts.map +1 -1
  34. package/dist/validation.js +364 -0
  35. package/dist/validation.js.map +1 -1
  36. package/dist/xml.d.ts.map +1 -1
  37. package/dist/xml.js +100 -0
  38. package/dist/xml.js.map +1 -1
  39. package/package.json +1 -1
  40. package/src/index.ts +56 -0
  41. package/src/parser.ts +17 -1
  42. package/src/shared-vocabulary-coverage-policy.ts +79 -0
  43. package/src/shared-vocabulary-generated-families.ts +252 -0
  44. package/src/shared-vocabulary-levels.ts +7 -0
  45. package/src/shared-vocabulary-support.ts +340 -0
  46. package/src/shared-vocabulary-validation.ts +182 -0
  47. package/src/shared-vocabulary.ts +177 -0
  48. package/src/types.ts +11 -0
  49. package/src/validation.ts +466 -0
  50. package/src/xml.ts +107 -0
@@ -0,0 +1,194 @@
1
+ export const SHARED_VOCABULARY_LAYOUT_COLUMN_SPAN_COUNT = 12;
2
+ export const SHARED_VOCABULARY_LAYOUT_OFFSET_COUNT = 11;
3
+ export const SHARED_VOCABULARY_CONTENT_ALIGNMENTS = ["left", "center", "right"];
4
+ export const SHARED_VOCABULARY_CONTENT_VALIGNS = ["top", "middle", "baseline", "bottom"];
5
+ export const SHARED_VOCABULARY_CONTENT_WIDTH_ALIASES = ["fullwidth", "width-full"];
6
+ export const SHARED_VOCABULARY_CONTENT_WRITING_MODES = [
7
+ "vertical-rl",
8
+ "vertical-lr",
9
+ "vertical-tb",
10
+ "horizontal-tb",
11
+ ];
12
+ export const SHARED_VOCABULARY_CONTENT_FLOAT_SUFFIXES = [
13
+ "left",
14
+ "right",
15
+ "none",
16
+ "clearfix",
17
+ "clear-left",
18
+ "clear-right",
19
+ "clear-both",
20
+ ];
21
+ export const SHARED_VOCABULARY_CHOICE_WRITING_ORIENTATIONS = [
22
+ "vertical-rl",
23
+ "vertical-lr",
24
+ ];
25
+ export const SHARED_VOCABULARY_CONTENT_TEXT_INDENT_SUFFIXES = [
26
+ "0",
27
+ "px",
28
+ "0p5",
29
+ "1",
30
+ "1p5",
31
+ "2",
32
+ "2p5",
33
+ "3",
34
+ "3p5",
35
+ "4",
36
+ "5",
37
+ "6",
38
+ "7",
39
+ "8",
40
+ "12",
41
+ "16",
42
+ "20",
43
+ "24",
44
+ "28",
45
+ "32",
46
+ ];
47
+ export const SHARED_VOCABULARY_CONTENT_LIST_STYLE_TYPES = [
48
+ "none",
49
+ "arabic-indic",
50
+ "armenian",
51
+ "bengali",
52
+ "cambodian",
53
+ "circle",
54
+ "cjk-earthly-branch",
55
+ "cjk-heavenly-stem",
56
+ "cjk-ideographic",
57
+ "decimal",
58
+ "decimal-leading-zero",
59
+ "devanagari",
60
+ "disc",
61
+ "ethiopic-halehame",
62
+ "ethiopic-halehame-am",
63
+ "ethiopic-halehame-ti-er",
64
+ "ethiopic-halehame-ti-et",
65
+ "georgian",
66
+ "gujarati",
67
+ "gurmukhi",
68
+ "hangul",
69
+ "hangul-consonant",
70
+ "hebrew",
71
+ "hiragana",
72
+ "hiragana-iroha",
73
+ "kannada",
74
+ "katakana",
75
+ "katakana-iroha",
76
+ "khmer",
77
+ "korean-hangul-formal",
78
+ "korean-hanja-formal",
79
+ "korean-hanja-informal",
80
+ "lao",
81
+ "lower-alpha",
82
+ "lower-armenian",
83
+ "lower-greek",
84
+ "lower-latin",
85
+ "lower-roman",
86
+ "malayalam",
87
+ "mongolian",
88
+ "myanmar",
89
+ "oriya",
90
+ "persian",
91
+ "simp-chinese-formal",
92
+ "simp-chinese-informal",
93
+ "square",
94
+ "telugu",
95
+ "thai",
96
+ "tibetan",
97
+ "trad-chinese-formal",
98
+ "trad-chinese-informal",
99
+ "upper-alpha",
100
+ "upper-armenian",
101
+ "upper-latin",
102
+ "upper-roman",
103
+ "urdu",
104
+ ];
105
+ function escapeRegExp(value) {
106
+ return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
107
+ }
108
+ function alternationPattern(values) {
109
+ return [...values]
110
+ .sort((left, right) => right.length - left.length)
111
+ .map(escapeRegExp)
112
+ .join("|");
113
+ }
114
+ function layoutSpanTokens(count) {
115
+ return Array.from({ length: count }, (_, index) => String(index + 1));
116
+ }
117
+ const layoutColumnPattern = new RegExp(`^qti-layout-col-?(?:${alternationPattern(layoutSpanTokens(SHARED_VOCABULARY_LAYOUT_COLUMN_SPAN_COUNT))})$`);
118
+ const layoutOffsetPattern = new RegExp(`^qti-layout-offset-?(?:${alternationPattern(layoutSpanTokens(SHARED_VOCABULARY_LAYOUT_OFFSET_COUNT))})$`);
119
+ const contentAlignmentPattern = new RegExp(`^qti-align-(?:${alternationPattern(SHARED_VOCABULARY_CONTENT_ALIGNMENTS)})$|^qti-valign-(?:${alternationPattern(SHARED_VOCABULARY_CONTENT_VALIGNS)})$`);
120
+ const contentWidthAliasPattern = new RegExp(`^qti-(?:${alternationPattern(SHARED_VOCABULARY_CONTENT_WIDTH_ALIASES)})$`);
121
+ const contentTextIndentPattern = new RegExp(`^qti-text-indent-(?:${alternationPattern(SHARED_VOCABULARY_CONTENT_TEXT_INDENT_SUFFIXES)})$`);
122
+ const contentWritingModePattern = new RegExp(`^qti-writing-mode-(?:${alternationPattern(SHARED_VOCABULARY_CONTENT_WRITING_MODES)})$`);
123
+ const contentFloatPattern = new RegExp(`^qti-float-(?:${alternationPattern(SHARED_VOCABULARY_CONTENT_FLOAT_SUFFIXES)})$`);
124
+ const contentListStylePattern = new RegExp(`^qti-list-style-type-(?:${alternationPattern(SHARED_VOCABULARY_CONTENT_LIST_STYLE_TYPES)})$`);
125
+ const choiceWritingOrientationPattern = new RegExp(`^qti-writing-orientation-(?:${alternationPattern(SHARED_VOCABULARY_CHOICE_WRITING_ORIENTATIONS)})$`);
126
+ export const sharedVocabularyMatrixCoverageFamilies = [
127
+ {
128
+ id: "content-layout-generated-column-variants",
129
+ levels: ["stylesheet"],
130
+ coveredBy: ["qti-layout-col6"],
131
+ rationale: "Column width classes are generated from the same twelve-column CSS template; qti-layout-col6 exercises the generated percentage rule and row wrapping behavior.",
132
+ matches: (className) => layoutColumnPattern.test(className),
133
+ },
134
+ {
135
+ id: "content-layout-generated-offset-variants",
136
+ levels: ["stylesheet"],
137
+ coveredBy: ["qti-layout-offset-3"],
138
+ rationale: "Offset classes are generated from one CSS template; qti-layout-offset-3 exercises the generated margin rule.",
139
+ matches: (className) => layoutOffsetPattern.test(className),
140
+ },
141
+ {
142
+ id: "content-alignment-variants",
143
+ levels: ["stylesheet"],
144
+ coveredBy: ["qti-align-center", "qti-valign-middle"],
145
+ rationale: "Alignment classes map one vocabulary suffix to the corresponding CSS property value; center and middle cover the text-align and vertical-align families.",
146
+ matches: (className) => contentAlignmentPattern.test(className),
147
+ },
148
+ {
149
+ id: "content-width-aliases",
150
+ levels: ["stylesheet"],
151
+ coveredBy: ["qti-width-full"],
152
+ rationale: "Both width aliases share the same CSS declaration block; qti-width-full covers the rendered width behavior.",
153
+ matches: (className) => contentWidthAliasPattern.test(className),
154
+ },
155
+ {
156
+ id: "content-text-indent-generated-variants",
157
+ levels: ["stylesheet"],
158
+ coveredBy: ["qti-text-indent-2"],
159
+ rationale: "Text-indent classes are generated from the same suffix-to-length table; qti-text-indent-2 covers non-zero indentation.",
160
+ matches: (className) => contentTextIndentPattern.test(className),
161
+ },
162
+ {
163
+ id: "content-writing-mode-generated-variants",
164
+ levels: ["stylesheet"],
165
+ coveredBy: ["qti-writing-mode-vertical-rl"],
166
+ rationale: "Writing-mode classes are direct CSS value mappings; vertical-rl covers the non-default vertical rendering path.",
167
+ matches: (className) => contentWritingModePattern.test(className),
168
+ },
169
+ {
170
+ id: "content-float-generated-variants",
171
+ levels: ["stylesheet"],
172
+ coveredBy: ["qti-float-left"],
173
+ rationale: "Float and clear classes are direct CSS value mappings; qti-float-left covers the floated rendering path.",
174
+ matches: (className) => contentFloatPattern.test(className),
175
+ },
176
+ {
177
+ id: "content-list-style-generated-variants",
178
+ levels: ["stylesheet"],
179
+ coveredBy: ["qti-list-style-type-square"],
180
+ rationale: "List-style classes are generated from the shared vocabulary token table; square covers the generated list-style-type rule.",
181
+ matches: (className) => contentListStylePattern.test(className),
182
+ },
183
+ {
184
+ id: "choice-writing-orientation-generated-variants",
185
+ levels: ["stylesheet"],
186
+ coveredBy: ["qti-writing-orientation-vertical-rl"],
187
+ rationale: "Choice writing-orientation classes share the vertical choice layout path; vertical-rl covers the orientation rule and upright labels.",
188
+ matches: (className) => choiceWritingOrientationPattern.test(className),
189
+ },
190
+ ];
191
+ export function matrixCoverageFamilyForClass(className, level) {
192
+ return sharedVocabularyMatrixCoverageFamilies.find((family) => family.levels.includes(level) && family.matches(className));
193
+ }
194
+ //# sourceMappingURL=shared-vocabulary-generated-families.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared-vocabulary-generated-families.js","sourceRoot":"","sources":["../src/shared-vocabulary-generated-families.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { SharedVocabularyClassSupport } from "./types.js";
2
+ export type SharedVocabularySupportLevel = SharedVocabularyClassSupport["level"];
3
+ export declare function isEnforcedSharedVocabularyLevel(level: SharedVocabularySupportLevel): boolean;
4
+ //# sourceMappingURL=shared-vocabulary-levels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared-vocabulary-levels.d.ts","sourceRoot":"","sources":["../src/shared-vocabulary-levels.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,YAAY,CAAC;AAE/D,MAAM,MAAM,4BAA4B,GAAG,4BAA4B,CAAC,OAAO,CAAC,CAAC;AAEjF,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,4BAA4B,GAAG,OAAO,CAE5F"}
@@ -0,0 +1,4 @@
1
+ export function isEnforcedSharedVocabularyLevel(level) {
2
+ return level !== "pass-through";
3
+ }
4
+ //# sourceMappingURL=shared-vocabulary-levels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared-vocabulary-levels.js","sourceRoot":"","sources":["../src/shared-vocabulary-levels.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,+BAA+B,CAAC,KAAmC;IACjF,OAAO,KAAK,KAAK,cAAc,CAAC;AAClC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { SharedVocabularyClassSupport } from "./types.js";
2
+ export declare const sharedVocabularyClassSupport: SharedVocabularyClassSupport[];
3
+ //# sourceMappingURL=shared-vocabulary-support.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared-vocabulary-support.d.ts","sourceRoot":"","sources":["../src/shared-vocabulary-support.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAsB,4BAA4B,EAAE,MAAM,YAAY,CAAC;AAiHnF,eAAO,MAAM,4BAA4B,EAAE,4BAA4B,EAkNtE,CAAC"}
@@ -0,0 +1,208 @@
1
+ import { SHARED_VOCABULARY_CHOICE_WRITING_ORIENTATIONS, SHARED_VOCABULARY_CONTENT_ALIGNMENTS, SHARED_VOCABULARY_CONTENT_FLOAT_SUFFIXES, SHARED_VOCABULARY_CONTENT_LIST_STYLE_TYPES, SHARED_VOCABULARY_CONTENT_TEXT_INDENT_SUFFIXES, SHARED_VOCABULARY_CONTENT_VALIGNS, SHARED_VOCABULARY_CONTENT_WRITING_MODES, SHARED_VOCABULARY_LAYOUT_COLUMN_SPAN_COUNT, SHARED_VOCABULARY_LAYOUT_OFFSET_COUNT, } from "./shared-vocabulary-generated-families.js";
2
+ import { SHARED_VOCABULARY_EXTENDED_TEXT_COUNTER_CLASSES, SHARED_VOCABULARY_EXTENDED_TEXT_HEIGHT_LINES, SHARED_VOCABULARY_INPUT_WIDTHS, } from "./shared-vocabulary.js";
3
+ const sharedVocabularyFixture = [
4
+ "packages/fixtures/packages/basic-item-player/valid-item-only/items/shared-vocabulary.xml",
5
+ ];
6
+ const fixtureTests = ["packages/fixtures/src/fixtures.test.ts", "packages/cli/src/index.test.ts"];
7
+ const sharedVocabularyMatrixTests = ["tests/browser/player-shared-vocabulary.spec.ts"];
8
+ const contentTests = [
9
+ ...fixtureTests,
10
+ "packages/core/src/core.test.ts",
11
+ "tests/browser/player-dom-behavior.spec.ts",
12
+ ...sharedVocabularyMatrixTests,
13
+ ];
14
+ const sharedVocabularyUnitTests = [
15
+ "packages/core/src/shared-vocabulary.test.ts",
16
+ "packages/player/src/interactions/shared-vocabulary.test.ts",
17
+ ];
18
+ const sharedVocabularyValidationTests = [
19
+ "packages/core/src/core.test.ts",
20
+ "packages/core/src/shared-vocabulary-validation.test.ts",
21
+ ];
22
+ const browserBehaviorTests = [
23
+ "tests/browser/player-dom-behavior.spec.ts",
24
+ ...sharedVocabularyMatrixTests,
25
+ ];
26
+ const graphicBrowserTests = ["tests/browser/player-graphic.spec.ts"];
27
+ const mediaBrowserTests = ["tests/browser/player.spec.ts", ...sharedVocabularyMatrixTests];
28
+ const mediaPlayerFixture = "packages/fixtures/packages/sv-matrix/items/media-controls-and-pause.xml";
29
+ const interactionInputWidthFixtures = [
30
+ "packages/fixtures/packages/sv-matrix/items/interaction-input-width-standalone.xml",
31
+ "packages/fixtures/packages/sv-matrix/items/interaction-input-width-embedded.xml",
32
+ ];
33
+ const orderMinMaxMessagesFixture = "packages/fixtures/packages/sv-matrix/items/order-min-max-messages.xml";
34
+ const choiceAndOrder = ["choice", "order"];
35
+ const choicesLayoutInteractions = [
36
+ "match",
37
+ "gapMatch",
38
+ "graphicGapMatch",
39
+ "order",
40
+ ];
41
+ const selectionPresentationInteractions = [
42
+ "choice",
43
+ "hottext",
44
+ "hotspot",
45
+ "graphicGapMatch",
46
+ ];
47
+ function svEntry(className, scope, level, options = {}) {
48
+ return {
49
+ className,
50
+ scope,
51
+ level,
52
+ ...options,
53
+ };
54
+ }
55
+ function contentStylesheetEntry(className, notes) {
56
+ return svEntry(className, "content", "stylesheet", {
57
+ fixtures: sharedVocabularyFixture,
58
+ tests: contentTests,
59
+ notes,
60
+ });
61
+ }
62
+ function interactionFullEntry(className, interactions, tests, notes) {
63
+ return svEntry(className, "interaction", "full", {
64
+ interactions,
65
+ fixtures: sharedVocabularyFixture,
66
+ tests,
67
+ notes,
68
+ });
69
+ }
70
+ function interactionStylesheetEntry(className, interactions, tests, notes) {
71
+ return svEntry(className, "interaction", "stylesheet", {
72
+ interactions,
73
+ fixtures: sharedVocabularyFixture,
74
+ tests,
75
+ notes,
76
+ });
77
+ }
78
+ function mediaPlayerSvEntry(className, notes, tests = mediaBrowserTests) {
79
+ return svEntry(className, "interaction", "full", {
80
+ interactions: ["media"],
81
+ fixtures: [mediaPlayerFixture],
82
+ tests,
83
+ notes,
84
+ });
85
+ }
86
+ export const sharedVocabularyClassSupport = [
87
+ contentStylesheetEntry("qti-layout-row", "Twelve-column content layout row; validated for supported child column spans and offsets."),
88
+ ...Array.from({ length: SHARED_VOCABULARY_LAYOUT_COLUMN_SPAN_COUNT }, (_, index) => index + 1).flatMap((span) => [
89
+ contentStylesheetEntry(`qti-layout-col${span}`),
90
+ contentStylesheetEntry(`qti-layout-col-${span}`),
91
+ ]),
92
+ ...Array.from({ length: SHARED_VOCABULARY_LAYOUT_OFFSET_COUNT }, (_, index) => index + 1).flatMap((offset) => [
93
+ contentStylesheetEntry(`qti-layout-offset${offset}`),
94
+ contentStylesheetEntry(`qti-layout-offset-${offset}`),
95
+ ]),
96
+ ...SHARED_VOCABULARY_CONTENT_ALIGNMENTS.map((alignment) => contentStylesheetEntry(`qti-align-${alignment}`)),
97
+ ...SHARED_VOCABULARY_CONTENT_VALIGNS.map((alignment) => contentStylesheetEntry(`qti-valign-${alignment}`)),
98
+ contentStylesheetEntry("qti-fullwidth"),
99
+ contentStylesheetEntry("qti-width-full"),
100
+ contentStylesheetEntry("qti-hidden", "Hides content from visual and assistive output."),
101
+ contentStylesheetEntry("qti-visually-hidden", "Keeps content available to assistive technology while removing it from visual flow."),
102
+ svEntry("qti-keyword-emphasis", "content", "conditional", {
103
+ fixtures: ["packages/fixtures/packages/sv-matrix/items/content-keyword-emphasis.xml"],
104
+ tests: sharedVocabularyMatrixTests,
105
+ notes: "Rendered with additional emphasis only when candidate PNP keyword-emphasis support is enabled by the host.",
106
+ }),
107
+ ...SHARED_VOCABULARY_CONTENT_TEXT_INDENT_SUFFIXES.map((suffix) => contentStylesheetEntry(`qti-text-indent-${suffix}`)),
108
+ ...SHARED_VOCABULARY_CONTENT_WRITING_MODES.map((mode) => contentStylesheetEntry(`qti-writing-mode-${mode}`)),
109
+ contentStylesheetEntry("qti-text-orientation-upright"),
110
+ contentStylesheetEntry("qti-text-combine-upright-all"),
111
+ ...SHARED_VOCABULARY_CONTENT_FLOAT_SUFFIXES.map((floatClass) => contentStylesheetEntry(`qti-float-${floatClass}`)),
112
+ contentStylesheetEntry("qti-bordered"),
113
+ contentStylesheetEntry("qti-well"),
114
+ ...SHARED_VOCABULARY_CONTENT_LIST_STYLE_TYPES.map((styleType) => contentStylesheetEntry(`qti-list-style-type-${styleType}`)),
115
+ contentStylesheetEntry("qti-underline"),
116
+ contentStylesheetEntry("qti-italic"),
117
+ contentStylesheetEntry("qti-display-inline-block"),
118
+ ...["none", "decimal", "cjk-ideographic", "lower-alpha", "upper-alpha"].map((labelStyle) => interactionFullEntry(`qti-labels-${labelStyle}`, choiceAndOrder, [
119
+ ...sharedVocabularyUnitTests,
120
+ ...browserBehaviorTests,
121
+ ])),
122
+ ...["none", "period", "parenthesis"].map((suffix) => interactionFullEntry(`qti-labels-suffix-${suffix}`, choiceAndOrder, [
123
+ ...sharedVocabularyUnitTests,
124
+ ...browserBehaviorTests,
125
+ ])),
126
+ ...["horizontal", "vertical"].map((orientation) => interactionFullEntry(`qti-orientation-${orientation}`, ["choice", "order"], [
127
+ "packages/player/src/interactions/choice-layout.test.ts",
128
+ ...sharedVocabularyUnitTests,
129
+ ...browserBehaviorTests,
130
+ ])),
131
+ ...Array.from({ length: 5 }, (_, index) => index + 1).map((stacking) => interactionFullEntry(`qti-choices-stacking-${stacking}`, ["choice"], [
132
+ "packages/player/src/interactions/choice-layout.test.ts",
133
+ "packages/core/src/core.test.ts",
134
+ ...browserBehaviorTests,
135
+ ])),
136
+ interactionStylesheetEntry("qti-input-control-hidden", ["choice", "hottext"], [...browserBehaviorTests, "tests/browser/player-keyboard-a11y.spec.ts"]),
137
+ ...SHARED_VOCABULARY_CHOICE_WRITING_ORIENTATIONS.map((orientation) => interactionStylesheetEntry(`qti-writing-orientation-${orientation}`, ["choice"], [...browserBehaviorTests])),
138
+ ...["light", "dark"].map((tone) => interactionStylesheetEntry(`qti-selections-${tone}`, selectionPresentationInteractions, [
139
+ ...browserBehaviorTests,
140
+ ...graphicBrowserTests,
141
+ ])),
142
+ interactionStylesheetEntry("qti-unselected-hidden", selectionPresentationInteractions, [
143
+ ...browserBehaviorTests,
144
+ ...graphicBrowserTests,
145
+ ]),
146
+ ...["top", "bottom", "left", "right"].map((position) => interactionFullEntry(`qti-choices-${position}`, choicesLayoutInteractions, [
147
+ ...sharedVocabularyUnitTests,
148
+ ...browserBehaviorTests,
149
+ ...graphicBrowserTests,
150
+ ])),
151
+ svEntry("data-min-selections-message", "interaction", "full", {
152
+ interactions: ["order"],
153
+ fixtures: [orderMinMaxMessagesFixture],
154
+ tests: sharedVocabularyMatrixTests,
155
+ notes: "Overrides minimum response validation text for order interactions.",
156
+ }),
157
+ svEntry("data-max-selections-message", "interaction", "full", {
158
+ interactions: ["choice", "order"],
159
+ fixtures: [orderMinMaxMessagesFixture],
160
+ tests: ["tests/browser/player-validation.spec.ts", ...sharedVocabularyMatrixTests],
161
+ notes: "Overrides maximum response validation text for choice and order interactions.",
162
+ }),
163
+ interactionFullEntry("qti-match-tabular", ["match"], [
164
+ "packages/core/src/core.test.ts",
165
+ ...browserBehaviorTests,
166
+ "tests/browser/player-keyboard-a11y.spec.ts",
167
+ ]),
168
+ svEntry("qti-header-hidden", "interaction", "conditional", {
169
+ interactions: ["match"],
170
+ fixtures: sharedVocabularyFixture,
171
+ tests: ["packages/core/src/core.test.ts", ...browserBehaviorTests],
172
+ notes: "Applied when qti-match-tabular selects the tabular match renderer.",
173
+ }),
174
+ interactionFullEntry("qti-gap-placement", ["gapMatch"], [...sharedVocabularyUnitTests, "packages/core/src/core.test.ts", ...browserBehaviorTests]),
175
+ ...SHARED_VOCABULARY_INPUT_WIDTHS.map((width) => svEntry(`qti-input-width-${width}`, "interaction", "full", {
176
+ interactions: ["textEntry", "inlineChoice"],
177
+ fixtures: interactionInputWidthFixtures,
178
+ tests: [
179
+ "packages/core/src/shared-vocabulary.test.ts",
180
+ "packages/core/src/core.test.ts",
181
+ ...sharedVocabularyMatrixTests,
182
+ ],
183
+ })),
184
+ ...SHARED_VOCABULARY_INPUT_WIDTHS.map((width) => svEntry(`qti-input-width-${width}`, "gap", "full", {
185
+ interactions: ["gapMatch"],
186
+ fixtures: sharedVocabularyFixture,
187
+ tests: [
188
+ "packages/core/src/shared-vocabulary.test.ts",
189
+ "packages/core/src/core.test.ts",
190
+ ...browserBehaviorTests,
191
+ ],
192
+ notes: "Supported on qti-gap targets when gap placement is authored.",
193
+ })),
194
+ ...SHARED_VOCABULARY_EXTENDED_TEXT_HEIGHT_LINES.map((lines) => interactionFullEntry(`qti-height-lines-${lines}`, ["extendedText"], [
195
+ ...sharedVocabularyValidationTests,
196
+ "packages/core/src/shared-vocabulary.test.ts",
197
+ ...browserBehaviorTests,
198
+ ])),
199
+ ...SHARED_VOCABULARY_EXTENDED_TEXT_COUNTER_CLASSES.map((className) => interactionFullEntry(className, ["extendedText"], [
200
+ ...sharedVocabularyValidationTests,
201
+ "packages/core/src/shared-vocabulary.test.ts",
202
+ ...browserBehaviorTests,
203
+ ])),
204
+ mediaPlayerSvEntry("data-qti-media-player-controls", "Supports tokens none, default, play, rewind, captions, and audioDescription on media interactions and rendered media assets.", [...mediaBrowserTests, "packages/core/src/shared-vocabulary-validation.test.ts"]),
205
+ mediaPlayerSvEntry("data-qti-media-player-pause-delay", "Reflects authored pause-delay values on rendered media assets. Pause timer behavior is covered in tests/browser/player.spec.ts."),
206
+ mediaPlayerSvEntry("data-qti-media-player-pause-duration", "Reflects authored pause-duration values on rendered media assets. Pause timer behavior is covered in tests/browser/player.spec.ts."),
207
+ ];
208
+ //# sourceMappingURL=shared-vocabulary-support.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared-vocabulary-support.js","sourceRoot":"","sources":["../src/shared-vocabulary-support.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import type { QtiDiagnostic, QtiSourceLocation } from "./types.js";
2
+ export interface SharedVocabularyNumericPrefixValidationOptions {
3
+ classNames: string[];
4
+ subjectQtiName: string;
5
+ path?: string | undefined;
6
+ source?: QtiSourceLocation | undefined;
7
+ classPrefix: string;
8
+ supportedClassNames: (classNames: string[]) => string[];
9
+ isSupportedClassName: (className: string) => boolean;
10
+ formatSupportedClasses: () => string;
11
+ conflictCode: string;
12
+ invalidCode: string;
13
+ }
14
+ export declare function validateSharedVocabularyNumericPrefix(options: SharedVocabularyNumericPrefixValidationOptions): QtiDiagnostic[];
15
+ export interface SharedVocabularyInputWidthValidationOptions {
16
+ classNames: string[];
17
+ subjectQtiName: string;
18
+ path?: string | undefined;
19
+ source?: QtiSourceLocation | undefined;
20
+ conflictCode: string;
21
+ invalidCode: string;
22
+ }
23
+ export declare function validateSharedVocabularyInputWidth(options: SharedVocabularyInputWidthValidationOptions): QtiDiagnostic[];
24
+ export interface SharedVocabularyExtendedTextValidationOptions {
25
+ classNames: string[];
26
+ subjectQtiName: string;
27
+ path?: string | undefined;
28
+ source?: QtiSourceLocation | undefined;
29
+ }
30
+ export declare function validateSharedVocabularyExtendedTextHeightLines(options: SharedVocabularyExtendedTextValidationOptions): QtiDiagnostic[];
31
+ export declare function validateSharedVocabularyExtendedTextCounter(options: SharedVocabularyExtendedTextValidationOptions): QtiDiagnostic[];
32
+ export declare function validateSharedVocabularyExtendedText(options: SharedVocabularyExtendedTextValidationOptions): QtiDiagnostic[];
33
+ export interface SharedVocabularyMediaPlayerControlsValidationOptions {
34
+ value: string | undefined;
35
+ subjectQtiName: string;
36
+ path?: string | undefined;
37
+ source?: QtiSourceLocation | undefined;
38
+ }
39
+ export declare function validateSharedVocabularyMediaPlayerControls(options: SharedVocabularyMediaPlayerControlsValidationOptions): QtiDiagnostic[];
40
+ //# sourceMappingURL=shared-vocabulary-validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared-vocabulary-validation.d.ts","sourceRoot":"","sources":["../src/shared-vocabulary-validation.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEnE,MAAM,WAAW,8CAA8C;IAC7D,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,MAAM,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,MAAM,EAAE,CAAC;IACxD,oBAAoB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC;IACrD,sBAAsB,EAAE,MAAM,MAAM,CAAC;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,qCAAqC,CACnD,OAAO,EAAE,8CAA8C,GACtD,aAAa,EAAE,CAqCjB;AAED,MAAM,WAAW,2CAA2C;IAC1D,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,MAAM,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;IACvC,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,kCAAkC,CAChD,OAAO,EAAE,2CAA2C,GACnD,aAAa,EAAE,CAcjB;AAED,MAAM,WAAW,6CAA6C;IAC5D,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,MAAM,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;CACxC;AAED,wBAAgB,+CAA+C,CAC7D,OAAO,EAAE,6CAA6C,GACrD,aAAa,EAAE,CAcjB;AAED,wBAAgB,2CAA2C,CACzD,OAAO,EAAE,6CAA6C,GACrD,aAAa,EAAE,CA0BjB;AAED,wBAAgB,oCAAoC,CAClD,OAAO,EAAE,6CAA6C,GACrD,aAAa,EAAE,CAKjB;AAED,MAAM,WAAW,oDAAoD;IACnE,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,MAAM,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;CACxC;AAED,wBAAgB,2CAA2C,CACzD,OAAO,EAAE,oDAAoD,GAC5D,aAAa,EAAE,CAYjB"}
@@ -0,0 +1,108 @@
1
+ import { formatSupportedExtendedTextCounterClasses, formatSupportedExtendedTextHeightLinesClasses, formatSupportedInputWidthClasses, formatSupportedMediaPlayerControlsTokens, isSupportedExtendedTextCounterClassName, isSupportedExtendedTextHeightLinesClassName, isSupportedInputWidthClassName, supportedExtendedTextCounterClassNames, supportedExtendedTextHeightLinesClassNames, supportedInputWidthClassNames, unsupportedMediaPlayerControlsTokens, } from "./shared-vocabulary.js";
2
+ export function validateSharedVocabularyNumericPrefix(options) {
3
+ const { classNames, subjectQtiName, path, source, classPrefix, supportedClassNames, isSupportedClassName, formatSupportedClasses, conflictCode, invalidCode, } = options;
4
+ const diagnostics = [];
5
+ const supported = supportedClassNames(classNames);
6
+ if (new Set(supported).size > 1) {
7
+ diagnostics.push({
8
+ code: conflictCode,
9
+ severity: "warning",
10
+ message: `${subjectQtiName} should not include multiple supported ${classPrefix}* classes: ${[...new Set(supported)].join(", ")}. The first class in class attribute order takes precedence at runtime.`,
11
+ path,
12
+ source,
13
+ });
14
+ }
15
+ for (const className of classNames) {
16
+ if (!className.startsWith(classPrefix))
17
+ continue;
18
+ if (isSupportedClassName(className))
19
+ continue;
20
+ diagnostics.push({
21
+ code: invalidCode,
22
+ severity: "warning",
23
+ message: `${subjectQtiName} shared vocabulary class ${className} is not supported; expected ${formatSupportedClasses()}.`,
24
+ path,
25
+ source,
26
+ });
27
+ }
28
+ return diagnostics;
29
+ }
30
+ export function validateSharedVocabularyInputWidth(options) {
31
+ const { classNames, subjectQtiName, path, source, conflictCode, invalidCode } = options;
32
+ return validateSharedVocabularyNumericPrefix({
33
+ classNames,
34
+ subjectQtiName,
35
+ path,
36
+ source,
37
+ classPrefix: "qti-input-width-",
38
+ supportedClassNames: supportedInputWidthClassNames,
39
+ isSupportedClassName: isSupportedInputWidthClassName,
40
+ formatSupportedClasses: formatSupportedInputWidthClasses,
41
+ conflictCode,
42
+ invalidCode,
43
+ });
44
+ }
45
+ export function validateSharedVocabularyExtendedTextHeightLines(options) {
46
+ const { classNames, subjectQtiName, path, source } = options;
47
+ return validateSharedVocabularyNumericPrefix({
48
+ classNames,
49
+ subjectQtiName,
50
+ path,
51
+ source,
52
+ classPrefix: "qti-height-lines-",
53
+ supportedClassNames: supportedExtendedTextHeightLinesClassNames,
54
+ isSupportedClassName: isSupportedExtendedTextHeightLinesClassName,
55
+ formatSupportedClasses: formatSupportedExtendedTextHeightLinesClasses,
56
+ conflictCode: "interaction.sharedVocabulary.extendedTextHeightLinesConflict",
57
+ invalidCode: "interaction.sharedVocabulary.extendedTextHeightLinesInvalid",
58
+ });
59
+ }
60
+ export function validateSharedVocabularyExtendedTextCounter(options) {
61
+ const { classNames, subjectQtiName, path, source } = options;
62
+ const diagnostics = [];
63
+ const counterClasses = supportedExtendedTextCounterClassNames(classNames);
64
+ if (new Set(counterClasses).size > 1) {
65
+ diagnostics.push({
66
+ code: "interaction.sharedVocabulary.extendedTextCounterConflict",
67
+ severity: "warning",
68
+ message: `${subjectQtiName} should not include multiple qti-counter-* classes: ${[...new Set(counterClasses)].join(", ")}. The first class in class attribute order takes precedence at runtime.`,
69
+ path,
70
+ source,
71
+ });
72
+ }
73
+ for (const className of classNames) {
74
+ if (!className.startsWith("qti-counter-"))
75
+ continue;
76
+ if (isSupportedExtendedTextCounterClassName(className))
77
+ continue;
78
+ diagnostics.push({
79
+ code: "interaction.sharedVocabulary.extendedTextCounterInvalid",
80
+ severity: "warning",
81
+ message: `${subjectQtiName} shared vocabulary class ${className} is not supported; expected ${formatSupportedExtendedTextCounterClasses()}.`,
82
+ path,
83
+ source,
84
+ });
85
+ }
86
+ return diagnostics;
87
+ }
88
+ export function validateSharedVocabularyExtendedText(options) {
89
+ return [
90
+ ...validateSharedVocabularyExtendedTextHeightLines(options),
91
+ ...validateSharedVocabularyExtendedTextCounter(options),
92
+ ];
93
+ }
94
+ export function validateSharedVocabularyMediaPlayerControls(options) {
95
+ const unsupported = unsupportedMediaPlayerControlsTokens(options.value);
96
+ if (unsupported.length === 0)
97
+ return [];
98
+ return [
99
+ {
100
+ code: "interaction.sharedVocabulary.mediaPlayerControlsInvalid",
101
+ severity: "warning",
102
+ message: `${options.subjectQtiName} data-qti-media-player-controls token ${[...new Set(unsupported)].join(", ")} is not supported; expected ${formatSupportedMediaPlayerControlsTokens()}.`,
103
+ path: options.path,
104
+ source: options.source,
105
+ },
106
+ ];
107
+ }
108
+ //# sourceMappingURL=shared-vocabulary-validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared-vocabulary-validation.js","sourceRoot":"","sources":["../src/shared-vocabulary-validation.ts"],"names":[],"mappings":"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"}