@qti-components/processing 1.3.2 → 1.3.4
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/dist/components/index.d.ts +18 -0
- package/dist/components/index.js +18 -0
- package/dist/components/index.js.map +1 -1
- package/dist/components/qti-and/qti-and.d.ts +8 -0
- package/dist/components/qti-and/qti-and.js +10 -13
- package/dist/components/qti-and/qti-and.js.map +1 -1
- package/dist/components/qti-any-n/qti-any-n.d.ts +15 -0
- package/dist/components/qti-any-n/qti-any-n.js +60 -0
- package/dist/components/qti-any-n/qti-any-n.js.map +1 -0
- package/dist/components/qti-basevalue/qti-basevalue.js +0 -1
- package/dist/components/qti-basevalue/qti-basevalue.js.map +1 -1
- package/dist/components/qti-container-size/qti-container-size.d.ts +5 -5
- package/dist/components/qti-container-size/qti-container-size.js +5 -6
- package/dist/components/qti-container-size/qti-container-size.js.map +1 -1
- package/dist/components/qti-contains/qti-contains.js +0 -1
- package/dist/components/qti-contains/qti-contains.js.map +1 -1
- package/dist/components/qti-correct/qti-correct.d.ts +8 -0
- package/dist/components/qti-correct/qti-correct.js +8 -1
- package/dist/components/qti-correct/qti-correct.js.map +1 -1
- package/dist/components/qti-default/qti-default.d.ts +5 -5
- package/dist/components/qti-default/qti-default.js +5 -6
- package/dist/components/qti-default/qti-default.js.map +1 -1
- package/dist/components/qti-delete/qti-delete.d.ts +8 -0
- package/dist/components/qti-delete/qti-delete.js +8 -1
- package/dist/components/qti-delete/qti-delete.js.map +1 -1
- package/dist/components/qti-divide/qti-divide.d.ts +13 -0
- package/dist/components/qti-divide/qti-divide.js +49 -0
- package/dist/components/qti-divide/qti-divide.js.map +1 -0
- package/dist/components/qti-duration-gte/qti-duration-gte.d.ts +5 -0
- package/dist/components/qti-duration-gte/qti-duration-gte.js +44 -0
- package/dist/components/qti-duration-gte/qti-duration-gte.js.map +1 -0
- package/dist/components/qti-duration-lt/qti-duration-lt.d.ts +13 -0
- package/dist/components/qti-duration-lt/qti-duration-lt.js +52 -0
- package/dist/components/qti-duration-lt/qti-duration-lt.js.map +1 -0
- package/dist/components/qti-equal/qti-equal.d.ts +9 -0
- package/dist/components/qti-equal/qti-equal.js +15 -1
- package/dist/components/qti-equal/qti-equal.js.map +1 -1
- package/dist/components/qti-equal-rounded/qti-equal-rounded.d.ts +9 -0
- package/dist/components/qti-equal-rounded/qti-equal-rounded.js +9 -1
- package/dist/components/qti-equal-rounded/qti-equal-rounded.js.map +1 -1
- package/dist/components/qti-field-value/qti-field-value.d.ts +8 -0
- package/dist/components/qti-field-value/qti-field-value.js +8 -1
- package/dist/components/qti-field-value/qti-field-value.js.map +1 -1
- package/dist/components/qti-gcd/qti.gcd.js +0 -1
- package/dist/components/qti-gcd/qti.gcd.js.map +1 -1
- package/dist/components/qti-gt/qti-gt.js +0 -1
- package/dist/components/qti-gt/qti-gt.js.map +1 -1
- package/dist/components/qti-gte/qti-gte.js +0 -1
- package/dist/components/qti-gte/qti-gte.js.map +1 -1
- package/dist/components/qti-index/qti-index.d.ts +8 -0
- package/dist/components/qti-index/qti-index.js +11 -7
- package/dist/components/qti-index/qti-index.js.map +1 -1
- package/dist/components/qti-inside/qti-inside.d.ts +7 -0
- package/dist/components/qti-inside/qti-inside.js +139 -0
- package/dist/components/qti-inside/qti-inside.js.map +1 -0
- package/dist/components/qti-integer-divide/qti-integer-divide.d.ts +13 -0
- package/dist/components/qti-integer-divide/qti-integer-divide.js +47 -0
- package/dist/components/qti-integer-divide/qti-integer-divide.js.map +1 -0
- package/dist/components/qti-integer-modulus/qti-integer-modulus.d.ts +13 -0
- package/dist/components/qti-integer-modulus/qti-integer-modulus.js +47 -0
- package/dist/components/qti-integer-modulus/qti-integer-modulus.js.map +1 -0
- package/dist/components/qti-integer-to-float/qti-integer-to-float.d.ts +12 -0
- package/dist/components/qti-integer-to-float/qti-integer-to-float.js +37 -0
- package/dist/components/qti-integer-to-float/qti-integer-to-float.js.map +1 -0
- package/dist/components/qti-is-null/qti-is-null.d.ts +8 -0
- package/dist/components/qti-is-null/qti-is-null.js +8 -3
- package/dist/components/qti-is-null/qti-is-null.js.map +1 -1
- package/dist/components/qti-lcm/qti-lcm.d.ts +5 -0
- package/dist/components/qti-lcm/qti-lcm.js +70 -0
- package/dist/components/qti-lcm/qti-lcm.js.map +1 -0
- package/dist/components/qti-lookup-outcome-value/qti-lookup-outcome-value.js +0 -1
- package/dist/components/qti-lookup-outcome-value/qti-lookup-outcome-value.js.map +1 -1
- package/dist/components/qti-lt/qti-lt.js +0 -1
- package/dist/components/qti-lt/qti-lt.js.map +1 -1
- package/dist/components/qti-lte/qti-lte.js +0 -1
- package/dist/components/qti-lte/qti-lte.js.map +1 -1
- package/dist/components/qti-map-response/qti-map-response.d.ts +8 -0
- package/dist/components/qti-map-response/qti-map-response.js +8 -1
- package/dist/components/qti-map-response/qti-map-response.js.map +1 -1
- package/dist/components/qti-map-response-point/qti-map-response-point.js +0 -1
- package/dist/components/qti-map-response-point/qti-map-response-point.js.map +1 -1
- package/dist/components/qti-match/qti-match.d.ts +8 -0
- package/dist/components/qti-match/qti-match.js +8 -1
- package/dist/components/qti-match/qti-match.js.map +1 -1
- package/dist/components/qti-math-operator/qti-math-operator.js +0 -1
- package/dist/components/qti-math-operator/qti-math-operator.js.map +1 -1
- package/dist/components/qti-max/qti-max.d.ts +13 -0
- package/dist/components/qti-max/qti-max.js +45 -0
- package/dist/components/qti-max/qti-max.js.map +1 -0
- package/dist/components/qti-member/qti-member.js +0 -1
- package/dist/components/qti-member/qti-member.js.map +1 -1
- package/dist/components/qti-min/qti-min.d.ts +13 -0
- package/dist/components/qti-min/qti-min.js +45 -0
- package/dist/components/qti-min/qti-min.js.map +1 -0
- package/dist/components/qti-multiple/qti-multiple.js +0 -1
- package/dist/components/qti-multiple/qti-multiple.js.map +1 -1
- package/dist/components/qti-not/qti-not.d.ts +8 -0
- package/dist/components/qti-not/qti-not.js +8 -1
- package/dist/components/qti-not/qti-not.js.map +1 -1
- package/dist/components/qti-null/qti-null.js +0 -1
- package/dist/components/qti-null/qti-null.js.map +1 -1
- package/dist/components/qti-or/qti-or.d.ts +8 -0
- package/dist/components/qti-or/qti-or.js +8 -1
- package/dist/components/qti-or/qti-or.js.map +1 -1
- package/dist/components/qti-ordered/qti-ordered.js +0 -1
- package/dist/components/qti-ordered/qti-ordered.js.map +1 -1
- package/dist/components/qti-pattern-match/qti-pattern-match.d.ts +13 -0
- package/dist/components/qti-pattern-match/qti-pattern-match.js +52 -0
- package/dist/components/qti-pattern-match/qti-pattern-match.js.map +1 -0
- package/dist/components/qti-power/qti-power.js +0 -1
- package/dist/components/qti-power/qti-power.js.map +1 -1
- package/dist/components/qti-printed-variable/qti-printed-variable.js +0 -1
- package/dist/components/qti-printed-variable/qti-printed-variable.js.map +1 -1
- package/dist/components/qti-product/qti-product.d.ts +8 -0
- package/dist/components/qti-product/qti-product.js +8 -1
- package/dist/components/qti-product/qti-product.js.map +1 -1
- package/dist/components/qti-random/qti-random.js +0 -1
- package/dist/components/qti-random/qti-random.js.map +1 -1
- package/dist/components/qti-random-integer/qti-random-integer.js +0 -1
- package/dist/components/qti-random-integer/qti-random-integer.js.map +1 -1
- package/dist/components/qti-repeat/qti-repeat.d.ts +15 -0
- package/dist/components/qti-repeat/qti-repeat.js +112 -0
- package/dist/components/qti-repeat/qti-repeat.js.map +1 -0
- package/dist/components/qti-response-condition/qti-response-condition.js +0 -1
- package/dist/components/qti-response-condition/qti-response-condition.js.map +1 -1
- package/dist/components/qti-response-else/qti-response-else.js +0 -1
- package/dist/components/qti-response-else/qti-response-else.js.map +1 -1
- package/dist/components/qti-response-else-if/qti-response-else-if.js +0 -1
- package/dist/components/qti-response-else-if/qti-response-else-if.js.map +1 -1
- package/dist/components/qti-response-if/qti-response-if.js +0 -1
- package/dist/components/qti-response-if/qti-response-if.js.map +1 -1
- package/dist/components/qti-round/qti-round.d.ts +4 -5
- package/dist/components/qti-round/qti-round.js +4 -6
- package/dist/components/qti-round/qti-round.js.map +1 -1
- package/dist/components/qti-round-to/qti-round-to.js +0 -1
- package/dist/components/qti-round-to/qti-round-to.js.map +1 -1
- package/dist/components/qti-rule/qti-rule.js +2 -13
- package/dist/components/qti-rule/qti-rule.js.map +1 -1
- package/dist/components/qti-set-correct-response/qti-set-correct-response.d.ts +24 -0
- package/dist/components/qti-set-correct-response/qti-set-correct-response.js +76 -0
- package/dist/components/qti-set-correct-response/qti-set-correct-response.js.map +1 -0
- package/dist/components/qti-set-outcome-value/qti-set-outcome-value.js +0 -1
- package/dist/components/qti-set-outcome-value/qti-set-outcome-value.js.map +1 -1
- package/dist/components/qti-set-template-value/qti-set-template-value.d.ts +24 -0
- package/dist/components/qti-set-template-value/qti-set-template-value.js +80 -0
- package/dist/components/qti-set-template-value/qti-set-template-value.js.map +1 -0
- package/dist/components/qti-stats-operator/qti-stats-operator.d.ts +15 -0
- package/dist/components/qti-stats-operator/qti-stats-operator.js +77 -0
- package/dist/components/qti-stats-operator/qti-stats-operator.js.map +1 -0
- package/dist/components/qti-string-match/qti-string-match.js +0 -1
- package/dist/components/qti-string-match/qti-string-match.js.map +1 -1
- package/dist/components/qti-substring/qti-substring.d.ts +13 -0
- package/dist/components/qti-substring/qti-substring.js +53 -0
- package/dist/components/qti-substring/qti-substring.js.map +1 -0
- package/dist/components/qti-subtract/index.d.ts +1 -1
- package/dist/components/qti-subtract/index.js +0 -2
- package/dist/components/qti-subtract/index.js.map +1 -1
- package/dist/components/qti-subtract/qti-subtract.d.ts +8 -0
- package/dist/components/qti-subtract/qti-subtract.js +8 -0
- package/dist/components/qti-subtract/qti-subtract.js.map +1 -1
- package/dist/components/qti-sum/qti-sum.d.ts +8 -0
- package/dist/components/qti-sum/qti-sum.js +8 -1
- package/dist/components/qti-sum/qti-sum.js.map +1 -1
- package/dist/components/qti-truncate/qti-truncate.d.ts +12 -0
- package/dist/components/qti-truncate/qti-truncate.js +37 -0
- package/dist/components/qti-truncate/qti-truncate.js.map +1 -0
- package/dist/components/qti-variable/qti-variable.js +0 -1
- package/dist/components/qti-variable/qti-variable.js.map +1 -1
- package/dist/elements.d.ts +254 -0
- package/dist/elements.js +130 -0
- package/dist/elements.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/register.d.ts +1 -0
- package/dist/register.js +7 -0
- package/dist/register.js.map +1 -0
- package/package.json +18 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qti-divide.js","sourceRoot":"","sources":["../../../src/components/qti-divide/qti-divide.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAIrD;;;;;;;GAOG;AACH,MAAM,OAAO,SAAU,SAAQ,aAA4B;IACzC,SAAS;QACvB,MAAM,MAAM,GAAG,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,YAAY,EAAwB,CAAC,CAAC;QACrF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;YAC9D,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;YACpB,OAAO,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;YAC7C,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAC/B,CAAC;IAED,qBAAqB,CAAC,SAA6B;QACjD,MAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,SAAS;YACX,CAAC;YAED,MAAM,SAAS,GAAG,CAAC,GAAY,EAAE,EAAE;gBACjC,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;oBACtC,OAAO;gBACT,CAAC;gBACD,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAC5C,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC3B,OAAO,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;oBAC1D,OAAO;gBACT,CAAC;gBACD,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACxB,CAAC,CAAC;YAEF,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBAClC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;gBAChD,SAAS;YACX,CAAC;YAED,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;CACF","sourcesContent":["import { QtiExpression } from '@qti-components/base';\n\nimport type { ResponseVariable } from '@qti-components/base';\n\n/**\n * @summary The qti-divide operator performs numerical division.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/info/index.html#divide\n *\n * Takes exactly 2 sub-expressions with numerical base-types and single cardinality.\n * Returns a single float representing (first / second).\n * Special cases: Returns NULL if either sub-expression is NULL or if divisor is 0.\n */\nexport class QtiDivide extends QtiExpression<number | null> {\n public override getResult(): number | null {\n const values = this.#collectNumericValues(this.getVariables() as ResponseVariable[]);\n if (values.length !== 2) {\n console.warn('qti-divide: expected exactly 2 numeric values');\n return null;\n }\n\n if (values[1] === 0) {\n console.warn('qti-divide: division by zero');\n return null;\n }\n\n return values[0] / values[1];\n }\n\n #collectNumericValues(variables: ResponseVariable[]): number[] {\n const values: number[] = [];\n\n for (const variable of variables) {\n if (!variable) {\n continue;\n }\n\n const pushValue = (raw: unknown) => {\n if (raw === null || raw === undefined) {\n return;\n }\n const numValue = parseFloat(raw.toString());\n if (Number.isNaN(numValue)) {\n console.warn('qti-divide: non-numeric value encountered');\n return;\n }\n values.push(numValue);\n };\n\n if (Array.isArray(variable.value)) {\n variable.value.forEach(item => pushValue(item));\n continue;\n }\n\n pushValue(variable.value);\n }\n\n return values;\n }\n}\n"]}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { QtiExpression } from '@qti-components/base';
|
|
2
|
+
export class QtiDurationGte extends QtiExpression {
|
|
3
|
+
getResult() {
|
|
4
|
+
const values = this.#getDurationValues();
|
|
5
|
+
if (!values) {
|
|
6
|
+
return null;
|
|
7
|
+
}
|
|
8
|
+
return values[0] >= values[1];
|
|
9
|
+
}
|
|
10
|
+
#getDurationValues() {
|
|
11
|
+
const variables = this.getVariables();
|
|
12
|
+
if (variables.length !== 2) {
|
|
13
|
+
console.error('qti-duration-gte requires exactly 2 duration expressions');
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
// TODO: Register the built-in duration variables (`duration` and `sectionId.duration`)
|
|
17
|
+
// from tracked candidate/session time-spent so these operators can resolve them implicitly.
|
|
18
|
+
const values = variables.map(variable => this.#parseDuration(variable));
|
|
19
|
+
if (values.some(value => value === null)) {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
return values;
|
|
23
|
+
}
|
|
24
|
+
#parseDuration(variable) {
|
|
25
|
+
if (variable.cardinality !== 'single' || Array.isArray(variable.value)) {
|
|
26
|
+
console.error('qti-duration-gte requires single cardinality');
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
if (variable.baseType !== 'duration') {
|
|
30
|
+
console.error('qti-duration-gte requires duration base-type');
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
if (variable.value === null || variable.value === undefined) {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
const value = Number.parseFloat(variable.value.toString());
|
|
37
|
+
if (Number.isNaN(value)) {
|
|
38
|
+
console.error(`qti-duration-gte requires duration values expressed in seconds, got "${variable.value.toString()}"`);
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
return value;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=qti-duration-gte.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qti-duration-gte.js","sourceRoot":"","sources":["../../../src/components/qti-duration-gte/qti-duration-gte.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAIrD,MAAM,OAAO,cAAe,SAAQ,aAA6B;IAC/C,SAAS;QACvB,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACzC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC;IAED,kBAAkB;QAChB,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,EAAwB,CAAC;QAE5D,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,0DAA0D,CAAC,CAAC;YAC1E,OAAO,IAAI,CAAC;QACd,CAAC;QAED,uFAAuF;QACvF,4FAA4F;QAC5F,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC;QACxE,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,EAAE,CAAC;YACzC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,MAA0B,CAAC;IACpC,CAAC;IAED,cAAc,CAAC,QAA0B;QACvC,IAAI,QAAQ,CAAC,WAAW,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACvE,OAAO,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;YAC9D,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,QAAQ,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;YACrC,OAAO,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;YAC9D,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,QAAQ,CAAC,KAAK,KAAK,IAAI,IAAI,QAAQ,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC5D,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC3D,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,KAAK,CACX,wEAAwE,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CACrG,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;CACF","sourcesContent":["import { QtiExpression } from '@qti-components/base';\n\nimport type { ResponseVariable } from '@qti-components/base';\n\nexport class QtiDurationGte extends QtiExpression<boolean | null> {\n public override getResult(): boolean | null {\n const values = this.#getDurationValues();\n if (!values) {\n return null;\n }\n\n return values[0] >= values[1];\n }\n\n #getDurationValues(): [number, number] | null {\n const variables = this.getVariables() as ResponseVariable[];\n\n if (variables.length !== 2) {\n console.error('qti-duration-gte requires exactly 2 duration expressions');\n return null;\n }\n\n // TODO: Register the built-in duration variables (`duration` and `sectionId.duration`)\n // from tracked candidate/session time-spent so these operators can resolve them implicitly.\n const values = variables.map(variable => this.#parseDuration(variable));\n if (values.some(value => value === null)) {\n return null;\n }\n\n return values as [number, number];\n }\n\n #parseDuration(variable: ResponseVariable): number | null {\n if (variable.cardinality !== 'single' || Array.isArray(variable.value)) {\n console.error('qti-duration-gte requires single cardinality');\n return null;\n }\n if (variable.baseType !== 'duration') {\n console.error('qti-duration-gte requires duration base-type');\n return null;\n }\n if (variable.value === null || variable.value === undefined) {\n return null;\n }\n\n const value = Number.parseFloat(variable.value.toString());\n if (Number.isNaN(value)) {\n console.error(\n `qti-duration-gte requires duration values expressed in seconds, got \"${variable.value.toString()}\"`\n );\n return null;\n }\n\n return value;\n }\n}\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { QtiExpression } from '@qti-components/base';
|
|
2
|
+
/**
|
|
3
|
+
* @summary The qti-duration-lt operator compares two time durations.
|
|
4
|
+
* @documentation https://www.imsglobal.org/spec/qti/v3p0/info/index.html#durationLT
|
|
5
|
+
*
|
|
6
|
+
* Takes 2 sub-expressions with base-type duration and single cardinality.
|
|
7
|
+
* Returns true if the first duration is shorter than the second.
|
|
8
|
+
* Special cases: Returns NULL if either argument is NULL; handles variable precision.
|
|
9
|
+
*/
|
|
10
|
+
export declare class QtiDurationLt extends QtiExpression<boolean | null> {
|
|
11
|
+
#private;
|
|
12
|
+
getResult(): boolean | null;
|
|
13
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { QtiExpression } from '@qti-components/base';
|
|
2
|
+
/**
|
|
3
|
+
* @summary The qti-duration-lt operator compares two time durations.
|
|
4
|
+
* @documentation https://www.imsglobal.org/spec/qti/v3p0/info/index.html#durationLT
|
|
5
|
+
*
|
|
6
|
+
* Takes 2 sub-expressions with base-type duration and single cardinality.
|
|
7
|
+
* Returns true if the first duration is shorter than the second.
|
|
8
|
+
* Special cases: Returns NULL if either argument is NULL; handles variable precision.
|
|
9
|
+
*/
|
|
10
|
+
export class QtiDurationLt extends QtiExpression {
|
|
11
|
+
getResult() {
|
|
12
|
+
const values = this.#getDurationValues();
|
|
13
|
+
if (!values) {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
return values[0] < values[1];
|
|
17
|
+
}
|
|
18
|
+
#getDurationValues() {
|
|
19
|
+
const variables = this.getVariables();
|
|
20
|
+
if (variables.length !== 2) {
|
|
21
|
+
console.error('qti-duration-lt requires exactly 2 duration expressions');
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
// TODO: Register the built-in duration variables (`duration` and `sectionId.duration`)
|
|
25
|
+
// from tracked candidate/session time-spent so these operators can resolve them implicitly.
|
|
26
|
+
const values = variables.map(variable => this.#parseDuration(variable));
|
|
27
|
+
if (values.some(value => value === null)) {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
return values;
|
|
31
|
+
}
|
|
32
|
+
#parseDuration(variable) {
|
|
33
|
+
if (variable.cardinality !== 'single' || Array.isArray(variable.value)) {
|
|
34
|
+
console.error('qti-duration-lt requires single cardinality');
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
if (variable.baseType !== 'duration') {
|
|
38
|
+
console.error('qti-duration-lt requires duration base-type');
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
if (variable.value === null || variable.value === undefined) {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
const value = Number.parseFloat(variable.value.toString());
|
|
45
|
+
if (Number.isNaN(value)) {
|
|
46
|
+
console.error(`qti-duration-lt requires duration values expressed in seconds, got "${variable.value.toString()}"`);
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
return value;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=qti-duration-lt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qti-duration-lt.js","sourceRoot":"","sources":["../../../src/components/qti-duration-lt/qti-duration-lt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAIrD;;;;;;;GAOG;AACH,MAAM,OAAO,aAAc,SAAQ,aAA6B;IAC9C,SAAS;QACvB,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACzC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAC/B,CAAC;IAED,kBAAkB;QAChB,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,EAAwB,CAAC;QAE5D,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,yDAAyD,CAAC,CAAC;YACzE,OAAO,IAAI,CAAC;QACd,CAAC;QAED,uFAAuF;QACvF,4FAA4F;QAC5F,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC;QACxE,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,EAAE,CAAC;YACzC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,MAA0B,CAAC;IACpC,CAAC;IAED,cAAc,CAAC,QAA0B;QACvC,IAAI,QAAQ,CAAC,WAAW,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACvE,OAAO,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;YAC7D,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,QAAQ,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;YACrC,OAAO,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;YAC7D,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,QAAQ,CAAC,KAAK,KAAK,IAAI,IAAI,QAAQ,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC5D,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC3D,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,KAAK,CACX,uEAAuE,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CACpG,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;CACF","sourcesContent":["import { QtiExpression } from '@qti-components/base';\n\nimport type { ResponseVariable } from '@qti-components/base';\n\n/**\n * @summary The qti-duration-lt operator compares two time durations.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/info/index.html#durationLT\n *\n * Takes 2 sub-expressions with base-type duration and single cardinality.\n * Returns true if the first duration is shorter than the second.\n * Special cases: Returns NULL if either argument is NULL; handles variable precision.\n */\nexport class QtiDurationLt extends QtiExpression<boolean | null> {\n public override getResult(): boolean | null {\n const values = this.#getDurationValues();\n if (!values) {\n return null;\n }\n\n return values[0] < values[1];\n }\n\n #getDurationValues(): [number, number] | null {\n const variables = this.getVariables() as ResponseVariable[];\n\n if (variables.length !== 2) {\n console.error('qti-duration-lt requires exactly 2 duration expressions');\n return null;\n }\n\n // TODO: Register the built-in duration variables (`duration` and `sectionId.duration`)\n // from tracked candidate/session time-spent so these operators can resolve them implicitly.\n const values = variables.map(variable => this.#parseDuration(variable));\n if (values.some(value => value === null)) {\n return null;\n }\n\n return values as [number, number];\n }\n\n #parseDuration(variable: ResponseVariable): number | null {\n if (variable.cardinality !== 'single' || Array.isArray(variable.value)) {\n console.error('qti-duration-lt requires single cardinality');\n return null;\n }\n if (variable.baseType !== 'duration') {\n console.error('qti-duration-lt requires duration base-type');\n return null;\n }\n if (variable.value === null || variable.value === undefined) {\n return null;\n }\n\n const value = Number.parseFloat(variable.value.toString());\n if (Number.isNaN(value)) {\n console.error(\n `qti-duration-lt requires duration values expressed in seconds, got \"${variable.value.toString()}\"`\n );\n return null;\n }\n\n return value;\n }\n}\n"]}
|
|
@@ -1,4 +1,13 @@
|
|
|
1
1
|
import { QtiExpression } from '@qti-components/base';
|
|
2
|
+
/**
|
|
3
|
+
* @summary The qti-equal operator checks if two numerical expressions are equal.
|
|
4
|
+
* @documentation https://www.imsglobal.org/spec/qti/v3p0/info/index.html#equal
|
|
5
|
+
*
|
|
6
|
+
* Takes 2 sub-expressions with numerical base-types and single cardinality.
|
|
7
|
+
* Supports tolerance-mode (exact, absolute, relative) for floating-point comparisons.
|
|
8
|
+
* Returns true if numerically equal within specified tolerance, false otherwise.
|
|
9
|
+
* Special cases: Returns NULL if either sub-expression is NULL.
|
|
10
|
+
*/
|
|
2
11
|
export declare class QtiEqual extends QtiExpression<boolean> {
|
|
3
12
|
toleranceMode: 'exact' | 'relative' | 'absolute';
|
|
4
13
|
getResult(): boolean;
|
|
@@ -7,6 +7,15 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
7
7
|
import { property } from 'lit/decorators.js';
|
|
8
8
|
import { QtiExpression } from '@qti-components/base';
|
|
9
9
|
import { ScoringHelper } from '@qti-components/base';
|
|
10
|
+
/**
|
|
11
|
+
* @summary The qti-equal operator checks if two numerical expressions are equal.
|
|
12
|
+
* @documentation https://www.imsglobal.org/spec/qti/v3p0/info/index.html#equal
|
|
13
|
+
*
|
|
14
|
+
* Takes 2 sub-expressions with numerical base-types and single cardinality.
|
|
15
|
+
* Supports tolerance-mode (exact, absolute, relative) for floating-point comparisons.
|
|
16
|
+
* Returns true if numerically equal within specified tolerance, false otherwise.
|
|
17
|
+
* Special cases: Returns NULL if either sub-expression is NULL.
|
|
18
|
+
*/
|
|
10
19
|
export class QtiEqual extends QtiExpression {
|
|
11
20
|
constructor() {
|
|
12
21
|
super(...arguments);
|
|
@@ -17,6 +26,9 @@ export class QtiEqual extends QtiExpression {
|
|
|
17
26
|
const values = this.getVariables();
|
|
18
27
|
const value1 = values[0];
|
|
19
28
|
const value2 = values[1];
|
|
29
|
+
if (!value1 || !value2) {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
20
32
|
if (this.toleranceMode !== 'exact') {
|
|
21
33
|
console.error('toleranceMode is not supported yet');
|
|
22
34
|
return false;
|
|
@@ -28,6 +40,9 @@ export class QtiEqual extends QtiExpression {
|
|
|
28
40
|
console.error('unexpected cardinality in qti equal');
|
|
29
41
|
return false;
|
|
30
42
|
}
|
|
43
|
+
if (value1.value === null || value2.value === null || value1.value === undefined || value2.value === undefined) {
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
31
46
|
return ScoringHelper.compareSingleValues(value1.value, value2.value, value1.baseType);
|
|
32
47
|
}
|
|
33
48
|
console.error('unexpected number of children in qti-equal');
|
|
@@ -37,5 +52,4 @@ export class QtiEqual extends QtiExpression {
|
|
|
37
52
|
__decorate([
|
|
38
53
|
property({ type: String })
|
|
39
54
|
], QtiEqual.prototype, "toleranceMode", void 0);
|
|
40
|
-
customElements.define('qti-equal', QtiEqual);
|
|
41
55
|
//# sourceMappingURL=qti-equal.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"qti-equal.js","sourceRoot":"","sources":["../../../src/components/qti-equal/qti-equal.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAIrD,MAAM,OAAO,QAAS,SAAQ,aAAsB;IAApD;;QAC8B,kBAAa,GAAsC,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"qti-equal.js","sourceRoot":"","sources":["../../../src/components/qti-equal/qti-equal.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAIrD;;;;;;;;GAQG;AACH,MAAM,OAAO,QAAS,SAAQ,aAAsB;IAApD;;QAC8B,kBAAa,GAAsC,OAAO,CAAC;IAmCzF,CAAC;IAjCiB,SAAS;QACvB,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,EAAwB,CAAC;YACzD,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACzB,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YAEzB,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;gBACvB,OAAO,IAAI,CAAC;YACd,CAAC;YAED,IAAI,IAAI,CAAC,aAAa,KAAK,OAAO,EAAE,CAAC;gBACnC,OAAO,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;gBACpD,OAAO,KAAK,CAAC;YACf,CAAC;YACD,IACE,MAAM,CAAC,WAAW,KAAK,QAAQ;gBAC/B,MAAM,CAAC,WAAW,KAAK,QAAQ;gBAC/B,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;gBAC3B,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAC3B,CAAC;gBACD,OAAO,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;gBACrD,OAAO,KAAK,CAAC;YACf,CAAC;YAED,IAAI,MAAM,CAAC,KAAK,KAAK,IAAI,IAAI,MAAM,CAAC,KAAK,KAAK,IAAI,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;gBAC/G,OAAO,IAAI,CAAC;YACd,CAAC;YAED,OAAO,aAAa,CAAC,mBAAmB,CAAC,MAAM,CAAC,KAAe,EAAE,MAAM,CAAC,KAAe,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC5G,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAC5D,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAnC6B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;+CAA4D","sourcesContent":["import { property } from 'lit/decorators.js';\n\nimport { QtiExpression } from '@qti-components/base';\nimport { ScoringHelper } from '@qti-components/base';\n\nimport type { ResponseVariable } from '@qti-components/base';\n\n/**\n * @summary The qti-equal operator checks if two numerical expressions are equal.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/info/index.html#equal\n *\n * Takes 2 sub-expressions with numerical base-types and single cardinality.\n * Supports tolerance-mode (exact, absolute, relative) for floating-point comparisons.\n * Returns true if numerically equal within specified tolerance, false otherwise.\n * Special cases: Returns NULL if either sub-expression is NULL.\n */\nexport class QtiEqual extends QtiExpression<boolean> {\n @property({ type: String }) toleranceMode: 'exact' | 'relative' | 'absolute' = 'exact';\n\n public override getResult() {\n if (this.children.length === 2) {\n const values = this.getVariables() as ResponseVariable[];\n const value1 = values[0];\n const value2 = values[1];\n\n if (!value1 || !value2) {\n return null;\n }\n\n if (this.toleranceMode !== 'exact') {\n console.error('toleranceMode is not supported yet');\n return false;\n }\n if (\n value1.cardinality !== 'single' ||\n value2.cardinality !== 'single' ||\n Array.isArray(value1.value) ||\n Array.isArray(value2.value)\n ) {\n console.error('unexpected cardinality in qti equal');\n return false;\n }\n\n if (value1.value === null || value2.value === null || value1.value === undefined || value2.value === undefined) {\n return null;\n }\n\n return ScoringHelper.compareSingleValues(value1.value as string, value2.value as string, value1.baseType);\n }\n console.error('unexpected number of children in qti-equal');\n return null;\n }\n}\n"]}
|
|
@@ -1,4 +1,13 @@
|
|
|
1
1
|
import { QtiExpression } from '@qti-components/base';
|
|
2
|
+
/**
|
|
3
|
+
* @summary The qti-equal-rounded operator compares two values after rounding.
|
|
4
|
+
* @documentation https://www.imsglobal.org/spec/qti/v3p0/info/index.html#equalRounded
|
|
5
|
+
*
|
|
6
|
+
* Takes 2 sub-expressions with numerical base-types and single cardinality.
|
|
7
|
+
* Requires 'figures' and 'rounding-mode' (decimalPlaces or significantFigures) attributes.
|
|
8
|
+
* Returns true if equal after specified rounding, false otherwise.
|
|
9
|
+
* Special cases: Returns NULL if either sub-expression is NULL.
|
|
10
|
+
*/
|
|
2
11
|
export declare class QtiEqualRounded extends QtiExpression<boolean> {
|
|
3
12
|
roundingMode: 'decimalPlaces' | 'significantFigures';
|
|
4
13
|
get figures(): number;
|
|
@@ -6,6 +6,15 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
6
6
|
};
|
|
7
7
|
import { property } from 'lit/decorators.js';
|
|
8
8
|
import { QtiExpression } from '@qti-components/base';
|
|
9
|
+
/**
|
|
10
|
+
* @summary The qti-equal-rounded operator compares two values after rounding.
|
|
11
|
+
* @documentation https://www.imsglobal.org/spec/qti/v3p0/info/index.html#equalRounded
|
|
12
|
+
*
|
|
13
|
+
* Takes 2 sub-expressions with numerical base-types and single cardinality.
|
|
14
|
+
* Requires 'figures' and 'rounding-mode' (decimalPlaces or significantFigures) attributes.
|
|
15
|
+
* Returns true if equal after specified rounding, false otherwise.
|
|
16
|
+
* Special cases: Returns NULL if either sub-expression is NULL.
|
|
17
|
+
*/
|
|
9
18
|
export class QtiEqualRounded extends QtiExpression {
|
|
10
19
|
constructor() {
|
|
11
20
|
super(...arguments);
|
|
@@ -80,5 +89,4 @@ export class QtiEqualRounded extends QtiExpression {
|
|
|
80
89
|
__decorate([
|
|
81
90
|
property({ type: String })
|
|
82
91
|
], QtiEqualRounded.prototype, "roundingMode", void 0);
|
|
83
|
-
customElements.define('qti-equal-rounded', QtiEqualRounded);
|
|
84
92
|
//# sourceMappingURL=qti-equal-rounded.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"qti-equal-rounded.js","sourceRoot":"","sources":["../../../src/components/qti-equal-rounded/qti-equal-rounded.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"qti-equal-rounded.js","sourceRoot":"","sources":["../../../src/components/qti-equal-rounded/qti-equal-rounded.ts"],"names":[],"mappings":"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","sourcesContent":["import { property } from 'lit/decorators.js';\n\nimport { QtiExpression } from '@qti-components/base';\n\nimport type { ResponseVariable } from '@qti-components/base';\n\n/**\n * @summary The qti-equal-rounded operator compares two values after rounding.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/info/index.html#equalRounded\n *\n * Takes 2 sub-expressions with numerical base-types and single cardinality.\n * Requires 'figures' and 'rounding-mode' (decimalPlaces or significantFigures) attributes.\n * Returns true if equal after specified rounding, false otherwise.\n * Special cases: Returns NULL if either sub-expression is NULL.\n */\nexport class QtiEqualRounded extends QtiExpression<boolean> {\n @property({ type: String }) roundingMode: 'decimalPlaces' | 'significantFigures' = 'significantFigures';\n\n get figures() {\n const attr = this.getAttribute('figures');\n if (!attr) {\n console.error('figures attribute is missing');\n return null;\n }\n const figures = parseInt(this.getAttribute('figures') || '0');\n if (isNaN(figures)) {\n console.error('figures attribute is not a number');\n return null;\n }\n if (figures < 0) {\n console.error('figures attribute is negative');\n return null;\n }\n if (figures < 1 && this.roundingMode === 'significantFigures') {\n console.error('figures cannot be smaller than 1 for RoundingMode significantFigures');\n return null;\n }\n return figures;\n }\n\n public override getResult() {\n if (this.children.length === 2) {\n const values = this.getVariables() as ResponseVariable[];\n const value1 = values[0];\n const value2 = values[1];\n if (this.roundingMode === null) {\n return null;\n }\n if (\n value1.cardinality !== 'single' ||\n value2.cardinality !== 'single' ||\n Array.isArray(value1.value) ||\n Array.isArray(value2.value)\n ) {\n console.error('unexpected cardinality in qti equal');\n return false;\n }\n switch (values[0].baseType) {\n case 'integer':\n case 'float': {\n const float1 = parseFloat(value1.value as string);\n const float2 = parseFloat(value2.value as string);\n\n if (!isNaN(float1) && !isNaN(float2)) {\n if (this.roundingMode === 'significantFigures') {\n return float1.toPrecision(this.figures) === float2.toPrecision(this.figures);\n } else {\n return (\n Math.round(float1 * Math.pow(10, this.figures)) / Math.pow(10, this.figures) ===\n Math.round(float2 * Math.pow(10, this.figures)) / Math.pow(10, this.figures)\n );\n }\n } else {\n console.error(`value cannot be casted to numeric value in equalRounded operator: ${float1}, ${float2}`);\n }\n break;\n }\n default: {\n console.error(`values other than float and int cannot be used in equalRounded operator.`);\n break;\n }\n }\n return false;\n }\n console.error('unexpected number of children in qti-equal-rounded');\n return null;\n }\n}\n"]}
|
|
@@ -1,4 +1,12 @@
|
|
|
1
1
|
import { QtiExpression } from '@qti-components/base';
|
|
2
|
+
/**
|
|
3
|
+
* @summary The qti-field-value operator retrieves a specific field from a record.
|
|
4
|
+
* @documentation https://www.imsglobal.org/spec/qti/v3p0/info/index.html#fieldValue
|
|
5
|
+
*
|
|
6
|
+
* Takes a sub-expression with record cardinality. 'field-identifier' identifies the field.
|
|
7
|
+
* Returns the value of the specified field.
|
|
8
|
+
* Special cases: Returns NULL if sub-expression is NULL or field does not exist.
|
|
9
|
+
*/
|
|
2
10
|
export declare class QtiFieldValue extends QtiExpression<string | string[]> {
|
|
3
11
|
getResult(): any;
|
|
4
12
|
}
|
|
@@ -1,4 +1,12 @@
|
|
|
1
1
|
import { QtiExpression } from '@qti-components/base';
|
|
2
|
+
/**
|
|
3
|
+
* @summary The qti-field-value operator retrieves a specific field from a record.
|
|
4
|
+
* @documentation https://www.imsglobal.org/spec/qti/v3p0/info/index.html#fieldValue
|
|
5
|
+
*
|
|
6
|
+
* Takes a sub-expression with record cardinality. 'field-identifier' identifies the field.
|
|
7
|
+
* Returns the value of the specified field.
|
|
8
|
+
* Special cases: Returns NULL if sub-expression is NULL or field does not exist.
|
|
9
|
+
*/
|
|
2
10
|
export class QtiFieldValue extends QtiExpression {
|
|
3
11
|
getResult() {
|
|
4
12
|
const fieldIdentifier = this.getAttribute('field-identifier');
|
|
@@ -23,5 +31,4 @@ export class QtiFieldValue extends QtiExpression {
|
|
|
23
31
|
return fieldValue;
|
|
24
32
|
}
|
|
25
33
|
}
|
|
26
|
-
customElements.define('qti-field-value', QtiFieldValue);
|
|
27
34
|
//# sourceMappingURL=qti-field-value.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"qti-field-value.js","sourceRoot":"","sources":["../../../src/components/qti-field-value/qti-field-value.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAIrD,MAAM,OAAO,aAAc,SAAQ,aAAgC;IACjD,SAAS;QACvB,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAC;QAE9D,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;QAC5D,CAAC;QAED,gEAAgE;QAChE,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAyB,CAAC;QAExE,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;QAC5E,CAAC;QAED,MAAM,QAAQ,GAAI,IAAI,CAAC,YAAY,EAAyB,CAAC,CAAC,CAAC,CAAC;QAEhE,yCAAyC;QACzC,IAAI,QAAQ,CAAC,QAAQ,KAAK,QAAQ,IAAI,QAAQ,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YAC9D,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;QAC3E,CAAC;QAED,yBAAyB;QACzB,MAAM,UAAU,GAAI,QAAQ,CAAC,KAA6B,CAAC,eAAe,CAAC,CAAC;QAE5E,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,UAAU,eAAe,uBAAuB,CAAC,CAAC;QACpE,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;CACF
|
|
1
|
+
{"version":3,"file":"qti-field-value.js","sourceRoot":"","sources":["../../../src/components/qti-field-value/qti-field-value.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAIrD;;;;;;;GAOG;AACH,MAAM,OAAO,aAAc,SAAQ,aAAgC;IACjD,SAAS;QACvB,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAC;QAE9D,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;QAC5D,CAAC;QAED,gEAAgE;QAChE,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAyB,CAAC;QAExE,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;QAC5E,CAAC;QAED,MAAM,QAAQ,GAAI,IAAI,CAAC,YAAY,EAAyB,CAAC,CAAC,CAAC,CAAC;QAEhE,yCAAyC;QACzC,IAAI,QAAQ,CAAC,QAAQ,KAAK,QAAQ,IAAI,QAAQ,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YAC9D,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;QAC3E,CAAC;QAED,yBAAyB;QACzB,MAAM,UAAU,GAAI,QAAQ,CAAC,KAA6B,CAAC,eAAe,CAAC,CAAC;QAE5E,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,UAAU,eAAe,uBAAuB,CAAC,CAAC;QACpE,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;CACF","sourcesContent":["import { QtiExpression } from '@qti-components/base';\n\nimport type { ResponseVariable } from '@qti-components/base';\n\n/**\n * @summary The qti-field-value operator retrieves a specific field from a record.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/info/index.html#fieldValue\n *\n * Takes a sub-expression with record cardinality. 'field-identifier' identifies the field.\n * Returns the value of the specified field.\n * Special cases: Returns NULL if sub-expression is NULL or field does not exist.\n */\nexport class QtiFieldValue extends QtiExpression<string | string[]> {\n public override getResult() {\n const fieldIdentifier = this.getAttribute('field-identifier');\n\n if (!fieldIdentifier) {\n throw new Error('field-identifier attribute is required');\n }\n\n // Get the result from the child expression (should be a record)\n const childElements = Array.from(this.children) as QtiExpression<any>[];\n\n if (childElements.length !== 1) {\n throw new Error('qti-field-value must have exactly one child expression');\n }\n\n const variable = (this.getVariables() as ResponseVariable[])[0];\n\n // Check if the result is a record/object\n if (variable.baseType !== 'record' || variable.value === null) {\n throw new Error('qti-field-value child expression must return a record');\n }\n\n // Return the field value\n const fieldValue = (variable.value as Record<string, any>)[fieldIdentifier];\n\n if (fieldValue === undefined) {\n throw new Error(`Field \"${fieldIdentifier}\" not found in record`);\n }\n\n return fieldValue;\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"qti.gcd.js","sourceRoot":"","sources":["../../../src/components/qti-gcd/qti.gcd.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"qti.gcd.js","sourceRoot":"","sources":["../../../src/components/qti-gcd/qti.gcd.ts"],"names":[],"mappings":"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","sourcesContent":["import { QtiExpression } from '@qti-components/base';\n\nimport type { ResponseVariable } from '@qti-components/base';\n\n/**\n * @summary The qti-gcd operator calculates the greatest common divisor of integer values.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/impl#h.gcd\n *\n * Takes 1 or more sub-expressions with base-type integer and any cardinality.\n * Returns a single integer equal to the greatest common divisor of all argument values.\n * Special cases: gcd(0,0)=0, gcd(0,n)=n if n≠0, returns NULL if any argument is NULL or non-numerical.\n */\nexport class QtiGcd extends QtiExpression<number | null> {\n public override getResult(): number | null {\n if (this.children.length === 0) {\n console.error('qti-gcd must have at least one child expression');\n return null;\n }\n\n const variables = this.getVariables() as ResponseVariable[];\n if (!variables || variables.length === 0) {\n return null;\n }\n\n // Collect all integer values from all variables\n const allValues: number[] = [];\n\n for (const variable of variables) {\n // Check base type\n if (variable.baseType !== 'integer') {\n console.error('qti-gcd requires integer base-type');\n return null;\n }\n\n // Handle null values\n if (variable.value === null || variable.value === undefined) {\n return null;\n }\n\n // Handle different cardinalities\n if (variable.cardinality === 'single') {\n if (Array.isArray(variable.value)) {\n console.error('qti-gcd unexpected array value for single cardinality');\n return null;\n }\n const numValue = parseInt(variable.value as string, 10);\n if (isNaN(numValue)) {\n console.error('qti-gcd non-numerical value');\n return null;\n }\n allValues.push(numValue);\n } else if (variable.cardinality === 'multiple' || variable.cardinality === 'ordered') {\n if (!Array.isArray(variable.value)) {\n console.error('qti-gcd expected array value for multiple/ordered cardinality');\n return null;\n }\n for (const value of variable.value) {\n if (value === null || value === undefined) {\n return null;\n }\n const numValue = parseInt(value as string, 10);\n if (isNaN(numValue)) {\n console.error('qti-gcd non-numerical value');\n return null;\n }\n allValues.push(numValue);\n }\n } else {\n console.error('qti-gcd unsupported cardinality');\n return null;\n }\n }\n\n if (allValues.length === 0) {\n return null;\n }\n\n // Calculate GCD of all values\n return this.#calculateGcd(allValues);\n }\n\n /**\n * Calculate the greatest common divisor of an array of integers\n */\n #calculateGcd(values: number[]): number {\n if (values.length === 0) {\n return 0;\n }\n\n if (values.length === 1) {\n return Math.abs(values[0]);\n }\n\n // Start with the first value\n let result = Math.abs(values[0]);\n\n // Calculate GCD with each subsequent value\n for (let i = 1; i < values.length; i++) {\n result = this.#gcdTwoNumbers(result, Math.abs(values[i]));\n\n // Early termination: if GCD becomes 1, it won't get smaller\n if (result === 1) {\n break;\n }\n }\n\n return result;\n }\n\n /**\n * Calculate GCD of two numbers using Euclidean algorithm\n */\n #gcdTwoNumbers(a: number, b: number): number {\n // Handle special cases according to QTI spec\n if (a === 0 && b === 0) {\n return 0; // gcd(0,0) = 0\n }\n if (a === 0) {\n return b; // gcd(0,n) = n\n }\n if (b === 0) {\n return a; // gcd(n,0) = n\n }\n\n // Euclidean algorithm\n while (b !== 0) {\n const temp = b;\n b = a % b;\n a = temp;\n }\n\n return a;\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"qti-gt.js","sourceRoot":"","sources":["../../../src/components/qti-gt/qti-gt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAIrD,MAAM,OAAO,KAAM,SAAQ,aAAsB;IAC/B,SAAS;QACvB,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,EAAwB,CAAC;YACzD,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACzB,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACzB,IACE,CAAC,MAAM,CAAC,QAAQ,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC;gBAC9D,CAAC,MAAM,CAAC,QAAQ,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC,EAC9D,CAAC;gBACD,OAAO,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC;YACvC,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;YAChE,CAAC;QACH,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC;IACd,CAAC;CACF
|
|
1
|
+
{"version":3,"file":"qti-gt.js","sourceRoot":"","sources":["../../../src/components/qti-gt/qti-gt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAIrD,MAAM,OAAO,KAAM,SAAQ,aAAsB;IAC/B,SAAS;QACvB,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,EAAwB,CAAC;YACzD,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACzB,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACzB,IACE,CAAC,MAAM,CAAC,QAAQ,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC;gBAC9D,CAAC,MAAM,CAAC,QAAQ,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC,EAC9D,CAAC;gBACD,OAAO,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC;YACvC,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;YAChE,CAAC;QACH,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC;IACd,CAAC;CACF","sourcesContent":["import { QtiExpression } from '@qti-components/base';\n\nimport type { ResponseVariable } from '@qti-components/base';\n\nexport class QtiGt extends QtiExpression<boolean> {\n public override getResult(): boolean {\n if (this.children.length === 2) {\n const values = this.getVariables() as ResponseVariable[];\n const value1 = values[0];\n const value2 = values[1];\n if (\n (value1.baseType === 'integer' || value1.baseType === 'float') &&\n (value2.baseType === 'integer' || value2.baseType === 'float')\n ) {\n return +value1.value > +value2.value;\n } else {\n console.error('unexpected baseType or cardinality in qti gt');\n }\n }\n console.error('unexpected number of children in qt');\n return null;\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"qti-gte.js","sourceRoot":"","sources":["../../../src/components/qti-gte/qti-gte.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAI9D,oFAAoF;AACpF,0DAA0D;AAC1D,MAAM,OAAO,MAAO,SAAQ,sBAAsB;IAChC,SAAS;QACvB,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,EAAwB,CAAC;YACzD,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACzB,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACzB,IACE,CAAC,MAAM,CAAC,QAAQ,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC;gBAC9D,CAAC,MAAM,CAAC,QAAQ,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC,EAC9D,CAAC;gBACD,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;YACxC,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;gBAC/D,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC;IACd,CAAC;CACF
|
|
1
|
+
{"version":3,"file":"qti-gte.js","sourceRoot":"","sources":["../../../src/components/qti-gte/qti-gte.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAI9D,oFAAoF;AACpF,0DAA0D;AAC1D,MAAM,OAAO,MAAO,SAAQ,sBAAsB;IAChC,SAAS;QACvB,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,EAAwB,CAAC;YACzD,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACzB,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACzB,IACE,CAAC,MAAM,CAAC,QAAQ,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC;gBAC9D,CAAC,MAAM,CAAC,QAAQ,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC,EAC9D,CAAC;gBACD,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;YACxC,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;gBAC/D,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC;IACd,CAAC;CACF","sourcesContent":["import { QtiConditionExpression } from '@qti-components/base';\n\nimport type { ResponseVariable } from '@qti-components/base';\n\n// PK: For the contains we assume the expressions to calculate are all directedPairs\n// I don't know it this in QTI is always the case however?\nexport class QtiGte extends QtiConditionExpression {\n public override getResult(): boolean {\n if (this.children.length === 2) {\n const values = this.getVariables() as ResponseVariable[];\n const value1 = values[0];\n const value2 = values[1];\n if (\n (value1.baseType === 'integer' || value1.baseType === 'float') &&\n (value2.baseType === 'integer' || value2.baseType === 'float')\n ) {\n return +value1.value >= +value2.value;\n } else {\n console.error('unexpected baseType or cardinality in qti gte');\n return null;\n }\n }\n console.log('unexpected number of children in qte');\n return null;\n }\n}\n"]}
|
|
@@ -1,4 +1,12 @@
|
|
|
1
1
|
import { QtiExpression } from '@qti-components/base';
|
|
2
|
+
/**
|
|
3
|
+
* @summary The qti-index operator retrieves a specific item from an ordered container.
|
|
4
|
+
* @documentation https://www.imsglobal.org/spec/qti/v3p0/info/index.html#index
|
|
5
|
+
*
|
|
6
|
+
* Takes 1 ordered container sub-expression; 'n' attribute specifies 1-based index.
|
|
7
|
+
* Returns the nth value from the container with original base-type and single cardinality.
|
|
8
|
+
* Special cases: Returns NULL if container is NULL or n exceeds container size.
|
|
9
|
+
*/
|
|
2
10
|
export declare class QtiIndex extends QtiExpression<any> {
|
|
3
11
|
#private;
|
|
4
12
|
n: string;
|
|
@@ -4,9 +4,17 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
4
4
|
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
5
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
6
|
};
|
|
7
|
-
import {
|
|
7
|
+
import { property } from 'lit/decorators.js';
|
|
8
8
|
import { QtiExpression } from '@qti-components/base';
|
|
9
|
-
|
|
9
|
+
/**
|
|
10
|
+
* @summary The qti-index operator retrieves a specific item from an ordered container.
|
|
11
|
+
* @documentation https://www.imsglobal.org/spec/qti/v3p0/info/index.html#index
|
|
12
|
+
*
|
|
13
|
+
* Takes 1 ordered container sub-expression; 'n' attribute specifies 1-based index.
|
|
14
|
+
* Returns the nth value from the container with original base-type and single cardinality.
|
|
15
|
+
* Special cases: Returns NULL if container is NULL or n exceeds container size.
|
|
16
|
+
*/
|
|
17
|
+
export class QtiIndex extends QtiExpression {
|
|
10
18
|
getResult() {
|
|
11
19
|
if (!this.n) {
|
|
12
20
|
console.error('qti-index: missing required attribute "n"');
|
|
@@ -71,12 +79,8 @@ let QtiIndex = class QtiIndex extends QtiExpression {
|
|
|
71
79
|
}
|
|
72
80
|
return Number(value);
|
|
73
81
|
}
|
|
74
|
-
}
|
|
82
|
+
}
|
|
75
83
|
__decorate([
|
|
76
84
|
property({ type: String })
|
|
77
85
|
], QtiIndex.prototype, "n", void 0);
|
|
78
|
-
QtiIndex = __decorate([
|
|
79
|
-
customElement('qti-index')
|
|
80
|
-
], QtiIndex);
|
|
81
|
-
export { QtiIndex };
|
|
82
86
|
//# sourceMappingURL=qti-index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"qti-index.js","sourceRoot":"","sources":["../../../src/components/qti-index/qti-index.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"qti-index.js","sourceRoot":"","sources":["../../../src/components/qti-index/qti-index.ts"],"names":[],"mappings":"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","sourcesContent":["import { property } from 'lit/decorators.js';\n\nimport { QtiExpression } from '@qti-components/base';\n\nimport type { integer } from '@qti-components/base';\nimport type { ResponseVariable } from '@qti-components/base';\n\n/**\n * @summary The qti-index operator retrieves a specific item from an ordered container.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/info/index.html#index\n *\n * Takes 1 ordered container sub-expression; 'n' attribute specifies 1-based index.\n * Returns the nth value from the container with original base-type and single cardinality.\n * Special cases: Returns NULL if container is NULL or n exceeds container size.\n */\n\nexport class QtiIndex extends QtiExpression<any> {\n @property({ type: String })\n n!: string; // Required attribute, can be a number or an identifier\n\n public override getResult(): any {\n if (!this.n) {\n console.error('qti-index: missing required attribute \"n\"');\n return null;\n }\n\n // Check if there is exactly one child\n if (this.children.length !== 1) {\n console.error('qti-index: must have exactly one child container element');\n return null;\n }\n\n // Get the container from the child\n const containerVariable = this.getVariables()[0] as ResponseVariable;\n if (!containerVariable) {\n console.error('qti-index: missing container');\n return null;\n }\n\n // Determine the index value - either from n as a direct number or by looking up identifier\n let index: number;\n\n if (!isNaN(Number(this.n))) {\n // n is a direct number\n index = Number(this.n);\n } else {\n // n is an identifier - need to look up its value at runtime\n // This would require access to the QTI runtime context to resolve variables\n const variableValue = this.#lookupVariableValue(this.n);\n if (variableValue === null) {\n console.error(`qti-index: variable \"${this.n}\" is not a valid number`);\n return null;\n }\n index = Number(variableValue);\n }\n\n // Check if index is a positive integer\n if (index <= 0 || !Number.isInteger(index)) {\n console.error('qti-index: index must be a positive integer');\n return null;\n }\n\n // Check if container has ordered values\n if (containerVariable.cardinality === 'ordered') {\n const containerValues = Array.isArray(containerVariable.value)\n ? containerVariable.value\n : [containerVariable.value];\n\n // Index out of bounds or container is NULL\n if (containerVariable.value === null || index > containerValues.length) {\n return null;\n }\n\n // Return the nth value (index is 1-based)\n return containerValues[index - 1];\n } else {\n console.error('qti-index: child must have ordered cardinality');\n return null;\n }\n }\n\n // Helper method to look up a variable value by identifier\n // This would need to be implemented based on your actual QTI runtime environment\n #lookupVariableValue(identifier: string): integer | null {\n const value = this.context.variables.find(v => v.identifier === identifier)?.value;\n // check if value is a number\n if (value === null || isNaN(Number(value))) {\n return null;\n }\n return Number(value) as integer;\n }\n}\n"]}
|