From 4154c370ec1ac120480dde532dedfbed4b734fd8 Mon Sep 17 00:00:00 2001 From: Emily Eisenberg Date: Thu, 27 Mar 2014 19:23:15 -0400 Subject: [PATCH] Add tie symbol (~) Summary: Add real support for the tie symbol. Also, get rid of any of the leftover bad support Test Plan: - See the new normal tests succeed - See huxley tests didn't change except the new ones, which looks good Reviewers: alpert Reviewed By: alpert Differential Revision: http://phabricator.khanacademy.org/D7772 --- Lexer.js | 6 ++-- buildTree.js | 4 +-- symbols.js | 10 ++++++ test/huxley/Huxleyfile | 4 +-- test/huxley/Spacing.huxley/screenshot0.png | Bin 10814 -> 12022 bytes test/huxley/Text.huxley/screenshot0.png | Bin 12747 -> 12752 bytes test/katex-tests.js | 37 +++++++++++++++++++++ 7 files changed, 54 insertions(+), 7 deletions(-) diff --git a/Lexer.js b/Lexer.js index b1d8d6aae..01e4b611b 100644 --- a/Lexer.js +++ b/Lexer.js @@ -25,13 +25,15 @@ var mathNormals = [ [/^{/, "{"], [/^}/, "}"], [/^[(\[]/, "open"], - [/^[)\]?!]/, "close"] + [/^[)\]?!]/, "close"], + [/^~/, "spacing"] ]; var textNormals = [ [/^[a-zA-Z0-9`!@*()-=+\[\]'";:?\/.,]/, "textord"], [/^{/, "{"], - [/^}/, "}"] + [/^}/, "}"], + [/^~/, "spacing"] ]; // Build a regex to easily parse the functions diff --git a/buildTree.js b/buildTree.js index 2e16993e5..2cc8441b6 100644 --- a/buildTree.js +++ b/buildTree.js @@ -317,13 +317,11 @@ var groupTypes = { spacing: function(group, options, prev) { if (group.value === "\\ " || group.value === "\\space" || - group.value === " ") { + group.value === " " || group.value === "~") { return makeSpan( ["mord", "mspace"], [mathrm(group.value, group.mode)] ); - } else if(group.value === "~") { - return makeSpan(["mord", "mspace"], [mathrm(" ", group.mode)]); } else { var spacingClassMap = { "\\qquad": "qquad", diff --git a/symbols.js b/symbols.js index d4294f325..fd65d71e4 100644 --- a/symbols.js +++ b/symbols.js @@ -437,6 +437,11 @@ var symbols = { group: "spacing", replace: "\u00a0" }, + "~": { + font: "main", + group: "spacing", + replace: "\u00a0" + }, "\\,": { font: "main", group: "spacing" @@ -565,6 +570,11 @@ var symbols = { font: "main", group: "spacing", replace: "\u00a0" + }, + "~": { + font: "main", + group: "spacing", + replace: "\u00a0" } } }; diff --git a/test/huxley/Huxleyfile b/test/huxley/Huxleyfile index dd6cc6af0..1d339e613 100644 --- a/test/huxley/Huxleyfile +++ b/test/huxley/Huxleyfile @@ -20,7 +20,7 @@ url=http://localhost:7936/test/huxley/test.html?m=\alpha\beta\gamma\omega url=http://localhost:7936/test/huxley/test.html?m=a+b-c\cdot d/e [Spacing] -url=http://localhost:7936/test/huxley/test.html?m=[-1][1-1]1%%3D1(%%3D1)\lvert a\rvert +url=http://localhost:7936/test/huxley/test.html?m=[-1][1-1]1%%3D1(%%3D1)\lvert a\rvert~b [Functions] url=http://localhost:7936/test/huxley/test.html?m=\sin\cos\tan\ln\log @@ -35,7 +35,7 @@ url=http://localhost:7936/test/huxley/test.html?m=\Huge{x}\LARGE{y}\normalsize{z url=http://localhost:7936/test/huxley/test.html?m=\tiny{a+b}a+b\Huge{a+b}&pre=x&post=M [Text] -url=http://localhost:7936/test/huxley/test.html?m=\frac{a}{b}\text{c {ab} \ e}+fg +url=http://localhost:7936/test/huxley/test.html?m=\frac{a}{b}\text{c~ {ab} \ e}+fg [KaTeX] url=http://localhost:7936/test/huxley/test.html?m=\KaTeX diff --git a/test/huxley/Spacing.huxley/screenshot0.png b/test/huxley/Spacing.huxley/screenshot0.png index 633b2914a3be346fbafa0e6a1ea8cac79e7c4791..27ce66acce53087eee508c05b804b5f3fe86aa16 100644 GIT binary patch literal 12022 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 literal 10814 zcmeHNXH-*J*S=WBu>d+2R7!*yMMcOkNSA=36cvIwds6)`{l0RALu9cMt$F39-kVT-HD69a3XNV^O?KX03!U8dLD z>agu_@1}hPu)VuBZG6fIzPEeD^}Q$7mcZAokbQA+)i0CRSDcT{-gtJ)hGU0Ut+I(Z z7M z;T013QFz@LD!l$5{LqsX`B*g^DcLy@XX~@?f=1uDr?@6bpQ=ZlGf#HVo-l^jWdu{R z<4f!V22}gqb5ctBeQFD7)aYBSO0@^T{Y1&z2l8&kIDSwznlmtkiJz$G_v!T`+FMf( zwQTdl$sW78Dl{sD;dG%k>h@oo!`Bku{&eENJssY3Q#Rpe+D+dtZ%H#)ggDPxSnNG(dSX%R~-LJ!m*BCPj#W~D3D7L z934Oz-GiQou7dWaLQvsbvSHoKYsmnZAt(55S`aNSKj+w|S;C#|Izd<1H9NHZz4B0N zZUxCo36s78TKN-{esu*@HWs>4Y}`*O<Q4n_Rv zA;Ik$a-os^eox3R9e=s$FEW=Hy9qLkB!DVw!e;$B+|Fn%(ZJPB#9U1d3cXH zuI`yDgg6sDPEp?6s#EYkGAGrujG)}#dGrV|o%we~Y;{&$G5y*jb5>&BBH|Yv%i`N5 zEA_g#Cv>u_d|2Qy2Xt>BB}E}=eN%j6pVmZKM^Hox*{6XsRuP$i=_U#-a&0`=B4fjVNuW*plYIKo%FDBEu|ojUP)vw97E_)S4%^Ga?IW7;yKz;Tq2S zC`_lDOeGl;Or1-|`q|o|a7+Hh$Xo(yJ-p7BHSz#i;Zm0?(fIXU>GCglyDwAHu$WQg zeLpcMj}#u0qvV|>)-nyrp|0$y%1bhdT~bYX#dV=Y#jR++h1;H_5b zNl)sxoQ_vLSeqvh`V#`&@YW-dvZc1yU zeD#Kg|CH8N8_`4yD|Y!sS&*K5evrwJQ0L)w^gUQO>-sP<@nBxrjC<6UZYw0w4sDWF zJ(9M1x^X>xiM|FSMH**Ih4NHvVPAhh?Y+CoBMb}T&-?bCO_Z7 zHp1@m+ufp+E94ONR<+j;m7R{Hsu+Ie7PFNAH0z)%8TrINAU$b|dY_&3Je)MF&443( zjyDR&x@+V(Md?&LRSs&v@A~jx($qzFP4Vlds<67O9qn6s%B;IQ3lg?k+dU&B-?=8K z_un$KpNI$W>Gox$l6NCRvKJr5;2N{u*U4ZOhK^L|2F;I0e+77_UKjHI3MeI)rYZ}W zt+6ahq8H;D2vr=%O_cVOe%3R0oCWMb!_ovwJ(-vt?_l$WmFe)~zXw_EV|r-jC1Tj8 z`Y~JeBpc*6&9oIQU6Ar;-<|N?w`_2wvifBNlem0u3ygx<=9NMPa%9ag?7S zJ*`!tJO6pi`F<)wfg@F23VDrpOf_*c;wZZ(xWu_@RK`1Esz<%yC2!=sbp;8^P6ids zZd-Ly_|0uLdu`pbV@qCbvwcFqYL7(g*EGIpOHe6Q?LL!9#3pI^d7MD+cf$StViWWq zfX?qW!941^NJ>IAR2L4Lr^dh@@TUa);vtd`5T>}wfywnl3dMCLL$5;kvjWf?C~|=$ z*I<;Qys*4sSSb*_aw0(*h;Z*~Nfe1fj@qH}m`>gh4?)z8-!6t92p|vmk_=%XWnWfH z4B4#5zr0|jSU271ttoh`D>b(;95tmvx%ac7E15gUPUP3}GWbHFSmZv$+G04Pwuz3l zEXnO!BI!TmWA1N(#*bPSuN66W)s>Jszfr9$5Hvw<@XRL2?~TS$eaCh7xaWaueqiOLQd zia;M^p??5&!+>HX=>y#*%dcLsVc}D+zPOGBb3k)1So1Ver+nyD8!sL%@wO)4pe4#U z-roOgQ}rl39%adw;c@yEXgs%;n0=y@;IRZZu^>tDL(_UVx`JTa?^b2tn1+^*>20bL zsN*~N#G~4g1ur74iB7u&s}}O%C3k9KXSCr*Ea_wK^u;Gs#xA!i662mdDe%bRJ-jke zPEe!el$kq^O6}-

cU# zCbZ~EDG1&b@@mWHkVOO($I&VN%!S)tZ+FKt6497eT!66GZ2#OI6=Rn?y8s>HnD=qyIO*3Ah$vGX9&1aCs5g&^#=zpHA@qHadXUG zn(fIuBviWU3O&(-!S@f)xzXC1(1Izo3P?oWDySJ+%JUfT0!$F{n&jW_-LJK0^f*VE zO2G2b9h{Jbp>Rd-+T8U+0pt+%B#lcKnlxpuygS^~=bC9fI8s>%+P0p#WF!=NM z9mDuymH2ewpJaED^e5ctd5iiz=4+uyk;T(pHD^PZUEDvbha@#Jaax{%igKCSFAG6Xn+H!NJ};M9Yz8ia6bE-gXDjkRd8lv;^b zCto|$e{DEIJ;*+bT{i$)BM=a>XzMQNx2r>WItG^5*mg5iVS|*{E_~`Avr~DB`toZ+ zOD3DFH1_mm(p2vq2l}k6=a+Az&Iu+-NTERo>p_1QqcGZ>b+*)1HHG}=4i%d||4kI# zz+c?ea6HKkVLuDh{xs-s)o)7HM2D5*Q&&MohUOx>uy4&X<(E291y4$jvp$@FZ@px# z*6BqOHj3U(YLd8)6?$jcL%y1O`f_Nh?<0pjo(^|Wx2M~H%HioxZT%X(| zu3J~=WL^YTp0$3annZ^2r^Dka2520@4!7j@S9}WXo={NI7t8Q+gMu^#Zk_l=r95c5 zO@-hLSmwg0gpz)JVdY>@FOJVFmYZw|ON^)`Ah>1TZLY%sHqc%=LQ1LmC>J28?~jwjvbc2fLpNNMpaqb7eiO@IV6w z;2N&$;G#Ji`*in=!fp}0Fh~T)`9#0ZC{G?%i(5dDtmQ{wv&4(Rfwx+nj5gURd{(B5 zEIr-8*^z&T=E22np*pOd%&#d!E~32ZoE3))~Zo7)JKvU^P{gV051BAtjP^VBn;2y-xZRGq8 zG*oZOEAl@yno3Luf3g@DEOf7pbI9xTYcB-Lvh_%h(>d+BljOS{j@Xy@9z%9Ij z$00B|t3k2qe*m~O+6{G5w^vagCzSvORv(D3A4Wa(Npr@%9x%b^bl)!_VVgK+kRuXQImRJj;y{Bb%K01QJlu8!`p4 zOF!HJ8P+S6e`|%9@vHhK2?XWm=Pb*8Fs#xvRVj9YTdF&~Dn?kjKSv!Z86qhGo&s%C z3x@ynBKR<$O-Q9~!hO>QZb#Xr5mdy(Shh<_~~e`592N#YSESi#H<=T{?r- z1XHr44_sU{f=9E)(fA2MjWBYmw)!e;B~PY~PL4nygR_UhWc1e>bA6u0ATTfqehtjP zQ9ps~5I7pU92a0^qOXJF63sgNP*k`~P%f1ykOpZL72tngBh#~_qQBI4_^(1S#_;FT z;2}KI^^nUzcov|1AT_=l-lc&-;kZI!ryB`%ZCLV4&prKPw@sF?>=X4VY1-R z;&`U$RA~sS*UhLukk6r%f_g8aPJO(iP&7V=n&r9x7h;N^@Tft$`D+Tr-vNz1{cp8j z?c)z7rV%BveWsvy@5n)-G>QSYmPSuh2JuT-eV*)uezOL-IWY6!yY0~U$80R7mOEL? z<<+L~=W_-GAs@1g^;0W9*Jt$8z_~FOYsV13jy2=4)()E7jx>HJE3i`&%DN1@A8FBj z^sLCP*rjX-^E2wefbwa&lvfF+O>825f=d=)WcyJ}9won^$U_4c4#Ql1j^(m(g8K7% zXQtz@8t0IlDX#}6YE=G|F6S*W>=0@>r$>bHQkr)<$A7?7huO&hqkelN=r0(pj{M8k z?hbxkmTRs>x1#{nI`}^qS>r69?0baG8Y9mt+r(ama$7@;0%;|C?r0U!N^n`(V)Vzo z@-aA|&Z`I3m+4D`?afxJB_jDH9J#U}zDmF($*W0JouPtLtmu*BPB)1sfrdOuHO|H( zZ!(SGsOtM-wZuUZ5twvYL>wNzKoL|5%{^Gi{3$Bn6GJH1j4!KjBk(7$(Qd{KyD+&? z$Sj^4J=^JGvc=D?%LQwELK;lfu}%>UnY_W^DaA3~3G9nn51+~~oAbPFBLB%V{yMoF@b51NcVwadj52vX}Yz@KR$}xn= z00tbR&wxMG4A^#wEbKU2Sdx3gAhSm`hm2XIR7j8Zw|pqkU27*Q=%oW4NZop-c4$Rj zYoA9Jg-v4D3B8`15%1BpLRc=%ci2nNA|}&jhMV1ltxi)YE4KJrw!(%scIRoNi__~r zsdH$d^BLz5M0F65Wy7V+Ihd7&o1y(Ny1z&4RNXI}Wol(!63@D&cr7uB1hu}4nMG_H zZy+1?E^6@dIaFXmssJ}Pbq+7!K2GvU^ahdk{vhe~j@hNkX|36F@?o@M&3J~feeS`2 z*8-7rF}CbzUTfms-=NO(Ag%V@c))qxlt$-P#Y(Rwv2<@*NyW};{vut{!Hmr-2r9U9 z$PF`xS1;Xn`myuR27hk&GuMJaE;^%?WeL(Rn? zGi%_)q<4(K{T!x`{30kAWAv65r0$d+&&`aal@87lh&>~zP zrTD@d!Sytp$wwjS`v3#1NPLz~0K%8FG##$n=1;oRT*T&3Ho47@zqcRy2#Cl#FtVMy zOZqS8bAu^Hq~hbTUH}0HX4$x2goC-zijmMV06Mem*ldr6pjVrrbG}L-H3$h8LzzJ5 zu8xeRlWB;0f|jk7td^#Wq`fYFH8rZdWTVsQYig_XP1YN>uEQnAz1UpO3tKP>{M!`V&Q05SYg7YOx+<%F{T=Wv^<35fu7qE%fWb zG%kq}B(2T?wFwT)5_wnbDRALgHnw*Ulo%1^>6QB5M0`;unDMNrSdAXYNCuV?cqUQk zdoS{s0=lChsQ>ldZ(^ffTKmL-XGdAUnYYkU^zbSute}-Yj!A?>>ajH(^}m0~U1AW<1p|b{c=^6qy%f)7f@Y!lB1g6j*1nNvfV!{ml{IghB@1 zJHe}ZG>(o4n-yP^j0gz=JKK|rS)>-B?mfg|gmTLO0t0tp{AWyhp0jLJ)OO_zuEt_# z4x)=$;xmqHFxX>~*hyDjC}~wv@aBE<3|$B?hvpBUd@Y$VMkHhTlul24vTx(s>_`}s zCogpI)`>#|9kw0u_knR1;I^&GQr_5N}h4zK~YvfPb72>|1PfuQM4;RGYV0| zy=nvez)~;|3O|tmAB*iQ^nux0n$yo$Dg?F~{bkpU%RzcG;Om1S-Er)iS-(+3+yHHS(UyLFP6&^Jf;V&09R<$F5&h2kMBA7j)U*D@W17Qb@T*92wKY# z{x86H9DT>p{}xBzvGW}}-?1aCg6}x^o`df=_&%fjzZlJ?1%7(?Zn3z>2|~ykA2U5# JbmZLi{{amJGD`pe diff --git a/test/huxley/Text.huxley/screenshot0.png b/test/huxley/Text.huxley/screenshot0.png index f5e477fa6b60710ed35e04fa775870a23c9906ff..617ab0749ae1cc5793b5a682a79fd6b74a687979 100644 GIT binary patch literal 12752 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 literal 12747 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 diff --git a/test/katex-tests.js b/test/katex-tests.js index eed2e8333..6b0ba15b6 100644 --- a/test/katex-tests.js +++ b/test/katex-tests.js @@ -534,3 +534,40 @@ describe("A color parser", function() { }).toThrow(); }); }); + +describe("A tie parser", function() { + var mathTie = "a~b"; + var textTie = "\\text{a~ b}"; + + it("should parse ties in math mode", function() { + expect(function() { + parseTree(mathTie); + }).not.toThrow(); + }); + + it("should parse ties in text mode", function() { + expect(function() { + parseTree(textTie); + }).not.toThrow(); + }); + + it("should produce spacing in math mode", function() { + var parse = parseTree(mathTie); + + expect(parse[1].type).toMatch("spacing"); + }); + + it("should produce spacing in text mode", function() { + var text = parseTree(textTie)[0]; + var parse = text.value.value; + + expect(parse[1].type).toMatch("spacing"); + }); + + it("should not contract with spaces in text mode", function() { + var text = parseTree(textTie)[0]; + var parse = text.value.value; + + expect(parse[2].type).toMatch("spacing"); + }); +});