@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.
Files changed (198) hide show
  1. package/README.md +257 -251
  2. package/README.old.md +137 -137
  3. package/canvas/core/canvasConfig.js +202 -202
  4. package/canvas/drawing/segment.js +167 -167
  5. package/canvas/drawing/stroke.js +385 -385
  6. package/canvas/events/eventManager.js +444 -444
  7. package/canvas/events/pointerEventHandler.js +262 -262
  8. package/canvas/index.js +48 -48
  9. package/canvas/tools/PointerTool.js +71 -71
  10. package/canvas/tools/tool.js +222 -222
  11. package/canvas/utils/boundingBox.js +377 -377
  12. package/canvas/utils/mathUtils.js +258 -258
  13. package/docs/api/configuration-options.md +198 -198
  14. package/docs/api/eventManager.md +82 -82
  15. package/docs/api/focusFrameManager.md +144 -144
  16. package/docs/api/index.md +105 -105
  17. package/docs/api/main.md +62 -62
  18. package/docs/api/omdBinaryExpressionNode.md +86 -86
  19. package/docs/api/omdCanvas.md +83 -83
  20. package/docs/api/omdConfigManager.md +112 -112
  21. package/docs/api/omdConstantNode.md +52 -52
  22. package/docs/api/omdDisplay.md +87 -87
  23. package/docs/api/omdEquationNode.md +174 -174
  24. package/docs/api/omdEquationSequenceNode.md +258 -258
  25. package/docs/api/omdEquationStack.md +192 -192
  26. package/docs/api/omdFunctionNode.md +82 -82
  27. package/docs/api/omdGroupNode.md +78 -78
  28. package/docs/api/omdHelpers.md +87 -87
  29. package/docs/api/omdLeafNode.md +85 -85
  30. package/docs/api/omdNode.md +201 -201
  31. package/docs/api/omdOperationDisplayNode.md +117 -117
  32. package/docs/api/omdOperatorNode.md +91 -91
  33. package/docs/api/omdParenthesisNode.md +133 -133
  34. package/docs/api/omdPopup.md +191 -191
  35. package/docs/api/omdPowerNode.md +131 -131
  36. package/docs/api/omdRationalNode.md +144 -144
  37. package/docs/api/omdSequenceNode.md +128 -128
  38. package/docs/api/omdSimplification.md +78 -78
  39. package/docs/api/omdSqrtNode.md +144 -144
  40. package/docs/api/omdStepVisualizer.md +146 -146
  41. package/docs/api/omdStepVisualizerHighlighting.md +65 -65
  42. package/docs/api/omdStepVisualizerInteractiveSteps.md +108 -108
  43. package/docs/api/omdStepVisualizerLayout.md +70 -70
  44. package/docs/api/omdStepVisualizerNodeUtils.md +140 -140
  45. package/docs/api/omdStepVisualizerTextBoxes.md +76 -76
  46. package/docs/api/omdToolbar.md +130 -130
  47. package/docs/api/omdTranscriptionService.md +95 -95
  48. package/docs/api/omdTreeDiff.md +169 -169
  49. package/docs/api/omdUnaryExpressionNode.md +137 -137
  50. package/docs/api/omdUtilities.md +82 -82
  51. package/docs/api/omdVariableNode.md +123 -123
  52. package/docs/api/selectTool.md +74 -74
  53. package/docs/api/simplificationEngine.md +97 -97
  54. package/docs/api/simplificationRules.md +76 -76
  55. package/docs/api/simplificationUtils.md +64 -64
  56. package/docs/api/transcribe.md +43 -43
  57. package/docs/api-reference.md +85 -85
  58. package/docs/index.html +453 -453
  59. package/docs/index.md +38 -38
  60. package/docs/omd-objects.md +258 -258
  61. package/index.js +79 -79
  62. package/jsvg/index.js +3 -0
  63. package/jsvg/jsvg.js +898 -898
  64. package/jsvg/jsvgComponents.js +357 -358
  65. package/npm-docs/DOCUMENTATION_SUMMARY.md +220 -220
  66. package/npm-docs/README.md +251 -251
  67. package/npm-docs/api/api-reference.md +85 -85
  68. package/npm-docs/api/configuration-options.md +198 -198
  69. package/npm-docs/api/eventManager.md +82 -82
  70. package/npm-docs/api/expression-nodes.md +561 -561
  71. package/npm-docs/api/focusFrameManager.md +144 -144
  72. package/npm-docs/api/index.md +105 -105
  73. package/npm-docs/api/main.md +62 -62
  74. package/npm-docs/api/omdBinaryExpressionNode.md +86 -86
  75. package/npm-docs/api/omdCanvas.md +83 -83
  76. package/npm-docs/api/omdConfigManager.md +112 -112
  77. package/npm-docs/api/omdConstantNode.md +52 -52
  78. package/npm-docs/api/omdDisplay.md +87 -87
  79. package/npm-docs/api/omdEquationNode.md +174 -174
  80. package/npm-docs/api/omdEquationSequenceNode.md +258 -258
  81. package/npm-docs/api/omdEquationStack.md +192 -192
  82. package/npm-docs/api/omdFunctionNode.md +82 -82
  83. package/npm-docs/api/omdGroupNode.md +78 -78
  84. package/npm-docs/api/omdHelpers.md +87 -87
  85. package/npm-docs/api/omdLeafNode.md +85 -85
  86. package/npm-docs/api/omdNode.md +201 -201
  87. package/npm-docs/api/omdOperationDisplayNode.md +117 -117
  88. package/npm-docs/api/omdOperatorNode.md +91 -91
  89. package/npm-docs/api/omdParenthesisNode.md +133 -133
  90. package/npm-docs/api/omdPopup.md +191 -191
  91. package/npm-docs/api/omdPowerNode.md +131 -131
  92. package/npm-docs/api/omdRationalNode.md +144 -144
  93. package/npm-docs/api/omdSequenceNode.md +128 -128
  94. package/npm-docs/api/omdSimplification.md +78 -78
  95. package/npm-docs/api/omdSqrtNode.md +144 -144
  96. package/npm-docs/api/omdStepVisualizer.md +146 -146
  97. package/npm-docs/api/omdStepVisualizerHighlighting.md +65 -65
  98. package/npm-docs/api/omdStepVisualizerInteractiveSteps.md +108 -108
  99. package/npm-docs/api/omdStepVisualizerLayout.md +70 -70
  100. package/npm-docs/api/omdStepVisualizerNodeUtils.md +140 -140
  101. package/npm-docs/api/omdStepVisualizerTextBoxes.md +76 -76
  102. package/npm-docs/api/omdToolbar.md +130 -130
  103. package/npm-docs/api/omdTranscriptionService.md +95 -95
  104. package/npm-docs/api/omdTreeDiff.md +169 -169
  105. package/npm-docs/api/omdUnaryExpressionNode.md +137 -137
  106. package/npm-docs/api/omdUtilities.md +82 -82
  107. package/npm-docs/api/omdVariableNode.md +123 -123
  108. package/npm-docs/api/selectTool.md +74 -74
  109. package/npm-docs/api/simplificationEngine.md +97 -97
  110. package/npm-docs/api/simplificationRules.md +76 -76
  111. package/npm-docs/api/simplificationUtils.md +64 -64
  112. package/npm-docs/api/transcribe.md +43 -43
  113. package/npm-docs/guides/equations.md +854 -854
  114. package/npm-docs/guides/factory-functions.md +354 -354
  115. package/npm-docs/guides/getting-started.md +318 -318
  116. package/npm-docs/guides/quick-examples.md +525 -525
  117. package/npm-docs/guides/visualizations.md +682 -682
  118. package/npm-docs/index.html +12 -0
  119. package/npm-docs/json-schemas.md +826 -826
  120. package/omd/config/omdConfigManager.js +279 -267
  121. package/omd/core/index.js +158 -158
  122. package/omd/core/omdEquationStack.js +546 -546
  123. package/omd/core/omdUtilities.js +113 -113
  124. package/omd/display/omdDisplay.js +969 -962
  125. package/omd/display/omdToolbar.js +501 -501
  126. package/omd/nodes/omdBinaryExpressionNode.js +459 -459
  127. package/omd/nodes/omdConstantNode.js +141 -141
  128. package/omd/nodes/omdEquationNode.js +1327 -1327
  129. package/omd/nodes/omdFunctionNode.js +351 -351
  130. package/omd/nodes/omdGroupNode.js +67 -67
  131. package/omd/nodes/omdLeafNode.js +76 -76
  132. package/omd/nodes/omdNode.js +556 -556
  133. package/omd/nodes/omdOperationDisplayNode.js +321 -321
  134. package/omd/nodes/omdOperatorNode.js +108 -108
  135. package/omd/nodes/omdParenthesisNode.js +292 -292
  136. package/omd/nodes/omdPowerNode.js +235 -235
  137. package/omd/nodes/omdRationalNode.js +295 -295
  138. package/omd/nodes/omdSqrtNode.js +307 -307
  139. package/omd/nodes/omdUnaryExpressionNode.js +227 -227
  140. package/omd/nodes/omdVariableNode.js +122 -122
  141. package/omd/simplification/omdSimplification.js +140 -140
  142. package/omd/simplification/omdSimplificationEngine.js +887 -887
  143. package/omd/simplification/package.json +5 -5
  144. package/omd/simplification/rules/binaryRules.js +1037 -1037
  145. package/omd/simplification/rules/functionRules.js +111 -111
  146. package/omd/simplification/rules/index.js +48 -48
  147. package/omd/simplification/rules/parenthesisRules.js +19 -19
  148. package/omd/simplification/rules/powerRules.js +143 -143
  149. package/omd/simplification/rules/rationalRules.js +725 -725
  150. package/omd/simplification/rules/sqrtRules.js +48 -48
  151. package/omd/simplification/rules/unaryRules.js +37 -37
  152. package/omd/simplification/simplificationRules.js +31 -31
  153. package/omd/simplification/simplificationUtils.js +1055 -1055
  154. package/omd/step-visualizer/omdStepVisualizer.js +947 -947
  155. package/omd/step-visualizer/omdStepVisualizerHighlighting.js +246 -246
  156. package/omd/step-visualizer/omdStepVisualizerLayout.js +892 -892
  157. package/omd/step-visualizer/omdStepVisualizerTextBoxes.js +200 -200
  158. package/omd/utils/aiNextEquationStep.js +106 -106
  159. package/omd/utils/omdNodeOverlay.js +638 -638
  160. package/omd/utils/omdPopup.js +1203 -1203
  161. package/omd/utils/omdStepVisualizerInteractiveSteps.js +684 -684
  162. package/omd/utils/omdStepVisualizerNodeUtils.js +267 -267
  163. package/omd/utils/omdTranscriptionService.js +123 -123
  164. package/omd/utils/omdTreeDiff.js +733 -733
  165. package/package.json +59 -57
  166. package/readme.html +184 -120
  167. package/src/index.js +74 -74
  168. package/src/json-schemas.md +576 -576
  169. package/src/omd-json-samples.js +147 -147
  170. package/src/omdApp.js +391 -391
  171. package/src/omdAppCanvas.js +335 -335
  172. package/src/omdBalanceHanger.js +199 -199
  173. package/src/omdColor.js +13 -13
  174. package/src/omdCoordinatePlane.js +541 -541
  175. package/src/omdExpression.js +115 -115
  176. package/src/omdFactory.js +150 -150
  177. package/src/omdFunction.js +114 -114
  178. package/src/omdMetaExpression.js +290 -290
  179. package/src/omdNaturalExpression.js +563 -563
  180. package/src/omdNode.js +383 -383
  181. package/src/omdNumber.js +52 -52
  182. package/src/omdNumberLine.js +114 -112
  183. package/src/omdNumberTile.js +118 -118
  184. package/src/omdOperator.js +72 -72
  185. package/src/omdPowerExpression.js +91 -91
  186. package/src/omdProblem.js +259 -259
  187. package/src/omdRatioChart.js +251 -251
  188. package/src/omdRationalExpression.js +114 -114
  189. package/src/omdSampleData.js +215 -215
  190. package/src/omdShapes.js +512 -512
  191. package/src/omdSpinner.js +151 -151
  192. package/src/omdString.js +49 -49
  193. package/src/omdTable.js +498 -498
  194. package/src/omdTapeDiagram.js +244 -244
  195. package/src/omdTerm.js +91 -91
  196. package/src/omdTileEquation.js +349 -349
  197. package/src/omdUtils.js +84 -84
  198. package/src/omdVariable.js +51 -51
@@ -1,561 +1,561 @@
1
- # Expression Nodes
2
-
3
- Expression nodes are the building blocks of mathematical expressions and equations in OMD. They form a tree structure that represents the mathematical content.
4
-
5
- ## Overview
6
-
7
- OMD uses a node-based system where every mathematical element is represented as a node in an expression tree. This allows for powerful manipulation, simplification, and visualization of mathematical expressions.
8
-
9
- ## Core Node Classes
10
-
11
- ### omdNode
12
-
13
- The abstract base class for all nodes in the expression tree.
14
-
15
- **See**: [omdNode API Documentation](./omdNode.md)
16
-
17
- ### omdEquationNode
18
-
19
- Represents a complete mathematical equation with left side, right side, and equals sign.
20
-
21
- **Class**: `omdEquationNode extends omdNode`
22
-
23
- #### Static Methods
24
-
25
- **`fromString(equationString)`**
26
-
27
- Creates an equation node from a string representation.
28
-
29
- ```javascript
30
- import { omdEquationNode } from '@teachinglab/omd';
31
-
32
- const equation = omdEquationNode.fromString('2x + 3 = 11');
33
- ```
34
-
35
- - **Parameters**:
36
- - `equationString` (string): The equation string (e.g., `"2x + 4 = 10"`)
37
- - **Returns**: `omdEquationNode`
38
- - **Throws**: Error if string is not a valid equation
39
-
40
- #### Properties
41
-
42
- - **`left`** (omdNode): The left side of the equation
43
- - **`right`** (omdNode): The right side of the equation
44
- - **`equalsSign`** (omdOperatorNode): The equals sign operator
45
-
46
- #### Manipulation Methods
47
-
48
- **`addToBothSides(value)`**
49
-
50
- Returns a new equation with a value added to both sides.
51
-
52
- ```javascript
53
- const newEq = equation.addToBothSides(5);
54
- ```
55
-
56
- - **Parameters**:
57
- - `value` (number | object): Value to add
58
- - **Returns**: `omdEquationNode`
59
-
60
- **`subtractFromBothSides(value)`**
61
-
62
- Returns a new equation with a value subtracted from both sides.
63
-
64
- ```javascript
65
- const newEq = equation.subtractFromBothSides(3);
66
- ```
67
-
68
- - **Parameters**:
69
- - `value` (number | object): Value to subtract
70
- - **Returns**: `omdEquationNode`
71
-
72
- **`multiplyBothSides(value)`**
73
-
74
- Returns a new equation with both sides multiplied by a value.
75
-
76
- ```javascript
77
- const newEq = equation.multiplyBothSides(2);
78
- ```
79
-
80
- - **Parameters**:
81
- - `value` (number | object): Value to multiply by
82
- - **Returns**: `omdEquationNode`
83
-
84
- **`divideBothSides(value)`**
85
-
86
- Returns a new equation with both sides divided by a value.
87
-
88
- ```javascript
89
- const newEq = equation.divideBothSides(2);
90
- ```
91
-
92
- - **Parameters**:
93
- - `value` (number | object): Value to divide by
94
- - **Returns**: `omdEquationNode`
95
-
96
- **`applyFunction(functionName)`**
97
-
98
- Applies a function (e.g., sqrt, log) to both sides.
99
-
100
- ```javascript
101
- const newEq = equation.applyFunction('sqrt');
102
- ```
103
-
104
- - **Parameters**:
105
- - `functionName` (string): Name of function to apply
106
- - **Returns**: `omdEquationNode`
107
-
108
- **`applyOperation(value, operation, side = 'both')`**
109
-
110
- Applies an arithmetic operation to one or both sides.
111
-
112
- ```javascript
113
- const newEq = equation.applyOperation(5, 'add', 'left');
114
- ```
115
-
116
- - **Parameters**:
117
- - `value` (number | omdNode): Value to apply
118
- - `operation` (string): Operation type: `'add'`, `'subtract'`, `'multiply'`, or `'divide'`
119
- - `side` (string): Side to apply to: `'left'`, `'right'`, or `'both'` (default: `'both'`)
120
- - **Returns**: `omdEquationNode`
121
-
122
- **`swapSides()`**
123
-
124
- Swaps the left and right sides of the equation.
125
-
126
- ```javascript
127
- const swapped = equation.swapSides();
128
- ```
129
-
130
- - **Returns**: `omdEquationNode`
131
-
132
- **`simplify()`**
133
-
134
- Simplifies both sides using the simplification engine.
135
-
136
- ```javascript
137
- const result = equation.simplify();
138
- // Returns: { success: boolean, newRoot: omdEquationNode, message: string }
139
- ```
140
-
141
- - **Returns**: Object with `success`, `newRoot`, and `message` properties
142
-
143
- #### Utility Methods
144
-
145
- **`clone()`**
146
-
147
- Creates a deep clone of the equation node.
148
-
149
- ```javascript
150
- const copy = equation.clone();
151
- ```
152
-
153
- - **Returns**: `omdEquationNode`
154
-
155
- **`toString()`**
156
-
157
- Converts the equation to its string representation.
158
-
159
- ```javascript
160
- const str = equation.toString();
161
- // Returns: "2x + 3 = 11"
162
- ```
163
-
164
- - **Returns**: `string`
165
-
166
- **`evaluate(variables)`**
167
-
168
- Evaluates both sides with given variable values.
169
-
170
- ```javascript
171
- const result = equation.evaluate({ x: 4 });
172
- // Returns: { left: 11, right: 11 }
173
- ```
174
-
175
- - **Parameters**:
176
- - `variables` (object): Map of variable names to values
177
- - **Returns**: Object with `left` and `right` evaluated values
178
-
179
- **`getLeft()`**
180
-
181
- Returns the node representing the left side.
182
-
183
- ```javascript
184
- const leftSide = equation.getLeft();
185
- ```
186
-
187
- - **Returns**: `omdNode`
188
-
189
- **`getRight()`**
190
-
191
- Returns the node representing the right side.
192
-
193
- ```javascript
194
- const rightSide = equation.getRight();
195
- ```
196
-
197
- - **Returns**: `omdNode`
198
-
199
- #### Styling Methods
200
-
201
- **`setBackgroundStyle(style)`**
202
-
203
- Configures background styling for the equation node.
204
-
205
- ```javascript
206
- equation.setBackgroundStyle({
207
- backgroundColor: '#E3F2FD',
208
- cornerRadius: 8,
209
- pill: true
210
- });
211
- ```
212
-
213
- - **Parameters**:
214
- - `style` (object): Style properties (`backgroundColor`, `cornerRadius`, `pill`)
215
-
216
- **`getEqualsAnchorX()`**
217
-
218
- Returns the X-coordinate of the equals sign center (for alignment).
219
-
220
- ```javascript
221
- const anchorX = equation.getEqualsAnchorX();
222
- ```
223
-
224
- - **Returns**: `number`
225
-
226
- **`getBackgroundPaddingX()`**
227
-
228
- Returns the horizontal padding applied by background style.
229
-
230
- ```javascript
231
- const padding = equation.getBackgroundPaddingX();
232
- ```
233
-
234
- - **Returns**: `number`
235
-
236
- #### Visualization Methods
237
-
238
- **`renderTo(visualizationType, options)`**
239
-
240
- Renders the equation to different visualization formats.
241
-
242
- ```javascript
243
- // Render to coordinate plane
244
- const graphJSON = equation.renderTo('graph', {
245
- xMin: -10,
246
- xMax: 10,
247
- yMin: -10,
248
- yMax: 10
249
- });
250
-
251
- // Render to table
252
- const tableJSON = equation.renderTo('table', {
253
- xMin: -5,
254
- xMax: 5,
255
- stepSize: 1
256
- });
257
-
258
- // Render to balance hanger
259
- const hangerJSON = equation.renderTo('hanger');
260
-
261
- // Render to tile equation
262
- const tileJSON = equation.renderTo('tileequation');
263
- ```
264
-
265
- - **Parameters**:
266
- - `visualizationType` (string): Type of visualization: `'graph'`, `'table'`, `'hanger'`, or `'tileequation'`
267
- - `options` (object): Configuration options specific to visualization type
268
- - **Returns**: JSON object for the visualization
269
-
270
- **See**: [omdEquationNode Full API Documentation](./omdEquationNode.md)
271
-
272
- ---
273
-
274
- ### Expression Component Nodes
275
-
276
- #### omdConstantNode
277
-
278
- Represents numeric constants.
279
-
280
- ```javascript
281
- import { omdConstantNode } from '@teachinglab/omd';
282
-
283
- const constant = new omdConstantNode(ast);
284
- ```
285
-
286
- **See**: [omdConstantNode API Documentation](./omdConstantNode.md)
287
-
288
- ---
289
-
290
- #### omdVariableNode
291
-
292
- Represents algebraic variables.
293
-
294
- ```javascript
295
- import { omdVariableNode } from '@teachinglab/omd';
296
-
297
- const variable = new omdVariableNode(ast);
298
- ```
299
-
300
- **See**: [omdVariableNode API Documentation](./omdVariableNode.md)
301
-
302
- ---
303
-
304
- #### omdOperatorNode
305
-
306
- Represents mathematical operators (+, -, ×, ÷, =).
307
-
308
- ```javascript
309
- import { omdOperatorNode } from '@teachinglab/omd';
310
-
311
- const operator = new omdOperatorNode(ast);
312
- ```
313
-
314
- **See**: [omdOperatorNode API Documentation](./omdOperatorNode.md)
315
-
316
- ---
317
-
318
- #### omdBinaryExpressionNode
319
-
320
- Represents binary operations (addition, subtraction, multiplication, division).
321
-
322
- ```javascript
323
- import { omdBinaryExpressionNode } from '@teachinglab/omd';
324
-
325
- const binaryExpr = new omdBinaryExpressionNode(ast);
326
- ```
327
-
328
- **See**: [omdBinaryExpressionNode API Documentation](./omdBinaryExpressionNode.md)
329
-
330
- ---
331
-
332
- #### omdUnaryExpressionNode
333
-
334
- Represents unary operations (negation).
335
-
336
- ```javascript
337
- import { omdUnaryExpressionNode } from '@teachinglab/omd';
338
-
339
- const unaryExpr = new omdUnaryExpressionNode(ast);
340
- ```
341
-
342
- **See**: [omdUnaryExpressionNode API Documentation](./omdUnaryExpressionNode.md)
343
-
344
- ---
345
-
346
- #### omdPowerNode
347
-
348
- Represents exponentiation (x²).
349
-
350
- ```javascript
351
- import { omdPowerNode } from '@teachinglab/omd';
352
-
353
- const power = new omdPowerNode(ast);
354
- ```
355
-
356
- **See**: [omdPowerNode API Documentation](./omdPowerNode.md)
357
-
358
- ---
359
-
360
- #### omdRationalNode
361
-
362
- Represents fractions and rational numbers.
363
-
364
- ```javascript
365
- import { omdRationalNode } from '@teachinglab/omd';
366
-
367
- const rational = new omdRationalNode(ast);
368
- ```
369
-
370
- **See**: [omdRationalNode API Documentation](./omdRationalNode.md)
371
-
372
- ---
373
-
374
- #### omdSqrtNode
375
-
376
- Represents square root expressions.
377
-
378
- ```javascript
379
- import { omdSqrtNode } from '@teachinglab/omd';
380
-
381
- const sqrt = new omdSqrtNode(ast);
382
- ```
383
-
384
- **See**: [omdSqrtNode API Documentation](./omdSqrtNode.md)
385
-
386
- ---
387
-
388
- #### omdFunctionNode
389
-
390
- Represents mathematical functions (sin, cos, log, etc.).
391
-
392
- ```javascript
393
- import { omdFunctionNode } from '@teachinglab/omd';
394
-
395
- const func = new omdFunctionNode(ast);
396
- ```
397
-
398
- **See**: [omdFunctionNode API Documentation](./omdFunctionNode.md)
399
-
400
- ---
401
-
402
- #### omdParenthesisNode
403
-
404
- Represents expressions enclosed in parentheses.
405
-
406
- ```javascript
407
- import { omdParenthesisNode } from '@teachinglab/omd';
408
-
409
- const paren = new omdParenthesisNode(ast);
410
- ```
411
-
412
- **See**: [omdParenthesisNode API Documentation](./omdParenthesisNode.md)
413
-
414
- ---
415
-
416
- ### Container Nodes
417
-
418
- #### omdGroupNode
419
-
420
- A container for grouping related nodes.
421
-
422
- ```javascript
423
- import { omdGroupNode } from '@teachinglab/omd';
424
-
425
- const group = new omdGroupNode(ast);
426
- ```
427
-
428
- **See**: [omdGroupNode API Documentation](./omdGroupNode.md)
429
-
430
- ---
431
-
432
- #### omdEquationSequenceNode
433
-
434
- A container for displaying step-by-step equation solutions.
435
-
436
- ```javascript
437
- import { omdEquationSequenceNode } from '@teachinglab/omd';
438
-
439
- const sequence = new omdEquationSequenceNode();
440
- sequence.addChild(equation1);
441
- sequence.addChild(equation2);
442
- ```
443
-
444
- **See**: [omdEquationSequenceNode API Documentation](./omdEquationSequenceNode.md)
445
-
446
- ---
447
-
448
- ## Node Tree Structure
449
-
450
- Nodes are organized in a tree structure:
451
-
452
- ```
453
- omdEquationNode
454
- ├── left (omdNode)
455
- │ └── omdBinaryExpressionNode
456
- │ ├── left (omdConstantNode: 2)
457
- │ ├── operator (omdOperatorNode: +)
458
- │ └── right (omdConstantNode: 3)
459
- ├── equalsSign (omdOperatorNode: =)
460
- └── right (omdNode)
461
- └── omdConstantNode: 11
462
- ```
463
-
464
- ## Working with Expression Trees
465
-
466
- ### Creating Nodes from Strings
467
-
468
- The simplest way to create nodes is from strings:
469
-
470
- ```javascript
471
- import { omdEquationNode } from '@teachinglab/omd';
472
-
473
- const equation = omdEquationNode.fromString('2x + 3 = 11');
474
- ```
475
-
476
- ### Manipulating Nodes
477
-
478
- Nodes can be manipulated to perform mathematical operations:
479
-
480
- ```javascript
481
- // Start with: 2x + 3 = 11
482
- const step1 = equation.subtractFromBothSides(3);
483
- // Result: 2x = 8
484
-
485
- const step2 = step1.divideBothSides(2);
486
- // Result: x = 4
487
- ```
488
-
489
- ### Traversing the Tree
490
-
491
- Nodes can be traversed to analyze structure:
492
-
493
- ```javascript
494
- const leftSide = equation.getLeft();
495
- const rightSide = equation.getRight();
496
-
497
- console.log(equation.toString()); // "2x + 3 = 11"
498
- ```
499
-
500
- ### Evaluating Expressions
501
-
502
- Nodes can be evaluated with variable values:
503
-
504
- ```javascript
505
- const result = equation.evaluate({ x: 4 });
506
- console.log(result); // { left: 11, right: 11 }
507
- ```
508
-
509
- ## Common Patterns
510
-
511
- ### Creating a Step-by-Step Solution
512
-
513
- ```javascript
514
- import { omdEquationNode, omdEquationStack } from '@teachinglab/omd';
515
-
516
- const original = omdEquationNode.fromString('2x + 3 = 11');
517
- const step1 = original.subtractFromBothSides(3);
518
- const step2 = step1.divideBothSides(2);
519
-
520
- const steps = [original, step1, step2];
521
- const stack = new omdEquationStack(steps);
522
- ```
523
-
524
- ### Simplifying Expressions
525
-
526
- ```javascript
527
- const equation = omdEquationNode.fromString('2x + 3x = 10');
528
- const result = equation.simplify();
529
-
530
- if (result.success) {
531
- console.log(result.newRoot.toString()); // "5x = 10"
532
- }
533
- ```
534
-
535
- ### Rendering to Visualizations
536
-
537
- ```javascript
538
- const equation = omdEquationNode.fromString('y = x^2 - 4');
539
-
540
- // Render to graph
541
- const graphData = equation.renderTo('graph', {
542
- xMin: -10,
543
- xMax: 10,
544
- yMin: -10,
545
- yMax: 10
546
- });
547
-
548
- // Render to table
549
- const tableData = equation.renderTo('table', {
550
- xMin: -5,
551
- xMax: 5,
552
- stepSize: 1
553
- });
554
- ```
555
-
556
- ## See Also
557
-
558
- - [omdNode Base Class](./omdNode.md)
559
- - [omdEquationNode Full Documentation](./omdEquationNode.md)
560
- - [Equations Guide](../guides/equations.md)
561
- - [JSON Schemas](../json-schemas.md)
1
+ # Expression Nodes
2
+
3
+ Expression nodes are the building blocks of mathematical expressions and equations in OMD. They form a tree structure that represents the mathematical content.
4
+
5
+ ## Overview
6
+
7
+ OMD uses a node-based system where every mathematical element is represented as a node in an expression tree. This allows for powerful manipulation, simplification, and visualization of mathematical expressions.
8
+
9
+ ## Core Node Classes
10
+
11
+ ### omdNode
12
+
13
+ The abstract base class for all nodes in the expression tree.
14
+
15
+ **See**: [omdNode API Documentation](./omdNode.md)
16
+
17
+ ### omdEquationNode
18
+
19
+ Represents a complete mathematical equation with left side, right side, and equals sign.
20
+
21
+ **Class**: `omdEquationNode extends omdNode`
22
+
23
+ #### Static Methods
24
+
25
+ **`fromString(equationString)`**
26
+
27
+ Creates an equation node from a string representation.
28
+
29
+ ```javascript
30
+ import { omdEquationNode } from '@teachinglab/omd';
31
+
32
+ const equation = omdEquationNode.fromString('2x + 3 = 11');
33
+ ```
34
+
35
+ - **Parameters**:
36
+ - `equationString` (string): The equation string (e.g., `"2x + 4 = 10"`)
37
+ - **Returns**: `omdEquationNode`
38
+ - **Throws**: Error if string is not a valid equation
39
+
40
+ #### Properties
41
+
42
+ - **`left`** (omdNode): The left side of the equation
43
+ - **`right`** (omdNode): The right side of the equation
44
+ - **`equalsSign`** (omdOperatorNode): The equals sign operator
45
+
46
+ #### Manipulation Methods
47
+
48
+ **`addToBothSides(value)`**
49
+
50
+ Returns a new equation with a value added to both sides.
51
+
52
+ ```javascript
53
+ const newEq = equation.addToBothSides(5);
54
+ ```
55
+
56
+ - **Parameters**:
57
+ - `value` (number | object): Value to add
58
+ - **Returns**: `omdEquationNode`
59
+
60
+ **`subtractFromBothSides(value)`**
61
+
62
+ Returns a new equation with a value subtracted from both sides.
63
+
64
+ ```javascript
65
+ const newEq = equation.subtractFromBothSides(3);
66
+ ```
67
+
68
+ - **Parameters**:
69
+ - `value` (number | object): Value to subtract
70
+ - **Returns**: `omdEquationNode`
71
+
72
+ **`multiplyBothSides(value)`**
73
+
74
+ Returns a new equation with both sides multiplied by a value.
75
+
76
+ ```javascript
77
+ const newEq = equation.multiplyBothSides(2);
78
+ ```
79
+
80
+ - **Parameters**:
81
+ - `value` (number | object): Value to multiply by
82
+ - **Returns**: `omdEquationNode`
83
+
84
+ **`divideBothSides(value)`**
85
+
86
+ Returns a new equation with both sides divided by a value.
87
+
88
+ ```javascript
89
+ const newEq = equation.divideBothSides(2);
90
+ ```
91
+
92
+ - **Parameters**:
93
+ - `value` (number | object): Value to divide by
94
+ - **Returns**: `omdEquationNode`
95
+
96
+ **`applyFunction(functionName)`**
97
+
98
+ Applies a function (e.g., sqrt, log) to both sides.
99
+
100
+ ```javascript
101
+ const newEq = equation.applyFunction('sqrt');
102
+ ```
103
+
104
+ - **Parameters**:
105
+ - `functionName` (string): Name of function to apply
106
+ - **Returns**: `omdEquationNode`
107
+
108
+ **`applyOperation(value, operation, side = 'both')`**
109
+
110
+ Applies an arithmetic operation to one or both sides.
111
+
112
+ ```javascript
113
+ const newEq = equation.applyOperation(5, 'add', 'left');
114
+ ```
115
+
116
+ - **Parameters**:
117
+ - `value` (number | omdNode): Value to apply
118
+ - `operation` (string): Operation type: `'add'`, `'subtract'`, `'multiply'`, or `'divide'`
119
+ - `side` (string): Side to apply to: `'left'`, `'right'`, or `'both'` (default: `'both'`)
120
+ - **Returns**: `omdEquationNode`
121
+
122
+ **`swapSides()`**
123
+
124
+ Swaps the left and right sides of the equation.
125
+
126
+ ```javascript
127
+ const swapped = equation.swapSides();
128
+ ```
129
+
130
+ - **Returns**: `omdEquationNode`
131
+
132
+ **`simplify()`**
133
+
134
+ Simplifies both sides using the simplification engine.
135
+
136
+ ```javascript
137
+ const result = equation.simplify();
138
+ // Returns: { success: boolean, newRoot: omdEquationNode, message: string }
139
+ ```
140
+
141
+ - **Returns**: Object with `success`, `newRoot`, and `message` properties
142
+
143
+ #### Utility Methods
144
+
145
+ **`clone()`**
146
+
147
+ Creates a deep clone of the equation node.
148
+
149
+ ```javascript
150
+ const copy = equation.clone();
151
+ ```
152
+
153
+ - **Returns**: `omdEquationNode`
154
+
155
+ **`toString()`**
156
+
157
+ Converts the equation to its string representation.
158
+
159
+ ```javascript
160
+ const str = equation.toString();
161
+ // Returns: "2x + 3 = 11"
162
+ ```
163
+
164
+ - **Returns**: `string`
165
+
166
+ **`evaluate(variables)`**
167
+
168
+ Evaluates both sides with given variable values.
169
+
170
+ ```javascript
171
+ const result = equation.evaluate({ x: 4 });
172
+ // Returns: { left: 11, right: 11 }
173
+ ```
174
+
175
+ - **Parameters**:
176
+ - `variables` (object): Map of variable names to values
177
+ - **Returns**: Object with `left` and `right` evaluated values
178
+
179
+ **`getLeft()`**
180
+
181
+ Returns the node representing the left side.
182
+
183
+ ```javascript
184
+ const leftSide = equation.getLeft();
185
+ ```
186
+
187
+ - **Returns**: `omdNode`
188
+
189
+ **`getRight()`**
190
+
191
+ Returns the node representing the right side.
192
+
193
+ ```javascript
194
+ const rightSide = equation.getRight();
195
+ ```
196
+
197
+ - **Returns**: `omdNode`
198
+
199
+ #### Styling Methods
200
+
201
+ **`setBackgroundStyle(style)`**
202
+
203
+ Configures background styling for the equation node.
204
+
205
+ ```javascript
206
+ equation.setBackgroundStyle({
207
+ backgroundColor: '#E3F2FD',
208
+ cornerRadius: 8,
209
+ pill: true
210
+ });
211
+ ```
212
+
213
+ - **Parameters**:
214
+ - `style` (object): Style properties (`backgroundColor`, `cornerRadius`, `pill`)
215
+
216
+ **`getEqualsAnchorX()`**
217
+
218
+ Returns the X-coordinate of the equals sign center (for alignment).
219
+
220
+ ```javascript
221
+ const anchorX = equation.getEqualsAnchorX();
222
+ ```
223
+
224
+ - **Returns**: `number`
225
+
226
+ **`getBackgroundPaddingX()`**
227
+
228
+ Returns the horizontal padding applied by background style.
229
+
230
+ ```javascript
231
+ const padding = equation.getBackgroundPaddingX();
232
+ ```
233
+
234
+ - **Returns**: `number`
235
+
236
+ #### Visualization Methods
237
+
238
+ **`renderTo(visualizationType, options)`**
239
+
240
+ Renders the equation to different visualization formats.
241
+
242
+ ```javascript
243
+ // Render to coordinate plane
244
+ const graphJSON = equation.renderTo('graph', {
245
+ xMin: -10,
246
+ xMax: 10,
247
+ yMin: -10,
248
+ yMax: 10
249
+ });
250
+
251
+ // Render to table
252
+ const tableJSON = equation.renderTo('table', {
253
+ xMin: -5,
254
+ xMax: 5,
255
+ stepSize: 1
256
+ });
257
+
258
+ // Render to balance hanger
259
+ const hangerJSON = equation.renderTo('hanger');
260
+
261
+ // Render to tile equation
262
+ const tileJSON = equation.renderTo('tileequation');
263
+ ```
264
+
265
+ - **Parameters**:
266
+ - `visualizationType` (string): Type of visualization: `'graph'`, `'table'`, `'hanger'`, or `'tileequation'`
267
+ - `options` (object): Configuration options specific to visualization type
268
+ - **Returns**: JSON object for the visualization
269
+
270
+ **See**: [omdEquationNode Full API Documentation](./omdEquationNode.md)
271
+
272
+ ---
273
+
274
+ ### Expression Component Nodes
275
+
276
+ #### omdConstantNode
277
+
278
+ Represents numeric constants.
279
+
280
+ ```javascript
281
+ import { omdConstantNode } from '@teachinglab/omd';
282
+
283
+ const constant = new omdConstantNode(ast);
284
+ ```
285
+
286
+ **See**: [omdConstantNode API Documentation](./omdConstantNode.md)
287
+
288
+ ---
289
+
290
+ #### omdVariableNode
291
+
292
+ Represents algebraic variables.
293
+
294
+ ```javascript
295
+ import { omdVariableNode } from '@teachinglab/omd';
296
+
297
+ const variable = new omdVariableNode(ast);
298
+ ```
299
+
300
+ **See**: [omdVariableNode API Documentation](./omdVariableNode.md)
301
+
302
+ ---
303
+
304
+ #### omdOperatorNode
305
+
306
+ Represents mathematical operators (+, -, ×, ÷, =).
307
+
308
+ ```javascript
309
+ import { omdOperatorNode } from '@teachinglab/omd';
310
+
311
+ const operator = new omdOperatorNode(ast);
312
+ ```
313
+
314
+ **See**: [omdOperatorNode API Documentation](./omdOperatorNode.md)
315
+
316
+ ---
317
+
318
+ #### omdBinaryExpressionNode
319
+
320
+ Represents binary operations (addition, subtraction, multiplication, division).
321
+
322
+ ```javascript
323
+ import { omdBinaryExpressionNode } from '@teachinglab/omd';
324
+
325
+ const binaryExpr = new omdBinaryExpressionNode(ast);
326
+ ```
327
+
328
+ **See**: [omdBinaryExpressionNode API Documentation](./omdBinaryExpressionNode.md)
329
+
330
+ ---
331
+
332
+ #### omdUnaryExpressionNode
333
+
334
+ Represents unary operations (negation).
335
+
336
+ ```javascript
337
+ import { omdUnaryExpressionNode } from '@teachinglab/omd';
338
+
339
+ const unaryExpr = new omdUnaryExpressionNode(ast);
340
+ ```
341
+
342
+ **See**: [omdUnaryExpressionNode API Documentation](./omdUnaryExpressionNode.md)
343
+
344
+ ---
345
+
346
+ #### omdPowerNode
347
+
348
+ Represents exponentiation (x²).
349
+
350
+ ```javascript
351
+ import { omdPowerNode } from '@teachinglab/omd';
352
+
353
+ const power = new omdPowerNode(ast);
354
+ ```
355
+
356
+ **See**: [omdPowerNode API Documentation](./omdPowerNode.md)
357
+
358
+ ---
359
+
360
+ #### omdRationalNode
361
+
362
+ Represents fractions and rational numbers.
363
+
364
+ ```javascript
365
+ import { omdRationalNode } from '@teachinglab/omd';
366
+
367
+ const rational = new omdRationalNode(ast);
368
+ ```
369
+
370
+ **See**: [omdRationalNode API Documentation](./omdRationalNode.md)
371
+
372
+ ---
373
+
374
+ #### omdSqrtNode
375
+
376
+ Represents square root expressions.
377
+
378
+ ```javascript
379
+ import { omdSqrtNode } from '@teachinglab/omd';
380
+
381
+ const sqrt = new omdSqrtNode(ast);
382
+ ```
383
+
384
+ **See**: [omdSqrtNode API Documentation](./omdSqrtNode.md)
385
+
386
+ ---
387
+
388
+ #### omdFunctionNode
389
+
390
+ Represents mathematical functions (sin, cos, log, etc.).
391
+
392
+ ```javascript
393
+ import { omdFunctionNode } from '@teachinglab/omd';
394
+
395
+ const func = new omdFunctionNode(ast);
396
+ ```
397
+
398
+ **See**: [omdFunctionNode API Documentation](./omdFunctionNode.md)
399
+
400
+ ---
401
+
402
+ #### omdParenthesisNode
403
+
404
+ Represents expressions enclosed in parentheses.
405
+
406
+ ```javascript
407
+ import { omdParenthesisNode } from '@teachinglab/omd';
408
+
409
+ const paren = new omdParenthesisNode(ast);
410
+ ```
411
+
412
+ **See**: [omdParenthesisNode API Documentation](./omdParenthesisNode.md)
413
+
414
+ ---
415
+
416
+ ### Container Nodes
417
+
418
+ #### omdGroupNode
419
+
420
+ A container for grouping related nodes.
421
+
422
+ ```javascript
423
+ import { omdGroupNode } from '@teachinglab/omd';
424
+
425
+ const group = new omdGroupNode(ast);
426
+ ```
427
+
428
+ **See**: [omdGroupNode API Documentation](./omdGroupNode.md)
429
+
430
+ ---
431
+
432
+ #### omdEquationSequenceNode
433
+
434
+ A container for displaying step-by-step equation solutions.
435
+
436
+ ```javascript
437
+ import { omdEquationSequenceNode } from '@teachinglab/omd';
438
+
439
+ const sequence = new omdEquationSequenceNode();
440
+ sequence.addChild(equation1);
441
+ sequence.addChild(equation2);
442
+ ```
443
+
444
+ **See**: [omdEquationSequenceNode API Documentation](./omdEquationSequenceNode.md)
445
+
446
+ ---
447
+
448
+ ## Node Tree Structure
449
+
450
+ Nodes are organized in a tree structure:
451
+
452
+ ```
453
+ omdEquationNode
454
+ ├── left (omdNode)
455
+ │ └── omdBinaryExpressionNode
456
+ │ ├── left (omdConstantNode: 2)
457
+ │ ├── operator (omdOperatorNode: +)
458
+ │ └── right (omdConstantNode: 3)
459
+ ├── equalsSign (omdOperatorNode: =)
460
+ └── right (omdNode)
461
+ └── omdConstantNode: 11
462
+ ```
463
+
464
+ ## Working with Expression Trees
465
+
466
+ ### Creating Nodes from Strings
467
+
468
+ The simplest way to create nodes is from strings:
469
+
470
+ ```javascript
471
+ import { omdEquationNode } from '@teachinglab/omd';
472
+
473
+ const equation = omdEquationNode.fromString('2x + 3 = 11');
474
+ ```
475
+
476
+ ### Manipulating Nodes
477
+
478
+ Nodes can be manipulated to perform mathematical operations:
479
+
480
+ ```javascript
481
+ // Start with: 2x + 3 = 11
482
+ const step1 = equation.subtractFromBothSides(3);
483
+ // Result: 2x = 8
484
+
485
+ const step2 = step1.divideBothSides(2);
486
+ // Result: x = 4
487
+ ```
488
+
489
+ ### Traversing the Tree
490
+
491
+ Nodes can be traversed to analyze structure:
492
+
493
+ ```javascript
494
+ const leftSide = equation.getLeft();
495
+ const rightSide = equation.getRight();
496
+
497
+ console.log(equation.toString()); // "2x + 3 = 11"
498
+ ```
499
+
500
+ ### Evaluating Expressions
501
+
502
+ Nodes can be evaluated with variable values:
503
+
504
+ ```javascript
505
+ const result = equation.evaluate({ x: 4 });
506
+ console.log(result); // { left: 11, right: 11 }
507
+ ```
508
+
509
+ ## Common Patterns
510
+
511
+ ### Creating a Step-by-Step Solution
512
+
513
+ ```javascript
514
+ import { omdEquationNode, omdEquationStack } from '@teachinglab/omd';
515
+
516
+ const original = omdEquationNode.fromString('2x + 3 = 11');
517
+ const step1 = original.subtractFromBothSides(3);
518
+ const step2 = step1.divideBothSides(2);
519
+
520
+ const steps = [original, step1, step2];
521
+ const stack = new omdEquationStack(steps);
522
+ ```
523
+
524
+ ### Simplifying Expressions
525
+
526
+ ```javascript
527
+ const equation = omdEquationNode.fromString('2x + 3x = 10');
528
+ const result = equation.simplify();
529
+
530
+ if (result.success) {
531
+ console.log(result.newRoot.toString()); // "5x = 10"
532
+ }
533
+ ```
534
+
535
+ ### Rendering to Visualizations
536
+
537
+ ```javascript
538
+ const equation = omdEquationNode.fromString('y = x^2 - 4');
539
+
540
+ // Render to graph
541
+ const graphData = equation.renderTo('graph', {
542
+ xMin: -10,
543
+ xMax: 10,
544
+ yMin: -10,
545
+ yMax: 10
546
+ });
547
+
548
+ // Render to table
549
+ const tableData = equation.renderTo('table', {
550
+ xMin: -5,
551
+ xMax: 5,
552
+ stepSize: 1
553
+ });
554
+ ```
555
+
556
+ ## See Also
557
+
558
+ - [omdNode Base Class](./omdNode.md)
559
+ - [omdEquationNode Full Documentation](./omdEquationNode.md)
560
+ - [Equations Guide](../guides/equations.md)
561
+ - [JSON Schemas](../json-schemas.md)