@teachinglab/omd 0.6.0 → 0.6.2
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/README.md +257 -251
- package/README.old.md +137 -137
- package/canvas/core/canvasConfig.js +202 -202
- package/canvas/drawing/segment.js +167 -167
- package/canvas/drawing/stroke.js +385 -385
- package/canvas/events/eventManager.js +444 -444
- package/canvas/events/pointerEventHandler.js +262 -262
- package/canvas/index.js +48 -48
- package/canvas/tools/PointerTool.js +71 -71
- package/canvas/tools/tool.js +222 -222
- package/canvas/utils/boundingBox.js +377 -377
- package/canvas/utils/mathUtils.js +258 -258
- package/docs/api/configuration-options.md +198 -198
- package/docs/api/eventManager.md +82 -82
- package/docs/api/focusFrameManager.md +144 -144
- package/docs/api/index.md +105 -105
- package/docs/api/main.md +62 -62
- package/docs/api/omdBinaryExpressionNode.md +86 -86
- package/docs/api/omdCanvas.md +83 -83
- package/docs/api/omdConfigManager.md +112 -112
- package/docs/api/omdConstantNode.md +52 -52
- package/docs/api/omdDisplay.md +87 -87
- package/docs/api/omdEquationNode.md +174 -174
- package/docs/api/omdEquationSequenceNode.md +258 -258
- package/docs/api/omdEquationStack.md +192 -192
- package/docs/api/omdFunctionNode.md +82 -82
- package/docs/api/omdGroupNode.md +78 -78
- package/docs/api/omdHelpers.md +87 -87
- package/docs/api/omdLeafNode.md +85 -85
- package/docs/api/omdNode.md +201 -201
- package/docs/api/omdOperationDisplayNode.md +117 -117
- package/docs/api/omdOperatorNode.md +91 -91
- package/docs/api/omdParenthesisNode.md +133 -133
- package/docs/api/omdPopup.md +191 -191
- package/docs/api/omdPowerNode.md +131 -131
- package/docs/api/omdRationalNode.md +144 -144
- package/docs/api/omdSequenceNode.md +128 -128
- package/docs/api/omdSimplification.md +78 -78
- package/docs/api/omdSqrtNode.md +144 -144
- package/docs/api/omdStepVisualizer.md +146 -146
- package/docs/api/omdStepVisualizerHighlighting.md +65 -65
- package/docs/api/omdStepVisualizerInteractiveSteps.md +108 -108
- package/docs/api/omdStepVisualizerLayout.md +70 -70
- package/docs/api/omdStepVisualizerNodeUtils.md +140 -140
- package/docs/api/omdStepVisualizerTextBoxes.md +76 -76
- package/docs/api/omdToolbar.md +130 -130
- package/docs/api/omdTranscriptionService.md +95 -95
- package/docs/api/omdTreeDiff.md +169 -169
- package/docs/api/omdUnaryExpressionNode.md +137 -137
- package/docs/api/omdUtilities.md +82 -82
- package/docs/api/omdVariableNode.md +123 -123
- package/docs/api/selectTool.md +74 -74
- package/docs/api/simplificationEngine.md +97 -97
- package/docs/api/simplificationRules.md +76 -76
- package/docs/api/simplificationUtils.md +64 -64
- package/docs/api/transcribe.md +43 -43
- package/docs/api-reference.md +85 -85
- package/docs/index.html +453 -453
- package/docs/index.md +38 -38
- package/docs/omd-objects.md +258 -258
- package/index.js +79 -79
- package/jsvg/index.js +3 -0
- package/jsvg/jsvg.js +898 -898
- package/jsvg/jsvgComponents.js +357 -358
- package/npm-docs/DOCUMENTATION_SUMMARY.md +220 -220
- package/npm-docs/README.md +251 -251
- package/npm-docs/api/api-reference.md +85 -85
- package/npm-docs/api/configuration-options.md +198 -198
- package/npm-docs/api/eventManager.md +82 -82
- package/npm-docs/api/expression-nodes.md +561 -561
- package/npm-docs/api/focusFrameManager.md +144 -144
- package/npm-docs/api/index.md +105 -105
- package/npm-docs/api/main.md +62 -62
- package/npm-docs/api/omdBinaryExpressionNode.md +86 -86
- package/npm-docs/api/omdCanvas.md +83 -83
- package/npm-docs/api/omdConfigManager.md +112 -112
- package/npm-docs/api/omdConstantNode.md +52 -52
- package/npm-docs/api/omdDisplay.md +87 -87
- package/npm-docs/api/omdEquationNode.md +174 -174
- package/npm-docs/api/omdEquationSequenceNode.md +258 -258
- package/npm-docs/api/omdEquationStack.md +192 -192
- package/npm-docs/api/omdFunctionNode.md +82 -82
- package/npm-docs/api/omdGroupNode.md +78 -78
- package/npm-docs/api/omdHelpers.md +87 -87
- package/npm-docs/api/omdLeafNode.md +85 -85
- package/npm-docs/api/omdNode.md +201 -201
- package/npm-docs/api/omdOperationDisplayNode.md +117 -117
- package/npm-docs/api/omdOperatorNode.md +91 -91
- package/npm-docs/api/omdParenthesisNode.md +133 -133
- package/npm-docs/api/omdPopup.md +191 -191
- package/npm-docs/api/omdPowerNode.md +131 -131
- package/npm-docs/api/omdRationalNode.md +144 -144
- package/npm-docs/api/omdSequenceNode.md +128 -128
- package/npm-docs/api/omdSimplification.md +78 -78
- package/npm-docs/api/omdSqrtNode.md +144 -144
- package/npm-docs/api/omdStepVisualizer.md +146 -146
- package/npm-docs/api/omdStepVisualizerHighlighting.md +65 -65
- package/npm-docs/api/omdStepVisualizerInteractiveSteps.md +108 -108
- package/npm-docs/api/omdStepVisualizerLayout.md +70 -70
- package/npm-docs/api/omdStepVisualizerNodeUtils.md +140 -140
- package/npm-docs/api/omdStepVisualizerTextBoxes.md +76 -76
- package/npm-docs/api/omdToolbar.md +130 -130
- package/npm-docs/api/omdTranscriptionService.md +95 -95
- package/npm-docs/api/omdTreeDiff.md +169 -169
- package/npm-docs/api/omdUnaryExpressionNode.md +137 -137
- package/npm-docs/api/omdUtilities.md +82 -82
- package/npm-docs/api/omdVariableNode.md +123 -123
- package/npm-docs/api/selectTool.md +74 -74
- package/npm-docs/api/simplificationEngine.md +97 -97
- package/npm-docs/api/simplificationRules.md +76 -76
- package/npm-docs/api/simplificationUtils.md +64 -64
- package/npm-docs/api/transcribe.md +43 -43
- package/npm-docs/guides/equations.md +854 -854
- package/npm-docs/guides/factory-functions.md +354 -354
- package/npm-docs/guides/getting-started.md +318 -318
- package/npm-docs/guides/quick-examples.md +525 -525
- package/npm-docs/guides/visualizations.md +682 -682
- package/npm-docs/index.html +12 -0
- package/npm-docs/json-schemas.md +826 -826
- package/omd/config/omdConfigManager.js +279 -267
- package/omd/core/index.js +158 -158
- package/omd/core/omdEquationStack.js +546 -546
- package/omd/core/omdUtilities.js +113 -113
- package/omd/display/omdDisplay.js +969 -962
- package/omd/display/omdToolbar.js +501 -501
- package/omd/nodes/omdBinaryExpressionNode.js +459 -459
- package/omd/nodes/omdConstantNode.js +141 -141
- package/omd/nodes/omdEquationNode.js +1327 -1327
- package/omd/nodes/omdFunctionNode.js +351 -351
- package/omd/nodes/omdGroupNode.js +67 -67
- package/omd/nodes/omdLeafNode.js +76 -76
- package/omd/nodes/omdNode.js +556 -556
- package/omd/nodes/omdOperationDisplayNode.js +321 -321
- package/omd/nodes/omdOperatorNode.js +108 -108
- package/omd/nodes/omdParenthesisNode.js +292 -292
- package/omd/nodes/omdPowerNode.js +235 -235
- package/omd/nodes/omdRationalNode.js +295 -295
- package/omd/nodes/omdSqrtNode.js +307 -307
- package/omd/nodes/omdUnaryExpressionNode.js +227 -227
- package/omd/nodes/omdVariableNode.js +122 -122
- package/omd/simplification/omdSimplification.js +140 -140
- package/omd/simplification/omdSimplificationEngine.js +887 -887
- package/omd/simplification/package.json +5 -5
- package/omd/simplification/rules/binaryRules.js +1037 -1037
- package/omd/simplification/rules/functionRules.js +111 -111
- package/omd/simplification/rules/index.js +48 -48
- package/omd/simplification/rules/parenthesisRules.js +19 -19
- package/omd/simplification/rules/powerRules.js +143 -143
- package/omd/simplification/rules/rationalRules.js +725 -725
- package/omd/simplification/rules/sqrtRules.js +48 -48
- package/omd/simplification/rules/unaryRules.js +37 -37
- package/omd/simplification/simplificationRules.js +31 -31
- package/omd/simplification/simplificationUtils.js +1055 -1055
- package/omd/step-visualizer/omdStepVisualizer.js +947 -947
- package/omd/step-visualizer/omdStepVisualizerHighlighting.js +246 -246
- package/omd/step-visualizer/omdStepVisualizerLayout.js +892 -892
- package/omd/step-visualizer/omdStepVisualizerTextBoxes.js +200 -200
- package/omd/utils/aiNextEquationStep.js +106 -106
- package/omd/utils/omdNodeOverlay.js +638 -638
- package/omd/utils/omdPopup.js +1203 -1203
- package/omd/utils/omdStepVisualizerInteractiveSteps.js +684 -684
- package/omd/utils/omdStepVisualizerNodeUtils.js +267 -267
- package/omd/utils/omdTranscriptionService.js +123 -123
- package/omd/utils/omdTreeDiff.js +733 -733
- package/package.json +59 -56
- package/readme.html +184 -120
- package/src/index.js +74 -74
- package/src/json-schemas.md +576 -576
- package/src/omd-json-samples.js +147 -147
- package/src/omdApp.js +391 -391
- package/src/omdAppCanvas.js +335 -335
- package/src/omdBalanceHanger.js +199 -199
- package/src/omdColor.js +13 -13
- package/src/omdCoordinatePlane.js +541 -541
- package/src/omdExpression.js +115 -115
- package/src/omdFactory.js +150 -150
- package/src/omdFunction.js +114 -114
- package/src/omdMetaExpression.js +290 -290
- package/src/omdNaturalExpression.js +563 -563
- package/src/omdNode.js +383 -383
- package/src/omdNumber.js +52 -52
- package/src/omdNumberLine.js +114 -112
- package/src/omdNumberTile.js +118 -118
- package/src/omdOperator.js +72 -72
- package/src/omdPowerExpression.js +91 -91
- package/src/omdProblem.js +259 -259
- package/src/omdRatioChart.js +251 -251
- package/src/omdRationalExpression.js +114 -114
- package/src/omdSampleData.js +215 -215
- package/src/omdShapes.js +512 -512
- package/src/omdSpinner.js +151 -151
- package/src/omdString.js +49 -49
- package/src/omdTable.js +498 -498
- package/src/omdTapeDiagram.js +244 -244
- package/src/omdTerm.js +91 -91
- package/src/omdTileEquation.js +349 -349
- package/src/omdUtils.js +84 -84
- package/src/omdVariable.js +51 -51
package/src/omdExpression.js
CHANGED
|
@@ -1,116 +1,116 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
import { omdColor } from "./omdColor.js";
|
|
4
|
-
import { jsvgLayoutGroup } from "@teachinglab/jsvg";
|
|
5
|
-
import { omdTerm } from "./omdTerm.js";
|
|
6
|
-
import { omdOperator } from "./omdOperator.js";
|
|
7
|
-
import { omdNumber } from "./omdNumber.js";
|
|
8
|
-
import { omdVariable } from "./omdVariable.js";
|
|
9
|
-
import { omdMetaExpression } from "./omdMetaExpression.js"
|
|
10
|
-
import { parseExpressionString } from "./omdUtils.js";
|
|
11
|
-
|
|
12
|
-
export class omdExpression extends omdMetaExpression
|
|
13
|
-
{
|
|
14
|
-
constructor()
|
|
15
|
-
{
|
|
16
|
-
// initialization
|
|
17
|
-
super();
|
|
18
|
-
|
|
19
|
-
this.type = "omdExpression";
|
|
20
|
-
this.termSet = [];
|
|
21
|
-
this.operatorSet = [];
|
|
22
|
-
|
|
23
|
-
this.inset = 5;
|
|
24
|
-
|
|
25
|
-
this.expressionStack = new jsvgLayoutGroup();
|
|
26
|
-
this.expressionStack.setPosition( this.inset, 0 );
|
|
27
|
-
this.expressionStack.setSpacer(-6);
|
|
28
|
-
this.addChild( this.expressionStack );
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
loadFromJSON( data )
|
|
32
|
-
{
|
|
33
|
-
// Accept either structured object or a plain expression string
|
|
34
|
-
if ( typeof data === 'string' ) {
|
|
35
|
-
const parsed = parseExpressionString(data);
|
|
36
|
-
if ( parsed ) data = parsed;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
if ( typeof data.termsAndOpers != "undefined" )
|
|
40
|
-
{
|
|
41
|
-
for( var i=0; i<data.termsAndOpers.length; i++ )
|
|
42
|
-
{
|
|
43
|
-
var elem = data.termsAndOpers[i];
|
|
44
|
-
if ( elem.omdType == "term" )
|
|
45
|
-
{
|
|
46
|
-
var T = new omdTerm();
|
|
47
|
-
T.loadFromJSON( elem );
|
|
48
|
-
T.hideBackgroundByDefault();
|
|
49
|
-
this.termSet.push( T );
|
|
50
|
-
this.expressionStack.addChild( T );
|
|
51
|
-
}
|
|
52
|
-
else if ( elem.omdType == "variable" )
|
|
53
|
-
{
|
|
54
|
-
var T = new omdVariable();
|
|
55
|
-
T.loadFromJSON( elem );
|
|
56
|
-
T.hideBackgroundByDefault();
|
|
57
|
-
this.termSet.push( T );
|
|
58
|
-
this.expressionStack.addChild( T );
|
|
59
|
-
}
|
|
60
|
-
else if ( elem.omdType == "number" )
|
|
61
|
-
{
|
|
62
|
-
var T = new omdNumber();
|
|
63
|
-
T.loadFromJSON( elem );
|
|
64
|
-
T.hideBackgroundByDefault();
|
|
65
|
-
this.termSet.push( T );
|
|
66
|
-
this.expressionStack.addChild( T );
|
|
67
|
-
}
|
|
68
|
-
else if ( elem.omdType == "operator" )
|
|
69
|
-
{
|
|
70
|
-
var P = new omdOperator();
|
|
71
|
-
P.loadFromJSON( elem );
|
|
72
|
-
P.hideBackgroundByDefault();
|
|
73
|
-
this.operatorSet.push( P );
|
|
74
|
-
this.expressionStack.addChild( P );
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
this.updateLayout();
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
addTerm( coefficient, variable='', exponent='1' )
|
|
83
|
-
{
|
|
84
|
-
var T = new omdTerm( coefficient, variable, exponent );
|
|
85
|
-
this.termSet.push( T );
|
|
86
|
-
this.expressionStack.addChild( T );
|
|
87
|
-
this.updateLayout();
|
|
88
|
-
|
|
89
|
-
T.hideBackgroundByDefault();
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
addOperator( oper )
|
|
93
|
-
{
|
|
94
|
-
var P = new omdOperator(oper);
|
|
95
|
-
this.operatorSet.push( P );
|
|
96
|
-
this.expressionStack.addChild( P );
|
|
97
|
-
this.updateLayout();
|
|
98
|
-
|
|
99
|
-
P.hideBackgroundByDefault();
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
updateLayout()
|
|
103
|
-
{
|
|
104
|
-
this.expressionStack.doHorizontalLayout();
|
|
105
|
-
|
|
106
|
-
var W = this.expressionStack.width;
|
|
107
|
-
this.backRect.setWidthAndHeight( W + this.inset*2, 30 );
|
|
108
|
-
|
|
109
|
-
this.setWidthAndHeight( this.backRect.width, this.backRect.height );
|
|
110
|
-
|
|
111
|
-
// Set individual width/height properties and viewBox for API compatibility
|
|
112
|
-
this.width = this.backRect.width;
|
|
113
|
-
this.height = this.backRect.height;
|
|
114
|
-
this.svgObject.setAttribute('viewBox', `0 0 ${this.width} ${this.height}`);
|
|
115
|
-
}
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
import { omdColor } from "./omdColor.js";
|
|
4
|
+
import { jsvgLayoutGroup } from "@teachinglab/jsvg";
|
|
5
|
+
import { omdTerm } from "./omdTerm.js";
|
|
6
|
+
import { omdOperator } from "./omdOperator.js";
|
|
7
|
+
import { omdNumber } from "./omdNumber.js";
|
|
8
|
+
import { omdVariable } from "./omdVariable.js";
|
|
9
|
+
import { omdMetaExpression } from "./omdMetaExpression.js"
|
|
10
|
+
import { parseExpressionString } from "./omdUtils.js";
|
|
11
|
+
|
|
12
|
+
export class omdExpression extends omdMetaExpression
|
|
13
|
+
{
|
|
14
|
+
constructor()
|
|
15
|
+
{
|
|
16
|
+
// initialization
|
|
17
|
+
super();
|
|
18
|
+
|
|
19
|
+
this.type = "omdExpression";
|
|
20
|
+
this.termSet = [];
|
|
21
|
+
this.operatorSet = [];
|
|
22
|
+
|
|
23
|
+
this.inset = 5;
|
|
24
|
+
|
|
25
|
+
this.expressionStack = new jsvgLayoutGroup();
|
|
26
|
+
this.expressionStack.setPosition( this.inset, 0 );
|
|
27
|
+
this.expressionStack.setSpacer(-6);
|
|
28
|
+
this.addChild( this.expressionStack );
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
loadFromJSON( data )
|
|
32
|
+
{
|
|
33
|
+
// Accept either structured object or a plain expression string
|
|
34
|
+
if ( typeof data === 'string' ) {
|
|
35
|
+
const parsed = parseExpressionString(data);
|
|
36
|
+
if ( parsed ) data = parsed;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
if ( typeof data.termsAndOpers != "undefined" )
|
|
40
|
+
{
|
|
41
|
+
for( var i=0; i<data.termsAndOpers.length; i++ )
|
|
42
|
+
{
|
|
43
|
+
var elem = data.termsAndOpers[i];
|
|
44
|
+
if ( elem.omdType == "term" )
|
|
45
|
+
{
|
|
46
|
+
var T = new omdTerm();
|
|
47
|
+
T.loadFromJSON( elem );
|
|
48
|
+
T.hideBackgroundByDefault();
|
|
49
|
+
this.termSet.push( T );
|
|
50
|
+
this.expressionStack.addChild( T );
|
|
51
|
+
}
|
|
52
|
+
else if ( elem.omdType == "variable" )
|
|
53
|
+
{
|
|
54
|
+
var T = new omdVariable();
|
|
55
|
+
T.loadFromJSON( elem );
|
|
56
|
+
T.hideBackgroundByDefault();
|
|
57
|
+
this.termSet.push( T );
|
|
58
|
+
this.expressionStack.addChild( T );
|
|
59
|
+
}
|
|
60
|
+
else if ( elem.omdType == "number" )
|
|
61
|
+
{
|
|
62
|
+
var T = new omdNumber();
|
|
63
|
+
T.loadFromJSON( elem );
|
|
64
|
+
T.hideBackgroundByDefault();
|
|
65
|
+
this.termSet.push( T );
|
|
66
|
+
this.expressionStack.addChild( T );
|
|
67
|
+
}
|
|
68
|
+
else if ( elem.omdType == "operator" )
|
|
69
|
+
{
|
|
70
|
+
var P = new omdOperator();
|
|
71
|
+
P.loadFromJSON( elem );
|
|
72
|
+
P.hideBackgroundByDefault();
|
|
73
|
+
this.operatorSet.push( P );
|
|
74
|
+
this.expressionStack.addChild( P );
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
this.updateLayout();
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
addTerm( coefficient, variable='', exponent='1' )
|
|
83
|
+
{
|
|
84
|
+
var T = new omdTerm( coefficient, variable, exponent );
|
|
85
|
+
this.termSet.push( T );
|
|
86
|
+
this.expressionStack.addChild( T );
|
|
87
|
+
this.updateLayout();
|
|
88
|
+
|
|
89
|
+
T.hideBackgroundByDefault();
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
addOperator( oper )
|
|
93
|
+
{
|
|
94
|
+
var P = new omdOperator(oper);
|
|
95
|
+
this.operatorSet.push( P );
|
|
96
|
+
this.expressionStack.addChild( P );
|
|
97
|
+
this.updateLayout();
|
|
98
|
+
|
|
99
|
+
P.hideBackgroundByDefault();
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
updateLayout()
|
|
103
|
+
{
|
|
104
|
+
this.expressionStack.doHorizontalLayout();
|
|
105
|
+
|
|
106
|
+
var W = this.expressionStack.width;
|
|
107
|
+
this.backRect.setWidthAndHeight( W + this.inset*2, 30 );
|
|
108
|
+
|
|
109
|
+
this.setWidthAndHeight( this.backRect.width, this.backRect.height );
|
|
110
|
+
|
|
111
|
+
// Set individual width/height properties and viewBox for API compatibility
|
|
112
|
+
this.width = this.backRect.width;
|
|
113
|
+
this.height = this.backRect.height;
|
|
114
|
+
this.svgObject.setAttribute('viewBox', `0 0 ${this.width} ${this.height}`);
|
|
115
|
+
}
|
|
116
116
|
}
|
package/src/omdFactory.js
CHANGED
|
@@ -1,150 +1,150 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* OMD Factory - Creates OMD objects from JSON data
|
|
3
|
-
*
|
|
4
|
-
* This factory function creates the appropriate OMD object based on the omdType
|
|
5
|
-
* field in the JSON data, eliminating the need for large switch statements.
|
|
6
|
-
*
|
|
7
|
-
* Usage:
|
|
8
|
-
* import { createFromJSON } from '@teachinglab/omd';
|
|
9
|
-
*
|
|
10
|
-
* const jsonData = { omdType: 'numberLine', min: 0, max: 10 };
|
|
11
|
-
* const omdObject = createFromJSON(jsonData);
|
|
12
|
-
*
|
|
13
|
-
* // Optionally load into existing container
|
|
14
|
-
* const svg = document.createElementNS("http://www.w3.org/2000/svg", "svg");
|
|
15
|
-
* svg.appendChild(omdObject.svgObject);
|
|
16
|
-
*/
|
|
17
|
-
|
|
18
|
-
import { omdBalanceHanger } from './omdBalanceHanger.js';
|
|
19
|
-
import { omdTable } from './omdTable.js';
|
|
20
|
-
import { omdTapeDiagram } from './omdTapeDiagram.js';
|
|
21
|
-
import { omdCoordinatePlane } from './omdCoordinatePlane.js';
|
|
22
|
-
import { omdNumberLine } from './omdNumberLine.js';
|
|
23
|
-
import { omdNumberTile } from './omdNumberTile.js';
|
|
24
|
-
import { omdRatioChart } from './omdRatioChart.js';
|
|
25
|
-
import { omdTileEquation } from './omdTileEquation.js';
|
|
26
|
-
import { omdSpinner } from './omdSpinner.js';
|
|
27
|
-
import { omdEquation } from './omdEquation.js';
|
|
28
|
-
import { omdExpression } from './omdExpression.js';
|
|
29
|
-
import { omdTerm } from './omdTerm.js';
|
|
30
|
-
import { omdNumber } from './omdNumber.js';
|
|
31
|
-
import { omdVariable } from './omdVariable.js';
|
|
32
|
-
import { omdPowerExpression } from './omdPowerExpression.js';
|
|
33
|
-
import { omdRationalExpression } from './omdRationalExpression.js';
|
|
34
|
-
import { omdFunction } from './omdFunction.js';
|
|
35
|
-
import {
|
|
36
|
-
omdRightTriangle,
|
|
37
|
-
omdIsoscelesTriangle,
|
|
38
|
-
omdRectangle,
|
|
39
|
-
omdEllipse,
|
|
40
|
-
omdCircle,
|
|
41
|
-
omdRegularPolygon
|
|
42
|
-
} from './omdShapes.js';
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* Map of omdType strings to their corresponding class constructors
|
|
46
|
-
*/
|
|
47
|
-
const OMD_TYPE_MAP = {
|
|
48
|
-
'balanceHanger': omdBalanceHanger,
|
|
49
|
-
'table': omdTable,
|
|
50
|
-
'tapeDiagram': omdTapeDiagram,
|
|
51
|
-
'coordinatePlane': omdCoordinatePlane,
|
|
52
|
-
'numberLine': omdNumberLine,
|
|
53
|
-
'numberTile': omdNumberTile,
|
|
54
|
-
'ratioChart': omdRatioChart,
|
|
55
|
-
'tileEquation': omdTileEquation,
|
|
56
|
-
'spinner': omdSpinner,
|
|
57
|
-
'equation': omdEquation,
|
|
58
|
-
'expression': omdExpression,
|
|
59
|
-
'term': omdTerm,
|
|
60
|
-
'number': omdNumber,
|
|
61
|
-
'variable': omdVariable,
|
|
62
|
-
'powerExpression': omdPowerExpression,
|
|
63
|
-
'rationalExpression': omdRationalExpression,
|
|
64
|
-
'function': omdFunction,
|
|
65
|
-
'rightTriangle': omdRightTriangle,
|
|
66
|
-
'isoscelesTriangle': omdIsoscelesTriangle,
|
|
67
|
-
'rectangle': omdRectangle,
|
|
68
|
-
'ellipse': omdEllipse,
|
|
69
|
-
'circle': omdCircle,
|
|
70
|
-
'regularPolygon': omdRegularPolygon
|
|
71
|
-
};
|
|
72
|
-
|
|
73
|
-
/**
|
|
74
|
-
* Creates an OMD object from JSON data
|
|
75
|
-
*
|
|
76
|
-
* @param {object} jsonData - The JSON data with an omdType field
|
|
77
|
-
* @returns {object} The created OMD object with data loaded
|
|
78
|
-
* @throws {Error} If omdType is missing or unsupported
|
|
79
|
-
*
|
|
80
|
-
* @example
|
|
81
|
-
* // Create a number line
|
|
82
|
-
* const numberLine = createFromJSON({
|
|
83
|
-
* omdType: 'numberLine',
|
|
84
|
-
* min: 0,
|
|
85
|
-
* max: 10,
|
|
86
|
-
* dotValues: [2, 5, 8]
|
|
87
|
-
* });
|
|
88
|
-
*
|
|
89
|
-
* @example
|
|
90
|
-
* // Create a coordinate plane
|
|
91
|
-
* const plane = createFromJSON({
|
|
92
|
-
* omdType: 'coordinatePlane',
|
|
93
|
-
* xMin: -10,
|
|
94
|
-
* xMax: 10,
|
|
95
|
-
* yMin: -10,
|
|
96
|
-
* yMax: 10,
|
|
97
|
-
* graphEquations: [
|
|
98
|
-
* { equation: 'y = x^2', color: '#e11d48' }
|
|
99
|
-
* ]
|
|
100
|
-
* });
|
|
101
|
-
*
|
|
102
|
-
* @example
|
|
103
|
-
* // Create an equation
|
|
104
|
-
* const equation = createFromJSON({
|
|
105
|
-
* omdType: 'equation',
|
|
106
|
-
* equation: '2x + 3 = 11'
|
|
107
|
-
* });
|
|
108
|
-
*/
|
|
109
|
-
export function createFromJSON(jsonData) {
|
|
110
|
-
if (!jsonData || typeof jsonData !== 'object') {
|
|
111
|
-
throw new Error('createFromJSON requires a valid JSON object');
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
const omdType = jsonData.omdType;
|
|
115
|
-
|
|
116
|
-
if (!omdType) {
|
|
117
|
-
throw new Error('JSON data must include an "omdType" field');
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
const Constructor = OMD_TYPE_MAP[omdType];
|
|
121
|
-
|
|
122
|
-
if (!Constructor) {
|
|
123
|
-
throw new Error(`Unsupported omdType: "${omdType}". Supported types: ${Object.keys(OMD_TYPE_MAP).join(', ')}`);
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
// Create instance and load data
|
|
127
|
-
const omdObject = new Constructor();
|
|
128
|
-
omdObject.loadFromJSON(jsonData);
|
|
129
|
-
|
|
130
|
-
return omdObject;
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
/**
|
|
134
|
-
* Gets the list of supported OMD types
|
|
135
|
-
*
|
|
136
|
-
* @returns {string[]} Array of supported omdType strings
|
|
137
|
-
*/
|
|
138
|
-
export function getSupportedTypes() {
|
|
139
|
-
return Object.keys(OMD_TYPE_MAP);
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
/**
|
|
143
|
-
* Checks if an omdType is supported
|
|
144
|
-
*
|
|
145
|
-
* @param {string} omdType - The type to check
|
|
146
|
-
* @returns {boolean} True if the type is supported
|
|
147
|
-
*/
|
|
148
|
-
export function isTypeSupported(omdType) {
|
|
149
|
-
return omdType in OMD_TYPE_MAP;
|
|
150
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* OMD Factory - Creates OMD objects from JSON data
|
|
3
|
+
*
|
|
4
|
+
* This factory function creates the appropriate OMD object based on the omdType
|
|
5
|
+
* field in the JSON data, eliminating the need for large switch statements.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* import { createFromJSON } from '@teachinglab/omd';
|
|
9
|
+
*
|
|
10
|
+
* const jsonData = { omdType: 'numberLine', min: 0, max: 10 };
|
|
11
|
+
* const omdObject = createFromJSON(jsonData);
|
|
12
|
+
*
|
|
13
|
+
* // Optionally load into existing container
|
|
14
|
+
* const svg = document.createElementNS("http://www.w3.org/2000/svg", "svg");
|
|
15
|
+
* svg.appendChild(omdObject.svgObject);
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import { omdBalanceHanger } from './omdBalanceHanger.js';
|
|
19
|
+
import { omdTable } from './omdTable.js';
|
|
20
|
+
import { omdTapeDiagram } from './omdTapeDiagram.js';
|
|
21
|
+
import { omdCoordinatePlane } from './omdCoordinatePlane.js';
|
|
22
|
+
import { omdNumberLine } from './omdNumberLine.js';
|
|
23
|
+
import { omdNumberTile } from './omdNumberTile.js';
|
|
24
|
+
import { omdRatioChart } from './omdRatioChart.js';
|
|
25
|
+
import { omdTileEquation } from './omdTileEquation.js';
|
|
26
|
+
import { omdSpinner } from './omdSpinner.js';
|
|
27
|
+
import { omdEquation } from './omdEquation.js';
|
|
28
|
+
import { omdExpression } from './omdExpression.js';
|
|
29
|
+
import { omdTerm } from './omdTerm.js';
|
|
30
|
+
import { omdNumber } from './omdNumber.js';
|
|
31
|
+
import { omdVariable } from './omdVariable.js';
|
|
32
|
+
import { omdPowerExpression } from './omdPowerExpression.js';
|
|
33
|
+
import { omdRationalExpression } from './omdRationalExpression.js';
|
|
34
|
+
import { omdFunction } from './omdFunction.js';
|
|
35
|
+
import {
|
|
36
|
+
omdRightTriangle,
|
|
37
|
+
omdIsoscelesTriangle,
|
|
38
|
+
omdRectangle,
|
|
39
|
+
omdEllipse,
|
|
40
|
+
omdCircle,
|
|
41
|
+
omdRegularPolygon
|
|
42
|
+
} from './omdShapes.js';
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Map of omdType strings to their corresponding class constructors
|
|
46
|
+
*/
|
|
47
|
+
const OMD_TYPE_MAP = {
|
|
48
|
+
'balanceHanger': omdBalanceHanger,
|
|
49
|
+
'table': omdTable,
|
|
50
|
+
'tapeDiagram': omdTapeDiagram,
|
|
51
|
+
'coordinatePlane': omdCoordinatePlane,
|
|
52
|
+
'numberLine': omdNumberLine,
|
|
53
|
+
'numberTile': omdNumberTile,
|
|
54
|
+
'ratioChart': omdRatioChart,
|
|
55
|
+
'tileEquation': omdTileEquation,
|
|
56
|
+
'spinner': omdSpinner,
|
|
57
|
+
'equation': omdEquation,
|
|
58
|
+
'expression': omdExpression,
|
|
59
|
+
'term': omdTerm,
|
|
60
|
+
'number': omdNumber,
|
|
61
|
+
'variable': omdVariable,
|
|
62
|
+
'powerExpression': omdPowerExpression,
|
|
63
|
+
'rationalExpression': omdRationalExpression,
|
|
64
|
+
'function': omdFunction,
|
|
65
|
+
'rightTriangle': omdRightTriangle,
|
|
66
|
+
'isoscelesTriangle': omdIsoscelesTriangle,
|
|
67
|
+
'rectangle': omdRectangle,
|
|
68
|
+
'ellipse': omdEllipse,
|
|
69
|
+
'circle': omdCircle,
|
|
70
|
+
'regularPolygon': omdRegularPolygon
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Creates an OMD object from JSON data
|
|
75
|
+
*
|
|
76
|
+
* @param {object} jsonData - The JSON data with an omdType field
|
|
77
|
+
* @returns {object} The created OMD object with data loaded
|
|
78
|
+
* @throws {Error} If omdType is missing or unsupported
|
|
79
|
+
*
|
|
80
|
+
* @example
|
|
81
|
+
* // Create a number line
|
|
82
|
+
* const numberLine = createFromJSON({
|
|
83
|
+
* omdType: 'numberLine',
|
|
84
|
+
* min: 0,
|
|
85
|
+
* max: 10,
|
|
86
|
+
* dotValues: [2, 5, 8]
|
|
87
|
+
* });
|
|
88
|
+
*
|
|
89
|
+
* @example
|
|
90
|
+
* // Create a coordinate plane
|
|
91
|
+
* const plane = createFromJSON({
|
|
92
|
+
* omdType: 'coordinatePlane',
|
|
93
|
+
* xMin: -10,
|
|
94
|
+
* xMax: 10,
|
|
95
|
+
* yMin: -10,
|
|
96
|
+
* yMax: 10,
|
|
97
|
+
* graphEquations: [
|
|
98
|
+
* { equation: 'y = x^2', color: '#e11d48' }
|
|
99
|
+
* ]
|
|
100
|
+
* });
|
|
101
|
+
*
|
|
102
|
+
* @example
|
|
103
|
+
* // Create an equation
|
|
104
|
+
* const equation = createFromJSON({
|
|
105
|
+
* omdType: 'equation',
|
|
106
|
+
* equation: '2x + 3 = 11'
|
|
107
|
+
* });
|
|
108
|
+
*/
|
|
109
|
+
export function createFromJSON(jsonData) {
|
|
110
|
+
if (!jsonData || typeof jsonData !== 'object') {
|
|
111
|
+
throw new Error('createFromJSON requires a valid JSON object');
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const omdType = jsonData.omdType;
|
|
115
|
+
|
|
116
|
+
if (!omdType) {
|
|
117
|
+
throw new Error('JSON data must include an "omdType" field');
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const Constructor = OMD_TYPE_MAP[omdType];
|
|
121
|
+
|
|
122
|
+
if (!Constructor) {
|
|
123
|
+
throw new Error(`Unsupported omdType: "${omdType}". Supported types: ${Object.keys(OMD_TYPE_MAP).join(', ')}`);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// Create instance and load data
|
|
127
|
+
const omdObject = new Constructor();
|
|
128
|
+
omdObject.loadFromJSON(jsonData);
|
|
129
|
+
|
|
130
|
+
return omdObject;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Gets the list of supported OMD types
|
|
135
|
+
*
|
|
136
|
+
* @returns {string[]} Array of supported omdType strings
|
|
137
|
+
*/
|
|
138
|
+
export function getSupportedTypes() {
|
|
139
|
+
return Object.keys(OMD_TYPE_MAP);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Checks if an omdType is supported
|
|
144
|
+
*
|
|
145
|
+
* @param {string} omdType - The type to check
|
|
146
|
+
* @returns {boolean} True if the type is supported
|
|
147
|
+
*/
|
|
148
|
+
export function isTypeSupported(omdType) {
|
|
149
|
+
return omdType in OMD_TYPE_MAP;
|
|
150
|
+
}
|