@khanacademy/perseus-core 36.1.0 → 38.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/data-schema.d.ts +9 -29
- package/dist/es/index.item-splitting.js +14 -10
- package/dist/es/index.item-splitting.js.map +1 -1
- package/dist/es/index.js +26 -20
- package/dist/es/index.js.map +1 -1
- package/dist/index.d.ts +9 -61
- package/dist/index.item-splitting.js +14 -10
- package/dist/index.item-splitting.js.map +1 -1
- package/dist/index.js +30 -19
- 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/utils/generators/table-widget-generator.d.ts +10 -0
- package/dist/utils/widget-prop-denylist.d.ts +5 -0
- package/dist/validation.types.d.ts +8 -228
- package/dist/widgets/categorizer/categorizer-util.d.ts +0 -1
- package/dist/widgets/categorizer/index.d.ts +0 -1
- package/dist/widgets/cs-program/index.d.ts +0 -1
- package/dist/widgets/definition/index.d.ts +0 -2
- package/dist/widgets/dropdown/dropdown-util.d.ts +0 -1
- package/dist/widgets/dropdown/index.d.ts +0 -1
- package/dist/widgets/explanation/index.d.ts +0 -2
- package/dist/widgets/expression/index.d.ts +0 -1
- package/dist/widgets/free-response/index.d.ts +0 -1
- package/dist/widgets/graded-group/index.d.ts +0 -2
- package/dist/widgets/graded-group-set/index.d.ts +0 -2
- package/dist/widgets/grapher/index.d.ts +0 -1
- package/dist/widgets/group/index.d.ts +0 -1
- package/dist/widgets/iframe/index.d.ts +0 -1
- package/dist/widgets/image/index.d.ts +0 -1
- package/dist/widgets/input-number/index.d.ts +0 -1
- package/dist/widgets/interaction/index.d.ts +0 -2
- package/dist/widgets/interactive-graph/index.d.ts +0 -1
- package/dist/widgets/label-image/index.d.ts +0 -1
- package/dist/widgets/label-image/label-image-util.d.ts +0 -1
- package/dist/widgets/matcher/index.d.ts +0 -1
- package/dist/widgets/matrix/index.d.ts +0 -1
- package/dist/widgets/measurer/index.d.ts +0 -2
- package/dist/widgets/number-line/index.d.ts +0 -1
- package/dist/widgets/number-line/number-line-util.d.ts +1 -1
- package/dist/widgets/numeric-input/index.d.ts +0 -1
- package/dist/widgets/orderer/index.d.ts +0 -1
- package/dist/widgets/orderer/orderer-util.d.ts +11 -1
- package/dist/widgets/phet-simulation/index.d.ts +0 -2
- package/dist/widgets/plotter/index.d.ts +0 -1
- package/dist/widgets/python-program/index.d.ts +0 -2
- package/dist/widgets/radio/index.d.ts +0 -1
- package/dist/widgets/sorter/index.d.ts +0 -1
- package/dist/widgets/sorter/sorter-util.d.ts +12 -1
- package/dist/widgets/table/index.d.ts +0 -1
- package/dist/widgets/video/index.d.ts +0 -2
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -53,128 +53,68 @@ export { default as blankLogic } from "./widgets/blank";
|
|
|
53
53
|
/** @hidden */
|
|
54
54
|
export { default as categorizerLogic } from "./widgets/categorizer";
|
|
55
55
|
/** @hidden */
|
|
56
|
-
export type { CategorizerDefaultWidgetOptions } from "./widgets/categorizer";
|
|
57
|
-
/** @hidden */
|
|
58
56
|
export { default as csProgramLogic } from "./widgets/cs-program";
|
|
59
57
|
/** @hidden */
|
|
60
|
-
export type { CSProgramDefaultWidgetOptions } from "./widgets/cs-program";
|
|
61
|
-
/** @hidden */
|
|
62
58
|
export { default as definitionLogic } from "./widgets/definition";
|
|
63
59
|
/** @hidden */
|
|
64
|
-
export type { DefinitionDefaultWidgetOptions } from "./widgets/definition";
|
|
65
|
-
/** @hidden */
|
|
66
60
|
export { default as dropdownLogic } from "./widgets/dropdown";
|
|
67
61
|
/** @hidden */
|
|
68
|
-
export type { DropdownDefaultWidgetOptions } from "./widgets/dropdown";
|
|
69
|
-
/** @hidden */
|
|
70
62
|
export { default as explanationLogic } from "./widgets/explanation";
|
|
71
63
|
/** @hidden */
|
|
72
|
-
export type { ExplanationDefaultWidgetOptions } from "./widgets/explanation";
|
|
73
|
-
/** @hidden */
|
|
74
64
|
export { default as expressionLogic } from "./widgets/expression";
|
|
75
65
|
/** @hidden */
|
|
76
|
-
export type { ExpressionDefaultWidgetOptions } from "./widgets/expression";
|
|
77
|
-
/** @hidden */
|
|
78
66
|
export { default as deriveExtraKeys } from "./widgets/expression/derive-extra-keys";
|
|
79
67
|
/** @hidden */
|
|
80
68
|
export { default as gradedGroupLogic } from "./widgets/graded-group";
|
|
81
69
|
/** @hidden */
|
|
82
70
|
export { default as freeResponseLogic } from "./widgets/free-response";
|
|
83
71
|
/** @hidden */
|
|
84
|
-
export type { FreeResponseDefaultWidgetOptions } from "./widgets/free-response";
|
|
85
|
-
/** @hidden */
|
|
86
|
-
export type { GradedGroupDefaultWidgetOptions } from "./widgets/graded-group";
|
|
87
|
-
/** @hidden */
|
|
88
72
|
export { default as gradedGroupSetLogic } from "./widgets/graded-group-set";
|
|
89
73
|
/** @hidden */
|
|
90
|
-
export type { GradedGroupSetDefaultWidgetOptions } from "./widgets/graded-group-set";
|
|
91
|
-
/** @hidden */
|
|
92
74
|
export { default as grapherLogic } from "./widgets/grapher";
|
|
93
75
|
/** @hidden */
|
|
94
|
-
export type { GrapherDefaultWidgetOptions } from "./widgets/grapher";
|
|
95
|
-
/** @hidden */
|
|
96
76
|
export { default as groupLogic } from "./widgets/group";
|
|
97
77
|
/** @hidden */
|
|
98
|
-
export type { GroupDefaultWidgetOptions } from "./widgets/group";
|
|
99
|
-
/** @hidden */
|
|
100
78
|
export { default as iframeLogic } from "./widgets/iframe";
|
|
101
79
|
/** @hidden */
|
|
102
|
-
export type { IFrameDefaultWidgetOptions } from "./widgets/iframe";
|
|
103
|
-
/** @hidden */
|
|
104
80
|
export { default as imageLogic } from "./widgets/image";
|
|
105
81
|
/** @hidden */
|
|
106
|
-
export type { ImageDefaultWidgetOptions } from "./widgets/image";
|
|
107
|
-
/** @hidden */
|
|
108
82
|
export { default as inputNumberLogic } from "./widgets/input-number";
|
|
109
83
|
/** @hidden */
|
|
110
|
-
export type { InputNumberDefaultWidgetOptions } from "./widgets/input-number";
|
|
111
|
-
/** @hidden */
|
|
112
84
|
export { default as interactionLogic } from "./widgets/interaction";
|
|
113
85
|
/** @hidden */
|
|
114
|
-
export type { InteractionDefaultWidgetOptions } from "./widgets/interaction";
|
|
115
|
-
/** @hidden */
|
|
116
86
|
export { default as interactiveGraphLogic } from "./widgets/interactive-graph";
|
|
117
87
|
/** @hidden */
|
|
118
|
-
export type { InteractiveGraphDefaultWidgetOptions } from "./widgets/interactive-graph";
|
|
119
|
-
/** @hidden */
|
|
120
88
|
export { default as labelImageLogic } from "./widgets/label-image";
|
|
121
89
|
/** @hidden */
|
|
122
|
-
export type { LabelImageDefaultWidgetOptions } from "./widgets/label-image";
|
|
123
|
-
/** @hidden */
|
|
124
90
|
export { default as matcherLogic } from "./widgets/matcher";
|
|
125
91
|
/** @hidden */
|
|
126
|
-
export type { MatcherDefaultWidgetOptions } from "./widgets/matcher";
|
|
127
|
-
/** @hidden */
|
|
128
92
|
export { default as matrixLogic } from "./widgets/matrix";
|
|
129
93
|
/** @hidden */
|
|
130
|
-
export type { MatrixDefaultWidgetOptions } from "./widgets/matrix";
|
|
131
|
-
/** @hidden */
|
|
132
94
|
export { default as measurerLogic } from "./widgets/measurer";
|
|
133
95
|
/** @hidden */
|
|
134
|
-
export type { MeasurerDefaultWidgetOptions } from "./widgets/measurer";
|
|
135
|
-
/** @hidden */
|
|
136
96
|
export { default as numberLineLogic } from "./widgets/number-line";
|
|
137
97
|
/** @hidden */
|
|
138
|
-
export type { NumberLineDefaultWidgetOptions } from "./widgets/number-line";
|
|
139
|
-
/** @hidden */
|
|
140
98
|
export { default as numericInputLogic } from "./widgets/numeric-input";
|
|
141
99
|
/** @hidden */
|
|
142
|
-
export type { NumericInputDefaultWidgetOptions } from "./widgets/numeric-input";
|
|
143
|
-
/** @hidden */
|
|
144
100
|
export { default as ordererLogic } from "./widgets/orderer";
|
|
145
101
|
/** @hidden */
|
|
146
|
-
export type { OrdererDefaultWidgetOptions } from "./widgets/orderer";
|
|
147
|
-
/** @hidden */
|
|
148
102
|
export { default as phetSimulationLogic } from "./widgets/phet-simulation";
|
|
149
103
|
/** @hidden */
|
|
150
|
-
export type { PhetSimulationDefaultWidgetOptions } from "./widgets/phet-simulation";
|
|
151
|
-
/** @hidden */
|
|
152
104
|
export { default as plotterLogic } from "./widgets/plotter";
|
|
153
105
|
/** @hidden */
|
|
154
|
-
export type { PlotterDefaultWidgetOptions } from "./widgets/plotter";
|
|
155
|
-
/** @hidden */
|
|
156
106
|
export { default as pythonProgramLogic } from "./widgets/python-program";
|
|
157
107
|
/** @hidden */
|
|
158
|
-
export type { PythonProgramDefaultWidgetOptions } from "./widgets/python-program";
|
|
159
|
-
/** @hidden */
|
|
160
108
|
export { default as radioLogic } from "./widgets/radio";
|
|
161
109
|
/** @hidden */
|
|
162
|
-
export type { RadioDefaultWidgetOptions } from "./widgets/radio";
|
|
163
|
-
/** @hidden */
|
|
164
110
|
export { usesNumCorrect } from "./widgets/radio/radio-util";
|
|
165
111
|
/** @hidden */
|
|
166
112
|
export { default as sorterLogic } from "./widgets/sorter";
|
|
167
113
|
/** @hidden */
|
|
168
|
-
export type { SorterDefaultWidgetOptions } from "./widgets/sorter";
|
|
169
|
-
/** @hidden */
|
|
170
114
|
export { default as tableLogic } from "./widgets/table";
|
|
171
115
|
/** @hidden */
|
|
172
|
-
export type { TableDefaultWidgetOptions } from "./widgets/table";
|
|
173
|
-
/** @hidden */
|
|
174
116
|
export { default as videoLogic } from "./widgets/video";
|
|
175
117
|
/** @hidden */
|
|
176
|
-
export type { VideoDefaultWidgetOptions } from "./widgets/video";
|
|
177
|
-
/** @hidden */
|
|
178
118
|
export { convertGrapherOptionsToInteractiveGraph, convertGrapherUserInputToInteractiveGraph, convertInteractiveGraphUserInputToGrapher, } from "./widgets/grapher/to-interactive-graph";
|
|
179
119
|
/** @hidden */
|
|
180
120
|
export { applyDefaultsToWidgets, applyDefaultsToWidget, } from "./widgets/apply-defaults";
|
|
@@ -191,7 +131,7 @@ export type * from "./widgets/logic-export.types";
|
|
|
191
131
|
/** @hidden */
|
|
192
132
|
export * as CoreWidgetRegistry from "./widgets/core-widget-registry";
|
|
193
133
|
/** @hidden */
|
|
194
|
-
export { getOrdererPublicWidgetOptions } from "./widgets/orderer/orderer-util";
|
|
134
|
+
export { getOrdererPublicWidgetOptions, mergeCards, toCard, } from "./widgets/orderer/orderer-util";
|
|
195
135
|
/** @hidden */
|
|
196
136
|
export type { OrdererPublicWidgetOptions } from "./widgets/orderer/orderer-util";
|
|
197
137
|
/** @hidden */
|
|
@@ -213,6 +153,8 @@ export type { GrapherPublicWidgetOptions } from "./widgets/grapher/grapher-util"
|
|
|
213
153
|
/** @hidden */
|
|
214
154
|
export { getGroupPublicWidgetOptions } from "./widgets/group/group-util";
|
|
215
155
|
/** @hidden */
|
|
156
|
+
export type { GroupPublicWidgetOptions } from "./widgets/group/group-util";
|
|
157
|
+
/** @hidden */
|
|
216
158
|
export { getInteractiveGraphPublicWidgetOptions, type InteractiveGraphPublicWidgetOptions, } from "./widgets/interactive-graph/interactive-graph-util";
|
|
217
159
|
/** @hidden */
|
|
218
160
|
export { getLabelImagePublicWidgetOptions } from "./widgets/label-image/label-image-util";
|
|
@@ -318,6 +260,12 @@ export { generateRadioOptions, generateRadioChoice, generateSimpleRadioQuestion,
|
|
|
318
260
|
export { generateVideoWidget } from "./utils/generators/video-widget-generator";
|
|
319
261
|
/** @hidden */
|
|
320
262
|
export { generateSorterWidget, generateSorterOptions, } from "./utils/generators/sorter-widget-generator";
|
|
263
|
+
/** @hidden */
|
|
264
|
+
export { generateTableOptions } from "./utils/generators/table-widget-generator";
|
|
265
|
+
/** @hidden */
|
|
266
|
+
export { generateGrapherWidgetOptions } from "./utils/generators/grapher-widget-generator";
|
|
321
267
|
export { getAnswersFromWidgets, injectWidgets, } from "./utils/extract-perseus-ai-data";
|
|
322
268
|
/** @hidden */
|
|
323
269
|
export { getPerseusAIData } from "./utils/extract-perseus-ai-data";
|
|
270
|
+
/** @hidden */
|
|
271
|
+
export { excludeDenylistKeys } from "./utils/widget-prop-denylist";
|
|
@@ -80,15 +80,15 @@ function toValidAlignment(alignment){switch(alignment){case "default":case "bloc
|
|
|
80
80
|
|
|
81
81
|
const parseBlankWidget=parseWidget(constant("blank"),object({displayType:defaulted(enumeration("normal","superscript","subscript"),()=>"normal"),correctId:string}));
|
|
82
82
|
|
|
83
|
-
const parseCategorizerWidget=parseWidget(constant("categorizer"),object({items:array(string),categories:array(string),randomizeItems:defaulted(boolean,()=>false),
|
|
83
|
+
const parseCategorizerWidget=parseWidget(constant("categorizer"),object({items:array(string),categories:array(string),randomizeItems:defaulted(boolean,()=>false),values:defaulted(array(defaulted(number,()=>0)),()=>[])}));
|
|
84
84
|
|
|
85
85
|
const parseCSProgramWidget=parseWidget(constant("cs-program"),object({programID:string,programType:any,settings:array(object({name:string,value:string})),showEditor:boolean,showButtons:boolean,height:number}));
|
|
86
86
|
|
|
87
|
-
const parseDefinitionWidget=parseWidget(constant("definition"),object({togglePrompt:string,definition:string
|
|
87
|
+
const parseDefinitionWidget=parseWidget(constant("definition"),object({togglePrompt:string,definition:string}));
|
|
88
88
|
|
|
89
|
-
const parseDropdownWidget=parseWidget(constant("dropdown"),object({placeholder:defaulted(string,()=>""),ariaLabel:optional(string),visibleLabel:optional(string),
|
|
89
|
+
const parseDropdownWidget=parseWidget(constant("dropdown"),object({placeholder:defaulted(string,()=>""),ariaLabel:optional(string),visibleLabel:optional(string),choices:array(object({content:string,correct:defaulted(boolean,()=>false)}))}));
|
|
90
90
|
|
|
91
|
-
const parseExplanationWidget=parseWidget(constant("explanation"),object({showPrompt:string,hidePrompt:string,explanation:string,widgets:defaulted((rawVal,ctx)=>parseWidgetsMap(rawVal,ctx),()=>({}))
|
|
91
|
+
const parseExplanationWidget=parseWidget(constant("explanation"),object({showPrompt:string,hidePrompt:string,explanation:string,widgets:defaulted((rawVal,ctx)=>parseWidgetsMap(rawVal,ctx),()=>({}))}));
|
|
92
92
|
|
|
93
93
|
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"];
|
|
94
94
|
|
|
@@ -104,7 +104,7 @@ const stringOrNumberOrNullOrUndefined=union(string).or(number).or(constant(null)
|
|
|
104
104
|
|
|
105
105
|
const parseFreeResponseWidget=parseWidget(constant("free-response"),object({allowUnlimitedCharacters:boolean,characterLimit:number,placeholder:string,question:string,scoringCriteria:array(object({text:string}))}));
|
|
106
106
|
|
|
107
|
-
const falseToNull=pipeParsers(constant(false)).then(convert(()=>null)).parser;const parseGradedGroupWidgetOptions=object({title:defaulted(string,()=>""),
|
|
107
|
+
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);
|
|
108
108
|
|
|
109
109
|
const parseGradedGroupSetWidget=parseWidget(constant("graded-group-set"),object({gradedGroups:array(parseGradedGroupWidgetOptions)}));
|
|
110
110
|
|
|
@@ -114,7 +114,7 @@ const pairOfNumbers$3=pair(number,number);const pairOfPoints=pair(pairOfNumbers$
|
|
|
114
114
|
|
|
115
115
|
const parseGroupWidget=parseWidget(constant("group"),(rawVal,ctx)=>parsePerseusRenderer(rawVal,ctx));
|
|
116
116
|
|
|
117
|
-
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)
|
|
117
|
+
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)}));
|
|
118
118
|
|
|
119
119
|
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)};
|
|
120
120
|
|
|
@@ -124,11 +124,11 @@ const pairOfNumbers$2=pair(number,number);const parseImageWidget=parseWidget(con
|
|
|
124
124
|
|
|
125
125
|
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;
|
|
126
126
|
|
|
127
|
-
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({
|
|
127
|
+
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)}));
|
|
128
128
|
|
|
129
129
|
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)}));
|
|
130
130
|
|
|
131
|
-
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
|
|
131
|
+
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}));
|
|
132
132
|
|
|
133
133
|
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));
|
|
134
134
|
|
|
@@ -136,7 +136,7 @@ const numberOrStringOrNaN=union(number).or(string).or(constant(NaN)).parser;cons
|
|
|
136
136
|
|
|
137
137
|
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;
|
|
138
138
|
|
|
139
|
-
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)
|
|
139
|
+
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)}));
|
|
140
140
|
|
|
141
141
|
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;
|
|
142
142
|
|
|
@@ -156,7 +156,7 @@ const parseSorterWidget=parseWidget(constant("sorter"),object({correct:array(str
|
|
|
156
156
|
|
|
157
157
|
const parseTableWidget=parseWidget(constant("table"),object({headers:array(string),rows:number,columns:number,answers:defaulted(array(array(string)),()=>[])}));
|
|
158
158
|
|
|
159
|
-
const parseVideoWidget=parseWidget(constant("video"),object({location:string
|
|
159
|
+
const parseVideoWidget=parseWidget(constant("video"),object({location:string}));
|
|
160
160
|
|
|
161
161
|
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);
|
|
162
162
|
|
|
@@ -188,6 +188,10 @@ class Registry{throwIfUnregistered(){if(!this.anythingRegistered){throw new Erro
|
|
|
188
188
|
|
|
189
189
|
const seededRNG=function(seed){let randomSeed=seed;return function(){let seed=randomSeed;seed=seed+0x7ed55d16+(seed<<12)&0xffffffff;seed=(seed^0xc761c23c^seed>>>19)&0xffffffff;seed=seed+0x165667b1+(seed<<5)&0xffffffff;seed=(seed+0xd3a2646c^seed<<9)&0xffffffff;seed=seed+0xfd7046c5+(seed<<3)&0xffffffff;seed=(seed^0xb55a4f09^seed>>>16)&0xffffffff;return (randomSeed=seed&0xfffffff)/0x10000000}};seededRNG(new Date().getTime()&0xffffffff);
|
|
190
190
|
|
|
191
|
+
function toCard(content){return {content,widgets:{},images:{}}}function getCategoryScore(content){if(/\d/.test(content)){return 0}if(/^\$?[a-zA-Z]+\$?$/.test(content)){return 2}return 1}function mergeCards(correctOptions,otherOptions){const allCards=[...correctOptions,...otherOptions];return [...new Set(allCards.map(card=>card.content))].filter(content=>content!=="").sort().sort((a,b)=>getCategoryScore(a)-getCategoryScore(b)).map(toCard)}
|
|
192
|
+
|
|
193
|
+
const defaultCorrectOptions=[toCard("$x$")];const defaultOtherOptions=[toCard("$y$")];({options:mergeCards(defaultCorrectOptions,defaultOtherOptions)});
|
|
194
|
+
|
|
191
195
|
const defaultRows=4;const defaultColumns=1;new Array(defaultRows).fill(0).map(()=>new Array(defaultColumns).fill(""));
|
|
192
196
|
|
|
193
197
|
const widgets=new Registry("Core widget registry");function getCurrentVersion(type){const widgetLogic=widgets.get(type);return widgetLogic?.version||{major:0,minor:0}}const getPublicWidgetOptionsFunction=type=>{return widgets.get(type)?.getPublicWidgetOptions??(i=>i)};function getDefaultWidgetOptions(type){const widgetLogic=widgets.get(type);return widgetLogic?.defaultWidgetOptions||{}}const getSupportedAlignments=type=>{const widgetLogic=widgets.get(type);if(!widgetLogic?.supportedAlignments?.[0]){return ["default"]}return widgetLogic?.supportedAlignments};
|