@khanacademy/perseus-core 36.0.0 → 37.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/data-schema.d.ts +0 -24
- package/dist/es/index.item-splitting.js +11 -11
- package/dist/es/index.item-splitting.js.map +1 -1
- package/dist/es/index.js +18 -16
- package/dist/es/index.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.item-splitting.js +11 -11
- package/dist/index.item-splitting.js.map +1 -1
- package/dist/index.js +18 -15
- package/dist/index.js.map +1 -1
- package/dist/parse-perseus-json/perseus-parsers/categorizer-widget.d.ts +0 -1
- package/dist/parse-perseus-json/perseus-parsers/definition-widget.d.ts +0 -1
- package/dist/parse-perseus-json/perseus-parsers/dropdown-widget.d.ts +0 -1
- package/dist/parse-perseus-json/perseus-parsers/explanation-widget.d.ts +0 -1
- package/dist/parse-perseus-json/perseus-parsers/graded-group-set-widget.d.ts +0 -3
- package/dist/parse-perseus-json/perseus-parsers/graded-group-widget.d.ts +0 -6
- package/dist/parse-perseus-json/perseus-parsers/iframe-widget.d.ts +0 -1
- package/dist/parse-perseus-json/perseus-parsers/interaction-widget.d.ts +0 -1
- package/dist/parse-perseus-json/perseus-parsers/label-image-widget.d.ts +0 -1
- package/dist/parse-perseus-json/perseus-parsers/number-line-widget.d.ts +0 -1
- package/dist/parse-perseus-json/perseus-parsers/video-widget.d.ts +0 -1
- package/dist/parse-perseus-json/regression-tests/item-data/radio-with-weird-alignment.d.ts +63 -0
- package/dist/utils/widget-prop-denylist.d.ts +5 -0
- package/dist/widgets/categorizer/categorizer-util.d.ts +0 -1
- package/dist/widgets/dropdown/dropdown-util.d.ts +0 -1
- package/dist/widgets/label-image/label-image-util.d.ts +0 -1
- package/dist/widgets/number-line/number-line-util.d.ts +1 -1
- package/package.json +1 -1
package/dist/data-schema.d.ts
CHANGED
|
@@ -439,8 +439,6 @@ export type PerseusCategorizerWidgetOptions = {
|
|
|
439
439
|
categories: string[];
|
|
440
440
|
/** Whether the items should be randomized */
|
|
441
441
|
randomizeItems: boolean;
|
|
442
|
-
/** Whether this widget is displayed with the results and immutable */
|
|
443
|
-
static: boolean;
|
|
444
442
|
/**
|
|
445
443
|
* The correct answers where index relates to the items and value relates to
|
|
446
444
|
* the category. e.g. [0, 1, 0, 1, 2]
|
|
@@ -453,8 +451,6 @@ export type PerseusDefinitionWidgetOptions = {
|
|
|
453
451
|
togglePrompt: string;
|
|
454
452
|
/** Translatable text; the definition of the word. e.g. "where 2 rays connect" */
|
|
455
453
|
definition: string;
|
|
456
|
-
/** Always false. Not used for this widget */
|
|
457
|
-
static: boolean;
|
|
458
454
|
};
|
|
459
455
|
/** Options for the dropdown widget. A list of choices in a dropdown. */
|
|
460
456
|
export type PerseusDropdownWidgetOptions = {
|
|
@@ -462,8 +458,6 @@ export type PerseusDropdownWidgetOptions = {
|
|
|
462
458
|
choices: PerseusDropdownChoice[];
|
|
463
459
|
/** Translatable Text; placeholder text for a dropdown. e.g. "Please select a fruit" */
|
|
464
460
|
placeholder: string;
|
|
465
|
-
/** Always false. Not used for this widget */
|
|
466
|
-
static: boolean;
|
|
467
461
|
/** Translatable Text; visible label for the dropdown */
|
|
468
462
|
visibleLabel?: string;
|
|
469
463
|
/** Translatable Text; aria label that screen readers will read */
|
|
@@ -497,8 +491,6 @@ export type PerseusExplanationWidgetOptions = {
|
|
|
497
491
|
* widgets are here.
|
|
498
492
|
*/
|
|
499
493
|
widgets: PerseusWidgetsMap;
|
|
500
|
-
/** Always false. Not used for this widget */
|
|
501
|
-
static: boolean;
|
|
502
494
|
};
|
|
503
495
|
export type LegacyButtonSets = Array<"basic" | "basic+div" | "trig" | "prealgebra" | "logarithms" | "basic relations" | "advanced relations" | "scientific">;
|
|
504
496
|
/** Options for the expression widget. Accepts a math expression answer. */
|
|
@@ -547,18 +539,12 @@ export type PerseusExpressionAnswerForm = {
|
|
|
547
539
|
export type PerseusGradedGroupWidgetOptions = {
|
|
548
540
|
/** Translatable Text; A title to be displayed for the group. */
|
|
549
541
|
title: string;
|
|
550
|
-
/** Not used in Perseus (but is set in (en, pt) production data) */
|
|
551
|
-
hasHint?: boolean | null | undefined;
|
|
552
542
|
/** A section to define hints for the group. */
|
|
553
543
|
hint?: PerseusRenderer | null | undefined;
|
|
554
544
|
/** Translatable Markdown. May include widgets and images embedded. */
|
|
555
545
|
content: string;
|
|
556
546
|
/** See {@link PerseusRenderer.widgets} */
|
|
557
547
|
widgets: PerseusWidgetsMap;
|
|
558
|
-
/** Not used in Perseus */
|
|
559
|
-
widgetEnabled?: boolean | null | undefined;
|
|
560
|
-
/** Not used in Perseus */
|
|
561
|
-
immutableWidgets?: boolean | null | undefined;
|
|
562
548
|
/** See {@link PerseusRenderer.images} */
|
|
563
549
|
images: {
|
|
564
550
|
[key: string]: PerseusImageDetail;
|
|
@@ -1260,8 +1246,6 @@ export type PerseusLabelImageWidgetOptions = {
|
|
|
1260
1246
|
hideChoicesFromInstructions: boolean;
|
|
1261
1247
|
/** Allow multiple answers per marker */
|
|
1262
1248
|
multipleAnswers: boolean;
|
|
1263
|
-
/** Always false. Not used for this widget */
|
|
1264
|
-
static: boolean;
|
|
1265
1249
|
};
|
|
1266
1250
|
export type PerseusLabelImageMarker = {
|
|
1267
1251
|
/**
|
|
@@ -1483,8 +1467,6 @@ export type PerseusNumberLineWidgetOptions = {
|
|
|
1483
1467
|
initialX?: number | null;
|
|
1484
1468
|
/** Show tooltips */
|
|
1485
1469
|
showTooltips?: boolean;
|
|
1486
|
-
/** When true, the answer is displayed and is immutable */
|
|
1487
|
-
static: boolean;
|
|
1488
1470
|
};
|
|
1489
1471
|
/** Options for the orderer widget. Cards to place in the correct order. */
|
|
1490
1472
|
export type PerseusOrdererWidgetOptions = {
|
|
@@ -1618,8 +1600,6 @@ export type PerseusInteractionWidgetOptions = {
|
|
|
1618
1600
|
graph: PerseusInteractionGraph;
|
|
1619
1601
|
/** The elements of the graph */
|
|
1620
1602
|
elements: PerseusInteractionElement[];
|
|
1621
|
-
/** Always false. Not used for this widget */
|
|
1622
|
-
static: boolean;
|
|
1623
1603
|
};
|
|
1624
1604
|
export type PerseusInteractionGraph = {
|
|
1625
1605
|
/** "canvas", "graph" */
|
|
@@ -1918,8 +1898,6 @@ export type PerseusIFrameWidgetOptions = {
|
|
|
1918
1898
|
* @deprecated - not used in Perseus.
|
|
1919
1899
|
*/
|
|
1920
1900
|
allowTopNavigation?: boolean;
|
|
1921
|
-
/** Always false */
|
|
1922
|
-
static: boolean;
|
|
1923
1901
|
};
|
|
1924
1902
|
/** Options for the phet-simulation widget. Embeds a PhET simulation. */
|
|
1925
1903
|
export type PerseusPhetSimulationWidgetOptions = {
|
|
@@ -1931,8 +1909,6 @@ export type PerseusPhetSimulationWidgetOptions = {
|
|
|
1931
1909
|
/** Options for the video widget. Embeds a video by its location ID. */
|
|
1932
1910
|
export type PerseusVideoWidgetOptions = {
|
|
1933
1911
|
location: string;
|
|
1934
|
-
/** `static` is not used for the video widget. */
|
|
1935
|
-
static?: boolean;
|
|
1936
1912
|
};
|
|
1937
1913
|
export type PerseusInputNumberAnswer = PerseusNumericInputAnswer;
|
|
1938
1914
|
export type PerseusInputNumberWidgetOptions = PerseusNumericInputWidgetOptions;
|
|
@@ -52,19 +52,19 @@ const parseImages=defaulted(record(string,parsePerseusImageDetail),()=>({}));
|
|
|
52
52
|
|
|
53
53
|
function convert(f){return (rawValue,ctx)=>ctx.success(f(rawValue))}
|
|
54
54
|
|
|
55
|
-
|
|
55
|
+
function toValidAlignment(alignment){switch(alignment){case "default":case "block":case "inline-block":case "inline":case "wrap-left":case "wrap-right":case "full-width":case undefined:return alignment;default:return "default"}}const parseAlignment=pipeParsers(optional(string)).then(convert(toValidAlignment)).parser;function parseWidget(parseType,parseOptions){return object({type:parseType,static:optional(boolean),graded:optional(boolean),alignment:parseAlignment,options:parseOptions,key:optional(nullable(number)),version:optional(object({major:number,minor:number}))})}function parseWidgetWithVersion(parseVersion,parseType,parseOptions){return object({type:parseType,static:optional(boolean),graded:optional(boolean),alignment:parseAlignment,options:parseOptions,key:optional(nullable(number)),version:parseVersion})}
|
|
56
56
|
|
|
57
57
|
const parseBlankWidget=parseWidget(constant("blank"),object({displayType:defaulted(enumeration("normal","superscript","subscript"),()=>"normal"),correctId:string}));
|
|
58
58
|
|
|
59
|
-
const parseCategorizerWidget=parseWidget(constant("categorizer"),object({items:array(string),categories:array(string),randomizeItems:defaulted(boolean,()=>false),
|
|
59
|
+
const parseCategorizerWidget=parseWidget(constant("categorizer"),object({items:array(string),categories:array(string),randomizeItems:defaulted(boolean,()=>false),values:defaulted(array(defaulted(number,()=>0)),()=>[])}));
|
|
60
60
|
|
|
61
61
|
const parseCSProgramWidget=parseWidget(constant("cs-program"),object({programID:string,programType:any,settings:array(object({name:string,value:string})),showEditor:boolean,showButtons:boolean,height:number}));
|
|
62
62
|
|
|
63
|
-
const parseDefinitionWidget=parseWidget(constant("definition"),object({togglePrompt:string,definition:string
|
|
63
|
+
const parseDefinitionWidget=parseWidget(constant("definition"),object({togglePrompt:string,definition:string}));
|
|
64
64
|
|
|
65
|
-
const parseDropdownWidget=parseWidget(constant("dropdown"),object({placeholder:defaulted(string,()=>""),ariaLabel:optional(string),visibleLabel:optional(string),
|
|
65
|
+
const parseDropdownWidget=parseWidget(constant("dropdown"),object({placeholder:defaulted(string,()=>""),ariaLabel:optional(string),visibleLabel:optional(string),choices:array(object({content:string,correct:defaulted(boolean,()=>false)}))}));
|
|
66
66
|
|
|
67
|
-
const parseExplanationWidget=parseWidget(constant("explanation"),object({showPrompt:string,hidePrompt:string,explanation:string,widgets:defaulted((rawVal,ctx)=>parseWidgetsMap(rawVal,ctx),()=>({}))
|
|
67
|
+
const parseExplanationWidget=parseWidget(constant("explanation"),object({showPrompt:string,hidePrompt:string,explanation:string,widgets:defaulted((rawVal,ctx)=>parseWidgetsMap(rawVal,ctx),()=>({}))}));
|
|
68
68
|
|
|
69
69
|
const KeypadKeys=["PLUS","MINUS","NEGATIVE","TIMES","DIVIDE","DECIMAL","PERIOD","PERCENT","CDOT","EQUAL","NEQ","GT","LT","GEQ","LEQ","FRAC_INCLUSIVE","FRAC_EXCLUSIVE","FRAC","EXP","EXP_2","EXP_3","SUB","SQRT","CUBE_ROOT","RADICAL","LEFT_PAREN","RIGHT_PAREN","LN","LOG","LOG_N","SIN","COS","TAN","PI","THETA","UP","RIGHT","DOWN","LEFT","BACKSPACE","DISMISS","JUMP_OUT_PARENTHESES","JUMP_OUT_EXPONENT","JUMP_OUT_BASE","JUMP_INTO_NUMERATOR","JUMP_OUT_NUMERATOR","JUMP_OUT_DENOMINATOR","NUM_0","NUM_1","NUM_2","NUM_3","NUM_4","NUM_5","NUM_6","NUM_7","NUM_8","NUM_9","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"];
|
|
70
70
|
|
|
@@ -80,7 +80,7 @@ const stringOrNumberOrNullOrUndefined=union(string).or(number).or(constant(null)
|
|
|
80
80
|
|
|
81
81
|
const parseFreeResponseWidget=parseWidget(constant("free-response"),object({allowUnlimitedCharacters:boolean,characterLimit:number,placeholder:string,question:string,scoringCriteria:array(object({text:string}))}));
|
|
82
82
|
|
|
83
|
-
const falseToNull=pipeParsers(constant(false)).then(convert(()=>null)).parser;const parseGradedGroupWidgetOptions=object({title:defaulted(string,()=>""),
|
|
83
|
+
const falseToNull=pipeParsers(constant(false)).then(convert(()=>null)).parser;const parseGradedGroupWidgetOptions=object({title:defaulted(string,()=>""),hint:union(falseToNull).or(constant(null)).or(constant(undefined)).or((rawVal,ctx)=>parsePerseusRenderer(rawVal,ctx)).parser,content:string,widgets:(rawVal,ctx)=>parseWidgetsMap(rawVal,ctx),images:record(string,object({width:number,height:number}))});const parseGradedGroupWidget=parseWidget(constant("graded-group"),parseGradedGroupWidgetOptions);
|
|
84
84
|
|
|
85
85
|
const parseGradedGroupSetWidget=parseWidget(constant("graded-group-set"),object({gradedGroups:array(parseGradedGroupWidgetOptions)}));
|
|
86
86
|
|
|
@@ -90,7 +90,7 @@ const pairOfNumbers$3=pair(number,number);const pairOfPoints=pair(pairOfNumbers$
|
|
|
90
90
|
|
|
91
91
|
const parseGroupWidget=parseWidget(constant("group"),(rawVal,ctx)=>parsePerseusRenderer(rawVal,ctx));
|
|
92
92
|
|
|
93
|
-
const parseIframeWidget=parseWidget(constant("iframe"),object({url:string,settings:optional(array(object({name:string,value:string}))),width:union(number).or(string).parser,height:union(number).or(string).parser,allowFullScreen:defaulted(boolean,()=>false),allowTopNavigation:optional(boolean)
|
|
93
|
+
const parseIframeWidget=parseWidget(constant("iframe"),object({url:string,settings:optional(array(object({name:string,value:string}))),width:union(number).or(string).parser,height:union(number).or(string).parser,allowFullScreen:defaulted(boolean,()=>false),allowTopNavigation:optional(boolean)}));
|
|
94
94
|
|
|
95
95
|
const stringToNumber=(rawValue,ctx)=>{if(typeof rawValue==="number"){return ctx.success(rawValue)}const parsedNumber=+rawValue;if(rawValue===""||isNaN(parsedNumber)){return ctx.failure("a number or numeric string",rawValue)}return ctx.success(parsedNumber)};
|
|
96
96
|
|
|
@@ -100,11 +100,11 @@ const pairOfNumbers$2=pair(number,number);const parseImageWidget=parseWidget(con
|
|
|
100
100
|
|
|
101
101
|
const booleanToZero=(rawValue,ctx)=>{if(typeof rawValue==="boolean"){return ctx.success(0)}return ctx.failure("boolean",rawValue)};const parseMathFormat$1=enumeration("integer","mixed","improper","proper","decimal","percent","pi");const parseInputNumberWidgetV1=parseWidgetWithVersion(object({major:constant(1),minor:number}),constant("input-number"),object({size:string,coefficient:boolean,labelText:optional(string),textAlign:enumeration("left","center","right"),answers:array(object({value:optional(nullable(number)),status:string,message:string,answerForms:optional(array(parseMathFormat$1)),strict:boolean,maxError:optional(nullable(number)),simplify:enumeration("required","enforced","optional")}))}));function migrateV0ToV1$3(v0){const v1Options=convertInputNumberOptionsToNumericInput(v0.options);return {...v0,version:{major:1,minor:0},options:v1Options}}const parseInputNumberWidgetV0=parseWidgetWithVersion(defaulted(optional(object({major:constant(0),minor:number})),()=>undefined),constant("input-number"),object({answerType:optional(enumeration("number","decimal","integer","rational","improper","mixed","percent","pi")),inexact:optional(boolean),maxError:optional(union(number).or(string).parser),rightAlign:optional(boolean),simplify:enumeration("required","optional","enforced"),size:enumeration("normal","small"),value:defaulted(union(number).or(string).or(booleanToZero).parser,()=>0)}));function convertInputNumberOptionsToNumericInput(inputNumberOptions){return {coefficient:false,textAlign:inputNumberOptions.rightAlign?"right":"left",size:inputNumberOptions.size,answers:[{status:"correct",value:Number(inputNumberOptions.value),simplify:inputNumberOptions.simplify,message:"",maxError:getMaxError(inputNumberOptions),strict:true,answerForms:getAnswerForms(inputNumberOptions)}]}}function getMaxError(inputNumberOptions){if(!inputNumberOptions.inexact){return 0}if(inputNumberOptions.maxError==null){return undefined}return Number(inputNumberOptions.maxError)}const mathFormatsForAnswerType={number:[],decimal:["decimal"],integer:["integer"],rational:["integer","proper","improper","mixed"],improper:["integer","proper","improper"],mixed:["integer","proper","mixed"],percent:["integer","decimal","proper","improper","mixed","percent"],pi:["pi"]};function getAnswerForms(options){const value=Number(options.value);const{inexact}=options;const precision=1e10;const rounded=Math.round(value*precision)/precision;const answerType=options.answerType??"number";if(answerType==="number"&&!inexact&&!equalFloats(rounded,value)){return ["proper","improper","mixed"]}return mathFormatsForAnswerType[answerType]}function equalFloats(a,b){return Math.abs(a-b)<Math.pow(2,-42)}const parseInputNumberWidget=versionedWidgetOptions(1,parseInputNumberWidgetV1).withMigrationFrom(0,parseInputNumberWidgetV0,migrateV0ToV1$3).parser;
|
|
102
102
|
|
|
103
|
-
const pairOfNumbers$1=pair(number,number);const stringOrEmpty=defaulted(string,()=>"");const parseKey=pipeParsers(optional(string)).then(convert(String)).parser;const parseFunctionElement=object({type:constant("function"),key:parseKey,options:object({value:string,funcName:string,rangeMin:string,rangeMax:string,color:string,strokeDasharray:string,strokeWidth:number})});const parseLabelElement=object({type:constant("label"),key:parseKey,options:object({label:string,color:string,coordX:string,coordY:string})});const parseLineElement=object({type:constant("line"),key:parseKey,options:object({color:string,startX:string,startY:string,endX:string,endY:string,strokeDasharray:string,strokeWidth:number,arrows:string})});const parseMovableLineElement=object({type:constant("movable-line"),key:parseKey,options:object({startX:string,startY:string,startSubscript:number,endX:string,endY:string,endSubscript:number,constraint:string,snap:number,constraintFn:string,constraintXMin:string,constraintXMax:string,constraintYMin:string,constraintYMax:string})});const parseMovablePointElement=object({type:constant("movable-point"),key:parseKey,options:object({startX:string,startY:string,varSubscript:number,constraint:string,snap:number,constraintFn:string,constraintXMin:stringOrEmpty,constraintXMax:stringOrEmpty,constraintYMin:stringOrEmpty,constraintYMax:stringOrEmpty})});const parseParametricElement=object({type:constant("parametric"),key:parseKey,options:object({x:string,y:string,rangeMin:string,rangeMax:string,color:string,strokeDasharray:string,strokeWidth:number})});const parsePointElement=object({type:constant("point"),key:parseKey,options:object({color:string,coordX:string,coordY:string})});const parseRectangleElement=object({type:constant("rectangle"),key:parseKey,options:object({color:string,coordX:string,coordY:string,width:string,height:string})});const parseInteractionWidget=parseWidget(constant("interaction"),object({
|
|
103
|
+
const pairOfNumbers$1=pair(number,number);const stringOrEmpty=defaulted(string,()=>"");const parseKey=pipeParsers(optional(string)).then(convert(String)).parser;const parseFunctionElement=object({type:constant("function"),key:parseKey,options:object({value:string,funcName:string,rangeMin:string,rangeMax:string,color:string,strokeDasharray:string,strokeWidth:number})});const parseLabelElement=object({type:constant("label"),key:parseKey,options:object({label:string,color:string,coordX:string,coordY:string})});const parseLineElement=object({type:constant("line"),key:parseKey,options:object({color:string,startX:string,startY:string,endX:string,endY:string,strokeDasharray:string,strokeWidth:number,arrows:string})});const parseMovableLineElement=object({type:constant("movable-line"),key:parseKey,options:object({startX:string,startY:string,startSubscript:number,endX:string,endY:string,endSubscript:number,constraint:string,snap:number,constraintFn:string,constraintXMin:string,constraintXMax:string,constraintYMin:string,constraintYMax:string})});const parseMovablePointElement=object({type:constant("movable-point"),key:parseKey,options:object({startX:string,startY:string,varSubscript:number,constraint:string,snap:number,constraintFn:string,constraintXMin:stringOrEmpty,constraintXMax:stringOrEmpty,constraintYMin:stringOrEmpty,constraintYMax:stringOrEmpty})});const parseParametricElement=object({type:constant("parametric"),key:parseKey,options:object({x:string,y:string,rangeMin:string,rangeMax:string,color:string,strokeDasharray:string,strokeWidth:number})});const parsePointElement=object({type:constant("point"),key:parseKey,options:object({color:string,coordX:string,coordY:string})});const parseRectangleElement=object({type:constant("rectangle"),key:parseKey,options:object({color:string,coordX:string,coordY:string,width:string,height:string})});const parseInteractionWidget=parseWidget(constant("interaction"),object({graph:object({editableSettings:optional(array(enumeration("canvas","graph"))),box:pairOfNumbers$1,labels:array(string),range:pair(pairOfNumbers$1,pairOfNumbers$1),gridStep:pairOfNumbers$1,markings:enumeration("graph","grid","none","axes"),snapStep:optional(pairOfNumbers$1),valid:optional(union(boolean).or(string).parser),backgroundImage:optional(parsePerseusImageBackground),showProtractor:optional(boolean),showRuler:optional(boolean),rulerLabel:optional(string),rulerTicks:optional(number),tickStep:pairOfNumbers$1}),elements:array(discriminatedUnionOn("type").withBranch("function",parseFunctionElement).withBranch("label",parseLabelElement).withBranch("line",parseLineElement).withBranch("movable-line",parseMovableLineElement).withBranch("movable-point",parseMovablePointElement).withBranch("parametric",parseParametricElement).withBranch("point",parsePointElement).withBranch("rectangle",parseRectangleElement).parser)}));
|
|
104
104
|
|
|
105
105
|
const pairOfNumbers=pair(number,number);const parsePerseusGraphTypeAngle=object({type:constant("angle"),showAngles:optional(boolean),allowReflexAngles:optional(boolean),angleOffsetDeg:optional(nullable(number)),snapDegrees:optional(number),match:optional(constant("congruent")),coords:optional(trio(pairOfNumbers,pairOfNumbers,pairOfNumbers)),startCoords:optional(trio(pairOfNumbers,pairOfNumbers,pairOfNumbers)),pointLabels:optional(trio(string,string,string)),showPointLabels:optional(boolean)});const parsePerseusGraphTypeCircle=object({type:constant("circle"),center:optional(pairOfNumbers),radius:optional(number),startCoords:optional(object({center:pairOfNumbers,radius:number})),pointLabels:optional(array(string)),showPointLabels:optional(boolean)});const parsePerseusGraphTypeLinear=object({type:constant("linear"),coords:optional(nullable(pair(pairOfNumbers,pairOfNumbers))),startCoords:optional(pair(pairOfNumbers,pairOfNumbers)),pointLabels:optional(pair(string,string)),showPointLabels:optional(boolean)});const parsePerseusGraphTypeLinearSystem=object({type:constant("linear-system"),coords:optional(nullable(array(pair(pairOfNumbers,pairOfNumbers)))),startCoords:optional(array(pair(pairOfNumbers,pairOfNumbers))),pointLabels:optional(array(string)),showPointLabels:optional(boolean)});const parsePerseusGraphTypeNone=object({type:constant("none")});const parsePerseusGraphTypePoint=object({type:constant("point"),numPoints:optional(union(number).or(constant("unlimited")).parser),coords:optional(nullable(array(pairOfNumbers))),startCoords:optional(array(pairOfNumbers)),coord:optional(pairOfNumbers),pointLabels:optional(array(string)),showPointLabels:optional(boolean)});const parsePerseusGraphTypePolygon=object({type:constant("polygon"),numSides:optional(union(number).or(constant("unlimited")).parser),showAngles:optional(boolean),showSides:optional(boolean),snapTo:optional(enumeration("grid","angles","sides")),match:optional(enumeration("similar","congruent","approx","exact")),startCoords:optional(array(pairOfNumbers)),coords:optional(nullable(array(pairOfNumbers))),pointLabels:optional(array(string)),showPointLabels:optional(boolean)});const parsePerseusGraphTypeQuadratic=object({type:constant("quadratic"),coords:optional(nullable(trio(pairOfNumbers,pairOfNumbers,pairOfNumbers))),startCoords:optional(trio(pairOfNumbers,pairOfNumbers,pairOfNumbers)),pointLabels:optional(trio(string,string,string)),showPointLabels:optional(boolean)});const parsePerseusGraphTypeRay=object({type:constant("ray"),coords:optional(nullable(pair(pairOfNumbers,pairOfNumbers))),startCoords:optional(pair(pairOfNumbers,pairOfNumbers)),pointLabels:optional(pair(string,string)),showPointLabels:optional(boolean)});const parsePerseusGraphTypeSegment=object({type:constant("segment"),numSegments:optional(number),coords:optional(nullable(array(pair(pairOfNumbers,pairOfNumbers)))),startCoords:optional(array(pair(pairOfNumbers,pairOfNumbers))),pointLabels:optional(array(string)),showPointLabels:optional(boolean)});const parsePerseusGraphTypeSinusoid=object({type:constant("sinusoid"),coords:optional(nullable(pair(pairOfNumbers,pairOfNumbers))),startCoords:optional(pair(pairOfNumbers,pairOfNumbers)),pointLabels:optional(array(string)),showPointLabels:optional(boolean)});const parsePerseusGraphTypeExponential=object({type:constant("exponential"),coords:optional(nullable(pair(pairOfNumbers,pairOfNumbers))),asymptote:optional(nullable(number)),startCoords:optional(object({coords:pair(pairOfNumbers,pairOfNumbers),asymptote:number})),pointLabels:optional(array(string)),showPointLabels:optional(boolean)});const parsePerseusGraphTypeAbsoluteValue=object({type:constant("absolute-value"),coords:optional(nullable(pair(pairOfNumbers,pairOfNumbers))),startCoords:optional(pair(pairOfNumbers,pairOfNumbers)),pointLabels:optional(pair(string,string)),showPointLabels:optional(boolean)});const parsePerseusGraphTypeTangent=object({type:constant("tangent"),coords:optional(nullable(pair(pairOfNumbers,pairOfNumbers))),startCoords:optional(pair(pairOfNumbers,pairOfNumbers)),pointLabels:optional(array(string)),showPointLabels:optional(boolean)});const parsePerseusGraphTypeLogarithm=object({type:constant("logarithm"),coords:optional(nullable(pair(pairOfNumbers,pairOfNumbers))),asymptote:optional(nullable(number)),startCoords:optional(object({coords:pair(pairOfNumbers,pairOfNumbers),asymptote:number})),pointLabels:optional(array(string)),showPointLabels:optional(boolean)});const parsePerseusGraphTypeVector=object({type:constant("vector"),coords:optional(nullable(pair(pairOfNumbers,pairOfNumbers))),startCoords:optional(pair(pairOfNumbers,pairOfNumbers)),match:optional(enumeration("exact","congruent"))});const parsePerseusGraphType=discriminatedUnionOn("type").withBranch("absolute-value",parsePerseusGraphTypeAbsoluteValue).withBranch("angle",parsePerseusGraphTypeAngle).withBranch("circle",parsePerseusGraphTypeCircle).withBranch("exponential",parsePerseusGraphTypeExponential).withBranch("linear",parsePerseusGraphTypeLinear).withBranch("linear-system",parsePerseusGraphTypeLinearSystem).withBranch("none",parsePerseusGraphTypeNone).withBranch("point",parsePerseusGraphTypePoint).withBranch("polygon",parsePerseusGraphTypePolygon).withBranch("quadratic",parsePerseusGraphTypeQuadratic).withBranch("ray",parsePerseusGraphTypeRay).withBranch("segment",parsePerseusGraphTypeSegment).withBranch("sinusoid",parsePerseusGraphTypeSinusoid).withBranch("tangent",parsePerseusGraphTypeTangent).withBranch("logarithm",parsePerseusGraphTypeLogarithm).withBranch("vector",parsePerseusGraphTypeVector).parser;const parseLockedFigureColor=pipeParsers(enumeration("blue","gold","green","grayH","purple","pink","red","orange")).then(convert(color=>color==="orange"?"gold":color)).parser;const parseLockedFigureFillType=enumeration("none","white","translucent","solid");const parseLockedLineStyle=enumeration("solid","dashed");const parseLockedFigureStrokeStyle=enumeration("solid","dashed","none");const parseStrokeWeight=defaulted(enumeration("medium","thin","thick"),()=>"medium");const parseLockedLabelType=object({type:constant("label"),coord:pairOfNumbers,text:defaulted(string,()=>""),color:defaulted(parseLockedFigureColor,()=>"grayH"),size:defaulted(enumeration("small","medium","large"),()=>"medium")});const parseLockedPointType=object({type:constant("point"),coord:pairOfNumbers,color:parseLockedFigureColor,filled:boolean,labels:defaulted(array(parseLockedLabelType),()=>[]),ariaLabel:optional(string)});const parseLockedLineType=object({type:constant("line"),kind:enumeration("line","ray","segment"),points:pair(parseLockedPointType,parseLockedPointType),color:parseLockedFigureColor,lineStyle:parseLockedLineStyle,showPoint1:defaulted(boolean,()=>false),showPoint2:defaulted(boolean,()=>false),weight:parseStrokeWeight,labels:defaulted(array(parseLockedLabelType),()=>[]),ariaLabel:optional(string)});const parseLockedVectorType=object({type:constant("vector"),points:pair(pairOfNumbers,pairOfNumbers),color:parseLockedFigureColor,weight:parseStrokeWeight,labels:defaulted(array(parseLockedLabelType),()=>[]),ariaLabel:optional(string)});const parseLockedEllipseType=object({type:constant("ellipse"),center:pairOfNumbers,radius:pairOfNumbers,angle:number,color:parseLockedFigureColor,fillStyle:parseLockedFigureFillType,strokeStyle:parseLockedFigureStrokeStyle,weight:parseStrokeWeight,labels:defaulted(array(parseLockedLabelType),()=>[]),ariaLabel:optional(string)});const parseLockedPolygonType=object({type:constant("polygon"),points:array(pairOfNumbers),color:parseLockedFigureColor,showVertices:boolean,fillStyle:parseLockedFigureFillType,strokeStyle:parseLockedFigureStrokeStyle,weight:parseStrokeWeight,labels:defaulted(array(parseLockedLabelType),()=>[]),ariaLabel:optional(string)});const numberOrNegativeInfinity=union(number).or(constant(-Infinity)).parser;const numberOrPositiveInfinity=union(number).or(constant(Infinity)).parser;const parseLockedFunctionDomain=defaulted(pair(defaulted(numberOrNegativeInfinity,()=>-Infinity),defaulted(numberOrPositiveInfinity,()=>Infinity)),()=>[-Infinity,Infinity]);const parseLockedFunctionType=object({type:constant("function"),color:parseLockedFigureColor,strokeStyle:parseLockedLineStyle,weight:parseStrokeWeight,equation:string,directionalAxis:enumeration("x","y"),domain:parseLockedFunctionDomain,labels:defaulted(array(parseLockedLabelType),()=>[]),ariaLabel:optional(string)});const parseLockedFigure=discriminatedUnionOn("type").withBranch("point",parseLockedPointType).withBranch("line",parseLockedLineType).withBranch("vector",parseLockedVectorType).withBranch("ellipse",parseLockedEllipseType).withBranch("polygon",parseLockedPolygonType).withBranch("function",parseLockedFunctionType).withBranch("label",parseLockedLabelType).parser;const parseLabelLocation=pipeParsers(enumeration("onAxis","alongEdge","",null,undefined)).then(convert(value=>value||"onAxis")).parser;const parseInteractiveGraphWidget=parseWidget(constant("interactive-graph"),object({step:pairOfNumbers,gridStep:optional(pairOfNumbers),snapStep:optional(pairOfNumbers),backgroundImage:defaulted(parsePerseusImageBackground,()=>({url:null})),markings:enumeration("graph","grid","none","axes"),labels:defaulted(array(string),()=>["$x$","$y$"]),labelLocation:parseLabelLocation,showProtractor:boolean,showRuler:optional(boolean),showTooltips:defaulted(boolean,()=>false),rulerLabel:optional(string),rulerTicks:optional(number),range:pair(pairOfNumbers,pairOfNumbers),showAxisArrows:defaulted(object({xMin:boolean,xMax:boolean,yMin:boolean,yMax:boolean}),()=>({xMin:true,xMax:true,yMin:true,yMax:true})),showAxisTicks:defaulted(object({x:boolean,y:boolean}),()=>({x:true,y:true})),graph:defaulted(parsePerseusGraphType,()=>({type:"linear"})),correct:defaulted(parsePerseusGraphType,()=>({type:"linear"})),lockedFigures:defaulted(array(parseLockedFigure),()=>[]),fullGraphAriaLabel:optional(string),fullGraphAriaDescription:optional(string)}));
|
|
106
106
|
|
|
107
|
-
const parseLabelImageWidget=parseWidget(constant("label-image"),object({choices:array(string),imageUrl:string,imageAlt:string,imageHeight:number,imageWidth:number,markers:array(object({answers:defaulted(array(string),()=>[]),label:string,x:number,y:number})),hideChoicesFromInstructions:boolean,multipleAnswers:boolean
|
|
107
|
+
const parseLabelImageWidget=parseWidget(constant("label-image"),object({choices:array(string),imageUrl:string,imageAlt:string,imageHeight:number,imageWidth:number,markers:array(object({answers:defaulted(array(string),()=>[]),label:string,x:number,y:number})),hideChoicesFromInstructions:boolean,multipleAnswers:boolean}));
|
|
108
108
|
|
|
109
109
|
const matcherOptions=object({labels:array(string),left:array(string),right:array(string),orderMatters:boolean,padding:boolean});function getDefaultOptions$1(){return {left:["$x$","$y$","$z$"],right:["$1$","$2$","$3$"],labels:["test","label"],orderMatters:false,padding:true}}const parseMatcherWidget=parseWidget(constant("matcher"),defaulted(matcherOptions,getDefaultOptions$1));
|
|
110
110
|
|
|
@@ -112,7 +112,7 @@ const numberOrStringOrNaN=union(number).or(string).or(constant(NaN)).parser;cons
|
|
|
112
112
|
|
|
113
113
|
const parseMeasurerWidgetV1=parseWidgetWithVersion(object({major:constant(1),minor:number}),constant("measurer"),object({image:defaulted(parsePerseusImageBackground,()=>({url:null,top:0,left:0})),showProtractor:boolean,showRuler:boolean,rulerLabel:string,rulerTicks:number,rulerPixels:number,rulerLength:number,box:pair(number,number)}));const parseMeasurerWidgetV0=parseWidget(constant("measurer"),object({imageTop:number,imageLeft:number,imageUrl:optional(nullable(string)),showProtractor:boolean,showRuler:boolean,rulerLabel:string,rulerTicks:number,rulerPixels:number,rulerLength:number,box:pair(number,number)}));function migrateV0ToV1$2(v0){const{imageTop,imageLeft,imageUrl,...v1Options}=v0.options;return {...v0,version:{major:1,minor:0},options:{image:{top:imageTop,left:imageLeft,url:imageUrl},...v1Options}}}const parseMeasurerWidget=versionedWidgetOptions(1,parseMeasurerWidgetV1).withMigrationFrom(0,parseMeasurerWidgetV0,migrateV0ToV1$2).parser;
|
|
114
114
|
|
|
115
|
-
const emptyStringToNull=pipeParsers(constant("")).then(convert(()=>null)).parser;const parseNumberLineWidget=parseWidget(constant("number-line"),object({range:array(number),labelRange:array(nullable(union(number).or(emptyStringToNull).parser)),labelStyle:enumeration("decimal","improper","mixed","non-reduced"),labelTicks:boolean,isTickCtrl:defaulted(boolean,()=>false),isInequality:defaulted(boolean,()=>false),divisionRange:array(number),numDivisions:optional(nullable(number)),snapDivisions:defaulted(number,()=>2),tickStep:optional(nullable(number)),correctRel:defaulted(optional(enumeration("eq","lt","gt","le","ge")),()=>undefined),correctX:defaulted(nullable(number),()=>null),initialX:optional(nullable(number)),showTooltips:optional(boolean)
|
|
115
|
+
const emptyStringToNull=pipeParsers(constant("")).then(convert(()=>null)).parser;const parseNumberLineWidget=parseWidget(constant("number-line"),object({range:array(number),labelRange:array(nullable(union(number).or(emptyStringToNull).parser)),labelStyle:enumeration("decimal","improper","mixed","non-reduced"),labelTicks:boolean,isTickCtrl:defaulted(boolean,()=>false),isInequality:defaulted(boolean,()=>false),divisionRange:array(number),numDivisions:optional(nullable(number)),snapDivisions:defaulted(number,()=>2),tickStep:optional(nullable(number)),correctRel:defaulted(optional(enumeration("eq","lt","gt","le","ge")),()=>undefined),correctX:defaulted(nullable(number),()=>null),initialX:optional(nullable(number)),showTooltips:optional(boolean)}));
|
|
116
116
|
|
|
117
117
|
const parseMathFormat=enumeration("integer","mixed","improper","proper","decimal","percent","pi");const parseSimplify=pipeParsers(union(constant(null)).or(constant(undefined)).or(boolean).or(constant("true")).or(constant("required")).or(constant("correct")).or(constant("enforced")).or(constant("optional")).or(constant("accepted")).parser).then(convert(deprecatedSimplifyValuesToRequired)).parser;function deprecatedSimplifyValuesToRequired(simplify){switch(simplify){case "enforced":case "required":case "optional":return simplify;default:return "required"}}const parseNumericInputAnswers=array(object({message:defaulted(string,()=>""),value:optional(nullable(number)),status:string,answerForms:defaulted(optional(array(parseMathFormat)),()=>undefined),strict:defaulted(boolean,()=>false),maxError:optional(nullable(number)),simplify:parseSimplify}));const version1$1=object({major:constant(1),minor:number});const parseNumericInputWidgetV1=parseWidgetWithVersion(version1$1,constant("numeric-input"),object({answers:parseNumericInputAnswers,labelText:optional(string),size:string,coefficient:defaulted(boolean,()=>false),textAlign:defaulted(enumeration("left","right","center"),()=>"left")}));const version0$1=optional(object({major:constant(0),minor:number}));const parseNumericInputWidgetV0=parseWidgetWithVersion(version0$1,constant("numeric-input"),object({answers:parseNumericInputAnswers,labelText:optional(string),size:string,coefficient:defaulted(boolean,()=>false),rightAlign:optional(boolean)}));function migrateV0ToV1$1(widget){const{rightAlign,...options}=widget.options;return {...widget,version:{major:1,minor:0},options:{...options,textAlign:rightAlign?"right":"left"}}}const parseNumericInputWidget=versionedWidgetOptions(1,parseNumericInputWidgetV1).withMigrationFrom(0,parseNumericInputWidgetV0,migrateV0ToV1$1).parser;
|
|
118
118
|
|
|
@@ -132,7 +132,7 @@ const parseSorterWidget=parseWidget(constant("sorter"),object({correct:array(str
|
|
|
132
132
|
|
|
133
133
|
const parseTableWidget=parseWidget(constant("table"),object({headers:array(string),rows:number,columns:number,answers:defaulted(array(array(string)),()=>[])}));
|
|
134
134
|
|
|
135
|
-
const parseVideoWidget=parseWidget(constant("video"),object({location:string
|
|
135
|
+
const parseVideoWidget=parseWidget(constant("video"),object({location:string}));
|
|
136
136
|
|
|
137
137
|
const parseStringToNonNegativeInt=(rawValue,ctx)=>{if(typeof rawValue!=="string"||!/^(0|[1-9][0-9]*)$/.test(rawValue)){return ctx.failure("a string representing a non-negative integer",rawValue)}return ctx.success(+rawValue)};const parseWidgetIdComponents=pair(string,parseStringToNonNegativeInt);
|
|
138
138
|
|