From 410116df596296da8780a5cc07cebfc73501b999 Mon Sep 17 00:00:00 2001 From: jchac0n <88922632+jchac0n@users.noreply.github.com> Date: Mon, 30 Oct 2023 19:58:52 -0700 Subject: [PATCH] add manual expression textbox input and move expression loaders --- src/Controls.jsx | 2 - src/ExpressionAnalysis.jsx | 2 +- src/ExpressionLoader.jsx | 46 +++++++++++++------ src/Expressions.jsx | 92 +++++++++++++++++++------------------ src/ImageCapture.jsx | 2 +- src/ImageDraw.jsx | 2 +- src/ImageUpload.jsx | 5 +- tailwind.config.js | 1 + test_images/cos.png | Bin 0 -> 5493 bytes test_images/sin.png | Bin 0 -> 7091 bytes 10 files changed, 88 insertions(+), 64 deletions(-) create mode 100644 test_images/cos.png create mode 100644 test_images/sin.png diff --git a/src/Controls.jsx b/src/Controls.jsx index 6a0b2a3..68c8058 100644 --- a/src/Controls.jsx +++ b/src/Controls.jsx @@ -1,10 +1,8 @@ -import ExpressionUploader from "./ExpressionLoader"; import ExpressionAnalysis from "./ExpressionAnalysis"; const Controls = () => { return (
-
); diff --git a/src/ExpressionAnalysis.jsx b/src/ExpressionAnalysis.jsx index 247e758..280058b 100644 --- a/src/ExpressionAnalysis.jsx +++ b/src/ExpressionAnalysis.jsx @@ -1,6 +1,6 @@ const ExpressionAnalysis = () => { return ( -
+
Calculator diff --git a/src/ExpressionLoader.jsx b/src/ExpressionLoader.jsx index 459b30f..ea307ac 100644 --- a/src/ExpressionLoader.jsx +++ b/src/ExpressionLoader.jsx @@ -32,22 +32,22 @@ const ExpressionLoader = () => { setMathExpression([...mathExpression, expressionDetails]); }; - - useEffect(() => { - async function getMathPixToken(){ + async function getMathPixToken() { try { - let response = await fetch("http://aspacetech.us-east-2.elasticbeanstalk.com/token",{ - "content-type": "application/json", - method: "POST" - }).then(res => res.json()); + let response = await fetch( + "http://aspacetech.us-east-2.elasticbeanstalk.com/token", + { + "content-type": "application/json", + method: "POST", + } + ).then((res) => res.json()); return response.token; - } - catch (e){ + } catch (e) { console.log("Failed to get temporary token"); } - }; + } async function imageToMathPix(img) { try { @@ -84,10 +84,28 @@ const ExpressionLoader = () => { }, [image]); return ( -
- - - +
+
+
+ +
+ + + +
+ { + if (e.key === "Enter") { + storeExpression(e.target.value); + } + }} + />
); }; diff --git a/src/Expressions.jsx b/src/Expressions.jsx index 410f0e0..3914626 100644 --- a/src/Expressions.jsx +++ b/src/Expressions.jsx @@ -1,6 +1,7 @@ import { useContext } from "react"; import MathContext from "./MathContext"; import { MathJax } from "better-react-mathjax"; +import ExpressionUploader from "./ExpressionLoader"; //import EquationSolver from "./EquationSolver"; const Expressions = () => { @@ -9,52 +10,55 @@ const Expressions = () => { return (
- {mathExpressions ? ( - mathExpressions.map((mExpr) => { - return ( -
- -

- {"`" + mExpr.asciimathExpr + "`"} -

-

{"`" + mExpr.nodeExpr.toString() + "`"}

-
- {Object.keys(mExpr.currentScope).map((variable) => { - return ( -
- - { - mathExpressions.find( - (m) => m.asciimathExpr === mExpr.asciimathExpr - ).currentScope[variable] = e.target.value; - setMathExpressions([...mathExpressions]); - }} - > -
- ); - })} -
-
+ {mathExpressions + ? mathExpressions.map((mExpr, idx) => { + return (
-
- ); - }) - ) : ( -

Upload math expression

- )} + className="ast-expression w-full font-bold text-black" + > +
+ +

+ {"`" + "y_" + idx + "=" + mExpr.asciimathExpr + "`"} +

+

+ {"`" + mExpr.nodeExpr.toString() + "`"} +

+
+ {Object.keys(mExpr.currentScope).map((variable) => { + return ( +
+ + { + mathExpressions.find( + (m) => m.asciimathExpr === mExpr.asciimathExpr + ).currentScope[variable] = e.target.value; + setMathExpressions([...mathExpressions]); + }} + > +
+ ); + })} +
+
+
+ ); + }) + : null} +
); }; diff --git a/src/ImageCapture.jsx b/src/ImageCapture.jsx index 8de2fa9..3d38ec7 100644 --- a/src/ImageCapture.jsx +++ b/src/ImageCapture.jsx @@ -1,7 +1,7 @@ const ImageCapture = () => { //const ImageDraw = ({ setImage }) => { return ( - diff --git a/src/ImageDraw.jsx b/src/ImageDraw.jsx index a4650bb..296a7cb 100644 --- a/src/ImageDraw.jsx +++ b/src/ImageDraw.jsx @@ -94,7 +94,7 @@ const ImageDraw = () => { //const ImageDraw = ({ setImage }) => { return ( - diff --git a/src/ImageUpload.jsx b/src/ImageUpload.jsx index 089f747..3a073b3 100644 --- a/src/ImageUpload.jsx +++ b/src/ImageUpload.jsx @@ -23,7 +23,10 @@ const ImageUpload = ({ setImage }) => {
diff --git a/tailwind.config.js b/tailwind.config.js index 602aa4b..c8d9038 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -5,6 +5,7 @@ module.exports = { extend: { colors: { asm_dgreen: "rgb(57,61,50)", + asm_mgreen: "rgb(73,84,67)", asm_lgreen: "rgb(88,106,83)", asm_white: "rgb(241,243,238)", asm_dbrown: "rgb(158,150,131)", diff --git a/test_images/cos.png b/test_images/cos.png new file mode 100644 index 0000000000000000000000000000000000000000..553e2fa10622f5db148e8ca4ec50df898bdd371d GIT binary patch literal 5493 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 literal 0 HcmV?d00001 diff --git a/test_images/sin.png b/test_images/sin.png new file mode 100644 index 0000000000000000000000000000000000000000..4863ee9bd2451305315a2b835a329b0ff0ab4464 GIT binary patch literal 7091 zcmeHM`&&}!x2Kx4#?ofGIBDw4>EcAG&6wJ#;AD-KgpP_aYM_mc=9SD_qC#cmsY&fS z4N@YK*%rYIV_wJ$QfWD5ih_uWc*zU_g;Wql(X;h?&iNb8d7k-UKbv>+uC?C1-nBmK zv-W%YXK&A~pPPLSfk3vNK6TO$0$Kmd>a}S-_~g6KOnwJ%>k|At-655odt~6?vxwu! z;}A$yuF=x@jo^6mrBi_k5Xi3mtJk{Ie)~Q_Am*n|pFEDbf}Ij|2aTP2db4|W*$$R< znxJ`Lz>Epo{idoHY5L7U`yB`SLRN-}kkBK?H$A_2ecRRU&%S{aZ+3@xY`+1ydtlSL zuaMi;AIbmvv(TgeO!&tS|HQ-pmAs&9i3qn#dowp2V{3OTc?ML5Ux3ij264>G7PIT; z*)tayiC1bH8Eo&R(}}30+i$a<0dQGg{GS3`e+LcSUdSVoz^d{+A50guXrfcvUy;tF6xu z8G7LMZ{kKAh1eDD;!qAR-KvM2+5FOp^epsS2y12K45#qxr8`9s!Ok!2EWYH7`rXdH z4H1w`ScTg-PrhDiJ$Y63HtV}pZNJAuib-4SpBABa-muzjcqHh}*P9IOjYDhxIDf`b zUHA0U^}tKjgzRR%#U;y(#_N}kRF4Gd=g!e1M*4JE>x?SSC%;J7%n_9isK@YHd^Lda z;@PwaZjpKBh@CFGzUw9{vCR{cIVLlwn%%%bJHkItFAMq82s2MnHg|12_5j|MO1sG7 zpv>NFnh)as2ZiY*9|gW-A7NuS#D^*=0%JTI_oyJ|c5+seG|p5|^(U z*{oe2<9^2tOYdU6Dv_Ji+~a;^M_)qhw`7if{u1DyG9fG+Xh6N+=UfNctIC@_J-8|f zH&cGv^6clxLPKuq*g0st0kywGo>^1s^FDcN=R|VXg^u2DhYoZRt)9f&l8!YQ$M|dF zgGAQx?N=5(Io zlQZ22(|6o_9vUYa$@6k`w|5W%frm*4`p2o}bi2vt&PCw=o@w*@l>Esvs-k=bBhIYt z?`xAYo!J7@e|(BE z3nimt@3?$6N?{fpkElak-!M_E4kQ5Ghe=q8t*U>Ml~Ze8Ff{&(MW5g1oFWyUypUb8 zcN4MnApBxZMJ?)mpK}H9sw0R1V;7iiCUkT_nHRO^-S3Y&Fy7h`yeQ%l!IlB!s60x*eJ6{rb8&$AI^(j zDbJ_X*@d4DWnAW|{P6;wT@*_ceI?gCq#aa*UXjE4^T);ckc zp}sSRXCKgZ_1C_SrnOlm30O>0TJ2lJ1gW_jxyLUnu`Y}$lh#S{5CFMa^t(e{mT~3I zkm)1%DqNxfS4Q!Hhv-^5aJ|1;_eP&9GCcMmCxX2pN@LNBlK_1GnsEhzAEDb3G(B!y z%+`6OEY&qElt$Ak&vLqM8extVVMlhs-keW7(rAG!vm;s3lW2>W+HpTw?d0-7_3Yl7 z_kOYu_=n)kKb#x8Zi*LGB}n1@QW+T3PueNWJsyVD;_e#VY7kEdxMj&1-KtcrPZ7N`BFXdYv50X~`~xXG0%K|OVN2}+OE+K`UjH4bMNM{3scBNz(vHRry!<}A{? zcy7IyDa^LBEcC>+6UNI{0boWnvncQ`}z zNLU=!hRx7jOkphz2`ljPeR7StB(brO+jVm8Imv4m2W_UHdCGzij1SL?Z=r(-(j5yL?gRPiJ3keh3k+3hZ zc7jq%r}8||DQ%Gw+*##7Hhz8yPlL5BSIWU{K?Y#mvvlQQvDE;d6Eu!?``h_SMaUfv zw!{|}_lpf^(1ib38?{r(-{urR^vQ@}&On_-)`c;PHl#SwECLw**$@HDiWSIw!Po)e zWz&XFU)$h|EkCxIO_a!SrJ10CQ=W^1EwSwYA2baazL3$>g=@p&_yv|n8NESe8rHa8 zexl~Rwjoz?bOI@qMyWs<1btCG8!H0%HuxC`?YE4>B=0zu=;A2^V0E!5mO;2evLEsD zY-H#TPl50?p7@*_-x}M5Y6!};7;7&lp%)zbrycSIxz<8xI~S^QoB7rG-*M)58{M;e z<@G`KbcuW?K9r#@i~5a`81B-1;)HJcLD2ZGR00+{9ke>Tb0B85z$w@x9>^*3$KD|d zlPHjQIxEcZw|Tg>l#8d_%>5CENqJs&@doLP4Or+DgPP}+g>EDm#r5QVAK_( z!Rd|pT_)i@v%}?GwX?K!#ID_{^tV&-bvQ-|*~=xm8qBRxp%UkGZaV@1e}7|rE<*Z) z-fpTdW2`>qM_3a|R~l{Y23an*2N(BftM|N(Q0woEql1z9jqv@t{PJ9G5+9jW5Jj~i zd0%YnrF38fvNr(V8UvqI*L$=zq3|_l-A37{VRXun#Hl%wH&_;6TwIsa{Y%AC)kEd6 zp?$-`L0@s>>zoQFN@I!Oz9?f44m$nV`6IwTQLEnU_C$w;>V4U^q~+3JyTs8$l4*`| zF*YgTE&=qr+E-+3&*8~&j6_G5IZ0@o6*AXm6;S9@xJdCt`-376F3mzIL=M9h6egIY z0DmWb1k_O$HGZTG+h>q)1|zaZJk+v7HbE5L9wZ17q+Qxv*Zzh=WNd>I1SkE%9un zpUhRB#!x#+I1HVyD9_8S%bmjH(&5GlgGtp4d=q@-kq56!9gRs4;!0TD*Q;5@Ei%qY9CWBzKu_!2_Lg-6{M1QtynlV1t)v0f z;BHcINj+H9GBo-uSX*G_S25g|4!)LS0Qf##cdU}8>IW7>+b}-uQmb4R)`vd@WVpmZ z(eHr8Jg-$`$SHJ5>_Y%x#@jEOg_I^z3m4{5z}k+K$P;R{)13`vsNTU0ug%e+BQGg?Sc7w^m7rW4VMg((wT+B zuCid26bw5*Srja}u70JpMyn@lMMShLJ}70C4bFeTJ+5zBQLsDwWPt;kQqOY<2mpj- zL9K+S?LL*~6(Y-N3>V#xpe$zKg-Bs4ekJ2T7oWn6__@t#ZqUAcJXeL*_J$(>`o;DQ zG@Ras)cGjKM>tE7h-0C{JfPj}t8+YBtlCMo)lEL&%2|oqeo>R#kR0lOPb-7fSx$!V z@WYN`lq6))Li0TP&{(bQ|vuFQPQ9P zie>3Z&VACUlvh|g1<(Kt*$Wg7vl<5~EwEFC^ie0?L@gr*jvi_nPNn7b#VRYB8Tj7| zmmc>1y0U$xTn{4p`JUcfF5kuPa~-nLpsq6K{F!P?2|O7%{gg-xCV6D zq@(ui%6^9zH$7&}TO!AN8kWTJkCg=cWrq6P6bCin?_%+Ba@jZ7G+Q(4Cj%=DD4gn7 zj2ypjyK*La%29omn3p`BhLmf=g>&Fmg!paO)^)cSeih@UVo(W-f5Xcva2`~jOCP$pb)UET_)PH;%;S@>>7rg(Jqq7YNA%h-mH5C!hJj@W157~} zMg86uH^YxK(^r=e3hQULTg*-8G}eI*0@(tFGWTIElKqo$^t~CU9Ml;I3>IqPqqlh0 zLi_<)OziF9*{2X5x4>Jht|KtwK#C2ivNsGYPba}LF@O{wCJ}-q>BBx`r+{4gvhm<3 zkdU~5&R*JgLYn0~*rVl9|Z1&B~=&1!u*#=&eN$usI>?LdleqU1Z-$QU0PqOHu z+3=-xSHt&!s3UbP8Vr@{*r@3>9)0>BNi~Qok=j z8fP*4(4@ii*%}WJqm@;f&=p;_FMHa*E{;BYr32v*A7%~%;SA!C_#|(6WDf>g%%ELR z4pxN07mjO0PT5gUEWtLHMaQV zCwqs#Z!rWU;X>-$^4hJ2S#V?{{I}ucAgKP9^Ru$7!a))SZq0j((iWw`@lNTDS!d-kM4vr z?-WMjWzIW45PP(9q_h}VA2&~1#_P`G4b*fLF6NL2mLs;-w62kokg3rF^hmW?$Fi$H zdVs1lqT*E5D11RLCu7_)*p`^i)$NI0C`XDX>s9l)Aa|3L1vm!KDyN97Yr)i#?&zb7 zvu9|Eq#6WZuRuBmSTO-rP?NQ&TCWf|(+-)ao5v`Gp+E{Ox{(;EGMpL;qA=I;xy1!p zEV?)+eF#U(&yiO<-1MH>tSDLIF4Y^KhNcx&P?_8GGqLKnOLH_xesXIE*HG7~u37vL zuP=K|WNsK?Iro6HVNU!$W85yO4L&ediNVhlSL$QNqib}Xv-Ld$pTTKlur0~*$xpOJ zXWT#%NH8Mg8kX4#!}zM3;-phRN|yncvtUI^!iW1zC91Hn^dch!kb!*y(7p#!rnIdV z!!_f^lsaWXh!otjjA1M1z(!*4=7Om$^WJUsj0Q?wf5_q#ORtnvW!WX3XVmZ%HR{yx zq^!AMC^bZtQ0IiFZnz@Y+|-432#f#)svXm6&Jr8yLZFh;RS8}QyB7lmHRO4vMbQEN zf(8zjhAS`ZCn7q_tHHq7nskX;_yb7i*=)<^uA8}JDD2elwxq(xHngXaE->vzZSNuK zCjcw`%K4f|_m_cuhh5^e#-puPcdMj!>6KixCGZoCpq|qGnIV?RRL^Kb5sXAjyDMAt z?=~mhFl~6w$shBR+1gBJ$Kh|BJqLv$8f{5)-IjLhR4tsslulo_?&cMET5Ekp^Hm1A z>VMU>IyK0?2#RN@K?srd#{RYT8Ny$K!hYB{l(>mC6HEQ+1UGsTws4x9dhfMv>_y#M zYYgGuEur^KV6)7$`2CTEJ;C_z)M8Y)e#7l&DdcT%3 zvN*j|41EsQ1%p}s6KAwU4rz=CaC7rk#4*=TGPuWBi%xWr7)3o#X2;$`0EUs>$bhR< zjb{Wy?T)WP3cpJ>c?tGE<>R3G!pCkfu*vN@WJ9`@>alIPxE=f+liOhM>7;%g=z$QG z{k%$!#SNX)c3VPt!r@0on2~pLuvg808b#cKB50}lpF literal 0 HcmV?d00001