@citolab/qti-components 7.28.0 → 7.28.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/cdn/index.global.js +1 -1
- package/cdn/index.js +188 -188
- package/custom-elements.json +91 -1
- package/dist/base.d.ts +2 -2
- package/dist/base.js +5 -1
- package/dist/chunk-3WBG257S.js +697 -0
- package/dist/chunk-3WBG257S.js.map +1 -0
- package/dist/{chunk-Z2SUBRH5.js → chunk-3XV26R5M.js} +6 -1
- package/dist/chunk-3XV26R5M.js.map +1 -0
- package/dist/{chunk-LQZCSHN5.js → chunk-AQ5RJFM6.js} +2 -2
- package/dist/{chunk-N7S3GNUP.js → chunk-FLJAKWXL.js} +2 -2
- package/dist/{chunk-PINGOK2F.js → chunk-HFCZFWSH.js} +27 -48
- package/dist/chunk-HFCZFWSH.js.map +1 -0
- package/dist/{chunk-FK2IVMS3.js → chunk-MPC7LIPC.js} +3 -3
- package/dist/{chunk-YLIYPNMK.js → chunk-REI3AMCZ.js} +2 -2
- package/dist/{chunk-U2FLSHK7.js → chunk-RLTYVS2I.js} +25 -5
- package/dist/chunk-RLTYVS2I.js.map +1 -0
- package/dist/{chunk-F6WP6WEF.js → chunk-SP6S2WMG.js} +2 -2
- package/dist/{chunk-OQ77SE2W.js → chunk-WDO2TRFM.js} +4 -4
- package/dist/elements.js +4 -4
- package/dist/index.d.ts +3 -3
- package/dist/index.js +14 -10
- package/dist/interactions.d.ts +1 -1
- package/dist/interactions.js +3 -3
- package/dist/item.d.ts +7 -0
- package/dist/item.js +4 -4
- package/dist/loader.js +2 -2
- package/dist/processing.d.ts +2 -2
- package/dist/processing.js +2 -2
- package/dist/qti-components-jsx.d.ts +178 -151
- package/dist/{qti-condition-expression-B1BYmCcq.d.ts → qti-condition-expression-Dam-RER6.d.ts} +1 -1
- package/dist/{qti-transform-test-DMx816H0.d.ts → qti-transform-test-DoZaWItm.d.ts} +11 -9
- package/dist/qti.context-CejJMlfZ.d.ts +50 -0
- package/dist/test.d.ts +5 -3
- package/dist/test.js +6 -6
- package/dist/transformers.d.ts +1 -1
- package/dist/transformers.js +1 -1
- package/package.json +6 -6
- package/dist/chunk-BPIDAS3T.js +0 -495
- package/dist/chunk-BPIDAS3T.js.map +0 -1
- package/dist/chunk-PINGOK2F.js.map +0 -1
- package/dist/chunk-U2FLSHK7.js.map +0 -1
- package/dist/chunk-Z2SUBRH5.js.map +0 -1
- package/dist/qti.context-B8PSyIWm.d.ts +0 -14
- /package/dist/{chunk-LQZCSHN5.js.map → chunk-AQ5RJFM6.js.map} +0 -0
- /package/dist/{chunk-N7S3GNUP.js.map → chunk-FLJAKWXL.js.map} +0 -0
- /package/dist/{chunk-FK2IVMS3.js.map → chunk-MPC7LIPC.js.map} +0 -0
- /package/dist/{chunk-YLIYPNMK.js.map → chunk-REI3AMCZ.js.map} +0 -0
- /package/dist/{chunk-F6WP6WEF.js.map → chunk-SP6S2WMG.js.map} +0 -0
- /package/dist/{chunk-OQ77SE2W.js.map → chunk-WDO2TRFM.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../qti-transformers/src/item/cdata.ts","../../qti-transformers/src/item/configure-pci.ts","../../qti-transformers/src/item/extend.ts","../../qti-transformers/src/item/pci-hooks.ts","../../qti-transformers/src/shared/prng.ts","../../qti-transformers/src/shared/shuffle.ts","../../qti-transformers/src/item/shuffle-interactions.ts","../../qti-transformers/src/item/stylesheets.ts","../../qti-transformers/src/shared/xml.ts","../../qti-transformers/src/qti-transform-item.ts","../../qti-transformers/src/qti-transform-manifest.ts","../../qti-transformers/src/test/items.ts","../../qti-transformers/src/test/shuffle-sections.ts","../../qti-transformers/src/qti-transform-test.ts"],"sourcesContent":["export 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","// 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 async function configurePci(\n xmlFragment: XMLDocument,\n baseUrl: string,\n getModuleResolutionConfig: (baseUrl: string, fileUrl: string) => Promise<ModuleResolutionConfig>,\n selector = 'qti-portable-custom-interaction'\n): Promise<void> {\n const customInteractionTypeIdentifiers: string[] = [];\n const portableCustomInteractions = xmlFragment.querySelectorAll(selector);\n\n // Avoid fetching module resolution configs for items that do not contain any PCIs.\n // This prevents unnecessary network requests when configurePci() is called for every item.\n if (portableCustomInteractions.length === 0) {\n return;\n }\n\n // Lazily load (and cache) the default module resolution configs.\n let moduleResolutionConfig: ModuleResolutionConfig | null = null;\n let moduleResolutionFallbackConfig: ModuleResolutionConfig | null = null;\n const ensureDefaultModuleResolutionConfigs = async () => {\n if (moduleResolutionConfig === null) {\n try {\n moduleResolutionConfig = await getModuleResolutionConfig(baseUrl, '/modules/module_resolution.js');\n } catch {\n moduleResolutionConfig = null;\n }\n }\n if (moduleResolutionFallbackConfig === null) {\n try {\n moduleResolutionFallbackConfig = await getModuleResolutionConfig(\n baseUrl,\n '/modules/fallback_module_resolution.js'\n );\n } catch {\n moduleResolutionFallbackConfig = null;\n }\n }\n };\n\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 (customInteractionTypeIdentifier && customInteractionTypeIdentifiers.includes(customInteractionTypeIdentifier)) {\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 await ensureDefaultModuleResolutionConfigs();\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 await ensureDefaultModuleResolutionConfigs();\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","// Function to extend elements with a specific tag name by adding an extension suffix\n// Uses localName matching to handle namespaced XML documents where querySelectorAll may not work\nexport function extendElementName(xmlFragment: XMLDocument, tagName: string, extension: string) {\n // Use getElementsByTagName with '*' to find all elements, then filter by localName\n // This works correctly for both namespaced and non-namespaced XML documents\n const allElements = Array.from(xmlFragment.getElementsByTagName('*'));\n const matchingElements = allElements.filter(\n element => element.localName === tagName || element.localName?.toLowerCase() === tagName.toLowerCase()\n );\n\n matchingElements.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: Element, newTagName: string) {\n // create Elements on the ownerDocument which is usually the XMLDocument\n const newElement = element.ownerDocument.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","export function pciHooks(xmlFragment: XMLDocument, uri: string): void {\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('module', documentPath + '/' + encodeURI(srcValue + (srcValue.endsWith('.js') ? '' : '.js')));\n }\n });\n }\n}\n","export interface SeededRandomSource {\n random(): number;\n}\n\n/**\n * Small, dependency-free seeded PRNG used for deterministic QTI shuffling\n * (sections and interactions). It intentionally exposes a `random()` method,\n * matching the TC39 seeded-random proposal shape so this can be swapped when a\n * standard implementation is available.\n *\n * xmur3-style seed hashing feeds mulberry32 (fast 32-bit generator).\n */\nexport class SeededRandom implements SeededRandomSource {\n #state: number;\n\n constructor(seed: Uint8Array) {\n if (!(seed instanceof Uint8Array)) {\n throw new TypeError('SeededRandom seed must be a Uint8Array.');\n }\n if (seed.length > 32) {\n throw new RangeError('SeededRandom seed must be 32 bytes or less.');\n }\n\n const paddedSeed = new Uint8Array(32);\n paddedSeed.set(seed, 32 - seed.length);\n this.#state = hashBytes(paddedSeed);\n }\n\n static fromSeed(seed: Uint8Array): SeededRandom {\n if (seed.length !== 32) {\n throw new RangeError('SeededRandom.fromSeed requires a 32-byte seed.');\n }\n return new SeededRandom(seed);\n }\n\n static fromFixed(byte: number): SeededRandom {\n if (typeof byte !== 'number') {\n throw new TypeError('SeededRandom.fromFixed requires a number.');\n }\n if (!Number.isInteger(byte) || byte < 0 || byte > 255) {\n throw new RangeError('SeededRandom.fromFixed requires an integer from 0 to 255.');\n }\n\n const seed = new Uint8Array(32);\n seed[31] = byte;\n return new SeededRandom(seed);\n }\n\n static fromSeedKey(seedKey: string | number): SeededRandom {\n const random = new SeededRandom(new Uint8Array());\n random.#state = hashString(`${seedKey}`);\n return random;\n }\n\n random(): number {\n this.#state |= 0;\n this.#state = (this.#state + 0x6d2b79f5) | 0;\n let t = Math.imul(this.#state ^ (this.#state >>> 15), 1 | this.#state);\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n }\n}\n\nexport function createSeededRandom(seedKey: string | number): SeededRandomSource {\n return SeededRandom.fromSeedKey(seedKey);\n}\n\nfunction hashString(seedKey: string): number {\n let h = 1779033703 ^ seedKey.length;\n for (let i = 0; i < seedKey.length; i++) {\n h = Math.imul(h ^ seedKey.charCodeAt(i), 3432918353);\n h = (h << 13) | (h >>> 19);\n }\n return finalizeHash(h);\n}\n\nfunction hashBytes(seed: Uint8Array): number {\n let h = 1779033703 ^ seed.length;\n for (let i = 0; i < seed.length; i++) {\n h = Math.imul(h ^ seed[i], 3432918353);\n h = (h << 13) | (h >>> 19);\n }\n return finalizeHash(h);\n}\n\nfunction finalizeHash(hash: number): number {\n let h = Math.imul(hash ^ (hash >>> 16), 2246822507);\n h = Math.imul(h ^ (h >>> 13), 3266489909);\n return (h ^ (h >>> 16)) >>> 0;\n}\n","import type { SeededRandomSource } from './prng';\n\nexport type RandomSource = SeededRandomSource | (() => number);\n\nconst randomValue = (source: RandomSource): number => (typeof source === 'function' ? source() : source.random());\n\n/**\n * Fisher-Yates over non-fixed units only. Fixed units keep their authored slot\n * index while movable units are shuffled into the remaining slots.\n */\nexport function shuffleKeepingFixed<T extends { fixed: boolean }>(units: T[], random: RandomSource): T[] {\n const movable = units.filter(unit => !unit.fixed);\n\n for (let i = movable.length - 1; i > 0; i--) {\n const j = Math.floor(randomValue(random) * (i + 1));\n [movable[i], movable[j]] = [movable[j], movable[i]];\n }\n\n let movableIndex = 0;\n return units.map(unit => (unit.fixed ? unit : movable[movableIndex++]));\n}\n","import { createSeededRandom } from '../shared/prng';\nimport { shuffleKeepingFixed } from '../shared/shuffle';\n\nfunction getShuffleQuerySelectorByTagName(tagName: string): string | string[] | null {\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 return null;\n }\n}\n\n/**\n * Shuffles the choices inside every interaction marked `shuffle=\"true\"`. When\n * `seed` is supplied, shuffling is deterministic and reproducible across\n * reloads; each interaction/group draws its own stream so they are independent\n * and stable even if siblings change. When `seed` is null/undefined, falls back\n * to Math.random.\n */\nexport function shuffleInteractions(xmlFragment: XMLDocument, seed?: string | number | null): void {\n const shuffleElements = xmlFragment.querySelectorAll(`[shuffle=\"true\"]`);\n const shuffleInteractions = Array.from(shuffleElements).filter(e =>\n e.tagName?.toLowerCase().endsWith('-interaction')\n );\n\n const seeded = seed != null && `${seed}`.length > 0;\n const itemId = xmlFragment.querySelector?.('qti-assessment-item')?.getAttribute('identifier') ?? '';\n\n let interactionIndex = 0;\n for (const shuffleInteraction of shuffleInteractions) {\n const responseId = shuffleInteraction.getAttribute('response-identifier') ?? `${interactionIndex}`;\n interactionIndex++;\n const query = getShuffleQuerySelectorByTagName(shuffleInteraction.tagName.toLowerCase());\n const queries = Array.isArray(query) ? query : [query];\n let shuffledAny = false;\n\n let queryIndex = 0;\n for (const q of queries) {\n if (!q) continue;\n const random = seeded ? createSeededRandom(`${seed}:${itemId}:${responseId}:${queryIndex}`) : Math.random;\n queryIndex++;\n const choices = (Array.from(shuffleInteraction.querySelectorAll(q)) as HTMLElement[]).filter(\n choice => choice.parentElement !== null\n );\n\n if (choices.filter(choice => choice.getAttribute('fixed') !== 'true').length <= 1) {\n console.warn('Shuffling is not possible with fewer than 2 non-fixed elements.');\n continue;\n }\n\n const parent = choices[0].parentElement;\n if (!parent || choices.some(choice => choice.parentElement !== parent)) {\n console.warn('Shuffling is not possible when choices do not share the same parent element.');\n continue;\n }\n\n const anchor = choices[choices.length - 1].nextSibling;\n const orderedChoices = shuffleKeepingFixed(\n choices.map(choice => ({\n element: choice,\n fixed: choice.getAttribute('fixed') === 'true'\n })),\n random\n );\n\n for (const choice of choices) {\n choice.remove();\n }\n for (const { element } of orderedChoices) {\n parent.insertBefore(element, anchor);\n }\n\n shuffledAny = true;\n }\n\n if (shuffledAny) {\n shuffleInteraction.removeAttribute('shuffle');\n }\n }\n}\n","export function stripStyleSheets(xmlFragment: DocumentFragment) {\n // remove qti-stylesheet tag\n xmlFragment.querySelectorAll('qti-stylesheet').forEach(stylesheet => stylesheet.remove());\n}\n","export function loadXML(url: string, signal?: AbortSignal): Promise<XMLDocument | null> {\n return fetch(url, { signal })\n .then(response => {\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n return response.text();\n })\n .then(text => {\n const parser = new DOMParser();\n return parser.parseFromString(text, 'text/xml');\n })\n .catch(error => {\n if (error.name === 'AbortError') {\n throw error;\n }\n throw new Error(`Failed to load XML: ${error.message}`);\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\n// Function to strip unsupported namespaces (qti) from the nodes sent to the browser\nfunction stripNamespaces(node: Node, doc: Document): Node {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const el = node as Element;\n let newEl: Element;\n\n if (\n !el.namespaceURI ||\n el.namespaceURI.startsWith('http://www.imsglobal.org/xsd/qti/') ||\n el.namespaceURI.startsWith('http://www.imsglobal.org/xsd/imsqti')\n ) {\n newEl = doc.createElement(el.localName);\n } else {\n newEl = doc.createElementNS(el.namespaceURI, el.tagName);\n }\n\n for (let i = 0; i < el.attributes.length; i++) {\n const attr = el.attributes[i];\n newEl.setAttribute(attr.localName, attr.value);\n }\n for (let i = 0; i < el.childNodes.length; i++) {\n newEl.appendChild(stripNamespaces(el.childNodes[i], doc));\n }\n return newEl;\n }\n return node.cloneNode(false);\n}\n\nexport function toHTML(xmlFragment: Document): DocumentFragment {\n const fragment = document.createDocumentFragment();\n for (let i = 0; i < xmlFragment.childNodes.length; i++) {\n fragment.appendChild(stripNamespaces(xmlFragment.childNodes[i], document));\n }\n return fragment;\n}\n\n// Updates src and href attributes with the base location\n// Uses querySelectorAll('*') to find all elements, then checks attributes manually\n// This handles namespaced XML documents where attribute selectors like [href] may not work\n// Note: primary-path is NOT processed here because it is resolved separately\n// by the PCI component using data-base-url in the iframe's module resolution\nexport function setLocation(xmlFragment: DocumentFragment, location: string) {\n if (!location.endsWith('/')) {\n location += '/';\n }\n\n // querySelectorAll('*') finds all descendant elements regardless of namespace\n const allElements = xmlFragment.querySelectorAll('*');\n\n allElements.forEach(el => {\n // Check each attribute we care about\n // src, srcset and poster are URLDType or xs:anyURI everywhere they're used, so we care about them\n // Note: primary-path is excluded - PCI handles module path resolution via data-base-url\n for (const attr of ['src', 'href', 'srcset', 'poster'] as const) {\n const attrValue = el.getAttribute(attr)?.trim();\n\n if (attrValue && !/^(data:|https?:|blob:)/.test(attrValue)) {\n const newValue = location + encodeURI(attrValue);\n el.setAttribute(attr, newValue);\n }\n }\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 { convertCDATAtoComment } from './item/cdata';\nimport { configurePci, type ModuleResolutionConfig } from './item/configure-pci';\nimport { extendElementName, extendElementsWithClass } from './item/extend';\nimport { pciHooks } from './item/pci-hooks';\nimport { shuffleInteractions } from './item/shuffle-interactions';\nimport { stripStyleSheets } from './item/stylesheets';\nimport { loadXML, parseXML, setLocation, toHTML } from './shared/xml';\n\nexport type { ModuleResolutionConfig };\n\nexport type transformItemApi = {\n load: (uri: string, signal?: AbortSignal) => 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 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: (seed?: string | number | null) => 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 let xmlUri = '';\n\n const api: transformItemApi = {\n load(uri: string, signal?: AbortSignal) {\n xmlUri = uri;\n return loadXML(uri, signal).then(xml => {\n xmlFragment = xml;\n return api;\n });\n },\n parse(xmlString: string): typeof api {\n xmlFragment = parseXML(xmlString);\n xmlUri = '';\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 pciHooks(xmlFragment, uri);\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 await configurePci(xmlFragment, baseUrl, getModuleResolutionConfig, selector);\n return api;\n },\n shuffleInteractions(seed?: string | number | null): typeof api {\n const normalizedSeed = typeof seed === 'string' ? seed.trim() : seed;\n\n if (normalizedSeed === null || normalizedSeed === undefined || normalizedSeed === '') {\n const fallbackSeed = xmlUri || 'default-item-seed';\n console.warn(\n `[qtiTransformItem] No QTI_CONTEXT.seed provided; using \"${fallbackSeed}\" as deterministic fallback seed.`\n );\n shuffleInteractions(xmlFragment, fallbackSeed);\n return api;\n }\n\n shuffleInteractions(xmlFragment, normalizedSeed);\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 './shared/xml';\n\nexport const qtiTransformManifest = (): {\n load: (uri: string, signal?: AbortSignal) => Promise<typeof api>;\n assessmentTest: () => { href: string; identifier: string };\n} => {\n let xmlFragment: XMLDocument;\n\n const api = {\n async load(uri: string, signal: AbortSignal) {\n return new Promise<typeof api>(resolve => {\n loadXML(uri, signal).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","export 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","import { createSeededRandom } from '../shared/prng';\nimport { shuffleKeepingFixed } from '../shared/shuffle';\n\nconst isLocal = (el: Element, ...names: string[]): boolean =>\n names.includes(el.localName) || names.includes(el.localName?.toLowerCase?.());\n\nconst isItemRef = (el: Element): boolean => isLocal(el, 'qti-assessment-item-ref', 'assessmentitemref');\n\nconst isSection = (el: Element): boolean => isLocal(el, 'qti-assessment-section', 'assessmentsection');\n\nconst attrIsTrue = (el: Element, ...names: string[]): boolean =>\n names.some(n => {\n const v = (el.getAttribute(n) ?? '').trim().toLowerCase();\n return v === 'true' || v === '1';\n });\n\nconst shuffleOrderingElements = (section: Element): Element[] =>\n Array.from(section.children).filter(\n child => isLocal(child, 'qti-ordering', 'ordering') && attrIsTrue(child, 'shuffle')\n );\n\nconst rngFor = (seed: string | number, key: string) => createSeededRandom(`${seed}:${key}`);\n\n/** A movable unit in a section: one or more sibling nodes that move together. */\ntype Unit = { nodes: Element[]; fixed: boolean };\n\n/**\n * Seed-deterministic QTI section shuffling.\n *\n * Reorders the children of every <qti-assessment-section> that carries a\n * <qti-ordering shuffle=\"true\">, following QTI 3.0 selection/ordering rules:\n *\n * - Depth-first: a child section orders its own children before the parent\n * reorders it.\n * - Item refs with fixed=\"true\" stay in their authored position; the other\n * units shuffle around them.\n * - A child section with keep-together=\"true\" OR visible=\"true\" moves as a\n * single block (its items stay grouped and internally ordered).\n * - A child section with keep-together=\"false\" AND visible=\"false\" is\n * dissolved: its (already internally ordered) item refs are poured into the\n * parent pool and interleaved with the parent's own units.\n *\n * The same `seed` always produces the same order, so a restarted session keeps\n * its sequence. Each section draws from its own PRNG stream (seed + section id)\n * so sibling sections are independent and stable.\n */\nfunction orderSection(section: Element, seed: string | number): void {\n // Depth-first: let every child section order itself first.\n for (const child of Array.from(section.children)) {\n if (isSection(child)) {\n orderSection(child, seed);\n }\n }\n\n const orderingEls = shuffleOrderingElements(section);\n if (orderingEls.length === 0) {\n return;\n }\n\n // Build the pool of movable units in document order. Config/structural\n // children (qti-ordering, qti-selection, rubric-block, …) are left in place.\n const units: Unit[] = [];\n const toDetach: Element[] = [];\n\n for (const child of Array.from(section.children)) {\n if (isItemRef(child)) {\n units.push({ nodes: [child], fixed: attrIsTrue(child, 'fixed') });\n toDetach.push(child);\n } else if (isSection(child)) {\n const asBlock = attrIsTrue(child, 'keep-together', 'keeptogether') || attrIsTrue(child, 'visible');\n if (asBlock) {\n // Stays grouped, internal order already applied by recursion.\n units.push({ nodes: [child], fixed: attrIsTrue(child, 'fixed') });\n toDetach.push(child);\n } else {\n // Dissolve: promote its ordered selectable children as individual units.\n for (const inner of Array.from(child.children)) {\n if (isItemRef(inner) || isSection(inner)) {\n units.push({ nodes: [inner], fixed: attrIsTrue(inner, 'fixed') });\n }\n }\n toDetach.push(child); // the wrapper section disappears\n }\n }\n }\n\n if (units.length <= 1) {\n for (const orderingEl of orderingEls) {\n orderingEl.remove();\n }\n return;\n }\n\n const sectionKey = section.getAttribute('identifier') ?? '';\n const ordered = shuffleKeepingFixed(units, rngFor(seed, sectionKey));\n\n // Detach movable nodes (and dissolved wrappers) from the DOM, then re-append\n // the reordered units after whatever config children remain.\n for (const el of toDetach) {\n el.remove();\n }\n for (const unit of ordered) {\n for (const node of unit.nodes) {\n section.appendChild(node);\n }\n }\n\n // Ordering directives are consumed by this transform step.\n for (const orderingEl of orderingEls) {\n orderingEl.remove();\n }\n}\n\n/**\n * Mutates `doc` in place: shuffles every section flagged with\n * <qti-ordering shuffle=\"true\">, deterministically from `seed`.\n */\nexport function shuffleSectionsOrdering(doc: XMLDocument, seed: string | number): void {\n const sections = Array.from(doc.getElementsByTagName('*')).filter(el => isSection(el));\n // Kick off recursion only for top-level sections; orderSection handles nesting\n // depth-first, so descendants are not double-processed.\n for (const section of sections) {\n const parent = section.parentElement;\n if (!parent || !isSection(parent)) {\n orderSection(section, seed);\n }\n }\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 { loadXML, parseXML, setLocation, toHTML } from './shared/xml';\nimport { itemsFromTest } from './test/items';\nimport { shuffleSectionsOrdering } from './test/shuffle-sections';\n\nexport type transformTestApi = {\n load: (uri: string, signal?: AbortSignal) => Promise<transformTestApi>;\n parse: (xmlString: string) => transformTestApi;\n path: (location: string) => transformTestApi;\n fn: (fn: (xmlFragment: XMLDocument) => void) => transformTestApi;\n /**\n * Deterministically shuffle the children of every section that carries a\n * <qti-ordering shuffle=\"true\">, honoring fixed items and nested\n * keep-together / visible rules. The same seed reproduces the same order.\n */\n shuffleOrdering: (seed?: string | number | null) => 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 let xmlUri = '';\n\n const api: transformTestApi = {\n async load(uri, signal) {\n return new Promise<transformTestApi>((resolve, _) => {\n loadXML(uri, signal).then(xml => {\n xmlFragment = xml;\n xmlUri = uri;\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 xmlUri = '';\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 shuffleOrdering(seed?: string | number | null) {\n const normalizedSeed = typeof seed === 'string' ? seed.trim() : seed;\n\n if (normalizedSeed === null || normalizedSeed === undefined || normalizedSeed === '') {\n const fallbackSeed = xmlUri || 'default-test-seed';\n console.warn(\n `[qtiTransformTest] No QTI_CONTEXT.seed provided; using \"${fallbackSeed}\" as deterministic fallback seed.`\n );\n shuffleSectionsOrdering(xmlFragment, fallbackSeed);\n return api;\n }\n\n shuffleSectionsOrdering(xmlFragment, normalizedSeed);\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":["fallbackPath","path","shuffleInteractions"]}
|
|
@@ -175,6 +175,9 @@ var itemContextVariables = [
|
|
|
175
175
|
var itemContext = n(/* @__PURE__ */ Symbol("item"));
|
|
176
176
|
|
|
177
177
|
// ../qti-base/src/context/qti.context.ts
|
|
178
|
+
var SEED_PATTERN = /^[A-Za-z0-9-]+$/;
|
|
179
|
+
var isSeed = (value) => typeof value === "string" && SEED_PATTERN.test(value);
|
|
180
|
+
var asSeed = (value) => isSeed(value) ? value : void 0;
|
|
178
181
|
var qtiContext = n(/* @__PURE__ */ Symbol("qtiContext"));
|
|
179
182
|
|
|
180
183
|
// ../qti-base/src/context/session.context.ts
|
|
@@ -2298,6 +2301,8 @@ export {
|
|
|
2298
2301
|
configContext,
|
|
2299
2302
|
itemContextVariables,
|
|
2300
2303
|
itemContext,
|
|
2304
|
+
isSeed,
|
|
2305
|
+
asSeed,
|
|
2301
2306
|
qtiContext,
|
|
2302
2307
|
INITIAL_SESSION_CONTEXT,
|
|
2303
2308
|
sessionContext,
|
|
@@ -2411,4 +2416,4 @@ lit-html/node/directive-helpers.js:
|
|
|
2411
2416
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
2412
2417
|
*)
|
|
2413
2418
|
*/
|
|
2414
|
-
//# sourceMappingURL=chunk-
|
|
2419
|
+
//# sourceMappingURL=chunk-3XV26R5M.js.map
|