@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,259 +1,259 @@
1
- # omdEquationSequenceNode
2
-
3
- Represents a sequence of equations or mathematical expressions, designed for step-by-step calculations and visual problem-solving. This node manages the vertical layout of multiple steps, ensuring elements like equals signs are vertically aligned for readability. It also provides robust provenance tracking, simplification capabilities, and filtering options for displaying different levels of detail.
4
-
5
- ## Class Definition
6
-
7
- ```javascript
8
- export class omdEquationSequenceNode extends omdNode
9
- ```
10
-
11
- ## Constructor
12
-
13
- ### `new omdEquationSequenceNode(steps)`
14
-
15
- Creates a new `omdEquationSequenceNode` instance.
16
-
17
- - **`steps`** (`Array<omdNode>`): An initial array of `omdNode` objects (typically `omdEquationNode` or `omdOperationDisplayNode`) representing the sequence of steps.
18
-
19
- Upon construction, the sequence initializes its internal state, sets up layout helpers, and builds a comprehensive node map for provenance tracking across all steps.
20
-
21
- ## Static Properties
22
-
23
- ### `OPERATION_MAP`
24
-
25
- A static map that links common operation names (e.g., `'add'`) to the corresponding method names on `omdEquationNode` (e.g., `'addToBothSides'`).
26
-
27
- ```javascript
28
- {
29
- 'add': 'addToBothSides',
30
- 'subtract': 'subtractFromBothSides',
31
- 'multiply': 'multiplyBothSides',
32
- 'divide': 'divideBothSides',
33
- }
34
- ```
35
-
36
- ## Static Methods
37
-
38
- ### `fromStringArray(stepStrings)`
39
-
40
- Creates an `omdEquationSequenceNode` instance from an array of equation strings. Each string must contain an equals sign (`=`).
41
-
42
- - **`stepStrings`** (`Array<string>`): An array of strings, each representing an equation step.
43
- - **Returns**: `omdEquationSequenceNode` - A new instance.
44
- - **Throws**: `Error` if any string is not a valid equation (e.g., missing `=` or invalid format).
45
-
46
- ### `fromSteps(stepsArray)`
47
-
48
- Creates an `omdEquationSequenceNode` instance from an array of expression strings. This method is more flexible than `fromStringArray` as it can parse both full equations (containing `=`) and general mathematical expressions.
49
-
50
- - **`stepsArray`** (`Array<string>`): An array of expression strings.
51
- - **Returns**: `omdEquationSequenceNode` - A new sequence node.
52
-
53
- ## Public Properties
54
-
55
- - **`steps`** (`Array<omdNode>`): An array of `omdNode` objects representing each step in the sequence.
56
- - **`currentStepIndex`** (`number`): The 0-based index of the currently active step. Default: `0`.
57
- - **`stepDescriptions`** (`Array<string>`): An array storing optional human-readable descriptions for each step.
58
- - **`importanceLevels`** (`Array<number>`): An array storing the importance level (0, 1, or 2) for each step, used for filtering.
59
- - **`currentFilterLevels`** (`Array<number>`): An array of numbers representing the currently active importance levels for step visibility. Default: `[0]`.
60
- - **`defaultEquationBackground`** (`object` | `null`): An object defining a default background style to be applied to all `omdEquationNode` steps added to the sequence.
61
-
62
- ## Public Methods
63
-
64
- ### `getCurrentEquation()`
65
-
66
- Retrieves the last `omdEquationNode` in the sequence, which typically represents the current working equation.
67
-
68
- - **Returns**: `omdEquationNode` | `null` - The last equation, or `null` if no equations exist.
69
-
70
- ### `getCurrentStep()`
71
-
72
- Retrieves the currently active step node based on `currentStepIndex` and visibility. It prioritizes visible equation nodes.
73
-
74
- - **Returns**: `omdNode` | `null` - The current step node.
75
-
76
- ### `addStep(step, descriptionOrOptions, importance)`
77
-
78
- Adds a new step to the sequence. This method supports multiple signatures:
79
-
80
- - `addStep(omdNode, optionsObject)`
81
- - `addStep(omdNode, descriptionString, importanceNumber)`
82
- - `addStep(expressionString, optionsObject)`
83
- - `addStep(expressionString, descriptionString, importanceNumber)`
84
-
85
- - **`step`** (`omdNode` | `string`): The `omdNode` object or an expression string for the step.
86
- - **`descriptionOrOptions`** (`object` | `string`, optional): An options object (e.g., `{ description: '...', stepMark: 0 }`) or a description string.
87
- - **`importance`** (`number`, optional): The importance level (0, 1, or 2) if `descriptionOrOptions` is a string.
88
- - **Returns**: `number` - The index of the added step.
89
-
90
- ### `setDefaultEquationBackground(style)`
91
-
92
- Sets a default background style that will be applied to all new `omdEquationNode` steps added to the sequence. It also applies the style to existing `omdEquationNode` steps immediately.
93
-
94
- - **`style`** (`object`): An object defining the background style (e.g., `{ backgroundColor: '#f0f0f0', cornerRadius: 8, pill: true }`).
95
-
96
- ### `rebuildNodeMap()`
97
-
98
- Rebuilds the internal `nodeMap`, which is a comprehensive map of all `omdNode` instances within the entire sequence, including historical nodes referenced in provenance chains. This is crucial for accurate highlighting and provenance tracking.
99
-
100
- ### `recordSimplificationHistory(name, affectedNodes, message, metadata)`
101
-
102
- Records a simplification step in the sequence's history.
103
-
104
- - **`name`** (`string`): The name of the simplification rule applied.
105
- - **`affectedNodes`** (`Array<string>`): An array of node IDs that were affected by the simplification.
106
- - **`message`** (`string`): A human-readable description of the simplification.
107
- - **`metadata`** (`object`, optional): Additional metadata about the simplification.
108
-
109
- ### `getSimplificationHistory()`
110
-
111
- Retrieves the complete simplification history for this sequence.
112
-
113
- - **Returns**: `Array<object>` - An array of simplification history entries.
114
-
115
- ### `clearSimplificationHistory()`
116
-
117
- Clears all recorded simplification history entries.
118
-
119
- ### `setFontSize(fontSize)`
120
-
121
- Sets the font size for the entire sequence and propagates this setting to all individual steps. This triggers a re-computation of dimensions and layout.
122
-
123
- - **`fontSize`** (`number`): The new font size in pixels.
124
-
125
- ### `applyEquationOperation(value, operation)`
126
-
127
- Applies a specified arithmetic operation to the current equation in the sequence and adds the result as a new step. This method also adds an `omdOperationDisplayNode` to visually represent the operation.
128
-
129
- - **`value`** (`number` | `string`): The constant value or expression string to apply.
130
- - **`operation`** (`string`): The operation name (`'add'`, `'subtract'`, `'multiply'`, `'divide'`).
131
- - **Returns**: `omdEquationSequenceNode` - Returns this sequence instance for chaining.
132
-
133
- ### `applyEquationFunction(functionName)`
134
-
135
- Applies a mathematical function (e.g., `'sqrt'`, `'log'`) to both sides of the current equation in the sequence and adds the result as a new step.
136
-
137
- - **`functionName`** (`string`): The name of the function to apply.
138
- - **Returns**: `omdEquationSequenceNode` - Returns this sequence instance for chaining.
139
-
140
- ### `simplify()`
141
-
142
- Applies one round of simplification rules to the last step in the sequence. If simplifications are applied, a new step is added to the sequence.
143
-
144
- - **Returns**: `object` - A result object containing `success` (boolean), `foldedCount` (number of operations applied), `isFinalSimplification` (boolean), and `message` (string).
145
-
146
- ### `simplifyAll(maxIterations)`
147
-
148
- Repeatedly calls `simplify()` until no more simplifications can be applied or `maxIterations` is reached. This adds multiple simplification steps to the sequence.
149
-
150
- - **`maxIterations`** (`number`, optional): Maximum number of iterations to prevent infinite loops. Default: `50`.
151
- - **Returns**: `object` - A result object containing `success`, `totalSteps`, `iterations`, and `message`.
152
-
153
- ### `evaluate(variables)`
154
-
155
- Evaluates the current step in the sequence with the given variables and logs the result to the console.
156
-
157
- - **`variables`** (`object`): A map of variable names to their numeric values.
158
-
159
- ### `validateSequenceProvenance()`
160
-
161
- Validates the integrity of provenance tracking across all steps in the sequence.
162
-
163
- - **Returns**: `Array<object>` - An array of validation issues found.
164
-
165
- ### `select()` / `deselect()` / `highlight(color)` / `clearProvenanceHighlights()`
166
-
167
- These methods override the default `omdNode` behavior. The `omdEquationSequenceNode` itself does not highlight or respond to selection events directly. Instead, these methods propagate the calls to their child steps, allowing individual steps to be highlighted or selected.
168
-
169
- ### `computeDimensions()`
170
-
171
- Calculates the overall dimensions (width and height) of the entire sequence, determining the correct alignment point for all equals signs.
172
-
173
- ### `updateLayout()`
174
-
175
- Positions each step vertically and aligns their equals signs to the calculated alignment point, ensuring a clean, readable layout.
176
-
177
- ### `toMathJSNode()`
178
-
179
- Converts the sequence to a math.js-compatible AST node. Currently, this returns the AST of the last step in the sequence.
180
-
181
- - **Returns**: `object` - A math.js AST node.
182
-
183
- ### `navigateToStep(index)`
184
-
185
- Navigates to a specific step in the sequence by setting `currentStepIndex`.
186
-
187
- - **`index`** (`number`): The 0-based index of the step to navigate to.
188
- - **Returns**: `boolean` - `true` if navigation was successful.
189
-
190
- ### `nextStep()`
191
-
192
- Navigates to the next step in the sequence.
193
-
194
- - **Returns**: `boolean` - `true` if there was a next step.
195
-
196
- ### `previousStep()`
197
-
198
- Navigates to the previous step in the sequence.
199
-
200
- - **Returns**: `boolean` - `true` if there was a previous step.
201
-
202
- ### `getFilteredSteps(maxImportance)`
203
-
204
- Retrieves steps filtered by their importance level.
205
-
206
- - **`maxImportance`** (`number`): The maximum importance level to include (0, 1, or 2).
207
- - **Returns**: `Array<object>` - An array of objects, each containing `step`, `description`, `importance`, and `index`.
208
-
209
- ### `renderCurrentStep()`
210
-
211
- Renders only the current step of the sequence.
212
-
213
- - **Returns**: `SVGElement` - The SVG representation of the current step.
214
-
215
- ### `toString()`
216
-
217
- Converts the entire sequence to a multi-line string representation, including step descriptions.
218
-
219
- - **Returns**: `string` - Multi-line string of all steps.
220
-
221
- ### `clear()`
222
-
223
- Removes all steps from the sequence, clears all associated data (descriptions, importance levels, history), and resets the sequence to its initial state.
224
-
225
- ### `show()` / `hide()`
226
-
227
- Overrides `omdNode`'s `show()` and `hide()` to also update the visibility of the layout manager.
228
-
229
- ### `updateStepsVisibility(visibilityPredicate)`
230
-
231
- Updates the visibility of multiple steps at once based on a provided predicate function. Also applies font weights based on `stepMark`.
232
-
233
- - **`visibilityPredicate`** (`Function`): A function that takes a step node and returns `true` if it should be visible, `false` otherwise.
234
-
235
- ## Internal Methods
236
-
237
- - **`_initializeState()`**: Initializes internal state variables like `currentStepIndex`, `stepDescriptions`, etc.
238
- - **`_initializeLayout()`**: Sets up the `jsvgLayoutGroup` for vertical arrangement.
239
- - **`_initializeNodeMap()`**: Initializes the `nodeMap` and calls `rebuildNodeMap()`.
240
- - **`_disableContainerInteractions()`**: Disables default mouse interactions on the sequence container.
241
- - **`_markInitialSteps()`**: Marks the initial steps with a default `stepMark` of 0.
242
- - **`_applyDefaultFilter()`**: Applies the default filter (showing only level 0 steps) upon initialization.
243
- - **`_reapplyCurrentFilter()`**: Reapplies the currently set filter levels to ensure consistent visibility.
244
- - **`_determineStepMark(step, options)`**: Determines the appropriate `stepMark` for a new step.
245
- - **`_isFullySimplified(step)`**: Heuristic to check if an equation step appears fully simplified.
246
- - **`_isSimpleExpression(node)`**: Heuristic to check if an expression is simple (constant, variable, or simple operations).
247
- - **`preserveProvenanceHistory(newNodeMap)`**: Ensures historical nodes referenced in provenance chains are preserved in the `nodeMap`.
248
- - **`_collectAllProvenanceIds(newNodeMap)`**: Collects all provenance IDs from nodes in the `newNodeMap`.
249
- - **`_collectNodeProvenanceIds(node, referencedIds, processedNodes)`**: Recursively collects provenance IDs for a given node.
250
- - **`_preserveReferencedNodes(referencedIds, newNodeMap)`**: Preserves nodes referenced by `referencedIds` in the `newNodeMap`.
251
- - **`_preserveNodeAndContext(id, newNodeMap, processedIds)`**: Preserves a node and its parent/sibling context.
252
- - **`_preserveParentContext(node, newNodeMap)`**: Preserves the parent context of a node.
253
- - **`_preserveSiblingContext(node, newNodeMap)`**: Preserves the sibling context of a node.
254
- - **`_handleSuccessfulSimplification(originalStep, simplificationResult)`**: Handles the result of a successful simplification, adding a new step and recording history.
255
- - **`_getOperationDescription(operation, value, isUnsimplified)`**: Generates a human-readable description for an equation operation.
256
- - **`_calculateAlignmentPoint(visibleSteps)`**: Calculates the optimal X-coordinate for aligning equals signs across all visible steps.
257
- - **`_calculateTotalDimensions(visibleSteps)`**: Calculates the total width and height of the sequence.
258
- - **`_computeStepXOffset(step)`**: Computes the horizontal offset needed to align a step within the sequence.
1
+ # omdEquationSequenceNode
2
+
3
+ Represents a sequence of equations or mathematical expressions, designed for step-by-step calculations and visual problem-solving. This node manages the vertical layout of multiple steps, ensuring elements like equals signs are vertically aligned for readability. It also provides robust provenance tracking, simplification capabilities, and filtering options for displaying different levels of detail.
4
+
5
+ ## Class Definition
6
+
7
+ ```javascript
8
+ export class omdEquationSequenceNode extends omdNode
9
+ ```
10
+
11
+ ## Constructor
12
+
13
+ ### `new omdEquationSequenceNode(steps)`
14
+
15
+ Creates a new `omdEquationSequenceNode` instance.
16
+
17
+ - **`steps`** (`Array<omdNode>`): An initial array of `omdNode` objects (typically `omdEquationNode` or `omdOperationDisplayNode`) representing the sequence of steps.
18
+
19
+ Upon construction, the sequence initializes its internal state, sets up layout helpers, and builds a comprehensive node map for provenance tracking across all steps.
20
+
21
+ ## Static Properties
22
+
23
+ ### `OPERATION_MAP`
24
+
25
+ A static map that links common operation names (e.g., `'add'`) to the corresponding method names on `omdEquationNode` (e.g., `'addToBothSides'`).
26
+
27
+ ```javascript
28
+ {
29
+ 'add': 'addToBothSides',
30
+ 'subtract': 'subtractFromBothSides',
31
+ 'multiply': 'multiplyBothSides',
32
+ 'divide': 'divideBothSides',
33
+ }
34
+ ```
35
+
36
+ ## Static Methods
37
+
38
+ ### `fromStringArray(stepStrings)`
39
+
40
+ Creates an `omdEquationSequenceNode` instance from an array of equation strings. Each string must contain an equals sign (`=`).
41
+
42
+ - **`stepStrings`** (`Array<string>`): An array of strings, each representing an equation step.
43
+ - **Returns**: `omdEquationSequenceNode` - A new instance.
44
+ - **Throws**: `Error` if any string is not a valid equation (e.g., missing `=` or invalid format).
45
+
46
+ ### `fromSteps(stepsArray)`
47
+
48
+ Creates an `omdEquationSequenceNode` instance from an array of expression strings. This method is more flexible than `fromStringArray` as it can parse both full equations (containing `=`) and general mathematical expressions.
49
+
50
+ - **`stepsArray`** (`Array<string>`): An array of expression strings.
51
+ - **Returns**: `omdEquationSequenceNode` - A new sequence node.
52
+
53
+ ## Public Properties
54
+
55
+ - **`steps`** (`Array<omdNode>`): An array of `omdNode` objects representing each step in the sequence.
56
+ - **`currentStepIndex`** (`number`): The 0-based index of the currently active step. Default: `0`.
57
+ - **`stepDescriptions`** (`Array<string>`): An array storing optional human-readable descriptions for each step.
58
+ - **`importanceLevels`** (`Array<number>`): An array storing the importance level (0, 1, or 2) for each step, used for filtering.
59
+ - **`currentFilterLevels`** (`Array<number>`): An array of numbers representing the currently active importance levels for step visibility. Default: `[0]`.
60
+ - **`defaultEquationBackground`** (`object` | `null`): An object defining a default background style to be applied to all `omdEquationNode` steps added to the sequence.
61
+
62
+ ## Public Methods
63
+
64
+ ### `getCurrentEquation()`
65
+
66
+ Retrieves the last `omdEquationNode` in the sequence, which typically represents the current working equation.
67
+
68
+ - **Returns**: `omdEquationNode` | `null` - The last equation, or `null` if no equations exist.
69
+
70
+ ### `getCurrentStep()`
71
+
72
+ Retrieves the currently active step node based on `currentStepIndex` and visibility. It prioritizes visible equation nodes.
73
+
74
+ - **Returns**: `omdNode` | `null` - The current step node.
75
+
76
+ ### `addStep(step, descriptionOrOptions, importance)`
77
+
78
+ Adds a new step to the sequence. This method supports multiple signatures:
79
+
80
+ - `addStep(omdNode, optionsObject)`
81
+ - `addStep(omdNode, descriptionString, importanceNumber)`
82
+ - `addStep(expressionString, optionsObject)`
83
+ - `addStep(expressionString, descriptionString, importanceNumber)`
84
+
85
+ - **`step`** (`omdNode` | `string`): The `omdNode` object or an expression string for the step.
86
+ - **`descriptionOrOptions`** (`object` | `string`, optional): An options object (e.g., `{ description: '...', stepMark: 0 }`) or a description string.
87
+ - **`importance`** (`number`, optional): The importance level (0, 1, or 2) if `descriptionOrOptions` is a string.
88
+ - **Returns**: `number` - The index of the added step.
89
+
90
+ ### `setDefaultEquationBackground(style)`
91
+
92
+ Sets a default background style that will be applied to all new `omdEquationNode` steps added to the sequence. It also applies the style to existing `omdEquationNode` steps immediately.
93
+
94
+ - **`style`** (`object`): An object defining the background style (e.g., `{ backgroundColor: '#f0f0f0', cornerRadius: 8, pill: true }`).
95
+
96
+ ### `rebuildNodeMap()`
97
+
98
+ Rebuilds the internal `nodeMap`, which is a comprehensive map of all `omdNode` instances within the entire sequence, including historical nodes referenced in provenance chains. This is crucial for accurate highlighting and provenance tracking.
99
+
100
+ ### `recordSimplificationHistory(name, affectedNodes, message, metadata)`
101
+
102
+ Records a simplification step in the sequence's history.
103
+
104
+ - **`name`** (`string`): The name of the simplification rule applied.
105
+ - **`affectedNodes`** (`Array<string>`): An array of node IDs that were affected by the simplification.
106
+ - **`message`** (`string`): A human-readable description of the simplification.
107
+ - **`metadata`** (`object`, optional): Additional metadata about the simplification.
108
+
109
+ ### `getSimplificationHistory()`
110
+
111
+ Retrieves the complete simplification history for this sequence.
112
+
113
+ - **Returns**: `Array<object>` - An array of simplification history entries.
114
+
115
+ ### `clearSimplificationHistory()`
116
+
117
+ Clears all recorded simplification history entries.
118
+
119
+ ### `setFontSize(fontSize)`
120
+
121
+ Sets the font size for the entire sequence and propagates this setting to all individual steps. This triggers a re-computation of dimensions and layout.
122
+
123
+ - **`fontSize`** (`number`): The new font size in pixels.
124
+
125
+ ### `applyEquationOperation(value, operation)`
126
+
127
+ Applies a specified arithmetic operation to the current equation in the sequence and adds the result as a new step. This method also adds an `omdOperationDisplayNode` to visually represent the operation.
128
+
129
+ - **`value`** (`number` | `string`): The constant value or expression string to apply.
130
+ - **`operation`** (`string`): The operation name (`'add'`, `'subtract'`, `'multiply'`, `'divide'`).
131
+ - **Returns**: `omdEquationSequenceNode` - Returns this sequence instance for chaining.
132
+
133
+ ### `applyEquationFunction(functionName)`
134
+
135
+ Applies a mathematical function (e.g., `'sqrt'`, `'log'`) to both sides of the current equation in the sequence and adds the result as a new step.
136
+
137
+ - **`functionName`** (`string`): The name of the function to apply.
138
+ - **Returns**: `omdEquationSequenceNode` - Returns this sequence instance for chaining.
139
+
140
+ ### `simplify()`
141
+
142
+ Applies one round of simplification rules to the last step in the sequence. If simplifications are applied, a new step is added to the sequence.
143
+
144
+ - **Returns**: `object` - A result object containing `success` (boolean), `foldedCount` (number of operations applied), `isFinalSimplification` (boolean), and `message` (string).
145
+
146
+ ### `simplifyAll(maxIterations)`
147
+
148
+ Repeatedly calls `simplify()` until no more simplifications can be applied or `maxIterations` is reached. This adds multiple simplification steps to the sequence.
149
+
150
+ - **`maxIterations`** (`number`, optional): Maximum number of iterations to prevent infinite loops. Default: `50`.
151
+ - **Returns**: `object` - A result object containing `success`, `totalSteps`, `iterations`, and `message`.
152
+
153
+ ### `evaluate(variables)`
154
+
155
+ Evaluates the current step in the sequence with the given variables and logs the result to the console.
156
+
157
+ - **`variables`** (`object`): A map of variable names to their numeric values.
158
+
159
+ ### `validateSequenceProvenance()`
160
+
161
+ Validates the integrity of provenance tracking across all steps in the sequence.
162
+
163
+ - **Returns**: `Array<object>` - An array of validation issues found.
164
+
165
+ ### `select()` / `deselect()` / `highlight(color)` / `clearProvenanceHighlights()`
166
+
167
+ These methods override the default `omdNode` behavior. The `omdEquationSequenceNode` itself does not highlight or respond to selection events directly. Instead, these methods propagate the calls to their child steps, allowing individual steps to be highlighted or selected.
168
+
169
+ ### `computeDimensions()`
170
+
171
+ Calculates the overall dimensions (width and height) of the entire sequence, determining the correct alignment point for all equals signs.
172
+
173
+ ### `updateLayout()`
174
+
175
+ Positions each step vertically and aligns their equals signs to the calculated alignment point, ensuring a clean, readable layout.
176
+
177
+ ### `toMathJSNode()`
178
+
179
+ Converts the sequence to a math.js-compatible AST node. Currently, this returns the AST of the last step in the sequence.
180
+
181
+ - **Returns**: `object` - A math.js AST node.
182
+
183
+ ### `navigateToStep(index)`
184
+
185
+ Navigates to a specific step in the sequence by setting `currentStepIndex`.
186
+
187
+ - **`index`** (`number`): The 0-based index of the step to navigate to.
188
+ - **Returns**: `boolean` - `true` if navigation was successful.
189
+
190
+ ### `nextStep()`
191
+
192
+ Navigates to the next step in the sequence.
193
+
194
+ - **Returns**: `boolean` - `true` if there was a next step.
195
+
196
+ ### `previousStep()`
197
+
198
+ Navigates to the previous step in the sequence.
199
+
200
+ - **Returns**: `boolean` - `true` if there was a previous step.
201
+
202
+ ### `getFilteredSteps(maxImportance)`
203
+
204
+ Retrieves steps filtered by their importance level.
205
+
206
+ - **`maxImportance`** (`number`): The maximum importance level to include (0, 1, or 2).
207
+ - **Returns**: `Array<object>` - An array of objects, each containing `step`, `description`, `importance`, and `index`.
208
+
209
+ ### `renderCurrentStep()`
210
+
211
+ Renders only the current step of the sequence.
212
+
213
+ - **Returns**: `SVGElement` - The SVG representation of the current step.
214
+
215
+ ### `toString()`
216
+
217
+ Converts the entire sequence to a multi-line string representation, including step descriptions.
218
+
219
+ - **Returns**: `string` - Multi-line string of all steps.
220
+
221
+ ### `clear()`
222
+
223
+ Removes all steps from the sequence, clears all associated data (descriptions, importance levels, history), and resets the sequence to its initial state.
224
+
225
+ ### `show()` / `hide()`
226
+
227
+ Overrides `omdNode`'s `show()` and `hide()` to also update the visibility of the layout manager.
228
+
229
+ ### `updateStepsVisibility(visibilityPredicate)`
230
+
231
+ Updates the visibility of multiple steps at once based on a provided predicate function. Also applies font weights based on `stepMark`.
232
+
233
+ - **`visibilityPredicate`** (`Function`): A function that takes a step node and returns `true` if it should be visible, `false` otherwise.
234
+
235
+ ## Internal Methods
236
+
237
+ - **`_initializeState()`**: Initializes internal state variables like `currentStepIndex`, `stepDescriptions`, etc.
238
+ - **`_initializeLayout()`**: Sets up the `jsvgLayoutGroup` for vertical arrangement.
239
+ - **`_initializeNodeMap()`**: Initializes the `nodeMap` and calls `rebuildNodeMap()`.
240
+ - **`_disableContainerInteractions()`**: Disables default mouse interactions on the sequence container.
241
+ - **`_markInitialSteps()`**: Marks the initial steps with a default `stepMark` of 0.
242
+ - **`_applyDefaultFilter()`**: Applies the default filter (showing only level 0 steps) upon initialization.
243
+ - **`_reapplyCurrentFilter()`**: Reapplies the currently set filter levels to ensure consistent visibility.
244
+ - **`_determineStepMark(step, options)`**: Determines the appropriate `stepMark` for a new step.
245
+ - **`_isFullySimplified(step)`**: Heuristic to check if an equation step appears fully simplified.
246
+ - **`_isSimpleExpression(node)`**: Heuristic to check if an expression is simple (constant, variable, or simple operations).
247
+ - **`preserveProvenanceHistory(newNodeMap)`**: Ensures historical nodes referenced in provenance chains are preserved in the `nodeMap`.
248
+ - **`_collectAllProvenanceIds(newNodeMap)`**: Collects all provenance IDs from nodes in the `newNodeMap`.
249
+ - **`_collectNodeProvenanceIds(node, referencedIds, processedNodes)`**: Recursively collects provenance IDs for a given node.
250
+ - **`_preserveReferencedNodes(referencedIds, newNodeMap)`**: Preserves nodes referenced by `referencedIds` in the `newNodeMap`.
251
+ - **`_preserveNodeAndContext(id, newNodeMap, processedIds)`**: Preserves a node and its parent/sibling context.
252
+ - **`_preserveParentContext(node, newNodeMap)`**: Preserves the parent context of a node.
253
+ - **`_preserveSiblingContext(node, newNodeMap)`**: Preserves the sibling context of a node.
254
+ - **`_handleSuccessfulSimplification(originalStep, simplificationResult)`**: Handles the result of a successful simplification, adding a new step and recording history.
255
+ - **`_getOperationDescription(operation, value, isUnsimplified)`**: Generates a human-readable description for an equation operation.
256
+ - **`_calculateAlignmentPoint(visibleSteps)`**: Calculates the optimal X-coordinate for aligning equals signs across all visible steps.
257
+ - **`_calculateTotalDimensions(visibleSteps)`**: Calculates the total width and height of the sequence.
258
+ - **`_computeStepXOffset(step)`**: Computes the horizontal offset needed to align a step within the sequence.
259
259
  - **`_stringToNode(str)`**: Converts an expression string into an `omdNode` (either `omdEquationNode` or a general expression node).