@citolab/qti-components 7.0.1 → 7.0.2

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 (42) hide show
  1. package/cdn/index.global.js +1 -1
  2. package/cdn/{index.min.js → index.js} +378 -186
  3. package/dist/custom-elements.json +27088 -0
  4. package/dist/{qti-test/index.d.ts → index.d.ts} +163 -2
  5. package/dist/index.js +13601 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/item.css +223 -32
  8. package/dist/{qti-loader → loader}/index.d.ts +1 -1
  9. package/dist/qti-components-jsx.d.ts +29 -25
  10. package/dist/{qti-simple-choice-CynLWb8d.d.cts → qti-simple-choice-DG8ImdPz.d.ts} +2 -2
  11. package/dist/vscode.html-custom-data.json +12 -9
  12. package/package.json +40 -59
  13. package/cdn/index.min.cjs +0 -4489
  14. package/dist/qti-components/index.cjs +0 -6704
  15. package/dist/qti-components/index.cjs.map +0 -1
  16. package/dist/qti-components/index.d.cts +0 -150
  17. package/dist/qti-components/index.d.ts +0 -150
  18. package/dist/qti-components/index.js +0 -6593
  19. package/dist/qti-components/index.js.map +0 -1
  20. package/dist/qti-item/index.cjs +0 -89
  21. package/dist/qti-item/index.cjs.map +0 -1
  22. package/dist/qti-item/index.d.cts +0 -24
  23. package/dist/qti-item/index.d.ts +0 -24
  24. package/dist/qti-item/index.js +0 -65
  25. package/dist/qti-item/index.js.map +0 -1
  26. package/dist/qti-loader/index.cjs +0 -332
  27. package/dist/qti-loader/index.cjs.map +0 -1
  28. package/dist/qti-loader/index.d.cts +0 -20
  29. package/dist/qti-simple-choice-CynLWb8d.d.ts +0 -1185
  30. package/dist/qti-test/index.cjs +0 -4632
  31. package/dist/qti-test/index.cjs.map +0 -1
  32. package/dist/qti-test/index.d.cts +0 -304
  33. package/dist/qti-test/index.js +0 -4599
  34. package/dist/qti-test/index.js.map +0 -1
  35. package/dist/qti-transformers/index.cjs +0 -316
  36. package/dist/qti-transformers/index.cjs.map +0 -1
  37. package/dist/qti-transformers/index.d.cts +0 -75
  38. /package/dist/{qti-loader → loader}/index.js +0 -0
  39. /package/dist/{qti-loader → loader}/index.js.map +0 -0
  40. /package/dist/{qti-transformers → transformers}/index.d.ts +0 -0
  41. /package/dist/{qti-transformers → transformers}/index.js +0 -0
  42. /package/dist/{qti-transformers → transformers}/index.js.map +0 -0
@@ -1,316 +0,0 @@
1
- var __defProp = Object.defineProperty;
2
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
- var __getOwnPropNames = Object.getOwnPropertyNames;
4
- var __hasOwnProp = Object.prototype.hasOwnProperty;
5
- var __export = (target, all) => {
6
- for (var name in all)
7
- __defProp(target, name, { get: all[name], enumerable: true });
8
- };
9
- var __copyProps = (to, from, except, desc) => {
10
- if (from && typeof from === "object" || typeof from === "function") {
11
- for (let key of __getOwnPropNames(from))
12
- if (!__hasOwnProp.call(to, key) && key !== except)
13
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
- }
15
- return to;
16
- };
17
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
-
19
- // src/lib/qti-transformers/index.ts
20
- var qti_transformers_exports = {};
21
- __export(qti_transformers_exports, {
22
- qtiTransformItem: () => qtiTransformItem,
23
- qtiTransformManifest: () => qtiTransformManifest,
24
- qtiTransformTest: () => qtiTransformTest
25
- });
26
- module.exports = __toCommonJS(qti_transformers_exports);
27
-
28
- // src/lib/qti-transformers/qti-transformers.ts
29
- var xml = String.raw;
30
- var xmlToHTML = xml`<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
31
- <xsl:output method="html" version="5.0" encoding="UTF-8" indent="yes" />
32
- <xsl:template match="@*|node()">
33
- <xsl:copy>
34
- <xsl:apply-templates select="@*|node()"/>
35
- </xsl:copy>
36
- </xsl:template>
37
-
38
- <!-- remove existing namespaces -->
39
- <xsl:template match="*">
40
- <!-- remove element prefix -->
41
- <xsl:element name="{local-name()}">
42
- <!-- process attributes -->
43
- <xsl:for-each select="@*">
44
- <!-- remove attribute prefix -->
45
- <xsl:attribute name="{local-name()}">
46
- <xsl:value-of select="."/>
47
- </xsl:attribute>
48
- </xsl:for-each>
49
- <xsl:apply-templates/>
50
- </xsl:element>
51
- </xsl:template>
52
- </xsl:stylesheet>`;
53
- function extendElementName(xmlFragment, tagName, extension) {
54
- xmlFragment.querySelectorAll(tagName).forEach((element) => {
55
- const newTagName = `${tagName}-${extension}`;
56
- const newElement = createElementWithNewTagName(element, newTagName);
57
- element.replaceWith(newElement);
58
- });
59
- }
60
- function extendElementsWithClass(xmlFragment, classNamePattern) {
61
- xmlFragment.querySelectorAll("*").forEach((element) => {
62
- const classList = element.classList;
63
- if (classList) {
64
- classList.forEach((className) => {
65
- if (className.startsWith(`${classNamePattern}:`)) {
66
- const suffix = className.slice(`${classNamePattern}:`.length);
67
- const newTagName = `${element.nodeName}-${suffix}`;
68
- const newElement = createElementWithNewTagName(element, newTagName);
69
- element.replaceWith(newElement);
70
- }
71
- });
72
- }
73
- });
74
- }
75
- function createElementWithNewTagName(element, newTagName) {
76
- const newElement = document.createElement(newTagName);
77
- for (const attr of element.attributes) {
78
- newElement.setAttribute(attr.name, attr.value);
79
- }
80
- while (element.firstChild) {
81
- newElement.appendChild(element.firstChild);
82
- }
83
- return newElement;
84
- }
85
- function itemsFromTest(xmlFragment) {
86
- const items = [];
87
- xmlFragment.querySelectorAll("qti-assessment-item-ref").forEach((el) => {
88
- const identifier = el.getAttribute("identifier");
89
- const href = el.getAttribute("href");
90
- const category = el.getAttribute("category");
91
- items.push({ identifier, href, category });
92
- });
93
- return items;
94
- }
95
- var currentRequest = null;
96
- function loadXML(url, cancelPreviousRequest = false) {
97
- if (cancelPreviousRequest && currentRequest !== null) {
98
- currentRequest.abort();
99
- }
100
- return new Promise((resolve, reject) => {
101
- const xhr = new XMLHttpRequest();
102
- currentRequest = xhr;
103
- xhr.open("GET", url, true);
104
- xhr.responseType = "document";
105
- xhr.onload = () => {
106
- if (xhr.status >= 200 && xhr.status < 300) {
107
- resolve(xhr.responseXML);
108
- } else {
109
- reject(xhr.statusText);
110
- }
111
- };
112
- xhr.onerror = () => {
113
- reject(xhr.statusText);
114
- };
115
- xhr.send();
116
- });
117
- }
118
- function parseXML(xmlDocument) {
119
- const parser = new DOMParser();
120
- const xmlFragment = parser.parseFromString(xmlDocument, "text/xml");
121
- return xmlFragment;
122
- }
123
- function toHTML(xmlFragment) {
124
- const processor = new XSLTProcessor();
125
- const xsltDocument = new DOMParser().parseFromString(xmlToHTML, "text/xml");
126
- processor.importStylesheet(xsltDocument);
127
- const itemHTMLFragment = processor.transformToFragment(xmlFragment, document);
128
- return itemHTMLFragment;
129
- }
130
- function setLocation(xmlFragment, location) {
131
- if (!location.endsWith("/")) {
132
- location += "/";
133
- }
134
- xmlFragment.querySelectorAll("[src],[href],[primary-path]").forEach((elWithSrc) => {
135
- let attr = "";
136
- if (elWithSrc.getAttribute("src")) {
137
- attr = "src";
138
- }
139
- if (elWithSrc.getAttribute("href")) {
140
- attr = "href";
141
- }
142
- if (elWithSrc.getAttribute("primary-path")) {
143
- attr = "primary-path";
144
- }
145
- const attrValue = elWithSrc.getAttribute(attr)?.trim();
146
- if (!attrValue.startsWith("data:") && !attrValue.startsWith("http")) {
147
- const newSrcValue = location + encodeURI(attrValue);
148
- elWithSrc.setAttribute(attr, newSrcValue);
149
- }
150
- });
151
- }
152
- function convertCDATAtoComment(xmlFragment) {
153
- const cdataElements = xmlFragment.querySelectorAll('qti-custom-operator[class="js.org"] > qti-base-value');
154
- cdataElements.forEach((element) => {
155
- const commentText = document.createComment(element.textContent);
156
- element.replaceChild(commentText, element.firstChild);
157
- });
158
- }
159
- function stripStyleSheets(xmlFragment) {
160
- xmlFragment.querySelectorAll("qti-stylesheet").forEach((stylesheet) => stylesheet.remove());
161
- }
162
-
163
- // src/lib/qti-transformers/qti-transform-item.ts
164
- var qtiTransformItem = () => {
165
- let xmlFragment;
166
- const api = {
167
- async load(uri, cancelPreviousRequest = false) {
168
- return new Promise((resolve) => {
169
- loadXML(uri, cancelPreviousRequest).then((xml2) => {
170
- xmlFragment = xml2;
171
- api.path(uri.substring(0, uri.lastIndexOf("/")));
172
- return resolve(api);
173
- });
174
- });
175
- },
176
- parse(xmlString) {
177
- xmlFragment = parseXML(xmlString);
178
- return api;
179
- },
180
- path: (location) => {
181
- setLocation(xmlFragment, location);
182
- return api;
183
- },
184
- fn(fn) {
185
- fn(xmlFragment);
186
- return api;
187
- },
188
- pciHooks(uri) {
189
- const attributes = ["hook", "module"];
190
- const documentPath = uri.substring(0, uri.lastIndexOf("/"));
191
- for (const attribute of attributes) {
192
- const srcAttributes = xmlFragment.querySelectorAll("[" + attribute + "]");
193
- srcAttributes.forEach((node) => {
194
- const srcValue = node.getAttribute(attribute);
195
- if (!srcValue.startsWith("data:") && !srcValue.startsWith("http")) {
196
- node.setAttribute("base-url", uri);
197
- node.setAttribute(
198
- "module",
199
- documentPath + "/" + encodeURI(srcValue + (srcValue.endsWith(".js") ? "" : ".js"))
200
- );
201
- }
202
- });
203
- }
204
- return api;
205
- },
206
- extendElementName: (tagName, extension) => {
207
- extendElementName(xmlFragment, tagName, extension);
208
- return api;
209
- },
210
- extendElementsWithClass: (param = "extend") => {
211
- extendElementsWithClass(xmlFragment, param);
212
- return api;
213
- },
214
- customInteraction(baseRef, baseItem) {
215
- const qtiCustomInteraction = xmlFragment.querySelector("qti-custom-interaction");
216
- const qtiCustomInteractionObject = qtiCustomInteraction.querySelector("object");
217
- qtiCustomInteraction.setAttribute("data-base-ref", baseRef);
218
- qtiCustomInteraction.setAttribute("data-base-item", baseRef + baseItem);
219
- qtiCustomInteraction.setAttribute("data", qtiCustomInteractionObject.getAttribute("data"));
220
- qtiCustomInteraction.setAttribute("width", qtiCustomInteractionObject.getAttribute("width"));
221
- qtiCustomInteraction.setAttribute("height", qtiCustomInteractionObject.getAttribute("height"));
222
- qtiCustomInteraction.removeChild(qtiCustomInteractionObject);
223
- return api;
224
- },
225
- convertCDATAtoComment() {
226
- convertCDATAtoComment(xmlFragment);
227
- return api;
228
- },
229
- stripStyleSheets() {
230
- stripStyleSheets(xmlFragment);
231
- return api;
232
- },
233
- html() {
234
- return new XMLSerializer().serializeToString(toHTML(xmlFragment));
235
- },
236
- xml() {
237
- return new XMLSerializer().serializeToString(xmlFragment);
238
- },
239
- htmlDoc() {
240
- return toHTML(xmlFragment);
241
- },
242
- xmlDoc() {
243
- return xmlFragment;
244
- }
245
- };
246
- return api;
247
- };
248
-
249
- // src/lib/qti-transformers/qti-transform-manifest.ts
250
- var qtiTransformManifest = () => {
251
- let xmlFragment;
252
- const api = {
253
- async load(uri) {
254
- return new Promise((resolve) => {
255
- loadXML(uri).then((xml2) => {
256
- xmlFragment = xml2;
257
- return resolve(api);
258
- });
259
- });
260
- },
261
- parse(xmlString) {
262
- xmlFragment = parseXML(xmlString);
263
- },
264
- assessmentTest() {
265
- const el = xmlFragment.querySelector('resource[type="imsqti_test_xmlv3p0"]');
266
- return { href: el.getAttribute("href"), identifier: el.getAttribute("identifier") };
267
- }
268
- };
269
- return api;
270
- };
271
-
272
- // src/lib/qti-transformers/qti-transform-test.ts
273
- var qtiTransformTest = () => {
274
- let xmlFragment;
275
- const api = {
276
- async load(uri) {
277
- return new Promise((resolve, _) => {
278
- loadXML(uri).then((xml2) => {
279
- xmlFragment = xml2;
280
- return resolve(api);
281
- });
282
- });
283
- },
284
- parse(xmlString) {
285
- xmlFragment = parseXML(xmlString);
286
- return api;
287
- },
288
- fn(fn) {
289
- fn(xmlFragment);
290
- return api;
291
- },
292
- items() {
293
- return itemsFromTest(xmlFragment);
294
- },
295
- html() {
296
- return new XMLSerializer().serializeToString(toHTML(xmlFragment));
297
- },
298
- xml() {
299
- return new XMLSerializer().serializeToString(xmlFragment);
300
- },
301
- htmlDoc() {
302
- return toHTML(xmlFragment);
303
- },
304
- xmlDoc() {
305
- return xmlFragment;
306
- }
307
- };
308
- return api;
309
- };
310
- // Annotate the CommonJS export names for ESM import in node:
311
- 0 && (module.exports = {
312
- qtiTransformItem,
313
- qtiTransformManifest,
314
- qtiTransformTest
315
- });
316
- //# sourceMappingURL=index.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/lib/qti-transformers/index.ts","../../src/lib/qti-transformers/qti-transformers.ts","../../src/lib/qti-transformers/qti-transform-item.ts","../../src/lib/qti-transformers/qti-transform-manifest.ts","../../src/lib/qti-transformers/qti-transform-test.ts"],"sourcesContent":["export * from './qti-transform-item';\nexport * from './qti-transform-manifest';\nexport * from './qti-transform-test';\n\n","const xml = String.raw;\n\n/* <!-- convert CDATA to comments -->\n <xsl:template match=\"text()[contains(., 'CDATA')]\">\n <xsl:comment>\n <xsl:value-of select=\".\"/>\n </xsl:comment>\n</xsl:template>\n*/\n\n/*\n <!-- remove xml comments -->\n <xsl:template match=\"comment()\" />\n */\n\nconst xmlToHTML = xml`<xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\">\n<xsl:output method=\"html\" version=\"5.0\" encoding=\"UTF-8\" indent=\"yes\" />\n <xsl:template match=\"@*|node()\">\n <xsl:copy>\n <xsl:apply-templates select=\"@*|node()\"/>\n </xsl:copy>\n </xsl:template>\n\n <!-- remove existing namespaces -->\n <xsl:template match=\"*\">\n <!-- remove element prefix -->\n <xsl:element name=\"{local-name()}\">\n <!-- process attributes -->\n <xsl:for-each select=\"@*\">\n <!-- remove attribute prefix -->\n <xsl:attribute name=\"{local-name()}\">\n <xsl:value-of select=\".\"/>\n </xsl:attribute>\n </xsl:for-each>\n <xsl:apply-templates/>\n </xsl:element>\n</xsl:template>\n</xsl:stylesheet>`;\n\n// Function to extend elements with a specific tag name by adding an extension suffix\nexport function extendElementName(xmlFragment: XMLDocument, tagName: string, extension: string) {\n xmlFragment.querySelectorAll(tagName).forEach(element => {\n const newTagName = `${tagName}-${extension}`;\n const newElement = createElementWithNewTagName(element, newTagName);\n element.replaceWith(newElement);\n });\n}\n\n// Function to extend any element with a specific class pattern (e.g., \"extend:suffix\")\nexport function extendElementsWithClass(xmlFragment: XMLDocument, classNamePattern: string) {\n xmlFragment.querySelectorAll('*').forEach(element => {\n const classList = element.classList;\n if (classList) {\n classList.forEach(className => {\n if (className.startsWith(`${classNamePattern}:`)) {\n const suffix = className.slice(`${classNamePattern}:`.length);\n const newTagName = `${element.nodeName}-${suffix}`;\n const newElement = createElementWithNewTagName(element, newTagName);\n element.replaceWith(newElement);\n }\n });\n }\n });\n}\n\n// Helper function to create a new element with a new tag name and copy attributes and children\nfunction createElementWithNewTagName(element, newTagName) {\n const newElement = document.createElement(newTagName);\n // Copy attributes\n for (const attr of element.attributes) {\n newElement.setAttribute(attr.name, attr.value);\n }\n // Copy child nodes\n while (element.firstChild) {\n newElement.appendChild(element.firstChild);\n }\n return newElement;\n}\n\nexport function itemsFromTest(xmlFragment: DocumentFragment) {\n const items: { identifier: string; href: string; category: string }[] = [];\n xmlFragment.querySelectorAll('qti-assessment-item-ref').forEach(el => {\n const identifier = el.getAttribute('identifier');\n const href = el.getAttribute('href');\n const category = el.getAttribute('category');\n items.push({ identifier, href, category });\n });\n return items;\n}\n\nlet currentRequest: XMLHttpRequest | null = null;\n\nexport function loadXML(url, cancelPreviousRequest = false) {\n if (cancelPreviousRequest && currentRequest !== null) {\n currentRequest.abort(); // Abort the ongoing request if there is one\n }\n\n return new Promise<XMLDocument | null>((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n currentRequest = xhr; // Store the current request\n\n xhr.open('GET', url, true);\n xhr.responseType = 'document';\n\n xhr.onload = () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n resolve(xhr.responseXML);\n } else {\n reject(xhr.statusText);\n }\n };\n\n xhr.onerror = () => {\n reject(xhr.statusText);\n };\n\n xhr.send();\n });\n}\n\nexport function parseXML(xmlDocument: string) {\n const parser = new DOMParser();\n const xmlFragment = parser.parseFromString(xmlDocument, 'text/xml');\n return xmlFragment;\n}\n\nexport function toHTML(xmlFragment: Document): DocumentFragment {\n const processor = new XSLTProcessor();\n const xsltDocument = new DOMParser().parseFromString(xmlToHTML, 'text/xml');\n processor.importStylesheet(xsltDocument);\n const itemHTMLFragment = processor.transformToFragment(xmlFragment, document);\n return itemHTMLFragment;\n}\n\nexport function setLocation(xmlFragment: DocumentFragment, location: string) {\n if (!location.endsWith('/')) {\n location += '/';\n }\n\n xmlFragment.querySelectorAll('[src],[href],[primary-path]').forEach(elWithSrc => {\n let attr: 'src' | 'href' | 'primary-path' | '' = '';\n\n if (elWithSrc.getAttribute('src')) {\n attr = 'src';\n }\n if (elWithSrc.getAttribute('href')) {\n attr = 'href';\n }\n if (elWithSrc.getAttribute('primary-path')) {\n attr = 'primary-path';\n }\n const attrValue = elWithSrc.getAttribute(attr)?.trim();\n\n if (!attrValue.startsWith('data:') && !attrValue.startsWith('http')) {\n const newSrcValue = location + encodeURI(attrValue);\n elWithSrc.setAttribute(attr, newSrcValue);\n }\n });\n}\n\nexport function convertCDATAtoComment(xmlFragment: DocumentFragment) {\n const cdataElements = xmlFragment.querySelectorAll('qti-custom-operator[class=\"js.org\"] > qti-base-value');\n cdataElements.forEach(element => {\n const commentText = document.createComment(element.textContent);\n element.replaceChild(commentText, element.firstChild);\n });\n}\n\nexport function stripStyleSheets(xmlFragment: DocumentFragment) {\n // remove qti-stylesheet tag\n xmlFragment.querySelectorAll('qti-stylesheet').forEach(stylesheet => stylesheet.remove());\n}\n","/**\n * Browser based QTI-XML to HTML transformer.\n * Returns an object with methods to load, parse, transform and serialize QTI XML items.\n * @returns An object with methods to load, parse, transform and serialize QTI XML items.\n * @example\n * const qtiTransformer = qtiTransformItem();\n * await qtiTransformer.load('path/to/xml/file.xml');\n * qtiTransformer.path('/assessmentItem/itemBody');\n * const html = qtiTransformer.html();\n * const xml = qtiTransformer.xml();\n * const htmldoc = qtiTransformer.htmldoc();\n * const xmldoc = qtiTransformer.xmldoc();\n *\n * qtiTransformItem().parse(storyXML).html()\n */\n\nimport {\n convertCDATAtoComment,\n extendElementName,\n extendElementsWithClass,\n loadXML,\n parseXML,\n setLocation,\n stripStyleSheets,\n toHTML\n} from './qti-transformers';\n\nexport type transformItemApi = {\n load: (uri: string, cancelPreviousRequest?: boolean) => Promise<transformItemApi>;\n parse: (xmlString: string) => transformItemApi;\n path: (location: string) => transformItemApi;\n fn: (fn: (xmlFragment: XMLDocument) => void) => transformItemApi;\n pciHooks: (uri: string) => transformItemApi;\n extendElementName: (elementName: string, extend: string) => transformItemApi;\n extendElementsWithClass: (param?: string) => transformItemApi;\n customInteraction: (baseRef: string, baseItem: string) => transformItemApi;\n convertCDATAtoComment: () => transformItemApi;\n stripStyleSheets: () => transformItemApi;\n html: () => string;\n xml: () => string;\n htmlDoc: () => DocumentFragment;\n xmlDoc: () => XMLDocument;\n};\n\nexport const qtiTransformItem = () => {\n let xmlFragment: XMLDocument;\n\n const api: transformItemApi = {\n async load(uri: string, cancelPreviousRequest = false): Promise<typeof api> {\n return new Promise<typeof api>(resolve => {\n loadXML(uri, cancelPreviousRequest).then(xml => {\n xmlFragment = xml;\n // set the base path for images and other resources,\n // you probably want to set the base path to the document root else you can use the path method to set it\n api.path(uri.substring(0, uri.lastIndexOf('/')));\n return resolve(api);\n });\n });\n },\n parse(xmlString: string): typeof api {\n xmlFragment = parseXML(xmlString);\n return api;\n },\n path: (location: string): typeof api => {\n setLocation(xmlFragment, location);\n return api;\n },\n fn(fn: (xmlFragment: XMLDocument) => void): typeof api {\n fn(xmlFragment);\n return api;\n },\n pciHooks(uri: string): typeof api {\n const attributes = ['hook', 'module'];\n const documentPath = uri.substring(0, uri.lastIndexOf('/'));\n for (const attribute of attributes) {\n const srcAttributes = xmlFragment.querySelectorAll('[' + attribute + ']');\n srcAttributes.forEach(node => {\n const srcValue = node.getAttribute(attribute)!;\n if (!srcValue.startsWith('data:') && !srcValue.startsWith('http')) {\n // Just paste the relative path of the src location after the documentrootPath\n // old pcis can have a .js, new pci's don't\n node.setAttribute('base-url', uri);\n node.setAttribute(\n 'module',\n documentPath + '/' + encodeURI(srcValue + (srcValue.endsWith('.js') ? '' : '.js'))\n );\n }\n });\n }\n return api;\n },\n extendElementName: (tagName: string, extension: string): typeof api => {\n extendElementName(xmlFragment, tagName, extension);\n return api;\n },\n extendElementsWithClass: (param: string = 'extend'): typeof api => {\n extendElementsWithClass(xmlFragment, param);\n return api;\n },\n customInteraction(baseRef: string, baseItem: string): typeof api {\n const qtiCustomInteraction = xmlFragment.querySelector('qti-custom-interaction');\n const qtiCustomInteractionObject = qtiCustomInteraction.querySelector('object');\n\n qtiCustomInteraction.setAttribute('data-base-ref', baseRef);\n qtiCustomInteraction.setAttribute('data-base-item', baseRef + baseItem);\n qtiCustomInteraction.setAttribute('data', qtiCustomInteractionObject.getAttribute('data'));\n qtiCustomInteraction.setAttribute('width', qtiCustomInteractionObject.getAttribute('width'));\n qtiCustomInteraction.setAttribute('height', qtiCustomInteractionObject.getAttribute('height'));\n\n qtiCustomInteraction.removeChild(qtiCustomInteractionObject);\n return api;\n },\n convertCDATAtoComment(): typeof api {\n convertCDATAtoComment(xmlFragment);\n return api;\n },\n stripStyleSheets(): typeof api {\n stripStyleSheets(xmlFragment);\n return api;\n },\n html() {\n return new XMLSerializer().serializeToString(toHTML(xmlFragment));\n },\n xml(): string {\n return new XMLSerializer().serializeToString(xmlFragment);\n },\n htmlDoc() {\n return toHTML(xmlFragment);\n },\n xmlDoc(): XMLDocument {\n return xmlFragment; // new XMLSerializer().serializeToString(xmlFragment);\n }\n };\n return api;\n};\n","import { loadXML, parseXML } from './qti-transformers';\n\nexport const qtiTransformManifest = (): {\n load: (uri: string) => Promise<typeof api>;\n assessmentTest: () => { href: string; identifier: string };\n} => {\n let xmlFragment: XMLDocument;\n\n const api = {\n async load(uri) {\n return new Promise<typeof api>(resolve => {\n loadXML(uri).then(xml => {\n xmlFragment = xml;\n return resolve(api);\n });\n });\n },\n parse(xmlString: string) {\n xmlFragment = parseXML(xmlString);\n },\n assessmentTest() {\n const el = xmlFragment.querySelector('resource[type=\"imsqti_test_xmlv3p0\"]');\n return { href: el.getAttribute('href'), identifier: el.getAttribute('identifier') };\n }\n };\n return api;\n};\n","/**\n * Returns an object with methods to load, parse and transform QTI tests.\n * @returns An object with methods to load, parse and transform QTI tests.\n * @example\n * const qtiTransformer = qtiTransformTest();\n * await qtiTransformer.load('https://example.com/test.xml');\n * const items = qtiTransformer.items();\n * const html = qtiTransformer.html();\n * const xml = qtiTransformer.xml();\n */\n\nimport { itemsFromTest, loadXML, parseXML, toHTML } from './qti-transformers';\n\nexport type transformTestApi = {\n load: (uri: string) => Promise<transformTestApi>;\n parse: (xmlString: string) => transformTestApi;\n fn: (fn: (xmlFragment: XMLDocument) => void) => transformTestApi;\n items: () => { identifier: string; href: string; category: string }[];\n html: () => string;\n xml: () => string;\n htmlDoc: () => DocumentFragment;\n xmlDoc: () => XMLDocument;\n};\n\nexport const qtiTransformTest = (): transformTestApi => {\n let xmlFragment: XMLDocument;\n\n const api: transformTestApi = {\n async load(uri) {\n return new Promise<transformTestApi>((resolve, _) => {\n loadXML(uri).then(xml => {\n xmlFragment = xml;\n return resolve(api);\n });\n });\n },\n parse(xmlString: string) {\n xmlFragment = parseXML(xmlString);\n return api;\n },\n fn(fn: (xmlFragment: XMLDocument) => void) {\n fn(xmlFragment);\n return api;\n },\n items() {\n return itemsFromTest(xmlFragment);\n },\n html() {\n return new XMLSerializer().serializeToString(toHTML(xmlFragment));\n },\n xml(): string {\n return new XMLSerializer().serializeToString(xmlFragment);\n },\n htmlDoc() {\n return toHTML(xmlFragment);\n },\n xmlDoc(): XMLDocument {\n return xmlFragment;\n }\n };\n return api;\n};\n"],"mappings":"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","names":["xml","xml","xml"]}
@@ -1,75 +0,0 @@
1
- /**
2
- * Browser based QTI-XML to HTML transformer.
3
- * Returns an object with methods to load, parse, transform and serialize QTI XML items.
4
- * @returns An object with methods to load, parse, transform and serialize QTI XML items.
5
- * @example
6
- * const qtiTransformer = qtiTransformItem();
7
- * await qtiTransformer.load('path/to/xml/file.xml');
8
- * qtiTransformer.path('/assessmentItem/itemBody');
9
- * const html = qtiTransformer.html();
10
- * const xml = qtiTransformer.xml();
11
- * const htmldoc = qtiTransformer.htmldoc();
12
- * const xmldoc = qtiTransformer.xmldoc();
13
- *
14
- * qtiTransformItem().parse(storyXML).html()
15
- */
16
- type transformItemApi = {
17
- load: (uri: string, cancelPreviousRequest?: boolean) => Promise<transformItemApi>;
18
- parse: (xmlString: string) => transformItemApi;
19
- path: (location: string) => transformItemApi;
20
- fn: (fn: (xmlFragment: XMLDocument) => void) => transformItemApi;
21
- pciHooks: (uri: string) => transformItemApi;
22
- extendElementName: (elementName: string, extend: string) => transformItemApi;
23
- extendElementsWithClass: (param?: string) => transformItemApi;
24
- customInteraction: (baseRef: string, baseItem: string) => transformItemApi;
25
- convertCDATAtoComment: () => transformItemApi;
26
- stripStyleSheets: () => transformItemApi;
27
- html: () => string;
28
- xml: () => string;
29
- htmlDoc: () => DocumentFragment;
30
- xmlDoc: () => XMLDocument;
31
- };
32
- declare const qtiTransformItem: () => transformItemApi;
33
-
34
- declare const qtiTransformManifest: () => {
35
- load: (uri: string) => Promise<{
36
- load(uri: any): Promise</*elided*/ any>;
37
- parse(xmlString: string): void;
38
- assessmentTest(): {
39
- href: string;
40
- identifier: string;
41
- };
42
- }>;
43
- assessmentTest: () => {
44
- href: string;
45
- identifier: string;
46
- };
47
- };
48
-
49
- /**
50
- * Returns an object with methods to load, parse and transform QTI tests.
51
- * @returns An object with methods to load, parse and transform QTI tests.
52
- * @example
53
- * const qtiTransformer = qtiTransformTest();
54
- * await qtiTransformer.load('https://example.com/test.xml');
55
- * const items = qtiTransformer.items();
56
- * const html = qtiTransformer.html();
57
- * const xml = qtiTransformer.xml();
58
- */
59
- type transformTestApi = {
60
- load: (uri: string) => Promise<transformTestApi>;
61
- parse: (xmlString: string) => transformTestApi;
62
- fn: (fn: (xmlFragment: XMLDocument) => void) => transformTestApi;
63
- items: () => {
64
- identifier: string;
65
- href: string;
66
- category: string;
67
- }[];
68
- html: () => string;
69
- xml: () => string;
70
- htmlDoc: () => DocumentFragment;
71
- xmlDoc: () => XMLDocument;
72
- };
73
- declare const qtiTransformTest: () => transformTestApi;
74
-
75
- export { qtiTransformItem, qtiTransformManifest, qtiTransformTest, type transformItemApi, type transformTestApi };
File without changes
File without changes