@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
@@ -0,0 +1,136 @@
1
+ import { coerceValue, normalizeValueForCardinality, parseCardinality, parseCoords, parseShape, } from "./parser-values.js";
2
+ import { childElements, textContent } from "./xml.js";
3
+ export function parseResponseDeclaration(node) {
4
+ const cardinality = parseCardinality(node.attributes.cardinality);
5
+ const baseType = node.attributes["base-type"];
6
+ return {
7
+ kind: "response",
8
+ identifier: node.attributes.identifier ?? "",
9
+ cardinality,
10
+ baseType,
11
+ defaultValue: parseVariableValue(childElements(node, "qti-default-value")[0], baseType),
12
+ correctResponse: normalizeValueForCardinality(parseVariableValue(childElements(node, "qti-correct-response")[0], baseType), cardinality),
13
+ mapping: parseMapping(childElements(node, "qti-mapping")[0]),
14
+ areaMapping: parseAreaMapping(childElements(node, "qti-area-mapping")[0]),
15
+ attributes: node.attributes,
16
+ source: node.source,
17
+ };
18
+ }
19
+ export function parseOutcomeDeclaration(node) {
20
+ const baseType = node.attributes["base-type"];
21
+ return {
22
+ kind: "outcome",
23
+ identifier: node.attributes.identifier ?? "",
24
+ cardinality: parseCardinality(node.attributes.cardinality),
25
+ baseType,
26
+ defaultValue: parseVariableValue(childElements(node, "qti-default-value")[0], baseType),
27
+ lookupTable: parseLookupTable(node, baseType),
28
+ attributes: node.attributes,
29
+ source: node.source,
30
+ };
31
+ }
32
+ export function parseTemplateDeclaration(node) {
33
+ const baseType = node.attributes["base-type"];
34
+ return {
35
+ kind: "template",
36
+ identifier: node.attributes.identifier ?? "",
37
+ cardinality: parseCardinality(node.attributes.cardinality),
38
+ baseType,
39
+ defaultValue: parseVariableValue(childElements(node, "qti-default-value")[0], baseType),
40
+ attributes: node.attributes,
41
+ source: node.source,
42
+ };
43
+ }
44
+ function parseVariableValue(node, baseType) {
45
+ if (!node)
46
+ return null;
47
+ const valueNodes = childElements(node, "qti-value");
48
+ const entries = valueNodes.map((valueNode) => ({
49
+ fieldIdentifier: valueNode.attributes["field-identifier"],
50
+ value: coerceValue(textContent(valueNode), valueNode.attributes["base-type"] ?? baseType),
51
+ }));
52
+ const recordEntries = entries.filter((entry) => Boolean(entry.fieldIdentifier));
53
+ if (recordEntries.length > 0) {
54
+ return Object.fromEntries(recordEntries.map((entry) => [entry.fieldIdentifier, entry.value]));
55
+ }
56
+ if (entries.length === 0) {
57
+ const text = textContent(node);
58
+ return text.length > 0 ? coerceValue(text, baseType) : null;
59
+ }
60
+ if (entries.length === 1)
61
+ return entries[0]?.value ?? null;
62
+ return entries.map((entry) => entry.value);
63
+ }
64
+ function parseMapping(node) {
65
+ if (!node)
66
+ return undefined;
67
+ return {
68
+ defaultValue: Number(node.attributes["default-value"] ?? 0),
69
+ attributes: node.attributes,
70
+ source: node.source,
71
+ entries: childElements(node, "qti-map-entry").map((entry) => ({
72
+ mapKey: entry.attributes["map-key"],
73
+ mappedValue: Number(entry.attributes["mapped-value"] ?? 0),
74
+ attributes: entry.attributes,
75
+ source: entry.source,
76
+ })),
77
+ };
78
+ }
79
+ function parseAreaMapping(node) {
80
+ if (!node)
81
+ return undefined;
82
+ return {
83
+ defaultValue: Number(node.attributes["default-value"] ?? 0),
84
+ attributes: node.attributes,
85
+ source: node.source,
86
+ entries: childElements(node, "qti-area-map-entry").map((entry) => ({
87
+ shape: parseShape(entry.attributes.shape),
88
+ coords: parseCoords(entry.attributes.coords),
89
+ mappedValue: Number(entry.attributes["mapped-value"] ?? 0),
90
+ attributes: entry.attributes,
91
+ source: entry.source,
92
+ })),
93
+ };
94
+ }
95
+ function parseLookupTable(node, baseType) {
96
+ const matchTable = childElements(node, "qti-match-table")[0];
97
+ if (matchTable)
98
+ return parseMatchTable(matchTable, baseType);
99
+ const interpolationTable = childElements(node, "qti-interpolation-table")[0];
100
+ if (interpolationTable)
101
+ return parseInterpolationTable(interpolationTable, baseType);
102
+ return undefined;
103
+ }
104
+ function parseMatchTable(node, baseType) {
105
+ return {
106
+ type: "match",
107
+ defaultValue: parseLookupValue(node.attributes["default-value"], baseType),
108
+ attributes: node.attributes,
109
+ source: node.source,
110
+ entries: childElements(node, "qti-match-table-entry").map((entry) => ({
111
+ sourceValue: Number(entry.attributes["source-value"]),
112
+ targetValue: parseLookupValue(entry.attributes["target-value"], baseType),
113
+ attributes: entry.attributes,
114
+ source: entry.source,
115
+ })),
116
+ };
117
+ }
118
+ function parseInterpolationTable(node, baseType) {
119
+ return {
120
+ type: "interpolation",
121
+ defaultValue: parseLookupValue(node.attributes["default-value"], baseType),
122
+ attributes: node.attributes,
123
+ source: node.source,
124
+ entries: childElements(node, "qti-interpolation-table-entry").map((entry) => ({
125
+ sourceValue: Number(entry.attributes["source-value"]),
126
+ targetValue: parseLookupValue(entry.attributes["target-value"], baseType),
127
+ includeBoundary: entry.attributes["include-boundary"] !== "false",
128
+ attributes: entry.attributes,
129
+ source: entry.source,
130
+ })),
131
+ };
132
+ }
133
+ function parseLookupValue(value, baseType) {
134
+ return value === undefined ? null : coerceValue(value, baseType);
135
+ }
136
+ //# sourceMappingURL=parser-declarations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser-declarations.js","sourceRoot":"","sources":["../src/parser-declarations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { QtiCatalogInfo, QtiCatalogReference, QtiCompanionMaterialsInfo, QtiDiagnostic, QtiModalFeedback, QtiStylesheet } from "./types.js";
2
+ import { type XmlNode } from "./xml.js";
3
+ export declare function firstChildElement(parent: XmlNode, childName: string, diagnostics: QtiDiagnostic[], duplicateCode: string): XmlNode | undefined;
4
+ export declare function parseStylesheet(node: XmlNode): QtiStylesheet;
5
+ export declare function parseCatalogReferences(node: XmlNode): QtiCatalogReference[];
6
+ export declare function parseModalFeedback(node: XmlNode): QtiModalFeedback;
7
+ export declare function parseCatalogInfo(node: XmlNode | undefined): QtiCatalogInfo | undefined;
8
+ export declare function parseCompanionMaterialsInfo(node: XmlNode | undefined, diagnostics: QtiDiagnostic[]): QtiCompanionMaterialsInfo | undefined;
9
+ //# sourceMappingURL=parser-item-metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser-item-metadata.d.ts","sourceRoot":"","sources":["../src/parser-item-metadata.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAKV,cAAc,EACd,mBAAmB,EACnB,yBAAyB,EAGzB,aAAa,EACb,gBAAgB,EAEhB,aAAa,EACd,MAAM,YAAY,CAAC;AACpB,OAAO,EAA2C,KAAK,OAAO,EAAE,MAAM,UAAU,CAAC;AAEjF,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,OAAO,EACf,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,aAAa,EAAE,EAC5B,aAAa,EAAE,MAAM,GACpB,OAAO,GAAG,SAAS,CAYrB;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,aAAa,CAS5D;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,OAAO,GAAG,mBAAmB,EAAE,CAS3E;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,GAAG,gBAAgB,CASlE;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,cAAc,GAAG,SAAS,CAWtF;AA6DD,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,OAAO,GAAG,SAAS,EACzB,WAAW,EAAE,aAAa,EAAE,GAC3B,yBAAyB,GAAG,SAAS,CA4BvC"}
@@ -0,0 +1,158 @@
1
+ import { childElements, descendants, textContent } from "./xml.js";
2
+ export function firstChildElement(parent, childName, diagnostics, duplicateCode) {
3
+ const matches = childElements(parent, childName);
4
+ if (matches.length > 1) {
5
+ diagnostics.push({
6
+ code: duplicateCode,
7
+ severity: "error",
8
+ message: `${parent.localName} allows at most one ${childName} child.`,
9
+ path: matches[1]?.source?.path ?? parent.source?.path,
10
+ source: matches[1]?.source ?? parent.source,
11
+ });
12
+ }
13
+ return matches[0];
14
+ }
15
+ export function parseStylesheet(node) {
16
+ return {
17
+ href: node.attributes.href ?? "",
18
+ type: node.attributes.type,
19
+ media: node.attributes.media,
20
+ title: node.attributes.title,
21
+ attributes: node.attributes,
22
+ source: node.source,
23
+ };
24
+ }
25
+ export function parseCatalogReferences(node) {
26
+ const references = [
27
+ ...(node.attributes["data-catalog-idref"] ? [node] : []),
28
+ ...descendants(node, (child) => Boolean(child.attributes["data-catalog-idref"])),
29
+ ];
30
+ return references.map((reference) => ({
31
+ idref: reference.attributes["data-catalog-idref"] ?? "",
32
+ source: reference.source,
33
+ }));
34
+ }
35
+ export function parseModalFeedback(node) {
36
+ const showHide = node.attributes["show-hide"] === "hide" ? "hide" : "show";
37
+ return {
38
+ identifier: node.attributes.identifier ?? "",
39
+ outcomeIdentifier: node.attributes["outcome-identifier"] ?? "",
40
+ showHide,
41
+ text: textContent(node),
42
+ source: node.source,
43
+ };
44
+ }
45
+ export function parseCatalogInfo(node) {
46
+ if (!node)
47
+ return undefined;
48
+ return {
49
+ catalogs: childElements(node, "qti-catalog").map((catalog) => ({
50
+ id: catalog.attributes.id ?? "",
51
+ attributes: catalog.attributes,
52
+ cards: childElements(catalog, "qti-card").map(parseCatalogCard),
53
+ source: catalog.source,
54
+ })),
55
+ source: node.source,
56
+ };
57
+ }
58
+ function parseCatalogCard(node) {
59
+ return {
60
+ support: node.attributes.support ?? "",
61
+ htmlContent: parseCatalogHtmlContent(childElements(node, "qti-html-content")[0]),
62
+ fileHrefs: childElements(node, "qti-file-href").map(parseCatalogFileHref),
63
+ entries: childElements(node, "qti-card-entry").map(parseCatalogCardEntry),
64
+ attributes: node.attributes,
65
+ source: node.source,
66
+ };
67
+ }
68
+ function parseCatalogCardEntry(node) {
69
+ return {
70
+ language: node.attributes["xml:lang"] ?? node.attributes.lang,
71
+ default: node.attributes.default === "true",
72
+ htmlContent: parseCatalogHtmlContent(childElements(node, "qti-html-content")[0]),
73
+ fileHrefs: childElements(node, "qti-file-href").map(parseCatalogFileHref),
74
+ attributes: node.attributes,
75
+ source: node.source,
76
+ };
77
+ }
78
+ function parseCatalogHtmlContent(node) {
79
+ if (!node)
80
+ return undefined;
81
+ return {
82
+ text: textContent(node),
83
+ children: parseCatalogHtmlChildren(node),
84
+ attributes: node.attributes,
85
+ source: node.source,
86
+ };
87
+ }
88
+ function parseCatalogHtmlChildren(node) {
89
+ const content = [];
90
+ for (const entry of node.content) {
91
+ if (typeof entry === "string") {
92
+ if (entry.length > 0)
93
+ content.push({ kind: "text", text: entry, source: node.source });
94
+ continue;
95
+ }
96
+ content.push({
97
+ kind: "element",
98
+ qtiName: entry.localName,
99
+ attributes: entry.attributes,
100
+ children: parseCatalogHtmlChildren(entry),
101
+ source: entry.source,
102
+ });
103
+ }
104
+ return content;
105
+ }
106
+ function parseCatalogFileHref(node) {
107
+ return {
108
+ href: textContent(node).trim(),
109
+ mimeType: node.attributes["mime-type"],
110
+ attributes: node.attributes,
111
+ source: node.source,
112
+ };
113
+ }
114
+ export function parseCompanionMaterialsInfo(node, diagnostics) {
115
+ if (!node)
116
+ return undefined;
117
+ const physicalMaterials = [];
118
+ const unparsedChildren = [];
119
+ for (const child of childElements(node)) {
120
+ if (child.localName === "qti-physical-material") {
121
+ const material = parsePhysicalMaterial(child, diagnostics);
122
+ if (material)
123
+ physicalMaterials.push(material);
124
+ continue;
125
+ }
126
+ unparsedChildren.push({ qtiName: child.localName, source: child.source });
127
+ diagnostics.push({
128
+ code: "companionMaterials.child.unsupported",
129
+ severity: "warning",
130
+ message: `${child.localName} is not currently modeled in companion materials parsing.`,
131
+ path: child.source?.path,
132
+ source: child.source,
133
+ });
134
+ }
135
+ return {
136
+ physicalMaterials,
137
+ unparsedChildren,
138
+ source: node.source,
139
+ };
140
+ }
141
+ function parsePhysicalMaterial(node, diagnostics) {
142
+ const text = textContent(node).trim();
143
+ if (text.length === 0) {
144
+ diagnostics.push({
145
+ code: "companionMaterials.physicalMaterial.empty",
146
+ severity: "warning",
147
+ message: "qti-physical-material requires non-empty text content.",
148
+ path: node.source?.path,
149
+ source: node.source,
150
+ });
151
+ return undefined;
152
+ }
153
+ return {
154
+ text,
155
+ source: node.source,
156
+ };
157
+ }
158
+ //# sourceMappingURL=parser-item-metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser-item-metadata.js","sourceRoot":"","sources":["../src/parser-item-metadata.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { QtiResponseProcessing, QtiTemplateProcessing } from "./types.js";
2
+ import { type XmlNode } from "./xml.js";
3
+ export declare function parseResponseProcessing(node: XmlNode | undefined): QtiResponseProcessing | undefined;
4
+ export declare function parseTemplateProcessing(node: XmlNode | undefined): QtiTemplateProcessing | undefined;
5
+ //# sourceMappingURL=parser-processing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser-processing.d.ts","sourceRoot":"","sources":["../src/parser-processing.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAIV,qBAAqB,EAGrB,qBAAqB,EAEtB,MAAM,YAAY,CAAC;AACpB,OAAO,EAA8B,KAAK,OAAO,EAAE,MAAM,UAAU,CAAC;AAEpE,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,OAAO,GAAG,SAAS,GACxB,qBAAqB,GAAG,SAAS,CAQnC;AAED,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,OAAO,GAAG,SAAS,GACxB,qBAAqB,GAAG,SAAS,CAKnC"}