@longsightgroup/qti3-core 0.7.2 → 0.8.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 (119) hide show
  1. package/README.md +41 -10
  2. package/dist/content-text.d.ts +14 -0
  3. package/dist/content-text.d.ts.map +1 -0
  4. package/dist/content-text.js +58 -0
  5. package/dist/content-text.js.map +1 -0
  6. package/dist/index.d.ts +7 -3
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +6 -2
  9. package/dist/index.js.map +1 -1
  10. package/dist/package-xml.d.ts +12 -0
  11. package/dist/package-xml.d.ts.map +1 -0
  12. package/dist/package-xml.js +17 -0
  13. package/dist/package-xml.js.map +1 -0
  14. package/dist/parser-custom-interactions.d.ts +8 -0
  15. package/dist/parser-custom-interactions.d.ts.map +1 -0
  16. package/dist/parser-custom-interactions.js +178 -0
  17. package/dist/parser-custom-interactions.js.map +1 -0
  18. package/dist/parser-declarations.d.ts +6 -0
  19. package/dist/parser-declarations.d.ts.map +1 -0
  20. package/dist/parser-declarations.js +136 -0
  21. package/dist/parser-declarations.js.map +1 -0
  22. package/dist/parser-item-metadata.d.ts +9 -0
  23. package/dist/parser-item-metadata.d.ts.map +1 -0
  24. package/dist/parser-item-metadata.js +158 -0
  25. package/dist/parser-item-metadata.js.map +1 -0
  26. package/dist/parser-processing.d.ts +5 -0
  27. package/dist/parser-processing.d.ts.map +1 -0
  28. package/dist/parser-processing.js +642 -0
  29. package/dist/parser-processing.js.map +1 -0
  30. package/dist/parser-values.d.ts +8 -0
  31. package/dist/parser-values.d.ts.map +1 -0
  32. package/dist/parser-values.js +49 -0
  33. package/dist/parser-values.js.map +1 -0
  34. package/dist/parser.d.ts.map +1 -1
  35. package/dist/parser.js +32 -1086
  36. package/dist/parser.js.map +1 -1
  37. package/dist/processing-expression-tags.d.ts +56 -0
  38. package/dist/processing-expression-tags.d.ts.map +1 -0
  39. package/dist/processing-expression-tags.js +52 -0
  40. package/dist/processing-expression-tags.js.map +1 -0
  41. package/dist/processing-rules.d.ts +3 -0
  42. package/dist/processing-rules.d.ts.map +1 -0
  43. package/dist/processing-rules.js +10 -0
  44. package/dist/processing-rules.js.map +1 -0
  45. package/dist/serializer-processing-expressions.d.ts +8 -0
  46. package/dist/serializer-processing-expressions.d.ts.map +1 -0
  47. package/dist/serializer-processing-expressions.js +198 -0
  48. package/dist/serializer-processing-expressions.js.map +1 -0
  49. package/dist/serializer-processing-xml.d.ts +15 -0
  50. package/dist/serializer-processing-xml.d.ts.map +1 -0
  51. package/dist/serializer-processing-xml.js +46 -0
  52. package/dist/serializer-processing-xml.js.map +1 -0
  53. package/dist/serializer-processing.d.ts +8 -0
  54. package/dist/serializer-processing.d.ts.map +1 -0
  55. package/dist/serializer-processing.js +106 -0
  56. package/dist/serializer-processing.js.map +1 -0
  57. package/dist/shared-vocabulary-authoring.d.ts +50 -0
  58. package/dist/shared-vocabulary-authoring.d.ts.map +1 -0
  59. package/dist/shared-vocabulary-authoring.js +302 -0
  60. package/dist/shared-vocabulary-authoring.js.map +1 -0
  61. package/dist/shared-vocabulary-interaction-sets.d.ts +6 -0
  62. package/dist/shared-vocabulary-interaction-sets.d.ts.map +1 -0
  63. package/dist/shared-vocabulary-interaction-sets.js +23 -0
  64. package/dist/shared-vocabulary-interaction-sets.js.map +1 -0
  65. package/dist/shared-vocabulary-interaction-validation.d.ts +3 -0
  66. package/dist/shared-vocabulary-interaction-validation.d.ts.map +1 -0
  67. package/dist/shared-vocabulary-interaction-validation.js +99 -0
  68. package/dist/shared-vocabulary-interaction-validation.js.map +1 -0
  69. package/dist/shared-vocabulary-registry-validation.d.ts +5 -0
  70. package/dist/shared-vocabulary-registry-validation.d.ts.map +1 -0
  71. package/dist/shared-vocabulary-registry-validation.js +147 -0
  72. package/dist/shared-vocabulary-registry-validation.js.map +1 -0
  73. package/dist/shared-vocabulary-support.d.ts.map +1 -1
  74. package/dist/shared-vocabulary-support.js +96 -56
  75. package/dist/shared-vocabulary-support.js.map +1 -1
  76. package/dist/shared-vocabulary.d.ts +6 -0
  77. package/dist/shared-vocabulary.d.ts.map +1 -1
  78. package/dist/shared-vocabulary.js +12 -0
  79. package/dist/shared-vocabulary.js.map +1 -1
  80. package/dist/support.d.ts +4 -1
  81. package/dist/support.d.ts.map +1 -1
  82. package/dist/support.js +159 -10
  83. package/dist/support.js.map +1 -1
  84. package/dist/types.d.ts +38 -7
  85. package/dist/types.d.ts.map +1 -1
  86. package/dist/validation.d.ts.map +1 -1
  87. package/dist/validation.js +29 -250
  88. package/dist/validation.js.map +1 -1
  89. package/dist/xml.d.ts +10 -0
  90. package/dist/xml.d.ts.map +1 -1
  91. package/dist/xml.js +321 -249
  92. package/dist/xml.js.map +1 -1
  93. package/package.json +1 -4
  94. package/src/content-text.ts +80 -0
  95. package/src/index.ts +67 -0
  96. package/src/interaction-test-fixtures.ts +44 -0
  97. package/src/package-xml.ts +30 -0
  98. package/src/parser-custom-interactions.ts +309 -0
  99. package/src/parser-declarations.ts +174 -0
  100. package/src/parser-item-metadata.ts +194 -0
  101. package/src/parser-processing.ts +701 -0
  102. package/src/parser-values.ts +61 -0
  103. package/src/parser.ts +59 -1230
  104. package/src/processing-expression-tags.ts +65 -0
  105. package/src/processing-rules.ts +11 -0
  106. package/src/serializer-processing-expressions.ts +456 -0
  107. package/src/serializer-processing-xml.ts +67 -0
  108. package/src/serializer-processing.fixtures.ts +469 -0
  109. package/src/serializer-processing.ts +196 -0
  110. package/src/shared-vocabulary-authoring.ts +409 -0
  111. package/src/shared-vocabulary-interaction-sets.ts +28 -0
  112. package/src/shared-vocabulary-interaction-validation.ts +143 -0
  113. package/src/shared-vocabulary-registry-validation.ts +207 -0
  114. package/src/shared-vocabulary-support.ts +127 -101
  115. package/src/shared-vocabulary.ts +18 -0
  116. package/src/support.ts +174 -14
  117. package/src/types.ts +48 -7
  118. package/src/validation.ts +33 -341
  119. package/src/xml.ts +378 -255
package/README.md CHANGED
@@ -2,9 +2,9 @@
2
2
 
3
3
  Framework-neutral TypeScript core for QTI 3 assessment items.
4
4
 
5
- This package handles parsing, validation, response processing, scoring, support metadata,
6
- and serialized attempt state. It does not render UI and does not depend on a browser
7
- framework.
5
+ This package handles dependency-free XML parsing, validation, response processing, scoring,
6
+ support metadata, and serialized attempt state. It has zero third-party runtime dependencies,
7
+ does not render UI, and does not depend on a browser framework.
8
8
 
9
9
  ## Install
10
10
 
@@ -61,16 +61,16 @@ tables, response/outcome/template declaration default values, response processin
61
61
  authored feedback subtrees. It also reports secure-delivery v1 blockers such as
62
62
  template processing, set-correct-response, and adaptive response processing.
63
63
 
64
- String-range redaction aligns a private XML tag scan to the same stax parse tree used by
65
- `parseQtiXml`. Alignment failures are reported as `xml.parse` error diagnostics; hosts
66
- must treat those diagnostics, `parseQtiXml().ok === false`, and
67
- `buildQtiDeliverySafeXml().ok === false` as non-deliverable. The redacted output is
64
+ String-range redaction uses the same dependency-free XML parser as `parseQtiXml`, with
65
+ source ranges recorded during parsing. XML parse failures are reported as `xml.parse`
66
+ error diagnostics; hosts must treat those diagnostics, `parseQtiXml().ok === false`,
67
+ and `buildQtiDeliverySafeXml().ok === false` as non-deliverable. The redacted output is
68
68
  re-analyzed before `ok` is returned, but hosts should still treat redacted XML as
69
69
  untrusted presentation input.
70
70
 
71
- The scanner adds a second full pass over each XML string. That is acceptable for
72
- item-scale delivery and scoring, but package-level batch redaction should treat XML
73
- parsing as a hot path if whole packages are processed repeatedly.
71
+ The parser does not resolve external entities, process DTD entity declarations, or access
72
+ the network or filesystem. Unknown named entities are preserved verbatim, and numeric
73
+ character references expand to at most one valid XML character.
74
74
 
75
75
  Candidate-safe XML is not a full content audit. It does not remove solution text an
76
76
  author wrote directly into the item body, and it does not validate Portable Custom
@@ -120,3 +120,34 @@ line yet.
120
120
 
121
121
  See the main repository README for the support matrix and release notes:
122
122
  https://github.com/LongsightGroup/qti3
123
+
124
+ ### Shared vocabulary authoring
125
+
126
+ Authoring tools can build QTI shared-vocabulary controls from the core field registry instead of
127
+ maintaining local class-prefix logic:
128
+
129
+ ```ts
130
+ import {
131
+ parseSharedVocabularyClasses,
132
+ serializeSharedVocabularyAttributes,
133
+ serializeSharedVocabularyClassNames,
134
+ sharedVocabularyFieldsForInteraction,
135
+ } from "@longsightgroup/qti3-core";
136
+
137
+ const fields = sharedVocabularyFieldsForInteraction("choice");
138
+ const state = parseSharedVocabularyClasses("qti-labels-decimal qti-orientation-horizontal");
139
+
140
+ const className = serializeSharedVocabularyClassNames({
141
+ ...state,
142
+ "input-control-hidden": true,
143
+ }).join(" ");
144
+
145
+ const attrs = serializeSharedVocabularyAttributes(
146
+ { "media-player-controls": ["play", "captions"] },
147
+ "media",
148
+ );
149
+ ```
150
+
151
+ The registry models authoring-level fields such as `labels-style`, `choices-position`, and
152
+ `media-player-controls`; downstream products should keep UI labels, editor layout, and draft
153
+ property names in their own adapter layer.
@@ -0,0 +1,14 @@
1
+ import type { QtiChoice, QtiContentNode, QtiSourceLocation } from "./types.js";
2
+ export interface FlatTextFromContentOptions {
3
+ excludeAnnotations?: boolean;
4
+ }
5
+ export declare function normalizeFlatText(text: string): string;
6
+ /**
7
+ * Append parsed character data to QTI content. The XML layer keeps text verbatim in
8
+ * `XmlNode.content`; this helper drops block-layout indentation (whitespace-only segments
9
+ * that contain a newline) when building `QtiContentNode` trees.
10
+ */
11
+ export declare function appendContentTextNode(content: QtiContentNode[], text: string, source?: QtiSourceLocation): void;
12
+ export declare function flatTextFromContent(nodes: QtiContentNode[], options?: FlatTextFromContentOptions): string;
13
+ export declare function choiceAccessibleLabel(choice: QtiChoice | undefined, fallbackIdentifier?: string): string;
14
+ //# sourceMappingURL=content-text.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-text.d.ts","sourceRoot":"","sources":["../src/content-text.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/E,MAAM,WAAW,0BAA0B;IACzC,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,cAAc,EAAE,EACzB,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,iBAAiB,GACzB,IAAI,CAGN;AAOD,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,cAAc,EAAE,EACvB,OAAO,GAAE,0BAA+B,GACvC,MAAM,CAKR;AA+BD,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,GAAG,SAAS,EAC7B,kBAAkB,CAAC,EAAE,MAAM,GAC1B,MAAM,CAQR"}
@@ -0,0 +1,58 @@
1
+ export function normalizeFlatText(text) {
2
+ return text.replace(/\s+/g, " ").trim();
3
+ }
4
+ /**
5
+ * Append parsed character data to QTI content. The XML layer keeps text verbatim in
6
+ * `XmlNode.content`; this helper drops block-layout indentation (whitespace-only segments
7
+ * that contain a newline) when building `QtiContentNode` trees.
8
+ */
9
+ export function appendContentTextNode(content, text, source) {
10
+ if (text.length === 0 || isIndentationWhitespace(text))
11
+ return;
12
+ content.push({ kind: "text", text, source });
13
+ }
14
+ /** Block pretty-print noise such as `\n ` between sibling block elements, not inline spaces. */
15
+ function isIndentationWhitespace(text) {
16
+ return text.trim().length === 0 && text.includes("\n");
17
+ }
18
+ export function flatTextFromContent(nodes, options = {}) {
19
+ const excludeAnnotations = options.excludeAnnotations ?? false;
20
+ return normalizeFlatText(nodes.map((node) => flatTextFromContentNode(node, excludeAnnotations)).join(" "));
21
+ }
22
+ function flatTextFromContentNode(node, excludeAnnotations) {
23
+ switch (node.kind) {
24
+ case "text":
25
+ return node.text;
26
+ case "element":
27
+ if (excludeAnnotations &&
28
+ (node.qtiName === "annotation" || node.qtiName === "annotation-xml")) {
29
+ return "";
30
+ }
31
+ if (node.qtiName === "math" && node.attributes.alttext)
32
+ return node.attributes.alttext;
33
+ if (node.qtiName === "img" && node.attributes.alt)
34
+ return node.attributes.alt;
35
+ if (node.qtiName === "object" && node.attributes["object-label"]) {
36
+ return node.attributes["object-label"];
37
+ }
38
+ return node.children
39
+ .map((child) => flatTextFromContentNode(child, excludeAnnotations))
40
+ .join(" ");
41
+ case "feedback":
42
+ return node.children
43
+ .map((child) => flatTextFromContentNode(child, excludeAnnotations))
44
+ .join(" ");
45
+ case "interaction":
46
+ case "printedVariable":
47
+ return "";
48
+ }
49
+ }
50
+ export function choiceAccessibleLabel(choice, fallbackIdentifier) {
51
+ if (!choice)
52
+ return fallbackIdentifier ?? "";
53
+ const contentText = choice.content
54
+ ? flatTextFromContent(choice.content, { excludeAnnotations: true })
55
+ : "";
56
+ return normalizeFlatText(contentText || choice.text || choice.identifier || fallbackIdentifier || "");
57
+ }
58
+ //# sourceMappingURL=content-text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-text.js","sourceRoot":"","sources":["../src/content-text.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,17 +1,21 @@
1
1
  export { createCatalogSupportResolution, type QtiCatalogSupportResolution, type QtiCatalogSupportResolutionOptions, type QtiResolvedCatalogReference, type QtiResolvedCatalogSupport, } from "./catalog.js";
2
2
  export { analyzeQtiDeliverySecurity, buildQtiDeliverySafeXml, type QtiDeliverySafeXmlResult, type QtiDeliverySecurityAnalysis, type QtiDeliverySecurityFinding, type QtiDeliverySecurityFindingKind, } from "./delivery-security.js";
3
3
  export { compileQtiPatternMask, isValidQtiPatternMask } from "./pattern-mask.js";
4
+ export { parseQtiPackageXmlTree, type QtiPackageXmlNode, type QtiPackageXmlTree, } from "./package-xml.js";
4
5
  export { parseQtiXml } from "./parser.js";
5
6
  export { scoreQtiItemServerSide, type QtiServerScoringInput, type QtiServerScoringResponseInput, type QtiServerScoringResult, } from "./server-scoring.js";
7
+ export { serializeResponseProcessing, type QtiSerializeResponseProcessingResult, } from "./serializer-processing.js";
6
8
  export { createTextToSpeechTraversal, parseQtiDataSsml, validateQtiDataSsmlMetadata, type QtiDataSsml, type QtiDataSsmlBreak, type QtiDataSsmlBreakStrength, type QtiDataSsmlParseResult, type QtiDataSsmlPhoneme, type QtiDataSsmlProsody, type QtiDataSsmlSayAs, type QtiDataSsmlSub, type QtiTextToSpeechSegment, type QtiTextToSpeechSegmentKind, type QtiTextToSpeechTraversal, } from "./tts.js";
7
9
  export { assertQtiAttemptStateV1, createItemSession, isQtiAttemptStateV1, visibleModalFeedback, type QtiCustomOperatorContext, type QtiCustomOperatorHandler, type QtiCustomOperatorRegistry, type QtiItemSession, type QtiItemSessionOptions, } from "./session.js";
8
- export { deprecatedInteractionSupport, elementSupport, getInteractionSupport, interactionNameToType, interactionSupport, processingSupport, } from "./support.js";
10
+ export { deprecatedInteractionSupport, elementSupport, getInteractionSupport, interactionRegistryStatus, interactionNameToType, interactionSupport, itemMetadataSupport, processingSupport, } from "./support.js";
9
11
  export { sharedVocabularyClassSupport } from "./shared-vocabulary-support.js";
10
12
  export { findSharedVocabularyCoverageViolations, type SharedVocabularyCoverageViolation, } from "./shared-vocabulary-coverage-policy.js";
13
+ export { describeSharedVocabularyPrecedence, formatSharedVocabularyClassValueRange, matchedSharedVocabularyClassNames, parseClassValue, parseSharedVocabularyAttributes, parseSharedVocabularyClasses, serializeSharedVocabularyAttributes, serializeSharedVocabularyClassNames, sharedVocabularyClassNamesForField, sharedVocabularyFieldById, sharedVocabularyFieldsForInteraction, sharedVocabularyFixedClassName, sharedVocabularyInteractionFields, type QtiSharedVocabularyAttributeValueType, type QtiSharedVocabularyField, type QtiSharedVocabularyFieldValue, type QtiSharedVocabularyState, type QtiSharedVocabularyStateValue, } from "./shared-vocabulary-authoring.js";
14
+ export { SHARED_VOCABULARY_CHOICE_AND_ORDER_INTERACTIONS, SHARED_VOCABULARY_CHOICE_INTERACTIONS, SHARED_VOCABULARY_CHOICES_LAYOUT_INTERACTIONS, SHARED_VOCABULARY_MEDIA_INTERACTIONS, SHARED_VOCABULARY_SELECTION_PRESENTATION_INTERACTIONS, } from "./shared-vocabulary-interaction-sets.js";
11
15
  export { matrixCoverageFamilyForClass, 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_WIDTH_ALIASES, SHARED_VOCABULARY_CONTENT_WRITING_MODES, SHARED_VOCABULARY_LAYOUT_COLUMN_SPAN_COUNT, SHARED_VOCABULARY_LAYOUT_OFFSET_COUNT, sharedVocabularyMatrixCoverageFamilies, } from "./shared-vocabulary-generated-families.js";
12
16
  export { isEnforcedSharedVocabularyLevel, type SharedVocabularySupportLevel, } from "./shared-vocabulary-levels.js";
13
- export { extendedTextCounterPosition, extendedTextCounterPositionFromAttributes, extendedTextCounterState, extendedTextCounterStateFromAttributes, extendedTextCounterValues, extendedTextExpectedLengthFromAttributes, extendedTextHeightLines, extendedTextHeightLinesFromAttributes, firstMatchingSharedVocabularyClass, formatSupportedExtendedTextCounterClasses, formatSupportedExtendedTextHeightLinesClasses, formatSupportedGapInputWidthClasses, formatSupportedInputWidthClasses, formatSupportedMediaPlayerControlsTokens, gapInputWidthFromAttributes, isSupportedExtendedTextCounterClassName, isSupportedExtendedTextHeightLinesClassName, inputWidthFromAttributes, isSupportedInputWidthClassName, isSupportedMediaPlayerControlsToken, mediaPlayerControlsTokens, SHARED_VOCABULARY_EXTENDED_TEXT_COUNTER_CLASSES, SHARED_VOCABULARY_EXTENDED_TEXT_HEIGHT_LINES, SHARED_VOCABULARY_GAP_INPUT_WIDTHS, SHARED_VOCABULARY_INPUT_WIDTHS, SHARED_VOCABULARY_MEDIA_PLAYER_CONTROLS, sharedVocabularyClassNames, supportedExtendedTextCounterClassNames, supportedExtendedTextHeightLinesClassNames, supportedGapInputWidthClassNames, supportedInputWidthClassNames, unsupportedMediaPlayerControlsTokens, type ExtendedTextCounterState, type SharedVocabularyExtendedTextCounterPosition, type SharedVocabularyMediaPlayerControls, } from "./shared-vocabulary.js";
17
+ export { extendedTextCounterPosition, extendedTextCounterPositionFromAttributes, extendedTextCounterState, extendedTextCounterStateFromAttributes, extendedTextCounterValues, extendedTextExpectedLengthFromAttributes, extendedTextHeightLines, extendedTextHeightLinesFromAttributes, firstMatchingSharedVocabularyClass, formatSupportedExtendedTextCounterClasses, formatSupportedExtendedTextHeightLinesClasses, formatSupportedGapInputWidthClasses, formatSupportedInputWidthClasses, formatSupportedMediaPlayerControlsTokens, gapInputWidthFromAttributes, isSupportedExtendedTextCounterClassName, isSupportedExtendedTextHeightLinesClassName, inputWidthFromAttributes, isSupportedInputWidthClassName, isSupportedMediaPlayerControlsToken, mediaPlayerControlsTokens, SHARED_VOCABULARY_CHOICES_POSITIONS, SHARED_VOCABULARY_CHOICES_STACKING, SHARED_VOCABULARY_EXTENDED_TEXT_COUNTER_CLASSES, SHARED_VOCABULARY_EXTENDED_TEXT_HEIGHT_LINES, SHARED_VOCABULARY_GAP_INPUT_WIDTHS, SHARED_VOCABULARY_INPUT_WIDTHS, SHARED_VOCABULARY_LABEL_STYLES, SHARED_VOCABULARY_LABEL_SUFFIXES, SHARED_VOCABULARY_MEDIA_PLAYER_CONTROLS, SHARED_VOCABULARY_ORIENTATIONS, SHARED_VOCABULARY_SELECTION_TONES, sharedVocabularyClassNames, supportedExtendedTextCounterClassNames, supportedExtendedTextHeightLinesClassNames, supportedGapInputWidthClassNames, supportedInputWidthClassNames, unsupportedMediaPlayerControlsTokens, type ExtendedTextCounterState, type SharedVocabularyExtendedTextCounterPosition, type SharedVocabularyMediaPlayerControls, } from "./shared-vocabulary.js";
14
18
  export { validateAssessmentItem } from "./validation.js";
15
- export type { QtiAssessmentItem, QtiAttemptStatus, QtiAttemptStateV1, QtiCatalog, QtiCatalogCard, QtiCatalogCardEntry, QtiCatalogFileHref, QtiCatalogHtmlContent, QtiCatalogInfo, QtiCatalogReference, QtiChoice, QtiChoiceRole, QtiContentNode, QtiDiagnostic, QtiDocument, QtiElementSupport, QtiInteractionElementSupport, QtiInteraction, QtiInteractionType, QtiMediaSource, QtiMediaTrack, QtiModalFeedback, QtiObjectAsset, QtiParseResult, QtiProcessingElementSupport, QtiPortableCustomDefinition, QtiPortableCustomInteractionModule, QtiPortableCustomInteractionModules, QtiPortableCustomStateValue, QtiPortableCustomVariableBinding, QtiResponseBranch, QtiScoreResult, QtiSupportStatus, QtiTemplateDeclaration, QtiTemplateBranch, QtiTemplateProcessing, QtiTemplateRule, QtiValidationResult, QtiValue, SharedVocabularyClassSupport, } from "./types.js";
19
+ export type { QtiAssessmentItem, QtiAttemptStatus, QtiAttemptStateV1, QtiCatalog, QtiCatalogCard, QtiCatalogCardEntry, QtiCatalogFileHref, QtiCatalogHtmlContent, QtiCatalogInfo, QtiCatalogReference, QtiChoice, QtiChoiceRole, QtiCompanionMaterialsInfo, QtiCompanionMaterialsUnparsedChild, QtiContentNode, QtiCustomInteractionDefinition, QtiInteractionMarkupDefinition, QtiDiagnostic, QtiDocument, QtiElementSupport, QtiInteractionElementSupport, QtiItemMetadataElementSupport, QtiInteraction, QtiInteractionRegistryStatus, QtiInteractionType, QtiMediaSource, QtiMediaTrack, QtiMapEntry, QtiModalFeedback, QtiObjectAsset, QtiOutcomeDeclaration, QtiParseResult, QtiPhysicalMaterial, QtiProcessingExpression, QtiProcessingElementSupport, QtiPortableCustomDefinition, QtiPortableCustomInteractionModule, QtiPortableCustomInteractionModules, QtiPortableCustomStateValue, QtiPortableCustomVariableBinding, QtiAreaMapEntry, QtiGapMatchGapSegment, QtiGapMatchSegment, QtiGapMatchTextSegment, QtiHottextChoiceSegment, QtiHottextSegment, QtiHottextTextSegment, QtiResponseBranch, QtiResponseCondition, QtiResponseDeclaration, QtiResponseProcessing, QtiResponseRule, QtiScoreResult, QtiLookupOutcomeValue, QtiSetOutcomeValue, QtiSupportStatus, QtiTemplateDeclaration, QtiTemplateBranch, QtiTemplateProcessing, QtiTemplateRule, QtiValidationResult, QtiValue, SharedVocabularyClassSupport, } from "./types.js";
16
20
  export { isQtiPortableCustomStateValue, isQtiValue, qtiScalarToString, qtiValueToIdentifierList, qtiValueToString, qtiValueToStringList, readQtiPortableCustomStateValue, readQtiJsonValue, unknownToDisplayString, } from "./value-format.js";
17
21
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,16 +1,20 @@
1
1
  export { createCatalogSupportResolution, } from "./catalog.js";
2
2
  export { analyzeQtiDeliverySecurity, buildQtiDeliverySafeXml, } from "./delivery-security.js";
3
3
  export { compileQtiPatternMask, isValidQtiPatternMask } from "./pattern-mask.js";
4
+ export { parseQtiPackageXmlTree, } from "./package-xml.js";
4
5
  export { parseQtiXml } from "./parser.js";
5
6
  export { scoreQtiItemServerSide, } from "./server-scoring.js";
7
+ export { serializeResponseProcessing, } from "./serializer-processing.js";
6
8
  export { createTextToSpeechTraversal, parseQtiDataSsml, validateQtiDataSsmlMetadata, } from "./tts.js";
7
9
  export { assertQtiAttemptStateV1, createItemSession, isQtiAttemptStateV1, visibleModalFeedback, } from "./session.js";
8
- export { deprecatedInteractionSupport, elementSupport, getInteractionSupport, interactionNameToType, interactionSupport, processingSupport, } from "./support.js";
10
+ export { deprecatedInteractionSupport, elementSupport, getInteractionSupport, interactionRegistryStatus, interactionNameToType, interactionSupport, itemMetadataSupport, processingSupport, } from "./support.js";
9
11
  export { sharedVocabularyClassSupport } from "./shared-vocabulary-support.js";
10
12
  export { findSharedVocabularyCoverageViolations, } from "./shared-vocabulary-coverage-policy.js";
13
+ export { describeSharedVocabularyPrecedence, formatSharedVocabularyClassValueRange, matchedSharedVocabularyClassNames, parseClassValue, parseSharedVocabularyAttributes, parseSharedVocabularyClasses, serializeSharedVocabularyAttributes, serializeSharedVocabularyClassNames, sharedVocabularyClassNamesForField, sharedVocabularyFieldById, sharedVocabularyFieldsForInteraction, sharedVocabularyFixedClassName, sharedVocabularyInteractionFields, } from "./shared-vocabulary-authoring.js";
14
+ export { SHARED_VOCABULARY_CHOICE_AND_ORDER_INTERACTIONS, SHARED_VOCABULARY_CHOICE_INTERACTIONS, SHARED_VOCABULARY_CHOICES_LAYOUT_INTERACTIONS, SHARED_VOCABULARY_MEDIA_INTERACTIONS, SHARED_VOCABULARY_SELECTION_PRESENTATION_INTERACTIONS, } from "./shared-vocabulary-interaction-sets.js";
11
15
  export { matrixCoverageFamilyForClass, 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_WIDTH_ALIASES, SHARED_VOCABULARY_CONTENT_WRITING_MODES, SHARED_VOCABULARY_LAYOUT_COLUMN_SPAN_COUNT, SHARED_VOCABULARY_LAYOUT_OFFSET_COUNT, sharedVocabularyMatrixCoverageFamilies, } from "./shared-vocabulary-generated-families.js";
12
16
  export { isEnforcedSharedVocabularyLevel, } from "./shared-vocabulary-levels.js";
13
- export { extendedTextCounterPosition, extendedTextCounterPositionFromAttributes, extendedTextCounterState, extendedTextCounterStateFromAttributes, extendedTextCounterValues, extendedTextExpectedLengthFromAttributes, extendedTextHeightLines, extendedTextHeightLinesFromAttributes, firstMatchingSharedVocabularyClass, formatSupportedExtendedTextCounterClasses, formatSupportedExtendedTextHeightLinesClasses, formatSupportedGapInputWidthClasses, formatSupportedInputWidthClasses, formatSupportedMediaPlayerControlsTokens, gapInputWidthFromAttributes, isSupportedExtendedTextCounterClassName, isSupportedExtendedTextHeightLinesClassName, inputWidthFromAttributes, isSupportedInputWidthClassName, isSupportedMediaPlayerControlsToken, mediaPlayerControlsTokens, SHARED_VOCABULARY_EXTENDED_TEXT_COUNTER_CLASSES, SHARED_VOCABULARY_EXTENDED_TEXT_HEIGHT_LINES, SHARED_VOCABULARY_GAP_INPUT_WIDTHS, SHARED_VOCABULARY_INPUT_WIDTHS, SHARED_VOCABULARY_MEDIA_PLAYER_CONTROLS, sharedVocabularyClassNames, supportedExtendedTextCounterClassNames, supportedExtendedTextHeightLinesClassNames, supportedGapInputWidthClassNames, supportedInputWidthClassNames, unsupportedMediaPlayerControlsTokens, } from "./shared-vocabulary.js";
17
+ export { extendedTextCounterPosition, extendedTextCounterPositionFromAttributes, extendedTextCounterState, extendedTextCounterStateFromAttributes, extendedTextCounterValues, extendedTextExpectedLengthFromAttributes, extendedTextHeightLines, extendedTextHeightLinesFromAttributes, firstMatchingSharedVocabularyClass, formatSupportedExtendedTextCounterClasses, formatSupportedExtendedTextHeightLinesClasses, formatSupportedGapInputWidthClasses, formatSupportedInputWidthClasses, formatSupportedMediaPlayerControlsTokens, gapInputWidthFromAttributes, isSupportedExtendedTextCounterClassName, isSupportedExtendedTextHeightLinesClassName, inputWidthFromAttributes, isSupportedInputWidthClassName, isSupportedMediaPlayerControlsToken, mediaPlayerControlsTokens, SHARED_VOCABULARY_CHOICES_POSITIONS, SHARED_VOCABULARY_CHOICES_STACKING, SHARED_VOCABULARY_EXTENDED_TEXT_COUNTER_CLASSES, SHARED_VOCABULARY_EXTENDED_TEXT_HEIGHT_LINES, SHARED_VOCABULARY_GAP_INPUT_WIDTHS, SHARED_VOCABULARY_INPUT_WIDTHS, SHARED_VOCABULARY_LABEL_STYLES, SHARED_VOCABULARY_LABEL_SUFFIXES, SHARED_VOCABULARY_MEDIA_PLAYER_CONTROLS, SHARED_VOCABULARY_ORIENTATIONS, SHARED_VOCABULARY_SELECTION_TONES, sharedVocabularyClassNames, supportedExtendedTextCounterClassNames, supportedExtendedTextHeightLinesClassNames, supportedGapInputWidthClassNames, supportedInputWidthClassNames, unsupportedMediaPlayerControlsTokens, } from "./shared-vocabulary.js";
14
18
  export { validateAssessmentItem } from "./validation.js";
15
19
  export { isQtiPortableCustomStateValue, isQtiValue, qtiScalarToString, qtiValueToIdentifierList, qtiValueToString, qtiValueToStringList, readQtiPortableCustomStateValue, readQtiJsonValue, unknownToDisplayString, } from "./value-format.js";
16
20
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,8BAA8B,GAK/B,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,0BAA0B,EAC1B,uBAAuB,GAKxB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AACjF,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EACL,sBAAsB,GAIvB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,2BAA2B,EAC3B,gBAAgB,EAChB,2BAA2B,GAY5B,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,uBAAuB,EACvB,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,GAMrB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,4BAA4B,EAC5B,cAAc,EACd,qBAAqB,EACrB,qBAAqB,EACrB,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAC9E,OAAO,EACL,sCAAsC,GAEvC,MAAM,wCAAwC,CAAC;AAChD,OAAO,EACL,4BAA4B,EAC5B,6CAA6C,EAC7C,oCAAoC,EACpC,wCAAwC,EACxC,0CAA0C,EAC1C,8CAA8C,EAC9C,iCAAiC,EACjC,uCAAuC,EACvC,uCAAuC,EACvC,0CAA0C,EAC1C,qCAAqC,EACrC,sCAAsC,GACvC,MAAM,2CAA2C,CAAC;AACnD,OAAO,EACL,+BAA+B,GAEhC,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,2BAA2B,EAC3B,yCAAyC,EACzC,wBAAwB,EACxB,sCAAsC,EACtC,yBAAyB,EACzB,wCAAwC,EACxC,uBAAuB,EACvB,qCAAqC,EACrC,kCAAkC,EAClC,yCAAyC,EACzC,6CAA6C,EAC7C,mCAAmC,EACnC,gCAAgC,EAChC,wCAAwC,EACxC,2BAA2B,EAC3B,uCAAuC,EACvC,2CAA2C,EAC3C,wBAAwB,EACxB,8BAA8B,EAC9B,mCAAmC,EACnC,yBAAyB,EACzB,+CAA+C,EAC/C,4CAA4C,EAC5C,kCAAkC,EAClC,8BAA8B,EAC9B,uCAAuC,EACvC,0BAA0B,EAC1B,sCAAsC,EACtC,0CAA0C,EAC1C,gCAAgC,EAChC,6BAA6B,EAC7B,oCAAoC,GAIrC,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AA2CzD,OAAO,EACL,6BAA6B,EAC7B,UAAU,EACV,iBAAiB,EACjB,wBAAwB,EACxB,gBAAgB,EAChB,oBAAoB,EACpB,+BAA+B,EAC/B,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,8BAA8B,GAK/B,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,0BAA0B,EAC1B,uBAAuB,GAKxB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AACjF,OAAO,EACL,sBAAsB,GAGvB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EACL,sBAAsB,GAIvB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,2BAA2B,GAE5B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,2BAA2B,EAC3B,gBAAgB,EAChB,2BAA2B,GAY5B,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,uBAAuB,EACvB,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,GAMrB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,4BAA4B,EAC5B,cAAc,EACd,qBAAqB,EACrB,yBAAyB,EACzB,qBAAqB,EACrB,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAC9E,OAAO,EACL,sCAAsC,GAEvC,MAAM,wCAAwC,CAAC;AAChD,OAAO,EACL,kCAAkC,EAClC,qCAAqC,EACrC,iCAAiC,EACjC,eAAe,EACf,+BAA+B,EAC/B,4BAA4B,EAC5B,mCAAmC,EACnC,mCAAmC,EACnC,kCAAkC,EAClC,yBAAyB,EACzB,oCAAoC,EACpC,8BAA8B,EAC9B,iCAAiC,GAMlC,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACL,+CAA+C,EAC/C,qCAAqC,EACrC,6CAA6C,EAC7C,oCAAoC,EACpC,qDAAqD,GACtD,MAAM,yCAAyC,CAAC;AACjD,OAAO,EACL,4BAA4B,EAC5B,6CAA6C,EAC7C,oCAAoC,EACpC,wCAAwC,EACxC,0CAA0C,EAC1C,8CAA8C,EAC9C,iCAAiC,EACjC,uCAAuC,EACvC,uCAAuC,EACvC,0CAA0C,EAC1C,qCAAqC,EACrC,sCAAsC,GACvC,MAAM,2CAA2C,CAAC;AACnD,OAAO,EACL,+BAA+B,GAEhC,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,2BAA2B,EAC3B,yCAAyC,EACzC,wBAAwB,EACxB,sCAAsC,EACtC,yBAAyB,EACzB,wCAAwC,EACxC,uBAAuB,EACvB,qCAAqC,EACrC,kCAAkC,EAClC,yCAAyC,EACzC,6CAA6C,EAC7C,mCAAmC,EACnC,gCAAgC,EAChC,wCAAwC,EACxC,2BAA2B,EAC3B,uCAAuC,EACvC,2CAA2C,EAC3C,wBAAwB,EACxB,8BAA8B,EAC9B,mCAAmC,EACnC,yBAAyB,EACzB,mCAAmC,EACnC,kCAAkC,EAClC,+CAA+C,EAC/C,4CAA4C,EAC5C,kCAAkC,EAClC,8BAA8B,EAC9B,8BAA8B,EAC9B,gCAAgC,EAChC,uCAAuC,EACvC,8BAA8B,EAC9B,iCAAiC,EACjC,0BAA0B,EAC1B,sCAAsC,EACtC,0CAA0C,EAC1C,gCAAgC,EAChC,6BAA6B,EAC7B,oCAAoC,GAIrC,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAkEzD,OAAO,EACL,6BAA6B,EAC7B,UAAU,EACV,iBAAiB,EACjB,wBAAwB,EACxB,gBAAgB,EAChB,oBAAoB,EACpB,+BAA+B,EAC/B,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,12 @@
1
+ export interface QtiPackageXmlNode {
2
+ localName: string;
3
+ attributes: Record<string, string>;
4
+ children: QtiPackageXmlNode[];
5
+ text: string;
6
+ }
7
+ export interface QtiPackageXmlTree {
8
+ root: QtiPackageXmlNode | undefined;
9
+ errors: string[];
10
+ }
11
+ export declare function parseQtiPackageXmlTree(xml: string): QtiPackageXmlTree;
12
+ //# sourceMappingURL=package-xml.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-xml.d.ts","sourceRoot":"","sources":["../src/package-xml.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,iBAAiB,GAAG,SAAS,CAAC;IACpC,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,CAMrE"}
@@ -0,0 +1,17 @@
1
+ import { parseXmlTree } from "./xml.js";
2
+ export function parseQtiPackageXmlTree(xml) {
3
+ const parsed = parseXmlTree(xml);
4
+ return {
5
+ root: parsed.root ? packageXmlNode(parsed.root) : undefined,
6
+ errors: parsed.errors.map((error) => error.message),
7
+ };
8
+ }
9
+ function packageXmlNode(node) {
10
+ return {
11
+ localName: node.localName,
12
+ attributes: node.attributes,
13
+ children: node.children.map(packageXmlNode),
14
+ text: node.text,
15
+ };
16
+ }
17
+ //# sourceMappingURL=package-xml.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-xml.js","sourceRoot":"","sources":["../src/package-xml.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAgB,MAAM,UAAU,CAAC;AActD,MAAM,UAAU,sBAAsB,CAAC,GAAW;IAChD,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IACjC,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;QAC3D,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC;KACpD,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,IAAa;IACnC,OAAO;QACL,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC;QAC3C,IAAI,EAAE,IAAI,CAAC,IAAI;KAChB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { QtiCustomInteractionDefinition, QtiDiagnostic, QtiInteractionType, QtiPortableCustomDefinition } from "./types.js";
2
+ import { type XmlNode } from "./xml.js";
3
+ export type QtiInteractionElementPredicate = (node: XmlNode) => boolean;
4
+ export declare function parseInteractionCustomPayload(node: XmlNode, interactionType: QtiInteractionType | undefined, diagnostics: QtiDiagnostic[], isInteractionElement: QtiInteractionElementPredicate): {
5
+ customInteraction?: QtiCustomInteractionDefinition;
6
+ portableCustom?: QtiPortableCustomDefinition;
7
+ };
8
+ //# sourceMappingURL=parser-custom-interactions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser-custom-interactions.d.ts","sourceRoot":"","sources":["../src/parser-custom-interactions.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEV,8BAA8B,EAC9B,aAAa,EAEb,kBAAkB,EAClB,2BAA2B,EAI5B,MAAM,YAAY,CAAC;AACpB,OAAO,EAAoD,KAAK,OAAO,EAAE,MAAM,UAAU,CAAC;AAE1F,MAAM,MAAM,8BAA8B,GAAG,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC;AA4BxE,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,OAAO,EACb,eAAe,EAAE,kBAAkB,GAAG,SAAS,EAC/C,WAAW,EAAE,aAAa,EAAE,EAC5B,oBAAoB,EAAE,8BAA8B,GACnD;IACD,iBAAiB,CAAC,EAAE,8BAA8B,CAAC;IACnD,cAAc,CAAC,EAAE,2BAA2B,CAAC;CAC9C,CAYA"}
@@ -0,0 +1,178 @@
1
+ import { appendContentTextNode } from "./content-text.js";
2
+ import { firstChildElement, parseCatalogInfo, parseStylesheet } from "./parser-item-metadata.js";
3
+ import { childElements, escapeXmlAttribute, escapeXmlText } from "./xml.js";
4
+ const LEGACY_CUSTOM_PROMPT_LOCAL_NAME = "qti-prompt";
5
+ const legacyCustomSerializeOptions = {
6
+ excludeLocalNames: [LEGACY_CUSTOM_PROMPT_LOCAL_NAME],
7
+ };
8
+ const legacyCustomMarkupOptions = {
9
+ nestedInteractionCode: "interaction.custom.markupInteraction",
10
+ contextName: "qti-custom-interaction markup",
11
+ skipChild: (child) => child.localName === LEGACY_CUSTOM_PROMPT_LOCAL_NAME,
12
+ };
13
+ const portableCustomMarkupOptions = {
14
+ nestedInteractionCode: "interaction.portableCustom.markupInteraction",
15
+ contextName: "qti-interaction-markup",
16
+ };
17
+ export function parseInteractionCustomPayload(node, interactionType, diagnostics, isInteractionElement) {
18
+ if (node.localName === "qti-custom-interaction") {
19
+ return {
20
+ customInteraction: parseCustomInteractionDefinition(node, diagnostics, isInteractionElement),
21
+ };
22
+ }
23
+ if (interactionType === "portableCustom") {
24
+ return {
25
+ portableCustom: parsePortableCustomDefinition(node, diagnostics, isInteractionElement),
26
+ };
27
+ }
28
+ return {};
29
+ }
30
+ function parseCustomInteractionDefinition(node, diagnostics, isInteractionElement) {
31
+ return parseInteractionMarkupDefinition(node, diagnostics, isInteractionElement, legacyCustomMarkupOptions, legacyCustomSerializeOptions);
32
+ }
33
+ function parsePortableCustomDefinition(node, diagnostics, isInteractionElement) {
34
+ const markup = firstChildElement(node, "qti-interaction-markup", diagnostics, "interaction.portableCustom.child.duplicate");
35
+ const modules = firstChildElement(node, "qti-interaction-modules", diagnostics, "interaction.portableCustom.child.duplicate");
36
+ return {
37
+ ...parseInteractionMarkupShell(markup, node, diagnostics, isInteractionElement, portableCustomMarkupOptions),
38
+ customInteractionTypeIdentifier: node.attributes["custom-interaction-type-identifier"],
39
+ module: node.attributes.module,
40
+ interactionModules: modules ? parsePortableCustomInteractionModules(modules) : undefined,
41
+ templateVariables: childElements(node, "qti-template-variable").map((variable) => parsePortableCustomVariableBinding(variable, "template")),
42
+ contextVariables: childElements(node, "qti-context-variable").map((variable) => parsePortableCustomVariableBinding(variable, "context")),
43
+ stylesheets: childElements(node, "qti-stylesheet").map(parseStylesheet),
44
+ catalogInfo: parseCatalogInfo(firstChildElement(node, "qti-catalog-info", diagnostics, "interaction.portableCustom.child.duplicate")),
45
+ };
46
+ }
47
+ function parseInteractionMarkupDefinition(markupNode, diagnostics, isInteractionElement, markupOptions, serializeOptions) {
48
+ const interactionMarkup = parseCustomMarkupChildren(markupNode, diagnostics, isInteractionElement, markupOptions);
49
+ const interactionMarkupRaw = serializeXmlContentOrUndefined(markupNode, serializeOptions);
50
+ return {
51
+ responseIdentifier: markupNode.attributes["response-identifier"],
52
+ interactionMarkup,
53
+ interactionMarkupRaw,
54
+ dataAttributes: parseInteractionDataAttributes(markupNode),
55
+ attributes: markupNode.attributes,
56
+ source: markupNode.source,
57
+ };
58
+ }
59
+ function parseInteractionMarkupShell(markupNode, attributeNode, diagnostics, isInteractionElement, markupOptions) {
60
+ if (!markupNode) {
61
+ return {
62
+ responseIdentifier: attributeNode.attributes["response-identifier"],
63
+ interactionMarkup: [],
64
+ dataAttributes: parseInteractionDataAttributes(attributeNode),
65
+ attributes: attributeNode.attributes,
66
+ source: attributeNode.source,
67
+ };
68
+ }
69
+ return {
70
+ ...parseInteractionMarkupDefinition(markupNode, diagnostics, isInteractionElement, markupOptions),
71
+ responseIdentifier: attributeNode.attributes["response-identifier"],
72
+ dataAttributes: parseInteractionDataAttributes(attributeNode),
73
+ attributes: attributeNode.attributes,
74
+ source: attributeNode.source,
75
+ };
76
+ }
77
+ function parseInteractionDataAttributes(node) {
78
+ return Object.fromEntries(Object.entries(node.attributes).filter(([name]) => name.startsWith("data-")));
79
+ }
80
+ function parseCustomMarkupChildren(node, diagnostics, isInteractionElement, options) {
81
+ const content = [];
82
+ for (const entry of node.content) {
83
+ if (typeof entry === "string") {
84
+ appendContentTextNode(content, entry, node.source);
85
+ continue;
86
+ }
87
+ if (options.skipChild?.(entry))
88
+ continue;
89
+ content.push(parseCustomMarkupNode(entry, diagnostics, isInteractionElement, options));
90
+ }
91
+ return content;
92
+ }
93
+ function parseCustomMarkupNode(node, diagnostics, isInteractionElement, options) {
94
+ if (isInteractionElement(node)) {
95
+ diagnostics.push({
96
+ code: options.nestedInteractionCode,
97
+ severity: "error",
98
+ message: `${options.contextName} must not contain nested QTI interaction ${node.localName}.`,
99
+ path: node.source?.path,
100
+ source: node.source,
101
+ });
102
+ }
103
+ if (node.localName === "qti-printed-variable") {
104
+ return {
105
+ kind: "printedVariable",
106
+ identifier: node.attributes.identifier ?? "",
107
+ format: node.attributes.format,
108
+ attributes: node.attributes,
109
+ source: node.source,
110
+ };
111
+ }
112
+ if (node.localName === "qti-feedback-block" || node.localName === "qti-feedback-inline") {
113
+ return {
114
+ kind: "feedback",
115
+ feedbackType: node.localName === "qti-feedback-block" ? "block" : "inline",
116
+ identifier: node.attributes.identifier ?? "",
117
+ outcomeIdentifier: node.attributes["outcome-identifier"] ?? "",
118
+ showHide: node.attributes["show-hide"] === "hide" ? "hide" : "show",
119
+ attributes: node.attributes,
120
+ children: parseCustomMarkupChildren(node, diagnostics, isInteractionElement, options),
121
+ source: node.source,
122
+ };
123
+ }
124
+ return {
125
+ kind: "element",
126
+ qtiName: node.localName,
127
+ attributes: node.attributes,
128
+ children: parseCustomMarkupChildren(node, diagnostics, isInteractionElement, options),
129
+ source: node.source,
130
+ };
131
+ }
132
+ function parsePortableCustomInteractionModules(node) {
133
+ return {
134
+ primaryConfiguration: node.attributes["primary-configuration"],
135
+ secondaryConfiguration: node.attributes["secondary-configuration"] ?? node.attributes["fallback-configuration"],
136
+ modules: childElements(node, "qti-interaction-module").map(parsePortableCustomInteractionModule),
137
+ attributes: node.attributes,
138
+ source: node.source,
139
+ };
140
+ }
141
+ function parsePortableCustomInteractionModule(node) {
142
+ return {
143
+ id: node.attributes.id,
144
+ primaryPath: node.attributes["primary-path"],
145
+ fallbackPath: node.attributes["fallback-path"],
146
+ attributes: node.attributes,
147
+ source: node.source,
148
+ };
149
+ }
150
+ function parsePortableCustomVariableBinding(node, kind) {
151
+ return {
152
+ kind,
153
+ identifier: node.attributes.identifier ?? node.attributes["template-identifier"],
154
+ variableIdentifier: node.attributes["variable-identifier"],
155
+ attributes: node.attributes,
156
+ source: node.source,
157
+ };
158
+ }
159
+ function serializeXmlContentOrUndefined(node, options) {
160
+ const content = serializeXmlContent(node, options);
161
+ return content.trim().length > 0 ? content : undefined;
162
+ }
163
+ function serializeXmlContent(node, options) {
164
+ const exclude = options?.excludeLocalNames ? new Set(options.excludeLocalNames) : undefined;
165
+ return node.content
166
+ .filter((entry) => typeof entry === "string" || !exclude?.has(entry.localName))
167
+ .map((entry) => (typeof entry === "string" ? escapeXmlText(entry) : serializeXmlNode(entry)))
168
+ .join("");
169
+ }
170
+ function serializeXmlNode(node) {
171
+ const attributes = Object.entries(node.attributes)
172
+ .map(([name, value]) => ` ${name}="${escapeXmlAttribute(value)}"`)
173
+ .join("");
174
+ if (node.content.length === 0)
175
+ return `<${node.name}${attributes}/>`;
176
+ return `<${node.name}${attributes}>${serializeXmlContent(node)}</${node.name}>`;
177
+ }
178
+ //# sourceMappingURL=parser-custom-interactions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser-custom-interactions.js","sourceRoot":"","sources":["../src/parser-custom-interactions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { QtiOutcomeDeclaration, QtiResponseDeclaration, QtiTemplateDeclaration } from "./types.js";
2
+ import { type XmlNode } from "./xml.js";
3
+ export declare function parseResponseDeclaration(node: XmlNode): QtiResponseDeclaration;
4
+ export declare function parseOutcomeDeclaration(node: XmlNode): QtiOutcomeDeclaration;
5
+ export declare function parseTemplateDeclaration(node: XmlNode): QtiTemplateDeclaration;
6
+ //# sourceMappingURL=parser-declarations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser-declarations.d.ts","sourceRoot":"","sources":["../src/parser-declarations.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAGV,qBAAqB,EACrB,sBAAsB,EAEtB,sBAAsB,EAEvB,MAAM,YAAY,CAAC;AACpB,OAAO,EAA8B,KAAK,OAAO,EAAE,MAAM,UAAU,CAAC;AAEpE,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,OAAO,GAAG,sBAAsB,CAkB9E;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,OAAO,GAAG,qBAAqB,CAY5E;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,OAAO,GAAG,sBAAsB,CAW9E"}