@teachinglab/omd 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. package/README.md +138 -0
  2. package/canvas/core/canvasConfig.js +203 -0
  3. package/canvas/core/omdCanvas.js +475 -0
  4. package/canvas/drawing/segment.js +168 -0
  5. package/canvas/drawing/stroke.js +386 -0
  6. package/canvas/events/eventManager.js +435 -0
  7. package/canvas/events/pointerEventHandler.js +263 -0
  8. package/canvas/features/focusFrameManager.js +287 -0
  9. package/canvas/index.js +49 -0
  10. package/canvas/tools/eraserTool.js +322 -0
  11. package/canvas/tools/pencilTool.js +319 -0
  12. package/canvas/tools/selectTool.js +457 -0
  13. package/canvas/tools/tool.js +223 -0
  14. package/canvas/tools/toolManager.js +394 -0
  15. package/canvas/ui/cursor.js +438 -0
  16. package/canvas/ui/toolbar.js +304 -0
  17. package/canvas/utils/boundingBox.js +378 -0
  18. package/canvas/utils/mathUtils.js +259 -0
  19. package/docs/api/configuration-options.md +104 -0
  20. package/docs/api/eventManager.md +68 -0
  21. package/docs/api/focusFrameManager.md +150 -0
  22. package/docs/api/index.md +91 -0
  23. package/docs/api/main.md +58 -0
  24. package/docs/api/omdBinaryExpressionNode.md +227 -0
  25. package/docs/api/omdCanvas.md +142 -0
  26. package/docs/api/omdConfigManager.md +192 -0
  27. package/docs/api/omdConstantNode.md +117 -0
  28. package/docs/api/omdDisplay.md +121 -0
  29. package/docs/api/omdEquationNode.md +161 -0
  30. package/docs/api/omdEquationSequenceNode.md +301 -0
  31. package/docs/api/omdEquationStack.md +139 -0
  32. package/docs/api/omdFunctionNode.md +141 -0
  33. package/docs/api/omdGroupNode.md +182 -0
  34. package/docs/api/omdHelpers.md +96 -0
  35. package/docs/api/omdLeafNode.md +163 -0
  36. package/docs/api/omdNode.md +101 -0
  37. package/docs/api/omdOperationDisplayNode.md +139 -0
  38. package/docs/api/omdOperatorNode.md +127 -0
  39. package/docs/api/omdParenthesisNode.md +122 -0
  40. package/docs/api/omdPopup.md +117 -0
  41. package/docs/api/omdPowerNode.md +127 -0
  42. package/docs/api/omdRationalNode.md +128 -0
  43. package/docs/api/omdSequenceNode.md +128 -0
  44. package/docs/api/omdSimplification.md +110 -0
  45. package/docs/api/omdSqrtNode.md +79 -0
  46. package/docs/api/omdStepVisualizer.md +115 -0
  47. package/docs/api/omdStepVisualizerHighlighting.md +61 -0
  48. package/docs/api/omdStepVisualizerInteractiveSteps.md +129 -0
  49. package/docs/api/omdStepVisualizerLayout.md +60 -0
  50. package/docs/api/omdStepVisualizerNodeUtils.md +140 -0
  51. package/docs/api/omdStepVisualizerTextBoxes.md +68 -0
  52. package/docs/api/omdToolbar.md +102 -0
  53. package/docs/api/omdTranscriptionService.md +76 -0
  54. package/docs/api/omdTreeDiff.md +134 -0
  55. package/docs/api/omdUnaryExpressionNode.md +174 -0
  56. package/docs/api/omdUtilities.md +70 -0
  57. package/docs/api/omdVariableNode.md +148 -0
  58. package/docs/api/selectTool.md +74 -0
  59. package/docs/api/simplificationEngine.md +98 -0
  60. package/docs/api/simplificationRules.md +77 -0
  61. package/docs/api/simplificationUtils.md +64 -0
  62. package/docs/api/transcribe.md +43 -0
  63. package/docs/api-reference.md +85 -0
  64. package/docs/index.html +454 -0
  65. package/docs/user-guide.md +9 -0
  66. package/index.js +67 -0
  67. package/omd/config/omdConfigManager.js +267 -0
  68. package/omd/core/index.js +150 -0
  69. package/omd/core/omdEquationStack.js +347 -0
  70. package/omd/core/omdUtilities.js +115 -0
  71. package/omd/display/omdDisplay.js +443 -0
  72. package/omd/display/omdToolbar.js +502 -0
  73. package/omd/nodes/omdBinaryExpressionNode.js +460 -0
  74. package/omd/nodes/omdConstantNode.js +142 -0
  75. package/omd/nodes/omdEquationNode.js +1223 -0
  76. package/omd/nodes/omdEquationSequenceNode.js +1273 -0
  77. package/omd/nodes/omdFunctionNode.js +352 -0
  78. package/omd/nodes/omdGroupNode.js +68 -0
  79. package/omd/nodes/omdLeafNode.js +77 -0
  80. package/omd/nodes/omdNode.js +557 -0
  81. package/omd/nodes/omdOperationDisplayNode.js +322 -0
  82. package/omd/nodes/omdOperatorNode.js +109 -0
  83. package/omd/nodes/omdParenthesisNode.js +293 -0
  84. package/omd/nodes/omdPowerNode.js +236 -0
  85. package/omd/nodes/omdRationalNode.js +295 -0
  86. package/omd/nodes/omdSqrtNode.js +308 -0
  87. package/omd/nodes/omdUnaryExpressionNode.js +178 -0
  88. package/omd/nodes/omdVariableNode.js +123 -0
  89. package/omd/simplification/omdSimplification.js +171 -0
  90. package/omd/simplification/omdSimplificationEngine.js +886 -0
  91. package/omd/simplification/package.json +6 -0
  92. package/omd/simplification/rules/binaryRules.js +1037 -0
  93. package/omd/simplification/rules/functionRules.js +111 -0
  94. package/omd/simplification/rules/index.js +48 -0
  95. package/omd/simplification/rules/parenthesisRules.js +19 -0
  96. package/omd/simplification/rules/powerRules.js +143 -0
  97. package/omd/simplification/rules/rationalRules.js +475 -0
  98. package/omd/simplification/rules/sqrtRules.js +48 -0
  99. package/omd/simplification/rules/unaryRules.js +37 -0
  100. package/omd/simplification/simplificationRules.js +32 -0
  101. package/omd/simplification/simplificationUtils.js +1056 -0
  102. package/omd/step-visualizer/omdStepVisualizer.js +597 -0
  103. package/omd/step-visualizer/omdStepVisualizerHighlighting.js +206 -0
  104. package/omd/step-visualizer/omdStepVisualizerLayout.js +245 -0
  105. package/omd/step-visualizer/omdStepVisualizerTextBoxes.js +163 -0
  106. package/omd/utils/omdNodeOverlay.js +638 -0
  107. package/omd/utils/omdPopup.js +1084 -0
  108. package/omd/utils/omdStepVisualizerInteractiveSteps.js +491 -0
  109. package/omd/utils/omdStepVisualizerNodeUtils.js +268 -0
  110. package/omd/utils/omdTranscriptionService.js +125 -0
  111. package/omd/utils/omdTreeDiff.js +734 -0
  112. package/package.json +46 -0
  113. package/src/index.js +62 -0
  114. package/src/json-schemas.md +109 -0
  115. package/src/omd-json-samples.js +115 -0
  116. package/src/omd.js +109 -0
  117. package/src/omdApp.js +391 -0
  118. package/src/omdAppCanvas.js +336 -0
  119. package/src/omdBalanceHanger.js +172 -0
  120. package/src/omdColor.js +13 -0
  121. package/src/omdCoordinatePlane.js +467 -0
  122. package/src/omdEquation.js +125 -0
  123. package/src/omdExpression.js +104 -0
  124. package/src/omdFunction.js +113 -0
  125. package/src/omdMetaExpression.js +287 -0
  126. package/src/omdNaturalExpression.js +564 -0
  127. package/src/omdNode.js +384 -0
  128. package/src/omdNumber.js +53 -0
  129. package/src/omdNumberLine.js +107 -0
  130. package/src/omdNumberTile.js +119 -0
  131. package/src/omdOperator.js +73 -0
  132. package/src/omdPowerExpression.js +92 -0
  133. package/src/omdProblem.js +55 -0
  134. package/src/omdRatioChart.js +232 -0
  135. package/src/omdRationalExpression.js +115 -0
  136. package/src/omdSampleData.js +215 -0
  137. package/src/omdShapes.js +476 -0
  138. package/src/omdSpinner.js +148 -0
  139. package/src/omdString.js +39 -0
  140. package/src/omdTable.js +369 -0
  141. package/src/omdTapeDiagram.js +245 -0
  142. package/src/omdTerm.js +92 -0
  143. package/src/omdTileEquation.js +349 -0
  144. package/src/omdVariable.js +51 -0
package/src/omdApp.js ADDED
@@ -0,0 +1,391 @@
1
+
2
+ import { omdColor } from "./omdColor.js";
3
+ import { omdNumber } from "./omdNumber.js";
4
+ import { omdVariable } from "./omdVariable.js";
5
+ import { omdTerm } from "./omdTerm.js";
6
+ import { omdOperator } from "./omdOperator.js";
7
+ import { omdExpression } from "./omdExpression.js";
8
+ import { omdPowerExpression } from "./omdPowerExpression.js";
9
+ import { omdRationalExpression } from "./omdRationalExpression.js";
10
+ import { omdEquation } from "./omdEquation.js";
11
+ import { omdFunction } from "./omdFunction.js";
12
+ import { omdNumberLine } from "./omdNumberLine.js";
13
+ import { omdTapeDiagram } from "./omdTapeDiagram.js";
14
+ import { omdBalanceHanger } from "./omdBalanceHanger.js";
15
+ import { omdNumberTile } from "./omdNumberTile.js";
16
+ import { omdRatioChart } from "./omdRatioChart.js";
17
+ import { omdCoordinatePlane } from "./omdCoordinatePlane.js";
18
+ import { omdSpinner } from "./omdSpinner.js";
19
+ import { omdRightTriangle } from "./omdShapes.js";
20
+ import { omdIsoscelesTriangle } from "./omdShapes.js";
21
+ import { omdRectangle } from "./omdShapes.js";
22
+ import { omdEllipse } from "./omdShapes.js";
23
+ import { omdCircle } from "./omdShapes.js";
24
+ import { omdRegularPolygon } from "./omdShapes.js";
25
+ import { jsvgGroup } from "@teachinglab/jsvg";
26
+
27
+ export class omdApp extends jsvgGroup
28
+ {
29
+ constructor()
30
+ {
31
+ // initialization
32
+ super();
33
+
34
+ window.addEventListener("resize", this.onResize.bind(this) );
35
+ window.addEventListener("keydown", this.onKeydown.bind(this) );
36
+
37
+ // upward shift
38
+ this.setPosition( 0, -50 );
39
+
40
+ var N = new omdNumber( 100 );
41
+ N.setPosition( 100,100 );
42
+ this.addChild( N );
43
+
44
+ var V = new omdVariable('x');
45
+ V.setPosition( 100, 150 );
46
+ this.addChild( V );
47
+
48
+ var T = new omdTerm( 3, 'x', 2 );
49
+ T.setPosition( 100, 200 );
50
+ this.addChild( T );
51
+
52
+ var P = new omdOperator('*');
53
+ P.setPosition( 100, 250 );
54
+ this.addChild( P );
55
+
56
+ var E = new omdExpression();
57
+ // E.addTerm( 5 );
58
+ // E.addOperator( '+' );
59
+ // E.addTerm( 4 );
60
+ // E.addOperator( '-');
61
+ // E.addTerm( 3,'x', 2 );
62
+ E.loadFromJSON( expressionSample );
63
+ E.setPosition( 100, 300 );
64
+ this.addChild( E )
65
+
66
+ var PE = new omdPowerExpression();
67
+ var E2 = new omdExpression();
68
+ E2.addTerm( 7 );
69
+ E2.addOperator( '-' );
70
+ E2.addTerm( 5, 'x' );
71
+ PE.setExpressionAndPower( E2, new omdTerm(3,'x',2) );
72
+ PE.setPosition( 100, 370 );
73
+ this.addChild( PE );
74
+
75
+ var RE = new omdRationalExpression();
76
+ var EN = new omdExpression();
77
+ EN.addTerm( 7 );
78
+ EN.addOperator( '-' );
79
+ EN.addTerm( 5, 'x' );
80
+ var ED = new omdExpression();
81
+ ED.addTerm( 3, 'x' );
82
+ ED.addOperator( '+' );
83
+ ED.addTerm( 2 );
84
+ ED.addOperator( '-' );
85
+ ED.addTerm( 3 );
86
+ var pow = new omdPowerExpression();
87
+ var E3 = new omdExpression();
88
+ E3.addTerm("4", "x", "3");
89
+ E3.addOperator("x");
90
+ E3.addTerm("5", "y", "2");
91
+ pow.setExpressionAndPower(ED, E3);
92
+ RE.setNumeratorAndDenominator( ED, EN );
93
+ RE.setPosition( 100, 440 );
94
+ this.addChild( RE );
95
+
96
+ var F = new omdFunction();
97
+ var ER = new omdExpression();
98
+ ER.addTerm( 3, 'x' );
99
+ ER.addOperator( '+' );
100
+ ER.addTerm( 2 );
101
+ F.setNameVariableAndExpression( "f", "x", ER );
102
+ F.setPosition( 100, 540 );
103
+ this.addChild( F );
104
+
105
+ var EQ = new omdEquation();
106
+ var EL = new omdExpression();
107
+ EL.addTerm( 7 );
108
+ EL.addOperator( '-' );
109
+ EL.addTerm( 5, 'x' );
110
+ var ER = new omdExpression();
111
+ ER.addTerm( 3, 'x' );
112
+ ER.addOperator( '+' );
113
+ ER.addTerm( 2 );
114
+ EQ.setLeftAndRightExpressions( EL, ER );
115
+ EQ.setPosition( 100, 610 );
116
+ this.addChild( EQ );
117
+
118
+ var L = new omdNumberLine();
119
+ L.loadFromJSON( numberLineSample );
120
+ L.setPosition( 400, 100 );
121
+ L.updateLayout();
122
+ this.addChild( L );
123
+
124
+ var T = new omdTapeDiagram();
125
+ T.loadFromJSON( tapeDiagramSample );
126
+ T.setPosition( 400, 200 );
127
+ this.addChild( T );
128
+
129
+ T = new omdTapeDiagram();
130
+ T.loadFromJSON( tapeDiagramSample2 );
131
+ T.setPosition( 400, 300 );
132
+ this.addChild( T );
133
+
134
+ // var B = new omdBalanceHanger();
135
+ // B.loadFromJSON( balanceHangerSample );
136
+ // B.setPosition( 450, 400 );
137
+ // this.addChild( B );
138
+
139
+ var B = new omdBalanceHanger();
140
+ B.loadFromJSON( balanceHangerSample2 );
141
+ B.setPosition( 300, 100 );
142
+ this.addChild( B );
143
+
144
+ var T = new omdNumberTile();
145
+ T.setValue( 8 );
146
+ T.setSize( 'medium' );
147
+ T.setPosition( 380, 620 );
148
+ this.addChild( T );
149
+
150
+ var P = new omdRatioChart();
151
+ P.setValues( 3,5 );
152
+ P.setSize( 'large' );
153
+ P.setPosition( 550-60, 670-60 );
154
+ P.setRenderType('pie');
155
+ this.addChild( P );
156
+
157
+ var P = new omdRatioChart();
158
+ P.setValues( 3,5 );
159
+ P.setSize( 'medium' );
160
+ P.setPosition( 620, 620 );
161
+ P.setRenderType('dots');
162
+ this.addChild( P );
163
+
164
+ var P = new omdRatioChart();
165
+ P.setValues( 3,5 );
166
+ P.setSize( 'large' );
167
+ P.setPosition( 520, 740 );
168
+ P.setRenderType('bar');
169
+ this.addChild( P );
170
+
171
+ var G = new omdCoordinatePlane();
172
+ G.setPosition( 350,380 );
173
+ G.setGraphFunction( "1/2/(x)" );
174
+ G.setDotValues( [ [1,1], [3,2], [-3,2] ] );
175
+ G.setSize( "medium" );
176
+ this.addChild( G );
177
+
178
+ G = new omdCoordinatePlane();
179
+ G.setPosition( 570,380 );
180
+ G.loadFromJSON( planeWithShapes );
181
+ this.addChild( G );
182
+
183
+ var S = new omdSpinner();
184
+ S.setPosition( 870-60,670-60 );
185
+ S.setDivisions( 8 );
186
+ S.setArrowPosition( 3 );
187
+ S.setSize( "large" );
188
+ this.addChild( S );
189
+
190
+ S = new omdRightTriangle();
191
+ S.setPosition( 340,860 );
192
+ S.loadFromJSON( rightTriangleSample );
193
+ this.addChild( S );
194
+
195
+ S = new omdIsoscelesTriangle();
196
+ S.setPosition( 420,860 );
197
+ S.loadFromJSON( isoscelesTriangleSample );
198
+ this.addChild( S );
199
+
200
+ S = new omdRectangle();
201
+ S.setPosition( 470,860 );
202
+ S.loadFromJSON( rectangleSample );
203
+ this.addChild( S );
204
+
205
+ S = new omdEllipse();
206
+ S.setPosition( 650,830 );
207
+ S.loadFromJSON( ellipseSample );
208
+ this.addChild( S );
209
+
210
+ S = new omdCircle();
211
+ S.setPosition( 750,830 );
212
+ S.loadFromJSON( circleSample );
213
+ this.addChild( S );
214
+
215
+ S = new omdRegularPolygon();
216
+ S.setPosition( 830,830 );
217
+ S.loadFromJSON( regularPolygonSample );
218
+ this.addChild( S );
219
+
220
+ // AI stuff
221
+ this.inputField = new jsvgTextArea();
222
+ this.inputField.setPlaceholderText( "please enter your request here" );
223
+ this.inputField.setWidthAndHeight( 400, 100 );
224
+ this.inputField.setPosition( 800, 100 );
225
+ this.inputField.setFontFamily( "Albert Sans" );
226
+ this.inputField.setFontColor( "black" );
227
+ this.inputField.setFontSize( 14 );
228
+ this.inputField.div.style.backgroundColor = omdColor.lightGray;
229
+ this.inputField.div.style.border = "0px";
230
+ this.inputField.div.style.padding = "10px";
231
+ this.addChild( this.inputField );
232
+
233
+ this.inputButton = new jsvgButton();
234
+ this.inputButton.setText( "submit" );
235
+ this.inputButton.setFillColor( omdColor.lightGray );
236
+ this.inputButton.setPosition( 800, 220 );
237
+ this.inputButton.setClickCallback( this.handleSubmitClick.bind(this) );
238
+ this.addChild( this.inputButton );
239
+
240
+ this.responseText = new jsvgTextBox();
241
+ this.responseText.setText("");
242
+ this.responseText.setWidthAndHeight( 400, 30 );
243
+ this.responseText.setPosition( 920, 225 );
244
+ this.responseText.setFontFamily( "Albert Sans" );
245
+ this.responseText.setFontColor( omdColor.darkGray );
246
+ this.responseText.setFontSize( 14 );
247
+ this.addChild( this.responseText );
248
+
249
+ this.AIholder = new jsvgGroup();
250
+ this.AIholder.setPosition( 800, 350 );
251
+ this.addChild( this.AIholder );
252
+
253
+ // resize
254
+ this.onResize();
255
+ }
256
+
257
+ onKeydown( event )
258
+ {
259
+ }
260
+
261
+ update()
262
+ {
263
+ super.update();
264
+
265
+ window.equatorScale = 1.5;
266
+ }
267
+
268
+ onResize()
269
+ {
270
+ }
271
+
272
+ handleSubmitClick( B )
273
+ {
274
+ this.responseText.setText( "working..." );
275
+
276
+ var text = this.inputField.getText();
277
+ console.log( text );
278
+ this.fetchAI( text );
279
+ }
280
+
281
+ handleAIResponse( jsonData )
282
+ {
283
+ this.AIholder.removeAllChildren();
284
+
285
+ var N = null;
286
+
287
+ if ( jsonData.omdType == "number" ) { var N = new omdNumber(); }
288
+
289
+ if ( jsonData.omdType == "variable" ) { var N = new omdVariable(); }
290
+
291
+ if ( jsonData.omdType == "operator" ) { var N = new omdOperator(); }
292
+
293
+ if ( jsonData.omdType == "term" ) { var N = new omdTerm(); }
294
+
295
+ if ( jsonData.omdType == "expression" ) { var N = new omdExpression(); }
296
+
297
+ if ( jsonData.omdType == "powerExpression" ) { var N = new omdPowerExpression(); }
298
+
299
+ if ( jsonData.omdType == "rationalExpression" ) { var N = new omdRationalExpression(); }
300
+
301
+ if ( jsonData.omdType == "function" ) { var N = new omdFunction(); }
302
+
303
+ if ( jsonData.omdType == "equation" ) { var N = new omdEquation(); }
304
+
305
+ if ( jsonData.omdType == "numberLine" ) { var N = new omdNumberLine(); }
306
+
307
+ if ( jsonData.omdType == "balanceHanger" )
308
+ {
309
+ var N = new omdBalanceHanger();
310
+ N.setPosition( 150, 0 );
311
+ }
312
+
313
+ if ( jsonData.omdType == "tapeDiagram" ) { var N = new omdTapeDiagram(); }
314
+
315
+ if ( jsonData.omdType == "numberTile" ) { var N = new omdNumberTile(); }
316
+
317
+ if ( jsonData.omdType == "ratioChart" ) { var N = new omdRatioChart(); }
318
+
319
+ if ( jsonData.omdType == "coordinatePlane" ) { var N = new omdCoordinatePlane(); }
320
+
321
+ if ( jsonData.omdType == "spinner" ) { var N = new omdSpinner(); }
322
+
323
+ if ( jsonData.omdType == "rightTriangle" ) { var N = new omdRightTriangle(); }
324
+
325
+ if ( jsonData.omdType == "isoscelesTriangle" ) { var N = new omdIsoscelesTriangle(); }
326
+
327
+ if ( jsonData.omdType == "rectangle" ) { var N = new omdRectangle(); }
328
+
329
+ if ( jsonData.omdType == "ellipse" ) { var N = new omdEllipse(); }
330
+
331
+ if ( jsonData.omdType == "circle" ) { var N = new omdCircle(); }
332
+
333
+ if ( jsonData.omdType == "regularPolygon" ) { var N = new omdRegularPolygon(); }
334
+
335
+ // load from json
336
+ N.loadFromJSON( jsonData );
337
+
338
+ // add to the AI holder
339
+ this.AIholder.addChild( N );
340
+ }
341
+
342
+ fetchAI( topic )
343
+ {
344
+ // console.log( "=== fetchAI ===" );
345
+ // console.log( topic );
346
+
347
+ // consturct url based on topic
348
+ var urlToFetch = "";
349
+ if ( window.location.hostname.includes("localhost") )
350
+ urlToFetch = "http://localhost:8888/.netlify/functions/ai-omd-lookup/";
351
+ else
352
+ urlToFetch = "https://teaching-lab-omd.netlify.app/.netlify/functions/ai-omd-lookup/";
353
+
354
+ // add topic
355
+ urlToFetch += "?topic='" + topic + "'";
356
+ // console.log( "URL: " + urlToFetch );
357
+
358
+ // fetch the data
359
+ fetch( urlToFetch )
360
+ .then((response) => response.text())
361
+ .then((body) => {
362
+
363
+ // console.log("==== raw data ======");
364
+ // console.log( body );
365
+
366
+ // console.log("==== preParseData ======");
367
+ var preParseData = body;
368
+ preParseData = preParseData.replaceAll( "`", "" );
369
+ preParseData = preParseData.replaceAll( "json", "" );
370
+ // console.log( "=== pre-parse ===" );
371
+ // console.log( preParseData );
372
+
373
+ try
374
+ {
375
+ var data = JSON.parse( preParseData );
376
+
377
+ this.responseText.setText( "" );
378
+ this.handleAIResponse( data );
379
+ }
380
+ catch
381
+ {
382
+ // if parsing failed, try again
383
+ console.log( preParseData );
384
+ console.log(">>> data not parse-able");
385
+ this.responseText.setText( "An error occured. Please try again." );
386
+ }
387
+ });
388
+ }
389
+
390
+ }
391
+