From 78b988af95b659e27798ceaacbec3db75fc436d4 Mon Sep 17 00:00:00 2001 From: Sebastian Martinez Date: Mon, 10 Jul 2023 16:30:04 +0200 Subject: [PATCH] Replace custom extension with `marked-katex-extension` - Add a visual test to check math rendering Signed-off-by: Sebastian Martinez --- package-lock.json | 17 +++++++-- package.json | 2 +- src/lib/markdown.ts | 50 +++++++++----------------- tests/fixtures/repos/markdown.tar.bz2 | Bin 4803 -> 5156 bytes tests/visual/markdown.spec.ts | 12 +++++++ 5 files changed, 44 insertions(+), 37 deletions(-) diff --git a/package-lock.json b/package-lock.json index ff91c236f..0ee8f072c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,9 +17,9 @@ "dompurify": "^3.0.4", "hast-util-to-dom": "^3.1.1", "hast-util-to-html": "^8.0.4", - "katex": "^0.16.8", "lodash": "^4.17.21", "marked": "^5.1.0", + "marked-katex-extension": "^3.0.0", "md5": "^2.3.0", "plausible-tracker": "^0.3.8", "sinon": "^15.2.0", @@ -826,8 +826,7 @@ "node_modules/@types/katex": { "version": "0.16.0", "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.16.0.tgz", - "integrity": "sha512-hz+S3nV6Mym5xPbT9fnO8dDhBFQguMYpY0Ipxv06JMi1ORgnEM4M1ymWDUhUNer3ElLmT583opRo4RzxKmh9jw==", - "dev": true + "integrity": "sha512-hz+S3nV6Mym5xPbT9fnO8dDhBFQguMYpY0Ipxv06JMi1ORgnEM4M1ymWDUhUNer3ElLmT583opRo4RzxKmh9jw==" }, "node_modules/@types/lodash": { "version": "4.14.195", @@ -3079,6 +3078,18 @@ "node": ">= 18" } }, + "node_modules/marked-katex-extension": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/marked-katex-extension/-/marked-katex-extension-3.0.0.tgz", + "integrity": "sha512-zaSO2LGwq8xI2QgGfLqHSiMFFj3l+7vq520DZ+mnD5jeq6iF8w/JtUfIUPVxi3gmpkcJVOBSpaN0b2Wosn2dzA==", + "dependencies": { + "@types/katex": "^0.16.0", + "katex": "^0.16.8" + }, + "peerDependencies": { + "marked": "^4 || ^5" + } + }, "node_modules/md5": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", diff --git a/package.json b/package.json index f5dc5b88b..a241c48d7 100644 --- a/package.json +++ b/package.json @@ -60,9 +60,9 @@ "dompurify": "^3.0.4", "hast-util-to-dom": "^3.1.1", "hast-util-to-html": "^8.0.4", - "katex": "^0.16.8", "lodash": "^4.17.21", "marked": "^5.1.0", + "marked-katex-extension": "^3.0.0", "md5": "^2.3.0", "plausible-tracker": "^0.3.8", "sinon": "^15.2.0", diff --git a/src/lib/markdown.ts b/src/lib/markdown.ts index d1eaf0db8..455d8e286 100644 --- a/src/lib/markdown.ts +++ b/src/lib/markdown.ts @@ -1,10 +1,11 @@ import type { marked } from "marked"; import dompurify from "dompurify"; -import emojis from "@app/lib/emojis"; -import katex from "katex"; +import katexMarkedExtension from "marked-katex-extension"; import { Marked, Renderer as BaseRenderer } from "marked"; +import emojis from "@app/lib/emojis"; + dompurify.setConfig({ // eslint-disable-next-line @typescript-eslint/naming-convention SANITIZE_DOM: false, @@ -30,25 +31,6 @@ const emojisMarkedExtension = { `${token.text in emojis ? emojis[token.text] : token.text}`, }; -const katexMarkedExtension = { - name: "katex", - level: "inline", - start: (src: string) => src.indexOf("$"), - tokenizer(src: string) { - const match = src.match(/^\$+([^$\n]+?)\$+/); - if (match) { - return { - type: "katex", - raw: match[0], - text: match[1].trim(), - }; - } - }, - renderer: (token: marked.Tokens.Generic): string => - katex.renderToString(token.text, { - throwOnError: false, - }), -}; const footnotePrefix = "marked-fn"; const referencePrefix = "marked-fnref"; const referenceMatch = /^\[\^([^\]]+)\](?!\()/; @@ -158,17 +140,19 @@ export class Renderer extends BaseRenderer { } } -const markedInstance = new Marked({ - extensions: [ - emojisMarkedExtension, - katexMarkedExtension, - footnoteMarkedExtension, - footnoteReferenceMarkedExtension, - anchorMarkedExtension, - ], - // TODO: Disables deprecated options, remove once removed from marked - mangle: false, - headerIds: false, -}); +const markedInstance = new Marked( + katexMarkedExtension({ throwOnError: false }), + { + extensions: [ + emojisMarkedExtension, + footnoteMarkedExtension, + footnoteReferenceMarkedExtension, + anchorMarkedExtension, + ], + // TODO: Disables deprecated options, remove once removed from marked + mangle: false, + headerIds: false, + }, +); export default markedInstance; diff --git a/tests/fixtures/repos/markdown.tar.bz2 b/tests/fixtures/repos/markdown.tar.bz2 index 076dad1a8fcda0de53d9b6237393faf29dc2f744..7c086a4723910992487b12951dabce879b8f1cb3 100644 GIT binary patch literal 5156 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 S9?DRD#oUoj6eKzML(KqD7EM6_ literal 4803 zcmV;!5|f{qvJURZ@z8q}U9CR%I61C;(BYfBP0}cQKKmalT0078n&;S4c z00001Dr5$NO$jHO1j!zz)W{7o0iXah02vw@28MtD-~coL10VnZ42F#W00000000td zQzbG_N_kJz!jDt+Mr2HyX!RKbO{t?pBhdk-fB@4*fHc!jP~ZSG00STZ01SqW00000 z0000IA_x!!&;poEHic9ClhHFsYI<%~)s6_J0qEllJ}U%ZEc^R8dSv$MCtgizjJ_RBEC+!yD&N zhdxRpSxuoBSdmYZik1{n&_6*12cg(H)tNyFAs~|GRsXcwmz%cSyD<2mnytqF9}!7L z!T&4$%sj(E^c_dxC)hD_n}Qeq%biArGuShB!YCx(v83XO4I#k=9B8H~C}0+3wN$|s zI*N)?m=q0|Sc0Pn?A4X`ciXwwqA#2LZO&#)NyyQF|G?IFmKd?=|00Ly@`B^`(~2}Y z(Fp885+%8@wjIF%0#3&61fKOkIiyS|z>p2)&Iig^SQRQ3Ohat{&oS&f14uC9n8o`~ zyQ+4|IpjFbfHB)N;f>PZa_kPDFQz=ajz1l#U!PgOLlKOVuT9%E0qQrB z9)qDe$4`{o7pnnxWGWEQH#VEWGU6NJ8c#IjJJOEsF&JSY{sx5X8MtA4c`(GFGh8kF zvKO%Y#2OqR(NPXXO@^o*wcFiDWr=1(^AgJv zHfD4|aG{Fub%Fs|IYg9^!Y)+_kL&b>kb#wHF|(f8-^8Y3lQ6?Ymr-)0REi=Fl7{$@ zQx1Za7Fq9@9K#u3ME2x}DFm2{kjMsb{s)*_pYMwO#hV%*J7GD76DS&@lL*5Rs4m21bgR%lErUZyvy zqREyd&iD+I7hG^57l=Mukffm}l;{moShbnI8k&YJLo71o$lPoQ?=phs>}3b+{q~SB zDr#$n?Ub=m>^#FTBsUjM!MMO-S5suwGRaI-f(-W~+WT{j>bj>wR)q314ShPf496_S zp_uk(ZXm-UmKejNgj23EBUFkEh?9{OFd1VKq$#YpMPFqhVR;kE)sfMC4D>|reIpm>$ z$kxh+x;rIZ5ze)dQfdh&QId#_C}bqiSNfY?MuXf)YyIY_ zJ2m+?o}fIFAwa>Aiy-zs;65=1(@&wLB21{)=h@6R;2y)Y#r1~1$TqOc%xar$ipdwI z`xILIp(Xd5wbU+EL1Q8gV=}}TpHYyHO~#-gpvV|783lvLWsYWKdlZI7hQog$mCilh znfV!0xQTWogCO*wZWxil3=}8^F^u#ZJPh`J*y0>DxH?N43JY=-Epc(UUZ-eN96Son z0HRg*>*G|}wo-=`w~Zw*AjAYNOx#UHCPB%Ho4HS(b(ebBWW1%2V!(uUu^lT_OJi+Q9O^Wfh^C;-JR3zs2f|of3F~a=d z&Zo2~8V5`XZx0vM)FgQOe6w4eq!Dvm0z85~#58~7==lE^@2V~#qiQnM=Y#98c6k(c z<~>|WKVa_3;}$xq3*_`7b_&J9Ip)pR%g{7A1kV8xoxmVGz}m38PA7NmB}uhqxAtsCQxzl5R;WqDp=riR zdR-wWh3>+^rMGNrCoh}C$EC?SCo_AS(Yz5zVe1b$BNiwmLul%mPC2JcH~Ie7=b8!D zF*6!gB-|+q7!e;?A->-`I3@1#z-wj!iS`nFhn)-P$QdKu;KF&#OhJ-b#?St| ze=)%N*&=B6jDz$KAHRFX^e0;l@y7LdRJK+eg2#v^a@!%YXR+2SS^VwWR;GVneBv;0FKtm%9o=ZMHUN|V$tDY%Q5 zb#1p`=6zEE0^aGA!q{=0P&96nDgRYtFEx?^{xKLO@N@9Pu(iYDkYV9}eJJbUS;Zirhh>{ zU*?FSp-qI~U|>PWM`=Nf^oMwD3KTgU$E)!`RQzBrTo0tgpoNGNpU7yF01TjjC84=e zXBqM|FsMdA)HU@Vub0314+M0laQq1z3|Hh?nb@!MW)iO}@Y*qzA z6e7a7NJ2VFj>q&aa)ra;HbHXc5(~r_b_ZayLiw5fXjvp+FljV22gbo_KC_-imgb>- zv%pHUgMvDaVGDUw2NjGKw*Nqdm@%BijD>K_FlL2Zn^COH{ zs>xL5AtPzLWms$&wvb_&LYrMxxyGyyGx#6qXs9$?$p-{2Qulu^IBRJx8Z z2)QW?H$XBPTEe9d51|B-dVlExpfeGIoM7o10{&vl?2OSr#!+Aw7!TLi4^tEkBBTQ( z6m$psQxevTLR^qTV`WzD+YV!xsJ}=HA}SFE0lE?BLHY=^l2p@H2jw8?Qf)(G@k9@d zRS`&th&N0y3IrI)#6}cB17x}ZB!+quG8;lH*^(iFTbEF?6-d@L14K3qMn(`xVTIff zWsu1Z@%$nI2n-)>44#eMXFY8$*ttG6_2W& z#hXcuq`}mx4Z;SsNQfXHj50(duse)%L26#C@0CquN^LVdrR7rvY1^5NE?c)E3}&QB zBa2B!Vzm@2YGEO25qQvFNgOJw5f0HNCvd@-tV*@p&R_#aPq^}go6s`C`O$z-pl^uzjLAXc@t>YjRT#3?T;vT0wWN-w2Xi(u8bp;THE;sKbXC&} z2GI#@y^+p6L|_}S76M`@8G@@n%|cx1ABbmqXK4g1f$tSYLSvzT)`?_i;zXN_3iLNo~&*fY{IMc>cY90Mx{Oq=jQv}ug&Xy-PeBhWM$qJzI4 zZLW*Z`kA3a6ii@15XEL}p>ANfmZk&HTK5Dj29JQr2T_M%VuKFM_Ce=1W|qb#HXvyb zHYiTLI?O~{L@lg%ZJ`@rTAEo5!GV$y*2Vou#Ui5O8pFmL!VZAQEkPPqPmuEYRmvTH z@u4i3a2Pc~${>JYK>_F>9fnlG&;?@QBN~L}2?&J8O0baRfu=U3YIvw9F>wZcTTIgE zg_+b)=UdLYEk?2@h;kr3Xdupo2}~HljNwr`T(O!);}o!R5NHqHsn(E~s=0*0F15}` zr^)21m8lH#gGjyVY;2VxC9R1&tXPcIhH4#=C;OZ{IEx-epkZP1eL*Gw9^m#UgQTI* zblm4T$_#>(Hv`;7+GAn71_og&5SVJHeT^q7LB6DOu~?Hby3(QVEQJ8XukRVqWd=Z+ z#HO`CFfpPy*%=@4sG7*hq+(E32qbH^r)ZmH5~L7!js~Tdbxa_cC_ynQNGdaS+T2%) zjGKiH>H#AYWWW_>Nh^^=g6SON0vs?=v}Myo4StdZB?bkCk{c5khG0Q~p(vCaAP7sL zuw=v%BOp-7X(BNLSJ^VymKhc$v||`D;ezsl@oNbTN69vSV8ms-X7JN8ImZdenj2%I zlgNb%l5@(Ck}^t5Yno_nP$(iIMdcL^10{*Z+m|_7w*ul6s6h#iAgvIlaSsm=m!IQ3 z@vuJey(2?!0bpVbKPPnzLHHYu2`GZBX{5FkGyEg?hAN2hn-@uwB;Fo!dBWiZ#n@{% zgo7LI|&)tV|qT}0C)=BMS~N-TMa?g zz@et8Hpj^w$j~rEVk*UxQv=14UqttyB5jsA8XI7!Vr`DnY&9XsIjC;HWDAa<2x1Ab z8;>Ep;%e^>NiW&fkyCJ!5@M^AbV2lV1|j%O1Zok?K+B)gMPlS3V^c%1DHIr+Meg?8 zKKT$8I3%p!(#{=95h4?5%ZEV0!SdCN+}$6KY{)GJm=Q!4$be2Ty$U8MUgHWM1$dr2gy(VkU-a*>?tJ~R!m%+(?f@3mg0pTPXf`aRAez&^POP;W72z$NXe=+6h=Rd z5@0O?^$9Wx%-wi`+!>>QzR4Z)-)#R|>_g4_uU6dV#%4yrBVf~CbH5wySqt2Bbxp&O+D zt1LZ|LkSH;Ao7EesTlwlDs-(XXucC!h)OwPIA%$MD%k--N7O;I#3>-q!13XAsU>X& zl4D65$8#|y2!Nrez-1zM8p#^ZDZn&Ml^c2qC{_&unH@|_*#1z>1C zVu7-KrU7vC5Wgu01i6YDkE~zBz!aLrQ5#^^sDyTE%Q4X!9<$;`YX5X;8Vr@lVfFqu zC&YX@N-QiM>)Lx4>e%lx|Ld17v2&*bJ)XO|Va2%Dw{+8k1jUw#nzxM2<+?X`GV dY(0)oYGz@mI>QkBbb$ZG+>uTcBs { }); }); + test.describe(async () => { + test("math", async ({ page }) => { + await page.goto(`${markdownUrl}/tree/main/math.md`, { + waitUntil: "networkidle", + }); + await expect( + page.getByText("The Cauchy-Schwarz Inequality"), + ).toBeVisible(); + await expect(page).toHaveScreenshot({ fullPage: true }); + }); + }); + test.describe(async () => { test.use({ viewport: { width: viewportWidth, height: 1100 } }); test("tables", async ({ page }) => {