@citolab/qti-components 7.4.0 → 7.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/custom-elements.json +6 -6
- package/dist/chunks/{chunk-6K4ROGDD.js → chunk-4BDOB6KY.js} +12 -11
- package/dist/chunks/chunk-4BDOB6KY.js.map +1 -0
- package/dist/chunks/chunk-4OGJBG35.js +8 -0
- package/dist/chunks/chunk-4OGJBG35.js.map +1 -0
- package/dist/chunks/{chunk-LN74Z5QM.js → chunk-7RW7LCEJ.js} +258 -589
- package/dist/chunks/chunk-7RW7LCEJ.js.map +1 -0
- package/dist/chunks/{chunk-TJ6ZOT7A.js → chunk-APBAIN6D.js} +25 -23
- package/dist/chunks/chunk-APBAIN6D.js.map +1 -0
- package/dist/chunks/chunk-C5RLRG3L.js +10 -0
- package/dist/chunks/chunk-C5RLRG3L.js.map +1 -0
- package/dist/chunks/chunk-CJADUWEC.js +10 -0
- package/dist/chunks/chunk-CJADUWEC.js.map +1 -0
- package/dist/chunks/chunk-DVQQ7I6Y.js +8 -0
- package/dist/chunks/chunk-DVQQ7I6Y.js.map +1 -0
- package/dist/chunks/{chunk-O5N4DCU6.js → chunk-ELDMXTUQ.js} +2 -7
- package/dist/chunks/chunk-ELDMXTUQ.js.map +1 -0
- package/dist/chunks/chunk-ERYHQVOT.js +8 -0
- package/dist/chunks/chunk-ERYHQVOT.js.map +1 -0
- package/dist/chunks/chunk-GAAFN7QF.js +146 -0
- package/dist/chunks/chunk-GAAFN7QF.js.map +1 -0
- package/dist/chunks/chunk-H2JE6IVU.js +15 -0
- package/dist/chunks/chunk-H2JE6IVU.js.map +1 -0
- package/dist/chunks/chunk-H6KHXSIO.js +8 -0
- package/dist/chunks/chunk-H6KHXSIO.js.map +1 -0
- package/dist/chunks/chunk-HFAUM56X.js +208 -0
- package/dist/chunks/chunk-HFAUM56X.js.map +1 -0
- package/dist/chunks/chunk-JQ6HWGRY.js +22 -0
- package/dist/chunks/chunk-JQ6HWGRY.js.map +1 -0
- package/dist/chunks/{chunk-GUDRSXIP.js → chunk-K47QFOQX.js} +6 -20
- package/dist/chunks/chunk-K47QFOQX.js.map +1 -0
- package/dist/chunks/chunk-NJNQOQUU.js +8 -0
- package/dist/chunks/chunk-NJNQOQUU.js.map +1 -0
- package/dist/chunks/chunk-SV4K25ZI.js +19 -0
- package/dist/chunks/chunk-SV4K25ZI.js.map +1 -0
- package/dist/chunks/{chunk-JDY5GL7E.js → chunk-WFUXZ4UT.js} +1 -13
- package/dist/chunks/{chunk-JDY5GL7E.js.map → chunk-WFUXZ4UT.js.map} +1 -1
- package/dist/custom-elements.json +6 -6
- package/dist/{computed-item.context-DpK-sS0T.d.ts → exports/computed-item.context.d.ts} +6 -2
- package/dist/exports/computed-item.context.js +8 -0
- package/dist/exports/computed-item.context.js.map +1 -0
- package/dist/exports/computed.context.d.ts +34 -0
- package/dist/exports/computed.context.js +8 -0
- package/dist/exports/computed.context.js.map +1 -0
- package/dist/{config.context-CmQ9L62n.d.ts → exports/config.context.d.ts} +4 -1
- package/dist/exports/config.context.js +8 -0
- package/dist/exports/config.context.js.map +1 -0
- package/dist/exports/expression-result.d.ts +19 -0
- package/dist/exports/expression-result.js +1 -0
- package/dist/exports/expression-result.js.map +1 -0
- package/dist/exports/interaction.d.ts +46 -0
- package/dist/exports/interaction.interface.d.ts +13 -0
- package/dist/exports/interaction.interface.js +1 -0
- package/dist/exports/interaction.interface.js.map +1 -0
- package/dist/exports/interaction.js +12 -0
- package/dist/exports/interaction.js.map +1 -0
- package/dist/exports/item.context.d.ts +11 -0
- package/dist/exports/item.context.js +8 -0
- package/dist/exports/item.context.js.map +1 -0
- package/dist/exports/qti-assessment-item.context.d.ts +9 -0
- package/dist/exports/qti-assessment-item.context.js +8 -0
- package/dist/exports/qti-assessment-item.context.js.map +1 -0
- package/dist/exports/qti-condition-expression.d.ts +14 -0
- package/dist/exports/qti-condition-expression.js +11 -0
- package/dist/exports/qti-condition-expression.js.map +1 -0
- package/dist/exports/qti-expression.d.ts +23 -0
- package/dist/exports/qti-expression.js +10 -0
- package/dist/exports/qti-expression.js.map +1 -0
- package/dist/exports/qti-test.d.ts +12 -0
- package/dist/exports/qti-test.js +1 -0
- package/dist/exports/qti-test.js.map +1 -0
- package/dist/exports/qti.context.d.ts +14 -0
- package/dist/exports/qti.context.js +8 -0
- package/dist/exports/qti.context.js.map +1 -0
- package/dist/exports/session.context.d.ts +15 -0
- package/dist/exports/session.context.js +10 -0
- package/dist/exports/session.context.js.map +1 -0
- package/dist/exports/test.context.d.ts +16 -0
- package/dist/exports/test.context.js +10 -0
- package/dist/exports/test.context.js.map +1 -0
- package/dist/exports/variables.d.ts +2 -0
- package/dist/exports/variables.js +1 -0
- package/dist/exports/variables.js.map +1 -0
- package/dist/index.d.ts +18 -6
- package/dist/index.js +20 -7
- package/dist/{qti-assessment-item-D77dJ1Ot.d.ts → qti-assessment-item-l-mN3teH.d.ts} +2 -1
- package/dist/qti-components/index.d.ts +14 -76
- package/dist/qti-components/index.js +13 -4
- package/dist/qti-item/index.d.ts +4 -3
- package/dist/qti-item/index.js +6 -3
- package/dist/qti-loader/index.d.ts +3 -2
- package/dist/qti-loader/index.js +2 -1
- package/dist/qti-loader/index.js.map +1 -1
- package/dist/qti-modal-feedback-PKbhO-3w.d.ts +30 -0
- package/dist/qti-test/index.d.ts +16 -129
- package/dist/qti-test/index.js +11 -4
- package/dist/qti-test-BwvOhz_-.d.ts +118 -0
- package/dist/qti-transform-item-C9WtMeDR.d.ts +39 -0
- package/dist/qti-transformers/index.d.ts +2 -38
- package/dist/qti-transformers/index.js +2 -1
- package/dist/{variables-Vgyr6yyW.d.ts → variables-BCkyLoXK.d.ts} +7 -10
- package/package.json +1 -1
- package/dist/chunks/chunk-6K4ROGDD.js.map +0 -1
- package/dist/chunks/chunk-GUDRSXIP.js.map +0 -1
- package/dist/chunks/chunk-LN74Z5QM.js.map +0 -1
- package/dist/chunks/chunk-O5N4DCU6.js.map +0 -1
- package/dist/chunks/chunk-TJ6ZOT7A.js.map +0 -1
- package/dist/test.context-L609DNAz.d.ts +0 -58
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../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":["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\n// let currentRequest: XMLHttpRequest | null = null;\n\nexport function loadXML(url): { promise: Promise<XMLDocument | null>; xhr: XMLHttpRequest } {\n const xhr = new XMLHttpRequest();\n\n const promise = new Promise<XMLDocument | null>((resolve, reject) => {\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 return { promise, xhr };\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 (!/^(data:|https?:|blob:)/.test(attrValue)) {\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\nexport function getShuffleQuerySelectorByTagName(tagName: string) {\n switch (tagName) {\n case 'qti-choice-interaction':\n case 'qti-order-interaction':\n return 'qti-simple-choice';\n case 'qti-inline-choice-interaction':\n return 'qti-inline-choice';\n case 'qti-match-interaction':\n return [\n 'qti-simple-match-set:first-of-type qti-simple-associable-choice',\n 'qti-simple-match-set:last-of-type > qti-simple-associable-choice'\n ];\n case 'qti-gap-match-interaction':\n return 'qti-gap-text';\n case 'qti-associate-interaction':\n return 'qti-simple-associable-choice';\n default:\n }\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 */\nimport {\n convertCDATAtoComment,\n extendElementName,\n extendElementsWithClass,\n getShuffleQuerySelectorByTagName,\n loadXML,\n parseXML,\n setLocation,\n stripStyleSheets,\n toHTML\n} from './qti-transformers';\n\n// Type definition for module resolution config\nexport interface ModuleResolutionConfig {\n waitSeconds?: number;\n context?: string;\n catchError?: boolean;\n urlArgs?: string;\n paths: {\n [key: string]: string | string[];\n };\n shim?: {\n [key: string]: {\n deps?: string[]; // Array of dependencies\n exports?: string; // The global variable to use as the module's value\n };\n };\n}\n\nexport type transformItemApi = {\n load: (uri: string) => { promise: Promise<transformItemApi>; request: XMLHttpRequest | null };\n parse: (xmlString: string) => transformItemApi;\n path: (location: string) => transformItemApi;\n fn: (fn: (xmlFragment: XMLDocument) => void) => transformItemApi;\n pciHooks: (uri: string) => transformItemApi;\n configurePci: (\n baseUrl: string,\n getModuleResolutionConfig: (baseUrl: string, fileUrl: string) => Promise<ModuleResolutionConfig>,\n selector?: string\n ) => Promise<transformItemApi>;\n extendElementName: (elementName: string, extend: string) => transformItemApi;\n extendElementsWithClass: (param?: string) => transformItemApi;\n customInteraction: (baseRef: string, baseItem: string) => transformItemApi;\n convertCDATAtoComment: () => transformItemApi;\n shuffleInteractions: () => transformItemApi;\n stripStyleSheets: () => transformItemApi;\n html: () => string;\n xml: () => string;\n htmlDoc: () => DocumentFragment;\n xmlDoc: () => XMLDocument;\n};\n\nexport const qtiTransformItem = (cache: boolean = false) => {\n let xmlFragment: XMLDocument;\n let xmlUri = '';\n\n const api: transformItemApi = {\n load(uri: string) {\n xmlUri = uri;\n const fullKey = encodeURI(uri);\n if (cache) {\n if (sessionStorage.getItem(fullKey)) {\n return {\n promise: Promise.resolve(api.parse(sessionStorage.getItem(fullKey)!)),\n request: null\n };\n }\n }\n const { promise, xhr } = loadXML(uri);\n const a = new Promise<typeof api>(resolve => {\n promise.then(xml => {\n xmlFragment = xml;\n api.shuffleInteractions();\n if (cache) sessionStorage.setItem(fullKey, new XMLSerializer().serializeToString(xmlFragment));\n return resolve(api);\n });\n });\n\n return { promise: a, request: xhr };\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 xmlUri = null;\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 async configurePci(\n baseUrl: string,\n getModuleResolutionConfig: (baseUrl: string, fileUrl: string) => Promise<ModuleResolutionConfig>,\n selector = 'qti-portable-custom-interaction'\n ): Promise<typeof api> {\n const customInteractionTypeIdentifiers: string[] = [];\n const portableCustomInteractions = xmlFragment.querySelectorAll(selector);\n\n const moduleResolutionConfig = await getModuleResolutionConfig(baseUrl, '/modules/module_resolution.js');\n const moduleResolutionFallbackConfig = await getModuleResolutionConfig(\n baseUrl,\n '/modules/fallback_module_resolution.js'\n );\n\n if (portableCustomInteractions.length > 0) {\n for (const interaction of Array.from(portableCustomInteractions)) {\n // set data-base-url\n interaction.setAttribute('data-base-url', baseUrl);\n\n let customInteractionTypeIdentifier = interaction.getAttribute('custom-interaction-type-identifier');\n if (\n customInteractionTypeIdentifier &&\n customInteractionTypeIdentifiers.includes(customInteractionTypeIdentifier)\n ) {\n customInteractionTypeIdentifier = customInteractionTypeIdentifier + customInteractionTypeIdentifiers.length;\n interaction.setAttribute('custom-interaction-type-identifier', customInteractionTypeIdentifier);\n customInteractionTypeIdentifiers.push(customInteractionTypeIdentifier);\n }\n if (customInteractionTypeIdentifier) {\n customInteractionTypeIdentifiers.push(customInteractionTypeIdentifier);\n }\n\n // Check if qti-interaction-modules already exists\n let modulesElement = interaction.querySelector('qti-interaction-modules');\n\n // If it exists and has primary-configuration, handle that format\n if (modulesElement && modulesElement.getAttribute('primary-configuration')) {\n const primaryConfigPath = modulesElement.getAttribute('primary-configuration');\n if (primaryConfigPath) {\n try {\n // Load the primary configuration\n const primaryConfig = await getModuleResolutionConfig(baseUrl, `/${primaryConfigPath}`);\n\n // Get existing module elements that only have id attributes\n const existingModules = Array.from(modulesElement.querySelectorAll('qti-interaction-module'));\n\n // Update existing modules with paths from config\n for (const moduleEl of existingModules) {\n const moduleId = moduleEl.getAttribute('id');\n if (moduleId && primaryConfig.paths && primaryConfig.paths[moduleId]) {\n const primaryPath = primaryConfig.paths[moduleId];\n const primaryPathString = Array.isArray(primaryPath) ? primaryPath[0] : primaryPath;\n moduleEl.setAttribute('primary-path', primaryPathString);\n\n // Check for fallback path\n if (\n moduleResolutionFallbackConfig &&\n moduleResolutionFallbackConfig.paths &&\n moduleResolutionFallbackConfig.paths[moduleId]\n ) {\n const fallbackPath = moduleResolutionFallbackConfig.paths[moduleId];\n if (Array.isArray(fallbackPath)) {\n moduleEl.setAttribute('fallback-path', fallbackPath[0]);\n } else {\n moduleEl.setAttribute('fallback-path', fallbackPath);\n }\n }\n }\n }\n\n // Add any additional modules from primary config that aren't already present\n if (primaryConfig.paths) {\n for (const moduleId in primaryConfig.paths) {\n const existingModule = modulesElement.querySelector(`qti-interaction-module[id=\"${moduleId}\"]`);\n if (!existingModule) {\n const newModuleElement = xmlFragment.createElement('qti-interaction-module');\n newModuleElement.setAttribute('id', moduleId);\n const primaryPathString = Array.isArray(primaryConfig.paths[moduleId])\n ? primaryConfig.paths[moduleId][0]\n : primaryConfig.paths[moduleId];\n newModuleElement.setAttribute('primary-path', primaryPathString);\n\n // Check for fallback path\n if (\n moduleResolutionFallbackConfig &&\n moduleResolutionFallbackConfig.paths &&\n moduleResolutionFallbackConfig.paths[moduleId]\n ) {\n const fallbackPath = moduleResolutionFallbackConfig.paths[moduleId];\n if (Array.isArray(fallbackPath)) {\n newModuleElement.setAttribute('fallback-path', fallbackPath[0]);\n } else {\n newModuleElement.setAttribute('fallback-path', fallbackPath);\n }\n }\n\n modulesElement.appendChild(newModuleElement);\n }\n }\n }\n\n // Apply urlArgs if present in config\n if (primaryConfig.urlArgs) {\n modulesElement.setAttribute('url-args', primaryConfig.urlArgs);\n }\n } catch (error) {\n console.warn(`Failed to load primary configuration: ${primaryConfigPath}`, error);\n }\n }\n } else {\n // Original logic for when there's no existing qti-interaction-modules or no primary-configuration\n if (moduleResolutionConfig) {\n // Create qti-interaction-modules if it doesn't exist\n if (interaction.querySelector('qti-interaction-modules') === null) {\n modulesElement = xmlFragment.createElement('qti-interaction-modules');\n interaction.appendChild(modulesElement);\n } else {\n modulesElement = interaction.querySelector('qti-interaction-modules');\n }\n\n for (const module in moduleResolutionConfig.paths) {\n const path = moduleResolutionConfig.paths[module];\n let fallbackPath: string | string[] = '';\n\n if (\n moduleResolutionFallbackConfig &&\n moduleResolutionFallbackConfig.paths &&\n moduleResolutionFallbackConfig.paths[module]\n ) {\n fallbackPath = moduleResolutionFallbackConfig.paths[module];\n }\n\n const primaryArray = Array.isArray(path) ? path : [path];\n const fallbackPathArray = Array.isArray(fallbackPath) ? fallbackPath : [fallbackPath];\n\n // create an array with primary and fallback paths.\n const paths = primaryArray.map((primaryPath, i) => {\n const fallbackPath = fallbackPathArray.length > i ? fallbackPathArray[i] : '';\n return {\n primaryPath,\n fallbackPath\n };\n });\n\n // check if all fallbackPath elements are in the array: paths, otherwise add\n for (const fallbackPath of fallbackPathArray) {\n if (!paths.some(p => p.fallbackPath === fallbackPath)) {\n paths.push({\n primaryPath: primaryArray.length > 0 ? primaryArray[0] : fallbackPath,\n fallbackPath\n });\n }\n }\n\n // add the paths to the qti-interaction-modules\n for (const path of paths) {\n const moduleElement = xmlFragment.createElement('qti-interaction-module');\n if (path.fallbackPath) {\n moduleElement.setAttribute('fallback-path', path.fallbackPath);\n }\n moduleElement.setAttribute('id', module);\n moduleElement.setAttribute('primary-path', path.primaryPath);\n\n if (modulesElement) {\n modulesElement.appendChild(moduleElement);\n }\n }\n }\n }\n }\n }\n }\n\n return api;\n },\n shuffleInteractions(): typeof api {\n const shuffleElements = xmlFragment.querySelectorAll(`[shuffle=\"true\"]`);\n const shuffleInteractions = Array.from(shuffleElements).filter(e =>\n e.tagName?.toLowerCase().endsWith('-interaction')\n );\n\n for (const shuffleInteraction of shuffleInteractions) {\n const query = getShuffleQuerySelectorByTagName(shuffleInteraction.tagName.toLowerCase());\n const queries = Array.isArray(query) ? query : [query];\n\n for (const q of queries) {\n const choices = Array.from(shuffleInteraction.querySelectorAll(q)) as HTMLElement[];\n\n const fixedChoices = choices\n .map((choice, originalOrder) => ({\n element: choice,\n fixed: choice.hasAttribute('fixed') && choice.getAttribute('fixed') === 'true',\n originalOrder\n }))\n .filter(choice => choice.fixed);\n\n const nonFixedChoices = choices.filter(\n choice => !choice.hasAttribute('fixed') || choice.getAttribute('fixed') !== 'true'\n );\n\n if (nonFixedChoices.length <= 1) {\n console.warn('Shuffling is not possible with fewer than 2 non-fixed elements.');\n return api;\n }\n\n const originalOrder = [...nonFixedChoices];\n let shuffled = false;\n let attempts = 0;\n\n while (!shuffled && attempts < 20) {\n attempts++;\n for (let i = nonFixedChoices.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [nonFixedChoices[i], nonFixedChoices[j]] = [nonFixedChoices[j], nonFixedChoices[i]];\n }\n shuffled = !nonFixedChoices.every((choice, index) => choice === originalOrder[index]);\n }\n\n if (!shuffled) {\n console.warn('Failed to shuffle the choices after multiple attempts.');\n return null;\n }\n\n // Remove the shuffle attribute\n shuffleInteraction.removeAttribute('shuffle');\n\n // Reorder the elements in the DOM\n let nonFixedIndex = 0;\n for (const nonFixedChoice of nonFixedChoices) {\n nonFixedChoice.parentElement.insertBefore(nonFixedChoice, fixedChoices[nonFixedIndex]?.element);\n nonFixedIndex++;\n }\n for (const fixedChoice of fixedChoices) {\n fixedChoice.element.parentElement.insertBefore(\n fixedChoice.element,\n nonFixedChoices[fixedChoice.originalOrder]\n );\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 if (xmlUri !== null) {\n setLocation(xmlFragment, xmlUri.substring(0, xmlUri.lastIndexOf('/')));\n }\n return new XMLSerializer().serializeToString(toHTML(xmlFragment));\n },\n xml(): string {\n return new XMLSerializer().serializeToString(xmlFragment);\n },\n htmlDoc() {\n if (xmlUri !== null) {\n setLocation(xmlFragment, xmlUri.substring(0, xmlUri.lastIndexOf('/')));\n }\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).promise.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, setLocation, toHTML } from './qti-transformers';\n\nexport type transformTestApi = {\n load: (uri: string) => Promise<transformTestApi>;\n parse: (xmlString: string) => transformTestApi;\n path: (location: 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).promise.then(xml => {\n xmlFragment = xml;\n\n api.path(uri.substring(0, uri.lastIndexOf('/')));\n return resolve(api);\n });\n });\n },\n parse(xmlString: string) {\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) {\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","fallbackPath","path","originalOrder","xml","xml"]}
|
|
1
|
+
{"version":3,"sources":["../../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":["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\n// let currentRequest: XMLHttpRequest | null = null;\n\nexport function loadXML(url): { promise: Promise<XMLDocument | null>; xhr: XMLHttpRequest } {\n const xhr = new XMLHttpRequest();\n\n const promise = new Promise<XMLDocument | null>((resolve, reject) => {\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 return { promise, xhr };\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 (!/^(data:|https?:|blob:)/.test(attrValue)) {\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\nexport function getShuffleQuerySelectorByTagName(tagName: string) {\n switch (tagName) {\n case 'qti-choice-interaction':\n case 'qti-order-interaction':\n return 'qti-simple-choice';\n case 'qti-inline-choice-interaction':\n return 'qti-inline-choice';\n case 'qti-match-interaction':\n return [\n 'qti-simple-match-set:first-of-type qti-simple-associable-choice',\n 'qti-simple-match-set:last-of-type > qti-simple-associable-choice'\n ];\n case 'qti-gap-match-interaction':\n return 'qti-gap-text';\n case 'qti-associate-interaction':\n return 'qti-simple-associable-choice';\n default:\n }\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 */\nimport {\n convertCDATAtoComment,\n extendElementName,\n extendElementsWithClass,\n getShuffleQuerySelectorByTagName,\n loadXML,\n parseXML,\n setLocation,\n stripStyleSheets,\n toHTML\n} from './qti-transformers';\n\n// Type definition for module resolution config\nexport interface ModuleResolutionConfig {\n waitSeconds?: number;\n context?: string;\n catchError?: boolean;\n urlArgs?: string;\n paths: {\n [key: string]: string | string[];\n };\n shim?: {\n [key: string]: {\n deps?: string[]; // Array of dependencies\n exports?: string; // The global variable to use as the module's value\n };\n };\n}\n\nexport type transformItemApi = {\n load: (uri: string) => { promise: Promise<transformItemApi>; request: XMLHttpRequest | null };\n parse: (xmlString: string) => transformItemApi;\n path: (location: string) => transformItemApi;\n fn: (fn: (xmlFragment: XMLDocument) => void) => transformItemApi;\n pciHooks: (uri: string) => transformItemApi;\n configurePci: (\n baseUrl: string,\n getModuleResolutionConfig: (baseUrl: string, fileUrl: string) => Promise<ModuleResolutionConfig>,\n selector?: string\n ) => Promise<transformItemApi>;\n extendElementName: (elementName: string, extend: string) => transformItemApi;\n extendElementsWithClass: (param?: string) => transformItemApi;\n customInteraction: (baseRef: string, baseItem: string) => transformItemApi;\n convertCDATAtoComment: () => transformItemApi;\n shuffleInteractions: () => transformItemApi;\n stripStyleSheets: () => transformItemApi;\n html: () => string;\n xml: () => string;\n htmlDoc: () => DocumentFragment;\n xmlDoc: () => XMLDocument;\n};\n\nexport const qtiTransformItem = (cache: boolean = false) => {\n let xmlFragment: XMLDocument;\n let xmlUri = '';\n\n const api: transformItemApi = {\n load(uri: string) {\n xmlUri = uri;\n const fullKey = encodeURI(uri);\n if (cache) {\n if (sessionStorage.getItem(fullKey)) {\n return {\n promise: Promise.resolve(api.parse(sessionStorage.getItem(fullKey)!)),\n request: null\n };\n }\n }\n const { promise, xhr } = loadXML(uri);\n const a = new Promise<typeof api>(resolve => {\n promise.then(xml => {\n xmlFragment = xml;\n api.shuffleInteractions();\n if (cache) sessionStorage.setItem(fullKey, new XMLSerializer().serializeToString(xmlFragment));\n return resolve(api);\n });\n });\n\n return { promise: a, request: xhr };\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 xmlUri = null;\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 async configurePci(\n baseUrl: string,\n getModuleResolutionConfig: (baseUrl: string, fileUrl: string) => Promise<ModuleResolutionConfig>,\n selector = 'qti-portable-custom-interaction'\n ): Promise<typeof api> {\n const customInteractionTypeIdentifiers: string[] = [];\n const portableCustomInteractions = xmlFragment.querySelectorAll(selector);\n\n const moduleResolutionConfig = await getModuleResolutionConfig(baseUrl, '/modules/module_resolution.js');\n const moduleResolutionFallbackConfig = await getModuleResolutionConfig(\n baseUrl,\n '/modules/fallback_module_resolution.js'\n );\n\n if (portableCustomInteractions.length > 0) {\n for (const interaction of Array.from(portableCustomInteractions)) {\n // set data-base-url\n interaction.setAttribute('data-base-url', baseUrl);\n\n let customInteractionTypeIdentifier = interaction.getAttribute('custom-interaction-type-identifier');\n if (\n customInteractionTypeIdentifier &&\n customInteractionTypeIdentifiers.includes(customInteractionTypeIdentifier)\n ) {\n customInteractionTypeIdentifier = customInteractionTypeIdentifier + customInteractionTypeIdentifiers.length;\n interaction.setAttribute('custom-interaction-type-identifier', customInteractionTypeIdentifier);\n customInteractionTypeIdentifiers.push(customInteractionTypeIdentifier);\n }\n if (customInteractionTypeIdentifier) {\n customInteractionTypeIdentifiers.push(customInteractionTypeIdentifier);\n }\n\n // Check if qti-interaction-modules already exists\n let modulesElement = interaction.querySelector('qti-interaction-modules');\n\n // If it exists and has primary-configuration, handle that format\n if (modulesElement && modulesElement.getAttribute('primary-configuration')) {\n const primaryConfigPath = modulesElement.getAttribute('primary-configuration');\n if (primaryConfigPath) {\n try {\n // Load the primary configuration\n const primaryConfig = await getModuleResolutionConfig(baseUrl, `/${primaryConfigPath}`);\n\n // Get existing module elements that only have id attributes\n const existingModules = Array.from(modulesElement.querySelectorAll('qti-interaction-module'));\n\n // Update existing modules with paths from config\n for (const moduleEl of existingModules) {\n const moduleId = moduleEl.getAttribute('id');\n if (moduleId && primaryConfig.paths && primaryConfig.paths[moduleId]) {\n const primaryPath = primaryConfig.paths[moduleId];\n const primaryPathString = Array.isArray(primaryPath) ? primaryPath[0] : primaryPath;\n moduleEl.setAttribute('primary-path', primaryPathString);\n\n // Check for fallback path\n if (\n moduleResolutionFallbackConfig &&\n moduleResolutionFallbackConfig.paths &&\n moduleResolutionFallbackConfig.paths[moduleId]\n ) {\n const fallbackPath = moduleResolutionFallbackConfig.paths[moduleId];\n if (Array.isArray(fallbackPath)) {\n moduleEl.setAttribute('fallback-path', fallbackPath[0]);\n } else {\n moduleEl.setAttribute('fallback-path', fallbackPath);\n }\n }\n }\n }\n\n // Add any additional modules from primary config that aren't already present\n if (primaryConfig.paths) {\n for (const moduleId in primaryConfig.paths) {\n const existingModule = modulesElement.querySelector(`qti-interaction-module[id=\"${moduleId}\"]`);\n if (!existingModule) {\n const newModuleElement = xmlFragment.createElement('qti-interaction-module');\n newModuleElement.setAttribute('id', moduleId);\n const primaryPathString = Array.isArray(primaryConfig.paths[moduleId])\n ? primaryConfig.paths[moduleId][0]\n : primaryConfig.paths[moduleId];\n newModuleElement.setAttribute('primary-path', primaryPathString);\n\n // Check for fallback path\n if (\n moduleResolutionFallbackConfig &&\n moduleResolutionFallbackConfig.paths &&\n moduleResolutionFallbackConfig.paths[moduleId]\n ) {\n const fallbackPath = moduleResolutionFallbackConfig.paths[moduleId];\n if (Array.isArray(fallbackPath)) {\n newModuleElement.setAttribute('fallback-path', fallbackPath[0]);\n } else {\n newModuleElement.setAttribute('fallback-path', fallbackPath);\n }\n }\n\n modulesElement.appendChild(newModuleElement);\n }\n }\n }\n\n // Apply urlArgs if present in config\n if (primaryConfig.urlArgs) {\n modulesElement.setAttribute('url-args', primaryConfig.urlArgs);\n }\n } catch (error) {\n console.warn(`Failed to load primary configuration: ${primaryConfigPath}`, error);\n }\n }\n } else {\n // Original logic for when there's no existing qti-interaction-modules or no primary-configuration\n if (moduleResolutionConfig) {\n // Create qti-interaction-modules if it doesn't exist\n if (interaction.querySelector('qti-interaction-modules') === null) {\n modulesElement = xmlFragment.createElement('qti-interaction-modules');\n interaction.appendChild(modulesElement);\n } else {\n modulesElement = interaction.querySelector('qti-interaction-modules');\n }\n\n for (const module in moduleResolutionConfig.paths) {\n const path = moduleResolutionConfig.paths[module];\n let fallbackPath: string | string[] = '';\n\n if (\n moduleResolutionFallbackConfig &&\n moduleResolutionFallbackConfig.paths &&\n moduleResolutionFallbackConfig.paths[module]\n ) {\n fallbackPath = moduleResolutionFallbackConfig.paths[module];\n }\n\n const primaryArray = Array.isArray(path) ? path : [path];\n const fallbackPathArray = Array.isArray(fallbackPath) ? fallbackPath : [fallbackPath];\n\n // create an array with primary and fallback paths.\n const paths = primaryArray.map((primaryPath, i) => {\n const fallbackPath = fallbackPathArray.length > i ? fallbackPathArray[i] : '';\n return {\n primaryPath,\n fallbackPath\n };\n });\n\n // check if all fallbackPath elements are in the array: paths, otherwise add\n for (const fallbackPath of fallbackPathArray) {\n if (!paths.some(p => p.fallbackPath === fallbackPath)) {\n paths.push({\n primaryPath: primaryArray.length > 0 ? primaryArray[0] : fallbackPath,\n fallbackPath\n });\n }\n }\n\n // add the paths to the qti-interaction-modules\n for (const path of paths) {\n const moduleElement = xmlFragment.createElement('qti-interaction-module');\n if (path.fallbackPath) {\n moduleElement.setAttribute('fallback-path', path.fallbackPath);\n }\n moduleElement.setAttribute('id', module);\n moduleElement.setAttribute('primary-path', path.primaryPath);\n\n if (modulesElement) {\n modulesElement.appendChild(moduleElement);\n }\n }\n }\n }\n }\n }\n }\n\n return api;\n },\n shuffleInteractions(): typeof api {\n const shuffleElements = xmlFragment.querySelectorAll(`[shuffle=\"true\"]`);\n const shuffleInteractions = Array.from(shuffleElements).filter(e =>\n e.tagName?.toLowerCase().endsWith('-interaction')\n );\n\n for (const shuffleInteraction of shuffleInteractions) {\n const query = getShuffleQuerySelectorByTagName(shuffleInteraction.tagName.toLowerCase());\n const queries = Array.isArray(query) ? query : [query];\n\n for (const q of queries) {\n const choices = Array.from(shuffleInteraction.querySelectorAll(q)) as HTMLElement[];\n\n const fixedChoices = choices\n .map((choice, originalOrder) => ({\n element: choice,\n fixed: choice.hasAttribute('fixed') && choice.getAttribute('fixed') === 'true',\n originalOrder\n }))\n .filter(choice => choice.fixed);\n\n const nonFixedChoices = choices.filter(\n choice => !choice.hasAttribute('fixed') || choice.getAttribute('fixed') !== 'true'\n );\n\n if (nonFixedChoices.length <= 1) {\n console.warn('Shuffling is not possible with fewer than 2 non-fixed elements.');\n return api;\n }\n\n const originalOrder = [...nonFixedChoices];\n let shuffled = false;\n let attempts = 0;\n\n while (!shuffled && attempts < 20) {\n attempts++;\n for (let i = nonFixedChoices.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [nonFixedChoices[i], nonFixedChoices[j]] = [nonFixedChoices[j], nonFixedChoices[i]];\n }\n shuffled = !nonFixedChoices.every((choice, index) => choice === originalOrder[index]);\n }\n\n if (!shuffled) {\n console.warn('Failed to shuffle the choices after multiple attempts.');\n return null;\n }\n\n // Remove the shuffle attribute\n shuffleInteraction.removeAttribute('shuffle');\n\n // Reorder the elements in the DOM\n let nonFixedIndex = 0;\n for (const nonFixedChoice of nonFixedChoices) {\n nonFixedChoice.parentElement.insertBefore(nonFixedChoice, fixedChoices[nonFixedIndex]?.element);\n nonFixedIndex++;\n }\n for (const fixedChoice of fixedChoices) {\n fixedChoice.element.parentElement.insertBefore(\n fixedChoice.element,\n nonFixedChoices[fixedChoice.originalOrder]\n );\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 if (xmlUri !== null) {\n setLocation(xmlFragment, xmlUri.substring(0, xmlUri.lastIndexOf('/')));\n }\n return new XMLSerializer().serializeToString(toHTML(xmlFragment));\n },\n xml(): string {\n return new XMLSerializer().serializeToString(xmlFragment);\n },\n htmlDoc() {\n if (xmlUri !== null) {\n setLocation(xmlFragment, xmlUri.substring(0, xmlUri.lastIndexOf('/')));\n }\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).promise.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, setLocation, toHTML } from './qti-transformers';\n\nexport type transformTestApi = {\n load: (uri: string) => Promise<transformTestApi>;\n parse: (xmlString: string) => transformTestApi;\n path: (location: 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).promise.then(xml => {\n xmlFragment = xml;\n\n api.path(uri.substring(0, uri.lastIndexOf('/')));\n return resolve(api);\n });\n });\n },\n parse(xmlString: string) {\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) {\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","fallbackPath","path","originalOrder","xml","xml"]}
|
|
@@ -22878,12 +22878,6 @@
|
|
|
22878
22878
|
}
|
|
22879
22879
|
]
|
|
22880
22880
|
},
|
|
22881
|
-
{
|
|
22882
|
-
"kind": "javascript-module",
|
|
22883
|
-
"path": "src/lib/qti-components/qti-response-processing/qti-expression/qti-gcd/qti.gcd.spec.ts",
|
|
22884
|
-
"declarations": [],
|
|
22885
|
-
"exports": []
|
|
22886
|
-
},
|
|
22887
22881
|
{
|
|
22888
22882
|
"kind": "javascript-module",
|
|
22889
22883
|
"path": "src/lib/qti-components/qti-interaction/internal/choices/choices.spec.ts",
|
|
@@ -23310,6 +23304,12 @@
|
|
|
23310
23304
|
}
|
|
23311
23305
|
]
|
|
23312
23306
|
},
|
|
23307
|
+
{
|
|
23308
|
+
"kind": "javascript-module",
|
|
23309
|
+
"path": "src/lib/qti-components/qti-response-processing/qti-expression/qti-gcd/qti.gcd.spec.ts",
|
|
23310
|
+
"declarations": [],
|
|
23311
|
+
"exports": []
|
|
23312
|
+
},
|
|
23313
23313
|
{
|
|
23314
23314
|
"kind": "javascript-module",
|
|
23315
23315
|
"path": "src/lib/qti-item/components/item-container.ts",
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { V as VariableDeclaration } from '
|
|
1
|
+
import { V as VariableDeclaration } from '../variables-BCkyLoXK.js';
|
|
2
|
+
import './expression-result.js';
|
|
2
3
|
|
|
3
4
|
type ComputedItemContext = {
|
|
4
5
|
identifier: string;
|
|
@@ -15,5 +16,8 @@ type ComputedItemContext = {
|
|
|
15
16
|
completionStatus?: string;
|
|
16
17
|
variables: ReadonlyArray<VariableDeclaration<string | string[] | null>>;
|
|
17
18
|
};
|
|
19
|
+
declare const computedItemContext: {
|
|
20
|
+
__context__: Readonly<ComputedItemContext>;
|
|
21
|
+
};
|
|
18
22
|
|
|
19
|
-
export type
|
|
23
|
+
export { type ComputedItemContext, computedItemContext };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { View } from './session.context.js';
|
|
2
|
+
import { ComputedItemContext } from './computed-item.context.js';
|
|
3
|
+
import '../variables-BCkyLoXK.js';
|
|
4
|
+
import './expression-result.js';
|
|
5
|
+
|
|
6
|
+
type ComputedItem = ComputedItemContext & {
|
|
7
|
+
categories?: string[];
|
|
8
|
+
type?: 'info' | 'regular';
|
|
9
|
+
index?: number;
|
|
10
|
+
active?: boolean;
|
|
11
|
+
};
|
|
12
|
+
type ComputedContext = {
|
|
13
|
+
view: View;
|
|
14
|
+
identifier: string;
|
|
15
|
+
title: string;
|
|
16
|
+
testParts: {
|
|
17
|
+
active?: boolean;
|
|
18
|
+
identifier: string;
|
|
19
|
+
navigationMode: 'linear' | 'nonlinear';
|
|
20
|
+
submissionMode: 'individual' | 'simultaneous';
|
|
21
|
+
sections: {
|
|
22
|
+
active?: boolean;
|
|
23
|
+
identifier: string;
|
|
24
|
+
title: string;
|
|
25
|
+
completed?: boolean;
|
|
26
|
+
items: ComputedItem[];
|
|
27
|
+
}[];
|
|
28
|
+
}[];
|
|
29
|
+
};
|
|
30
|
+
declare const computedContext: {
|
|
31
|
+
__context__: Readonly<ComputedContext>;
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
export { type ComputedContext, type ComputedItem, computedContext };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -6,5 +6,8 @@ interface ConfigContext {
|
|
|
6
6
|
correctResponseMode?: CorrectResponseMode;
|
|
7
7
|
inlineChoicePrompt?: string;
|
|
8
8
|
}
|
|
9
|
+
declare const configContext: {
|
|
10
|
+
__context__: Readonly<ConfigContext>;
|
|
11
|
+
};
|
|
9
12
|
|
|
10
|
-
export type
|
|
13
|
+
export { type ConfigContext, type CorrectResponseMode, configContext };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
interface directedPair {
|
|
2
|
+
destination: string;
|
|
3
|
+
source: string;
|
|
4
|
+
}
|
|
5
|
+
interface ResponseInteraction {
|
|
6
|
+
responseIdentifier: string;
|
|
7
|
+
response: string | string[];
|
|
8
|
+
}
|
|
9
|
+
interface Calculate {
|
|
10
|
+
calculate: () => string | string[];
|
|
11
|
+
}
|
|
12
|
+
type float = number;
|
|
13
|
+
type integer = number;
|
|
14
|
+
type BaseType = 'boolean' | 'directedPair' | 'duration' | 'float' | 'integer' | 'string' | 'identifier' | 'pair' | 'record';
|
|
15
|
+
type Multiple = string | string[][];
|
|
16
|
+
type Ordered = string | string[][];
|
|
17
|
+
type Cardinality = 'multiple' | 'ordered' | 'single' | 'record';
|
|
18
|
+
|
|
19
|
+
export type { BaseType, Calculate, Cardinality, Multiple, Ordered, ResponseInteraction, directedPair, float, integer };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=expression-result.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { LitElement } from 'lit';
|
|
2
|
+
import { ConfigContext } from './config.context.js';
|
|
3
|
+
import { R as ResponseVariable } from '../variables-BCkyLoXK.js';
|
|
4
|
+
import { IInteraction } from './interaction.interface.js';
|
|
5
|
+
import './expression-result.js';
|
|
6
|
+
|
|
7
|
+
declare enum Correctness {
|
|
8
|
+
Correct = "correct",
|
|
9
|
+
PartiallyCorrect = "partially-correct",
|
|
10
|
+
Incorrect = "incorrect"
|
|
11
|
+
}
|
|
12
|
+
declare abstract class Interaction extends LitElement implements IInteraction {
|
|
13
|
+
private _context;
|
|
14
|
+
protected configContext: ConfigContext;
|
|
15
|
+
static formAssociated: boolean;
|
|
16
|
+
protected _internals: ElementInternals;
|
|
17
|
+
get internals(): ElementInternals;
|
|
18
|
+
responseIdentifier: any;
|
|
19
|
+
disabled: boolean;
|
|
20
|
+
readonly: boolean;
|
|
21
|
+
protected _isFullCorrectResponse: boolean;
|
|
22
|
+
get isFullCorrectResponse(): Readonly<boolean>;
|
|
23
|
+
set isFullCorrectResponse(val: Readonly<boolean>);
|
|
24
|
+
protected _correctResponse: string | string[];
|
|
25
|
+
get correctResponse(): Readonly<string | string[]>;
|
|
26
|
+
set correctResponse(val: Readonly<string | string[]>);
|
|
27
|
+
get correctness(): Readonly<Correctness | null>;
|
|
28
|
+
get isInline(): boolean;
|
|
29
|
+
get responseVariable(): ResponseVariable | undefined;
|
|
30
|
+
toggleCorrectResponse(show: boolean): void;
|
|
31
|
+
protected toggleFullCorrectResponse(show: boolean): Promise<void>;
|
|
32
|
+
protected toggleInternalCorrectResponse(show: boolean): void;
|
|
33
|
+
toggleCandidateCorrection(show: boolean): void;
|
|
34
|
+
constructor();
|
|
35
|
+
abstract validate(): boolean;
|
|
36
|
+
get value(): string | null;
|
|
37
|
+
set value(val: string | null);
|
|
38
|
+
abstract get response(): string | string[] | null;
|
|
39
|
+
abstract set response(val: string | string[] | null);
|
|
40
|
+
reportValidity(): boolean;
|
|
41
|
+
reset(): void;
|
|
42
|
+
connectedCallback(): void;
|
|
43
|
+
saveResponse(value: string | string[]): void;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export { Correctness, Interaction };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
interface IInteraction {
|
|
2
|
+
correctResponse: Readonly<string | string[]>;
|
|
3
|
+
response: string | string[];
|
|
4
|
+
responseIdentifier: string;
|
|
5
|
+
disabled: boolean;
|
|
6
|
+
readonly: boolean;
|
|
7
|
+
validate(): boolean;
|
|
8
|
+
reportValidity(): boolean;
|
|
9
|
+
reset(): void;
|
|
10
|
+
saveResponse(value: string | string[]): void;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export type { IInteraction };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=interaction.interface.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Correctness,
|
|
3
|
+
Interaction
|
|
4
|
+
} from "../chunks/chunk-HFAUM56X.js";
|
|
5
|
+
import "../chunks/chunk-NJNQOQUU.js";
|
|
6
|
+
import "../chunks/chunk-ERYHQVOT.js";
|
|
7
|
+
import "../chunks/chunk-H2JE6IVU.js";
|
|
8
|
+
export {
|
|
9
|
+
Correctness,
|
|
10
|
+
Interaction
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=interaction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { V as VariableDeclaration } from '../variables-BCkyLoXK.js';
|
|
2
|
+
import './expression-result.js';
|
|
3
|
+
|
|
4
|
+
interface ItemContext {
|
|
5
|
+
identifier?: string;
|
|
6
|
+
href?: string;
|
|
7
|
+
variables?: ReadonlyArray<VariableDeclaration<string | string[] | null>>;
|
|
8
|
+
}
|
|
9
|
+
declare const itemContextVariables: VariableDeclaration<string | string[]>[];
|
|
10
|
+
|
|
11
|
+
export { type ItemContext, itemContextVariables };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { QtiExpression } from './qti-expression.js';
|
|
2
|
+
import 'lit-html';
|
|
3
|
+
import 'lit';
|
|
4
|
+
import './qti.context.js';
|
|
5
|
+
import '../variables-BCkyLoXK.js';
|
|
6
|
+
import './expression-result.js';
|
|
7
|
+
import './item.context.js';
|
|
8
|
+
|
|
9
|
+
declare abstract class QtiConditionExpression extends QtiExpression<boolean> {
|
|
10
|
+
calculate(): Readonly<boolean>;
|
|
11
|
+
getResult(): Readonly<boolean>;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export { QtiConditionExpression };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import {
|
|
2
|
+
QtiConditionExpression
|
|
3
|
+
} from "../chunks/chunk-SV4K25ZI.js";
|
|
4
|
+
import "../chunks/chunk-GAAFN7QF.js";
|
|
5
|
+
import "../chunks/chunk-H6KHXSIO.js";
|
|
6
|
+
import "../chunks/chunk-NJNQOQUU.js";
|
|
7
|
+
import "../chunks/chunk-H2JE6IVU.js";
|
|
8
|
+
export {
|
|
9
|
+
QtiConditionExpression
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=qti-condition-expression.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import * as lit_html from 'lit-html';
|
|
2
|
+
import * as lit from 'lit';
|
|
3
|
+
import { LitElement } from 'lit';
|
|
4
|
+
import { QtiContext, QtiContextType } from './qti.context.js';
|
|
5
|
+
import { R as ResponseVariable, V as VariableDeclaration } from '../variables-BCkyLoXK.js';
|
|
6
|
+
import { ItemContext } from './item.context.js';
|
|
7
|
+
import './expression-result.js';
|
|
8
|
+
|
|
9
|
+
interface QtiExpressionBase<T> {
|
|
10
|
+
calculate(): Readonly<T>;
|
|
11
|
+
}
|
|
12
|
+
declare abstract class QtiExpression<T> extends LitElement implements QtiExpressionBase<T> {
|
|
13
|
+
protected result: any;
|
|
14
|
+
static styles: lit.CSSResult;
|
|
15
|
+
render(): lit_html.TemplateResult<1>;
|
|
16
|
+
calculate(): Readonly<T>;
|
|
17
|
+
protected getResult(): Readonly<T>;
|
|
18
|
+
protected context?: ItemContext;
|
|
19
|
+
protected qtiContext?: QtiContext;
|
|
20
|
+
getVariables: () => (ResponseVariable | VariableDeclaration<QtiContextType>)[];
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export { QtiExpression, type QtiExpressionBase };
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import {
|
|
2
|
+
QtiExpression
|
|
3
|
+
} from "../chunks/chunk-GAAFN7QF.js";
|
|
4
|
+
import "../chunks/chunk-H6KHXSIO.js";
|
|
5
|
+
import "../chunks/chunk-NJNQOQUU.js";
|
|
6
|
+
import "../chunks/chunk-H2JE6IVU.js";
|
|
7
|
+
export {
|
|
8
|
+
QtiExpression
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=qti-expression.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export { I as IQtiTest, f as ITestNavigationMixin, g as ITestProcessingMixin, e as QtiTest } from '../qti-test-BwvOhz_-.js';
|
|
2
|
+
import 'lit';
|
|
3
|
+
import './test.context.js';
|
|
4
|
+
import './session.context.js';
|
|
5
|
+
import '../variables-BCkyLoXK.js';
|
|
6
|
+
import '../qti-transform-item-C9WtMeDR.js';
|
|
7
|
+
import '../qti-assessment-item-l-mN3teH.js';
|
|
8
|
+
import 'lit-html';
|
|
9
|
+
import './expression-result.js';
|
|
10
|
+
import '@heximal/templates';
|
|
11
|
+
import '../qti-modal-feedback-PKbhO-3w.js';
|
|
12
|
+
import './item.context.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=qti-test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
type QtiContextType = {
|
|
2
|
+
testIdentifier: string;
|
|
3
|
+
candidateIdentifier: string;
|
|
4
|
+
environmentIdentifier: string;
|
|
5
|
+
[key: string]: string | string[];
|
|
6
|
+
};
|
|
7
|
+
interface QtiContext {
|
|
8
|
+
QTI_CONTEXT: QtiContextType;
|
|
9
|
+
}
|
|
10
|
+
declare const qtiContext: {
|
|
11
|
+
__context__: Readonly<QtiContext>;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export { type QtiContext, type QtiContextType, qtiContext };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
type View = 'author' | 'candidate' | 'proctor' | 'scorer' | 'testConstructor' | 'tutor' | '';
|
|
2
|
+
interface SessionContext {
|
|
3
|
+
navPartId?: string | null;
|
|
4
|
+
navSectionId?: string | null;
|
|
5
|
+
navItemRefId?: string | null;
|
|
6
|
+
navItemLoading?: boolean;
|
|
7
|
+
navTestLoading?: boolean;
|
|
8
|
+
view?: View;
|
|
9
|
+
}
|
|
10
|
+
declare const INITIAL_SESSION_CONTEXT: Readonly<SessionContext>;
|
|
11
|
+
declare const sessionContext: {
|
|
12
|
+
__context__: Readonly<SessionContext>;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export { INITIAL_SESSION_CONTEXT, type SessionContext, type View, sessionContext };
|