@khanacademy/perseus-core 39.2.2 → 40.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/index.d.ts +1 -1
- package/dist/index.js +20 -253
- package/dist/index.js.map +1 -1
- package/dist/widgets/sorter/sorter-util.d.ts +7 -0
- package/package.json +7 -14
- package/dist/es/index.js +0 -467
- package/dist/es/index.js.map +0 -1
package/dist/index.d.ts
CHANGED
|
@@ -161,7 +161,7 @@ export { getInteractiveGraphPublicWidgetOptions, type InteractiveGraphPublicWidg
|
|
|
161
161
|
/** @hidden */
|
|
162
162
|
export { getLabelImagePublicWidgetOptions } from "./widgets/label-image/label-image-util";
|
|
163
163
|
/** @hidden */
|
|
164
|
-
export { getSorterPublicWidgetOptions, shuffleSorter, SORTER_MAX_CARDS, } from "./widgets/sorter/sorter-util";
|
|
164
|
+
export { getSorterPublicWidgetOptions, exceedsCardLimit, shuffleSorter, SORTER_MAX_HORIZONTAL_CARDS, SORTER_MAX_CARDS, } from "./widgets/sorter/sorter-util";
|
|
165
165
|
/** @hidden */
|
|
166
166
|
export type { BlankPublicWidgetOptions } from "./widgets/blank/blank-util";
|
|
167
167
|
/** @hidden */
|
package/dist/index.js
CHANGED
|
@@ -1,37 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
var KAS = require('@khanacademy/kas');
|
|
8
|
-
var perseusUtils = require('@khanacademy/perseus-utils');
|
|
9
|
-
var wonderStuffCore = require('@khanacademy/wonder-stuff-core');
|
|
10
|
-
var pureMarkdown = require('@khanacademy/pure-markdown');
|
|
11
|
-
|
|
12
|
-
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
|
|
13
|
-
|
|
14
|
-
function _interopNamespaceCompat(e) {
|
|
15
|
-
if (e && typeof e === 'object' && 'default' in e) return e;
|
|
16
|
-
var n = Object.create(null);
|
|
17
|
-
if (e) {
|
|
18
|
-
Object.keys(e).forEach(function (k) {
|
|
19
|
-
if (k !== 'default') {
|
|
20
|
-
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
21
|
-
Object.defineProperty(n, k, d.get ? d : {
|
|
22
|
-
enumerable: true,
|
|
23
|
-
get: function () { return e[k]; }
|
|
24
|
-
});
|
|
25
|
-
}
|
|
26
|
-
});
|
|
27
|
-
}
|
|
28
|
-
n.default = e;
|
|
29
|
-
return Object.freeze(n);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
var ___default = /*#__PURE__*/_interopDefaultCompat(_);
|
|
33
|
-
var invariant__default = /*#__PURE__*/_interopDefaultCompat(invariant);
|
|
34
|
-
var KAS__namespace = /*#__PURE__*/_interopNamespaceCompat(KAS);
|
|
1
|
+
import _ from 'underscore';
|
|
2
|
+
import invariant from 'tiny-invariant';
|
|
3
|
+
import * as KAS from '@khanacademy/kas';
|
|
4
|
+
import { addLibraryVersionToPerseusDebug } from '@khanacademy/perseus-utils';
|
|
5
|
+
import { UnreachableCaseError, keys } from '@khanacademy/wonder-stuff-core';
|
|
6
|
+
import { parse as parse$1, traverseContent } from '@khanacademy/pure-markdown';
|
|
35
7
|
|
|
36
8
|
const APPROXIMATED_PI_ERROR="APPROXIMATED_PI_ERROR";const CHOOSE_CORRECT_NUM_ERROR="CHOOSE_CORRECT_NUM_ERROR";const EMPTY_RESPONSE_ERROR="EMPTY_RESPONSE_ERROR";const EXTRA_SYMBOLS_ERROR="EXTRA_SYMBOLS_ERROR";const FILL_ALL_CELLS_ERROR="FILL_ALL_CELLS_ERROR";const INVALID_CHOICE_SELECTION="INVALID_CHOICE_SELECTION";const INVALID_SELECTION_ERROR="INVALID_SELECTION_ERROR";const MISSING_PERCENT_ERROR="MISSING_PERCENT_ERROR";const MULTIPLICATION_SIGN_ERROR="MULTIPLICATION_SIGN_ERROR";const NEEDS_TO_BE_SIMPLIFIED_ERROR="NEEDS_TO_BE_SIMPLIFIED_ERROR";const NOT_NONE_ABOVE_ERROR="NOT_NONE_ABOVE_ERROR";const USER_INPUT_EMPTY="USER_INPUT_EMPTY";const USER_INPUT_TOO_LONG="USER_INPUT_TOO_LONG";const WRONG_CASE_ERROR="WRONG_CASE_ERROR";const WRONG_LETTER_ERROR="WRONG_LETTER_ERROR";const ErrorCodes={APPROXIMATED_PI_ERROR,CHOOSE_CORRECT_NUM_ERROR,EMPTY_RESPONSE_ERROR,EXTRA_SYMBOLS_ERROR,FILL_ALL_CELLS_ERROR,INVALID_CHOICE_SELECTION,INVALID_SELECTION_ERROR,MISSING_PERCENT_ERROR,MULTIPLICATION_SIGN_ERROR,NEEDS_TO_BE_SIMPLIFIED_ERROR,NOT_NONE_ABOVE_ERROR,USER_INPUT_EMPTY,USER_INPUT_TOO_LONG,WRONG_CASE_ERROR,WRONG_LETTER_ERROR};
|
|
37
9
|
|
|
@@ -41,13 +13,13 @@ const getDecimalSeparator=locale=>{switch(locale){case "ka":return ",";default:c
|
|
|
41
13
|
|
|
42
14
|
const localesThatUseColon=["az","bg","cs","da","de","hu","hy","id","it","ky","lt","lv","nb","nl","pl","pt-pt","ro","sv","uk","vi","ro","ru"];const getDivideSymbol=locale=>{if(localesThatUseColon.includes(locale)){return ":"}return "/"};const getDivideSymbolForTex=locale=>{const divideSymbol=getDivideSymbol(locale);return divideSymbol==="/"?"\\div":divideSymbol};
|
|
43
15
|
|
|
44
|
-
function approximateEqual(x,y){if(typeof x==="number"&&typeof y==="number"){return Math.abs(x-y)<1e-9}return x===y}function approximateDeepEqual(x,y){if(Array.isArray(x)&&Array.isArray(y)){if(x.length!==y.length){return false}for(let i=0;i<x.length;i++){if(!approximateDeepEqual(x[i],y[i])){return false}}return true}if(Array.isArray(x)||Array.isArray(y)){return false}if(typeof x==="function"&&typeof y==="function"){return approximateEqual(x,y)}if(typeof x==="function"||typeof y==="function"){return false}if(typeof x==="object"&&typeof y==="object"&&!!x&&!!y){return x===y||
|
|
16
|
+
function approximateEqual(x,y){if(typeof x==="number"&&typeof y==="number"){return Math.abs(x-y)<1e-9}return x===y}function approximateDeepEqual(x,y){if(Array.isArray(x)&&Array.isArray(y)){if(x.length!==y.length){return false}for(let i=0;i<x.length;i++){if(!approximateDeepEqual(x[i],y[i])){return false}}return true}if(Array.isArray(x)||Array.isArray(y)){return false}if(typeof x==="function"&&typeof y==="function"){return approximateEqual(x,y)}if(typeof x==="function"||typeof y==="function"){return false}if(typeof x==="object"&&typeof y==="object"&&!!x&&!!y){return x===y||_.all(x,function(v,k){return approximateDeepEqual(y[k],v)})&&_.all(y,function(v,k){return approximateDeepEqual(x[k],v)})}if(typeof x==="object"&&!!x||typeof y==="object"&&!!y){return false}return approximateEqual(x,y)}
|
|
45
17
|
|
|
46
18
|
function addWidget(id){return `[[☃ ${id}]]`}function getWidgetRegex(){return /\[\[☃ ([A-Za-z0-9- ]+)\]\]/g}function getWidgetIdsFromContent(content){const widgets=[];const localWidgetRegex=getWidgetRegex();let match=localWidgetRegex.exec(content);while(match!==null){widgets.push(match[1]);match=localWidgetRegex.exec(content);}return widgets}function getWidgetIdsFromContentByType(type,content,widgetMap){const rv=[];const widgetIdsInContent=getWidgetIdsFromContent(content);widgetIdsInContent.forEach(widgetId=>{const widget=widgetMap[widgetId];if(widget?.type===type){rv.push(widgetId);}});return rv}
|
|
47
19
|
|
|
48
20
|
function deepClone(obj){return JSON.parse(JSON.stringify(obj))}
|
|
49
21
|
|
|
50
|
-
const MOVABLES={PLOT:"PLOT",PARABOLA:"PARABOLA",SINUSOID:"SINUSOID"};function canonicalSineCoefficients(coeffs){let amplitude=coeffs[0];let angularFrequency=coeffs[1];let phase=coeffs[2];const verticalOffset=coeffs[3];if(amplitude<0){amplitude*=-1;angularFrequency*=-1;phase*=-1;}const period=2*Math.PI;if(angularFrequency<0){angularFrequency*=-1;phase*=-1;phase+=period/2;}while(phase>0){phase-=period;}while(phase<0){phase+=period;}return [amplitude,angularFrequency,phase,verticalOffset]}const PlotDefaults={areEqual:function(coeffs1,coeffs2){return approximateDeepEqual(coeffs1,coeffs2)},movable:MOVABLES.PLOT,getPropsForCoeffs:function(coeffs){return {fn:
|
|
22
|
+
const MOVABLES={PLOT:"PLOT",PARABOLA:"PARABOLA",SINUSOID:"SINUSOID"};function canonicalSineCoefficients(coeffs){let amplitude=coeffs[0];let angularFrequency=coeffs[1];let phase=coeffs[2];const verticalOffset=coeffs[3];if(amplitude<0){amplitude*=-1;angularFrequency*=-1;phase*=-1;}const period=2*Math.PI;if(angularFrequency<0){angularFrequency*=-1;phase*=-1;phase+=period/2;}while(phase>0){phase-=period;}while(phase<0){phase+=period;}return [amplitude,angularFrequency,phase,verticalOffset]}const PlotDefaults={areEqual:function(coeffs1,coeffs2){return approximateDeepEqual(coeffs1,coeffs2)},movable:MOVABLES.PLOT,getPropsForCoeffs:function(coeffs){return {fn:_.partial(this.getFunctionForCoeffs,coeffs)}}};const Linear=_.extend({},PlotDefaults,{url:"https://ka-perseus-graphie.s3.amazonaws.com/67aaf581e6d9ef9038c10558a1f70ac21c11c9f8.png",defaultCoords:[[.25,.75],[.75,.75]],getCoefficients:function(coords){const p1=coords[0];const p2=coords[1];const denom=p2[0]-p1[0];const num=p2[1]-p1[1];if(denom===0){return}const m=num/denom;const b=p2[1]-m*p2[0];return [m,b]},getFunctionForCoeffs:function(coeffs,x){const m=coeffs[0];const b=coeffs[1];return m*x+b},getEquationString:function(coords){const coeffs=this.getCoefficients(coords);const m=coeffs[0];const b=coeffs[1];return "y = "+m.toFixed(3)+"x + "+b.toFixed(3)}});const Quadratic=_.extend({},PlotDefaults,{url:"https://ka-perseus-graphie.s3.amazonaws.com/e23d36e6fc29ee37174e92c9daba2a66677128ab.png",defaultCoords:[[.5,.5],[.75,.75]],movable:MOVABLES.PARABOLA,getCoefficients:function(coords){const p1=coords[0];const p2=coords[1];const h=p1[0];const k=p1[1];const a=(p2[1]-k)/((p2[0]-h)*(p2[0]-h));const b=-2*h*a;const c=a*h*h+k;return [a,b,c]},getFunctionForCoeffs:function(coeffs,x){const a=coeffs[0];const b=coeffs[1];const c=coeffs[2];return (a*x+b)*x+c},getPropsForCoeffs:function(coeffs){return {a:coeffs[0],b:coeffs[1],c:coeffs[2]}},getEquationString:function(coords){const coeffs=this.getCoefficients(coords);const a=coeffs[0];const b=coeffs[1];const c=coeffs[2];return "y = "+a.toFixed(3)+"x^2 + "+b.toFixed(3)+"x + "+c.toFixed(3)}});const Sinusoid=_.extend({},PlotDefaults,{url:"https://ka-perseus-graphie.s3.amazonaws.com/3d68e7718498475f53b206c2ab285626baf8857e.png",defaultCoords:[[.5,.5],[.6,.6]],movable:MOVABLES.SINUSOID,getCoefficients:function(coords){const p1=coords[0];const p2=coords[1];const a=p2[1]-p1[1];const b=Math.PI/(2*(p2[0]-p1[0]));const c=p1[0]*b;const d=p1[1];return [a,b,c,d]},getFunctionForCoeffs:function(coeffs,x){const a=coeffs[0];const b=coeffs[1];const c=coeffs[2];const d=coeffs[3];return a*Math.sin(b*x-c)+d},getPropsForCoeffs:function(coeffs){return {a:coeffs[0],b:coeffs[1],c:coeffs[2],d:coeffs[3]}},getEquationString:function(coords){const coeffs=this.getCoefficients(coords);const a=coeffs[0];const b=coeffs[1];const c=coeffs[2];const d=coeffs[3];return "y = "+a.toFixed(3)+" sin("+b.toFixed(3)+"x - "+c.toFixed(3)+") + "+d.toFixed(3)},areEqual:function(coeffs1,coeffs2){return approximateDeepEqual(canonicalSineCoefficients(coeffs1),canonicalSineCoefficients(coeffs2))}});const Tangent=_.extend({},PlotDefaults,{url:"https://ka-perseus-graphie.s3.amazonaws.com/7db80d23c35214f98659fe1cf0765811c1bbfbba.png",defaultCoords:[[.5,.5],[.75,.75]],getCoefficients:function(coords){const p1=coords[0];const p2=coords[1];const a=p2[1]-p1[1];const b=Math.PI/(4*(p2[0]-p1[0]));const c=p1[0]*b;const d=p1[1];return [a,b,c,d]},getFunctionForCoeffs:function(coeffs,x){const a=coeffs[0];const b=coeffs[1];const c=coeffs[2];const d=coeffs[3];return a*Math.tan(b*x-c)+d},getEquationString:function(coords){const coeffs=this.getCoefficients(coords);const a=coeffs[0];const b=coeffs[1];const c=coeffs[2];const d=coeffs[3];return "y = "+a.toFixed(3)+" tan("+b.toFixed(3)+"x - "+c.toFixed(3)+") + "+d.toFixed(3)}});const Exponential=_.extend({},PlotDefaults,{url:"https://ka-perseus-graphie.s3.amazonaws.com/9cbfad55525e3ce755a31a631b074670a5dad611.png",defaultCoords:[[.5,.55],[.75,.75]],defaultAsymptote:[[0,.5],[1,.5]],extraCoordConstraint:function(newCoord,oldCoord,coords,asymptote,graph){const y=asymptote[0][1];return _.all(coords,coord=>coord[1]!==y)},extraAsymptoteConstraint:function(newCoord,oldCoord,coords,asymptote,graph){const y=newCoord[1];const isValid=_.all(coords,coord=>coord[1]>y)||_.all(coords,coord=>coord[1]<y);if(isValid){return [oldCoord[0],y]}const oldY=oldCoord[1];const wasBelow=_.all(coords,coord=>coord[1]>oldY);if(wasBelow){const bottomMost=_.min(coords.map(coord=>coord[1]));return [oldCoord[0],bottomMost-graph.snapStep[1]]}const topMost=_.max(coords.map(coord=>coord[1]));return [oldCoord[0],topMost+graph.snapStep[1]]},allowReflectOverAsymptote:true,getCoefficients:function(coords,asymptote){const p1=coords[0];const p2=coords[1];const c=asymptote[0][1];const b=Math.log((p1[1]-c)/(p2[1]-c))/(p1[0]-p2[0]);const a=(p1[1]-c)/Math.exp(b*p1[0]);return [a,b,c]},getFunctionForCoeffs:function(coeffs,x){const a=coeffs[0];const b=coeffs[1];const c=coeffs[2];return a*Math.exp(b*x)+c},getEquationString:function(coords,asymptote){if(!asymptote){return null}const coeffs=this.getCoefficients(coords,asymptote);const a=coeffs[0];const b=coeffs[1];const c=coeffs[2];return "y = "+a.toFixed(3)+"e^("+b.toFixed(3)+"x) + "+c.toFixed(3)}});const Logarithm=_.extend({},PlotDefaults,{url:"https://ka-perseus-graphie.s3.amazonaws.com/f6491e99d34af34d924bfe0231728ad912068dc3.png",defaultCoords:[[.55,.5],[.75,.75]],defaultAsymptote:[[.5,0],[.5,1]],extraCoordConstraint:function(newCoord,oldCoord,coords,asymptote,graph){const x=asymptote[0][0];return _.all(coords,coord=>coord[0]!==x)&&coords[0][1]!==coords[1][1]},extraAsymptoteConstraint:function(newCoord,oldCoord,coords,asymptote,graph){const x=newCoord[0];const isValid=_.all(coords,coord=>coord[0]>x)||_.all(coords,coord=>coord[0]<x);if(isValid){return [x,oldCoord[1]]}const oldX=oldCoord[0];const wasLeft=_.all(coords,coord=>coord[0]>oldX);if(wasLeft){const leftMost=_.min(coords.map(coord=>coord[0]));return [leftMost-graph.snapStep[0],oldCoord[1]]}const rightMost=_.max(coords.map(coord=>coord[0]));return [rightMost+graph.snapStep[0],oldCoord[1]]},allowReflectOverAsymptote:true,getCoefficients:function(coords,asymptote){const flip=coord=>[coord[1],coord[0]];const inverseCoeffs=Exponential.getCoefficients(coords.map(flip),asymptote.map(flip));if(inverseCoeffs){const c=-inverseCoeffs[2]/inverseCoeffs[0];const b=1/inverseCoeffs[0];const a=1/inverseCoeffs[1];return [a,b,c]}},getFunctionForCoeffs:function(coeffs,x,asymptote){const a=coeffs[0];const b=coeffs[1];const c=coeffs[2];return a*Math.log(b*x+c)},getEquationString:function(coords,asymptote){if(!asymptote){return null}const coeffs=this.getCoefficients(coords,asymptote);const a=coeffs[0];const b=coeffs[1];const c=coeffs[2];return "y = ln("+a.toFixed(3)+"x + "+b.toFixed(3)+") + "+c.toFixed(3)}});const AbsoluteValue=_.extend({},PlotDefaults,{url:"https://ka-perseus-graphie.s3.amazonaws.com/8256a630175a0cb1d11de223d6de0266daf98721.png",defaultCoords:[[.5,.5],[.75,.75]],getCoefficients:function(coords){const p1=coords[0];const p2=coords[1];const denom=p2[0]-p1[0];const num=p2[1]-p1[1];if(denom===0){return}let m=Math.abs(num/denom);if(p2[1]<p1[1]){m*=-1;}const horizontalOffset=p1[0];const verticalOffset=p1[1];return [m,horizontalOffset,verticalOffset]},getFunctionForCoeffs:function(coeffs,x){const m=coeffs[0];const horizontalOffset=coeffs[1];const verticalOffset=coeffs[2];return m*Math.abs(x-horizontalOffset)+verticalOffset},getEquationString:function(coords){const coeffs=this.getCoefficients(coords);const m=coeffs[0];const horizontalOffset=coeffs[1];const verticalOffset=coeffs[2];return "y = "+m.toFixed(3)+"| x - "+horizontalOffset.toFixed(3)+"| + "+verticalOffset.toFixed(3)}});const functionTypeMapping={linear:Linear,quadratic:Quadratic,sinusoid:Sinusoid,tangent:Tangent,exponential:Exponential,logarithm:Logarithm,absolute_value:AbsoluteValue};const allTypes=Object.keys(functionTypeMapping);function functionForType(type){return functionTypeMapping[type]}
|
|
51
23
|
|
|
52
24
|
var grapherUtil = /*#__PURE__*/Object.freeze({
|
|
53
25
|
__proto__: null,
|
|
@@ -132,7 +104,7 @@ const parseExplanationWidget=parseWidget(constant("explanation"),object({showPro
|
|
|
132
104
|
|
|
133
105
|
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"];
|
|
134
106
|
|
|
135
|
-
function deriveExtraKeys(widgetOptions){if(widgetOptions.extraKeys){return widgetOptions.extraKeys}const defaultKeys=["PI"];if(widgetOptions.answerForms==null){return defaultKeys}const uniqueExtraVariables={};const uniqueExtraConstants={};for(const answerForm of widgetOptions.answerForms){const maybeExpr=
|
|
107
|
+
function deriveExtraKeys(widgetOptions){if(widgetOptions.extraKeys){return widgetOptions.extraKeys}const defaultKeys=["PI"];if(widgetOptions.answerForms==null){return defaultKeys}const uniqueExtraVariables={};const uniqueExtraConstants={};for(const answerForm of widgetOptions.answerForms){const maybeExpr=KAS.parse(answerForm.value,widgetOptions);if(maybeExpr.parsed){const expr=maybeExpr.expr;const isGreek=symbol=>symbol==="pi"||symbol==="theta";const toKey=symbol=>isGreek(symbol)?symbol.toUpperCase():symbol;const isKey=key=>KeypadKeys.includes(key);for(const variable of expr.getVars()){const maybeKey=toKey(variable);if(isKey(maybeKey)){uniqueExtraVariables[maybeKey]=true;}}for(const constant of expr.getConsts()){const maybeKey=toKey(constant);if(isKey(maybeKey)){uniqueExtraConstants[maybeKey]=true;}}}}const extraVariables=Object.keys(uniqueExtraVariables).sort();const extraConstants=Object.keys(uniqueExtraConstants).sort();const extraKeys=[...extraVariables,...extraConstants];if(!extraKeys.length){return defaultKeys}return extraKeys}
|
|
136
108
|
|
|
137
109
|
const keypadKeys=enumeration("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");
|
|
138
110
|
|
|
@@ -260,7 +232,7 @@ const parseUserInputMap=(rawValue,ctx)=>{if(!isPlainObject(rawValue)){return ctx
|
|
|
260
232
|
|
|
261
233
|
function parseAndMigratePerseusItem(data){const object=typeof data==="string"?JSON.parse(data):data;const result=parse(object,parsePerseusItem);if(isFailure(result)){return failure({message:result.detail,invalidObject:object})}return result}function parseAndMigratePerseusArticle(data){const object=typeof data==="string"?JSON.parse(data):data;const result=parse(object,parsePerseusArticle);if(isFailure(result)){return failure({message:result.detail,invalidObject:object})}return result}function parseAndMigrateUserInputMap(data){const object=typeof data==="string"?JSON.parse(data):data;const result=parse(object,parseUserInputMap);if(isFailure(result)){return failure({message:result.detail,invalidObject:object})}return result}function parseAndMigratePerseusRenderer(data){const object=typeof data==="string"?JSON.parse(data):data;const result=parse(object,parsePerseusRenderer);if(isFailure(result)){return failure({message:result.detail,invalidObject:object})}return result}
|
|
262
234
|
|
|
263
|
-
const libName="@khanacademy/perseus-core";const libVersion="
|
|
235
|
+
const libName="@khanacademy/perseus-core";const libVersion="40.0.0";addLibraryVersionToPerseusDebug(libName,libVersion);
|
|
264
236
|
|
|
265
237
|
const Errors=Object.freeze({Unknown:"Unknown",Internal:"Internal",InvalidInput:"InvalidInput",NotAllowed:"NotAllowed",TransientService:"TransientService",Service:"Service"});
|
|
266
238
|
|
|
@@ -268,7 +240,7 @@ class PerseusError extends Error{constructor(message,kind,options){super(message
|
|
|
268
240
|
|
|
269
241
|
const ItemExtras=["calculator","financialCalculatorMonthlyPayment","financialCalculatorTotalAmount","financialCalculatorTimeToPayOff","periodicTable","periodicTableWithKey"];const PerseusExpressionAnswerFormConsidered=["correct","wrong","ungraded"];const lockedFigureColorNames=["blue","gold","green","grayH","purple","pink","red"];const lockedFigureColors={blue:"var(--wb-semanticColor-learning-math-foreground-blue)",gold:"var(--wb-semanticColor-learning-math-foreground-gold)",grayH:"var(--wb-semanticColor-learning-math-foreground-grayH)",green:"var(--wb-semanticColor-learning-math-foreground-green)",pink:"var(--wb-semanticColor-learning-math-foreground-pink)",purple:"var(--wb-semanticColor-learning-math-foreground-purple)",red:"var(--wb-semanticColor-learning-math-foreground-red)"};const lockedFigureFillStyles={none:0,white:1,translucent:.4,solid:1};const plotterPlotTypes=["bar","line","pic","histogram","dotplot"];
|
|
270
242
|
|
|
271
|
-
const pluck=function(table,subKey){return
|
|
243
|
+
const pluck=function(table,subKey){return _.object(_.map(table,function(value,key){return [key,value[subKey]]}))};const mapObject=function(obj,lambda){const result={};Object.keys(obj).forEach(key=>{result[key]=lambda(obj[key],key);});return result};
|
|
272
244
|
|
|
273
245
|
function getBlankPublicWidgetOptions(options){const{correctId,...publicWidgetOptions}=options;return publicWidgetOptions}
|
|
274
246
|
|
|
@@ -336,7 +308,7 @@ function getLabelImagePublicWidgetOptions(options){return {...options,markers:op
|
|
|
336
308
|
|
|
337
309
|
const defaultWidgetOptions$f={choices:[],imageAlt:"",imageUrl:"",imageWidth:0,imageHeight:0,markers:[],multipleAnswers:false,hideChoicesFromInstructions:false};const labelImageWidgetLogic={name:"label-image",defaultWidgetOptions: defaultWidgetOptions$f,getPublicWidgetOptions:getLabelImagePublicWidgetOptions,accessible:isLabelImageAccessible};
|
|
338
310
|
|
|
339
|
-
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}};function shuffle(array,randomSeed,ensurePermuted=false){let random;if(typeof randomSeed==="function"){random=randomSeed;}else {random=seededRNG(randomSeed);}function isValidShuffle(shuffled){return ensurePermuted?!
|
|
311
|
+
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}};function shuffle(array,randomSeed,ensurePermuted=false){let random;if(typeof randomSeed==="function"){random=randomSeed;}else {random=seededRNG(randomSeed);}function isValidShuffle(shuffled){return ensurePermuted?!_.isEqual(array,shuffled):true}return constrainedShuffle(array,random,isValidShuffle)}function constrainedShuffle(array,random,isValidShuffle){const maxIterations=100;const shuffled=[...array];if(shuffled.every(value=>_.isEqual(value,shuffled[0]))){return shuffled}for(let i=0;i<maxIterations;i++){shuffleInPlace(shuffled,random);if(isValidShuffle(shuffled)){return shuffled}}throw new Error(`constrainedShuffle: constraint not met after ${maxIterations} attempts`)}function shuffleInPlace(a,random){for(let i=a.length-1;i>0;i--){const k=randomIntInRange(0,i,random);[a[k],a[i]]=[a[i],a[k]];}}function randomIntInRange(min,max,random){return Math.floor(random()*(max-min+1))+min}const random=seededRNG(new Date().getTime()&0xffffffff);
|
|
340
312
|
|
|
341
313
|
const shuffleMatcher=(options,problemNum)=>{const rng=seededRNG(problemNum);return {left:!options.orderMatters?options.left:shuffleDisplacingFirst$1(options.left,rng),right:shuffleDisplacingFirst$1(options.right,rng)}};function getMatcherPublicWidgetOptions(options){return {...options,left:options.orderMatters?sortAllButFirst$1(options.left):options.left,right:sortAllButFirst$1(options.right)}}function sortAllButFirst$1([first,...rest]){return [first,...rest.sort()]}function shuffleDisplacingFirst$1(array,rng){function isFirstElementDisplaced(shuffled){return shuffled[0]!==array[0]}return constrainedShuffle(array,rng,isFirstElementDisplaced)}
|
|
342
314
|
|
|
@@ -370,7 +342,7 @@ function getRadioChoicePublicData(choice){const{id,content,isNoneOfTheAbove}=cho
|
|
|
370
342
|
|
|
371
343
|
const currentVersion={major:3,minor:0};const defaultWidgetOptions$5={choices:[{content:"",id:"radio-choice-0"},{content:"",id:"radio-choice-1"},{content:"",id:"radio-choice-2"},{content:"",id:"radio-choice-3"}],randomize:false,hasNoneOfTheAbove:false,multipleSelect:false,countChoices:false,deselectEnabled:false};const radioWidgetLogic={name:"radio",version:currentVersion,defaultWidgetOptions:defaultWidgetOptions$5,getPublicWidgetOptions:getRadioPublicWidgetOptions,accessible:true};
|
|
372
344
|
|
|
373
|
-
const SORTER_MAX_CARDS=10;function getSorterPublicWidgetOptions(options){return {...options,correct:sortAllButFirst(options.correct)}}function shuffleSorter(options,problemNum){const{correct}=options;const rng=seededRNG(problemNum??0);return shuffleDisplacingFirst(correct,rng)}function sortAllButFirst(cards){if(cards.length===0){return []}const[first,...rest]=cards;return [first,...rest.sort()]}function shuffleDisplacingFirst(array,rng){function isFirstElementDisplaced(shuffled){return shuffled[0]!==array[0]}return constrainedShuffle(array,rng,isFirstElementDisplaced)}
|
|
345
|
+
const SORTER_MAX_CARDS=10;function exceedsCardLimit(correct){return correct.length>SORTER_MAX_CARDS}const SORTER_MAX_HORIZONTAL_CARDS=5;function getSorterPublicWidgetOptions(options){return {...options,correct:sortAllButFirst(options.correct)}}function shuffleSorter(options,problemNum){const{correct}=options;const rng=seededRNG(problemNum??0);return shuffleDisplacingFirst(correct,rng)}function sortAllButFirst(cards){if(cards.length===0){return []}const[first,...rest]=cards;return [first,...rest.sort()]}function shuffleDisplacingFirst(array,rng){function isFirstElementDisplaced(shuffled){return shuffled[0]!==array[0]}return constrainedShuffle(array,rng,isFirstElementDisplaced)}
|
|
374
346
|
|
|
375
347
|
const defaultWidgetOptions$4={correct:["$x$","$y$","$z$"],layout:"horizontal",padding:true};const sorterWidgetLogic={name:"sorter",defaultWidgetOptions: defaultWidgetOptions$4,getPublicWidgetOptions:getSorterPublicWidgetOptions,accessible:false};
|
|
376
348
|
|
|
@@ -409,19 +381,19 @@ function getFreeResponsePublicWidgetOptions(options){return {allowUnlimitedChara
|
|
|
409
381
|
|
|
410
382
|
const defaultWidgetOptions={allowUnlimitedCharacters:false,characterLimit:500,placeholder:"Please provide response here",question:"",scoringCriteria:[{text:""}]};const freeResponseWidgetLogic={name:"free-response",defaultWidgetOptions,getPublicWidgetOptions:getFreeResponsePublicWidgetOptions};
|
|
411
383
|
|
|
412
|
-
function convertGrapherOptionsToInteractiveGraph(grapherOptions){if(grapherOptions.availableTypes.length!==1){return null}const[type]=grapherOptions.availableTypes;if(type==="quadratic"){return null}const graph={type:grapherFunctionTypeToInteractiveGraphType(type)};return {step:grapherOptions.graph.step,gridStep:grapherOptions.graph.gridStep,snapStep:grapherOptions.graph.snapStep,backgroundImage:grapherOptions.graph.backgroundImage,markings:grapherOptions.graph.markings,labels:grapherOptions.graph.labels.map(wrapTexInDelimitersForMarkdown),labelLocation:"onAxis",showAxisArrows:{xMin:true,xMax:true,yMin:true,yMax:true},showAxisTicks:{x:true,y:true},showProtractor:grapherOptions.graph.showProtractor??false,showTooltips:grapherOptions.graph.showTooltips??false,range:grapherOptions.graph.range,graph,correct:grapherOptions.correct?grapherAnswerTypesToPerseusGraphType(grapherOptions.correct):graph,lockedFigures:[]}}function convertGrapherUserInputToInteractiveGraph(grapherUserInput){return grapherAnswerTypesToPerseusGraphType(grapherUserInput)}function convertInteractiveGraphUserInputToGrapher(interactiveGraphUserInput){switch(interactiveGraphUserInput.type){case "absolute-value":return {type:"absolute_value",coords:interactiveGraphUserInput.coords??null};case "exponential":{
|
|
384
|
+
function convertGrapherOptionsToInteractiveGraph(grapherOptions){if(grapherOptions.availableTypes.length!==1){return null}const[type]=grapherOptions.availableTypes;if(type==="quadratic"){return null}const graph={type:grapherFunctionTypeToInteractiveGraphType(type)};return {step:grapherOptions.graph.step,gridStep:grapherOptions.graph.gridStep,snapStep:grapherOptions.graph.snapStep,backgroundImage:grapherOptions.graph.backgroundImage,markings:grapherOptions.graph.markings,labels:grapherOptions.graph.labels.map(wrapTexInDelimitersForMarkdown),labelLocation:"onAxis",showAxisArrows:{xMin:true,xMax:true,yMin:true,yMax:true},showAxisTicks:{x:true,y:true},showProtractor:grapherOptions.graph.showProtractor??false,showTooltips:grapherOptions.graph.showTooltips??false,range:grapherOptions.graph.range,graph,correct:grapherOptions.correct?grapherAnswerTypesToPerseusGraphType(grapherOptions.correct):graph,lockedFigures:[]}}function convertGrapherUserInputToInteractiveGraph(grapherUserInput){return grapherAnswerTypesToPerseusGraphType(grapherUserInput)}function convertInteractiveGraphUserInputToGrapher(interactiveGraphUserInput){switch(interactiveGraphUserInput.type){case "absolute-value":return {type:"absolute_value",coords:interactiveGraphUserInput.coords??null};case "exponential":{invariant(interactiveGraphUserInput.asymptote!=null,"exponential graph asymptote must not be nullish in user input");const asymptoteY=interactiveGraphUserInput.asymptote;return {type:"exponential",coords:interactiveGraphUserInput.coords??null,asymptote:[[0,asymptoteY],[1,asymptoteY]]}}case "linear":return {type:"linear",coords:interactiveGraphUserInput.coords??null};case "logarithm":{invariant(interactiveGraphUserInput.asymptote!=null,"logarithm graph asymptote must not be nullish in user input");const asymptoteX=interactiveGraphUserInput.asymptote;return {type:"logarithm",coords:interactiveGraphUserInput.coords??null,asymptote:[[asymptoteX,0],[asymptoteX,1]]}}case "sinusoid":return {type:"sinusoid",coords:interactiveGraphUserInput.coords??null};case "tangent":return {type:"tangent",coords:interactiveGraphUserInput.coords??null};case "angle":case "circle":case "linear-system":case "none":case "point":case "polygon":case "quadratic":case "ray":case "segment":case "vector":throw Error("Can't convert interactive-graph user input to grapher user input. Type: "+interactiveGraphUserInput.type);default:throw new UnreachableCaseError(interactiveGraphUserInput)}}function grapherAnswerTypesToPerseusGraphType(grapherAnswerTypes){switch(grapherAnswerTypes.type){case "absolute_value":return {type:"absolute-value",coords:grapherAnswerTypes.coords};case "exponential":return {type:"exponential",coords:grapherAnswerTypes.coords,asymptote:grapherAnswerTypes.asymptote[0][1]};case "linear":return {type:"linear",coords:grapherAnswerTypes.coords};case "logarithm":return {type:"logarithm",coords:grapherAnswerTypes.coords,asymptote:grapherAnswerTypes.asymptote[0][0]};case "quadratic":throw Error("Can't convert GrapherAnswerTypes to interactive graph. Type: quadratic");case "sinusoid":return {type:"sinusoid",coords:grapherAnswerTypes.coords};case "tangent":return {type:"tangent",coords:grapherAnswerTypes.coords};default:throw new UnreachableCaseError(grapherAnswerTypes)}}function grapherFunctionTypeToInteractiveGraphType(type){return type==="absolute_value"?"absolute-value":type}function wrapTexInDelimitersForMarkdown(tex){return `$${tex}$`}
|
|
413
385
|
|
|
414
386
|
function getDefaultAnswerArea(){return {...ItemExtras.reduce((acc,curr)=>({...acc,[curr]:false}),{}),calculatorVariant:undefined}}
|
|
415
387
|
|
|
416
|
-
const DEFAULT_COLOR="grayH";function getDefaultFigureForType(type){switch(type){case "point":return {type:"point",coord:[0,0],color:DEFAULT_COLOR,filled:true,labels:[]};case "line":return {type:"line",kind:"line",points:[getDefaultFigureForType("point"),{...getDefaultFigureForType("point"),coord:[2,2]}],color:DEFAULT_COLOR,lineStyle:"solid",showPoint1:false,showPoint2:false,weight:"medium",labels:[]};case "vector":return {type:"vector",points:[[0,0],[2,2]],color:DEFAULT_COLOR,weight:"medium",labels:[]};case "ellipse":return {type:"ellipse",center:[0,0],radius:[1,1],angle:0,color:DEFAULT_COLOR,fillStyle:"none",strokeStyle:"solid",weight:"medium",labels:[]};case "polygon":return {type:"polygon",points:[[0,2],[-1,0],[1,0]],color:DEFAULT_COLOR,showVertices:false,fillStyle:"none",strokeStyle:"solid",weight:"medium",labels:[]};case "function":return {type:"function",color:DEFAULT_COLOR,strokeStyle:"solid",weight:"medium",equation:"x^2",domain:[-Infinity,Infinity],directionalAxis:"x",labels:[]};case "label":return {type:"label",coord:[0,0],text:"label",color:DEFAULT_COLOR,size:"medium"};default:throw new
|
|
388
|
+
const DEFAULT_COLOR="grayH";function getDefaultFigureForType(type){switch(type){case "point":return {type:"point",coord:[0,0],color:DEFAULT_COLOR,filled:true,labels:[]};case "line":return {type:"line",kind:"line",points:[getDefaultFigureForType("point"),{...getDefaultFigureForType("point"),coord:[2,2]}],color:DEFAULT_COLOR,lineStyle:"solid",showPoint1:false,showPoint2:false,weight:"medium",labels:[]};case "vector":return {type:"vector",points:[[0,0],[2,2]],color:DEFAULT_COLOR,weight:"medium",labels:[]};case "ellipse":return {type:"ellipse",center:[0,0],radius:[1,1],angle:0,color:DEFAULT_COLOR,fillStyle:"none",strokeStyle:"solid",weight:"medium",labels:[]};case "polygon":return {type:"polygon",points:[[0,2],[-1,0],[1,0]],color:DEFAULT_COLOR,showVertices:false,fillStyle:"none",strokeStyle:"solid",weight:"medium",labels:[]};case "function":return {type:"function",color:DEFAULT_COLOR,strokeStyle:"solid",weight:"medium",equation:"x^2",domain:[-Infinity,Infinity],directionalAxis:"x",labels:[]};case "label":return {type:"label",coord:[0,0],text:"label",color:DEFAULT_COLOR,size:"medium"};default:throw new UnreachableCaseError(type)}}
|
|
417
389
|
|
|
418
390
|
function splitPerseusItem(original){const item=deepClone(original);return {...item,question:splitPerseusRenderer(item.question),hints:original.hints.map(()=>({content:"",widgets:{},images:{},placeholder:true}))}}function splitPerseusItemJSON(data){const parseResult=parseAndMigratePerseusItem(data);if(isFailure(parseResult)){throw new SyntaxError(parseResult.detail.message)}const item=parseResult.value;return JSON.stringify(splitPerseusItem(item))}
|
|
419
391
|
|
|
420
392
|
const PerseusFeatureFlags=["perseus-renderer-upgrade","desmos-calculator","article-extras","dnd-widget-fitb"];function isFeatureOn(props,flag){return props.apiOptions?.flags?.[flag]??false}
|
|
421
393
|
|
|
422
|
-
const noop=function(){};const deepCallbackFor=function(contentCallback,widgetCallback,optionsCallback){const deepCallback=function(widgetInfo,widgetId){const newWidgetInfo=traverseChildWidgets(widgetInfo,rendererOptions=>{return traverseRenderer(rendererOptions,contentCallback,deepCallback,optionsCallback)});const userWidgetInfo=widgetCallback(newWidgetInfo,widgetId);if(userWidgetInfo!==undefined){return userWidgetInfo}return newWidgetInfo};return deepCallback};const traverseRenderer=function(rendererOptions,contentCallback,deepWidgetCallback,optionsCallback){let newContent=rendererOptions.content;if(rendererOptions.content!=null){const modifiedContent=contentCallback(rendererOptions.content);if(modifiedContent!==undefined){newContent=modifiedContent;}}const newWidgets=mapObject(rendererOptions.widgets||{},function(widgetInfo,widgetId){if(widgetInfo==null||widgetInfo.type==null){return widgetInfo}return deepWidgetCallback(widgetInfo,widgetId)});const newOptions=
|
|
394
|
+
const noop=function(){};const deepCallbackFor=function(contentCallback,widgetCallback,optionsCallback){const deepCallback=function(widgetInfo,widgetId){const newWidgetInfo=traverseChildWidgets(widgetInfo,rendererOptions=>{return traverseRenderer(rendererOptions,contentCallback,deepCallback,optionsCallback)});const userWidgetInfo=widgetCallback(newWidgetInfo,widgetId);if(userWidgetInfo!==undefined){return userWidgetInfo}return newWidgetInfo};return deepCallback};const traverseRenderer=function(rendererOptions,contentCallback,deepWidgetCallback,optionsCallback){let newContent=rendererOptions.content;if(rendererOptions.content!=null){const modifiedContent=contentCallback(rendererOptions.content);if(modifiedContent!==undefined){newContent=modifiedContent;}}const newWidgets=mapObject(rendererOptions.widgets||{},function(widgetInfo,widgetId){if(widgetInfo==null||widgetInfo.type==null){return widgetInfo}return deepWidgetCallback(widgetInfo,widgetId)});const newOptions=_.extend({},rendererOptions,{content:newContent,widgets:newWidgets});const userOptions=optionsCallback(newOptions);if(userOptions!==undefined){return userOptions}return newOptions};const traverse=function(rendererOptions,contentCallback,widgetCallback,optionsCallback){contentCallback=contentCallback||noop;widgetCallback=widgetCallback||noop;optionsCallback=optionsCallback||noop;return traverseRenderer(rendererOptions,contentCallback,deepCallbackFor(contentCallback,widgetCallback,optionsCallback),optionsCallback)};
|
|
423
395
|
|
|
424
|
-
function isItemAccessible(itemData){const ast=
|
|
396
|
+
function isItemAccessible(itemData){const ast=parse$1(itemData.question.content);const widgetIdsInUse=getWidgetIdsFromContent(itemData.question.content);let hasInaccessibleImage=false;traverseContent(ast,node=>{if(node.type==="image"&&(node.alt==null||node.alt==="")){hasInaccessibleImage=true;}});if(hasInaccessibleImage){return false}const itemDataWithOnlyActiveWidgets={...itemData,question:{...itemData.question,widgets:Object.fromEntries(Object.entries(itemData.question.widgets).filter(([id])=>widgetIdsInUse.includes(id)))},hints:itemData.hints.map(hint=>{const hintWidgetIdsInUse=getWidgetIdsFromContent(hint.content);return {...hint,widgets:Object.fromEntries(Object.entries(hint.widgets).filter(([id])=>hintWidgetIdsInUse.includes(id)))}})};let hasInaccessibleWidget=false;const checkAccessibility=info=>{if(info.type&&!isAccessible(info.type,info.options)){hasInaccessibleWidget=true;}};traverse(itemDataWithOnlyActiveWidgets.question,null,checkAccessibility);for(const hint of itemDataWithOnlyActiveWidgets.hints){traverse(hint,null,checkAccessibility);}return !hasInaccessibleWidget}
|
|
425
397
|
|
|
426
398
|
function generateBlankOptions(options){const defaultBlankOptions={displayType:"normal",correctId:"answer-tile-1"};return {...defaultBlankOptions,...options}}function generateBlankWidget(blankWidgetProperties){return {type:"blank",graded:true,version:{major:0,minor:0},static:false,alignment:"default",...blankWidgetProperties,options:generateBlankOptions({...blankWidgetProperties?.options})}}
|
|
427
399
|
|
|
@@ -479,8 +451,8 @@ function generateTableOptions(options){const merged={...tableWidgetLogic.default
|
|
|
479
451
|
|
|
480
452
|
function generateGrapherWidgetOptions(options={}){return {...grapherWidgetLogic.defaultWidgetOptions,...options}}
|
|
481
453
|
|
|
482
|
-
const joinOptionContents=options=>options.map(({content})=>content).join("\n");const toOptionLetter=index=>String.fromCharCode("A".charCodeAt(0)+index);function getAnswersFromWidgets(widgets){const answers=[];
|
|
483
|
-
| --- | --- |`;const tableRows=left.map((leftItem,index)=>{return `| ${leftItem} | ${right[index]} |`});const table=[tableHeader,...tableRows].join("\n");answers.push(table);}break}});return answers}function injectWidgets(content,widgets,widgetProps){if(!content){return ""}if(!widgets){return content}let context=content;
|
|
454
|
+
const joinOptionContents=options=>options.map(({content})=>content).join("\n");const toOptionLetter=index=>String.fromCharCode("A".charCodeAt(0)+index);function getAnswersFromWidgets(widgets){const answers=[];keys(widgets).forEach(widgetID=>{const widget=widgets[widgetID];if(!widget.options){return}switch(widget.type){case "radio":const radio=widget;const options=radio.options;if(options?.choices?.length){for(const choice of options.choices){if(choice?.correct){answers.push(choice.content);}}}break;case "categorizer":const categorizer=widget;if(categorizer.options?.categories&&categorizer.options?.items&&categorizer.options?.values){const categories=categorizer.options?.categories;const items=categorizer.options?.items;const values=categorizer.options?.values;answers.push(...values.map((value,index)=>`${items[index]}: ${categories[value]}`));}break;case "dropdown":const dropdown=widget;if(dropdown.options?.choices){for(const choice of dropdown.options.choices){if(choice.correct){answers.push(choice.content);}}}break;case "input-number":case "numeric-input":const numericInput=widget;if(numericInput.options?.answers){for(const ans of numericInput.options.answers){if(ans.status==="correct"&&ans.value!=null){answers.push(ans.value.toString());}}}break;case "expression":const expression=widget;if(expression.options?.answerForms){answers.push(...expression.options.answerForms.map(answer=>answer.value));}break;case "group":case "graded-group":const gradedGroup=widget;if(gradedGroup.options?.widgets){answers.push(...getAnswersFromWidgets(gradedGroup.options.widgets));}break;case "plotter":const plotter=widget;if(plotter.options?.categories&&plotter.options?.correct&&plotter.options.categories.length===plotter.options.correct.length){const{categories,correct}=plotter.options;answers.push(`{${categories.map((category,index)=>`${category}: ${correct[index]}`).join(", ")}}`);}break;case "interactive-graph":case "grapher":const grapher=widget;if(grapher.options?.correct?.coords){answers.push(`There should be point(s) on [${grapher.options.correct?.coords.join("], [")}]`);}break;case "orderer":const orderer=widget;if(orderer.options?.correctOptions){answers.push(joinOptionContents(orderer.options.correctOptions));}break;case "sorter":const sorter=widget;if(sorter.options?.correct){answers.push(sorter.options.correct.join(", "));}break;case "label-image":const labelImage=widget;if(labelImage.options?.markers){answers.push(...labelImage.options.markers.map(m=>`{label: "${m.label}", position: {${m.x},${m.y}}, answer: "${m.answers.join(", ")}"}`));}break;case "number-line":const numberLine=widget;if(numberLine.options?.correctX!=null){answers.push(numberLine.options.correctX.toString());}break;case "matrix":const matrix=widget;if(matrix.options?.answers){answers.push(`[${matrix.options.answers.join("], [")}]`);}break;case "matcher":const matcher=widget;if(matcher.options?.left&&matcher.options?.right){const{left,right}=matcher.options;const[leftHeader,rightHeader]=matcher.options.labels;const tableHeader=`| ${leftHeader} | ${rightHeader} |
|
|
455
|
+
| --- | --- |`;const tableRows=left.map((leftItem,index)=>{return `| ${leftItem} | ${right[index]} |`});const table=[tableHeader,...tableRows].join("\n");answers.push(table);}break}});return answers}function injectWidgets(content,widgets,widgetProps){if(!content){return ""}if(!widgets){return content}let context=content;keys(widgets).forEach(widgetID=>{const widget=widgets[widgetID];if(!widget.options){return}switch(widget.type){case "radio":const radio=widget;const radioProps=widgetProps?.[widgetID];if(radio.options?.choices?.length){let radioContext=joinOptionContents(radioProps?radioProps.choices.map(({content},i)=>({content:`Option ${toOptionLetter(i)}: ${content}`})):radio.options.choices);if(!radioProps&&radio.options?.randomize){radioContext+="\nThose options are displayed in a different order to the user. If the user says the letter, number, or ordinal number, always ask them clarify which option they are referring to.\n";}context=context.replace(`[[☃ ${widgetID}]]`,radioContext);}break;case "image":const image=widget;if(image.options?.alt){context=context.replace(`[[☃ ${widgetID}]]`,`<img id="${widgetID}" alt="${image.options.alt}">`);}break;case "label-image":const labelImage=widget;if(labelImage.options?.imageAlt){context=context.replace(`[[☃ ${widgetID}]]`,`[An image with dots that user needs to label. Label choices: [${labelImage.options.choices.join(", ")}]. Image alt text: ${labelImage.options?.imageAlt??""}]`);}break;case "explanation":const explanation=widget;if(explanation.options?.explanation){context=context.replace(`[[☃ ${widgetID}]]`,injectWidgets(explanation.options.explanation,explanation.options.widgets));}break;case "group":case "graded-group":const group=widget;if(group.options?.widgets&&group.options.content){context=context.replace(`[[☃ ${widgetID}]]`,injectWidgets(group.options.content,group.options.widgets));}break;case "graded-group-set":const gradedGroup=widget;if(gradedGroup.options?.gradedGroups){const gradedGroups=gradedGroup.options.gradedGroups;const gradedGroupsContent=gradedGroups.reduce((acc,group)=>{if(group.widgets&&group.content){acc+=injectWidgets(group.content,group.widgets)+"\n";}return acc},"");context=context.replace(`[[☃ ${widgetID}]]`,gradedGroupsContent);}break;case "categorizer":const categorizer=widget;if(categorizer.options?.categories&&categorizer.options.items){const categories=categorizer.options.categories;const items=categorizer.options.items;context=context.replace(`[[☃ ${widgetID}]]`,`For each item, select the correct category. Categories: ${categories.join(", ")}.
|
|
484
456
|
Items:
|
|
485
457
|
${items.join("\n")}
|
|
486
458
|
`);}break;case "dropdown":const dropdown=widget;if(dropdown.options?.choices){const choices=dropdown.options.choices.map(choice=>choice.content);context=context.replace(`[[☃ ${widgetID}]]`,`[${choices.join(" | ")}]`);}break;case "definition":const definition=widget;if(definition.options?.togglePrompt){context=context.replace(`[[☃ ${widgetID}]]`,definition.options.togglePrompt);}break;case "orderer":const orderer=widget;if(orderer.options?.options){context=context.replace(`[[☃ ${widgetID}]]`,joinOptionContents(orderer.options.options));}break;case "sorter":const sorter=widget;if(sorter.options?.correct){const choices=sorter.options.correct;context=context.replace(`[[☃ ${widgetID}]]`,`[${choices.join(" | ")}]`);}break;case "interactive-graph":const interactiveGraph=widget;if(interactiveGraph.options?.range.length===2){const[x,y]=interactiveGraph.options.range;context=context.replace(`[[☃ ${widgetID}]]`,`[Graph with an x range of ${x[0]} to ${x[1]} and y range of ${y[0]} to ${y[1]}]`);}break;case "number-line":const numberLine=widget;if(numberLine.options?.range.length===2&&numberLine.options?.tickStep&&numberLine.options?.initialX){const[min,max]=numberLine.options.range;const step=numberLine.options.tickStep;const initialPosition=numberLine.options.initialX;context=context.replace(`[[☃ ${widgetID}]]`,`[Number line with a range of ${min} to ${max}, a step of ${step}, and an initial position of ${initialPosition}]`);}break;case "matrix":const matrix=widget;if(matrix.options?.matrixBoardSize.length===2){const[rows,columns]=matrix.options.matrixBoardSize;context=context.replace(`[[☃ ${widgetID}]]`,`[Matrix with ${rows} rows and ${columns} columns. The user can click on each cell to enter a value]`);}break;case "matcher":const matcher=widget;if(matcher.options?.left&&matcher.options?.right){const{left,right}=matcher.options;const[leftHeader,rightHeader]=matcher.options.labels;const tableHeader=`| ${leftHeader} | ${rightHeader} |
|
|
@@ -491,210 +463,5 @@ const denylist=["key","ref","containerSizeClass","widgetId","onChange","problemN
|
|
|
491
463
|
|
|
492
464
|
registerCoreWidgets();
|
|
493
465
|
|
|
494
|
-
|
|
495
|
-
exports.ErrorCodes = ErrorCodes;
|
|
496
|
-
exports.Errors = Errors;
|
|
497
|
-
exports.GrapherUtil = grapherUtil;
|
|
498
|
-
exports.ItemExtras = ItemExtras;
|
|
499
|
-
exports.PerseusError = PerseusError;
|
|
500
|
-
exports.PerseusExpressionAnswerFormConsidered = PerseusExpressionAnswerFormConsidered;
|
|
501
|
-
exports.PerseusFeatureFlags = PerseusFeatureFlags;
|
|
502
|
-
exports.Registry = Registry;
|
|
503
|
-
exports.SORTER_MAX_CARDS = SORTER_MAX_CARDS;
|
|
504
|
-
exports.addWidget = addWidget;
|
|
505
|
-
exports.applyDefaultsToWidget = applyDefaultsToWidget;
|
|
506
|
-
exports.applyDefaultsToWidgets = applyDefaultsToWidgets;
|
|
507
|
-
exports.approximateDeepEqual = approximateDeepEqual;
|
|
508
|
-
exports.approximateEqual = approximateEqual;
|
|
509
|
-
exports.blankLogic = blankWidgetLogic;
|
|
510
|
-
exports.categorizerLogic = categorizerWidgetLogic;
|
|
511
|
-
exports.convertGrapherOptionsToInteractiveGraph = convertGrapherOptionsToInteractiveGraph;
|
|
512
|
-
exports.convertGrapherUserInputToInteractiveGraph = convertGrapherUserInputToInteractiveGraph;
|
|
513
|
-
exports.convertInteractiveGraphUserInputToGrapher = convertInteractiveGraphUserInputToGrapher;
|
|
514
|
-
exports.csProgramLogic = csProgramWidgetLogic;
|
|
515
|
-
exports.deepClone = deepClone;
|
|
516
|
-
exports.definitionLogic = definitionWidgetLogic;
|
|
517
|
-
exports.deriveExtraKeys = deriveExtraKeys;
|
|
518
|
-
exports.deriveNumCorrect = deriveNumCorrect;
|
|
519
|
-
exports.dropdownLogic = dropdownWidgetLogic;
|
|
520
|
-
exports.excludeDenylistKeys = excludeDenylistKeys;
|
|
521
|
-
exports.explanationLogic = explanationWidgetLogic;
|
|
522
|
-
exports.expressionLogic = expressionWidgetLogic;
|
|
523
|
-
exports.fillInTheBlankLogic = fillInTheBlankWidgetLogic;
|
|
524
|
-
exports.freeResponseLogic = freeResponseWidgetLogic;
|
|
525
|
-
exports.generateAnswerTile = generateAnswerTile;
|
|
526
|
-
exports.generateBlankOptions = generateBlankOptions;
|
|
527
|
-
exports.generateBlankWidget = generateBlankWidget;
|
|
528
|
-
exports.generateCategorizerOptions = generateCategorizerOptions;
|
|
529
|
-
exports.generateCategorizerWidget = generateCategorizerWidget;
|
|
530
|
-
exports.generateDefinitionOptions = generateDefinitionOptions;
|
|
531
|
-
exports.generateDefinitionWidget = generateDefinitionWidget;
|
|
532
|
-
exports.generateDropdownOptions = generateDropdownOptions;
|
|
533
|
-
exports.generateDropdownWidget = generateDropdownWidget;
|
|
534
|
-
exports.generateExplanationOptions = generateExplanationOptions;
|
|
535
|
-
exports.generateExplanationWidget = generateExplanationWidget;
|
|
536
|
-
exports.generateExpressionAnswerForm = generateExpressionAnswerForm;
|
|
537
|
-
exports.generateExpressionOptions = generateExpressionOptions;
|
|
538
|
-
exports.generateExpressionWidget = generateExpressionWidget;
|
|
539
|
-
exports.generateFillInTheBlankOptions = generateFillInTheBlankOptions;
|
|
540
|
-
exports.generateFillInTheBlankWidget = generateFillInTheBlankWidget;
|
|
541
|
-
exports.generateFreeResponseOptions = generateFreeResponseOptions;
|
|
542
|
-
exports.generateFreeResponseWidget = generateFreeResponseWidget;
|
|
543
|
-
exports.generateGradedGroupOptions = generateGradedGroupOptions;
|
|
544
|
-
exports.generateGradedGroupSetWidget = generateGradedGroupSetWidget;
|
|
545
|
-
exports.generateGradedGroupWidget = generateGradedGroupWidget;
|
|
546
|
-
exports.generateGrapherWidgetOptions = generateGrapherWidgetOptions;
|
|
547
|
-
exports.generateGroupOptions = generateGroupOptions;
|
|
548
|
-
exports.generateGroupWidget = generateGroupWidget;
|
|
549
|
-
exports.generateIGAbsoluteValueGraph = generateIGAbsoluteValueGraph;
|
|
550
|
-
exports.generateIGAngleGraph = generateIGAngleGraph;
|
|
551
|
-
exports.generateIGCircleGraph = generateIGCircleGraph;
|
|
552
|
-
exports.generateIGExponentialGraph = generateIGExponentialGraph;
|
|
553
|
-
exports.generateIGLinearGraph = generateIGLinearGraph;
|
|
554
|
-
exports.generateIGLinearSystemGraph = generateIGLinearSystemGraph;
|
|
555
|
-
exports.generateIGLockedEllipse = generateIGLockedEllipse;
|
|
556
|
-
exports.generateIGLockedFunction = generateIGLockedFunction;
|
|
557
|
-
exports.generateIGLockedLabel = generateIGLockedLabel;
|
|
558
|
-
exports.generateIGLockedLine = generateIGLockedLine;
|
|
559
|
-
exports.generateIGLockedPoint = generateIGLockedPoint;
|
|
560
|
-
exports.generateIGLockedPolygon = generateIGLockedPolygon;
|
|
561
|
-
exports.generateIGLockedVector = generateIGLockedVector;
|
|
562
|
-
exports.generateIGLogarithmGraph = generateIGLogarithmGraph;
|
|
563
|
-
exports.generateIGNoneGraph = generateIGNoneGraph;
|
|
564
|
-
exports.generateIGPointGraph = generateIGPointGraph;
|
|
565
|
-
exports.generateIGPolygonGraph = generateIGPolygonGraph;
|
|
566
|
-
exports.generateIGQuadraticGraph = generateIGQuadraticGraph;
|
|
567
|
-
exports.generateIGRayGraph = generateIGRayGraph;
|
|
568
|
-
exports.generateIGSegmentGraph = generateIGSegmentGraph;
|
|
569
|
-
exports.generateIGSinusoidGraph = generateIGSinusoidGraph;
|
|
570
|
-
exports.generateIGTangentGraph = generateIGTangentGraph;
|
|
571
|
-
exports.generateIGVectorGraph = generateIGVectorGraph;
|
|
572
|
-
exports.generateImageOptions = generateImageOptions;
|
|
573
|
-
exports.generateImageWidget = generateImageWidget;
|
|
574
|
-
exports.generateInputNumberAnswer = generateInputNumberAnswer;
|
|
575
|
-
exports.generateInputNumberOptions = generateInputNumberOptions;
|
|
576
|
-
exports.generateInputNumberWidget = generateInputNumberWidget;
|
|
577
|
-
exports.generateInteractiveGraphOptions = generateInteractiveGraphOptions;
|
|
578
|
-
exports.generateInteractiveGraphQuestion = generateInteractiveGraphQuestion;
|
|
579
|
-
exports.generateInteractiveGraphWidget = generateInteractiveGraphWidget;
|
|
580
|
-
exports.generateLabelImageOptions = generateLabelImageOptions;
|
|
581
|
-
exports.generateLabelImageWidget = generateLabelImageWidget;
|
|
582
|
-
exports.generateMatcherOptions = generateMatcherOptions;
|
|
583
|
-
exports.generateMatcherWidget = generateMatcherWidget;
|
|
584
|
-
exports.generateMatrixOptions = generateMatrixOptions;
|
|
585
|
-
exports.generateMatrixWidget = generateMatrixWidget;
|
|
586
|
-
exports.generateMeasurerOptions = generateMeasurerOptions;
|
|
587
|
-
exports.generateMeasurerWidget = generateMeasurerWidget;
|
|
588
|
-
exports.generateNumberLineOptions = generateNumberLineOptions;
|
|
589
|
-
exports.generateNumberLineWidget = generateNumberLineWidget;
|
|
590
|
-
exports.generateNumericInputAnswer = generateNumericInputAnswer;
|
|
591
|
-
exports.generateNumericInputOptions = generateNumericInputOptions;
|
|
592
|
-
exports.generateNumericInputWidget = generateNumericInputWidget;
|
|
593
|
-
exports.generateOrdererOption = generateOrdererOption;
|
|
594
|
-
exports.generateOrdererOptions = generateOrdererOptions;
|
|
595
|
-
exports.generateOrdererWidget = generateOrdererWidget;
|
|
596
|
-
exports.generatePhetSimulationOptions = generatePhetSimulationOptions;
|
|
597
|
-
exports.generatePhetSimulationWidget = generatePhetSimulationWidget;
|
|
598
|
-
exports.generatePlotterOptions = generatePlotterOptions;
|
|
599
|
-
exports.generatePlotterWidget = generatePlotterWidget;
|
|
600
|
-
exports.generateRadioChoice = generateRadioChoice;
|
|
601
|
-
exports.generateRadioOptions = generateRadioOptions;
|
|
602
|
-
exports.generateRadioWidget = generateRadioWidget;
|
|
603
|
-
exports.generateSimpleRadioItem = generateSimpleRadioItem;
|
|
604
|
-
exports.generateSimpleRadioQuestion = generateSimpleRadioQuestion;
|
|
605
|
-
exports.generateSorterOptions = generateSorterOptions;
|
|
606
|
-
exports.generateSorterWidget = generateSorterWidget;
|
|
607
|
-
exports.generateTableOptions = generateTableOptions;
|
|
608
|
-
exports.generateTestPerseusItem = generateTestPerseusItem;
|
|
609
|
-
exports.generateTestPerseusRenderer = generateTestPerseusRenderer;
|
|
610
|
-
exports.generateVideoWidget = generateVideoWidget;
|
|
611
|
-
exports.getAnswersFromWidgets = getAnswersFromWidgets;
|
|
612
|
-
exports.getBaseUrl = getBaseUrl;
|
|
613
|
-
exports.getCSProgramPublicWidgetOptions = getCSProgramPublicWidgetOptions;
|
|
614
|
-
exports.getCategorizerPublicWidgetOptions = getCategorizerPublicWidgetOptions;
|
|
615
|
-
exports.getDataUrl = getDataUrl;
|
|
616
|
-
exports.getDecimalSeparator = getDecimalSeparator;
|
|
617
|
-
exports.getDefaultAnswerArea = getDefaultAnswerArea;
|
|
618
|
-
exports.getDefaultFigureForType = getDefaultFigureForType;
|
|
619
|
-
exports.getDivideSymbol = getDivideSymbol;
|
|
620
|
-
exports.getDivideSymbolForTex = getDivideSymbolForTex;
|
|
621
|
-
exports.getDropdownPublicWidgetOptions = getDropdownPublicWidgetOptions;
|
|
622
|
-
exports.getExpressionPublicWidgetOptions = getExpressionPublicWidgetOptions;
|
|
623
|
-
exports.getFreeResponsePublicWidgetOptions = getFreeResponsePublicWidgetOptions;
|
|
624
|
-
exports.getGrapherPublicWidgetOptions = getGrapherPublicWidgetOptions;
|
|
625
|
-
exports.getGroupPublicWidgetOptions = getGroupPublicWidgetOptions;
|
|
626
|
-
exports.getIFramePublicWidgetOptions = getIFramePublicWidgetOptions;
|
|
627
|
-
exports.getImageSizeModern = getImageSizeModern;
|
|
628
|
-
exports.getInteractiveGraphPublicWidgetOptions = getInteractiveGraphPublicWidgetOptions;
|
|
629
|
-
exports.getLabelImagePublicWidgetOptions = getLabelImagePublicWidgetOptions;
|
|
630
|
-
exports.getMatcherPublicWidgetOptions = getMatcherPublicWidgetOptions;
|
|
631
|
-
exports.getMatrixPublicWidgetOptions = getMatrixPublicWidgetOptions;
|
|
632
|
-
exports.getMatrixSize = getMatrixSize;
|
|
633
|
-
exports.getNumberLinePublicWidgetOptions = getNumberLinePublicWidgetOptions;
|
|
634
|
-
exports.getNumericInputPublicWidgetOptions = getNumericInputPublicWidgetOptions;
|
|
635
|
-
exports.getOrdererPublicWidgetOptions = getOrdererPublicWidgetOptions;
|
|
636
|
-
exports.getPerseusAIData = getPerseusAIData;
|
|
637
|
-
exports.getPlotterPublicWidgetOptions = getPlotterPublicWidgetOptions;
|
|
638
|
-
exports.getRadioPublicWidgetOptions = getRadioPublicWidgetOptions;
|
|
639
|
-
exports.getRealImageUrl = getRealImageUrl;
|
|
640
|
-
exports.getSorterPublicWidgetOptions = getSorterPublicWidgetOptions;
|
|
641
|
-
exports.getSvgUrl = getSvgUrl;
|
|
642
|
-
exports.getTablePublicWidgetOptions = getTablePublicWidgetOptions;
|
|
643
|
-
exports.getWidgetIdsFromContent = getWidgetIdsFromContent;
|
|
644
|
-
exports.getWidgetIdsFromContentByType = getWidgetIdsFromContentByType;
|
|
645
|
-
exports.gradedGroupLogic = gradedGroupWidgetLogic;
|
|
646
|
-
exports.gradedGroupSetLogic = gradedGroupSetWidgetLogic;
|
|
647
|
-
exports.grapherLogic = grapherWidgetLogic;
|
|
648
|
-
exports.groupLogic = groupWidgetLogic;
|
|
649
|
-
exports.iframeLogic = iframeWidgetLogic;
|
|
650
|
-
exports.imageLogic = imageWidgetLogic;
|
|
651
|
-
exports.injectWidgets = injectWidgets;
|
|
652
|
-
exports.inputNumberLogic = inputNumberWidgetLogic;
|
|
653
|
-
exports.interactionLogic = interactionWidgetLogic;
|
|
654
|
-
exports.interactiveGraphLogic = interactiveGraphWidgetLogic;
|
|
655
|
-
exports.isFailure = isFailure;
|
|
656
|
-
exports.isFeatureOn = isFeatureOn;
|
|
657
|
-
exports.isItemAccessible = isItemAccessible;
|
|
658
|
-
exports.isLabeledSVG = isLabeledSVG;
|
|
659
|
-
exports.isSuccess = isSuccess;
|
|
660
|
-
exports.itemHasHints = itemHasHints;
|
|
661
|
-
exports.itemHasRationales = itemHasRationales;
|
|
662
|
-
exports.labelImageLogic = labelImageWidgetLogic;
|
|
663
|
-
exports.libVersion = libVersion;
|
|
664
|
-
exports.lockedFigureColorNames = lockedFigureColorNames;
|
|
665
|
-
exports.lockedFigureColors = lockedFigureColors;
|
|
666
|
-
exports.lockedFigureFillStyles = lockedFigureFillStyles;
|
|
667
|
-
exports.makeSafeUrl = makeSafeUrl;
|
|
668
|
-
exports.mapObject = mapObject;
|
|
669
|
-
exports.matcherLogic = matcherWidgetLogic;
|
|
670
|
-
exports.matrixLogic = matrixWidgetLogic;
|
|
671
|
-
exports.measurerLogic = measurerWidgetLogic;
|
|
672
|
-
exports.mergeCards = mergeCards;
|
|
673
|
-
exports.numberLineLogic = numberLineWidgetLogic;
|
|
674
|
-
exports.numericInputLogic = numericInputWidgetLogic;
|
|
675
|
-
exports.ordererLogic = ordererWidgetLogic;
|
|
676
|
-
exports.parseAndMigratePerseusArticle = parseAndMigratePerseusArticle;
|
|
677
|
-
exports.parseAndMigratePerseusItem = parseAndMigratePerseusItem;
|
|
678
|
-
exports.parseAndMigratePerseusRenderer = parseAndMigratePerseusRenderer;
|
|
679
|
-
exports.parseAndMigrateUserInputMap = parseAndMigrateUserInputMap;
|
|
680
|
-
exports.phetSimulationLogic = phetSimulationWidgetLogic;
|
|
681
|
-
exports.plotterLogic = plotterWidgetLogic;
|
|
682
|
-
exports.plotterPlotTypes = plotterPlotTypes;
|
|
683
|
-
exports.pluck = pluck;
|
|
684
|
-
exports.pythonProgramLogic = pythonProgramWidgetLogic;
|
|
685
|
-
exports.radioLogic = radioWidgetLogic;
|
|
686
|
-
exports.random = random;
|
|
687
|
-
exports.removeOrphanedWidgetsFromPerseusItem = removeOrphanedWidgetsFromPerseusItem;
|
|
688
|
-
exports.seededRNG = seededRNG;
|
|
689
|
-
exports.shuffle = shuffle;
|
|
690
|
-
exports.shuffleMatcher = shuffleMatcher;
|
|
691
|
-
exports.shuffleSorter = shuffleSorter;
|
|
692
|
-
exports.sorterLogic = sorterWidgetLogic;
|
|
693
|
-
exports.splitPerseusItem = splitPerseusItem;
|
|
694
|
-
exports.splitPerseusItemJSON = splitPerseusItemJSON;
|
|
695
|
-
exports.tableLogic = tableWidgetLogic;
|
|
696
|
-
exports.toCard = toCard;
|
|
697
|
-
exports.traverse = traverse;
|
|
698
|
-
exports.usesNumCorrect = usesNumCorrect;
|
|
699
|
-
exports.videoLogic = videoWidgetLogic;
|
|
466
|
+
export { coreWidgetRegistry as CoreWidgetRegistry, ErrorCodes, Errors, grapherUtil as GrapherUtil, ItemExtras, PerseusError, PerseusExpressionAnswerFormConsidered, PerseusFeatureFlags, Registry, SORTER_MAX_CARDS, SORTER_MAX_HORIZONTAL_CARDS, addWidget, applyDefaultsToWidget, applyDefaultsToWidgets, approximateDeepEqual, approximateEqual, blankWidgetLogic as blankLogic, categorizerWidgetLogic as categorizerLogic, convertGrapherOptionsToInteractiveGraph, convertGrapherUserInputToInteractiveGraph, convertInteractiveGraphUserInputToGrapher, csProgramWidgetLogic as csProgramLogic, deepClone, definitionWidgetLogic as definitionLogic, deriveExtraKeys, deriveNumCorrect, dropdownWidgetLogic as dropdownLogic, exceedsCardLimit, excludeDenylistKeys, explanationWidgetLogic as explanationLogic, expressionWidgetLogic as expressionLogic, fillInTheBlankWidgetLogic as fillInTheBlankLogic, freeResponseWidgetLogic as freeResponseLogic, generateAnswerTile, generateBlankOptions, generateBlankWidget, generateCategorizerOptions, generateCategorizerWidget, generateDefinitionOptions, generateDefinitionWidget, generateDropdownOptions, generateDropdownWidget, generateExplanationOptions, generateExplanationWidget, generateExpressionAnswerForm, generateExpressionOptions, generateExpressionWidget, generateFillInTheBlankOptions, generateFillInTheBlankWidget, generateFreeResponseOptions, generateFreeResponseWidget, generateGradedGroupOptions, generateGradedGroupSetWidget, generateGradedGroupWidget, generateGrapherWidgetOptions, generateGroupOptions, generateGroupWidget, generateIGAbsoluteValueGraph, generateIGAngleGraph, generateIGCircleGraph, generateIGExponentialGraph, generateIGLinearGraph, generateIGLinearSystemGraph, generateIGLockedEllipse, generateIGLockedFunction, generateIGLockedLabel, generateIGLockedLine, generateIGLockedPoint, generateIGLockedPolygon, generateIGLockedVector, generateIGLogarithmGraph, generateIGNoneGraph, generateIGPointGraph, generateIGPolygonGraph, generateIGQuadraticGraph, generateIGRayGraph, generateIGSegmentGraph, generateIGSinusoidGraph, generateIGTangentGraph, generateIGVectorGraph, generateImageOptions, generateImageWidget, generateInputNumberAnswer, generateInputNumberOptions, generateInputNumberWidget, generateInteractiveGraphOptions, generateInteractiveGraphQuestion, generateInteractiveGraphWidget, generateLabelImageOptions, generateLabelImageWidget, generateMatcherOptions, generateMatcherWidget, generateMatrixOptions, generateMatrixWidget, generateMeasurerOptions, generateMeasurerWidget, generateNumberLineOptions, generateNumberLineWidget, generateNumericInputAnswer, generateNumericInputOptions, generateNumericInputWidget, generateOrdererOption, generateOrdererOptions, generateOrdererWidget, generatePhetSimulationOptions, generatePhetSimulationWidget, generatePlotterOptions, generatePlotterWidget, generateRadioChoice, generateRadioOptions, generateRadioWidget, generateSimpleRadioItem, generateSimpleRadioQuestion, generateSorterOptions, generateSorterWidget, generateTableOptions, generateTestPerseusItem, generateTestPerseusRenderer, generateVideoWidget, getAnswersFromWidgets, getBaseUrl, getCSProgramPublicWidgetOptions, getCategorizerPublicWidgetOptions, getDataUrl, getDecimalSeparator, getDefaultAnswerArea, getDefaultFigureForType, getDivideSymbol, getDivideSymbolForTex, getDropdownPublicWidgetOptions, getExpressionPublicWidgetOptions, getFreeResponsePublicWidgetOptions, getGrapherPublicWidgetOptions, getGroupPublicWidgetOptions, getIFramePublicWidgetOptions, getImageSizeModern, getInteractiveGraphPublicWidgetOptions, getLabelImagePublicWidgetOptions, getMatcherPublicWidgetOptions, getMatrixPublicWidgetOptions, getMatrixSize, getNumberLinePublicWidgetOptions, getNumericInputPublicWidgetOptions, getOrdererPublicWidgetOptions, getPerseusAIData, getPlotterPublicWidgetOptions, getRadioPublicWidgetOptions, getRealImageUrl, getSorterPublicWidgetOptions, getSvgUrl, getTablePublicWidgetOptions, getWidgetIdsFromContent, getWidgetIdsFromContentByType, gradedGroupWidgetLogic as gradedGroupLogic, gradedGroupSetWidgetLogic as gradedGroupSetLogic, grapherWidgetLogic as grapherLogic, groupWidgetLogic as groupLogic, iframeWidgetLogic as iframeLogic, imageWidgetLogic as imageLogic, injectWidgets, inputNumberWidgetLogic as inputNumberLogic, interactionWidgetLogic as interactionLogic, interactiveGraphWidgetLogic as interactiveGraphLogic, isFailure, isFeatureOn, isItemAccessible, isLabeledSVG, isSuccess, itemHasHints, itemHasRationales, labelImageWidgetLogic as labelImageLogic, libVersion, lockedFigureColorNames, lockedFigureColors, lockedFigureFillStyles, makeSafeUrl, mapObject, matcherWidgetLogic as matcherLogic, matrixWidgetLogic as matrixLogic, measurerWidgetLogic as measurerLogic, mergeCards, numberLineWidgetLogic as numberLineLogic, numericInputWidgetLogic as numericInputLogic, ordererWidgetLogic as ordererLogic, parseAndMigratePerseusArticle, parseAndMigratePerseusItem, parseAndMigratePerseusRenderer, parseAndMigrateUserInputMap, phetSimulationWidgetLogic as phetSimulationLogic, plotterWidgetLogic as plotterLogic, plotterPlotTypes, pluck, pythonProgramWidgetLogic as pythonProgramLogic, radioWidgetLogic as radioLogic, random, removeOrphanedWidgetsFromPerseusItem, seededRNG, shuffle, shuffleMatcher, shuffleSorter, sorterWidgetLogic as sorterLogic, splitPerseusItem, splitPerseusItemJSON, tableWidgetLogic as tableLogic, toCard, traverse, usesNumCorrect, videoWidgetLogic as videoLogic };
|
|
700
467
|
//# sourceMappingURL=index.js.map
|