@teachinglab/omd 0.6.1 → 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 -57
- 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
|
@@ -1,354 +1,354 @@
|
|
|
1
|
-
# Factory Functions
|
|
2
|
-
|
|
3
|
-
OMD provides factory functions to simplify creating objects from JSON data. This eliminates the need for large switch statements when working with dynamic data or AI-generated JSON.
|
|
4
|
-
|
|
5
|
-
## createFromJSON
|
|
6
|
-
|
|
7
|
-
The main factory function that creates OMD objects from JSON data.
|
|
8
|
-
|
|
9
|
-
### Usage
|
|
10
|
-
|
|
11
|
-
```javascript
|
|
12
|
-
import { createFromJSON } from '@teachinglab/omd';
|
|
13
|
-
|
|
14
|
-
const jsonData = {
|
|
15
|
-
omdType: 'numberLine',
|
|
16
|
-
min: 0,
|
|
17
|
-
max: 10,
|
|
18
|
-
dotValues: [2, 5, 8]
|
|
19
|
-
};
|
|
20
|
-
|
|
21
|
-
const omdObject = createFromJSON(jsonData);
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
### Parameters
|
|
25
|
-
|
|
26
|
-
- **jsonData** (object): JSON object with an `omdType` field and component-specific properties
|
|
27
|
-
|
|
28
|
-
### Returns
|
|
29
|
-
|
|
30
|
-
- **object**: The created OMD object with data already loaded via `loadFromJSON()`
|
|
31
|
-
|
|
32
|
-
### Throws
|
|
33
|
-
|
|
34
|
-
- **Error**: If `omdType` is missing or unsupported
|
|
35
|
-
|
|
36
|
-
### Supported Types
|
|
37
|
-
|
|
38
|
-
The factory supports all OMD visualization and mathematical components:
|
|
39
|
-
|
|
40
|
-
**Visualizations:**
|
|
41
|
-
- `balanceHanger`
|
|
42
|
-
- `table`
|
|
43
|
-
- `tapeDiagram`
|
|
44
|
-
- `coordinatePlane`
|
|
45
|
-
- `numberLine`
|
|
46
|
-
- `numberTile`
|
|
47
|
-
- `ratioChart`
|
|
48
|
-
- `tileEquation`
|
|
49
|
-
- `spinner`
|
|
50
|
-
|
|
51
|
-
**Mathematical Components:**
|
|
52
|
-
- `equation`
|
|
53
|
-
- `expression`
|
|
54
|
-
- `term`
|
|
55
|
-
- `number`
|
|
56
|
-
- `variable`
|
|
57
|
-
- `powerExpression`
|
|
58
|
-
- `rationalExpression`
|
|
59
|
-
- `function`
|
|
60
|
-
|
|
61
|
-
**Geometric Shapes:**
|
|
62
|
-
- `rightTriangle`
|
|
63
|
-
- `isoscelesTriangle`
|
|
64
|
-
- `rectangle`
|
|
65
|
-
- `ellipse`
|
|
66
|
-
- `circle`
|
|
67
|
-
- `regularPolygon`
|
|
68
|
-
|
|
69
|
-
## Examples
|
|
70
|
-
|
|
71
|
-
### Creating a Number Line
|
|
72
|
-
|
|
73
|
-
```javascript
|
|
74
|
-
import { createFromJSON } from '@teachinglab/omd';
|
|
75
|
-
|
|
76
|
-
const numberLine = createFromJSON({
|
|
77
|
-
omdType: 'numberLine',
|
|
78
|
-
min: 0,
|
|
79
|
-
max: 20,
|
|
80
|
-
dotValues: [5, 10, 15],
|
|
81
|
-
label: 'Skip Counting by 5'
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
// Add to SVG
|
|
85
|
-
const svg = document.createElementNS("http://www.w3.org/2000/svg", "svg");
|
|
86
|
-
svg.setAttribute("width", numberLine.width);
|
|
87
|
-
svg.setAttribute("height", numberLine.height);
|
|
88
|
-
svg.appendChild(numberLine.svgObject);
|
|
89
|
-
document.body.appendChild(svg);
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
### Creating a Coordinate Plane
|
|
93
|
-
|
|
94
|
-
```javascript
|
|
95
|
-
const plane = createFromJSON({
|
|
96
|
-
omdType: 'coordinatePlane',
|
|
97
|
-
xMin: -10,
|
|
98
|
-
xMax: 10,
|
|
99
|
-
yMin: -10,
|
|
100
|
-
yMax: 10,
|
|
101
|
-
graphEquations: [
|
|
102
|
-
{ equation: 'y = x^2 - 4', color: '#e11d48', strokeWidth: 2 }
|
|
103
|
-
]
|
|
104
|
-
});
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
### Creating an Equation
|
|
108
|
-
|
|
109
|
-
```javascript
|
|
110
|
-
const equation = createFromJSON({
|
|
111
|
-
omdType: 'equation',
|
|
112
|
-
equation: '2x + 3 = 11'
|
|
113
|
-
});
|
|
114
|
-
```
|
|
115
|
-
|
|
116
|
-
### Working with AI-Generated JSON
|
|
117
|
-
|
|
118
|
-
The factory function is especially useful when working with AI-generated content:
|
|
119
|
-
|
|
120
|
-
```javascript
|
|
121
|
-
import { createFromJSON } from '@teachinglab/omd';
|
|
122
|
-
|
|
123
|
-
async function generateVisualization(userRequest) {
|
|
124
|
-
// Call AI API
|
|
125
|
-
const response = await fetch(
|
|
126
|
-
`https://your-api.com/generate?topic=${encodeURIComponent(userRequest)}`
|
|
127
|
-
);
|
|
128
|
-
const jsonData = await response.json();
|
|
129
|
-
|
|
130
|
-
// Create OMD object - no switch statement needed!
|
|
131
|
-
const omdObject = createFromJSON(jsonData);
|
|
132
|
-
|
|
133
|
-
// Render to SVG
|
|
134
|
-
const svg = document.createElementNS("http://www.w3.org/2000/svg", "svg");
|
|
135
|
-
svg.setAttribute("width", omdObject.width || 400);
|
|
136
|
-
svg.setAttribute("height", omdObject.height || 500);
|
|
137
|
-
svg.setAttribute("viewBox", omdObject.svgObject.getAttribute("viewBox"));
|
|
138
|
-
svg.appendChild(omdObject.svgObject);
|
|
139
|
-
|
|
140
|
-
return svg;
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
// Usage
|
|
144
|
-
const svg = await generateVisualization("number line from 0 to 10");
|
|
145
|
-
document.getElementById('container').appendChild(svg);
|
|
146
|
-
```
|
|
147
|
-
|
|
148
|
-
## Helper Functions
|
|
149
|
-
|
|
150
|
-
### getSupportedTypes
|
|
151
|
-
|
|
152
|
-
Returns an array of all supported OMD types.
|
|
153
|
-
|
|
154
|
-
```javascript
|
|
155
|
-
import { getSupportedTypes } from '@teachinglab/omd';
|
|
156
|
-
|
|
157
|
-
const types = getSupportedTypes();
|
|
158
|
-
console.log(types);
|
|
159
|
-
// ['balanceHanger', 'table', 'coordinatePlane', 'numberLine', ...]
|
|
160
|
-
```
|
|
161
|
-
|
|
162
|
-
### isTypeSupported
|
|
163
|
-
|
|
164
|
-
Checks if a given type is supported.
|
|
165
|
-
|
|
166
|
-
```javascript
|
|
167
|
-
import { isTypeSupported } from '@teachinglab/omd';
|
|
168
|
-
|
|
169
|
-
if (isTypeSupported('numberLine')) {
|
|
170
|
-
console.log('Number lines are supported!');
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
if (!isTypeSupported('customType')) {
|
|
174
|
-
console.log('This type is not supported');
|
|
175
|
-
}
|
|
176
|
-
```
|
|
177
|
-
|
|
178
|
-
## Before and After
|
|
179
|
-
|
|
180
|
-
### Before (Without Factory)
|
|
181
|
-
|
|
182
|
-
```javascript
|
|
183
|
-
import {
|
|
184
|
-
omdBalanceHanger,
|
|
185
|
-
omdTable,
|
|
186
|
-
omdNumberLine,
|
|
187
|
-
// ... 20+ more imports
|
|
188
|
-
} from '@teachinglab/omd';
|
|
189
|
-
|
|
190
|
-
let omdObject;
|
|
191
|
-
|
|
192
|
-
switch (jsonData.omdType) {
|
|
193
|
-
case 'balanceHanger':
|
|
194
|
-
omdObject = new omdBalanceHanger();
|
|
195
|
-
break;
|
|
196
|
-
case 'table':
|
|
197
|
-
omdObject = new omdTable();
|
|
198
|
-
break;
|
|
199
|
-
case 'numberLine':
|
|
200
|
-
omdObject = new omdNumberLine();
|
|
201
|
-
break;
|
|
202
|
-
// ... 20+ more cases
|
|
203
|
-
default:
|
|
204
|
-
throw new Error(`Unsupported type: ${jsonData.omdType}`);
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
omdObject.loadFromJSON(jsonData);
|
|
208
|
-
```
|
|
209
|
-
|
|
210
|
-
### After (With Factory)
|
|
211
|
-
|
|
212
|
-
```javascript
|
|
213
|
-
import { createFromJSON } from '@teachinglab/omd';
|
|
214
|
-
|
|
215
|
-
const omdObject = createFromJSON(jsonData);
|
|
216
|
-
```
|
|
217
|
-
|
|
218
|
-
Much cleaner!
|
|
219
|
-
|
|
220
|
-
## Error Handling
|
|
221
|
-
|
|
222
|
-
The factory function provides clear error messages:
|
|
223
|
-
|
|
224
|
-
```javascript
|
|
225
|
-
import { createFromJSON } from '@teachinglab/omd';
|
|
226
|
-
|
|
227
|
-
try {
|
|
228
|
-
// Missing omdType
|
|
229
|
-
const obj1 = createFromJSON({ min: 0, max: 10 });
|
|
230
|
-
} catch (error) {
|
|
231
|
-
console.error(error.message);
|
|
232
|
-
// "JSON data must include an 'omdType' field"
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
try {
|
|
236
|
-
// Unsupported type
|
|
237
|
-
const obj2 = createFromJSON({ omdType: 'unknownType' });
|
|
238
|
-
} catch (error) {
|
|
239
|
-
console.error(error.message);
|
|
240
|
-
// "Unsupported omdType: 'unknownType'. Supported types: balanceHanger, table, ..."
|
|
241
|
-
}
|
|
242
|
-
```
|
|
243
|
-
|
|
244
|
-
## TypeScript Support
|
|
245
|
-
|
|
246
|
-
If using TypeScript, you can type the return value:
|
|
247
|
-
|
|
248
|
-
```typescript
|
|
249
|
-
import { createFromJSON } from '@teachinglab/omd';
|
|
250
|
-
import type { omdNumberLine } from '@teachinglab/omd';
|
|
251
|
-
|
|
252
|
-
const jsonData = {
|
|
253
|
-
omdType: 'numberLine',
|
|
254
|
-
min: 0,
|
|
255
|
-
max: 10
|
|
256
|
-
};
|
|
257
|
-
|
|
258
|
-
const numberLine = createFromJSON(jsonData) as omdNumberLine;
|
|
259
|
-
```
|
|
260
|
-
|
|
261
|
-
## Best Practices
|
|
262
|
-
|
|
263
|
-
### 1. Always Include omdType
|
|
264
|
-
|
|
265
|
-
Ensure your JSON data includes the `omdType` field:
|
|
266
|
-
|
|
267
|
-
```javascript
|
|
268
|
-
const jsonData = {
|
|
269
|
-
omdType: 'coordinatePlane', // Required!
|
|
270
|
-
xMin: -10,
|
|
271
|
-
xMax: 10
|
|
272
|
-
};
|
|
273
|
-
```
|
|
274
|
-
|
|
275
|
-
### 2. Validate Types Before Creation
|
|
276
|
-
|
|
277
|
-
For dynamic data, validate the type first:
|
|
278
|
-
|
|
279
|
-
```javascript
|
|
280
|
-
import { isTypeSupported, createFromJSON } from '@teachinglab/omd';
|
|
281
|
-
|
|
282
|
-
if (isTypeSupported(jsonData.omdType)) {
|
|
283
|
-
const omdObject = createFromJSON(jsonData);
|
|
284
|
-
} else {
|
|
285
|
-
console.error(`Type ${jsonData.omdType} is not supported`);
|
|
286
|
-
}
|
|
287
|
-
```
|
|
288
|
-
|
|
289
|
-
### 3. Use with Display System
|
|
290
|
-
|
|
291
|
-
Combine with the display system for easy rendering:
|
|
292
|
-
|
|
293
|
-
```javascript
|
|
294
|
-
import { createFromJSON, omdDisplay } from '@teachinglab/omd';
|
|
295
|
-
|
|
296
|
-
const display = new omdDisplay(document.getElementById('container'));
|
|
297
|
-
const omdObject = createFromJSON(jsonData);
|
|
298
|
-
display.render(omdObject);
|
|
299
|
-
```
|
|
300
|
-
|
|
301
|
-
## Complete Example
|
|
302
|
-
|
|
303
|
-
Here's a complete example integrating the factory with an AI API:
|
|
304
|
-
|
|
305
|
-
```html
|
|
306
|
-
<!DOCTYPE html>
|
|
307
|
-
<html lang="en">
|
|
308
|
-
<head>
|
|
309
|
-
<meta charset="UTF-8">
|
|
310
|
-
<title>OMD Factory Example</title>
|
|
311
|
-
</head>
|
|
312
|
-
<body>
|
|
313
|
-
<input type="text" id="input" placeholder="Describe what to visualize" />
|
|
314
|
-
<button id="generate">Generate</button>
|
|
315
|
-
<div id="container"></div>
|
|
316
|
-
|
|
317
|
-
<script type="module">
|
|
318
|
-
import { createFromJSON } from '@teachinglab/omd';
|
|
319
|
-
|
|
320
|
-
document.getElementById('generate').addEventListener('click', async () => {
|
|
321
|
-
const request = document.getElementById('input').value;
|
|
322
|
-
|
|
323
|
-
try {
|
|
324
|
-
// Get JSON from AI API
|
|
325
|
-
const response = await fetch(`/api/generate?q=${encodeURIComponent(request)}`);
|
|
326
|
-
const jsonData = await response.json();
|
|
327
|
-
|
|
328
|
-
// Create OMD object
|
|
329
|
-
const omdObject = createFromJSON(jsonData);
|
|
330
|
-
|
|
331
|
-
// Render to SVG
|
|
332
|
-
const svg = document.createElementNS("http://www.w3.org/2000/svg", "svg");
|
|
333
|
-
svg.setAttribute("width", omdObject.width || 400);
|
|
334
|
-
svg.setAttribute("height", omdObject.height || 500);
|
|
335
|
-
svg.setAttribute("viewBox", omdObject.svgObject.getAttribute("viewBox"));
|
|
336
|
-
svg.appendChild(omdObject.svgObject);
|
|
337
|
-
|
|
338
|
-
// Add to page
|
|
339
|
-
document.getElementById('container').innerHTML = '';
|
|
340
|
-
document.getElementById('container').appendChild(svg);
|
|
341
|
-
} catch (error) {
|
|
342
|
-
console.error('Error:', error.message);
|
|
343
|
-
}
|
|
344
|
-
});
|
|
345
|
-
</script>
|
|
346
|
-
</body>
|
|
347
|
-
</html>
|
|
348
|
-
```
|
|
349
|
-
|
|
350
|
-
## See Also
|
|
351
|
-
|
|
352
|
-
- [JSON Schemas](../json-schemas.md) - Complete JSON reference for all components
|
|
353
|
-
- [Getting Started](./getting-started.md) - Basic setup and usage
|
|
354
|
-
- [API Reference](../api/api-reference.md) - Detailed API documentation
|
|
1
|
+
# Factory Functions
|
|
2
|
+
|
|
3
|
+
OMD provides factory functions to simplify creating objects from JSON data. This eliminates the need for large switch statements when working with dynamic data or AI-generated JSON.
|
|
4
|
+
|
|
5
|
+
## createFromJSON
|
|
6
|
+
|
|
7
|
+
The main factory function that creates OMD objects from JSON data.
|
|
8
|
+
|
|
9
|
+
### Usage
|
|
10
|
+
|
|
11
|
+
```javascript
|
|
12
|
+
import { createFromJSON } from '@teachinglab/omd';
|
|
13
|
+
|
|
14
|
+
const jsonData = {
|
|
15
|
+
omdType: 'numberLine',
|
|
16
|
+
min: 0,
|
|
17
|
+
max: 10,
|
|
18
|
+
dotValues: [2, 5, 8]
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
const omdObject = createFromJSON(jsonData);
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
### Parameters
|
|
25
|
+
|
|
26
|
+
- **jsonData** (object): JSON object with an `omdType` field and component-specific properties
|
|
27
|
+
|
|
28
|
+
### Returns
|
|
29
|
+
|
|
30
|
+
- **object**: The created OMD object with data already loaded via `loadFromJSON()`
|
|
31
|
+
|
|
32
|
+
### Throws
|
|
33
|
+
|
|
34
|
+
- **Error**: If `omdType` is missing or unsupported
|
|
35
|
+
|
|
36
|
+
### Supported Types
|
|
37
|
+
|
|
38
|
+
The factory supports all OMD visualization and mathematical components:
|
|
39
|
+
|
|
40
|
+
**Visualizations:**
|
|
41
|
+
- `balanceHanger`
|
|
42
|
+
- `table`
|
|
43
|
+
- `tapeDiagram`
|
|
44
|
+
- `coordinatePlane`
|
|
45
|
+
- `numberLine`
|
|
46
|
+
- `numberTile`
|
|
47
|
+
- `ratioChart`
|
|
48
|
+
- `tileEquation`
|
|
49
|
+
- `spinner`
|
|
50
|
+
|
|
51
|
+
**Mathematical Components:**
|
|
52
|
+
- `equation`
|
|
53
|
+
- `expression`
|
|
54
|
+
- `term`
|
|
55
|
+
- `number`
|
|
56
|
+
- `variable`
|
|
57
|
+
- `powerExpression`
|
|
58
|
+
- `rationalExpression`
|
|
59
|
+
- `function`
|
|
60
|
+
|
|
61
|
+
**Geometric Shapes:**
|
|
62
|
+
- `rightTriangle`
|
|
63
|
+
- `isoscelesTriangle`
|
|
64
|
+
- `rectangle`
|
|
65
|
+
- `ellipse`
|
|
66
|
+
- `circle`
|
|
67
|
+
- `regularPolygon`
|
|
68
|
+
|
|
69
|
+
## Examples
|
|
70
|
+
|
|
71
|
+
### Creating a Number Line
|
|
72
|
+
|
|
73
|
+
```javascript
|
|
74
|
+
import { createFromJSON } from '@teachinglab/omd';
|
|
75
|
+
|
|
76
|
+
const numberLine = createFromJSON({
|
|
77
|
+
omdType: 'numberLine',
|
|
78
|
+
min: 0,
|
|
79
|
+
max: 20,
|
|
80
|
+
dotValues: [5, 10, 15],
|
|
81
|
+
label: 'Skip Counting by 5'
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
// Add to SVG
|
|
85
|
+
const svg = document.createElementNS("http://www.w3.org/2000/svg", "svg");
|
|
86
|
+
svg.setAttribute("width", numberLine.width);
|
|
87
|
+
svg.setAttribute("height", numberLine.height);
|
|
88
|
+
svg.appendChild(numberLine.svgObject);
|
|
89
|
+
document.body.appendChild(svg);
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### Creating a Coordinate Plane
|
|
93
|
+
|
|
94
|
+
```javascript
|
|
95
|
+
const plane = createFromJSON({
|
|
96
|
+
omdType: 'coordinatePlane',
|
|
97
|
+
xMin: -10,
|
|
98
|
+
xMax: 10,
|
|
99
|
+
yMin: -10,
|
|
100
|
+
yMax: 10,
|
|
101
|
+
graphEquations: [
|
|
102
|
+
{ equation: 'y = x^2 - 4', color: '#e11d48', strokeWidth: 2 }
|
|
103
|
+
]
|
|
104
|
+
});
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### Creating an Equation
|
|
108
|
+
|
|
109
|
+
```javascript
|
|
110
|
+
const equation = createFromJSON({
|
|
111
|
+
omdType: 'equation',
|
|
112
|
+
equation: '2x + 3 = 11'
|
|
113
|
+
});
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### Working with AI-Generated JSON
|
|
117
|
+
|
|
118
|
+
The factory function is especially useful when working with AI-generated content:
|
|
119
|
+
|
|
120
|
+
```javascript
|
|
121
|
+
import { createFromJSON } from '@teachinglab/omd';
|
|
122
|
+
|
|
123
|
+
async function generateVisualization(userRequest) {
|
|
124
|
+
// Call AI API
|
|
125
|
+
const response = await fetch(
|
|
126
|
+
`https://your-api.com/generate?topic=${encodeURIComponent(userRequest)}`
|
|
127
|
+
);
|
|
128
|
+
const jsonData = await response.json();
|
|
129
|
+
|
|
130
|
+
// Create OMD object - no switch statement needed!
|
|
131
|
+
const omdObject = createFromJSON(jsonData);
|
|
132
|
+
|
|
133
|
+
// Render to SVG
|
|
134
|
+
const svg = document.createElementNS("http://www.w3.org/2000/svg", "svg");
|
|
135
|
+
svg.setAttribute("width", omdObject.width || 400);
|
|
136
|
+
svg.setAttribute("height", omdObject.height || 500);
|
|
137
|
+
svg.setAttribute("viewBox", omdObject.svgObject.getAttribute("viewBox"));
|
|
138
|
+
svg.appendChild(omdObject.svgObject);
|
|
139
|
+
|
|
140
|
+
return svg;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// Usage
|
|
144
|
+
const svg = await generateVisualization("number line from 0 to 10");
|
|
145
|
+
document.getElementById('container').appendChild(svg);
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
## Helper Functions
|
|
149
|
+
|
|
150
|
+
### getSupportedTypes
|
|
151
|
+
|
|
152
|
+
Returns an array of all supported OMD types.
|
|
153
|
+
|
|
154
|
+
```javascript
|
|
155
|
+
import { getSupportedTypes } from '@teachinglab/omd';
|
|
156
|
+
|
|
157
|
+
const types = getSupportedTypes();
|
|
158
|
+
console.log(types);
|
|
159
|
+
// ['balanceHanger', 'table', 'coordinatePlane', 'numberLine', ...]
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### isTypeSupported
|
|
163
|
+
|
|
164
|
+
Checks if a given type is supported.
|
|
165
|
+
|
|
166
|
+
```javascript
|
|
167
|
+
import { isTypeSupported } from '@teachinglab/omd';
|
|
168
|
+
|
|
169
|
+
if (isTypeSupported('numberLine')) {
|
|
170
|
+
console.log('Number lines are supported!');
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
if (!isTypeSupported('customType')) {
|
|
174
|
+
console.log('This type is not supported');
|
|
175
|
+
}
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
## Before and After
|
|
179
|
+
|
|
180
|
+
### Before (Without Factory)
|
|
181
|
+
|
|
182
|
+
```javascript
|
|
183
|
+
import {
|
|
184
|
+
omdBalanceHanger,
|
|
185
|
+
omdTable,
|
|
186
|
+
omdNumberLine,
|
|
187
|
+
// ... 20+ more imports
|
|
188
|
+
} from '@teachinglab/omd';
|
|
189
|
+
|
|
190
|
+
let omdObject;
|
|
191
|
+
|
|
192
|
+
switch (jsonData.omdType) {
|
|
193
|
+
case 'balanceHanger':
|
|
194
|
+
omdObject = new omdBalanceHanger();
|
|
195
|
+
break;
|
|
196
|
+
case 'table':
|
|
197
|
+
omdObject = new omdTable();
|
|
198
|
+
break;
|
|
199
|
+
case 'numberLine':
|
|
200
|
+
omdObject = new omdNumberLine();
|
|
201
|
+
break;
|
|
202
|
+
// ... 20+ more cases
|
|
203
|
+
default:
|
|
204
|
+
throw new Error(`Unsupported type: ${jsonData.omdType}`);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
omdObject.loadFromJSON(jsonData);
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
### After (With Factory)
|
|
211
|
+
|
|
212
|
+
```javascript
|
|
213
|
+
import { createFromJSON } from '@teachinglab/omd';
|
|
214
|
+
|
|
215
|
+
const omdObject = createFromJSON(jsonData);
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
Much cleaner!
|
|
219
|
+
|
|
220
|
+
## Error Handling
|
|
221
|
+
|
|
222
|
+
The factory function provides clear error messages:
|
|
223
|
+
|
|
224
|
+
```javascript
|
|
225
|
+
import { createFromJSON } from '@teachinglab/omd';
|
|
226
|
+
|
|
227
|
+
try {
|
|
228
|
+
// Missing omdType
|
|
229
|
+
const obj1 = createFromJSON({ min: 0, max: 10 });
|
|
230
|
+
} catch (error) {
|
|
231
|
+
console.error(error.message);
|
|
232
|
+
// "JSON data must include an 'omdType' field"
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
try {
|
|
236
|
+
// Unsupported type
|
|
237
|
+
const obj2 = createFromJSON({ omdType: 'unknownType' });
|
|
238
|
+
} catch (error) {
|
|
239
|
+
console.error(error.message);
|
|
240
|
+
// "Unsupported omdType: 'unknownType'. Supported types: balanceHanger, table, ..."
|
|
241
|
+
}
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
## TypeScript Support
|
|
245
|
+
|
|
246
|
+
If using TypeScript, you can type the return value:
|
|
247
|
+
|
|
248
|
+
```typescript
|
|
249
|
+
import { createFromJSON } from '@teachinglab/omd';
|
|
250
|
+
import type { omdNumberLine } from '@teachinglab/omd';
|
|
251
|
+
|
|
252
|
+
const jsonData = {
|
|
253
|
+
omdType: 'numberLine',
|
|
254
|
+
min: 0,
|
|
255
|
+
max: 10
|
|
256
|
+
};
|
|
257
|
+
|
|
258
|
+
const numberLine = createFromJSON(jsonData) as omdNumberLine;
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
## Best Practices
|
|
262
|
+
|
|
263
|
+
### 1. Always Include omdType
|
|
264
|
+
|
|
265
|
+
Ensure your JSON data includes the `omdType` field:
|
|
266
|
+
|
|
267
|
+
```javascript
|
|
268
|
+
const jsonData = {
|
|
269
|
+
omdType: 'coordinatePlane', // Required!
|
|
270
|
+
xMin: -10,
|
|
271
|
+
xMax: 10
|
|
272
|
+
};
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
### 2. Validate Types Before Creation
|
|
276
|
+
|
|
277
|
+
For dynamic data, validate the type first:
|
|
278
|
+
|
|
279
|
+
```javascript
|
|
280
|
+
import { isTypeSupported, createFromJSON } from '@teachinglab/omd';
|
|
281
|
+
|
|
282
|
+
if (isTypeSupported(jsonData.omdType)) {
|
|
283
|
+
const omdObject = createFromJSON(jsonData);
|
|
284
|
+
} else {
|
|
285
|
+
console.error(`Type ${jsonData.omdType} is not supported`);
|
|
286
|
+
}
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
### 3. Use with Display System
|
|
290
|
+
|
|
291
|
+
Combine with the display system for easy rendering:
|
|
292
|
+
|
|
293
|
+
```javascript
|
|
294
|
+
import { createFromJSON, omdDisplay } from '@teachinglab/omd';
|
|
295
|
+
|
|
296
|
+
const display = new omdDisplay(document.getElementById('container'));
|
|
297
|
+
const omdObject = createFromJSON(jsonData);
|
|
298
|
+
display.render(omdObject);
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
## Complete Example
|
|
302
|
+
|
|
303
|
+
Here's a complete example integrating the factory with an AI API:
|
|
304
|
+
|
|
305
|
+
```html
|
|
306
|
+
<!DOCTYPE html>
|
|
307
|
+
<html lang="en">
|
|
308
|
+
<head>
|
|
309
|
+
<meta charset="UTF-8">
|
|
310
|
+
<title>OMD Factory Example</title>
|
|
311
|
+
</head>
|
|
312
|
+
<body>
|
|
313
|
+
<input type="text" id="input" placeholder="Describe what to visualize" />
|
|
314
|
+
<button id="generate">Generate</button>
|
|
315
|
+
<div id="container"></div>
|
|
316
|
+
|
|
317
|
+
<script type="module">
|
|
318
|
+
import { createFromJSON } from '@teachinglab/omd';
|
|
319
|
+
|
|
320
|
+
document.getElementById('generate').addEventListener('click', async () => {
|
|
321
|
+
const request = document.getElementById('input').value;
|
|
322
|
+
|
|
323
|
+
try {
|
|
324
|
+
// Get JSON from AI API
|
|
325
|
+
const response = await fetch(`/api/generate?q=${encodeURIComponent(request)}`);
|
|
326
|
+
const jsonData = await response.json();
|
|
327
|
+
|
|
328
|
+
// Create OMD object
|
|
329
|
+
const omdObject = createFromJSON(jsonData);
|
|
330
|
+
|
|
331
|
+
// Render to SVG
|
|
332
|
+
const svg = document.createElementNS("http://www.w3.org/2000/svg", "svg");
|
|
333
|
+
svg.setAttribute("width", omdObject.width || 400);
|
|
334
|
+
svg.setAttribute("height", omdObject.height || 500);
|
|
335
|
+
svg.setAttribute("viewBox", omdObject.svgObject.getAttribute("viewBox"));
|
|
336
|
+
svg.appendChild(omdObject.svgObject);
|
|
337
|
+
|
|
338
|
+
// Add to page
|
|
339
|
+
document.getElementById('container').innerHTML = '';
|
|
340
|
+
document.getElementById('container').appendChild(svg);
|
|
341
|
+
} catch (error) {
|
|
342
|
+
console.error('Error:', error.message);
|
|
343
|
+
}
|
|
344
|
+
});
|
|
345
|
+
</script>
|
|
346
|
+
</body>
|
|
347
|
+
</html>
|
|
348
|
+
```
|
|
349
|
+
|
|
350
|
+
## See Also
|
|
351
|
+
|
|
352
|
+
- [JSON Schemas](../json-schemas.md) - Complete JSON reference for all components
|
|
353
|
+
- [Getting Started](./getting-started.md) - Basic setup and usage
|
|
354
|
+
- [API Reference](../api/api-reference.md) - Detailed API documentation
|