From 591f4ce2306e0e45ad0240b828c76987c0ca21c5 Mon Sep 17 00:00:00 2001 From: Andrea Amantini Date: Wed, 3 Apr 2024 12:55:01 +0200 Subject: [PATCH 01/83] Try out java commonmark parser --- deps.edn | 3 +- src/nextjournal/markdown/parser2.clj | 97 ++++++++++++++++++++++++++++ 2 files changed, 99 insertions(+), 1 deletion(-) create mode 100644 src/nextjournal/markdown/parser2.clj diff --git a/deps.edn b/deps.edn index 3e6703f..08c1348 100644 --- a/deps.edn +++ b/deps.edn @@ -1,7 +1,8 @@ {:paths ["src" "resources"] :deps {applied-science/js-interop {:mvn/version "0.3.3"} org.clojure/data.json {:mvn/version "2.4.0"} - org.graalvm.js/js {:mvn/version "21.3.2.1"}} + org.graalvm.js/js {:mvn/version "21.3.2.1"} + org.commonmark/commonmark {:mvn/version "0.22.0"}} :aliases {:nextjournal/clerk diff --git a/src/nextjournal/markdown/parser2.clj b/src/nextjournal/markdown/parser2.clj new file mode 100644 index 0000000..adf723f --- /dev/null +++ b/src/nextjournal/markdown/parser2.clj @@ -0,0 +1,97 @@ +(ns nextjournal.markdown.parser2 + (:require [clojure.zip :as z] + [nextjournal.markdown.parser :as parser]) + (:import (org.commonmark.parser Parser) + (org.commonmark.node Node AbstractVisitor + ;;;;;;;;;; node types ;;;;;;;;;;;;;;;;;; + Document + BlockQuote + BulletList + OrderedList + Code + FencedCodeBlock + Heading + Text + Paragraph + Emphasis + StrongEmphasis + + ListItem + Link + SoftLineBreak + HardLineBreak + Image))) + +(set! *warn-on-reflection* true) + +(def ^Parser parser (.. Parser builder build)) + +(defmulti open-node (fn [_ctx node] (type node))) +(defmulti close-node (fn [_ctx node] (type node))) +(defmethod open-node :default [loc node] (prn :unknown-node node) loc) +(defmethod close-node :default [loc _node] + (or (z/up loc) loc)) + +(defmethod open-node Document [loc _node] loc) +(defmethod close-node Document [loc _node] loc) + +(defmethod open-node Paragraph [loc _node] + (-> loc (z/append-child {:type :paragraph :content []}) z/down z/rightmost)) + +(defmethod open-node Heading [loc ^Heading node] + (-> loc (z/append-child {:type :heading :content [] :level (.getLevel node)}) z/down z/rightmost)) + +(defmethod open-node BulletList [loc _node] + (-> loc (z/append-child {:type :bullet-list :content []}) z/down z/rightmost)) + +(defmethod open-node OrderedList [loc _node] + (-> loc (z/append-child {:type :numbered-list :content []}) z/down z/rightmost)) + +(defmethod open-node ListItem [loc _node] + (-> loc (z/append-child {:type :list-item :content []}) z/down z/rightmost)) + +(defmethod open-node Emphasis [loc _node] + (-> loc (z/append-child {:type :em :content []}) z/down z/rightmost)) + +(defmethod open-node StrongEmphasis [loc _node] + (-> loc (z/append-child {:type :strong :content []}) z/down z/rightmost)) + +(defmethod open-node Link [loc ^Link node] + (-> loc (z/append-child {:type :link + :attrs {:href (.getDestination node) :title (.getTitle node)} + :content []}) z/down z/rightmost)) + +(defmethod open-node Image [loc ^Image node] + (-> loc (z/append-child {:type :image + :attrs {:src (.getDestination node) :title (.getTitle node)} + :content []}) z/down z/rightmost)) + +(defn insert-text [loc ^Text node] + (z/append-child loc {:type :text :text (.getLiteral node)})) + +(defn node->data [^Node node] + (let [!loc (atom (parser/->zip {:type :doc :content []}))] + (.accept node + (proxy [AbstractVisitor] [] + (visit [^Node node] + (prn :visit (str node) (z/node @!loc)) + (assert @!loc (format "Can't add node: '%s' to an empty location" node)) + (condp instance? node + Text (swap! !loc insert-text node) + (do + (swap! !loc open-node node) + (.visitChildren this node) + (swap! !loc close-node node)))))) + (some-> @!loc z/root))) + +(defn parse [md] + (node->data (.parse parser md))) + +(comment + (parse "# Ahoi +par +* a **strong** item +* what [a nice link](/to/some 'with a title') +* just _emphatic_ two + +![img](/some/src 'title')")) From f42219a4a973304f0dd238173ff650f4a928a5a3 Mon Sep 17 00:00:00 2001 From: Andrea Amantini Date: Wed, 3 Apr 2024 14:25:44 +0200 Subject: [PATCH 02/83] Todo lists --- deps.edn | 5 ++- src/nextjournal/markdown/parser2.clj | 52 ++++++++++++++++++++-------- 2 files changed, 42 insertions(+), 15 deletions(-) diff --git a/deps.edn b/deps.edn index 08c1348..88ed370 100644 --- a/deps.edn +++ b/deps.edn @@ -2,7 +2,10 @@ :deps {applied-science/js-interop {:mvn/version "0.3.3"} org.clojure/data.json {:mvn/version "2.4.0"} org.graalvm.js/js {:mvn/version "21.3.2.1"} - org.commonmark/commonmark {:mvn/version "0.22.0"}} + + ;; commonmark + org.commonmark/commonmark {:mvn/version "0.22.0"} + org.commonmark/commonmark-ext-task-list-items {:mvn/version "0.22.0"}} :aliases {:nextjournal/clerk diff --git a/src/nextjournal/markdown/parser2.clj b/src/nextjournal/markdown/parser2.clj index adf723f..aac501b 100644 --- a/src/nextjournal/markdown/parser2.clj +++ b/src/nextjournal/markdown/parser2.clj @@ -2,6 +2,8 @@ (:require [clojure.zip :as z] [nextjournal.markdown.parser :as parser]) (:import (org.commonmark.parser Parser) + (org.commonmark.ext.task.list.items TaskListItemsExtension + TaskListItemMarker) (org.commonmark.node Node AbstractVisitor ;;;;;;;;;; node types ;;;;;;;;;;;;;;;;;; Document @@ -18,19 +20,22 @@ ListItem Link + ThematicBreak SoftLineBreak HardLineBreak Image))) (set! *warn-on-reflection* true) -(def ^Parser parser (.. Parser builder build)) +(def ^Parser parser (.. Parser + builder + (extensions [(TaskListItemsExtension/create)]) + build)) (defmulti open-node (fn [_ctx node] (type node))) (defmulti close-node (fn [_ctx node] (type node))) -(defmethod open-node :default [loc node] (prn :unknown-node node) loc) -(defmethod close-node :default [loc _node] - (or (z/up loc) loc)) + +(defmethod close-node :default [loc _node] (z/up loc)) (defmethod open-node Document [loc _node] loc) (defmethod close-node Document [loc _node] loc) @@ -66,32 +71,51 @@ :attrs {:src (.getDestination node) :title (.getTitle node)} :content []}) z/down z/rightmost)) -(defn insert-text [loc ^Text node] - (z/append-child loc {:type :text :text (.getLiteral node)})) +(defn handle-todo-list [loc ^TaskListItemMarker node] + (prn :todo node) + (-> loc + (z/edit assoc :type :todo-item :attrs {:checked (.isChecked node)}) + z/up (z/edit assoc :type :todo-list) + z/down z/rightmost)) (defn node->data [^Node node] (let [!loc (atom (parser/->zip {:type :doc :content []}))] (.accept node (proxy [AbstractVisitor] [] (visit [^Node node] - (prn :visit (str node) (z/node @!loc)) + #_ (prn :visit (str node) (z/node @!loc)) (assert @!loc (format "Can't add node: '%s' to an empty location" node)) (condp instance? node - Text (swap! !loc insert-text node) - (do - (swap! !loc open-node node) - (.visitChildren this node) - (swap! !loc close-node node)))))) + Text (swap! !loc z/append-child {:type :text :text (.getLiteral ^Text node)}) + ThematicBreak (swap! !loc z/append-child {:type :ruler}) + SoftLineBreak (swap! !loc z/append-child {:type :softbreak}) + HardLineBreak (swap! !loc z/append-child {:type :softbreak}) + TaskListItemMarker (swap! !loc handle-todo-list node) + (if (get-method open-node (class node)) + (do + (swap! !loc open-node node) + (.visitChildren this node) + (swap! !loc close-node node)) + (prn :open-node/not-implemented node)))))) + (some-> @!loc z/root))) (defn parse [md] (node->data (.parse parser md))) (comment - (parse "# Ahoi + (do + (parse "# Ahoi + par +broken + * a **strong** item * what [a nice link](/to/some 'with a title') * just _emphatic_ two -![img](/some/src 'title')")) +- [ ] one +- [x] two +--- +![img](/some/src 'title')") + nil)) From e1cadf8703974aa520f4c1176c500e8c6a30d003 Mon Sep 17 00:00:00 2001 From: Andrea Amantini Date: Wed, 3 Apr 2024 18:51:30 +0200 Subject: [PATCH 03/83] Custom InlineFormula type --- .../markdown/parser2/types$fn__2219.class | Bin 0 -> 1395 bytes .../markdown/parser2/types$fn__2236.class | Bin 0 -> 1395 bytes .../markdown/parser2/types$fn__2814.class | Bin 0 -> 1395 bytes .../markdown/parser2/types$fn__2842.class | Bin 0 -> 1395 bytes .../markdown/parser2/types$fn__2853.class | Bin 0 -> 1395 bytes .../markdown/parser2/types$fn__2892.class | Bin 0 -> 1395 bytes .../markdown/parser2/types$fn__2900.class | Bin 0 -> 1395 bytes .../markdown/parser2/types$fn__2908.class | Bin 0 -> 1395 bytes ...s$inline_formula_getClosingDelimiter.class | Bin 0 -> 673 bytes .../types$inline_formula_getLiteral.class | Bin 0 -> 1692 bytes ...s$inline_formula_getOpeningDelimiter.class | Bin 0 -> 673 bytes .../parser2/types$inline_formula_init.class | Bin 0 -> 1473 bytes .../types$loading__6803__auto____2217.class | Bin 0 -> 2003 bytes .../types$loading__6803__auto____2234.class | Bin 0 -> 2003 bytes .../types$loading__6803__auto____2812.class | Bin 0 -> 2003 bytes .../types$loading__6803__auto____2840.class | Bin 0 -> 2003 bytes .../types$loading__6803__auto____2851.class | Bin 0 -> 2003 bytes .../types$loading__6803__auto____2890.class | Bin 0 -> 2003 bytes .../types$loading__6803__auto____2898.class | Bin 0 -> 2003 bytes .../types$loading__6803__auto____2906.class | Bin 0 -> 2003 bytes .../parser2/types/InlineFormula.class | Bin 0 -> 6444 bytes .../markdown/parser2/types__init.class | Bin 0 -> 3686 bytes deps.edn | 2 +- src/nextjournal/markdown/parser2.clj | 53 +++++++++++++++--- src/nextjournal/markdown/parser2/types.clj | 25 +++++++++ 25 files changed, 71 insertions(+), 9 deletions(-) create mode 100644 classes/nextjournal/markdown/parser2/types$fn__2219.class create mode 100644 classes/nextjournal/markdown/parser2/types$fn__2236.class create mode 100644 classes/nextjournal/markdown/parser2/types$fn__2814.class create mode 100644 classes/nextjournal/markdown/parser2/types$fn__2842.class create mode 100644 classes/nextjournal/markdown/parser2/types$fn__2853.class create mode 100644 classes/nextjournal/markdown/parser2/types$fn__2892.class create mode 100644 classes/nextjournal/markdown/parser2/types$fn__2900.class create mode 100644 classes/nextjournal/markdown/parser2/types$fn__2908.class create mode 100644 classes/nextjournal/markdown/parser2/types$inline_formula_getClosingDelimiter.class create mode 100644 classes/nextjournal/markdown/parser2/types$inline_formula_getLiteral.class create mode 100644 classes/nextjournal/markdown/parser2/types$inline_formula_getOpeningDelimiter.class create mode 100644 classes/nextjournal/markdown/parser2/types$inline_formula_init.class create mode 100644 classes/nextjournal/markdown/parser2/types$loading__6803__auto____2217.class create mode 100644 classes/nextjournal/markdown/parser2/types$loading__6803__auto____2234.class create mode 100644 classes/nextjournal/markdown/parser2/types$loading__6803__auto____2812.class create mode 100644 classes/nextjournal/markdown/parser2/types$loading__6803__auto____2840.class create mode 100644 classes/nextjournal/markdown/parser2/types$loading__6803__auto____2851.class create mode 100644 classes/nextjournal/markdown/parser2/types$loading__6803__auto____2890.class create mode 100644 classes/nextjournal/markdown/parser2/types$loading__6803__auto____2898.class create mode 100644 classes/nextjournal/markdown/parser2/types$loading__6803__auto____2906.class create mode 100644 classes/nextjournal/markdown/parser2/types/InlineFormula.class create mode 100644 classes/nextjournal/markdown/parser2/types__init.class create mode 100644 src/nextjournal/markdown/parser2/types.clj diff --git a/classes/nextjournal/markdown/parser2/types$fn__2219.class b/classes/nextjournal/markdown/parser2/types$fn__2219.class new file mode 100644 index 0000000000000000000000000000000000000000..90d948734ecf850a99128eb125541c21f0dae0be GIT binary patch literal 1395 zcmbVMZBr6a6n-wE;JSw5OHo=Rrhp28Rx0*FDy7kzIL`EmS(d9UF1yaM`0}p`XG;6f z__-g|bat0FMZd(%<=p3RIrlmDJm>uR`|CG=1!Ng!G=6NB^s1prYP>8N`$hdoiyufv zg&WDZd2+xjle=0zpG+o}JYWo?vZ|M=29K+fwii!ls+w#ny5>O_L$7^4CaWceo)tw? z%ohw@;mD4N9(V+};bjmN?NHz6Ia4wfnPE5_$(E!;$%*%|P~x(gV(`kkRx$JW#|-}L zr7L$NBPBvae=l6P#V~O7R}TglggtIe z&ZLODj`JR6<&bBX3U{);CJ_GFQ zV<(4B&kd}?7ORK|!Fn4PW{Ap)tk!EL*55QH>jw8C#^90la=B^}po;h|J^9wQ2T7{) zp=2;DwzJHchNA7I+Bnrck?TsjfF}ax@sy#v$PK>h#Uew0RMn*-FV3k-p%V3CnZZrc zD0#8MFwrL7SVO$Ax_D!@7`-3~4qf7#J1G}*)q_`dIZbY845|O2?F6DCy~e75G}f-_ zi%RH0h8VBvMNZF_RW$ygS}t&7TPmpJ5pvXdGS4U$7&ssIQQq;<%|> zyAiNNPrHC6QrnU)ZA)^pEs2G!8>NQCY6y{|hUs%e-T2lFH%k1h&{kL*gdejp z@jJt8>z^$mb4|`)C}-=F_Q(B+Gd#P%;3<3rmKq>HAk_e41fDlQi1}ZhVf_McPBGn? zuM3+L*hO^Tk^P!`pZ+8`Q_C7c!m2aeglI0<+-8KCU?SKYZ9<#qZkU+X1QeoKArVT< KCYKXJbp0Q(%}f~p literal 0 HcmV?d00001 diff --git a/classes/nextjournal/markdown/parser2/types$fn__2236.class b/classes/nextjournal/markdown/parser2/types$fn__2236.class new file mode 100644 index 0000000000000000000000000000000000000000..4fa3bbfb74e1c5bd754891223834b78cd5df4ccc GIT binary patch literal 1395 zcmbVMZBr6a6n-wE;JSvQQkE8pDWF22nTfrSN@?^ajx&8?mgP!|%dWF5zWl4gnbJNq ze(py#o!#X{MZd(%<=p3RIrlmDJm>uR`|CG=1!Ng!G=5~3^_rncYP=#Ddqw?Fi|@skrE-IzZWjtVi>sks|N!NLW!GO(&3h_n%Ipi6p!kw(INkqgr?)M>p2kn6KA|5&cC)&=1jy%&Djq;qtBP-7-hRthk z?Bvktxq(&KVige~Sa0LP3{hE;)ke+4#+$}u-QZrt7(B9GsnkpYR1x2$C*RukAW3yT zkPL>Ui!5`dp=hPl1x^i5NoRMlVQ$LznpGjw=OS_289VPLmrNL+XEMJAtT3udym1jkT-# zq7r(LA;znEk<+tf6^(zWRSMkLmI^9)gdBCA%rlAwh8?iR3$@bvk;%0x^%W9S95;1q zH%2Yd({9ufsclJ@wk0{)mc&BV4N45utawXkoGc^T9sP;k@3djqpzj{rNiAy$fcDnW z&-O(?qz>N?44)%V$7pjic7~t}b%e-K$MhMZZhUKn3lKjmv=!DzYlK#a7Nh%{;m2%D z{7y03{%4!WT#NG;%Gvs){c(Td6i?4Fcmf}RXH76lAk_q81fDlRi1}ZhV*MO%PB7h> zuM3+L*hO^Tk^P!`pZ+8`Q_C7c!m2aeglI0<+Gd2AU?SKWZNdf7-7qn&2`EIfLL!uy KO)e*d==wjblS~)@ literal 0 HcmV?d00001 diff --git a/classes/nextjournal/markdown/parser2/types$fn__2814.class b/classes/nextjournal/markdown/parser2/types$fn__2814.class new file mode 100644 index 0000000000000000000000000000000000000000..e695fc0d56a0eadc5a3c3c3d794a704fa85c08bc GIT binary patch literal 1395 zcmbVMZBr6a6n-wEi|d+-N>N&-rh*EAR3`R9Dy7kzIL`EmS(Ym;F1yaM`0}p`XG;6f z__-g|bat0F#lFPM<=p3RIrlmDJm>uW^Ya&g1TqZsIzP5bM%C11En1e%{ep3%M-ODP z!p(TpIyvB#={-G{i!a9#0vJO;(Tq~nsR$f zB@~b*#%o4_)3aq%oxiV^^W5B#^BQ@?EOnm3)2as7qms{Skk3qNluO>v5@tG5(70W-Vhom%gA^Z_-d~Jpc5I;M#9d>}$D6J`4jP7rQA9FDA zJHtZjpDiMbP0pVwXZw@#NByxgJh{NoDFz5UZGa$wWCM&5c-8<@%>UvH8y9$eirLP5 zJ=mha9-{k}?3e7j)JM^sTJ{hU*WBSIhO-mRZCae4h)py{o7g70e@sk!0*c{`7@LYM K#8+Zsc;hd(6-*ic literal 0 HcmV?d00001 diff --git a/classes/nextjournal/markdown/parser2/types$fn__2842.class b/classes/nextjournal/markdown/parser2/types$fn__2842.class new file mode 100644 index 0000000000000000000000000000000000000000..e53ba67d681178e9233ab1b316c5415e8c96c81d GIT binary patch literal 1395 zcmbVMZBr6a6n-wE;JSvQQj`{{sh~n2m5IHON@?^ajx&8?mgP!|%dWF5zWl4gnbJNq ze(py#o!#Y4u`e-mIrlkS&V9~3&pE&U{QLzVi7dms#*fXiUNbaFja4LLzo;K+u>;Ad zaw8ElPY!r>dQZ#e6U)hj2aF*gt9rR+@R%xTrC2&s(_~Z8H4l0i`t9>kSuHd4tty&g zK4<8e3-5~PgGYcHUItOo4)uMWGbK}z8Aj*A*|KyfIq^Oe%3L;63|?8+s%Ad_kinn5 zbmgvOq(q1q?1u|C7>2I?>cJ3$P~zscbhNGOrU*X<1Po*3>fy}{@g8em78h~TiF>Q< zOo+JcIPXwa4ta)|xo+0iBqCx0cLxx_y>`GQ5%-;dlWk|RE6;RBqdceaz{+!mVe6V3 zyE$}w{=sU_Vigu4Sa0LPJW*Md)ke+4#+ycE-QZqC89cIHsnkpYR1x2$C*R)jAVGCL zlnjRDPL?^-P_$C2gHyv3zOJN6JQA>k#|*tiZty)XmKg>ksxB3IaZyzY)rc1>3~rJ} z*^5<%$qw;Go8pZdB6=mkk|6X>vnjNc|6OClD3s71ji#v3^xw zR6-9j#CT0Fa(cF`qVe~&N`V_YQb8q;kfY9%c}B6or~}q{p;p>BHn~=%zCxUeBYBo?x6P-38F#T!BsWEt7s$Pe^?qYc9*efQZ;YFSGFw6~6a zvM&O{b@;wx^a6o8g3ZnNIYKVfF-49#X3r6E<7+EifcROVt*|~?W3;AdF}lAQe%!{y z?+gp=f3}G%wm5&LoUKpVAM?l0@Z`@nE%BYHZJh`6tms= zy0AroT}1aS*)O?w>5qalwX7i|tU1F?h~z@8ZAO?6#Y3&pCUl7I9~0A>fI=iI#HZp5 KiIunz+4u{*R7@KH literal 0 HcmV?d00001 diff --git a/classes/nextjournal/markdown/parser2/types$fn__2853.class b/classes/nextjournal/markdown/parser2/types$fn__2853.class new file mode 100644 index 0000000000000000000000000000000000000000..7bff723d092e05a69829005ce25a7683e1395f0e GIT binary patch literal 1395 zcmbVMTT|Ll5dIFL!5FLJrKQ!Ds#QRRg4$ZK7pl@~=}jDG`ox5Aw84-#A$a*$EzY#s zhmOzvQJroQZi>E?nZurMIqdoN?6>>p@2}qg7LZ|>(fP4eG%BVpYq64S?iY+BJ$4|Q zWo{;7*2w`cPwwiuTw-Z)UI1elQ8c4iF?mdr^}SdsUC|XwHFNi(O zwO%lEgu*)#x*&+~!p9(~`k}GUvzBbB3d2w+oGHqOvK#MXzQ`3T$>38Ay=>)jj~V=# zOIPm5W>SKL-fnnsi=qGOuLAlR#650p$wym;VM*|#N5lXIuO8k=6Yt^XWpN3&-MDv} z&V+=!uJayc<&tNZ3bnJoCJ_l^xZi^jJZJ`-m+;UHINo$FwB?yf>y+mt9@%+LF>GFQ zV>^d-&kd|XHmk4%(S92bW{Ap)qSb09)!sC!7$)~2${;94sZ_BDP(}JKJ^9wQfCSa~ zP&OHsT3Kc-Q`Ps9Eu3ne@O33!z@mtGJYnc8aFg%)u*A?C(G0o33v-&9FGqY>X7G|U ziax9`jJJq4S{HA$Cf=wcMjuFmgO~VbPfB@16Y$C@r^QX3A^AVF-9S{N*H{&i!rE1R zQ3(a4iSepY;Ph-6Rp%cnr93yc<-A57F-x7N@U&`!As4Lid}VL_*y4Jb`U-I>j+eT% z69HTFvkZRk!55%BR|pooi+>`^xfq+sby^e(B3}! z*|`V^SJC$aLl+pSB2eFqo+Ic%6%*vBV)`5rFTORxjSxROv>mpO)-bIJT8!?mhaYt? z@jJt8^Pf#3a}Ca4C};bV^2hw~Gd#V(z$y9&Jgb8Mfn*(w5_nz*6U_he4C@zobBgKq zd_CBtz#gLej_lX$`_w1Vom%z~5?9^fCPuQs#x^a^1mnTRXcJpRcf-WAC!iR~i1CT| LY+^YsM%MoU#?4F} literal 0 HcmV?d00001 diff --git a/classes/nextjournal/markdown/parser2/types$fn__2892.class b/classes/nextjournal/markdown/parser2/types$fn__2892.class new file mode 100644 index 0000000000000000000000000000000000000000..79ea863439cea7ca8154f9b354dc5c4f4c359bbb GIT binary patch literal 1395 zcmbVMZBr6a6n-wEi|ZPSN>N%Srhp28Rx0*FDy7kzIL`EmS(Ym;F1yaM`0}p`XG;6f z__-g|baq!nMZd(%<=p3RIrlmDJm>uR`|CG=Ipi3obbeq}jJm1ITB0hOJ0)XZPwdKO zjhm^2b-2rG=yuM>6|KV1wWR8* z^@5=z65W!}1wn)tJ_bqE_lzB$w`5CI7zQKJTt(iK-FP316|Pum2A^W+HLFl~%n-<3 zx^hc4(-I`~cEf{P41HIB70|~ZmbtYd?{64}B_V(w5&amrdU!2MyoXwsB_-T;P-38F#alunWEt7c*iUqSrwzjzeRnxdYFS$Vw6~9b zb}j;<4fuax@D#xYLe0(a2}V6=AWV)1CQlIa;@f$+An~(9+hP5*hG>OpF}lAQe%Qgp z?-?AQGJ%qP*ETJ{hUm)+qe#`2@*+pIV>njAeJZQ=#d-7qoj2`I*LVlteZ KPAw+I*y=ylg-jp- literal 0 HcmV?d00001 diff --git a/classes/nextjournal/markdown/parser2/types$fn__2900.class b/classes/nextjournal/markdown/parser2/types$fn__2900.class new file mode 100644 index 0000000000000000000000000000000000000000..a0b3a7998bdd92e16f2b707d8e2da917e824007f GIT binary patch literal 1395 zcmbVMZBr6a6n-wEi|ZPSFGXpYm;x#YTB+Czsgy=<;yBYMW?8Pbxa>O1;>*7(oGI-? znjGODI7Yw@yd?iYcWu*2w{{Ozi6Ud~#`SP5@&VRy3njHF;c<^}TpHQ`HqqHFNi(O zwVpF{gd;l=x*&+~!p9(~`k}GUbCztW3d3MHk}b)HvK#M1p~Mv{#o$v6y<+9_a}0s( zl`D5-GbKSnZ#O)+#n5;CR{?zt;vToQ+AHhTB=+kcfm)-0#6K9y9~aOL*u89B(=o+VV_ibjouAkL)}r88&aY zv7JM^=O3)XHmisP(S92brisdmqSb3A)!#Ix7$)~2#vmw0xm>jfP(}P#o_uRtK$7Zw zD4Pt6tt@kvsp@;F7EX0f5OX7G|U zNkWQl4WE&qd(C7jW!G$^xfq+sby^e(B3}! z$+-xK)ZqV)!3zx65NvEl&N1de4Iy&WFm;Zo7hf;K4HG{*v>nz@Ylv2e7Nh$c;YS=y z{LV1b{AZKM>?P;Vl(YRw2jYRm8J=FC{}g@#OAQbtkZOPt0?!&C!~!qQuzrEpr>;{u$$rVbOMevIsbvo#an&7eVl+2)xy^{vV~MfL(I&Qt?jIA=o`7OBD<(pT LndEXpjIRF$q9#lh literal 0 HcmV?d00001 diff --git a/classes/nextjournal/markdown/parser2/types$fn__2908.class b/classes/nextjournal/markdown/parser2/types$fn__2908.class new file mode 100644 index 0000000000000000000000000000000000000000..25b5ca091815a2f609ec8667dce0cf6958529006 GIT binary patch literal 1395 zcmbVMZBr6a6n-wE;JT)wQj`{{DWHO&m5RNPN@?^ajx&8?mgP!|%dWF5zWl4gnbJNq ze(py#o!#Y4u`e-mIrlkS&V9~3&pE&U{QL!A2^of2jh~n$y=rKZ8Y@f2K|w#(VuzAZ z;YK26o*web)V`L>B~})eJzxxeS=CEbgU3`!E5=gkswSI?u6fYK&}*NM%4&(BXHC%* z^EpFTD7+`42Oa@#co{@RJJJt$)|5;|W*7;DGbQOra^ii+m$+;u8N9NtRm@y&fx(x# za^;?6Bt?km?}ZDu7zVHZ>cJp`P~_&0biAYMrU)PU1Po#L`r)lK@g8km78h~biF>Ez zOo+JaIPXzb4ta*@P$%mf5)m*h=)$ViI#JzBhOS?qdceZ$jWn?Vf%&~ zJ2`ZE{=q6_u?mY2thaGtmZ+@BYQ1J+{Y|5?Zg4N63?5l8m#ZcLs>r~VC*RriAVGCL zk_?9Bc9vPwP_$yQjZ@tdzNw^3cr0KMPZ+uj+~E6OEHm^+R9!0Y!n~^FD-kbN8Qdg| zk{4?X6K&#+HpCmPi#KYE(F>B`@D;w<({f%{J$PxC)8vN6ko+IoP9Q4ME36AhVdJ{K zsDvJ*iSfE#;Ph-6MdRP{gl?Dh9NH)M2foBac$$T%)v3ZHtXPD{C z*M)5g>>|2v$$rVcOMMiasbvizVci*SLL?h(ZqveSFdl4@1_QDQ=%eOfO`4X&@E` zf!13H33c~bmxRv0D2jRlq17PC&^Q3 zj%1;|{TmcRZda-X+A~&W#-SQjnw&ao#bBH>(7<_ZV;QnBRt;Z~h9Ovq&slnEt#kJai{LNfDkI_aIlw(EvPHN*|N4a40b|WAO0LoI-~Ys^ z!N*yir?kee{?P4o0zBl001J4;G8?|#{~%^_^m7rs1b*D2H|);Uf!ONC-TAP^|F_HU Tgy%?8?k z;vaDQs_l#gopJivAEiDwn_>c)amJawd+$Aa?mf?W&ddJ!*KdCSxPxy6<~{i$tohBr zv)ufi71Ve9LodH?1q~TY=fju#vT?)lT*s5u;hd?uv`s7V8nL)S~HM& z*Yc|Qg<{jQL&x_t#08SA3#M$hCNMDXcusg zW=l2ez>2PWvR#vQI5%-t#B-(@K5u$;)4Xk(0^_AFAj>7+uQ&JCmByR_1Lu;6;XQ$b z?R$;TGz$Xh?jsvkK+Pe%uQbyFLtPj0tA=3#o&J}t!?N#(0>jxJ&=105GIdisv# zB6+ze(BGi5GJy|I(^raxIC#LSw%5LA~5+VX6lzlw z(t*Vo-R*?ljz|ZTw&avEQ5G)Zk&Z91ByhRw{xghf_)0)?qk>FenVWjVI*a@N*l$}P zk1HrC46DqEY&YTWbfQ9jqT?~1lI=x*N0N{dyTw{lrRlo0?NV}%wQbi|t^M{sUGi(9I^j&;6=5&N5UBKi^2aF5S3j+Xt4 zv<0MFL+3oiF~Tv<@r+WVh3^4A#|(Eu)n*&z6%r7mOq&#?Bg`pd|GE_C@g(L?yq|4x z1zbztPd_|D@hvXA#`)jzcuS&;VhJI{vu2ohSp6XFAS5>1g qMlD~@RWc{bqCS}^WKJ5s{@*_q^M%KwlJgTmi__mbFAC| literal 0 HcmV?d00001 diff --git a/classes/nextjournal/markdown/parser2/types$inline_formula_getOpeningDelimiter.class b/classes/nextjournal/markdown/parser2/types$inline_formula_getOpeningDelimiter.class new file mode 100644 index 0000000000000000000000000000000000000000..e9f883c57a52558aee61ae462efe59bf7daadb04 GIT binary patch literal 673 zcmah{O>Yx15Ph>r^I;ZBLn!osh(v|jw6NNWOQAxl+T^rQq@Z3aXKRADjyKwPOZiuD z0&(C6@S_mpEDAzJ!UxaHo9FR-{rLIqJAh}{APlU!a#>y$R+?xki;MI8gNV&ZjRS49dr7EmZJ&l{peayCix6sinO~@plTN3E$6HAzFJ%?(WSptgz1Y4E z5ooi8kWhE;^_x_g8cYs@1Ws7io`Sc;P1IC&=lzc_UKmYSj zjia}5XPMFld;Ov7=>)jPjsPpT&oUdmI(#FlIr_PXqiWouKk6;jq1frgz2&gQ|F_HU Tgy<(C-hUMD?mdt9MSt)M-L{mv literal 0 HcmV?d00001 diff --git a/classes/nextjournal/markdown/parser2/types$inline_formula_init.class b/classes/nextjournal/markdown/parser2/types$inline_formula_init.class new file mode 100644 index 0000000000000000000000000000000000000000..c00d84c4ad7699a4b9614028e7df32f49a3fca85 GIT binary patch literal 1473 zcmbVMYflqV5IwgKwp|v1%0ti!3PM|uQV>MI2Le^3D4|G#erPVsg>2dG*4r(Qf2ELU zHPP_dA7z|v8%lv_^h0~+PG`=Xo|!v8e|`G_-~m<`CM|L3WbLA~xEarJxwmZ}Sn)iU z1tG`c&QV?z`VGr8ERor;pxn|8J+Mcm}pZhS6Tv~Wp|gMxsKi1x`KX&rX0_|wTur%K`8}>vB>+&(njmSmuk|k@I2KR zz@UnIh)_=}tQp0N+ zq;=>riUt*pD(Nvn>dopjz~u?lsvJjjTZ#at2tkUS0H(><=aOOSJjb*n4QqGi9D3Dr zL8r=i%;K>t4$Zkjtc2ud0MF>MS7{N$?Ehfb8vGpdF8%_|R-Mw-2n9(7-@Ls|N;jwI z!M-l$wuD^gTPArzDO=|z5jEU<)v2cG;p-x4xDjoY%YxV{?k*nEb1KkVMuH^t(X#NM z%bkC+y4*>l(+6rTXc6Eg-NJM-I{mRP2!0}iVTryQ%Fb2<-FA@ehQ2E&0g+?09;5v; zZk{6S|Bjwb?=kw)o4y!ZPL~kFM z^H{CZLs=g3DMKt(!lVmRBjqi_JUrt+Rt^QaLytl;B|JSv=Ly0$r6wl&62s%u Ji3v5f_#2AycSisK literal 0 HcmV?d00001 diff --git a/classes/nextjournal/markdown/parser2/types$loading__6803__auto____2217.class b/classes/nextjournal/markdown/parser2/types$loading__6803__auto____2217.class new file mode 100644 index 0000000000000000000000000000000000000000..6895ad166ccd05f0caa67c3a89c61fabd40c6b4c GIT binary patch literal 2003 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 literal 0 HcmV?d00001 diff --git a/classes/nextjournal/markdown/parser2/types$loading__6803__auto____2812.class b/classes/nextjournal/markdown/parser2/types$loading__6803__auto____2812.class new file mode 100644 index 0000000000000000000000000000000000000000..168415d6a13bf9ab6fb845e04d0421564643e05d GIT binary patch literal 2003 zcmbVNZBrXn6n<_3Y*+%cp{+$l(N+in6B25R4aJ6+C=d!wC@rlTZ#EaQ$!0g~ZlL@k zzbc)<=!}}r{vp3Oj^`$UB%tF=GjsRso^x}~bD#5a|M>ft-vHdhA;Y36Ub{uBYMb1M zl(}8XTgPUk!fi*`v50$85zbx1;(6UX$Y$@)&(3ADyy{w6`o-p>F$Ij_mS$MRsx2Z0 zHxD9-WYyGM-7*z;8TuP8!kSTJ=v&ZD-Cbnx2B&uY=!2r72R<_B=8;tr3^#&PsUkn( zO;207qR`wp!?nvg1%8H`U1684az!_Utzd{8rnV9*t7(Qns%z6Ox8r_X!}Wd)Bf#K0 z5bmW5XaAx;QTEcogw7gOEmS=$!2qdTrJ-A!Jh7~}Xz#fSKq;dWPy zgyUG6&RzXTD7Z_Ec3FuQ1rx+prRo%R3bx?+CEb)cCmdtJ?wB2};xdgvOsSYeh}hID z({Z!eSwChZ#U6ahpb|xCew?-}*N+GWj#{ctu2-x|Hw}IyWVKFWiJ`|W=)_Cl zDgdgYHUe^B9rK()geNJ^f@ZX;-{0astXa13VU3~J7W=~XVS`%Zh*KHOcb+ce+LVcS zN4S>eQZY1(dlOG&1#A(Pt{i7h$~ntW@U+oxuCPsp_}heOI-+D`u%jZ4XP1*nsZ#Kq zL9xYQRhLKHV;IQs9Cr#O9^Q9+c*Wr1B)_3uC2?|W*?ESAw?RX_BL7WrviMFOoRe!A zLZb|I5wKIO$Xw8r>C>pfU3z)Z8L?F{9W?)^<`VH8UARjF%aSwZ00kBM(5YOOtvtmV zPU)t2QZ46%y(6oF8b0H4twep>`VOQljT@9jUD{hpHAAym6G<9vG#;BDD7yTWAqGTnHuiY@ktHSrwE@RTF2Ze9{h}l z9y~wAqjSyUh9*_R^7rW9Br)^*^bZta94lBS?_QMYIRww2SXc1nU+7h6_DW1)LL%`= zY=g8$Xi4}Jv}S0{(^{mpLTiJTNxS_dfv2QfCE1U!E)M>(K^L$TSPu}I?K&pkAj|^m zHSE^$;td{<;pMsE5es}x1{V0Xh8zpz>Ai+xW8dSeta)HjG!J@FAz8?5Cbre)6(}cz qy4<`e)lg>q;x(yGk4MKZ?n(9kZ)AC$s-ct`y%U{@J&dZM)qemz9|)xY literal 0 HcmV?d00001 diff --git a/classes/nextjournal/markdown/parser2/types$loading__6803__auto____2840.class b/classes/nextjournal/markdown/parser2/types$loading__6803__auto____2840.class new file mode 100644 index 0000000000000000000000000000000000000000..0b0c6a645df70d2c5884a3b706eda023b21659be GIT binary patch literal 2003 zcmbVNZBrUo6n-wKt1D`PNgCVQ+9p**3xYPW!Pwvnt%}irF)?XNFUwUHmR;OkH2$J~ zZOx3OooT}7{-J*9bb2nJfVR__Fmw0po^v_pxzBmIfBgO18vt`SWLPxCE4N@(Y?B+| z61R&v>(~sJx$Ou$8g@_0!ntc$Jg1unnasWUnb}N+S6nMYzv%qji~`1ROEauO#TH?M zn+M@|qGD>UZkYdE-7#bg=-m{c)=AhD@g zrsHNZGd@g9iaq$8K_!Y({5WM;tCrmot9KMil?=g%A z{*9bgj+(XOgNpfn%;L+I^QaH82E2uqa@L2%hV!o&u9vNHCk;NtWwlOViJ{BQ>%@!y zDgdgY76Ni$9rLU~geNG@f@U2kD))yv)suSd1&A1#Y+YcC;1)iDvFb1%g!+@ybBuY75Q(1lfe)2;GA5` z5E^BugMgh%S>}SKOpitt?$XQi_K3}jX`}f+HJ6BQ>%v_cSeBeI2gs|~hfd|PY~?7{ zP*OL=<4P$j>>XJZ)bMGSYenkY=C?m-Y22VJ>eAj+s%e_dnn=)Sqw(1ISP|LE!RjmO zdWXg=BGeIGG|#(exKQ8G+lXwGx}-v{OR8;>UeMt|GaE(v8YRg{b_ah!-_P{IV9>Lt zu9PMf{q&SuYvkNZGS&S%2KKzC7*6kX1<&wa4I^h5O;>TJhR>>)Iz{LVks4-CasO95 z@Zi}g9-eC+)iuc~mVZRwCW+~{Q$JCJF|1&nyn9ii=O8?PVqL-4f1z8U*())H2#Lfe zu?^4~rX}Hz)0(C=Piv9Z3at%VChhi-1fGy?m1G~jxj6WXI$gk$f89@LwriMpjS%y% zSFu~e^Vhgfh8O3Chs^&i8JPe3DzeO5> q>T=_zRD&1mcuqI>GnspHGqaftueer*e$lzR5e1ClhGtlWiY>wh zH}}KwM8(ux-7*z;8T#rjLYh%v=$Y3|-Cbbt1}1lW=z*f53%z8}%|ojw7_J2-lLdar z8=f|^1);eyhAS6!3VaOLJHjqmrLt}aTfrbXOm4=PS5gfAWXGl*ZpVDMf~$QPf}f#x zU${#KcN~V{j?i@_ZM}x;Dh61j_$a^bT@dJVvON46`$gBhMOHR z;*Mi!I(PL$q2M+#+F>PH6pRyF<%*Nv&f9|L7IjnRoN$Z=I%BrEipewvFsWh!L1I(0 zOvlY+W_*~I6npR`gGv;o_)*HTTpz;dmwRU}0$5E@wM1JUB9}53PndMPJGd*|-eVXK z{2Mu~95rjl2NiSun8jBu=TRSG4S4e{<*W}24d-7oTrFGWP8xiO%W9p#B14y(*NGSZ zWdKw~Ed=DiI^tP_2v1O)dCh26zpu%CNV9Cwi&chhTkHwD7wgm-hn&i2uKjdr*QQLw z+QKz87mA@#+#7f-D`1nbbmTaFT*_L8f+zKMbA@d(#NH=N!x1GTjcpYvJiVAqN|l0V z42mrdD!M%4E<=BoXStIv^3a~si zAvDTR2LaoavdjfdnI4TQ+@+W2?Gc+5(?;`uYAz7p)`dGXuq-)a_K{by2c61g$;wfz zp`>n#$CXl6*xRxysNvHt*NW7)&2N9w(zroc)TO<+#`-!JsSV9>Lt zu9PMf{q&SuYvkNZGS&S%26nwC7*6kY1yAuo4I`%*O;>TNhA*m^Izi|Zks4-CaQ|04 z@Zi}A9-e6))iuc~mVQFt28rpnQ$JILF)U+^yn9ii=O8?PVokv}f1z8U*())H2#Lfe zu?^4~rX}Hz)0(C=M{9xBGOcx5Chhi-1fGy?g=8PTJwN!1I$gk`f6Y&5wrZGojS%y% zRk2gU^Vhgfh8Jgshs^&S8JPcvDzeOnv*v+C(LCrznPfh_5#Lf9SD>5> q>QdvTRDlUY4sYEW5b7X#7R} z+L{?dJJW{G`9uBE>GWJc0d1!({+;JF&J3`l$wDlUUs~EryhM^XQx>3PRhQYJ{Cy63qGmKpJ(lC*)5Al(T5qwO( zIzXki6@0=lP~zpMrhZTn>*AOIMFTG{b1~U@p4Ba3JG$cv)7{`@iZO=IRD6oh8E$sO zh&zs@>D<*1g@W6}Xor<(Q7}$yl`BquJ8uh~ThvXNbHXti=#1IsDkjqyz@&-^1c^<} zG95RQneky-QtZK(3@TBS;zudVa(xJ+U+$f`2w*iq)e>!ah+N8CJYmxD?%*rw_AbMC z;NQq;<)~RZKB$=M$1Lu*oJW0#HQ>#+l(Rl8G@O6UaJ6ieJ8AGCE~|9{iws?EUMF7s zmjO@}wGfa4>xgF!B0NEH<~5^P{k|smA~B`Zg< zhLXA|9#=|PVQA}{^wU#rt&wvt$yE367})imU^uI9)vL~58l!M$Jc zz=LNeczC9HRM#Y{So#Tl8ziRRPW?;~#;}Yv^6o{6o`dlGi8Te^{Dp3XX0OB)A|w)@ z#5O={n3jY;PHURh9IXXf%e2;MnY7zS5_m$o6_S1U_Wa;4>U05%{xv_L*{WgUHA2k4 zR>e*Y&tKyn8D5+j9y0%TWMKXus>m{bj^3*%)b~BQ%$f%lMf0E=Ws>>yMtnlUY4sYEW5b7X#7R} z+L{?dJJXiW{X_lI>GWK{0NPGx!pz;Xd(P#Y=RW7<{_*!OzX7;|Lxx3DymE_H)i${i zE_1t-w~ozlh1-s>qha@?BAnZX#q+v(kj>tW&CO@Cyy{w6`bA^+V+t6<4b8BMRa=A& zZXSda$*QTjx@9WxG7L0agfyeb(6^wQy1U5W4NUL)&<90D5BkZVn@3hjFkA~vr;7ZD zH$83Tib8Ya3|B7d6!;jfcZFTH$`#!Zwt``DnA%FLtfm?Ksjf}C+>ZNj1y=_!0zX6l zfpC`%?l=siU7;IF+IkJwRSe+HgU!|?h4Q$&%l8OAPqX`0B_`}jb`7(OIl zU7*rC3O-^OD)Y)yQ$MVV4RJz%qJfu}xtQ)g&)T-I9o=z->2C50#hAb+Dn7=i3^%)C zBpk=mbnfa$Lcwifw987gD3~O+DpjYjQ?LckFX^VtIpG)&bjR#)6_;rYU|Pi#g2bj~ znU0&y&iODaDfZxV29+pE^W(H-xjuw3DEH1?1hAH*YKgWzL@s46ku>ReckqRDdzWD{ z@NeX_bJVIGA5_E!F^~Ig=TRTxO?V4!<-8AzP3K=ST&-A@ZW??@$ZDO!5<`z$(1{oS zWdKw~Z3N`NI_5cp2v1U+14=h%!H$YFo?c8QrAomw z2E`VKRb3u&k6|#!bKEJEcxd10$4dqeC;2VyDv6V0%g!?_ybBuY75Q(1lg0P);GA5` z5E^Bui-4VKMdpI0OrJ&-?$XQi&WNpw>7e;PH5Z8Q=)zqZSeBeI2Pml6hfd|PY~?A| zNJ=-w<7zo4>>XJZ)bJUXYbEO2*0(=pY22VJ>eAj)su`Ninn==Uqw(1MSP{AE!RjmO zdWXg=BGeH*G|zizxKQ8G+n8*WhNMDoNUCj;UeMt|GaDuP8Yjs}_6FZz;3s-vFzDIW zP)d`EL3+xqb#m?{neP1+Lwnv+jAr(Ff@gTIj-rGe1&<39Mk9yn9im=P*2fVqL*kf1y{Q*())H2#Lfe zu?^80r6u7{(we0eqqRtDh1LcwlXm+^0#8V{N^$^SzdiVi23^3Cf89@Lw(FRBjS%y% z*RWg1^VhgXh8O3Chs^&C8JPdO8gk5^r}r9)jeU5> q>T>g@RD+p`x35WcW+F22_MTM#|3;SAsTxeFkz0}3=!1wFT>S^8r3kYC literal 0 HcmV?d00001 diff --git a/classes/nextjournal/markdown/parser2/types$loading__6803__auto____2906.class b/classes/nextjournal/markdown/parser2/types$loading__6803__auto____2906.class new file mode 100644 index 0000000000000000000000000000000000000000..1673749f11e845edf5a403062a5a162117177411 GIT binary patch literal 2003 zcmbVNZBrUo6n-wKt1D`PNgCVQ+9p**3xcUJ!Pwvnt%}irF)?XNFUwUHmR;OkH2$J~ zZOx3KooUPG{-J*9bb2nJfVR__Fmw0po^v_pxzBmIfBgN+ZvgJ$kYUjjuib)Gu}yA- zOWZEztYb4==C&j3XxKd|3+Jw3@tkfRWHNK}Gqaftueer*e$fXra|#&4EzPhB6ZHh4cGfH1V2OX zfpC`%?l=s?9ii(=+Ij;wRSe)3!%z!D-KgL;!{GV3O-^ODDm<$Q$MVT4RJz%qJdXextQ!c&)T-I9o=z->2C5e#TdgUDn7=i47WRC z#2v@dbnfa$Lcv{Pw8KiYC>STU$`vQSleY!WE$ODrIpG)$bjECR6_aTUU{b{dg2bj~ znU0&u%=j=ZDfZxV29+pE@#BuJI62{ z_&0J|IcnC94=U#SF^dN+=TRSG4R{MJ<*W~j4d-7nTrXSYP8xiO%W9p#5<{1p*NGSZ zRRB~)Ed=DiI_6n}2v1O)1 zAvDTR2LU^kvdjfdnI4TQ+@+Tn?Gc+5(?;`uYAzAq)`hz?uq-)a4v<%|51qn#CzVoG*gLW+sNvHt*NW7)&2N9w(zroc)TO<+#~-%s?yV9>Lt zu9PMf{q&SuYvkNZGS&Sn2KKzC7*6kX1<&wa4I^h5O;>TJhR>>)Iz{LVks4-CasOvL z^x*j^9-V6**EPv1mVZFsCW-0ar+%aeV_3mDdH143&p~+p#JYm7{zA7xvsYpY5fX_{ zVjG|}OiRKar!`G$p4K9*64eR1%Yb-I8h|GJ;hY}YXH1|jBO zuVS}`7jJN%3@^_OkC^`(GBE#lRb-hzNAFb>>iZsFWz7SNqIuAbGRb^;Grp}hu0S~% q)aAxasRq+y7q1C*YAiB#aZjrMe literal 0 HcmV?d00001 diff --git a/classes/nextjournal/markdown/parser2/types/InlineFormula.class b/classes/nextjournal/markdown/parser2/types/InlineFormula.class new file mode 100644 index 0000000000000000000000000000000000000000..8524ecf27c3d954496dda78ba5e94646a68c6bf6 GIT binary patch literal 6444 zcmbVQX<$@W75;9P&P#Gbk_mfTgraQ%!XT|u4T=z;QUaj_5}_)-WFE0k}vk5?JFpNBl!xG4I;h)P$WMPkV>mRL;&9oc!99e`U@oq_(-)jO%Rm@)O0Z zoq!Nn;^jwEBi_V>=c+R)*GoI8-eSS`CU#OxpkCnIIGxQ-HZzg&opb_?0!0qmq z8Uwt~h%=D0-9oV2#@#;J&D+^vrz4kls?WCi-hiLaxTAqi(oUxppZZn4%Gj6+(8~t>W9+d)@4^B2ST5bun zb<8e|^)m3m9~YGFvC-#shKs&aax+Q9t(p8xKiiF;8xJx*0fMsJoAnAYmfMw=d1o@? z6-%fs&J{&FTl#7&__pt;j2^NlZIjOa;X}@d&x~5@M|l5?{{(^huI@pB^FjrSIx zg92Qw3(&&D1v)dj3Rf|fsti{t5DVuEv{%F8JD+lcjYsa+L?>HLf)7p_e6KP zqeUpO0xO%*jYmo(U^Sr*s|6NTc~h=a3u`2rjNV#-`Bi$1ohn}o7fCc5t;Yx~uF?us zwS|i%T8!r7_^7Hhi5IFx3+pAMQD%S_MU{g$VBv`ptwwQ^z}Z!b;iq9?v&0;ux>aC7 zm1?QdEIdh~&8S@}a88xljE7{QPomxE?u_1P=KHd+OQORl?~c040F#7euc;7cqv z2PUKGq_>qWV&RCy*+%yn(P9oY7YomnILBx{J2nQ@J;%axB+fM_o)^Vd(G6OWh388w zF`6%oCd+gv3onv*m{EF(!17e6`J86@S$L^H$BZ7c*Uw}VcsZL)*0a+?8Go!dYZnRv z>uNU{t<}>VYCAz&lz1gx)r?o*)dFX&58C6r7%- zi{7~Yn7{=wXxn1p-h-pfcsJfF@mefzMg!h2u@uWx!@Y?(m07aaEfjM(FHaW1CzH4R zjOT7SqUI=t1U@9NDU{aJ%#>8s6Hq~4>U#dtv~!STCvD*t<;d%raWkeEvx<2Wk_0|H zW7mw71dg*RW;8oiSyx{i6{_^@9+lP^11bo6v{GUtcO&jliMUhZ1a4Q6`zWbZc_OjF z#yg;x8cj>wjg#us#|+=9_{ECu4ANI*$*1}<1z#Wd1U{(_e2P_L-WA_lOrE>hSvx9$ z+vIs!$7Y5;D$Do}pIuf5#HGB%6m-sY3qoBVi(5M@n#Ftg!HsCAd4y8U-UF5+$ zm-rgKu5`aa@=?;Q^fZZYnLmG<_W4xGbA$bjZze8BIz(*hr~6w1-kVL~ABcjN3oc;QfUm$={T z|BKb90-?vA#D5ITf0@71IMS_a+l=?Kvp6yAXpnf25*ox= z?0>{o97+mHBa0^b5n@bIv}iwsWcgCJdaMeJ#q2Ka`u}@I989Q%Z0NQ`oAIG~tQjAw zcORk;5tu3;k_;VP4XB^MVCCZ>S`47V{Zd_aoWD9d>SyJ)Cv0j6J*o ztZj0T#fnAq*XLrzlJ!a+tXHyJy^_G{mHbq%B%gXEyVNV0qh3i0^-9L4SJFAXlCkNP zq)e|QU3w*z(ktnbUde~_N}8irQW(9Gpy-vfL$4$idL?h*+M$LL*G2UIJS^w0;RS$b zA0&0ZO)(MkqO28l{xc(m16FEqRo#&{Ba?QA>v@U8$w3 zC_PI{S5tbfmad`n0xexj>BU;QF8Q)#-3h#A=vIAwp+=?&2|T8}p1T{SklJ?~*I$pO z<9O>)G!BV<_h8vc+_3U?yt5Ab>QCT(J67zU#s?ZG9m5BYqV-PPyf1m{G;X_F0SmE^ z|6hWJT?uq=OyC&*72?=~OhA1CbqP%KOKGX`7Z~rOX_b+cQ|ONx@1XG&wEmHL3>`(& z(2AAQxT|8QtzzghLN^kbBQlD7;p~tSYhJLG$6B6E}m$h(7RteL`fQRMlR zXq?2U1u%~;^51c6= zpAK z<@7|sV{$24YeihlDYw8uP6pLq*G^$PiX3*E{k3gKjpa_!uIBP-z2DA(OuswgY+N&I U8=bSUF*nXe@2qXiKeG+|5BMLS!2kdN literal 0 HcmV?d00001 diff --git a/classes/nextjournal/markdown/parser2/types__init.class b/classes/nextjournal/markdown/parser2/types__init.class new file mode 100644 index 0000000000000000000000000000000000000000..afeb5916521f5bf10e8b1acecac256e71caf447b GIT binary patch literal 3686 zcmbVP30oY+7Ci+d-E>+cLlVWrn5c=M1_C4z1*4H9iXkLsFmV!fY=#B~db-E%9uW84 zx46CM@}6&hZgJNT#Yv(D_w7IU1N;vzr@9BGX9Ayw`KYPs+f{XL-FxcX;=7-Ze*$0= zz87e)%{%-NC+FIR)toWh(E(@NZq6F6XS%J;{zTUFlF784_7w<$+7V;SXtoS{sCiHS zh?%0bQlQFmi~)hlhQ|E@YRa)aKbhPp5bH@<&PdKR!x{Sxw?l^lwHg(u=3?b<6)X|Z zhD?8-F}}}ne1T;RjXmX%T;mMXXwY$H`5N6jZ3RnH zjG6-L8%_n96ZiSf0T0xwdjp$3jhE?SYW?b7qieJFrutT^rdODbOA6`1*)-vyPr{ z$GZhOPv0}1!Jf2lx(4~SN5fv}-)uOy=-3xR#v|6tb=(+2QUrD^2(rs^Jo06`X{9p~ zUBOKn5>f2djXDm6*f$rkTbcG-L+s>2vG-(6yA<2d&@Zv;iUQO(>^kEi*{OF*D2!yZ zUf@(y%5hBA~IC4G?ub3l+g@q z4Hg`M^CPitno;nkf`T^%3a;YzK5ce^rmPC4hnqLy}zFbzS z(?g6v$~6t2V!tU085S}sOv$XsS>Mk(=g89a2p-k&FdpO9i&D7Fb&Uy6!5_K4;q`EX z0_z$MMbbD6P@E)(alt?1aSeaM6XmK@6eT%O!BYYo3oZu=8BCww;lk>V;4d1U#$RQD zrtGMAR$yt7%-yzc4#`9IJhL%oSUGdgpumcT?x@xl2GQ5Q;{^?W!#`vg9V?fyRs4%9 z52h`y{2vz32o2}CNHnFa5f%SqrZPrWpmpvj&6fu1Gu?O*FUfSjEKpxYw4!FIc$J>{ z!)a3OH6D;t2X>Vyjfyws99OOiD&8WIJ5!8jP_+kT)vmz1rT3_LPGKk)Dvkt#VR+t7 z$L%#T@xI*r2NadEmkK@d(XgP+p0yIzKf=R5O!o@E@6^BuG@&qpBkPXvl z&SUcdAtuqDm_)}kuAIWQ#0hlq?e-~LH;G-e_s-h)(tbl=@1y;|tUW>d!N7hC?YGU^ z`)NPnZHQiQK6uUf4`uH50&A=B7Db()eNHCs?K&c+e)@IY>jMN z*{VTivu7y8k3pCqeuxdnM)Jr`Lq7^l#N0f_rg6tntPru`ncwSUZtTvPLG88b$EZqF zirC$G+#gR=RTUl|6+G827P0>Z zhFT@|f6jX)K<*&g;Tg1D^P#;yKU(Z`(0YmX<_ucj0?_JC2kijS-kw3bWdUf*P6zEa zNg*)r@66;KS2F+dvnr4GVv~7HP2r Date: Thu, 4 Apr 2024 11:10:55 +0200 Subject: [PATCH 04/83] Tight vs Loose lists --- src/nextjournal/markdown/parser2.clj | 52 ++++++++++++++++++++-------- 1 file changed, 37 insertions(+), 15 deletions(-) diff --git a/src/nextjournal/markdown/parser2.clj b/src/nextjournal/markdown/parser2.clj index 5264379..e56d9a9 100644 --- a/src/nextjournal/markdown/parser2.clj +++ b/src/nextjournal/markdown/parser2.clj @@ -24,6 +24,7 @@ Emphasis StrongEmphasis + ListBlock ListItem Link ThematicBreak @@ -32,6 +33,15 @@ Image))) (set! *warn-on-reflection* true) +;; TODO: +;; - [x] inline formulas +;; - [ ] block formulas +;; - [x] tight lists +;; - [x] task lists +;; - [ ] tables +;; - [ ] footnotes +;; - [ ] fenced code + (def InlineFormulaExtension (proxy [Object Parser$ParserExtension] [] @@ -58,7 +68,8 @@ 0))))))) (comment - (parse "this is inline $\\phi$ math")) + (parse "* this is inline $\\phi$ math +* other ")) (def ^Parser parser (.. Parser @@ -67,6 +78,15 @@ InlineFormulaExtension]) build)) +;; helpers / ctx +(def ^:dynamic *in-tight-list?* false) +(defn paragraph-type [] (if *in-tight-list?* :plain :paragrpah)) +(defn in-tight-list? [node] (if (instance? ListBlock node) (.isTight node) *in-tight-list?*)) +(defmacro with-tight-list [node & body] + `(binding [*in-tight-list?* (in-tight-list? ~node)] + ~@body)) + +;; multi stuff (defmulti open-node (fn [_ctx node] (type node))) (defmulti close-node (fn [_ctx node] (type node))) @@ -76,13 +96,13 @@ (defmethod close-node Document [loc _node] loc) (defmethod open-node Paragraph [loc _node] - (-> loc (z/append-child {:type :paragraph :content []}) z/down z/rightmost)) + (-> loc (z/append-child {:type (paragraph-type) :content []}) z/down z/rightmost)) (defmethod open-node Heading [loc ^Heading node] (-> loc (z/append-child {:type :heading :content [] :level (.getLevel node)}) z/down z/rightmost)) -(defmethod open-node BulletList [loc _node] - (-> loc (z/append-child {:type :bullet-list :content []}) z/down z/rightmost)) +(defmethod open-node BulletList [loc ^ListBlock node] + (-> loc (z/append-child {:type :bullet-list :content [] :tight? (.isTight node)}) z/down z/rightmost)) (defmethod open-node OrderedList [loc _node] (-> loc (z/append-child {:type :numbered-list :content []}) z/down z/rightmost)) @@ -127,9 +147,9 @@ HardLineBreak (swap! !loc z/append-child {:type :softbreak}) TaskListItemMarker (swap! !loc handle-todo-list node) InlineFormula (swap! !loc z/append-child {:type :inline-formula - :text (.getLiteral node)}) + :text (.getLiteral ^InlineFormula node)}) (if (get-method open-node (class node)) - (do + (with-tight-list node (swap! !loc open-node node) (.visitChildren this node) (swap! !loc close-node node)) @@ -141,18 +161,20 @@ (node->data (.parse parser md))) (comment - (do - (parse "# Ahoi + (parse "# Ahoi par broken -* a **strong** item -* what [a nice link](/to/some 'with a title') -* just _emphatic_ two +* a tight **strong** list +* with [a nice link](/to/some 'with a title') +* * with nested + + * lose list + +- [x] one inline formula $\\phi$ here + +- [ ] two -- [ ] one -- [x] two --- -![img](/some/src 'title')") - nil)) +![img](/some/src 'title')")) From 0357fe40d8af4bba0343490ab2fcd482e4f76dc7 Mon Sep 17 00:00:00 2001 From: Andrea Amantini Date: Thu, 4 Apr 2024 12:16:20 +0200 Subject: [PATCH 05/83] Safer inline formula --- src/nextjournal/markdown/parser2.clj | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/nextjournal/markdown/parser2.clj b/src/nextjournal/markdown/parser2.clj index e56d9a9..9073c6b 100644 --- a/src/nextjournal/markdown/parser2.clj +++ b/src/nextjournal/markdown/parser2.clj @@ -38,10 +38,14 @@ ;; - [ ] block formulas ;; - [x] tight lists ;; - [x] task lists -;; - [ ] tables ;; - [ ] footnotes -;; - [ ] fenced code - +;; - [ ] strikethroughs ext +;; - [ ] tables +;; - [ ] fenced code info +;; - [ ] html nodes +;; - [ ] auto link +;; - [ ] promote single images as blocks +;; - [ ] [[TOC]] (although not used in Clerk) (def InlineFormulaExtension (proxy [Object Parser$ParserExtension] [] @@ -56,8 +60,8 @@ (if (and (= 1 (.length open)) (= 1 (.length close))) (let [text (str/join - (map #(.getLiteral %) - (seq (Nodes/between (.. open getOpener) (.. close getCloser)))))] + (keep #(when (instance? Text %) (.getLiteral %)) + (Nodes/between (.. open getOpener) (.. close getCloser))))] (doseq [^Node n (Nodes/between (.. open getOpener) (.. close getCloser))] (.unlink n)) @@ -127,7 +131,6 @@ :content []}) z/down z/rightmost)) (defn handle-todo-list [loc ^TaskListItemMarker node] - (prn :todo node) (-> loc (z/edit assoc :type :todo-item :attrs {:checked (.isChecked node)}) z/up (z/edit assoc :type :todo-list) From 6953c34ea88f15b66f15d0661d7e73b2bc8f425d Mon Sep 17 00:00:00 2001 From: Andrea Amantini Date: Thu, 4 Apr 2024 12:32:59 +0200 Subject: [PATCH 06/83] ftnotes wip --- deps.edn | 3 +- src/nextjournal/markdown/parser.cljc | 1 + src/nextjournal/markdown/parser2.clj | 43 ++++++++++++++++++- .../markdown/parser2/footnotes.clj | 1 + 4 files changed, 45 insertions(+), 3 deletions(-) create mode 100644 src/nextjournal/markdown/parser2/footnotes.clj diff --git a/deps.edn b/deps.edn index 40efb69..e36f78a 100644 --- a/deps.edn +++ b/deps.edn @@ -5,7 +5,8 @@ ;; commonmark org.commonmark/commonmark {:mvn/version "0.22.0"} - org.commonmark/commonmark-ext-task-list-items {:mvn/version "0.22.0"}} + org.commonmark/commonmark-ext-task-list-items {:mvn/version "0.22.0"} + com.vladsch.flexmark/flexmark-ext-footnotes {:mvn/version "0.64.8"}} :aliases {:nextjournal/clerk diff --git a/src/nextjournal/markdown/parser.cljc b/src/nextjournal/markdown/parser.cljc index cd3e2a3..3d78466 100644 --- a/src/nextjournal/markdown/parser.cljc +++ b/src/nextjournal/markdown/parser.cljc @@ -439,6 +439,7 @@ And what. nextjournal.markdown/tokenize parse #_ flatten-tokens + #_ insert-sidenote-containers) (-> empty-doc diff --git a/src/nextjournal/markdown/parser2.clj b/src/nextjournal/markdown/parser2.clj index 9073c6b..da6e526 100644 --- a/src/nextjournal/markdown/parser2.clj +++ b/src/nextjournal/markdown/parser2.clj @@ -7,6 +7,7 @@ (org.commonmark.parser Parser Parser$ParserExtension Parser$Builder) (org.commonmark.parser.block AbstractBlockParser AbstractBlockParserFactory BlockStart) (org.commonmark.text Characters) + (com.vladsch.flexmark.ext.footnotes FootnoteExtension) (org.commonmark.parser.delimiter DelimiterProcessor) (org.commonmark.ext.task.list.items TaskListItemsExtension TaskListItemMarker) @@ -27,6 +28,7 @@ ListBlock ListItem Link + LinkReferenceDefinition ThematicBreak SoftLineBreak HardLineBreak @@ -151,6 +153,10 @@ TaskListItemMarker (swap! !loc handle-todo-list node) InlineFormula (swap! !loc z/append-child {:type :inline-formula :text (.getLiteral ^InlineFormula node)}) + + LinkReferenceDefinition (prn :link-ref node) + + (if (get-method open-node (class node)) (with-tight-list node (swap! !loc open-node node) @@ -176,8 +182,41 @@ broken * lose list - [x] one inline formula $\\phi$ here - - [ ] two --- -![img](/some/src 'title')")) +![img](/some/src 'title')") + + + ;; link refs + + (parse "some text with a [^link] ahoi + +[^link]: https://application.garden 'whatatitle' + + +# text continues here +") + + + + ;; block footnotes + (md/parse "_hello_ what and foo[^note1] and^[some other note]. + +And what. + +[^note1]: the _what_ + +* and new text[^endnote] at the end. +* the + * hell^[that warm place] + +[^endnote]: conclusion. +") + (require '[nextjournal.markdown :as md]) + + ;; inline footnotes (might be handled via a delimited processor) + (md/parse "some text with^[ and not without] a footnote") + (parse "some text with^[ and not without] a footnote") + (parse "some text with $and not +without$ a footnote")) diff --git a/src/nextjournal/markdown/parser2/footnotes.clj b/src/nextjournal/markdown/parser2/footnotes.clj new file mode 100644 index 0000000..41b7db4 --- /dev/null +++ b/src/nextjournal/markdown/parser2/footnotes.clj @@ -0,0 +1 @@ +(ns nextjournal.markdown.parser2.footnotes) From bf518d9ee62443b14d2e245edff27c9b55bbfbb0 Mon Sep 17 00:00:00 2001 From: Andrea Amantini Date: Thu, 4 Apr 2024 14:01:02 +0200 Subject: [PATCH 07/83] rm unused bb/fs --- src/nextjournal/markdown/parser2/types.clj | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/nextjournal/markdown/parser2/types.clj b/src/nextjournal/markdown/parser2/types.clj index 2cd6ae6..ff1a373 100644 --- a/src/nextjournal/markdown/parser2/types.clj +++ b/src/nextjournal/markdown/parser2/types.clj @@ -1,5 +1,4 @@ -(ns nextjournal.markdown.parser2.types - (:require [babashka.fs :as fs])) +(ns nextjournal.markdown.parser2.types) ;; See also ;; https://github.com/noties/Markwon/blob/master/markwon-ext-latex/src/main/java/io/noties/markwon/ext/latex/JLatexMathBlockParser.java From a0b64959cd4c122cb7aa70321d73c6887d140d97 Mon Sep 17 00:00:00 2001 From: Andrea Amantini Date: Thu, 4 Apr 2024 16:19:30 +0200 Subject: [PATCH 08/83] First take at footnotes --- .../markdown/parser2/types$fn__1944.class | Bin 0 -> 1395 bytes .../parser2/types$footnote_getLabel.class | Bin 0 -> 1682 bytes .../parser2/types$footnote_init.class | Bin 0 -> 1459 bytes ...s$inline_formula_getClosingDelimiter.class | Bin 673 -> 673 bytes .../types$inline_formula_getLiteral.class | Bin 1692 -> 1692 bytes ...s$inline_formula_getOpeningDelimiter.class | Bin 673 -> 673 bytes .../parser2/types$inline_formula_init.class | Bin 1473 -> 1473 bytes .../types$loading__6798__auto____1942.class | Bin 0 -> 1614 bytes .../markdown/parser2/types/Footnote.class | Bin 0 -> 5761 bytes .../parser2/types/InlineFormula.class | Bin 6444 -> 6444 bytes .../markdown/parser2/types__init.class | Bin 3686 -> 4250 bytes deps.edn | 3 +- src/nextjournal/markdown/parser2.clj | 30 +++++----- .../markdown/parser2/footnotes.clj | 55 +++++++++++++++++- src/nextjournal/markdown/parser2/types.clj | 12 ++++ 15 files changed, 84 insertions(+), 16 deletions(-) create mode 100644 classes/nextjournal/markdown/parser2/types$fn__1944.class create mode 100644 classes/nextjournal/markdown/parser2/types$footnote_getLabel.class create mode 100644 classes/nextjournal/markdown/parser2/types$footnote_init.class create mode 100644 classes/nextjournal/markdown/parser2/types$loading__6798__auto____1942.class create mode 100644 classes/nextjournal/markdown/parser2/types/Footnote.class diff --git a/classes/nextjournal/markdown/parser2/types$fn__1944.class b/classes/nextjournal/markdown/parser2/types$fn__1944.class new file mode 100644 index 0000000000000000000000000000000000000000..53be10597463336fd8c54d8db40f21f1e840cf2e GIT binary patch literal 1395 zcmbVMZBr6a6n-wE;JT)wQj`{{sh~ouR4VpDDy7kzIL`EmS(Ym;F1yaM`0}p`XG;6f z__-g|bas~)75x%3mvf)P<=p4o^PKbN@2}qg638&j=={hk8C6r4wRl-J_X@_L9^aSE z3ODED*6}{COzi5poV1ik_`n!~ie{9mCXZ{fUW}*GRb8=EL-(PBq1!nhQ?wF8*NUpE z)(eJ?>Bx?VF8Bm^;b#z4{lM7cSxdH5g<)tqk}1gtvK#MXzQh$P$>3KEy<+8Zj~N1) zOIPm5W>SQR-fnnsi=qGOuRioM2t{sf$%k8pVTlN!N5B9EuO8k=6Yt^HWs->7ZrnR9 z=e&r!uJayc<&tNZoNi}*O(G&jalZ#aJZJ@65b@9rIM#9|+VV`Lb;@%BkL)}r88)xE zv7JM^=LS~OHmisT!G0SLW{Ap)qSb3A*55Ry7$)~4#^6(oa=B^|po;Wedh)GpALgmf z2eQeqc#&n+GF82pyuhjMiCkCG1fB?3z*C0K0yp`tABzmVQO%GGyfCM!`AXD}Wd<)v zqvXd5!`KD!#v0;{)x{fg#OMb}aPSh}>~T47Xg<7h%4u;^XGs1JZ8s1V=`~gbq_B2X zUsOUL(!_YxC~$hVjH>ew)pDMj+j3qbkC3I#Q+Qgn!H^5qc)nU(KeD)9p}vAd#qmd$BI+o<*SP~0aFDNlkv*InGQL>C|XY?n!zte_cgTA{QC$+3C0NUF} zKRXuzksA7bVCWpd8bXcD$Qi;O)G$tt8m7(=_2OGIT#)$Lq3y7Jw1#Po(_(agBm9Vi ziQg$^TmNhknQL5u|Zx KR$7*X==wj##Y`Lk literal 0 HcmV?d00001 diff --git a/classes/nextjournal/markdown/parser2/types$footnote_getLabel.class b/classes/nextjournal/markdown/parser2/types$footnote_getLabel.class new file mode 100644 index 0000000000000000000000000000000000000000..f44da5b940d527321faaff50b25c0b7f76f749c6 GIT binary patch literal 1682 zcmbVNZBrXn6n<_3Y_i!3rWB#rlD=3&sDwAQ1#F9ySR~MzP!RpFvso_bCfi+Rvw`-X z_y-)nYCB^=XPkcaN2$-vrkDUT&N#Do@4aWwz2`a4dD%bz`t1(@bNE(Z&XX^~n%@jO z%gsNxg8Ht1=;imVpdo{qeE4!-Hg4|ue(3q3G^;W!S{3PP5CTKC>(`or%)6FX%`X+2 zo*g>Ary(woY#p4m-I_q(qT@N?J%M<3e9J%|G#x!i2pEoc;MZk2v_i)gxRou|tOF~$ z?s26i?QmiItcd4KGkn(c>ZUnmngXN6E+DH#->*0KHcV&D!pq>A zjxk(kP$CNkZX%V!C_bXmF0VUj)bKH*NB0ekEA=dL0x8pMILwJC2$^n1*W}AXKiG{z zQKlOCy^T*4zmo#P=UGx(8m7q6p4D_oasC`f$GgpRf~18R%%(7nIf0(=nbS~lK9f<5 z%xRg1I|g*5bfTMQo-EpKJ7bMD&`H}57_~15ZdV3!FM<04{as#^HZ?4fr2~sGy3+~0 z9gz+wZOJKTqAXm-LmgjYMc``J{bv}}@D<^>svHwo70~Jt=K_oW$9nsIvbct#La@$^ z$ad5HPA4kk$2uP23AtYOcO~g4I-cBUswCaCDlR1#SlM=c-P&*O(?#F5T)OF~?`@%8 zX790O!BHm$qs>EEX;xQWgwkuUp)jH`HVhz+5mlsI4Xb40oKWS>xd+T>uq&a&-4)J) zb8qeqlD}{vQ0BX@B^*Oi#hPoS`a@g#;1&9JUg6@e7b~1{V^u^ z{t?>tPZ%+`sh2m8@o5Y@uhGvHzy8d-;@ISS5V5~mC88HG4R`rG&&A97E0F890{Qv*} literal 0 HcmV?d00001 diff --git a/classes/nextjournal/markdown/parser2/types$footnote_init.class b/classes/nextjournal/markdown/parser2/types$footnote_init.class new file mode 100644 index 0000000000000000000000000000000000000000..6d06e718786c1e75e568c3d7c180276da3763877 GIT binary patch literal 1459 zcmbVMYf}EMERq=}b{G zHGb|#HJt@UTy$#c1H9)wob#NA=bZQa{PpbzfcwZY%xL_`Ea_E4lhoM0WbEzehgz&G z85M3MV&-v~SH^aA-PClGZ!4N&3SbNavZ|M=29K$dR*WrXs+w#nx+cKM;H@W3%W8?C zBW0y5FgU}JO&>ZSh;YHf;8U~%eUIl%$y8*9@o=^z9Y_thH-!?H&H2b>7el~Sc%2&+ zrDAf;+@uWM5a45Qr`Oi=TMWVMA7kfz=thqhUFc=-$huZBx3^~){Pwg>$)HF-u6yA? zA49JVlztU3z#ta6xgi~HkWdVL;VY>7a05dk1~J@@v63O(ZjrZL0RbZ|W^oeT&TN$* zAL_;qu?yk0#qJJ6kB!|%UceYb*S=JKt0^C-aQ=xef^mUV-BkffVFVhja|fZ3w4QR%BFBLLO`0qwWRNm!aZ3<6r<_i+j4T% literal 0 HcmV?d00001 diff --git a/classes/nextjournal/markdown/parser2/types$inline_formula_getClosingDelimiter.class b/classes/nextjournal/markdown/parser2/types$inline_formula_getClosingDelimiter.class index cda3f6b5268b940d285aafdac93220b95f2f8510..5bfd9cabba5682bd0268b443469d1052e5f53afa 100644 GIT binary patch delta 42 vcmZ3;x{!6lbVf#@$uk%=faF0&J4T^NOlm-;I#WKkxw4^-k(Hr2mzFC4?Q#jc delta 42 vcmZ3;x{!6lbVf$u$uk%=faF0&J4WG2Olm-;I#WKkg|eZJk(HqZmzFC4?dA!> diff --git a/classes/nextjournal/markdown/parser2/types$inline_formula_getLiteral.class b/classes/nextjournal/markdown/parser2/types$inline_formula_getLiteral.class index c85ca9b9ec0f186e4bceb35382ed85460ad81e47..48e5579332e7fe01e13ab1a69359548056c55269 100644 GIT binary patch delta 63 zcmbQkJBN1z8!MyWWOmkiQ9%X<20;ccAQk{(F(8&^5S%=l)eb0si`5-SDzW8rn<*RW M7+D#bacQ{%07Y{Oi2wiq delta 63 zcmbQkJBN1z8!MyGWOmkiQ6UBf1|bG6AQk{(F(8&^5Sl!j)eb0si`5-SDzW8rn=2dY M7+D#bb7{E(07lCSlmGw# diff --git a/classes/nextjournal/markdown/parser2/types$inline_formula_getOpeningDelimiter.class b/classes/nextjournal/markdown/parser2/types$inline_formula_getOpeningDelimiter.class index e9f883c57a52558aee61ae462efe59bf7daadb04..ae70abab956d006d0aa91a1834fb3608eb2bf1df 100644 GIT binary patch delta 42 vcmZ3;x{!6lbVf$u$uk%=faF0&J4WG2Olm-;I#WKkg|eZJk(HqZmzFC4?dA!> delta 42 vcmZ3;x{!6lbVf#z$uk%=faF0&J4TU7Olm-;I#WKkrLv)pk(Hq(mzFC4?pg`R diff --git a/classes/nextjournal/markdown/parser2/types$inline_formula_init.class b/classes/nextjournal/markdown/parser2/types$inline_formula_init.class index c00d84c4ad7699a4b9614028e7df32f49a3fca85..52e57428ccfbfa647fd82c7ae570421a9f00bcf1 100644 GIT binary patch delta 51 zcmX@eeUN)YAq%6xZSnPme?5y@c(w#M*+eFz=$JolygiFg6 E04t9QdjJ3c delta 51 zcmX@eeUN)YAq%76<5$JolyluOGM E04!7rg8%>k diff --git a/classes/nextjournal/markdown/parser2/types$loading__6798__auto____1942.class b/classes/nextjournal/markdown/parser2/types$loading__6798__auto____1942.class new file mode 100644 index 0000000000000000000000000000000000000000..660fc69ae960f0950299ae03d42ec9bf024a5851 GIT binary patch literal 1614 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 Qah5#g?R<7S=Xm*%|CbF10RR91 delta 902 zcmYjONla5w6uq}CmfyY_JF}ofBMF1S2r-1lg+YvoAp*t(mRjIL8=K$q`)k~>HF0Hb zqA{*qVGIisBgB>Sz@VaHR0L&k#sQo~Mepk);Nrjk&b#-WbKX6@RlQYb_G&cg+DwPF z-5xEYTTL-jH!Oq*&AUS0hE%)0rL0-N1-R$}2V9~7cUkZXT$SJ&!YaKh8%t&of~9m) z^HZBETs?pwT2rZ{9y6L_$*eA52#&d65QYWZfSdB>ZG^nGWXj;$2%L~7cd5u-Tyh^q zC3t|~vr>C3GhuYrTKsFxT6#vnLsfo6V_JRVxPUQuBHN!LxI5XosUJwBvfMYR&ZpR4 z)<`Cd{Q_oSy=;BX-V#PeH?3`YN6KXVm+E1!C@m^9cmr=`+bsD-wELrg_wYgDc?1tD z>`0gyt1g~MwhQ>IG`=ul+SJp!(Y{pprU<{YDWz1~VdJ> zw3hM>{cwlMeMLAzc7F}tqqH};y3q;ew(|!FoFAR{M`_9zarQIjz$g@m;$vzGthIAo zRPC+QCVC*hrMw@W@%2LI1ov@Zbjr6c=B#KsSgFk|(SOR(&oK#SMVY_~{nuq-4vV%*jvtDHL!#4R#=jKic&PqAV~fi- zdHysK*yKT5ALc1Vbdo0+amW~GSGW=b%p6vzL)*Ypk(*bHDQNTC5CXt}vqD@j2tL5q^Y;sZ%Z?FVaJH?x~bCNpt% z76gw4MHFvn6vbOayfqsQW4M9`Dx!FTCwNr(%_=`wel&K^W}3_fXey{tz z{(1Vgnu7UWpiswDwQrcR*FB3t%)YKfou=)pTs~sK!WjT z#xnCxD%F%w&alDMIZcXy8$2U6!>h$Fv+RrJK4Vp<6}|X8g^iML};l zkolK7uTeo?IncEP2@$AjEKp8!u1H^_84~g`9Ckr?TH8tjDdiCw2$YOrbr)={E@Rmm z#cG1EZpO_##q|V}Mi=Xiw3(}4-XY;ewk~`rEn=;Vo3M@@4%d=f*l*z_%WuU78MAO3 zLF^w+3m2ObHWEzMO+z=ec-FFe3r0FFHb`+N0ZrREL(e;$csEb1M_awhvO5VDY>p(( zURs{bS8y-x6Ua>jK|^>lc05u=?q|P87SXMEP{spzh+QI0B@eSJrFryGJSO82JkB;r z=aMH`NxJC#t=KN(DLhRO5}8muLr~eBUYRcMZi(q=In9>vEQ`_EHP7P(8PDNGf=I?P z3cV)9%iJ@o8{G3%f;plKq`HjJO;KV++Sd3QUKbe-5>%hGS5X7q(d@KA;qo9(m(F)P z#D1Z*WDlDftzEW{pu#WN=+O-GN*JPY6mRlG$5#D4ud zgB}UbjFu}*@jhD{ZKWUJut@Ghb|5;19AQVJ_4E^bD&u2(#wz4#-AXy0&hpVimVWozlqMY`Fko4LG#@5HKt<7}hcL?*F4aI5K$2n1m6Rs4imWs9Ag(w*pVtBn=C;eM%y43CU>JJxeLZ1E-%62x;>^lTrY5) z^mEq$e&F941oIMBjfh|fNC@$F#0wrQPr~?-jZBzbq9S^sAd|YK2cM6U3 z{{^><;JE!h?y57uP5!?)LA#pM4*0ZUc0Al$;~(aX)4}N+ z_l}RVPNo(8R{4+GopU-kTigNgOLfq1Y_#zP7teGT@2Q7ed^Cv9U3~50TNme@*a^wS ZiT(ZDXd)_6#SMvfg(L)4@GBGq{sdiA_2d8m delta 1270 zcmbV~TW=Fr5Xb)$JG<+(1NL%BQPW5PLEs^AARwhJK?+Eb5C~BmDe?m{E5|q+HtTe~ zPD?MOKp^GXz~Nr*kZ^~Da9P47;ZEsiXdn8}hd%WKv{h#vtSX|B5a(g`>^U>@oBx?P zR`GjT$?JcH9|2g1p9yotpT3!c(MF2Y)zl^udd|rtcrB<~G+%6|bAH~`4pkMAZ@)CX zv4tQf5{6|sHH1*o%(Ug~RCO|Arxc_K#fDX7Wfd5N$!{*Brf#L9Yno(iAox0Un@}fo zd7<1#cfS~9*6Rq_XuHxd-xPMb#7Vb<58 zNnR287Mr|GUCb~IN5N(>AeYis@k(A=z75+|bfbq;w&|UEH0Ky*w86IZjaeBx#9XCz z-Y)D`u@id;AC9B0PT5(;q%3D8e`Ne1x|K!qwqc)&UhF6MO~Yd82MCdT>b%(HmXk`S zY#E2dZ_4b7BRHz!Fpd$VWX8<3TMCYIGgubjm>Pt197 zC{P~kXJ4n)V5JwuNT8A~vz;dX3TQK~@;fX}as`I7B!u;lR21Qc*U>Z5OtDE-Xi)U1 zAAdB2TVA@`+?4-{TxRN7mVa0LqDE)k!>|e$_X*R+$zPUf@8B|7%0m$i&aWB4sES8; z976FJ?I{cI$aFNd+9|zdsbRGkRyrHPbMH2U7os<~fP&&_Fkb3IzzYK56;IyZ2(ktG zMJ&`88RT6Neqvhz9~YGppOlo*YtdXXyNhLw#n2y6yb$_TYt`CZbc`Z21eG+~Mdv8K z9Kv+cS_}I*nyr0RaH loc (z/append-child {:type :footnote :label (.getLabel node) + :content []}) z/down z/rightmost)) + (defn handle-todo-list [loc ^TaskListItemMarker node] (-> loc (z/edit assoc :type :todo-item :attrs {:checked (.isChecked node)}) @@ -160,7 +164,7 @@ (if (get-method open-node (class node)) (with-tight-list node (swap! !loc open-node node) - (.visitChildren this node) + (proxy-super visitChildren node) (swap! !loc close-node node)) (prn :open-node/not-implemented node)))))) diff --git a/src/nextjournal/markdown/parser2/footnotes.clj b/src/nextjournal/markdown/parser2/footnotes.clj index 41b7db4..3844838 100644 --- a/src/nextjournal/markdown/parser2/footnotes.clj +++ b/src/nextjournal/markdown/parser2/footnotes.clj @@ -1 +1,54 @@ -(ns nextjournal.markdown.parser2.footnotes) +(ns nextjournal.markdown.parser2.footnotes + (:require [nextjournal.markdown.parser2.types]) + (:import (nextjournal.markdown.parser2.types Footnote) + (org.commonmark.parser Parser$ParserExtension Parser$Builder SourceLine) + (org.commonmark.parser.block AbstractBlockParser BlockContinue BlockParserFactory BlockStart ParserState BlockParser))) + +(def footnote-id-regex (re-pattern "\\[\\^\\s*(.*)\\s*\\]")) +(def footnote-def-regex (re-pattern "^\\[\\^\\s*(.*)\\s*\\]:")) + +(re-find footnote-id-regex "foo[^note] and") + +(defn block-parser [label] + (let [footnote-block (new Footnote label)] + (proxy [AbstractBlockParser] [] + (isContainer [] true) + (canContain [_other] true) + (getBlock [] footnote-block) + (tryContinue [^ParserState state] + (let [non-space (.getNextNonSpaceIndex state)] + ;; TODO: loose list case will have a blank line, but we want to continue + (if (.isBlank state) + (BlockContinue/finished) + (BlockContinue/atIndex non-space))))))) + +(comment + (nextjournal.markdown.parser2/parse "what the + +[^what]: * what _the_ heck +* the + +what a what")) + +(defn extension [] + (proxy [Object Parser$ParserExtension] [] + (extend [^Parser$Builder pb] + (.customBlockParserFactory + pb (proxy [Object BlockParserFactory] [] + (tryStart [^ParserState state _matchedBlockParser] + (if (<= 4 (.getIndent state)) + (BlockStart/none) + (let [^SourceLine line (.getLine state) + line-content (.getContent line) + next-non-space (.getNextNonSpaceIndex state) + candidate-content (subs line-content next-non-space) + m (re-matcher footnote-def-regex candidate-content)] + (if (re-find m) + (let [block-index (+ next-non-space (.end m)) + label (subs line-content (+ next-non-space 2) + (+ next-non-space (- (.end m) 2))) + ^BlockParser bp (block-parser label)] + (println :match label (.start m) (.end m)) + (.atIndex (BlockStart/of (into-array [bp])) + block-index)) + (BlockStart/none)))))))))) diff --git a/src/nextjournal/markdown/parser2/types.clj b/src/nextjournal/markdown/parser2/types.clj index ff1a373..71d01cf 100644 --- a/src/nextjournal/markdown/parser2/types.clj +++ b/src/nextjournal/markdown/parser2/types.clj @@ -18,6 +18,18 @@ (defn inline-formula-getClosingDelimiter [this] "$") (defn inline-formula-getOpeningDelimiter [this] "$") +(gen-class + :name nextjournal.markdown.parser2.types.Footnote + :extends org.commonmark.node.CustomBlock + :constructors {[String] []} + :init init + :state state + :methods [[getLabel [] String]] + :prefix "footnote-") + +(defn footnote-init [label] [[] (ref {:label label})]) +(defn footnote-getLabel [this] (:label @(.state this))) + (comment (compile 'nextjournal.markdown.parser2.types) From 4ab0440e80ac99cf3dc7a9de65cc070d3f1a3e3b Mon Sep 17 00:00:00 2001 From: Andrea Amantini Date: Thu, 4 Apr 2024 16:58:43 +0200 Subject: [PATCH 09/83] Code blocks and monospace --- src/nextjournal/markdown/parser2.clj | 34 ++++++++++++++++------------ 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/src/nextjournal/markdown/parser2.clj b/src/nextjournal/markdown/parser2.clj index fc6f8b2..7d05223 100644 --- a/src/nextjournal/markdown/parser2.clj +++ b/src/nextjournal/markdown/parser2.clj @@ -15,6 +15,7 @@ OrderedList Code FencedCodeBlock + IndentedCodeBlock Heading Text Paragraph @@ -122,11 +123,26 @@ (defmethod open-node StrongEmphasis [loc _node] (-> loc (z/append-child {:type :strong :content []}) z/down z/rightmost)) +(defmethod open-node Code [loc ^Code node] + (-> loc (z/append-child {:type :monospace + :content [{:type :text + :text (.getLiteral node)}]}) z/down z/rightmost)) + (defmethod open-node Link [loc ^Link node] (-> loc (z/append-child {:type :link :attrs {:href (.getDestination node) :title (.getTitle node)} :content []}) z/down z/rightmost)) +(defmethod open-node IndentedCodeBlock [loc ^IndentedCodeBlock node] + (-> loc (z/append-child {:type :code + :content [{:text (.getLiteral node)}]}) z/down z/rightmost)) + +(defmethod open-node FencedCodeBlock [loc ^FencedCodeBlock node] + (-> loc (z/append-child (merge {:type :code + :info (.getInfo node) + :content [{:text (.getLiteral node)}]} + (parser/parse-fence-info (.getInfo node)))) z/down z/rightmost)) + (defmethod open-node Image [loc ^Image node] (-> loc (z/append-child {:type :image :attrs {:src (.getDestination node) :title (.getTitle node)} @@ -146,6 +162,8 @@ (let [!loc (atom (parser/->zip {:type :doc :content []}))] (.accept node (proxy [AbstractVisitor] [] + + ;; proxy can't overload method by arg type, while gen-class can: https://groups.google.com/g/clojure/c/TVRsy4Gnf70 (visit [^Node node] #_ (prn :visit (str node) (z/node @!loc)) (assert @!loc (format "Can't add node: '%s' to an empty location" node)) @@ -158,9 +176,9 @@ InlineFormula (swap! !loc z/append-child {:type :inline-formula :text (.getLiteral ^InlineFormula node)}) + ;; not used directly LinkReferenceDefinition (prn :link-ref node) - (if (get-method open-node (class node)) (with-tight-list node (swap! !loc open-node node) @@ -174,6 +192,7 @@ (node->data (.parse parser md))) (comment + (parse "some `marks` inline") (parse "# Ahoi par @@ -191,19 +210,6 @@ broken --- ![img](/some/src 'title')") - - ;; link refs - - (parse "some text with a [^link] ahoi - -[^link]: https://application.garden 'whatatitle' - - -# text continues here -") - - - ;; block footnotes (md/parse "_hello_ what and foo[^note1] and^[some other note]. From 60f523623605bf5b9c4099b5e2ded9d9926c4862 Mon Sep 17 00:00:00 2001 From: Andrea Amantini Date: Thu, 4 Apr 2024 17:04:21 +0200 Subject: [PATCH 10/83] Blockquote --- src/nextjournal/markdown/parser2.clj | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/nextjournal/markdown/parser2.clj b/src/nextjournal/markdown/parser2.clj index 7d05223..aaa9b83 100644 --- a/src/nextjournal/markdown/parser2.clj +++ b/src/nextjournal/markdown/parser2.clj @@ -87,7 +87,7 @@ ;; helpers / ctx (def ^:dynamic *in-tight-list?* false) -(defn paragraph-type [] (if *in-tight-list?* :plain :paragrpah)) +(defn paragraph-type [] (if *in-tight-list?* :plain :paragraph)) (defn in-tight-list? [node] (if (instance? ListBlock node) (.isTight ^ListBlock node) *in-tight-list?*)) (defmacro with-tight-list [node & body] `(binding [*in-tight-list?* (in-tight-list? ~node)] @@ -105,6 +105,9 @@ (defmethod open-node Paragraph [loc _node] (-> loc (z/append-child {:type (paragraph-type) :content []}) z/down z/rightmost)) +(defmethod open-node BlockQuote [loc _node] + (-> loc (z/append-child {:type :blockquote :content []}) z/down z/rightmost)) + (defmethod open-node Heading [loc ^Heading node] (-> loc (z/append-child {:type :heading :content [] :level (.getLevel node)}) z/down z/rightmost)) @@ -195,8 +198,8 @@ (parse "some `marks` inline") (parse "# Ahoi -par -broken +> par +> broken * a tight **strong** list * with [a nice link](/to/some 'with a title') From 567ca17c84290ce472d8618581821cc308382d53 Mon Sep 17 00:00:00 2001 From: Andrea Amantini Date: Fri, 5 Apr 2024 11:23:55 +0200 Subject: [PATCH 11/83] Prepare for footnote refs --- .../markdown/parser2/types$fn__1950.class | Bin 0 -> 1395 bytes .../parser2/types$footnote_ref_getLabel.class | Bin 0 -> 1686 bytes .../parser2/types$footnote_ref_init.class | Bin 0 -> 1463 bytes .../types$loading__6798__auto____1948.class | Bin 0 -> 1614 bytes .../markdown/parser2/types/Footnote.class | Bin 5761 -> 5761 bytes .../markdown/parser2/types/FootnoteRef.class | Bin 0 -> 5693 bytes .../parser2/types/InlineFormula.class | Bin 6444 -> 6444 bytes .../markdown/parser2/types__init.class | Bin 4250 -> 4819 bytes src/nextjournal/markdown/parser2.clj | 5 +- .../markdown/parser2/footnotes.clj | 57 +++++++++--------- src/nextjournal/markdown/parser2/types.clj | 16 ++++- 11 files changed, 44 insertions(+), 34 deletions(-) create mode 100644 classes/nextjournal/markdown/parser2/types$fn__1950.class create mode 100644 classes/nextjournal/markdown/parser2/types$footnote_ref_getLabel.class create mode 100644 classes/nextjournal/markdown/parser2/types$footnote_ref_init.class create mode 100644 classes/nextjournal/markdown/parser2/types$loading__6798__auto____1948.class create mode 100644 classes/nextjournal/markdown/parser2/types/FootnoteRef.class diff --git a/classes/nextjournal/markdown/parser2/types$fn__1950.class b/classes/nextjournal/markdown/parser2/types$fn__1950.class new file mode 100644 index 0000000000000000000000000000000000000000..09a5ef5c4e278e2c1c722fc28ef83b610f01fe75 GIT binary patch literal 1395 zcmbVMTT|Ll5dIFLV2nla($Z>c#VVkJ@zSc;3sq^g^d^ooePTj5+F(eW5WM`W7H3-R zL&xX-s7^Nt2#UUxnZurMIqdoN?6>>p@2}qg=8<8T)cLVhG%BVpYl)IwAe*x}qzVYUn<+F?2fTf=vYy8 z)q26u7K!eN=zvdv7k&m&)ent*p0#94RT%ms(M(Z3l-+nA^F^*$Nd~`S=w&OHn_&oM zu3Whzn@JHOx;x>)9fqFkzxvR_Anb8#OFr5%3`;~1T>^U1cm422ns^U1E|Wyub>rS^ zIA=xNcbyL?E0;XOc%+r}4T*>t#=|ZQ;!z{uoQTJ6z|n?tz9r98TBkh6@Wjq@oMH2Z z8(TTFdTwDAu~|h$2=?1}FiBKa6s=Y>vG%5M#W1-aaR#4alu8wg097P#<;l0UeVC;> zAIc`fVl&IEWvcpKvWZj86TPXV^H>ltho=nf1#a?PKNcCfW11lscwt&o^W~Ty%M4zU zM$wNIhS4VR#_QsZ*Tfrl#OMb}u`5taXg<7h%4u;^XGs1JZ8s1V=`~gbq_B2f zUsOUL(!_YxC~$hVjH>ewl~SIY+j3qbkC3I#Q+QgnLB9*uc)qf?er$2QOnn83isPkj zZAZu!J?%oaNF7VMbS%lqu_P9vFQP(_#=RZN^C=Eb+maD&9p4sC}G&>El>rp4&~diWs+ z6TdS|HU8NkGJVPU3*~HoQo%$}I>WOI^qwL>V5ts51d??yMBsTHgjw+A8P+fG<`fgH z`FgNPfjva`9oeth_o+{UJGJZ~B&@o_O^9VjF1Kl6azq-r9Bo3A=x&*q_5>7S89@q5 LQ_`{|#Mb`-w-QVl literal 0 HcmV?d00001 diff --git a/classes/nextjournal/markdown/parser2/types$footnote_ref_getLabel.class b/classes/nextjournal/markdown/parser2/types$footnote_ref_getLabel.class new file mode 100644 index 0000000000000000000000000000000000000000..091bce41ca5dc6617ef2336c395bbd635aa60311 GIT binary patch literal 1686 zcmbVNZBrXn6n<_3Y_drOQ;JY*8{1k#Qb~!Z6tFE)Vv#^=LP7My&Str!n{0QP%?8?k z;vaDQs_l%0I^*=SKT3UWHl+z<#u;b!?!EWyx%WKhIWPOy->?4!FpKX6=3MzKsCzBn zHJ$uZ({Jp0hi-n~^qbNza^8(ikq~Xgwqb7rrS(T0kAuwh+UcKeZykokx z{8F*yT7m7k8lnR6_Tg#EsS6A(+O8ek5r}4{wvrfvregpxfu!vocnw(z%)qt;Ze&Vz z^S}(RdswYYD_EF1E8;oB2%fauhGEBq)AW_)o%+QJWg z;id7Bjw`szpoA8ZxQ;{ullYiMd%W(ZQNt&U9^Fr3N~vd%6-XFH(`H_TK}h#9x+b3= zdj4)0iVD@p?@fHF_?;FQ?`KJAX}Cp>_RN+;it~LOo$58y4U!fL_$+}L%nA$yPwb|O z^O=ldWKPR8%q5{Cp%dLa^JLL-IvJbn0G+lxpHcgY;C3YoA%?pG!#!SV-HXsZ*W;pV=qwrVTS0_ir{P#Dn&8wL=?gep?5##J(Lj;ZqIJOE}i*p*P` z?hv3m zCw1=##W%R{66gQGgB_9j_6QrV@EvjI3H>ZJ5p4192nMmuxn5acdZdS)T-A)e95#GC mTS=cRi+V0SlRjzp`hWjY)L%i*mh{=ewV9iR`PqV=UHKQMVyh1T literal 0 HcmV?d00001 diff --git a/classes/nextjournal/markdown/parser2/types$footnote_ref_init.class b/classes/nextjournal/markdown/parser2/types$footnote_ref_init.class new file mode 100644 index 0000000000000000000000000000000000000000..284028ca1d3e0b55c3a8f304be52cb0ff0ce9bfa GIT binary patch literal 1463 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 literal 0 HcmV?d00001 diff --git a/classes/nextjournal/markdown/parser2/types/InlineFormula.class b/classes/nextjournal/markdown/parser2/types/InlineFormula.class index 3edab3f181a81275dc5df638cf81f1a989291304..1a209be1677dd019a63642db5201a9f1c19766b6 100644 GIT binary patch delta 1015 zcmZ9JOH31C5XWcOLc8r(wUkmqC?U}pD5(h?R8EQ-E)pba#1{xEDk>_Vp!mWU;`@QlcA*G|{dT{d$NxX`YbkCiK2a?@tqqD^ zq3qTXa`Fo(B4?A$?#n(S;54+`!2)Ly^Kik) zyM!P@YE04ebxM6iQv_Tw16L8!;%Ydg?iA1sOO4zf1SiXug|wKyzA+T86VPj_^&vPo zQmH9Tp-4O?;HLTi7B^9L#e?A(f+xRxN3e;G%8RMi?yb1X!ZnddSP81zg5fv|--Cm8 z7=Zf%Zo?fzZ;-p1-b(9rMHBGIwDuSwwKg14xn>v+8<``N>sYq-DU2GIF@$tIvPIWI zYD1~cubQ~7u&3u{c$|gVYk4p^#7oocD~gJM3~yk<=<=5KI+o{sM6iWaea7J@_+W=g zm=f^b__Dwk>TwjWb+>Zzu>oV|I7A+(Ws)2s0(WQ3v7ge#EFs+};<3J+$bACf;kS7LT_+&f=+$W$IC$-Nq%a3{~AO;$Lyfgc`& zaZsK{Q-0E z;6dX-jNza$fFkmx_yzc_prR;>U!bD+je@hgZLybk_nmp(dFGjCx@x*=PB+U!2}Yx; z*0#MP6mFwFxw))QfunFiz&SYY0tZ|~5bdh5GZ-^03_{`N3L20%(m}bXcv!$744Jq~ z2$^v$9Mbj*7==w{=n5Tj)wbQ>0xgk9SPg28!Ejs^Fb;=ZFa{F>uEBK^cnd*hj)tJF zYKDM2cE!60iW$|_eW6G^Cg8pue}ItD8jfgOX%dc@@2BXbsFmR{JTY(6B$TqiGng?i z&k@{4WS60bwDy3(pO(0xa;;fA{SqOYId+8fgggOrHp^=|p_G@rN5~3kMxyZrc;|w7 z_#oh|`R9O7w4hX!eugjRWr>A`w3w@CuROb7f~HQ8n<}e%VSpxbiX^s=CUUFgkxs~Js_cc!wCM5DV6HP`1Q14P zKF42r^$Y+Y7VxA8o|7lnk1rB$6^U)8 zC`VqUB5W_!{m1hr$zyfFzS042wV3aLkBNaSvWjAfJ*HW2I_X!7luaheNzeSSGHf?( zWx>mdN`F&S%Pg2Zr-pPH2>hW`-T(jq diff --git a/classes/nextjournal/markdown/parser2/types__init.class b/classes/nextjournal/markdown/parser2/types__init.class index f2d183f9377afe97f322d5dd0be94ad09101d1da..63af632c2c53c72a0819a3e467dcf3b7ccb7e7f0 100644 GIT binary patch literal 4819 zcmbVPd3+pY8GgPb?M#MgNH@?DT6zGj38hJMv`tN@mOwE!O=~x{2E=8unWUS{&MdRD zNh6}72q>U@T9bx5G2%?wttrDzn{IonH=Q!mu~@=RcnX9-{kSn{v|5He z*1B(a+>Dc3El^`Q#)v?5Q}aOqHSXAHFBaP(5b2Lw&UnT(gA)f0w_Aq-wH8&VaUr$NX0^Y7@}Z7Wz_l%eem8FuZqdA6P92wEsfN{9qhlrNB)~d>h7tosr<22urQp({e(gFg4^-K}tIV4-hLsk$a3NK$ z*YN~2X}Ao{0-Mf3@=;rgxpj+zO&YGm8i7lEPh`A=)k+`7Gp=jeUTd#mS;nwsDrgZ{ zTOx746Q7{+gRWtxjkuR^=pBYdy_>Q7>=0L=BPVjX%exnJMLRk)w4t+TkPaQ&g814l zP@9Xywl*C*0y8~PU{#5Tefv!}ok)AsWUrA@&?BIvO>eL183OB?N&~obb9eJW9Xs(P z8HrC8*me#!P1sh#He;iXo6J~7F0HQC&@0WW4kzr9AnX_PAknVHZi#kXNH>N+U!d_* zL)@)8`U8#k3iMPi8FR2d;hC<%c-yC8zm%_F&TTpl1d!1XcZZIr2aqfR*DeaO*K*Q~ zmupNbk(B5Po}pnVjNQIP#|;7YGmF^mbo;Xc?AT(l_oYm`6x+}+T!P)HV0k_}0+^cxIxB&ZzBGnSdNQrS z3qy4h9T(@oUyRC{>`)!Hw zPycr>1~upu>~pWdYh}g1e}1227gX?inky(sn{x$ev+PAG-pE>HxMLQ}BCYaf8gIg! zo^o8a_@2dxvnM!BdESZ#q#@o$n_3d-9qi8~79Y%{WG6XB3&dU1@R(?wVaQbY%yA-RngegGfT z@O~Vh-$9BEL~c}Yf>j_Vvfs`8kLmBSQUgo>=d@?tRe*`7Hj3*y7{ z#-w3o%zdK*E1LSkeKEI*vVH`QXgGyOr5PP7leAUL@#fKl#hX9IVJ8%ZWrn_%xHYcg z6ZBNlNC~trY^8E;U@xT@pTei5yFVk)I4{tO{YAxNl*~JvV5ohb33BGf-g#X?#TOUc zH@||b__DyVe6`KR_E(wi99K+B#n)-!!fL*hsQ6}>%_@^S_-)Qrh24@}Jn>!TOHZ6` z^9Q+?$U&|OKPVlo%OrbHl~nx5uS-Tcz1wjIj3mQ;LpbaU#ibY#y%u-V#y`PNrHy~a z+BI)c!7l{rD5k%)pM$8$GS*l!QHPdz*RSwv4Zp;1sA`F0d!1y8p~LX|9brf1!O-PKxE(G)AuG$iqUK*6}yFs^jkrhF)ic z23QvLjQ9itX;2n%;`TEy1~SQE)Ac!6Pb=5(XG{Yc<&O&f*C+>jpK>bpDThIya{Tit zMsKatA`%KT5?Wey#U#BxNHU+XK}^-P{lDcoIZss zxn=VlTC>=CNQfD94b7l?4p+@$*U%~Sa`l>7JY@!Z$R8;1_mlrLpFc?cp#p!1{Of)G zjpW}{;181@C!YYLTu2laCb(ev2ORR<0^cJ)6C60gg>w{qdR{(;-bzrDb}gZw+? zf#Wnr75>HV^{8f1e(~edJg8Do!@tK-$Cv8hWeNVxmo;>=G^WnyB0j75tmD(nXD6Rp zF!xAl?CJ-6N1*y>lmCBXLaKb zsuq#AWbyXsP)$wl^_|?F#e1V!%w+LUbZCi)ob-1rt*_7GbaY4&k&pTewZ?z1Un(LW z_Zjs{r-M9#}hDy+G zBHGvTXrtxOzER$iYbrrY5baxeG^ZTeS^T!P5;T`+-^rsLDTj6z-L9wv?G~baFOPOx zIkdCrwy6@d+hyv5`TG5QzTzt8t^BOc;)jtRXYun{{5Fd}XYto8{&5TnzfT|Mo;nuM RmE0%%!l9t*5DP~&@IO`6h_L_w delta 1523 zcmbW0`)?Fg6vw}3ce`_UIxX8?!X@-djNFcS3;ZmJvn74e;v^bwU)LfIy#1PiLqo;<6?7}nRiTgAm6jdD=aq` zI+liI>O}hdmO(;|?dIH~z$(IoKBus_w<g69dTFm{0# z2o0x-)#duufaPg;QSHjKHouHlbi9OD!>|fYX^AVaojv<)hdtj= zOmL@KsyEjLEb$lFoc)N}r%zPdbxFH;HErG=LS28M;JXFiI$5q!?uKJ7v>bu=IF!Hs z4p{!&iunUB=v93jt?gfJUbKgw_zGX^_!47kvT+`Lt7aLO%ft9i$02-gpr&&85w+TwBz_7v27Xo>jTtmS z9W(};lE{P_5RL)Vj(Wa_z+qLcJJdeJs|1eow*^VYEguj6A)z6~?|7t5RyH;GMeV3> zEpslFqZ0ceBJqe^DQ^yN`zVZI=p@$!xO)`$4r3C@mGSx#xkla}i>}Cu-AMH&Nj@0h z(eB<<>g4t@mIqkh9bi*{t=+vfB)3J1bT%8{weDW6O!D=}B2tkdn$0C-0B#}^x&e8I!#f&d@O q0|CC+iEje@5a7oE7a!dQEx^&eLoBLC1DaS!(Fkcs%;ynG0)GNcZMfY4 diff --git a/src/nextjournal/markdown/parser2.clj b/src/nextjournal/markdown/parser2.clj index aaa9b83..e90427f 100644 --- a/src/nextjournal/markdown/parser2.clj +++ b/src/nextjournal/markdown/parser2.clj @@ -219,7 +219,6 @@ And what. [^note1]: the _what_ - * and new text[^endnote] at the end. * the * hell^[that warm place] @@ -230,6 +229,4 @@ And what. ;; inline footnotes (might be handled via a delimited processor) (md/parse "some text with^[ and not without] a footnote") - (parse "some text with^[ and not without] a footnote") - (parse "some text with $and not -without$ a footnote")) + (parse "some text with^[ and not without] a footnote")) diff --git a/src/nextjournal/markdown/parser2/footnotes.clj b/src/nextjournal/markdown/parser2/footnotes.clj index 3844838..7eecfe0 100644 --- a/src/nextjournal/markdown/parser2/footnotes.clj +++ b/src/nextjournal/markdown/parser2/footnotes.clj @@ -1,8 +1,11 @@ (ns nextjournal.markdown.parser2.footnotes - (:require [nextjournal.markdown.parser2.types]) - (:import (nextjournal.markdown.parser2.types Footnote) - (org.commonmark.parser Parser$ParserExtension Parser$Builder SourceLine) - (org.commonmark.parser.block AbstractBlockParser BlockContinue BlockParserFactory BlockStart ParserState BlockParser))) + (:require [clojure.string :as str] + [nextjournal.markdown.parser2.types]) + (:import (nextjournal.markdown.parser2.types Footnote FootnoteRef) + (org.commonmark.node Text Node Nodes) + (org.commonmark.parser Parser$ParserExtension Parser$Builder PostProcessor SourceLine) + (org.commonmark.parser.block AbstractBlockParser BlockContinue BlockParserFactory BlockStart ParserState BlockParser) + (org.commonmark.parser.delimiter DelimiterProcessor))) (def footnote-id-regex (re-pattern "\\[\\^\\s*(.*)\\s*\\]")) (def footnote-def-regex (re-pattern "^\\[\\^\\s*(.*)\\s*\\]:")) @@ -23,32 +26,32 @@ (BlockContinue/atIndex non-space))))))) (comment - (nextjournal.markdown.parser2/parse "what the + (nextjournal.markdown.parser2/parse "init [^label] end -[^what]: * what _the_ heck -* the +[^label]: * this is nice _and_ nice + * and so so +")) -what a what")) +(defn block-parser-factory [] + (proxy [Object BlockParserFactory] [] + (tryStart [^ParserState state _matchedBlockParser] + (if (<= 4 (.getIndent state)) + (BlockStart/none) + (let [^SourceLine line (.getLine state) + line-content (.getContent line) + next-non-space (.getNextNonSpaceIndex state) + candidate-content (subs line-content next-non-space) + m (re-matcher footnote-def-regex candidate-content)] + (if (re-find m) + (let [block-index (+ next-non-space (.end m)) + label (subs line-content (+ next-non-space 2) + (+ next-non-space (- (.end m) 2))) + ^BlockParser bp (block-parser label)] + (.atIndex (BlockStart/of (into-array [bp])) + block-index)) + (BlockStart/none))))))) (defn extension [] (proxy [Object Parser$ParserExtension] [] (extend [^Parser$Builder pb] - (.customBlockParserFactory - pb (proxy [Object BlockParserFactory] [] - (tryStart [^ParserState state _matchedBlockParser] - (if (<= 4 (.getIndent state)) - (BlockStart/none) - (let [^SourceLine line (.getLine state) - line-content (.getContent line) - next-non-space (.getNextNonSpaceIndex state) - candidate-content (subs line-content next-non-space) - m (re-matcher footnote-def-regex candidate-content)] - (if (re-find m) - (let [block-index (+ next-non-space (.end m)) - label (subs line-content (+ next-non-space 2) - (+ next-non-space (- (.end m) 2))) - ^BlockParser bp (block-parser label)] - (println :match label (.start m) (.end m)) - (.atIndex (BlockStart/of (into-array [bp])) - block-index)) - (BlockStart/none)))))))))) + (.customBlockParserFactory pb (block-parser-factory))))) diff --git a/src/nextjournal/markdown/parser2/types.clj b/src/nextjournal/markdown/parser2/types.clj index 71d01cf..3fda76d 100644 --- a/src/nextjournal/markdown/parser2/types.clj +++ b/src/nextjournal/markdown/parser2/types.clj @@ -30,7 +30,17 @@ (defn footnote-init [label] [[] (ref {:label label})]) (defn footnote-getLabel [this] (:label @(.state this))) -(comment - (compile 'nextjournal.markdown.parser2.types) +(gen-class + :name nextjournal.markdown.parser2.types.FootnoteRef + :extends org.commonmark.node.CustomNode + :constructors {[String] []} + :init init + :state state + :methods [[getLabel [] String]] + :prefix "footnote-ref-") - ) +(defn footnote-ref-init [label] [[] (ref {:label label})]) +(defn footnote-ref-getLabel [this] (:label @(.state this))) + +(comment + (compile 'nextjournal.markdown.parser2.types)) From adee38d20d981fdc7be95eba54030ef040b43c83 Mon Sep 17 00:00:00 2001 From: Andrea Amantini Date: Wed, 10 Apr 2024 11:04:00 +0200 Subject: [PATCH 12/83] Use open inline parsing --- deps.edn | 3 + notebooks/benchmarks.clj | 59 +++++++++++-------- src/nextjournal/markdown/parser2.clj | 32 ++-------- src/nextjournal/markdown/parser2/formulas.clj | 39 ++++++++++++ 4 files changed, 82 insertions(+), 51 deletions(-) create mode 100644 src/nextjournal/markdown/parser2/formulas.clj diff --git a/deps.edn b/deps.edn index 40efb69..4bd370f 100644 --- a/deps.edn +++ b/deps.edn @@ -47,6 +47,9 @@ :git/sha "e8f275b5cf077ec9441e404c1885ff0b6ee0aef9" :deps/root "render"}}} + :commonmark-java-local + {:extra-paths ["../commonmark-java/commonmark/target/classes"]} + :build {:ns-default build :deps {io.github.clojure/tools.build {:git/tag "v0.6.1" :git/sha "515b334"} diff --git a/notebooks/benchmarks.clj b/notebooks/benchmarks.clj index 9ea387a..3c8fab7 100644 --- a/notebooks/benchmarks.clj +++ b/notebooks/benchmarks.clj @@ -4,6 +4,7 @@ [nextjournal.clerk :as clerk] [nextjournal.clerk.eval :as clerk.eval] [nextjournal.markdown :as md] + [nextjournal.markdown.parser2 :as parser2] parsing-extensibility [nextjournal.markdown.parser :as md.parser])) @@ -22,30 +23,40 @@ (md.parser/parse (update md.parser/empty-doc :text-tokenizers concat extra-tokenizers) (md/tokenize text)))) -;; Default set of tokenizers -(time-ms (parse reference-text)) - -;; With an extra brace-brace parser -(time-ms (parse [{:regex #"\{\{([^\{]+)\}\}" - :handler (fn [m] {:type :var :text (m 1)})}] - reference-text)) - -;; With the losange reader -(time-ms (parse [{:regex #"\{\{([^\{]+)\}\}" - :handler (fn [m] {:type :var :text (m 1)})} - {:tokenizer-fn parsing-extensibility/losange-tokenizer-fn - :handler (fn [data] {:type :losange :data data})}] - reference-text)) - -;; With hashtags and internal links -(time-ms - (parse [md.parser/hashtag-tokenizer - md.parser/internal-link-tokenizer - {:regex #"\{\{([^\{]+)\}\}" - :handler (fn [m] {:type :var :text (m 1)})} - {:tokenizer-fn parsing-extensibility/losange-tokenizer-fn - :handler (fn [data] {:type :losange :data data})}] - reference-text)) +(comment + + ;; Default set of tokenizers + (time-ms (parse reference-text)) + (time-ms (parser2/parse reference-text)) + + (-> (parse reference-text) + :content count ) + + (-> (parser2/parse reference-text) + :content count ) + + + ;; With an extra brace-brace parser + (time-ms (parse [{:regex #"\{\{([^\{]+)\}\}" + :handler (fn [m] {:type :var :text (m 1)})}] + reference-text)) + + ;; With the losange reader + (time-ms (parse [{:regex #"\{\{([^\{]+)\}\}" + :handler (fn [m] {:type :var :text (m 1)})} + {:tokenizer-fn parsing-extensibility/losange-tokenizer-fn + :handler (fn [data] {:type :losange :data data})}] + reference-text)) + + ;; With hashtags and internal links + (time-ms + (parse [md.parser/hashtag-tokenizer + md.parser/internal-link-tokenizer + {:regex #"\{\{([^\{]+)\}\}" + :handler (fn [m] {:type :var :text (m 1)})} + {:tokenizer-fn parsing-extensibility/losange-tokenizer-fn + :handler (fn [data] {:type :losange :data data})}] + reference-text))) ^{::clerk/visibility {:code :hide :result :hide}} (comment diff --git a/src/nextjournal/markdown/parser2.clj b/src/nextjournal/markdown/parser2.clj index e90427f..ec46531 100644 --- a/src/nextjournal/markdown/parser2.clj +++ b/src/nextjournal/markdown/parser2.clj @@ -3,7 +3,8 @@ [clojure.zip :as z] [nextjournal.markdown.parser :as parser] [nextjournal.markdown.parser2.types] - [nextjournal.markdown.parser2.footnotes :as footnotes]) + [nextjournal.markdown.parser2.footnotes :as footnotes] + [nextjournal.markdown.parser2.formulas :as formulas]) (:import (org.commonmark.parser Parser Parser$ParserExtension Parser$Builder) (org.commonmark.parser.delimiter DelimiterProcessor) (org.commonmark.ext.task.list.items TaskListItemsExtension TaskListItemMarker) @@ -49,29 +50,6 @@ ;; - [ ] promote single images as blocks ;; - [ ] [[TOC]] (although not used in Clerk) -(def InlineFormulaExtension - (proxy [Object Parser$ParserExtension] [] - (extend [^Parser$Builder pb] - (.customDelimiterProcessor - pb - (proxy [Object DelimiterProcessor] [] - (getOpeningCharacter [] \$) - (getClosingCharacter [] \$) - (getMinLength [] 1) - (process [open close] - (if (and (= 1 (.length open)) - (= 1 (.length close))) - (let [text (str/join - (keep #(when (instance? Text %) (.getLiteral %)) - (Nodes/between (.. open getOpener) (.. close getCloser))))] - (doseq [^Node n (Nodes/between (.. open getOpener) - (.. close getCloser))] - (.unlink n)) - (.. open getOpener - ;; needs a named class `gen-class` - (insertAfter (new InlineFormula text))) - 1) - 0))))))) (comment (parse "* this is inline $\\phi$ math @@ -80,9 +58,9 @@ (def ^Parser parser (.. Parser builder - (extensions [(TaskListItemsExtension/create) - InlineFormulaExtension - (footnotes/extension)]) + (extensions [(formulas/extension) + (footnotes/extension) + (TaskListItemsExtension/create)]) build)) ;; helpers / ctx diff --git a/src/nextjournal/markdown/parser2/formulas.clj b/src/nextjournal/markdown/parser2/formulas.clj new file mode 100644 index 0000000..028a172 --- /dev/null +++ b/src/nextjournal/markdown/parser2/formulas.clj @@ -0,0 +1,39 @@ +(ns nextjournal.markdown.parser2.formulas + (:import (nextjournal.markdown.parser2.types InlineFormula) + (org.commonmark.node Node) + (org.commonmark.internal InlineParserImpl) + (org.commonmark.internal.inline InlineContentParser InlineParserState ParsedInline) + (org.commonmark.parser InlineParserFactory Parser Parser$ParserExtension Parser$Builder))) + +(defn inline-formula-parser [] + (proxy [InlineContentParser] [] + (tryParse [^InlineParserState parser-state] + + (let [scanner (.scanner parser-state) + dollars-open (.matchMultiple scanner \$) + after-opening (.position scanner)] + + (if (< 0 (.find scanner \$)) + (let [before-closing (.position scanner) + dollars-close (.matchMultiple scanner \$)] + (if (= dollars-open dollars-close) + (let [^String source (.getContent (.getSource scanner after-opening before-closing))] + (prn :source source) + (ParsedInline/of (new InlineFormula source) (.position scanner))))) + (ParsedInline/none)))))) + +(defn extension [] + (proxy [Object Parser$ParserExtension] [] + (extend [^Parser$Builder pb] + (.inlineParserFactory pb (proxy [InlineParserFactory] [] + (create [ctx] + (.addInlineParser (new InlineParserImpl ctx) + \$ (list (inline-formula-parser))))))))) + +(comment + + (nextjournal.markdown.parser2/parse " + # Ok + Aloha, that costs + * a $\\int_a^b\\phi(t)dt$ with discount + * and what")) From 4a3fdefdf0364bd0a315fd72021c6becdd42f9f3 Mon Sep 17 00:00:00 2001 From: Andrea Amantini Date: Wed, 10 Apr 2024 14:53:25 +0200 Subject: [PATCH 13/83] Source nj commonmark-java fork from jitpack --- deps.edn | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/deps.edn b/deps.edn index 4bd370f..7218ae8 100644 --- a/deps.edn +++ b/deps.edn @@ -4,9 +4,13 @@ org.graalvm.js/js {:mvn/version "21.3.2.1"} ;; commonmark - org.commonmark/commonmark {:mvn/version "0.22.0"} + ;; org.commonmark/commonmark {:mvn/version "0.22.0"} + ;; temporary fork + com.github.nextjournal/commonmark-java {:mvn/version "4641654"} org.commonmark/commonmark-ext-task-list-items {:mvn/version "0.22.0"}} + :mvn/repos {"jitpack.io" {:url "https://jitpack.io"}} + :aliases {:nextjournal/clerk {:extra-paths ["notebooks"] From 135ae6fa2351ef2f83bd0c2c8c1d4abc34c48b72 Mon Sep 17 00:00:00 2001 From: Andrea Amantini Date: Wed, 10 Apr 2024 15:06:49 +0200 Subject: [PATCH 14/83] Run clj tests against both parsers --- notebooks/benchmarks.clj | 6 +++--- src/nextjournal/markdown.clj | 17 ++++++++++++++++- .../markdown/{parser2.clj => commonmark.clj} | 17 ++++++++--------- src/nextjournal/markdown/parser2/footnotes.clj | 2 +- src/nextjournal/markdown/parser2/formulas.clj | 2 +- test/nextjournal/markdown_test.cljc | 11 ++++++++++- 6 files changed, 39 insertions(+), 16 deletions(-) rename src/nextjournal/markdown/{parser2.clj => commonmark.clj} (96%) diff --git a/notebooks/benchmarks.clj b/notebooks/benchmarks.clj index 3c8fab7..cf7e184 100644 --- a/notebooks/benchmarks.clj +++ b/notebooks/benchmarks.clj @@ -4,7 +4,7 @@ [nextjournal.clerk :as clerk] [nextjournal.clerk.eval :as clerk.eval] [nextjournal.markdown :as md] - [nextjournal.markdown.parser2 :as parser2] + [nextjournal.markdown.commonmark :as commonmark] parsing-extensibility [nextjournal.markdown.parser :as md.parser])) @@ -27,12 +27,12 @@ ;; Default set of tokenizers (time-ms (parse reference-text)) - (time-ms (parser2/parse reference-text)) + (time-ms (commonmark/parse reference-text)) (-> (parse reference-text) :content count ) - (-> (parser2/parse reference-text) + (-> (commonmark/parse reference-text) :content count ) diff --git a/src/nextjournal/markdown.clj b/src/nextjournal/markdown.clj index aa72971..aeabd93 100644 --- a/src/nextjournal/markdown.clj +++ b/src/nextjournal/markdown.clj @@ -3,6 +3,7 @@ (:require [clojure.java.io :as io] [clojure.data.json :as json] [nextjournal.markdown.parser :as markdown.parser] + [nextjournal.markdown.commonmark :as commonmark] [nextjournal.markdown.transform :as markdown.transform]) (:import (org.graalvm.polyglot Context Context$Builder Source Value) (java.io Reader))) @@ -45,10 +46,17 @@ (.execute tokenize-fn (to-array [markdown-text])))] (json/read-str (.asString tokens-json) :key-fn keyword))) +(def ^:dynamic *legacy-graal-js-parser* true) +(defmacro with-new-parser [& body] + `(binding [*legacy-graal-js-parser* false] ~@body)) + (defn parse "Turns a markdown string into a nested clojure structure." ([markdown-text] (parse markdown.parser/empty-doc markdown-text)) - ([doc markdown-text] (markdown.parser/parse doc (tokenize markdown-text)))) + ([doc markdown-text] + (if *legacy-graal-js-parser* + (markdown.parser/parse doc (tokenize markdown-text)) + (commonmark/parse doc markdown-text)))) (defn ->hiccup "Turns a markdown string into hiccup." @@ -67,6 +75,13 @@ - [x] ~~thing~~ ") + (with-new-parser + (parse "# Hello Markdown +- [ ] what +- [ ] [nice](very/nice/thing) +- [x] ~~thing~~ +")) + (->hiccup "# Hello Markdown * What's _going_ on? diff --git a/src/nextjournal/markdown/parser2.clj b/src/nextjournal/markdown/commonmark.clj similarity index 96% rename from src/nextjournal/markdown/parser2.clj rename to src/nextjournal/markdown/commonmark.clj index ec46531..377e07c 100644 --- a/src/nextjournal/markdown/parser2.clj +++ b/src/nextjournal/markdown/commonmark.clj @@ -1,6 +1,5 @@ -(ns nextjournal.markdown.parser2 - (:require [clojure.string :as str] - [clojure.zip :as z] +(ns nextjournal.markdown.commonmark + (:require [clojure.zip :as z] [nextjournal.markdown.parser :as parser] [nextjournal.markdown.parser2.types] [nextjournal.markdown.parser2.footnotes :as footnotes] @@ -152,13 +151,12 @@ Text (swap! !loc z/append-child {:type :text :text (.getLiteral ^Text node)}) ThematicBreak (swap! !loc z/append-child {:type :ruler}) SoftLineBreak (swap! !loc z/append-child {:type :softbreak}) - HardLineBreak (swap! !loc z/append-child {:type :softbreak}) + HardLineBreak (swap! !loc z/append-child {:type :hardbreak}) TaskListItemMarker (swap! !loc handle-todo-list node) - InlineFormula (swap! !loc z/append-child {:type :inline-formula + InlineFormula (swap! !loc z/append-child {:type :formula :text (.getLiteral ^InlineFormula node)}) - ;; not used directly - LinkReferenceDefinition (prn :link-ref node) + LinkReferenceDefinition :ignore #_ (prn :link-ref node) (if (get-method open-node (class node)) (with-tight-list node @@ -169,8 +167,9 @@ (some-> @!loc z/root))) -(defn parse [md] - (node->data (.parse parser md))) +(defn parse + ([md] (parse {} md)) + ([_doc md] (node->data (.parse parser md)))) (comment (parse "some `marks` inline") diff --git a/src/nextjournal/markdown/parser2/footnotes.clj b/src/nextjournal/markdown/parser2/footnotes.clj index 7eecfe0..556cc90 100644 --- a/src/nextjournal/markdown/parser2/footnotes.clj +++ b/src/nextjournal/markdown/parser2/footnotes.clj @@ -26,7 +26,7 @@ (BlockContinue/atIndex non-space))))))) (comment - (nextjournal.markdown.parser2/parse "init [^label] end + (nextjournal.markdown.commonmark/parse "init [^label] end [^label]: * this is nice _and_ nice * and so so diff --git a/src/nextjournal/markdown/parser2/formulas.clj b/src/nextjournal/markdown/parser2/formulas.clj index 028a172..e2758ba 100644 --- a/src/nextjournal/markdown/parser2/formulas.clj +++ b/src/nextjournal/markdown/parser2/formulas.clj @@ -32,7 +32,7 @@ (comment - (nextjournal.markdown.parser2/parse " + (nextjournal.markdown.commonmark/parse " # Ok Aloha, that costs * a $\\int_a^b\\phi(t)dt$ with discount diff --git a/test/nextjournal/markdown_test.cljc b/test/nextjournal/markdown_test.cljc index 609678f..5b573d2 100644 --- a/test/nextjournal/markdown_test.cljc +++ b/test/nextjournal/markdown_test.cljc @@ -1,5 +1,5 @@ (ns nextjournal.markdown-test - (:require [clojure.test :as t :refer [deftest testing is]] + (:require [clojure.test :as t :refer [deftest testing is use-fixtures]] [matcher-combinators.test :refer [match?]] [matcher-combinators.standalone :as standalone] [matcher-combinators.matchers :as m] @@ -8,6 +8,15 @@ [nextjournal.markdown.parser :as md.parser] [nextjournal.markdown.transform :as md.transform])) +#?(:clj (use-fixtures :once + (fn [f] + (prn "Running Tests with legacy GraalJS parser") + (f) + (prn "----------------------------------------------------------------------------------") + (flush) + (prn "Running Tests with new Java parser") + (md/with-new-parser (f))))) + ;; com.bhauman/cljs-test-display doesn't play well with ANSI codes (matcher-combinators.ansi-color/disable!) From f79ebacbe2e6ee1fb1892456e110f9c706cb3656 Mon Sep 17 00:00:00 2001 From: Andrea Amantini Date: Wed, 10 Apr 2024 17:49:09 +0200 Subject: [PATCH 15/83] First step toward block formulas --- .../types$block_formula_getLiteral.class | Bin 0 -> 1691 bytes .../parser2/types$block_formula_init.class | Bin 0 -> 1472 bytes .../markdown/parser2/types$fn__24779.class | Bin 0 -> 1396 bytes .../markdown/parser2/types$fn__3261.class | Bin 0 -> 1395 bytes .../parser2/types$footnote_getLabel.class | Bin 1682 -> 1682 bytes .../parser2/types$footnote_init.class | Bin 1459 -> 1459 bytes .../parser2/types$footnote_ref_getLabel.class | Bin 1686 -> 1686 bytes .../parser2/types$footnote_ref_init.class | Bin 1463 -> 1463 bytes .../types$inline_formula_getLiteral.class | Bin 1692 -> 1692 bytes .../parser2/types$inline_formula_init.class | Bin 1473 -> 1473 bytes .../types$loading__6803__auto____24777.class | Bin 0 -> 1615 bytes .../types$loading__6803__auto____3259.class | Bin 0 -> 1614 bytes .../markdown/parser2/types/BlockFormula.class | Bin 0 -> 5895 bytes .../markdown/parser2/types/Footnote.class | Bin 5761 -> 5761 bytes .../markdown/parser2/types/FootnoteRef.class | Bin 5693 -> 5693 bytes .../parser2/types/InlineFormula.class | Bin 6444 -> 5753 bytes .../markdown/parser2/types__init.class | Bin 4819 -> 4768 bytes src/nextjournal/markdown/commonmark.clj | 9 ++- src/nextjournal/markdown/parser2/formulas.clj | 56 +++++++++++++++--- src/nextjournal/markdown/parser2/types.clj | 15 ++++- 20 files changed, 64 insertions(+), 16 deletions(-) create mode 100644 classes/nextjournal/markdown/parser2/types$block_formula_getLiteral.class create mode 100644 classes/nextjournal/markdown/parser2/types$block_formula_init.class create mode 100644 classes/nextjournal/markdown/parser2/types$fn__24779.class create mode 100644 classes/nextjournal/markdown/parser2/types$fn__3261.class create mode 100644 classes/nextjournal/markdown/parser2/types$loading__6803__auto____24777.class create mode 100644 classes/nextjournal/markdown/parser2/types$loading__6803__auto____3259.class create mode 100644 classes/nextjournal/markdown/parser2/types/BlockFormula.class diff --git a/classes/nextjournal/markdown/parser2/types$block_formula_getLiteral.class b/classes/nextjournal/markdown/parser2/types$block_formula_getLiteral.class new file mode 100644 index 0000000000000000000000000000000000000000..6d39c239b524350633ed2ee621db60f24b0c648d GIT binary patch literal 1691 zcmbVNZBr9h6n^do*krR78j*sarfO{nN+h*K2~{bQiY#aogi=53Y?e#hWZBDXc0vD1 z|3If-Tb-$3XF7iFk7|2vcEtoT(-~*>?!EWyx%WKhIWPP7KX3m6a0@>&lsx_-Xo%4F zEVr<0`OR%{;1%{Pzs3DxA$YmRTUTqYu$$(N@OMMkGV44roPhh5tAa6%*sf@VJ}mJt{+zv{Ur$uzmG=t}%*EG$WrpYjFbOBj5glL9)>r$hnL&upE6nw&vw1w9S zOml`I(|u&a@=0?DpGwUP!%)|S^i{<$gGT;Wtb>XW0mE>v2Q(cc_)Nn&jGnw>xlFvA zXXtN{vpk83lk`>ij!O;;GIfz*EMjI&Eco?h0&RIVU*)?s?lau!K~o1y)xdYWdg-U0 z@Ur+^!zEm%phOmQTtzyKaeP5WyS(nCQN@=OJ#t^iq*Tu#&yY6F7G*;mglspXEBxhw z@VBE-R7s8ay^b4_-)V-?UY4YmikrmIjupB@aiNE!lig-IL6U_czDi>Tw;1|@=T1w; z`BX+xWKPOd+}5EXtr5C8%9DB9jWbq{flk}Pr>K2P;I_HXcapfrFxcfqWnIMrv9xbd zjBa;Ak0a6nC6=6UCd$G^JkanRmKZK}-G7Qv72h+cZd8y-EYqeLvCc66G4^8%#N!GK ziD8v;BG*m$d!49|A8UAsC&c!m*ycot;dp#4lxezd)m)OCq1v{atJYq;<kCTyoTr z-(#Uxr6y$avLjCnN1F${7S@+u1l(&;OQD!5)G~ks#$=h&YE-5Z%}H6{H1~mW8q}9i zq1^?V8O{CqH%R?X3x+Da2in33q-3;dEmePxrT1T9aO)M${(-S~7|*kn%!R}ut{mZ- zf@epVqW3RQH-E*Lxk-8j^9Wxn*m{jYTG7|v=&l6T={*ePU#b(<4@JctdY;l~+dogX zfQk0dXda?5LSvl9Q+KcR2SNXaB^*EtYw7h_yHPfp8ZH`e|wuY|z~b`msrKqq@5AM2mX4tQu`G pYWZ5enmt~YwW;h(_PF6||Nmc+{{<~?XvNtpGuMlA#aS)C^dCq&tiu2R literal 0 HcmV?d00001 diff --git a/classes/nextjournal/markdown/parser2/types$block_formula_init.class b/classes/nextjournal/markdown/parser2/types$block_formula_init.class new file mode 100644 index 0000000000000000000000000000000000000000..0f5d7e94b63726d49d28faece860c94c1ff57e1e GIT binary patch literal 1472 zcmbVMZBr6a6n-wC3+wt4`I4GJX^Lo~m}P1&rcx%BBj$|tfw`<#W?|i>%i_zwDxE26 zrpC|xsHU^PsHjs@AK;#QIOjPJ&pG$}{Ppbzfcscwn6kuyle0_G;%01@%lx*zZ^a5+ z7KMz*oWp`B4rEMQ&!=~6xmz-M+OP~q0b}UYO*>bTB4%2Zc&ecC3M6dATxpp+s*Jo5gsw8Qn_%V*NA@&eTu z#E^=+h)_?ftQZn=FeI+%@4s-UwwGwcFs@<@q=wft zNbBHb6b&kxRMKOL)SJ`I+5~Dfj$^tlg&)&|AjOU!Gi2;>$uNDMW6F_+m7P6@Uh`bg zsX88WcfbAvbu&Bu_AD>)a%whI_9$)fByZT_g-QqP==q6q!42V7k=`;UNJ1a&3J<#7 z`6sK}oisXqpw@yG0bbIrk4{EsL-Y#*pU7ZXrtijzvljuk9b~(q?q!oUzDw+${7BNQ4h+9f215w1+4{MvR$-Zgy{2%Zd#?n5GHAzxm9T% zYjr}D26g2zI@#ksz#G)e5!w9baEy> IrAC*210>3K5C8xG literal 0 HcmV?d00001 diff --git a/classes/nextjournal/markdown/parser2/types$fn__24779.class b/classes/nextjournal/markdown/parser2/types$fn__24779.class new file mode 100644 index 0000000000000000000000000000000000000000..8d535d85a578276ec089d6402a8966845954b17b GIT binary patch literal 1396 zcmbVMTT|0e5dKanw1i-xT(k;W0f8214OF=lFBPbQ^+p+HeCnj>p{Aq>lcrq$m6jO= z9~_?jQI4CW7ohlJXHNHgn`FnKMi_1PRhG9iBN>!7`HCZplQ|YR%SgN7>(818{d=OK#5<}Oj zs;ky>hK}jTu81!91bE?R5LNxq*ymYGwp4{-a5|DH$%nEV??b-C6)VZ$R}8&k<#LZ1 zf|)Bv?#gCTgoxg5cyNoM@A^|8`WS>Fx3=Y@ZNsoc1kod)9|PB4-b@qkq1IuNh}&-5 zJ1ytDh`X-y9%bc{XPBIBXMIB=B1Un)2g7*K3b-KRp&M|laQ8Pch2nszrb*61Z~Z+dDqY zQ=JcGlVRyH%dBOpdNFy4Q{5A}siX-!5wL)#44nmT@;yJ67uR`|CG=MWh*Kb$)CWjf$zuTC60S`+4I?j~&Qn znVa#Lb#lPVlY4qLyAWTJd|(VgMKg*OlgBh!FT|3mimq6yq5IIm(CwU$Dq4}DYgN@% z>jgu{On6sB7kmP|@H2?2erW9Tj3ryD!Z0)wP8a1v*^T!xSLBM7VDKx3UbeE?#|(k= zr7L%3Ga*7mZ#O)+#n6BCS0DNrgaWs=<)dxGutWsVBVYi7R}XKdi1%>wGD*a3H}0LL zGcMw;>%2!-0wjU51IiNL_Bl@jyIi)ZFweBI^{WuM|Pf53|rUS z*v_Hda|5dxn^jnZV84wAvqWW8(P}jlYi}A=43qm2W$-CRsZ_BDP(}JKJ^A*I4{@sV zp=>fNx3bJwrm7bbEu3ne@O33!#1jDvSYqhRbCd7+vCPmL(F{4y^YfaTD@XiTVepbP zihiszjJJq4S{HA$Cf=wcMn6b`gO~VbPD(jL^Wl|KPK%p5L*jpEyMd@kudyZ|iS?`c zq7wR$BF1Y*p3}3XRh@sRlycnMk#ib(gba0_!c(dZhFq}DbCtrzvBmW=^%W#4j+eT% z6CqplvkZRl4WE&BR|pooi+@c^xfq+sby^e(B3}! z*|`V^SJC$aLl+2E5vp%S&N1de6%*vBV)`5rFTORx1&N;>+78=CYnavqEk^g(!;d(a z_?=;{`OhYi`3C1Nl(YRw24Vr}3{NjGaEd+x&*~sVAW;V+1fJKy1Pi=8!^Q>PoMO5? zUk|n@u!rcrBl|V;KKV&-rnJ!69xtb69z6I764)~AeLq@nLL%%4k&+x)g4I6u;uZX8Y&y= M7+IMba%s5&0CA@axc~qF delta 63 zcmbQnJB@b%E2H*gM%H>!Z3YGgZ3ZqN764)~AeLs(o;;P+4k&+x)g4I6u;uZX7%3a- M7+IMZacQ{%0A<4qXaE2J diff --git a/classes/nextjournal/markdown/parser2/types$footnote_ref_init.class b/classes/nextjournal/markdown/parser2/types$footnote_ref_init.class index 284028ca1d3e0b55c3a8f304be52cb0ff0ce9bfa..29ba01b7984352ce1cbe0a1e719ed02a7a42e29d 100644 GIT binary patch delta 51 zcmdnay`6hQIt!!mmfz delta 63 zcmbQkJBN1z8!MyWWOmkiQ9%X<20;ccAQk{(F(8&^5S%=l)eb0si`5-SDzW8rn<*RW M7+D#bacQ{%07Y{Oi2wiq diff --git a/classes/nextjournal/markdown/parser2/types$inline_formula_init.class b/classes/nextjournal/markdown/parser2/types$inline_formula_init.class index 52e57428ccfbfa647fd82c7ae570421a9f00bcf1..fa5e226aea2189a01327f14d56f3ec5dd4cb28f3 100644 GIT binary patch delta 51 zcmX@eeUN)YAqyk_SnPme?5y@c(w#M*+gRC9$Jolym`lqQ E04mA~a{vGU delta 51 zcmX@eeUN)YAq%6xZSnPme?5y@c(w#M*+eFz=$JolygiFg6 E04t9QdjJ3c diff --git a/classes/nextjournal/markdown/parser2/types$loading__6803__auto____24777.class b/classes/nextjournal/markdown/parser2/types$loading__6803__auto____24777.class new file mode 100644 index 0000000000000000000000000000000000000000..1765a34e3b190d96c5096bcdcea587e2b7731bd9 GIT binary patch literal 1615 zcmbVNZBrXn6n<_(Sh9rDhPIYkG};OwARz%8+F)rKh+>z5S&A}#$lNSf*s$4+yBl8q zk2C$MbOxg{YCij$9LIB$2rO~N8F%K~_xqf4o^$TmKmPjVHvo&+WmvJriC=S?uFb7< zox6v7&as_taMu%VHtnA_g!jmD_?~I+S1ON}<`*gz-t?Ucec8oaE~kJo+%+tx)^tVM z;`V;JP-@zSZ#uSuFhjJ1F=tpchQVdiHvMM|;pFsA41-Wq3}A>hO#8?=6b!eM(^`!m z@h;M4wI&Qd&v5hlnt~X^oq*b+Q*W4-a24DjKy9jb0Yk@;M+|9>u6StxmMVw)1 zU-(6fdmh7BKy_!4j^4%{6(hLIFnVc2XH&sFh8zFf*N7wGGK}}5bhilWKHgO^jt7Jl zFsi(*;5~+sI&ZwT&F`Axr8p&nvdM4yxtI?6v%V!<&-8p@`y0GLIuiIm#ryb>;a)&T z!Sfu$81-@|1{F)gSilp8TMefXbS{Rx%)u!vGYt3#CV3n0ho#)O#3cadm{%>L@j2PM zY*@XVj`bLwGaOe8p~w(%#kay8!Wt#~5vSx>x@xoTyTot)in`v)wGekx_A`7g0-)ea;;HED(MuiGOk2Ea)~mwZ zmUK}5>OMCPDGht`xaJt#BJ)kT-&<65sx^iv(MzS*-kq$9YIA?>gp$~!s(}mzc!26t zh~5gN5sk)W+^G+PyabgT=ro(4o>3o3{e%JqM6pZ3EJYbVWNwx#Y}o9^-3>4Q z#~HsWox$jgn$P|w$MM`G0!y56#+^C${XXZM=bU@?kH3ET4ZtJpGORe_B&fMf&*65a z&b`Au_t?oaxaSKmmkCZA!hdMHe9vt!`JA@T7 zs=Te>U51f5Z@hM_Z=2$!I3%0P$mtjm{TE!I7#HQ&w zeo(2*YnYW3NAMAYN)(m(aoKeP4H*o}v-8&tST9kwpm$=+qt z?&Y-BV|31RJu!qLL(CK32yX~$l<-HKl4J3z%|_r6zxgZbdMnpL+)dd}@tKV4I@uD6 zoN-#Oy0(IsoktW1&tb^_A2nSdqId(ZROr~e9wG{Wf-i`tqPs^gbyT+;@v2#`3U6D| zLHTP0+&rW-?9CIpYjT^+x8#0rQ8lR4n4&~4m0o*yvMQ?0{k0QHVxOu8vJ~I}Do+u5 zE0jhw8kcdWJ__;@RB~X@Y=U}5eJuSG;y==WVVl~)&Z68>F-)yI`W*pAsec~(6(hUR zGmII#1LjKaedY(kOCpCw z!iwTGwHhKP3JQNBrcjxX`X>>mRvJo_kc^Q?QzuDgNpd7hBs-nk(t%H~LIS$?;=;Kc zxi7!_iPc1@h0oiVdV@KZSZ!gejq)2j?e{o>FX=`EF?>b+fw588QoGexrmtG;7HKtY iBrk>~btaijUX*C{zkdd@lB;Q5%|6J^W}ju%^xEH~4w`ZR literal 0 HcmV?d00001 diff --git a/classes/nextjournal/markdown/parser2/types/BlockFormula.class b/classes/nextjournal/markdown/parser2/types/BlockFormula.class new file mode 100644 index 0000000000000000000000000000000000000000..13556ed68707e7f61fc8cab3387ff9f8e1d7fd41 GIT binary patch literal 5895 zcmb7Hd0-S*8UH^O+z4dTy|H?}S|xNcUy){{C{&$>eQsBr|9i zy9MT!oM5|Mbi9g|9C3nebSM0%-7XXyFV{Qj=5yhzdDIx7vsq`LV0)$TZ5!YAxq(x( z^WmG0LeV+#+c|+h5ENZ+B-BaUxm*paVt_u?URDfrCC z+Kn?C_K}1TpQHgU4sH=NAhHKB~Mm|d9qsPiG^iE8&=7(ilnG)S*0*6oGs9PVgjV_D1kYyM~}Vj zMR!8`a&c$G856DU_?xbHHc6a^^ILE(IwhJgyBV{vLSSLNGu3>v@MwvYQClrAzg~^R zsVuZ`frMq0)(9-FSBm7Og^MJbjpE}3&Zt);S|p(?TrAOIbe|xwD5e|cv4wRKtwxVA zSW>SS&29@%mXJoXM_@s{W+ja*Tp}^YXl)WWy}*++egfZ&jt@N(59UcqOw!Hah$T6h&+t<+v~V&B@l$xGpN zwCj2k{urC*c~QHegNcYY;PtJz9&Zq6tD|Sf&J^B6Z@ges;QR!%&53Yt##>r&Bi<_U z5-e>&Bi=4?2F_G{@14Y{b@W|csaz=d#lXq+7dRmU*Y`FaRC9?!3hx%!aPrQcsn2D_ z`7+NBmgSs%uIJ<|yhr)*(iYr=_mQ%ib;C#s@2`7n8hZ*KU{chz9wu35U(#+->!95# zs&!)`WIdiJiNxK252-kOSmI`UP!V@4Ho(Ifqq!tD~b;Ufz2 zsM&35PBYu*g`q9895Q`wDd0sU?!cYugS(hfrsg<|5^|u6J+7n1YLD;d9h=d+M?emn zhe11Eb|gNo@_QPekoXwxR?wdkXwpqg;$D^1jra^diuPN9Gm}ZzS5{tr4)>`KKhL$G z(#B4#oN!i4d=Xz#x?kodP|>ZmJc+NGpTEWnn=Z{pnQVQ~ExCbT)HHnq-&COA5@?My zJBjZY$G%H6GZ!SjZ_42Z3<0BB7lL%9)@w1KmZr7(CWW6!{0Ki*=6=e|sICkWKR3o6 zpc9csD)CDb^j|3+lXIs>twcIt?p@Hh;l=y?O@JE&lf2fTG zi9eZN{>)FJJAuSsjkAAa2jnMeossy5QT`{xSeaS6EpDzW&TZxKVW*hFf2qdpEX=Ei z@t+nPry2ZPNsVF_X^8AVQZ#CdqDi1dd2iNnfnBwSWu5YPeR2cQC$|iJa*fa@cLjZN8_*}GygoU?^~njXPYz&xa>(-RP#v7- zA}*6>VJZL6YT?sEypQ_#Kze!loMY&^4J#?F(o%-fW3+T3rN?S%Ev3h6shiRhwX~kn z1}*hc+Nh;VDQ(u$7D`*S)KBShEe%lGrKKTCyR~!$rKf9YFC|+`SxSzUMku*j8lyC> zC7;rjS}IX0Yv}-`tF&}ArRQkrn)LJ2vyS1#L$~Uy3N=i^>-!951K+Nn#LC@Mc;$^~ zp2BMnp=n6$z8A}karOI zk`$&0##s_~yFU(|hLP2{BCaB`T)oLp7pYAA=|$Vr@hVMb0k=R)L2C@+m8 zM?-lebo(obZik^fLbo|3kX$eE)?<(f&X bk0VD(VSjBKQZs*^XjVi25xLpIX%GAl@{Q%M literal 0 HcmV?d00001 diff --git a/classes/nextjournal/markdown/parser2/types/Footnote.class b/classes/nextjournal/markdown/parser2/types/Footnote.class index 8665511306738bf669029dbdbc7bf4d9a47f746e..b575783f3c267a86e24083c4d4fa076d7ffc6ce5 100644 GIT binary patch delta 995 zcmZ9KOH30{6o${G)lO$F+6R?Q5maIXQe(wLyTK??V`2;|h;d_)K^p3mObc;gVptR6 z;%wQNm=NQuiWcA07a}UY@QEN8pNKCMA5p<`XP{VibMJrt|J-xFY4kPv;tmP-D=TnN zTAh1D0feI*4#8m=tZ3TaVQkF8a! zBf5%7DNp8b9lC{j16^{ybPIaK;Wn1Y+0tF}a1R^grNzDQKqwCxC}zl->X@o?cx>9A zFqmDhg+p2`hd#&^rO$AY5(o@(7=Y*E{DMY}PL0aprD=Rcfnou=+7OD=M>)JPr+$mI zQpuk8Vhh8<{efOjb(@0GSZPftT*cv&S@@YjCJF09dP*5Jm9J!})73gvtD3ZonLWQV zu#si6x+})vr&;`qfm9QW)|5u7R0ftM1sfSSFe$r=|B@2YVv~!WfIl*fQ!@M(Usjeu z0|e`)n=mVMxAiNX8Q9}loEf)3MJw1V3X9s|I5xU-EJPI@9=|=&3Q|R3JDkE6hu4+> z280+V+`cr=Im1It(d+cNC@l%e1YDkqyoy_$^I0eMI#;nS%yi{h2q(tpria`#LWnIc za|PHPqv1hnNPw}KZtkaUh%#=N@q|Z)n>gccXL{~ap|C!b90Ar(-yWsR1_!K^OvrId zmY)rw*PU-0q8q}E z{X*%U({4aGBf=@@2gshjc}RbCxj3U{OR1s@irDhG7}6Jj^2J1w)XvG;};O233rAZA%!XjL<{$Hjh%8p1N7-k?Bly3_(VSzKh;yRhuhC)Fl zplu8UBV>95_PbyVZi;Xfu5qv1)X~c2uQwE3gu7O(aR$j-f+3C0OuzwNc^?OydFvj+ zB;Pz@AQ_=5Lszv1zd@hch@nuP$Cmtrj45Y%Abx>oR?z1txK;_%@Pap)!M*PMKYOH7($*DJ<%Rvv|alZ6mVS;7L@5xWb0fD;2W~w3czVB-jWm zR%iO+zN2wp0*fW&8%uO0t`InEOY=(PI|ySva4Tkh2j|jqY{U=8(-Y0_ndTGd_N-wK zsF94DJZ>AI#34^Hn=)G;qbm_T%tbE xvN$Ry*8VbUiL{9*HmX0dQE}ARnVE2gB_Yeowh?tal8mNzBdK{1;vdIM@IH diff --git a/classes/nextjournal/markdown/parser2/types/FootnoteRef.class b/classes/nextjournal/markdown/parser2/types/FootnoteRef.class index 79461aaa1bb6f0beff7bca5842c1b1a5f3e1a747..5c0d2fb5bf271c81d1029e58583f570db0e96cea 100644 GIT binary patch delta 977 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 literal 6444 zcmbVQd0-S*8UH_X8gtj_pXjyc857B`=Boy}fhw3N3~ z5CV(5!cb<=8y)prbtdC_Strw7D*E2&4vHz%37ngxv(d@tMsvQCO`$=cG3Vy|{rku5 zf_V5o%%bD(vBgr+3VDi@|Oycel}Q!OjOe?PCQedbY*)di_Gq9SU^Pb~anZDjT3r)y=Yjc4fdW z`e9evb1tLkZ*UHH1t&P&TvEXtDSxsD2c5C>(L*QcQ8{ph;A9h{<(5HP zhV9~THv=DhIj?+=^**mNQ1YF!n`t6$&J}9?Y%_kYKfw3|2+DGI-YX_pZc|Qeb|>n@XKpSS8VD^i~VZjp#9Us(dY6B++EF9w)Fcq7|xY z3l~c?8_g%MsUn)h3)P~9wGz@OGr$Yt%0UlUc(O!`QQRPKc0@7U8WuK6%rvT-1?ELm z%avx~DH5$l?NWhrB5E~_WMP{`o6+47zf*00S=cGjZj^V$U1b0&ZD(P(MB1pbvZA*N zccX=;O3X5<`vm4h+%-*V;b{`HjnXsXN~U)$JX2zhQ5uLBhH4f)z$|1X<{G^NEc=K> z>P0)J7 zo%FUkMJybaINRtxD_+c@;bP(066YAr=O)G=I&&;MPvTs2;stSR72RMIS-4hWk|`z6rW|=)6K=%>V^%e9LXyIVYj(|( zlEN`2h-pwmo^8WaB(WgHk@yzQKizjJ+$C`wcd96Sgfyx0x^P%_oE}kCN6kAIWG`ND zi3zwFCsjT_CUH0JQKmm3Aj3mb;#1~}ds!}KL`rLD2-`^Ez&|_2L`>Gx4@dGlF^7Mz~sv-m~%= zN&M1W^jEy7c`F1KC#SD3SIqfdp{uh`;y3uMvi3WARvzEF)wk5t+m6!cfKy1}PgEn- z2_o@l{ILlS;4cz?P*OeqW;k?+Balf2!7g!(WwzytzBc<0{8JrxkOz2+ngi+bM5&&j zmQGD&Cx!n?{2TvK7!NW0Aqpe;gF)4kn88w3m7w24De8521b+v}FyW9QWz;Q}R1I(7 zz)lWd)mwEH(IlFcImxTiT=ZEL7*5z--0}a6dC z4{3oWx*AYFfxha8hiNf@3eQV***OCB>Q@N!*6Z7YBirq<-S$AUP)o}N`j(S(hj|nROpqwfor>Zl(;US|L0*Te+|zAL<4WA{yms} zRQiJBSaAn3lpdp{3n@KTOKT`SUQ1n+o~WgDl-6sho6;sNT|#M#mbOybuB9GImuab& z(jG1KQ`)Pg%PBowOZzF=S{kI}XlaO2PD>+{Mz!QoxUXBl zxju!X{42!KhnRr66lSC_$xlj4J(+>=9_B-EZ}|k)#EqwEe3>?W5+{zp>R&dAkKR@> zl&%`uMd*zwoFEt<#Q=O8@1@dB@C)PM?FyV%`*izByIav7xZhlw%iF_nFkK9k?X1HLtm9M0xs z0RGcN@LdLclHg=VaqvUa1OLUDz{#-U;QdpBmmB`qQ-Q07ClRXzywdQ4aqy&6{(j0- zlAHy|JA<}dIe}svc}^vjC-J~B{56RA-xEu4kBYe}K{C0x-@S44B)|VPrQhUt@o=w; zBZmv+lyO>Ms&JnoEJ2KFIXD aJ;}y3)3z~dIyPn}+323Ojk#yGf&T%kwVpu$ diff --git a/classes/nextjournal/markdown/parser2/types__init.class b/classes/nextjournal/markdown/parser2/types__init.class index 63af632c2c53c72a0819a3e467dcf3b7ccb7e7f0..947b276f934aad74ae571478a14baad3fabf6ccc 100644 GIT binary patch delta 262 zcmcbtxKA9z{MTt3^Ranbe4Iz4Up?Y;edN~-* zF)~23!NrlZJ>#0d#F@Y#!~g`0oRjN$OBfk9f98#2WaOWGfL~{F9lzt`Kz`lHZ}`Q|tzEukV delta 286 zcmZ3WdRcWtDWjmdrA2&vVrfZ!JP;UKnpjM3V_eK)XlZJ&S(nL_iP3ekBdhY{N@jlH z^wbjPoc!XaCQSmy?;7s+*Qylv|pU zsEfrY4u*4#3|Q1*7`TaR0uyIEgCGMCFmg=x<}KNLfH#hDau2`mWN&^)M#0I7LOPRo u@~chu6_92W0`t@b92tedtf@ej9GJx{=*TD!W)%WiT42_FAWIv_ss{i!W>|6n diff --git a/src/nextjournal/markdown/commonmark.clj b/src/nextjournal/markdown/commonmark.clj index 377e07c..641260f 100644 --- a/src/nextjournal/markdown/commonmark.clj +++ b/src/nextjournal/markdown/commonmark.clj @@ -31,8 +31,7 @@ HardLineBreak Image) ;; custom types - (nextjournal.markdown.parser2.types InlineFormula - Footnote))) + (nextjournal.markdown.parser2.types InlineFormula BlockFormula Footnote))) (set! *warn-on-reflection* true) ;; TODO: @@ -153,10 +152,10 @@ SoftLineBreak (swap! !loc z/append-child {:type :softbreak}) HardLineBreak (swap! !loc z/append-child {:type :hardbreak}) TaskListItemMarker (swap! !loc handle-todo-list node) - InlineFormula (swap! !loc z/append-child {:type :formula - :text (.getLiteral ^InlineFormula node)}) + InlineFormula (swap! !loc z/append-child {:type :formula :text (.getLiteral ^InlineFormula node)}) + BlockFormula (swap! !loc z/append-child {:type :block-formula :text (.getLiteral ^BlockFormula node)}) - LinkReferenceDefinition :ignore #_ (prn :link-ref node) + LinkReferenceDefinition :ignore #_(prn :link-ref node) (if (get-method open-node (class node)) (with-tight-list node diff --git a/src/nextjournal/markdown/parser2/formulas.clj b/src/nextjournal/markdown/parser2/formulas.clj index e2758ba..f82f527 100644 --- a/src/nextjournal/markdown/parser2/formulas.clj +++ b/src/nextjournal/markdown/parser2/formulas.clj @@ -1,9 +1,13 @@ (ns nextjournal.markdown.parser2.formulas - (:import (nextjournal.markdown.parser2.types InlineFormula) - (org.commonmark.node Node) + (:import (nextjournal.markdown.parser2.types InlineFormula BlockFormula) (org.commonmark.internal InlineParserImpl) (org.commonmark.internal.inline InlineContentParser InlineParserState ParsedInline) - (org.commonmark.parser InlineParserFactory Parser Parser$ParserExtension Parser$Builder))) + (org.commonmark.parser InlineParserFactory Parser$ParserExtension Parser$Builder SourceLine) + (org.commonmark.parser.block AbstractBlockParser BlockContinue BlockParserFactory BlockStart ParserState BlockParser))) + +(set! *warn-on-reflection* true) + +(def block-formula-delimiter-regex (re-pattern "^\\$\\$")) (defn inline-formula-parser [] (proxy [InlineContentParser] [] @@ -18,22 +22,58 @@ dollars-close (.matchMultiple scanner \$)] (if (= dollars-open dollars-close) (let [^String source (.getContent (.getSource scanner after-opening before-closing))] - (prn :source source) (ParsedInline/of (new InlineFormula source) (.position scanner))))) (ParsedInline/none)))))) +(def inline-parser-factory + (proxy [InlineParserFactory] [] + (create [ctx] + (.addInlineParser ^InlineParserImpl (new InlineParserImpl ctx) + \$ (list (inline-formula-parser)))))) + +(def block-parser + (let [block-formula (new BlockFormula "formula text")] + (proxy [AbstractBlockParser] [] + (isContainer [] false) + (canContain [_other] false) + (getBlock [] block-formula) + (tryContinue [^ParserState state] + (let [non-space (.getNextNonSpaceIndex state)] + ;; ends at the next delimiter + (if (.isBlank state) + (BlockContinue/finished) + (BlockContinue/atIndex non-space))))))) + +(def block-parser-factory + (proxy [BlockParserFactory] [] + (tryStart [^ParserState state _matchedBlockParser] + (if (<= 4 (.getIndent state)) + (BlockStart/none) + (let [^SourceLine line (.getLine state) + line-content (.getContent line) + next-non-space (.getNextNonSpaceIndex state) + candidate-content (subs line-content next-non-space) + m (re-matcher block-formula-delimiter-regex candidate-content)] + (if (re-find m) + (let [block-index (+ next-non-space (.end m)) + ^BlockParser bp block-parser] + (.atIndex (BlockStart/of (into-array [bp])) + block-index)) + (BlockStart/none))))))) + (defn extension [] (proxy [Object Parser$ParserExtension] [] (extend [^Parser$Builder pb] - (.inlineParserFactory pb (proxy [InlineParserFactory] [] - (create [ctx] - (.addInlineParser (new InlineParserImpl ctx) - \$ (list (inline-formula-parser))))))))) + (.inlineParserFactory pb inline-parser-factory) + (.customBlockParserFactory pb block-parser-factory)))) (comment (nextjournal.markdown.commonmark/parse " # Ok Aloha, that costs + + $$\\bigoplus$$ + * a $\\int_a^b\\phi(t)dt$ with discount * and what")) diff --git a/src/nextjournal/markdown/parser2/types.clj b/src/nextjournal/markdown/parser2/types.clj index 3fda76d..9a60c9d 100644 --- a/src/nextjournal/markdown/parser2/types.clj +++ b/src/nextjournal/markdown/parser2/types.clj @@ -9,14 +9,23 @@ :constructors {[String] []} :init init :state state - :implements [org.commonmark.node.Delimited] :methods [[getLiteral [] String]] :prefix "inline-formula-") (defn inline-formula-init [lit] [[] (ref {:literal lit})]) (defn inline-formula-getLiteral [this] (:literal @(.state this))) -(defn inline-formula-getClosingDelimiter [this] "$") -(defn inline-formula-getOpeningDelimiter [this] "$") + +(gen-class + :name nextjournal.markdown.parser2.types.BlockFormula + :extends org.commonmark.node.CustomBlock + :constructors {[String] []} + :init init + :state state + :methods [[getLiteral [] String]] + :prefix "block-formula-") + +(defn block-formula-init [lit] [[] (ref {:literal lit})]) +(defn block-formula-getLiteral [this] (:literal @(.state this))) (gen-class :name nextjournal.markdown.parser2.types.Footnote From 99ae04858b5cabc638628f69f81dc3000d7b9d87 Mon Sep 17 00:00:00 2001 From: Andrea Amantini Date: Wed, 10 Apr 2024 17:52:25 +0200 Subject: [PATCH 16/83] Cleanup --- src/nextjournal/markdown/parser2/formulas.clj | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/nextjournal/markdown/parser2/formulas.clj b/src/nextjournal/markdown/parser2/formulas.clj index f82f527..1c580f4 100644 --- a/src/nextjournal/markdown/parser2/formulas.clj +++ b/src/nextjournal/markdown/parser2/formulas.clj @@ -31,7 +31,7 @@ (.addInlineParser ^InlineParserImpl (new InlineParserImpl ctx) \$ (list (inline-formula-parser)))))) -(def block-parser +(def ^BlockParser block-parser (let [block-formula (new BlockFormula "formula text")] (proxy [AbstractBlockParser] [] (isContainer [] false) @@ -55,10 +55,8 @@ candidate-content (subs line-content next-non-space) m (re-matcher block-formula-delimiter-regex candidate-content)] (if (re-find m) - (let [block-index (+ next-non-space (.end m)) - ^BlockParser bp block-parser] - (.atIndex (BlockStart/of (into-array [bp])) - block-index)) + (.atIndex (BlockStart/of (into-array [block-parser])) + (+ next-non-space (.end m))) (BlockStart/none))))))) (defn extension [] @@ -73,7 +71,9 @@ # Ok Aloha, that costs - $$\\bigoplus$$ + $$ + \\bigoplus + $$ * a $\\int_a^b\\phi(t)dt$ with discount * and what")) From fe4ba1c7212f7f98302ba78324e7a895f70bc775 Mon Sep 17 00:00:00 2001 From: Andrea Amantini Date: Thu, 2 May 2024 12:30:07 +0200 Subject: [PATCH 17/83] Use new commonmark custom inline parsing --- deps.edn | 4 +- src/nextjournal/markdown/parser2/formulas.clj | 41 ++++++++----------- 2 files changed, 19 insertions(+), 26 deletions(-) diff --git a/deps.edn b/deps.edn index 7218ae8..b4aa01f 100644 --- a/deps.edn +++ b/deps.edn @@ -5,8 +5,8 @@ ;; commonmark ;; org.commonmark/commonmark {:mvn/version "0.22.0"} - ;; temporary fork - com.github.nextjournal/commonmark-java {:mvn/version "4641654"} + ;; use temporary jitpack commit until release + com.github.commonmark/commonmark-java {:mvn/version "3733963"} org.commonmark/commonmark-ext-task-list-items {:mvn/version "0.22.0"}} :mvn/repos {"jitpack.io" {:url "https://jitpack.io"}} diff --git a/src/nextjournal/markdown/parser2/formulas.clj b/src/nextjournal/markdown/parser2/formulas.clj index 1c580f4..64038b7 100644 --- a/src/nextjournal/markdown/parser2/formulas.clj +++ b/src/nextjournal/markdown/parser2/formulas.clj @@ -1,8 +1,8 @@ (ns nextjournal.markdown.parser2.formulas - (:import (nextjournal.markdown.parser2.types InlineFormula BlockFormula) - (org.commonmark.internal InlineParserImpl) - (org.commonmark.internal.inline InlineContentParser InlineParserState ParsedInline) - (org.commonmark.parser InlineParserFactory Parser$ParserExtension Parser$Builder SourceLine) + (:import (java.util Set) + (nextjournal.markdown.parser2.types InlineFormula BlockFormula) + (org.commonmark.parser Parser$ParserExtension Parser$Builder SourceLine) + (org.commonmark.parser.beta InlineContentParser InlineContentParserFactory ParsedInline InlineParserState) (org.commonmark.parser.block AbstractBlockParser BlockContinue BlockParserFactory BlockStart ParserState BlockParser))) (set! *warn-on-reflection* true) @@ -12,24 +12,15 @@ (defn inline-formula-parser [] (proxy [InlineContentParser] [] (tryParse [^InlineParserState parser-state] - (let [scanner (.scanner parser-state) - dollars-open (.matchMultiple scanner \$) - after-opening (.position scanner)] - - (if (< 0 (.find scanner \$)) - (let [before-closing (.position scanner) - dollars-close (.matchMultiple scanner \$)] - (if (= dollars-open dollars-close) - (let [^String source (.getContent (.getSource scanner after-opening before-closing))] - (ParsedInline/of (new InlineFormula source) (.position scanner))))) - (ParsedInline/none)))))) - -(def inline-parser-factory - (proxy [InlineParserFactory] [] - (create [ctx] - (.addInlineParser ^InlineParserImpl (new InlineParserImpl ctx) - \$ (list (inline-formula-parser)))))) + ;; move past opening $ + _ (.next scanner) + open-pos (.position scanner)] + (if (= -1 (.find scanner \$)) + (ParsedInline/none) + (let [^String content (.getContent (.getSource scanner open-pos (.position scanner)))] + (.next scanner) + (ParsedInline/of (new InlineFormula content) (.position scanner)))))))) (def ^BlockParser block-parser (let [block-formula (new BlockFormula "formula text")] @@ -62,14 +53,16 @@ (defn extension [] (proxy [Object Parser$ParserExtension] [] (extend [^Parser$Builder pb] - (.inlineParserFactory pb inline-parser-factory) - (.customBlockParserFactory pb block-parser-factory)))) + (.customBlockParserFactory pb block-parser-factory) + (.customInlineContentParserFactory pb (reify InlineContentParserFactory + (getTriggerCharacters [_] #{\$}) + (create [_] (inline-formula-parser))))))) (comment (nextjournal.markdown.commonmark/parse " # Ok - Aloha, that costs + This is an $\\mathit{inline}$ formula $$ \\bigoplus From 7da275c9ea0326395a505dff4e2cd637b1ba9140 Mon Sep 17 00:00:00 2001 From: Andrea Amantini Date: Thu, 2 May 2024 15:04:50 +0200 Subject: [PATCH 18/83] Parse Block formulas --- .../types$block_formula_getLiteral.class | Bin 1691 -> 1114 bytes .../parser2/types$block_formula_init.class | Bin 1472 -> 1097 bytes .../types$block_formula_setLiteral.class | Bin 0 -> 1155 bytes .../markdown/parser2/types$fn__2719.class | Bin 0 -> 1395 bytes .../markdown/parser2/types$fn__2723.class | Bin 0 -> 1395 bytes .../markdown/parser2/types$fn__4781.class | Bin 0 -> 1395 bytes .../parser2/types$footnote_getLabel.class | Bin 1682 -> 1682 bytes .../parser2/types$footnote_init.class | Bin 1459 -> 1459 bytes .../parser2/types$footnote_ref_getLabel.class | Bin 1686 -> 1686 bytes .../parser2/types$footnote_ref_init.class | Bin 1463 -> 1463 bytes .../types$loading__6803__auto____2717.class | Bin 0 -> 1614 bytes .../types$loading__6803__auto____2721.class | Bin 0 -> 1614 bytes .../types$loading__6803__auto____4779.class | Bin 0 -> 1614 bytes .../markdown/parser2/types/BlockFormula.class | Bin 5895 -> 6223 bytes .../markdown/parser2/types/Footnote.class | Bin 5761 -> 5761 bytes .../markdown/parser2/types/FootnoteRef.class | Bin 5693 -> 5693 bytes .../parser2/types/InlineFormula.class | Bin 5753 -> 5753 bytes .../markdown/parser2/types__init.class | Bin 4768 -> 5201 bytes src/nextjournal/markdown/commonmark.clj | 5 +- src/nextjournal/markdown/parser2/formulas.clj | 65 +++++++++++++----- src/nextjournal/markdown/parser2/types.clj | 12 ++-- test/nextjournal/markdown_test.cljc | 24 +++++++ 22 files changed, 80 insertions(+), 26 deletions(-) create mode 100644 classes/nextjournal/markdown/parser2/types$block_formula_setLiteral.class create mode 100644 classes/nextjournal/markdown/parser2/types$fn__2719.class create mode 100644 classes/nextjournal/markdown/parser2/types$fn__2723.class create mode 100644 classes/nextjournal/markdown/parser2/types$fn__4781.class create mode 100644 classes/nextjournal/markdown/parser2/types$loading__6803__auto____2717.class create mode 100644 classes/nextjournal/markdown/parser2/types$loading__6803__auto____2721.class create mode 100644 classes/nextjournal/markdown/parser2/types$loading__6803__auto____4779.class diff --git a/classes/nextjournal/markdown/parser2/types$block_formula_getLiteral.class b/classes/nextjournal/markdown/parser2/types$block_formula_getLiteral.class index 6d39c239b524350633ed2ee621db60f24b0c648d..9b5a4f171dfe9ff112f4907e2e4a4e6857bf5717 100644 GIT binary patch delta 576 zcmZXROHbQC6ot=q9(EihzKN9b-@N1Gk`;|CC5Z!l|4J; zW%pe}k=hg?#JWGBKL+(WAP{shbMMTYd+s+g-x~fZ>YvBkdjPYTzf|v*6w|TG-rn9c zK`)pkr+DUyY{{^XvR@5%QGm`0UL|w}_vgn7gFzwloa0rBBXNvmej#?v3E?Bp(fVczu>g|uK)O{g z1v-8p@e^$iNM>kL?+n$@`x^riu2>`0t94ce)=?fB4;|GMe-d~R^h#n7LmVl1r)TqC zE|qvs9;ZSL>A>riB*Y#ujJ!an>r$XmAJfNcn0Y|+4HEy;OZdb-5+a~Ee==&u^Mf-J LxrJO_&8+?dz(Zgj literal 1691 zcmbVNZBr9h6n^do*krR78j*sarfO{nN+h*K2~{bQiY#aogi=53Y?e#hWZBDXc0vD1 z|3If-Tb-$3XF7iFk7|2vcEtoT(-~*>?!EWyx%WKhIWPP7KX3m6a0@>&lsx_-Xo%4F zEVr<0`OR%{;1%{Pzs3DxA$YmRTUTqYu$$(N@OMMkGV44roPhh5tAa6%*sf@VJ}mJt{+zv{Ur$uzmG=t}%*EG$WrpYjFbOBj5glL9)>r$hnL&upE6nw&vw1w9S zOml`I(|u&a@=0?DpGwUP!%)|S^i{<$gGT;Wtb>XW0mE>v2Q(cc_)Nn&jGnw>xlFvA zXXtN{vpk83lk`>ij!O;;GIfz*EMjI&Eco?h0&RIVU*)?s?lau!K~o1y)xdYWdg-U0 z@Ur+^!zEm%phOmQTtzyKaeP5WyS(nCQN@=OJ#t^iq*Tu#&yY6F7G*;mglspXEBxhw z@VBE-R7s8ay^b4_-)V-?UY4YmikrmIjupB@aiNE!lig-IL6U_czDi>Tw;1|@=T1w; z`BX+xWKPOd+}5EXtr5C8%9DB9jWbq{flk}Pr>K2P;I_HXcapfrFxcfqWnIMrv9xbd zjBa;Ak0a6nC6=6UCd$G^JkanRmKZK}-G7Qv72h+cZd8y-EYqeLvCc66G4^8%#N!GK ziD8v;BG*m$d!49|A8UAsC&c!m*ycot;dp#4lxezd)m)OCq1v{atJYq;<kCTyoTr z-(#Uxr6y$avLjCnN1F${7S@+u1l(&;OQD!5)G~ks#$=h&YE-5Z%}H6{H1~mW8q}9i zq1^?V8O{CqH%R?X3x+Da2in33q-3;dEmePxrT1T9aO)M${(-S~7|*kn%!R}ut{mZ- zf@epVqW3RQH-E*Lxk-8j^9Wxn*m{jYTG7|v=&l6T={*ePU#b(<4@JctdY;l~+dogX zfQk0dXda?5LSvl9Q+KcR2SNXaB^*EtYw7h_yHPfp8ZH`e|wuY|z~b`msrKqq@5AM2mX4tQu`G pYWZ5enmt~YwW;h(_PF6||Nmc+{{<~?XvNtpGuMlA#aS)C^dCq&tiu2R diff --git a/classes/nextjournal/markdown/parser2/types$block_formula_init.class b/classes/nextjournal/markdown/parser2/types$block_formula_init.class index 0f5d7e94b63726d49d28faece860c94c1ff57e1e..9fbf3b49ec4b43dda5c651cc27ccf3d66becb907 100644 GIT binary patch delta 430 zcmY*U+e!ja6kTT=9Xn%IV`|n^re$iDdC9_8DF`A$`~kBetZ^nJd+iH)kfE>Wr3}h? z2w&@8`h{qpLc{}S!`geTz4jWYpI-j;^Zo&#h`lbqlV+3Mhu4%3b5J?Lh%ihyO#7nK zHnL{jI?o;+SPB*xJWcDyzBIb`shAIoSW=;5nL!&P*E(0GpCrTUT)(zkUSt@i#^lwSf-NWDs_5Iuab%GvZpA(`h&fIh6%uMc&U`LUE{`veBz$BJ;t~2$#A_BU9YajUAch$FOxvk6>sHP-s*iI^i&Y83l&u)s#(wHfsbZN83C9_N zrc>Q&tgnwV3>3R~1?%}Ur~YUrj1w3Mfn!wM<&lAt3`d?AwR_d_)22n3Ee1XFQ2b`u zsb!-^=+j8cIE4&DPr177Y+7MxP!uFE#-MgdtTt=5CE=|2##Z}tI4|QIs1cuCZV*(w zVUeH=MJDaM(D<-?iQekgMiA3tgU^l5;}A9y4n(?Wj>(GQ4skO+K1a?RI5YGuu@vBF9lXFegz z(T4t>IHd2E>xGZ3TP}_yo!b4n}V7A@%=Q90e-M5kOJ=@|j9LHJ+WA*7LHq@E4GO Bfyw{? diff --git a/classes/nextjournal/markdown/parser2/types$block_formula_setLiteral.class b/classes/nextjournal/markdown/parser2/types$block_formula_setLiteral.class new file mode 100644 index 0000000000000000000000000000000000000000..fdedde02c06de56d18368d4bd241dfd7b4401955 GIT binary patch literal 1155 zcmah}T~8B16g|@x+77Egpsx7`q-M6=nQnL9J*-gEA~`|J0Qp8%Gz!ccVNnQp3<>j*n{B;3P&b?W4f zh3iSTkkcQIr8ir*m3de@Q0`I77Bx@mvZbXf>?jz+h-s^4%au7>IE~zTspXj3Qce_M zhIsq_qG>l7deCB#iUPL(}h%p$JbD|DqRSRvI3@hn!Q=Etn-0ON%n!4C+ z$#k0-Vy1FDU8^lIB+6I9+7oWkfPq_agm9Z-;QDS90}Q+&bw!+3l+p}C=^K0)NZ<~~ zAcn4EY?X-e2t$uYJY)=auPalL2R3n0ZWQATV;#~vYTa#YQP9FM<+ePkOP68w-wIT< zYdMYL+Z)5Xhe?hJBuVd%2Lmbe^_+jZjYdSSq%sKmFW-SBb5p8vSmIbjo`T*``;y$0 zEl2LOe1&#J-6l(-tW053W-Wgm7g>^H_C-TVXSHWeTM literal 0 HcmV?d00001 diff --git a/classes/nextjournal/markdown/parser2/types$fn__2719.class b/classes/nextjournal/markdown/parser2/types$fn__2719.class new file mode 100644 index 0000000000000000000000000000000000000000..ec2b43dd45547dc833a4cf265ad757bc7f111a8e GIT binary patch literal 1395 zcmbVMTT|Ll5dIFLV2o8!X=$~!Vii!KL0d1_3sq^g^d^ooeR4uL(qKrO5WM`W7H3-R zL&xX-s7^PDTon6KW)6G4<*?`5v)}ITKR2_xnD4j^u&Q| zR=Al=SSJU(GO?%c?j{$cB_9|=P|=K1)#M3H){BXBrm8EJYUn<6FmyZTd=vq;A z)q2j*5sB`I=z>px7k&m&)ent*p0i|2RTzdM(QHXRl-+nA@+GcVDF(k{=oM>s_c22t zd*#X<*-VKL(c29VZZY&<|J8?n2BFBUE%|86Ff0)P^avQh;Pt~B8R9+Myi5{t+l_mt z=}d~a>pJgIRxWvl$w)iv8xj#Qiu*kX;z2XuoQQ{R!11PYzAevmMyEU{@W{?{l40|P z8{0Xwd;Y;HVzY{h5bU?{V4A3`DB5Ms#LG90D~8Gah%@*Uqg<|91gIi?SDt)p+lM68 z`A{|)7F${7EK}8ssTNL`p6E>_oyQXab9lPt$^J9^rH>MeKffr^qHD8JOvCQBl zX_Wj}VHj@_Z@ezv_@#K`ju`zQ2@YQ2n>#7z4b6v_PB|@Z>I|v>q3s5uBE7<@fHc;w z>x)Y0Lxvcy8U;?zmQ{8BzFN+6b6d`9{HW+fj8qZgY>&F(?E7Vtzs5oBg z)=q?M(bFzui`22COUII&97|#$>jfnSYF4}r+g% z=j*{H1@;i#w`9NM-labZ?$ok}kg)0wHzAfAYiu*Z^q4f(7;Qp}=>9P=?FlHvvVs(r LW~60Fh^_wx%l%9p literal 0 HcmV?d00001 diff --git a/classes/nextjournal/markdown/parser2/types$fn__2723.class b/classes/nextjournal/markdown/parser2/types$fn__2723.class new file mode 100644 index 0000000000000000000000000000000000000000..93ffde848b554e66e219f6b750315eaa6e2267a9 GIT binary patch literal 1395 zcmbVMZBr6a6n-wE;JSvQQj`{nDWF22rHQ?eN@?^ajx&8?mgP!|%dWF5zWl4gnbJNq ze(py#o!u2s(JwJ`IrlkS&V9~3&pCho{`w7I9yx|-jUSp7y>4idny5;~Zb?7T5_^(S z<3=iB9_{hk#Ew=dq!v7z!4s;al@pn4U6V~k*F5NA=(W$sWwpZ4v#e-} z`GTP<65STj1CIbVybPkE?d!WdZ%U>jGYm(fxr($eIq^OgD_l0y3|?8+YG$GEn8BaB zbmg{Wq(zA6?}ZDu7zVEX>cIemQ0C^Qbg-%GrU*a!1Po&6>f!Y)@g8YkmK1T@iF>E* zOo_PbIPXzb4ta*jNGI!S5)mSb7{4IicvHObbMeM)F?vA~9J<6ee^f2%st2#^a+=)G7}Ebk+X+NPdW{tU8LVE_ z7nRV1EHPfuOPro9r)c~`y;|hPmQ+;9Bjl;`WS&(lFzkR;UaXhb4o$ArsIQQu;<%|> zyAiZRPrINcQrnU)ZA)^pEs2G!84TQV?3%Gvs4{0V>Z1Pf;vJcf_JvnB`%s;Fb`jloWWVO$XFdte)Ut+uR`|CG=IMNKWIzP6GM#a=+Emo4v{k(Cc#|~t( z%*}jgu{On6sB7kmP|@H2?2erW9Tj3ryD!Z0)wP8a1v*^T!xSLBM7VDKx3UbeE?#|(k= zr7L%3Ga*7mZ#O)+#n6BCS0DNrgaWs=<)dxGutWsVBVYi7R}XKdi1%>wGD*a3H}0LL zb3w#i*Ljb!a>+AH&9t+=CJ_;%xZi^y9y9|kig@S-9B(?~ZFweBI^{WuM|Pf53|rUS z*v_Hda|5dxn^jnZV84wAvqWW8(P}jlYi}A=43qm2W$-CRsZ_BDP(}JKJ^A*I4+~W1 zL)m0lZe^LVOjR!=S~%4_;p<8o#}fgIc*@Y3=O*9tW0|2hq8W0Y=jSywSC06x!r&!o z6#ZCb7;h18v@YIgO}tS@jDC;=2QTr>oRo5g=EEzeoEA5AhQ$BSb^}q7USmx_66;s> zMJ4nhMU2;sJf~+%t2+NsDdo7iBj+^o2pQ@;g{M>-47p&P=PHGbV~gu$>MKZ894~ci zCqlO9X&16Z>R8gHV@XbqC9#n8f)WEYE8Y?sCCkWmMt-9EJ8c*?>ATBuQp?%`puK(c zvvUy;uA=V;hAt4SB2?duoMX&`DkjKL#q>EMUVLkW3lcv&v>mpO)-bIJT8!?mhaYh; z@jJs@^Pf#3^9{~lC};bV48#J`8I~?EaEd+x&*~sVAW;V+1fJKy1Pi=8!^Q>PoMO5? zUk|n@u!rcrBl|V;KKV&-rTn!GX@3*GX^do764)~AeLq@n>>}(4k&+x)g4I6u;p_bD;w$< LS(zGhX}JObXjBWD delta 62 zcmbQnJB@b%E2GI|M%H>!69xtb69z6I764)~AeLq@nLL%%4k&+x)g4I6u;p_bDjVt; LS(zGgX}JObWuyy) diff --git a/classes/nextjournal/markdown/parser2/types$footnote_ref_init.class b/classes/nextjournal/markdown/parser2/types$footnote_ref_init.class index 29ba01b7984352ce1cbe0a1e719ed02a7a42e29d..100636c6152b31daa09615ccc0780d3a771df0bb 100644 GIT binary patch delta 52 zcmdnay`6hQIt!!e22%!k2Ghy=SnPmee_8B-q%CV6kEx-up^mYYsUeq^ FD*#=33`GC{ delta 52 zcmdnay`6hQIt!!m4Q z#~HsWox#`{HJ|-Wj^nvW1eQ4Cj5~Ag`+d$i&pG$(AAi014ZtJpGORe_B&fMf&*65a z&b`Au_t?oaxaSKmmkCZA!hdMHe9v4}WZ zo&8Lq)O5_iavcRxhIj{J&a`U`gUgm<1uG2E)bx&qK`1H)Fhm=cbL1WhhTExWy~dAt z7iqIv6K0TSxOsg|fyQtrq_*hR89FbwUB zplEa7XBZ2q?kv*L+qk1*1a}!mFKy^-D!9jRYIKpro;ZMZwb%0{6ILt25*p#B;Hr?9zI~W7t&Gi zeb=;jU>yks4~fyxF43Z3lGtiA{e$fTPw>6xmLp?Mc1)zgIU*rlUhunLFk0tD5hRM{w zk#iZNUhZg6u{4YYJYl%ia2sLgG~{ItPGOm0AULqd+eAMs<;Ep00l3G!Y7>pm$lhhs z?&Y-BV|31RJu!qLL(CK33U3H&l<-HKl4I$r%|_r6zxgZbdMnpL+)dff@VSiZI@uD6 zoN-#Oy0(HBoktW1&tb^_A2nSdqId%@Rp{8f9wG{Wf-i}uqPs^gbyT+;@v>R33U6D| zLHTP0+&rW-?9CIpYjT^+x8#0rQ8lR4n4&~4m0o*yvMQ?0{k0QHVxOu8vJ~I}Do+u5 zE0jhw8kcdWJ__;@RB~X@Y=U}5eJuSm;y=-VVVl~)&Z68>F-)yI`aJaWx{ga4OD-9(|NXAH{sgoqLBsr2NBs-nk(t%I0LIS$?{KB~$ zxi7!_iPc1@g)iEedW|`jSZ!gejq+z52}Kz{WNwx#Y}o9^-3>4Q z#~HsWox#`{HJ|-Wj^nvW1eQ4Cj5~Ag`+d$i&pG$(AAi014ZtJpGORe_B&fMf&*65a z&b`Au_t?oaxaSKmn+Z-E!hdMHe9vM(QGwm9~;Iidd!3sk(HNB%@5Q>Tc4AF+=9Jz;r;dW};sPQA- zMcS;^gc;-*ZeCwgpfTJDsV%tmhGh#+!3_d5HuI}%C5D6%I<&*RoQ9jY6~`zN3`6@O zDA?Th8OB1YJBxJmHtwhx!Ci*YOB*_y3hpu7_~*Vs6bX-EydR~zMOgRowu*7QLs%iB zO4|zFWf-aR#w*AAt|?xKQ!*%<`lg?Y>99ZRTf*}#KM+o^!5gF_iT72!hYuL;g>>Y7 z-!&~BSVuy^Lt-?vOSCAMB(@q&|6u#T6MXNv<;a+m9TTar&MQzk8O9W*RZJmGY?`j) z2bIdahFM8*1RpV|L{W(!ms~f{kioD#JAd7P^&(|U_7Xwwi(J0wkb95tv4nlhFq!%{ zaxP=k%N-3WmWHu_Ck(e5ZX@iRhMdg7DJ(M#1P2y*o9Kt7+_=Og0QZmI%-&sc-gF1g|{u~ zp!_Wd+&rW-?9CH~YjT^+x8#0rQ7u!cF-4JHD!umZWK~p~`)enZ#6DFG=oH`qDo+u5 zE0jhw8kcdWJ__;@RB}+J*#z~B`dIpB#DAgz!#1^pokh8&VwhTa^m_t~QvWRWD@Jys zXBaE*4y4cVRvY8zm?*dKpp6e(m^s7TIrKIb&an6ko>NVzAVzq^>HcGFt*za)!U(t;SV)&Z+gYrgxOYK%)nZ9bFTcp)= iIe9TGsxwJFc~PR(|Na@sO0K32Rezw*>Q8kwz4kYG_L^$| literal 0 HcmV?d00001 diff --git a/classes/nextjournal/markdown/parser2/types$loading__6803__auto____4779.class b/classes/nextjournal/markdown/parser2/types$loading__6803__auto____4779.class new file mode 100644 index 0000000000000000000000000000000000000000..89f3102574b6b3d0b1d09c15811ed537d0881ce8 GIT binary patch literal 1614 zcmbVNZBrXn6n<_(Sh6go4Q(w|G};zIKtci*Xb_tQqS&R-gwis8$lNSf*s$4+yBl8q zk28K%I)kw@YCij$9LIB$2rO~N8F%K~_xqf4o^$TmKmL068-RK2GOXC*#IHIH*XCBL z#@)j`=h#lwx$6lxlk!jN!h2{re9yG^%jL(5vvcJ#Z}?7`zWIfPB?XM(u3yX>8~(^6O%g{`k|=k!vJlV_K|Za7;Yyf^(sH& z9i+`lRTzGj;pX)<1scPhfZDuMtDBZ^72F^|eKWVZR%D3jfkQjo&1$%bTTu)n#xSri z{Jh0Ik6|RBy1ht8Z{v=NA>3sczOQT*3FAnYN5M*)f&~>bwG#m0?U^QpE(4#HQic zo?kA{YM7Q3hwv$bN)#3OanW&n4Ji!Dv$NL?ST9hvWG)fXJ(0^5Y;tcNpGnxq4C9G^ zBj++k-Q3ZjVsQ|2SYo(Ucj`gsG-PECPGFg#&p$B9+gL9w<;Ep00XWCJViAo`$=+qd z>gKf8Wpu`HTrq$=L&O!|3U>f&l<-HKl4J3z%_ZL@ezRB9byu#1xRbJ9;wu@~b+RQ8 zxzcH^;#dlvw;z!&T$>^Lf7EnrP@!YacFw;zgrY5$?96 zgYviJbK{WGuse_Gj=?Q5-<12^MYTkw#t;R1sr1@AlT}e^?5~|r5_?oNkfs3lQF#i{ zTcI?f(Ws0&^3CReFG4{o jDSk05s8jKD{Gvpw|NS$Nm0V5gYWhKXI{hTACfEK3)IFMd literal 0 HcmV?d00001 diff --git a/classes/nextjournal/markdown/parser2/types/BlockFormula.class b/classes/nextjournal/markdown/parser2/types/BlockFormula.class index 13556ed68707e7f61fc8cab3387ff9f8e1d7fd41..4799ef131aba01e9728be8329b5aad40bad7d53e 100644 GIT binary patch literal 6223 zcmbVP33we<75;CNbSBA7le}~)0ZOtZN?%4tgcuwes0<%OA^mSGn1OCF9d2eKFtLKlG@|FR{ zaE9j}$c}j9EzU@X@{D2*7CwIb4EmommySbiGC!Y&nwUI_YIXhza7c93JzHO$ry-r~J zRz7^wTJY`Jdz%8UKkyy*K&X?ka=92QGC)4XFCzo3!hlr_lCHEmE>RS8+xtD=4tF<} z+`QwCMNihqh+T+IGmkJ*r)?%vX|EfIBsaop8nud}Jw$AXwkUGHE1**hmjXNTELuE7(ivmoQjTV& zyF+u6j$Y0q6PIzcD9wINGnri`1~^)k<`BdDw5uxTOzh^!D4l0$Iw})QJd>kM>Fm{F zL1c%lMkXwd`ATg>yOB6+P1qa@l->b`wzOL^mrXbv3zf>4b`?>En;7R3EzdZ|^0XxNr}+#ZsZ*`GK9=QJ~fsIG(%ZkZ4FG7}P$F*}NCaG2?eGe;i=b-TKgAKSDA0mcguhiKL+`_<~@+?%IPjlcUH9BEgBcqt&N{+VB*%D<>w$~{J za>J+aX|drm42_9grdoc2qf6SU_EkED_-5eq9QWXJ0`xvQ1%bvzhvSRt%a_qsa$E^lq=1Wa-~^Ot~3eCm1aG;(jX^S z8q(xSBbZ!iz>+HsQF5h0Nv<>r$(1G@xzaczR~lI4N`r`8Y08i*4H0ss89}Zz2hiFo zx)iNTXf8ej?etgV0(yFw&Lw^x%$${Z{1L3U9p{p?T1sn3S}Ub>Bt2P5>q&a5ls1yI zNlF)z)GejWByE+_MI>D;rCyS@OR0~fol@FG(x8+sCuxtAt{~}IQrbt-u#|En?U&Lh zNe88rC&`skfh1o_0Z9{5Iz-a5rF0ER&y&)%B)w2d*JWOknR5iM8oEs$nu!)35-~>C zE2!8sg>!dLtbR8j6XA6;c5H2HYgq+inGXnW2j?Tex9GiqWv|
  • P8VcZNZ-W(wEo;0xm*Igb0M@y#ewzI{viK3n4Z9Hjf) zB3cObY@PEpI)0_w{9aYgsrQ$WRS|!T%jYk zl-Z_QA`|`(6>+I>9j+xhXa>^hSf}GAxsEdDPu1uUnL}fh4t|n46@mZdWZ*QL>0GbZ zJ+H*|-z#zwl~Y@EvD$)67(yu!f2yYCt4Bl_)WghUkfIwo6A((j7(#YpO;! zg&><(PWM5oucB41ox+9H!Ks!s4~d4~##%(jKcS6F3{Xj7tt=BBU?{BN=S^W$x6ziY Q;Rz%2PiUl{IFd&27={W(Pyhe` literal 5895 zcmb7Hd0-S*8UH^O+z4dTy|H?}S|xNcUy){{C{&$>eQsBr|9i zy9MT!oM5|Mbi9g|9C3nebSM0%-7XXyFV{Qj=5yhzdDIx7vsq`LV0)$TZ5!YAxq(x( z^WmG0LeV+#+c|+h5ENZ+B-BaUxm*paVt_u?URDfrCC z+Kn?C_K}1TpQHgU4sH=NAhHKB~Mm|d9qsPiG^iE8&=7(ilnG)S*0*6oGs9PVgjV_D1kYyM~}Vj zMR!8`a&c$G856DU_?xbHHc6a^^ILE(IwhJgyBV{vLSSLNGu3>v@MwvYQClrAzg~^R zsVuZ`frMq0)(9-FSBm7Og^MJbjpE}3&Zt);S|p(?TrAOIbe|xwD5e|cv4wRKtwxVA zSW>SS&29@%mXJoXM_@s{W+ja*Tp}^YXl)WWy}*++egfZ&jt@N(59UcqOw!Hah$T6h&+t<+v~V&B@l$xGpN zwCj2k{urC*c~QHegNcYY;PtJz9&Zq6tD|Sf&J^B6Z@ges;QR!%&53Yt##>r&Bi<_U z5-e>&Bi=4?2F_G{@14Y{b@W|csaz=d#lXq+7dRmU*Y`FaRC9?!3hx%!aPrQcsn2D_ z`7+NBmgSs%uIJ<|yhr)*(iYr=_mQ%ib;C#s@2`7n8hZ*KU{chz9wu35U(#+->!95# zs&!)`WIdiJiNxK252-kOSmI`UP!V@4Ho(Ifqq!tD~b;Ufz2 zsM&35PBYu*g`q9895Q`wDd0sU?!cYugS(hfrsg<|5^|u6J+7n1YLD;d9h=d+M?emn zhe11Eb|gNo@_QPekoXwxR?wdkXwpqg;$D^1jra^diuPN9Gm}ZzS5{tr4)>`KKhL$G z(#B4#oN!i4d=Xz#x?kodP|>ZmJc+NGpTEWnn=Z{pnQVQ~ExCbT)HHnq-&COA5@?My zJBjZY$G%H6GZ!SjZ_42Z3<0BB7lL%9)@w1KmZr7(CWW6!{0Ki*=6=e|sICkWKR3o6 zpc9csD)CDb^j|3+lXIs>twcIt?p@Hh;l=y?O@JE&lf2fTG zi9eZN{>)FJJAuSsjkAAa2jnMeossy5QT`{xSeaS6EpDzW&TZxKVW*hFf2qdpEX=Ei z@t+nPry2ZPNsVF_X^8AVQZ#CdqDi1dd2iNnfnBwSWu5YPeR2cQC$|iJa*fa@cLjZN8_*}GygoU?^~njXPYz&xa>(-RP#v7- zA}*6>VJZL6YT?sEypQ_#Kze!loMY&^4J#?F(o%-fW3+T3rN?S%Ev3h6shiRhwX~kn z1}*hc+Nh;VDQ(u$7D`*S)KBShEe%lGrKKTCyR~!$rKf9YFC|+`SxSzUMku*j8lyC> zC7;rjS}IX0Yv}-`tF&}ArRQkrn)LJ2vyS1#L$~Uy3N=i^>-!951K+Nn#LC@Mc;$^~ zp2BMnp=n6$z8A}karOI zk`$&0##s_~yFU(|hLP2{BCaB`T)oLp7pYAA=|$Vr@hVMb0k=R)L2C@+m8 zM?-lebo(obZik^fLbo|3kX$eE)?<(f&X bk0VD(VSjBKQZs*^XjVi25xLpIX%GAl@{Q%M diff --git a/classes/nextjournal/markdown/parser2/types/Footnote.class b/classes/nextjournal/markdown/parser2/types/Footnote.class index b575783f3c267a86e24083c4d4fa076d7ffc6ce5..409eec0a97843fc46f90e66a35323a989a0fd8fd 100644 GIT binary patch delta 759 zcmYk2OK1~O6o$`jYBMvrP10#nH(C`c)k=hPVH+qyQCw9~M2mvZ)K2SQn1snh6b0!< z7YYhz=|Ws}ArY}^P^p?2ty-&AO?}2^tYYh{J}9m{chaU^&D`^!^Pm5Gy@B4qS+9hL z6aM(wE zp_9Y0m}YcMpEOa-^c8g_)bx|XclaS(eo>!p#5L1u?Y1s3xm+rl%bSUF_+^RAIH+~=*woclPQao6Kf&obQZX=K;&ly{+nIOFQ-pq%Xksl6cu zw=k_PaAtuC&bY-ltK2Cm1QwH?#>(M~@URc$_J$QHc!U$4S_i?!f*N8u;mtqYC+)tGcwnG5}~FX+l`YHf~aDyDum;{#Vm>Ed?EHv YOklUagJp1P)|^$$m@_8@UsBWYA1uT3H2?qr delta 781 zcmYk2NlX)A6vy8Og;^;b+rf(nO-y77nyOL8M3YA1$?c+?Oel2F#%9_~TcZ~f&YINt zuEr}dUX0W>Y7|gJtP7&n4N(ydD!4B(dhvaoQans1@BNqW`+j|GeQjqwBF>2GaFe(f zyQPiFc@+jABZCWa=$D$s3viJSmvC6xuzrw%+8v8U&5*Sx6it~b48u_whTy6Sm*EOG zjxea|iN-9_Mj_2NH_$DvmQ}b3c|P944ta%m2k!D=9OLp*al#qyV_IId_8}Cw@`!;F zu@a`84E82XTZJc1{3(O#logFw2UM7Z25xSAC=hQ)pW#k=(LB5)G^H z*-3q2P(#Ajh+S5`Im&m6#BDQfTH#XUr*nZ{37S)@8yO@(^)cv&3Kz${WItY1%w4rwBNn^BL^f!iG)a zEIFoVuCFB4xZ4+yru#wcY{|h)v1yvRi8uN+0~@_{#nXv13Z8(JEjiy8omp}cWIW{! zNb@D-Q&E{Gg(%~QzL@!1&Jbk`|JU}TtPo~Ybpz*ojVyyf>RmYT5BIPvcIiDVkAJ=G R6|B1SD8a=9V&Sjr`Ue-y?Z*HB diff --git a/classes/nextjournal/markdown/parser2/types/FootnoteRef.class b/classes/nextjournal/markdown/parser2/types/FootnoteRef.class index 5c0d2fb5bf271c81d1029e58583f570db0e96cea..413522a66c28e9df499be1aadbfec10024d89621 100644 GIT binary patch delta 811 zcmYjOOHUJF6up-sotch(*|Je1F%T4y1Y%Mqanp#bP%$QSWkQhwCpObMof>zVxO8FS z> zZTq!IzYNz3$aPAHfv#}`xi1=xsA0V)97(7$Ou%soa&TLQn{dmbxQighSs-kvx+%kb zNLkef2rKqQqB_5rf)iF{npR8ojgR25b(ul%n$bO`q3MG`lYe~)Q;o~;v;aS&0jXv0 zEWEIKUn0~b^oXV(kYNtiS*6zqcDB7!JZh&B9mLv^)5B*wG8yMVi(UmM zOTsus_3n0j$fSPfE^h1K!;PE_&AJtQ!a$vkgP?#%!RJdiPJ)I!3LWv*TGQYhbu#4} zrd(^|_0z;Mx9`htIRbLIDsy}+BOC%9^S4*Qmy#Qv)9Y2e4r6*Ml5-q%{%)qD4zbMAfTyphI{#&ed3W<49|lxLS$ z>NA{jKXylM&ODd-auH?6Ny@kjl&7ixkV9AldQsRNQ?3gwac}2lWisX711)EF9>L9;oyH+Yg9yiD_fW#ybW9rmuP z7)`=h0;I0cniSlmJ(?zWy5Y<=WWhLX^tIpwS-zTb&Yy-Wb-bGs^9Rs?Psay^`DdBV zu~U|tk4u{zKke}A_$;U6(8&tw_)=6jO{W>j@Lf|nc&UqraOUI-HscI61!~{wM|Kc*#Uir$n#@hv<*LNc$~l bE)gMBYdx5zRG_5{ksnj-!ZNm;(f0lWp~d!N diff --git a/classes/nextjournal/markdown/parser2/types/InlineFormula.class b/classes/nextjournal/markdown/parser2/types/InlineFormula.class index 4726284396ca7ac5cac3c30e123d83854a781cd1..3176efb9c6bbca0681a12f9e6d8617d8e47f26ef 100644 GIT binary patch delta 741 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 Z`}A?nsl{skdx~T(X-YxGVbWA3@ITX9_{#tQ delta 1884 zcmb7^d2AF_9LK+JubCZYyUP^XT51)VLiwYtw1q&hCZ&nmfc&#f$Z8A>%Wj!6o!#s~ zJQ6oVs2843s(2!ZhfpAwoEg$G+*MG%jONcyu3;%ajloo&1VUf>`LAyOp&i)aBD`rkrHt&PY9FP z^?be1D&B~jB-{Yb2ZR}HBR?jzRo{YJCDdROLm;BZJ2S~>P*;tPV9VKtfZO>pvBG~R zgQzAubS;&p_3q}~;-Z=NV2icVRtBf8rA2IGP)^8i&m{DyfbIM*abfiiJRsqIJV=mE zb&VR#q%}R*l1!=>rvyCA&-XTpkK!>2kD!-t^q$W8c-}i_<_>)OTH75!FS!$&XAZt9YAA9*Lp{U!2%lNSe9qwiS9hzfrl@U)`G6d(`3hf4_!8eR zOg^Fgt?{k|DW~py$EW$un2jHBM8fy@QHFbnbCfDe#1rkSl2LW#Ld{sI867DZzgS)w zzw*m{4b+&tZ&SGwUMmR7S2KIM{^!6;oVpr-U&UAb90E3 zJvm}elRZOr#uxi5&dFgddDo42yUBZnrB9%X}aor#!?` zTwy0uHk-IN6n43Wr}t5~iHAZaawc|$!fvKKS%~li{3iB=!a|lQPZunrt6&ItnDT7F z5D=8-DDlMtdI8~HvT=)w;a(|@3k=~#(TM*axFv*p&BnDC!;PVCN)g;BTGndpQo;?| zxC@Kn#!y%Fe{mLVInmy*Y1vpY+*`$)Ib%FHjd1VSxcJGmti4snP**n|T#|6_*|>{N z#@VzHaoN#3vvEAQO9}UZjayp`S6o~+&@>+0I_rdkZj=x0V~b`wzScu~;A7=e6JO-< kt%;vZ{A}X4?GWg@ua{y formula-body + (str/ends-with? formula-body "$$") + (subs 0 (- (count formula-body) 2)))))) (tryContinue [^ParserState state] (let [non-space (.getNextNonSpaceIndex state)] - ;; ends at the next delimiter - (if (.isBlank state) + (if (close-block-formula? state !lines) (BlockContinue/finished) (BlockContinue/atIndex non-space))))))) @@ -40,13 +69,10 @@ (tryStart [^ParserState state _matchedBlockParser] (if (<= 4 (.getIndent state)) (BlockStart/none) - (let [^SourceLine line (.getLine state) - line-content (.getContent line) - next-non-space (.getNextNonSpaceIndex state) - candidate-content (subs line-content next-non-space) - m (re-matcher block-formula-delimiter-regex candidate-content)] + (let [next-non-space (.getNextNonSpaceIndex state) + m (block-formula-delimiter-matcher state)] (if (re-find m) - (.atIndex (BlockStart/of (into-array [block-parser])) + (.atIndex (BlockStart/of (into-array [(block-parser)])) (+ next-non-space (.end m))) (BlockStart/none))))))) @@ -59,14 +85,17 @@ (create [_] (inline-formula-parser))))))) (comment - + (class (re-matcher #"" "")) (nextjournal.markdown.commonmark/parse " - # Ok - This is an $\\mathit{inline}$ formula +# Title + +This is an $\\mathit{inline}$ formula - $$ - \\bigoplus - $$ +$$ +\\begin{equation} +\\dfrac{1}{128\\pi^{2}} +\\end{equation} +$$ - * a $\\int_a^b\\phi(t)dt$ with discount - * and what")) +* a $\\int_a^b\\phi(t)dt$ with discount +* and what")) diff --git a/src/nextjournal/markdown/parser2/types.clj b/src/nextjournal/markdown/parser2/types.clj index 9a60c9d..0652ef9 100644 --- a/src/nextjournal/markdown/parser2/types.clj +++ b/src/nextjournal/markdown/parser2/types.clj @@ -18,14 +18,16 @@ (gen-class :name nextjournal.markdown.parser2.types.BlockFormula :extends org.commonmark.node.CustomBlock - :constructors {[String] []} + :constructors {[] []} :init init :state state - :methods [[getLiteral [] String]] - :prefix "block-formula-") + :prefix "block-formula-" + :methods [[getLiteral [] String] + [setLiteral [String] String]]) -(defn block-formula-init [lit] [[] (ref {:literal lit})]) -(defn block-formula-getLiteral [this] (:literal @(.state this))) +(defn block-formula-init [] [[] (atom nil)]) +(defn block-formula-getLiteral [this] @(.state this)) +(defn block-formula-setLiteral [this val] (reset! (.state this) val)) (gen-class :name nextjournal.markdown.parser2.types.Footnote diff --git a/test/nextjournal/markdown_test.cljc b/test/nextjournal/markdown_test.cljc index 5b573d2..18693b5 100644 --- a/test/nextjournal/markdown_test.cljc +++ b/test/nextjournal/markdown_test.cljc @@ -804,7 +804,31 @@ $$p(z\\\\mid x) = \\\\frac{p(x\\\\mid z)p(z)}{p(x)}.$$\n\n ## SubTitle "))))) + +(deftest formulas + (is (match? {:type :doc + :content [{:type :heading} + {:type :paragraph + :content [{:type :text, :text "This is an "} + {:type :formula, :text "\\mathit{inline}"} + {:type :text, :text " formula."}]} + {:type :block-formula, :text string?} + {:type :block-formula, :text "\\bigoplus"}]} + (md/parse "# Title +This is an $\\mathit{inline}$ formula. + +$$ +\\begin{equation} +\\dfrac{1}{128\\pi^{2}} +\\end{equation} +$$ + +$$\\bigoplus$$ +")))) + (comment + (clojure.test/run-test-var #'formulas) + (doseq [[n v] (ns-publics *ns*)] (ns-unmap *ns* n)) (clojure.test/run-tests) (run-tests 'nextjournal.markdown-test) From 1a9c40e3b65dec05089d6fb98f49bd2184e6bc16 Mon Sep 17 00:00:00 2001 From: Andrea Amantini Date: Mon, 8 Jul 2024 14:04:25 +0200 Subject: [PATCH 19/83] First take at footnotes --- .../markdown/parser2/types/BlockFormula.class | Bin 6223 -> 6223 bytes .../parser2/types/InlineFormula.class | Bin 5753 -> 5753 bytes .../markdown/parser2/types__init.class | Bin 5201 -> 4068 bytes deps.edn | 7 +- jars/commonmark-0.22.1-SNAPSHOT.jar | Bin 0 -> 211504 bytes ...mmonmark-ext-footnotes-0.22.1-SNAPSHOT.jar | Bin 0 -> 19533 bytes ...rk-ext-task-list-items-0.22.1-SNAPSHOT.jar | Bin 0 -> 9428 bytes src/nextjournal/markdown/commonmark.clj | 86 +++++++++++------- src/nextjournal/markdown/parser.cljc | 1 - .../markdown/parser2/footnotes.clj | 57 ------------ src/nextjournal/markdown/parser2/types.clj | 24 ----- 11 files changed, 58 insertions(+), 117 deletions(-) create mode 100644 jars/commonmark-0.22.1-SNAPSHOT.jar create mode 100644 jars/commonmark-ext-footnotes-0.22.1-SNAPSHOT.jar create mode 100644 jars/commonmark-ext-task-list-items-0.22.1-SNAPSHOT.jar delete mode 100644 src/nextjournal/markdown/parser2/footnotes.clj diff --git a/classes/nextjournal/markdown/parser2/types/BlockFormula.class b/classes/nextjournal/markdown/parser2/types/BlockFormula.class index 4799ef131aba01e9728be8329b5aad40bad7d53e..ccef36b6b4bd62a885bcc9e095a67a06d7940dcf 100644 GIT binary patch delta 1163 zcmZ8fNla5w6upm@w!i;@v{2e$F(Q%(v`BP;ZZu%x$`DqtG?jj|+O$mvy?z!ij_wGIE+H`H_KAR(NyOP`- ziYJnrc7(z~23~YXZgXQasGwh}kve5K0LK}4aEaYhZiOxmN8y+q%y5!{MBJu8T!|z( z^lH^p*eLt3%eJw+PcYAMI0I)z`*{YIR3sdV?BXy8%SGt|=1VKERr1Q01^<$$UBR99 zx|P=%@NLm(SP4X$1L2gyVHEb;VFYe)xCXq>6J9dQ|BklPxLMyPQdP*m>W zw7pJ##Nh!v6!*utT6Wu>YL{o&z$?n&B?DV1lGGhu!3#S~!fOr_;$((5I4o7#-oblu znZ{9h{hH4lKEfw)|H8mZzi(9b(BHplfB#Oej>VOj5((Kja;+)xt-~ls}h@k-uN?SCpa3;fC*C8G=;h3W$|3nT9Kz9e&TB>@X2kTv4Yd4wG zQgLg6&j_E+!n9hPE%fL0o1mowq?W4cUKqe8M=2Y`rlJ~7s#I4sFH+fshl^|`TJ(bE zkPcr}HHXNO){9k6zmqfvV5A4q^TM|<4B1j>@JP|3+5S*rF?z}irizWazf@gH48|Obh<~$0iVn6r4MfI> z=rxP_!?%{n3N;THEx9EX;3~*w%zTssH4kZpSzl6 SaLT>bqAoXsWu9tN2H-!%g;f*) delta 1287 zcmZ8fTWl0%6#oA1WoCB&Hr=h;EvZFJ6rn9`2_colgir}jgiC7Z^U@Aw)9uVUJ4^6M zpLpPfg!AA_-|LH_BCSv^1%ZmzR#B=IMHWF(@CwSMDxQC5FH9dcyR+w;?{dyJ+cn$u z_CCE{rmdXmxIN}B+c5=NsLN26CorsXnl#Y$Rj zBxu^u>4@IeIUdF9cwb&}J)9MYDjCPzleY6YfhRqogEABlXrkNErsp(#C~+QB3jdKnE#o(( zot*pP?sR5AV%nR0LJLOs=FbG=PTS6yDQib6lQ$(k$AJhg;tPpce5xqsI9aZoOyVmq z@4P^$KVw_`#$}MgeM4_Vx?8VGT)}th`IGBZ4GX4`D|lycqijNPTz zqU&C`FY!0-DVB$f^NzS-muor_|9H56IeFGGA0v2F90-sReRiz~3g~Ie^|m6yA`lTF zp-EB0zYr7#zs}}1r^kalA*{V+ndSsRh-2>E&2^ z-O(CMVqz3}U+XwdP*+oeCS#g50Rg@`b;MWs7*1CixCivG!9PA%9rM{~ccLV4p(OBe zMc@Jp@ck)NzX&qpgYe~PCblZhDJF4o442ALzNFgt(g0V0&L#XFzAk&H!DZSP?}&25 zlKi)dyKbw7H#hQ!9dJSDTD;_-P(poQaZq3gmxR_gEQ0*tgK%-^RK4HD&s7(iUJ z?1Jx5T=OqHYYA|V=$$7PrT@J`tQN!ts~)Mm!#{lx?ixMS=-2+MtQ}O`w}j`zDi*&Z$yu|UU@ZK6OolWW4olNadernW!<_#YQuc|HID diff --git a/classes/nextjournal/markdown/parser2/types/InlineFormula.class b/classes/nextjournal/markdown/parser2/types/InlineFormula.class index 3176efb9c6bbca0681a12f9e6d8617d8e47f26ef..70040a35632a72fc21d6528de7b6488c747a8068 100644 GIT binary patch delta 956 zcmZ8eNla5w6upmM<^T2p9ViBah>?(3frOPbF)?c5#v!ikj#%NNjm>ZUEykU?a^b?o zP23naCWgd_MbTEY%HXU;5J#MF#1R#7pbp@D|JP#Oy?f6+=e~PRx;kCmen2iP*r-NV z1oTLB`KCay3HK|D=N;j27}~60fp!K8;cNZ6szo^*GrJv_vQ}fiykvgD1_&oPoPf9( zKgD2Xixv!Mn>i$5u4tXXNo7%G4+Fj-6bh<-ZJj^ZqH;I~yRFa*=Q(siw-~&L$R~gJ`42CosOu-(}>BF7YO1U2fL~#S#th3~sW^oHswyKJI4CH_o&8XjpyH*&2 z2ORE*mjxbSgR(##h9{zUiawjS_9chs@IutD806EHYt(IY;~VqFxAfz%u7*{u$uuS= zS8V6-9!3S@0|T4zMOU{5LM;&vpG?*m`4yS=YuudvLeu_mR*J(nv;UoTkjg55#(WNG zQ|1Q|0$N1Xqf48ks?On;K`4RW#4v$nYI8^@d!}HtqlypaVWZun#9Bf2c@l6G2V7Gw-0P~#BFD1`MTWbaH3gj#_*y~nc@`$%H1;^>up|yUz3eQ#-B|0AB?<^T?KMuC z?1tVrT=+YF2`B935=Dk9i*kjo8A2)C;;3iWX{8&x95#v4!#;2! zZf84`7dE)-_)r`kX0CaR``qOcWrqjEbtbrD@)lY1Tpq@~_gHy|A1Z~zX5*8tCeJC6g z94^8R8T#N7hx2g3EOCW_6r~0sU1$b}Yqp_&1~WE?BN}B4z)ths4O}hHUw9L4nU~uP zd`4ugp{rVbg+afXm?5GZ?%MJ_^hhNeIoyW_=Ie(HX2!Izs%_yg40FxUV+Kw#UM03s z&!@KKXXL~jHRRE~XXuVhdjp<-*0^8MsuFIcX^b6DM;0Qg<`Bf<+zBgZ{kP z&Te2POdQLaQqH9mqK6y2r9N`d1AXmqdD6yJ-0dxJ5Jp^=m)`8U*^CXKl2gV8sgRPj z#tHjZ(np;LEH>o?*d41w3q^<}_ETgi6(OA1lAT`kkyUgU9o_(YLTANYO$9S4pQz%p zX;Y1)yc1ch%AT6)WlABo*!rLCH`b1bGLHEC(r9u=AFZ5G>O-7SDCw>~TR8+8_vEH4 n-zc$YaCfrOW_i@ho-0%0E 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 Z`}A?nsl{skdx~T(X-YxGVbWA3@ITX9_{#tQ diff --git a/deps.edn b/deps.edn index b4aa01f..c3a43bb 100644 --- a/deps.edn +++ b/deps.edn @@ -6,8 +6,11 @@ ;; commonmark ;; org.commonmark/commonmark {:mvn/version "0.22.0"} ;; use temporary jitpack commit until release - com.github.commonmark/commonmark-java {:mvn/version "3733963"} - org.commonmark/commonmark-ext-task-list-items {:mvn/version "0.22.0"}} + ;; com.github.commonmark/commonmark-java {:mvn/version "3733963"} + com.github.commonmark/commonmark-java {:local/root "./jars/commonmark-0.22.1-SNAPSHOT.jar"} + org.commonmark/commonmark-ext-task-list-items {:local/root "./jars/commonmark-ext-task-list-items-0.22.1-SNAPSHOT.jar"} + org.commonmark/commonmark-ext-footnotes {:local/root "./jars/commonmark-ext-footnotes-0.22.1-SNAPSHOT.jar"} + } :mvn/repos {"jitpack.io" {:url "https://jitpack.io"}} diff --git a/jars/commonmark-0.22.1-SNAPSHOT.jar b/jars/commonmark-0.22.1-SNAPSHOT.jar new file mode 100644 index 0000000000000000000000000000000000000000..f4816855c8acaf7e1da70fe0a09066a7dae7b237 GIT binary patch literal 211504 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%0Dk10vO~I(7DF<)*fDOTI2XcsWXEzjERxOrX5}{ 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

    Pk9USn1}vdmEkp$Yq|J++JtV@ikb06+`Fn; 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 Cw?(-C literal 0 HcmV?d00001 diff --git a/jars/commonmark-ext-footnotes-0.22.1-SNAPSHOT.jar b/jars/commonmark-ext-footnotes-0.22.1-SNAPSHOT.jar new file mode 100644 index 0000000000000000000000000000000000000000..6d3f2c78bbc36b406908e185f636785818e17cda GIT binary patch literal 19533 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 loc (z/append-child {:type :footnote :label (.getLabel node) +(defmethod open-node FootnoteDefinition [loc ^FootnoteDefinition node] + (-> loc (z/append-child {:type :footnote + :label (.getLabel node) + :ref (inc (-> loc z/root :content count)) + ;; TODO: there might be definitions which do not correspond to any reference :content []}) z/down z/rightmost)) (defn handle-todo-list [loc ^TaskListItemMarker node] @@ -136,41 +145,48 @@ z/up (z/edit assoc :type :todo-list) z/down z/rightmost)) +(defn update-current [ctx f & args] + (apply update ctx (current-root) f args)) + (defn node->data [^Node node] - (let [!loc (atom (parser/->zip {:type :doc :content []}))] + (let [!ctx (atom {:doc (parser/->zip {:type :doc :content []}) + :footnotes (parser/->zip {:type :footnotes :content []})})] (.accept node (proxy [AbstractVisitor] [] - ;; proxy can't overload method by arg type, while gen-class can: https://groups.google.com/g/clojure/c/TVRsy4Gnf70 (visit [^Node node] - #_ (prn :visit (str node) (z/node @!loc)) - (assert @!loc (format "Can't add node: '%s' to an empty location" node)) (condp instance? node - Text (swap! !loc z/append-child {:type :text :text (.getLiteral ^Text node)}) - ThematicBreak (swap! !loc z/append-child {:type :ruler}) - SoftLineBreak (swap! !loc z/append-child {:type :softbreak}) - HardLineBreak (swap! !loc z/append-child {:type :hardbreak}) - TaskListItemMarker (swap! !loc handle-todo-list node) - InlineFormula (swap! !loc z/append-child {:type :formula :text (.getLiteral ^InlineFormula node)}) - BlockFormula (swap! !loc z/append-child {:type :block-formula :text (.getLiteral ^BlockFormula node)}) - - LinkReferenceDefinition :ignore #_(prn :link-ref node) - + LinkReferenceDefinition :ignore + Text (swap! !ctx update-current z/append-child {:type :text :text (.getLiteral ^Text node)}) + ThematicBreak (swap! !ctx update-current z/append-child {:type :ruler}) + SoftLineBreak (swap! !ctx update-current z/append-child {:type :softbreak}) + HardLineBreak (swap! !ctx update-current z/append-child {:type :hardbreak}) + TaskListItemMarker (swap! !ctx update-current handle-todo-list node) + InlineFormula (swap! !ctx update-current z/append-child {:type :formula :text (.getLiteral ^InlineFormula node)}) + BlockFormula (swap! !ctx update-current z/append-child {:type :block-formula :text (.getLiteral ^BlockFormula node)}) + FootnoteReference (swap! !ctx update-current z/append-child + {:type :footnote-ref + :ref nil ;; TODO: postprocess to assign ref number + :label (.getLabel ^FootnoteReference node)}) + + ;; else (if (get-method open-node (class node)) (with-tight-list node - (swap! !loc open-node node) - (proxy-super visitChildren node) - (swap! !loc close-node node)) + (with-current-root node + (swap! !ctx update-current open-node node) + (proxy-super visitChildren node) + (swap! !ctx update-current close-node node))) (prn :open-node/not-implemented node)))))) - (some-> @!loc z/root))) + (-> @!ctx :doc z/root + (assoc :footnotes (-> @!ctx :footnotes z/root :content))))) (defn parse ([md] (parse {} md)) ([_doc md] (node->data (.parse parser md)))) (comment - (parse "some `marks` inline") + (parse "some `marks` inline and inline $formula$ with a [link _with_ em](https://what.tfk)") (parse "# Ahoi > par @@ -188,20 +204,24 @@ --- ![img](/some/src 'title')") - ;; block footnotes - (md/parse "_hello_ what and foo[^note1] and^[some other note]. + ;; footnotes + (def text-with-footnotes "_hello_ what and foo[^note1] and And what. [^note1]: the _what_ -* and new text[^endnote] at the end. -* the - * hell^[that warm place] -[^endnote]: conclusion. +* and new text[^note2] at the end. +* the hell + +[^note2]: conclusion and $\\phi$ + +[^note3]: this should definitely not be here ") + + (parse text-with-footnotes) + (require '[nextjournal.markdown :as md]) + (md/parse text-with-footnotes) - ;; inline footnotes (might be handled via a delimited processor) - (md/parse "some text with^[ and not without] a footnote") - (parse "some text with^[ and not without] a footnote")) + (parse "some https://github.com and what")) diff --git a/src/nextjournal/markdown/parser.cljc b/src/nextjournal/markdown/parser.cljc index 3d78466..93c08fd 100644 --- a/src/nextjournal/markdown/parser.cljc +++ b/src/nextjournal/markdown/parser.cljc @@ -185,7 +185,6 @@ (recur (ppop p) (conj ancestors (get-in doc p))) ancestors))) -;; TODO: consider rewriting parse in terms of this zipper (defn ->zip [doc] (z/zipper (every-pred map? :type) :content (fn [node cs] (assoc node :content (vec cs))) diff --git a/src/nextjournal/markdown/parser2/footnotes.clj b/src/nextjournal/markdown/parser2/footnotes.clj deleted file mode 100644 index 556cc90..0000000 --- a/src/nextjournal/markdown/parser2/footnotes.clj +++ /dev/null @@ -1,57 +0,0 @@ -(ns nextjournal.markdown.parser2.footnotes - (:require [clojure.string :as str] - [nextjournal.markdown.parser2.types]) - (:import (nextjournal.markdown.parser2.types Footnote FootnoteRef) - (org.commonmark.node Text Node Nodes) - (org.commonmark.parser Parser$ParserExtension Parser$Builder PostProcessor SourceLine) - (org.commonmark.parser.block AbstractBlockParser BlockContinue BlockParserFactory BlockStart ParserState BlockParser) - (org.commonmark.parser.delimiter DelimiterProcessor))) - -(def footnote-id-regex (re-pattern "\\[\\^\\s*(.*)\\s*\\]")) -(def footnote-def-regex (re-pattern "^\\[\\^\\s*(.*)\\s*\\]:")) - -(re-find footnote-id-regex "foo[^note] and") - -(defn block-parser [label] - (let [footnote-block (new Footnote label)] - (proxy [AbstractBlockParser] [] - (isContainer [] true) - (canContain [_other] true) - (getBlock [] footnote-block) - (tryContinue [^ParserState state] - (let [non-space (.getNextNonSpaceIndex state)] - ;; TODO: loose list case will have a blank line, but we want to continue - (if (.isBlank state) - (BlockContinue/finished) - (BlockContinue/atIndex non-space))))))) - -(comment - (nextjournal.markdown.commonmark/parse "init [^label] end - -[^label]: * this is nice _and_ nice - * and so so -")) - -(defn block-parser-factory [] - (proxy [Object BlockParserFactory] [] - (tryStart [^ParserState state _matchedBlockParser] - (if (<= 4 (.getIndent state)) - (BlockStart/none) - (let [^SourceLine line (.getLine state) - line-content (.getContent line) - next-non-space (.getNextNonSpaceIndex state) - candidate-content (subs line-content next-non-space) - m (re-matcher footnote-def-regex candidate-content)] - (if (re-find m) - (let [block-index (+ next-non-space (.end m)) - label (subs line-content (+ next-non-space 2) - (+ next-non-space (- (.end m) 2))) - ^BlockParser bp (block-parser label)] - (.atIndex (BlockStart/of (into-array [bp])) - block-index)) - (BlockStart/none))))))) - -(defn extension [] - (proxy [Object Parser$ParserExtension] [] - (extend [^Parser$Builder pb] - (.customBlockParserFactory pb (block-parser-factory))))) diff --git a/src/nextjournal/markdown/parser2/types.clj b/src/nextjournal/markdown/parser2/types.clj index 0652ef9..acdfb93 100644 --- a/src/nextjournal/markdown/parser2/types.clj +++ b/src/nextjournal/markdown/parser2/types.clj @@ -29,29 +29,5 @@ (defn block-formula-getLiteral [this] @(.state this)) (defn block-formula-setLiteral [this val] (reset! (.state this) val)) -(gen-class - :name nextjournal.markdown.parser2.types.Footnote - :extends org.commonmark.node.CustomBlock - :constructors {[String] []} - :init init - :state state - :methods [[getLabel [] String]] - :prefix "footnote-") - -(defn footnote-init [label] [[] (ref {:label label})]) -(defn footnote-getLabel [this] (:label @(.state this))) - -(gen-class - :name nextjournal.markdown.parser2.types.FootnoteRef - :extends org.commonmark.node.CustomNode - :constructors {[String] []} - :init init - :state state - :methods [[getLabel [] String]] - :prefix "footnote-ref-") - -(defn footnote-ref-init [label] [[] (ref {:label label})]) -(defn footnote-ref-getLabel [this] (:label @(.state this))) - (comment (compile 'nextjournal.markdown.parser2.types)) From f577be109071f3a8fa433602502276795d6cd1d0 Mon Sep 17 00:00:00 2001 From: Andrea Amantini Date: Mon, 8 Jul 2024 14:47:38 +0200 Subject: [PATCH 20/83] Validate footnote definitions against existing references --- src/nextjournal/markdown/commonmark.clj | 29 ++++++++++++++++++------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/src/nextjournal/markdown/commonmark.clj b/src/nextjournal/markdown/commonmark.clj index f019cc5..57d98cd 100644 --- a/src/nextjournal/markdown/commonmark.clj +++ b/src/nextjournal/markdown/commonmark.clj @@ -150,7 +150,8 @@ (defn node->data [^Node node] (let [!ctx (atom {:doc (parser/->zip {:type :doc :content []}) - :footnotes (parser/->zip {:type :footnotes :content []})})] + :footnotes (parser/->zip {:type :footnotes :content []}) + :label->footnote-ref {}})] (.accept node (proxy [AbstractVisitor] [] ;; proxy can't overload method by arg type, while gen-class can: https://groups.google.com/g/clojure/c/TVRsy4Gnf70 @@ -164,10 +165,14 @@ TaskListItemMarker (swap! !ctx update-current handle-todo-list node) InlineFormula (swap! !ctx update-current z/append-child {:type :formula :text (.getLiteral ^InlineFormula node)}) BlockFormula (swap! !ctx update-current z/append-child {:type :block-formula :text (.getLiteral ^BlockFormula node)}) - FootnoteReference (swap! !ctx update-current z/append-child - {:type :footnote-ref - :ref nil ;; TODO: postprocess to assign ref number - :label (.getLabel ^FootnoteReference node)}) + FootnoteReference (swap! !ctx (fn [{:as ctx :keys [label->footnote-ref]}] + (let [label (.getLabel ^FootnoteReference node) + footnote-ref {:type :footnote-ref + :ref (count label->footnote-ref) + :label label}] + (-> ctx + (update-current z/append-child footnote-ref) + (update :label->footnote-ref assoc label footnote-ref))))) ;; else (if (get-method open-node (class node)) @@ -178,8 +183,16 @@ (swap! !ctx update-current close-node node))) (prn :open-node/not-implemented node)))))) - (-> @!ctx :doc z/root - (assoc :footnotes (-> @!ctx :footnotes z/root :content))))) + (let [{:as ctx :keys [label->footnote-ref]} (deref !ctx)] + (-> ctx + :doc z/root + (assoc :footnotes + (into [] + ;; there will never be references without definitions, but the contrary may happen + (keep (fn [{:as footnote :keys [label]}] + (when (contains? label->footnote-ref label) + (assoc footnote :ref (:ref (label->footnote-ref label)))))) + (-> @!ctx :footnotes z/root :content))))))) (defn parse ([md] (parse {} md)) @@ -216,7 +229,7 @@ And what. [^note2]: conclusion and $\\phi$ -[^note3]: this should definitely not be here +[^note3]: this should just be ignored ") (parse text-with-footnotes) From 50514a6daf17447331058d3c12c25b67e5e41f84 Mon Sep 17 00:00:00 2001 From: Andrea Amantini Date: Mon, 8 Jul 2024 15:05:16 +0200 Subject: [PATCH 21/83] heading level --- src/nextjournal/markdown/commonmark.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/nextjournal/markdown/commonmark.clj b/src/nextjournal/markdown/commonmark.clj index 57d98cd..7f68d7f 100644 --- a/src/nextjournal/markdown/commonmark.clj +++ b/src/nextjournal/markdown/commonmark.clj @@ -90,7 +90,7 @@ (-> loc (z/append-child {:type :blockquote :content []}) z/down z/rightmost)) (defmethod open-node Heading [loc ^Heading node] - (-> loc (z/append-child {:type :heading :content [] :level (.getLevel node)}) z/down z/rightmost)) + (-> loc (z/append-child {:type :heading :content [] :heading-level (.getLevel node)}) z/down z/rightmost)) (defmethod open-node BulletList [loc ^ListBlock node] (-> loc (z/append-child {:type :bullet-list :content [] :tight? (.isTight node)}) z/down z/rightmost)) From 53df7e258ab9709e05c02023cc293517b3628577 Mon Sep 17 00:00:00 2001 From: Andrea Amantini Date: Mon, 8 Jul 2024 17:36:16 +0200 Subject: [PATCH 22/83] More edge cases for duplicate refs --- src/nextjournal/markdown/commonmark.clj | 33 +++++++++++++++++-------- 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/src/nextjournal/markdown/commonmark.clj b/src/nextjournal/markdown/commonmark.clj index 7f68d7f..442e3cf 100644 --- a/src/nextjournal/markdown/commonmark.clj +++ b/src/nextjournal/markdown/commonmark.clj @@ -167,9 +167,10 @@ BlockFormula (swap! !ctx update-current z/append-child {:type :block-formula :text (.getLiteral ^BlockFormula node)}) FootnoteReference (swap! !ctx (fn [{:as ctx :keys [label->footnote-ref]}] (let [label (.getLabel ^FootnoteReference node) - footnote-ref {:type :footnote-ref - :ref (count label->footnote-ref) - :label label}] + footnote-ref (or (get label->footnote-ref label) + {:type :footnote-ref + :ref (count label->footnote-ref) + :label label})] (-> ctx (update-current z/append-child footnote-ref) (update :label->footnote-ref assoc label footnote-ref))))) @@ -187,12 +188,13 @@ (-> ctx :doc z/root (assoc :footnotes - (into [] - ;; there will never be references without definitions, but the contrary may happen - (keep (fn [{:as footnote :keys [label]}] - (when (contains? label->footnote-ref label) - (assoc footnote :ref (:ref (label->footnote-ref label)))))) - (-> @!ctx :footnotes z/root :content))))))) + ;; there will never be references without definitions, but the contrary may happen + (vec + (sort-by :ref + (keep (fn [{:as footnote :keys [label]}] + (when (contains? label->footnote-ref label) + (assoc footnote :ref (:ref (label->footnote-ref label))))) + (-> @!ctx :footnotes z/root :content))))))))) (defn parse ([md] (parse {} md)) @@ -237,4 +239,15 @@ And what. (require '[nextjournal.markdown :as md]) (md/parse text-with-footnotes) - (parse "some https://github.com and what")) + (parse (slurp "../clerk-px23/README.md")) + + (parse "Knuth's _Literate Programming_[^literateprogramming][^knuth84] emphasized the importance of focusing on human beings as consumers of computer programs. His original implementation involved authoring files that combine source code and documentation, which were then divided into two derived artifacts: source code for the computer and a typeset document in natural language to explain the program. + +[^knuth84]: [Literate Programming](https://doi.org/10.1093/comjnl/27.2.97) +[^literateprogramming]: An extensive archive of related material is maintained [here](http://www.literateprogramming.com).") + + (parse "this might[^reuse] here[^another] and here[^reuse] here + +[^another]: stuff +[^reuse]: define here +")) From 9940a6606951d52314a984ef9c0f33132c1037fa Mon Sep 17 00:00:00 2001 From: Andrea Amantini Date: Mon, 8 Jul 2024 17:52:50 +0200 Subject: [PATCH 23/83] Adjust processing of footnotes into sidenotes --- src/nextjournal/markdown/commonmark.clj | 7 +++++-- src/nextjournal/markdown/parser.cljc | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/nextjournal/markdown/commonmark.clj b/src/nextjournal/markdown/commonmark.clj index 442e3cf..55e965a 100644 --- a/src/nextjournal/markdown/commonmark.clj +++ b/src/nextjournal/markdown/commonmark.clj @@ -246,8 +246,11 @@ And what. [^knuth84]: [Literate Programming](https://doi.org/10.1093/comjnl/27.2.97) [^literateprogramming]: An extensive archive of related material is maintained [here](http://www.literateprogramming.com).") - (parse "this might[^reuse] here[^another] and here[^reuse] here + (-> (parse "this might[^reuse] here[^another] and here[^reuse] here [^another]: stuff [^reuse]: define here -")) + +another paragraph reusing[^reuse] +") + md.parser/insert-sidenote-containers)) diff --git a/src/nextjournal/markdown/parser.cljc b/src/nextjournal/markdown/parser.cljc index 93c08fd..437dfae 100644 --- a/src/nextjournal/markdown/parser.cljc +++ b/src/nextjournal/markdown/parser.cljc @@ -416,7 +416,7 @@ end" (let [new-loc (-> loc (z/replace {:type :sidenote-container :content []}) (z/append-child node) (z/append-child {:type :sidenote-column - :content (mapv #(footnote->sidenote (get footnotes %)) refs)}))] + :content (mapv #(footnote->sidenote (get footnotes %)) (distinct refs))}))] (recur (z/right new-loc) (z/up new-loc))) (recur (z/right loc) parent)) :else From 8daff6858ad126224357e54ff1cd4aad7d44be00 Mon Sep 17 00:00:00 2001 From: Andrea Amantini Date: Mon, 8 Jul 2024 17:58:50 +0200 Subject: [PATCH 24/83] Remove redundant ref --- src/nextjournal/markdown/commonmark.clj | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/nextjournal/markdown/commonmark.clj b/src/nextjournal/markdown/commonmark.clj index 55e965a..087ca06 100644 --- a/src/nextjournal/markdown/commonmark.clj +++ b/src/nextjournal/markdown/commonmark.clj @@ -135,8 +135,6 @@ (defmethod open-node FootnoteDefinition [loc ^FootnoteDefinition node] (-> loc (z/append-child {:type :footnote :label (.getLabel node) - :ref (inc (-> loc z/root :content count)) - ;; TODO: there might be definitions which do not correspond to any reference :content []}) z/down z/rightmost)) (defn handle-todo-list [loc ^TaskListItemMarker node] @@ -189,12 +187,12 @@ :doc z/root (assoc :footnotes ;; there will never be references without definitions, but the contrary may happen - (vec - (sort-by :ref - (keep (fn [{:as footnote :keys [label]}] - (when (contains? label->footnote-ref label) - (assoc footnote :ref (:ref (label->footnote-ref label))))) - (-> @!ctx :footnotes z/root :content))))))))) + (->> @!ctx :footnotes z/root :content + (keep (fn [{:as footnote :keys [label]}] + (when (contains? label->footnote-ref label) + (assoc footnote :ref (:ref (label->footnote-ref label)))))) + (sort-by :ref) + (vec))))))) (defn parse ([md] (parse {} md)) @@ -251,6 +249,8 @@ And what. [^another]: stuff [^reuse]: define here +this should be left as is + another paragraph reusing[^reuse] ") md.parser/insert-sidenote-containers)) From e06b55a320313ffcf503058352bdf57a50225e8f Mon Sep 17 00:00:00 2001 From: Andrea Amantini Date: Mon, 22 Jul 2024 17:42:28 +0200 Subject: [PATCH 25/83] Parse inline footnotes --- jars/commonmark-0.22.1-SNAPSHOT.jar | Bin 211504 -> 211101 bytes ...mmonmark-ext-footnotes-0.22.1-SNAPSHOT.jar | Bin 19533 -> 20916 bytes ...rk-ext-task-list-items-0.22.1-SNAPSHOT.jar | Bin 9428 -> 9428 bytes src/nextjournal/markdown/commonmark.clj | 184 ++++++++++-------- 4 files changed, 106 insertions(+), 78 deletions(-) diff --git a/jars/commonmark-0.22.1-SNAPSHOT.jar b/jars/commonmark-0.22.1-SNAPSHOT.jar index f4816855c8acaf7e1da70fe0a09066a7dae7b237..e81fd26ff518bc16b173eac37c11abb8c73d67c7 100644 GIT binary patch delta 41297 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 R9>c#&6GcQGdFclY2B+#yJC2@>QJa_+nTo&Q;D zR`02i4BGud=AuG#6LLq>G!GVE&(>Y8)ri1vV1IpQhAWTqAgH+WzOgLls zI{*p6Ip0SW@DJ}}JUHKfMtacJ83Zii|8V(-Oa^j7gG2zbLBRiqiVP^)i2-zgK=}I| zbRGin7l8Z!TKz9wJosNIdc4fg-~BLdAZK@fl(Z6IKPXi)!zP=X=@p@u?0|JR~QP^^$|uMP}=Vt5}bq4?j& zBPfZ#?CaT}jUe9FLB!<%8QnpkgC?#aNb7H5;lTfb>)=)1$9i>yj`xQ|c&U0FB>eYh z5c}%eE0Mty)K??xyh~A!h&%L;9UHWKJt+a!zc1`G|KTn70)bo~M&t?k&YMgd`tJxb zP=8~i42=Pdq0ajYsAs3?C48S@pZL1~8D%}+NAG{EgmmeFhD7-Fza>`RnE-3;SU|Q9 z5Ewu#+1_{JCE4%)q=)f@bkkAnuuJ0|AM}5?O#gY~GNPIOj+OzU2TsdFgDRgOut17W5ZLt{TK?}6)(h!6 zW4zx1n-|7W`-{s~l%<|q#Hjv}PX0z`9!0%biyz=Pg5C)?fReN%wo{r{xP ze}TZSm-CH+`VY_lLjYHg9>Dr<1EYlgG5%j(POlKK^`W6??;?SWRNh||9@O~?fl)sf zuJccxyo`4;cwkK?8b}@j5(%h-gaQnTJa}K~p8)TZ^+i!I@9WoB#lro2Xie1r_qzDW z_W%Ff@PVr-o$niv0mA(s>FM9rf(GtpuWNP{+(u3EKB`Zt|-d;^xt~~ z5`}`q1xi%+L%iYVf!+Yh_>d^|yfvTy=>u6OeSLQw^gH!meWb6yXq0*1m3qPUop;IV z$vT(*A%pjG)HCu}gr{11}m;>nldq-nAGst@yUi^cFY*s0$Vnt$tuu z5Ay$W2gQMbBZQz>JV;ca?hk4JmAh#skGnMllog_Wo%${24f!{F4HbH38AgDPE(C6Qd??51L~*$T&!EpVOpFG%`lSumTYnEqpVx75o`LS2o`twI*lhEZvsh_09?%0S(tMx8q zlpFBg)5JQqBjnYl@G$+V(h{cb{l6u0jO#xzUZjb@F{5WJaDN_-iVBL&hthp5ffbi( z5xdbGR1911*5FyD3d_1m24tvMa}=UJH5q9qC47Q)kPoT$9w(2SxnMry^0tx}MlUX? zQhX5VB-(i`*0$8n^H3V^;;AnJ9;yB49Sl_ThOf7f-)OCm(Cfq`p&GOpOt2&9BgYQ)`h9|| zhd#uY`3DFP^-sv=sm2-KB#1%u?@3Wj+P9fUB)Yu>t_ki@-x9YAlzv4NRu`A=!Y490OLp(uLJG@39mpefi+i;6^?Iex!w;kq6P*``rXT#9P+1-p zuG_^ifEEG_EE@_8?5}IW0)vBt1N(aw-pmX=C>{xtxNi9~();~0+!qJf+G2`f2?6cu zW!F~l^fG>EHLj-5ODl)?Uj$MY;-wdo(_q@9E;uSa!{Off`6+`!%!3<%m5 zks%T_{F%+~df@-(Wgn`C=WIXW<4V}R5ej~ov>a+hcDj-V+rE$LZLrK?fV@i~ zX@t!jDvdt+5QmL|<*X3EOAr$&&6LFyox={qC_Qn_`C*hiIy0st7|{u@=|yTrhECvf z_($4hRQ&ALPG0}L7+t@gs@c9N2QOo;0Fu)e6~E)sgaU%kZZ!cA!MEk@bH-jzB8zN| zOad)mC1LcA0zdu1pWT=1AHoh>U>EtRF&b>#Sm{&CyK);!G~cKRSfQii*JejJap;^| zD_gMtY)+TCe{wh67mZi34j8!C7qQxFq=f3_guWwC&v6eGjBtOZ^$niJv%U(rvaA7C zKg89Dqyk~_Z)*Hf+%TV_nycYJ5fpF(p^gS^ZJ$pqVNxIg z$KGW>u8iB%Zsuvbhx+g}a$x{=w;nL;xtq3J)YF74sQ~=F_ET_^-;(9|_TUdH7~@Fz zwzwAB3mn9u#i59@Fde?)3}f125u`yAew%A~)rxmmm4pj#2q7FadTcHL7Cr2%u_lLk zfiCw=xe1Ad`ufk}DyuX_eKq&4qEsASL>L{Bm5c?-7-NNG66-m8S|f4#)vz*`=qp_6 z!1PL+w0xUoodh-lv78Z{&E0fe4f??p>!en5{9@`SNc4da5xJ3YTzy{3mQb;UHjx>Eaj0b?X}o7^4g`kpACw{Serr}UA0TYdZWFDrAtz~I|rZt z47^OWRB=|s{t*_pEK;twD_Ciw@Qxn9kUh7D|LE5%2ut<3bV~CyA&e&}x!!b=HK_|sK>-!XkB;-T&X?E_Y zUugEvYMS0Doz<%^uYwfIv`LtALN%wfjwp)RX&w z2(THko+9i=kn&RqW*=HUo)i(~4ZdX1hjA2)L>X{Z7d!-6r)yc+n&ZU8tzGH#J^000 zarexjPux2tqrcSIr8m5pTGluVBM(K75rb$sjD9eq;enDeZ@@u`kQ6CGR`9dGpwny+ z>tvdWQplbS0Pzxf@!@8ALzIs=WK(4dDlSQ)JGFT?T3??A;&JT_@{t7+Vl<^MQ(r{j zF>aRH3pdcSt!%ZoiVon;3fbjgZDmdPCs287`m_fzk5J{+bBI(18o!xT)|S;#?HAtM zu>N%{onhoPx^E_80RF$sgf%a z>7U8?>x`Q1M8W&sk(=Kv2sYf``0MYb{~Lc{fMQV~;hTdMz!m-lR)Xz+BPcY`DGDT3 zGwCPrxPOMARvBCspeGOUcKL_&)tVJ2>U_7v<8>S2(4|LYC6tn6t^Dllj+U z@*t8&@aNLQ?>JBo80>5ZeSRSRgXi5_sB7W(RC8O&CF4+!Cl^L8T+$r2>+feT& zB~1!;r1kZdCDRd>3Y`cHXhOttcSkITuKBeFrrYy(+ef zlvQuqCqOoFCZB$W@gQmoQf$#dM?%K}Iyhwe2t|wnf(|j_G`#C*b&IuYvwfGnK@^U0 zA}jMEf&u%0{C-$nO`$11Ba-e#EhApG=E0T9H_VEBHy42`ZA#)r-%kRevcwuZwhbYN z$i%!(K=SolKgOC5AY;qKnf+PZS-Yr!3`=osYCtH2m?hcp3*K1K71IoR!^f_;kDKG_ zSdH0pSap*bJQ^+<)q|%npp-`voW`x-ea_Tt_vofphUZVguj}7!xhvO^;gnU@bpZy$+niQYTD~d*j!{Qo1U)A^b~P#gUEf)Zq4M0^veG{bUzc9 z+X9r@e}s@`B5(_cgo=mJUgso=i8$+%$Jw3z38MK{#&9;1tQc&JN#JtaIgL44_J>5O zZ4}G&m{?5#gC$U}!C_{Rvz#-EUi?=uevbH-y>30$LV9kAPdLXHuzr0zwZggSVo3Om zc!ELhUBc0m+ghuWyILEfo7xxi!e%i!IAj1$eBLQ2BBR7Gsfm3HwNaxuwx>^lm;%S* z7|*$UV>ozwl14IA4$rWbuPGZTdKIvw^wkcx7E{b1iwc)=6t$L6%pivfL@`R8L^*OY z2jwjiL{x%8KTq${@INLwf{hJT|RcGR6FMIIvcU^x=@c$8l-q5f?uNaUp%}yTR6YnMv z^k%UB>3Xx1FF4J=EAe)5{;7XACL}H(S#w>BP!j7EnF@c2DRef9sX?`CB?PTW6`Q)T zNmWj*KO8yV{&|H-T)S?0Vp(7P1$*jpq3egRa?OF)rF(AE&bE!GF1bBnJ^C& zNl7Ax{+eId?sLo_{SrGb>P{1{u8W%>I3yuU{-SU7KRE`pLP@n_(Y34ko%j>JFMQjB zoN|f6FS`qhQYzyj&<Ot^noo|?i>#eQd~)@4oS zFBR$OgpmU4(vm5^Syh{=c7$TVu@~7!*nFhS;zGNv)u@wmgbM1I{Nd}&Y&%)V8`;ub zcGR_OE&69sD)8XtZ3&@`8CzlriQutizdob7E+BC_jps0H1y!QCeJTnAIAdFvkz>Ta z5($WxC;ZW9x9!7>r9X@2hSzuDiM?YVb(SB5y^kkfUb?n}D=NA$9da+E4vWo)vx&kh z#*jv1Hzn-aM57q~6OqdvNRLfAPR0@?b8ASS609 zl#LQ+%HLhGojW}=w(^f)@ zT9NnbNyxT%9q~gCoBTD`7iuKFZ>JMbA%GGx}?GgM{4m}POcPokSB0Ece4-2{|4F>)XD)0Pnb z$8a_|R7Zl&)L<#Gn{E86TnS7!Oh{wp&Djb6L~p6jAxh;$pxzT$hSu|oFL+Nl{ylL? z1f%$L@e^DwH$iDsg5k2?FmS0m`_Z%u_OOpEP$>!k;=3)v^4)-3%zdsU?1xu#kw1D= zn{vOVmsrj?038F*n==mtaoL4KhU9ld$F@viPoPGbc3BuR*{plCQv9`Pb3K5_lqu^j&bXZRPxy%h=BKrA?r6wUlVaD@NZ)ro&* zlCU`{864}~Og6vanfzN(NcVk3bdX^jIC`^87Puz#-{3JfA6yjB&Kv83SwsgxF_I#W zjjga09}&@vtw=?MVc1q=lDC?us{EQP%te)c4|!vFe+*!o%sh3VkXw@Ya<%_`|NHm5 z2{$DX!0QEk&j*M71av%v0_Jh}U$<j zl7Wtx3zXJkEl0Wl+p`R>?Zb&G;?vdy4Oi1uAA&RQT3ncJsAppzJuzuPL1Cli+s-!W zp*|_^&Jc(w?<6l6VhH`!-+}fI9yR7dW%lh#Ou33li_u)gY8WLm^zqGKMEp)25F(I& zd&=L`82%vWX*N`~?&71I39p9;B}mpQLWe^l62YH51hKIJdWz@@mdkpy^&qz)aH(MM z>nQj8N>4}=@qYGYm35~Lc!H>;7P2sBLxOV7hNy;GdDkme^~z^MB=Bjt8wp!s4O+Ts z*<5x?wg%`Ut-nvVq(@dxk+H1|HRlW6b{a`#xs|mv%{q%CLz!|I~;EIL7v?GwkOVCRnN&`QWpJ0s+nAXLrgW^+4L+)vYN~K*M4?yM< z=XF`$6lI|w`4e;DhVTua-mE%5L4{y$I%$ZjPR^8|Z8lXZmcm^l&DxK;LZ;4ygu>AR zQ$|gG+FXg|kh=sUld}XflNY(I)r!C;2)({Keyh%U592d?j9<{`9dlQGyxRu#8h?44 zD5fE~@x1RL?eAbO(M%GI3~8=A28SJX$#3Nw23&mcQ|g@>>Y$I-QUa4v$Es>8PAhtn z?q!TI?ceF&K8!KEd7|z=vHBlK|6W=qLY9%yx4=Xf_P;JI@GTVroxwq(gShb^F#$2E z;|_D8SVEZX?mKPvRv8yI^l=nLFvhjuh3e~tA0_H^3pI5@Kr|LfO0~l?UO`6vBDE3m z+85w{SUa)eIJXe)#+$C^S^NiUX%Ei_2drRIm($Y7v9P>77%BMaxKEsMs#QZXqlX`< z!i*n88LUz8Gbdki0|f|3p1>I4@BrESK19^sDfz|xZk1!Y0q$J*9U&FKNM$5Dt6zlRJocSR zw+89BL3z#$!%-P!G*2yk?r2&}lLNSOLMI#z0ve~=PJo`R-&XkjJ^%$ZqEGb+ z)0Tcos^*lFnAs>TDLk)QZWFDA{08ccRbE7U1z*yB|1uMMZm_xNhMbuAQ}UoryHnHv zRayQUb6onslL_IPf%R+nAEc}b0ZX_?Irw#XZxuKKpW9iw7I`i8f|C7Q>l`?|Cc26| zN&a=h?cz?YsIOhr4P~BL)4YHvmchykSnYc&7}m9HWA3%I?UlR4bC~DV2FOXmmPtLX zOiyjs4b!=YfQ)&>gFnuQ&4Cybx6E}>jTkzpC{6IJK8$m=NZP_)Hv2@x^IbsRt6(M+MXd2F*#OMP zK3e-pK!LVpnr0dsu1Y?Fb&^bhqd>N$Dt33sXwfpMp`3f>@%;`vjh#Y{)cSVfWYHh= z*8D@+-Gtlf(9(ilg4XN|ZIt=64w~tJi)|zGJTcFY7k?fVFpm2rMrS@`$X)9xs7-Q( z3*a0{qz(+d0{t&(N8xioLYg0L(8>9n1z)nY0j)o-ui`weLdIl%4x(n^ns<?|2qUVO()3s?>lk1Rub#0$YANn}Vh)0R zucSghO*HwwomKMx=Enb03GSK~l-DU5z9C>gSob0l0Qw-s5vulEKm z&bvb~gqR=}ZfBF7KGdynj%;82-lQ-j2cJnH{%+UTgPS$OZom^%O~k6VSuXxa`gDTn z;rc;b>#j3kN~iiPTK9W=`>#g_zc?|*N%t{u$JEwi@E`ZBO;}MUV5d zc8Ks@X4H9W*V2|TRi9kvw&J(87qP)j8NCboFj=TA{R*kTfvng|^ZXwZE>Hkp1uh z-FAJdX|;sDAEl~N@p?4~;5Unkn-0@q$*YOs+U&1B3=)d%jg`y8NZ}8y9>#2|9p!WK zt)2sR{CLas9mt21E0Ut!z5m|j)MO^ z>XR-=h(t0d%=BfoE>I82757)_O*V;BmIn`HnC(a&Sq`nxMUWrW7>?eXGp|f3!lt!F zD^r6GBXoOIpbb7z{3Dnuv>swS#WiC;#WQ26w@mYBFYjnF(&VCu1StBBG;}BkkV42M zCa(~ZEcuNDYB->?VKuU5WiRjSEBsBco7C*`nHVz_Dv5T1V_&ute_wVm{i^Wix2r-M zeQ#CI*i@FQI1NEFbL90GnBDP6x-_WMn6~?Sj81oUX3k>Otuv}89&DE4zAv)(`V1dZ z5$_CXJL%mBU{CASI8RW;Z!*ciq0J zIxJl4x?D>7o0c2G{FifTek<>%{mXR!wo?E88sV*M2i3gN4j%Ro{8j^`2b~hWmHKmf zz=t9K#%%_R|I-XjBZNe0&K&@+_=o$}oPWn9Z%!QrPx()&Z~|QWJst%8PkRE?PV~lY zWDeZoy>Za|mXrJa>$|>pbKknGBmh5nKlO#q*K<#fQAHYF#1Jq@_z)ol2ylrWs$B8_ ziF!IQw9iI~NNgNwk!kR7m5im8E1K;>+YjGVxfgyn2GF3XVLyKR(U{T5()hcPrLwVd zy`jkJWplHY7pNoNaDM%|^5oS#?td8R)OW5(oGl9pbMbHrFxz#PD~Z}@Y0 zyX?XjLXRdzMAgQiMvjctPTvn;usCk+M>qQR?@bnQwY!M&ds6v z0=jQwGGN%SmSSmT;S4!s>e?-=BTGTY->^py*Xr7!cfcKjda>{Wc)}Ub;0WJ**6L`~ z3i+{p1#*^qsPN+v2jm80UkspE)HS?hfe~_7fq)gVpa9l}@)u1imr5|kR$z_Tpu(K$ z&ha`0)?-j$JTQt*5iBW{E3}xyycrppW1^H4{3}CnF()rcq>NuZN!%3=3nH9?$}?7~m|3t4WVo9spOy&4B{d*A&?z*`TLZai zxaV|b%9^Yv#uO`TY!-Pcmusv~!>%=X#MKJsTb2o{#){n=HgW-oiYuaohI5G+Ng4a(E4-!f=`z+`gtf`U)UCw=&rbD^4|~?=T8!`6eWXq;pHN%POMBC;nU0 zA1h%R)Aov(djy>kfVC5tHX-se8x95EmMjwESWI1@-0o7vmQ;i>C}4hii?28Of0D6v z=_w?0XN$45)2#*6dC#pBE2?}ikG50~E`gNsP#wvwk=1XY43ql`QBnEv*Y{ZoqQrb? zM?udJIa9(`IGbkKocvFwoN%FKY|9pe&{Gu(ZMr|roBI&G`~s(2H}qlj$GP0C#E7X{ z7Iv$T*2=kU_OUBBP|!<(zo!j?t9XxK+SqB%xWWa$1XiK}22tX=$5$Kn=l66Oxqb=T z&MLZb-dMMLf;6L5*xSg;`3M5fU1`2#cY(Dw_%=nO+TMmN{^?ttMhF!OWLx{5I6Huh z;hSi*U1)pA!@kTqRO{dbuW&tngB{#uGYgnLRRHclVTEOD%sX7WeIyg0+9PXdSmc5o&h$lx*Y>c;e1ZuLLbSd4pZ5F;33Zl7*>ob#QWSGkTI!-jnko8Qz;qK*; zuL!fF5zd;%q=`-#YeQWp zWrzG@7j?^1a}CA9?@jh2GU6biAceTi=2bmRtNLAVfExS&?r@H1%>?14^7JLFSSHK~ zq9)V%O5Nb^4C_=gWE(M};sTo6nSLkItx5}*j>y&2C~m-F zq4c2&+R5T|aq-2lCLD&g&jLFzcJ40zumOx@V3=@lh=lj(PoIG_9G3hr(Bx7?#we-s zOa~4M@G0X4NeI!^Hqv7k{z(=eJ7jq(<3>E85&bHRS=MqkPVq5v@>ybvpx~;^&L_~{ zVmg}UIn%%-ox3k4z_`T~WCqhEihJMSaNlFjY=c56tPvBCD%KMJ#F#6r0T-R7x45y5 zD+e&1we7o6@R|`|JpHU#opHlBid`?R>(I6dkY$~#R(y=Hs-MHvHMcG9@tP}a4$*6M zid7j6Lwf#ExH%(u!C(1eG(woM7@6=5v*tYg2DX=+kdMp9b7j?hHb=qd6OLtg{vX5Q z?$jHtG)LX*N+K@o}dsh zU=`|2ng$t8yzWb$?)Y|eq&Y{%H@kX67KZFW6eV81elziV0iooG25B4^Ygq1b9CDYr ztHrm zCr)pHDbf5C)tnyE5po)9QewHW|misX90O5%|H%K3Ir>?9z%Eb_Cd9B;F zx`ha%789aq*4Np0gs8Y-B<~Uq3#r7{AFa@p${MJt;{soaESD5&mEPYAKw;#X2M2TH z@aFWTf^us_g21W9%4i*&ws2ysTk=X^J`VzqFlngKy2|k^Y+Ts0KLM&%K;C}N0IO0= zYU*r|)3gI&m)a@GkFIPl!YZH~uQ3ocz(@jFcw5zQ?^YIg9m}mhg98i=7hCFd6ljp- zw^&pH)a1>73+U9&?J;@*a2tea$T$_{1LDc<-C+Px)<XocxMj8 z1@;V#hjTmq3Y>O16>w?zmepQJMlT8YhIub1U^Y#z4(_ib`HhYNm`wD#@dx3?8V4mi zP8fZvS4=)t9{0`ZeuR{rJhxD`c>Yd5WO(Wq9>!?^q1{oRVc7eX>bJOnzv_~^$a%%S zwXg4e=^&l#=Wry3q`s7It3fwRLAWBOc?HcA<7aLB-a?Ueez2w49P})}vc9Gf;xAV~ z3Z@hiz_>8veITg?q|C4_(e+jxBQ+sHo^iJ7eJFLMi^h38<9z@>nmokFw#OCSc^yYjWN`RT<$$4yh?%0w;80eDL(}o)mUw zTC;29C`9#`(+M(rr;6w(G{aY)e1GXIJJxJj? zj2W#V*WR~*I1gx8&|r7G_sadS_(WLT5L@N6mbX||8o_V9$D8)Eu&+ZG50sQ08WuXB5tPpo`LW^#}sNsHK4s7((|_aB)3tAzzwA~o4gLwEcM zpSJ0hyz?AzS3Sb_q`K*O6%Uoc9vkieTg9!xn;MuY_Bp0;i1S|{XW=(j+P^U(5U$d`P^ejjbM z=!on-b#2o*in@Jgz_*tp_WvTScgcPvE*mQ|(?&eG#uG^U!g}+2bI@s; zJK)clgk}s&3z3?_ zpS-0A-CfMGE~GZym(OX;j|idoi|SW2KLTJB9U{9v$z81|97ogIrQqIWqjH>nB2aeE zBMB0hdp=gG8|R?me;lv&%yx*I+ zc6dp)ibE~S3$pksdVclxAtmcnD$8B=lMLHM6ZeWl1c~oQW4+1N?MZ!cFO$b0wN^mr zeSg2XMwo8a)dhVd5|TR#(08wyKw()W4{HrolGq_76F~^B13O38>-P8My-8HboJc*nV z;`Zk0KF5)z_rWg0sT%|*voDp*kA6|sD{v^asTSEjnvHrp<`(W1fD7hXkHGT=b@${? zvq3@HIlNl)2rHX#?sgY)y3FU2ET}O3d2D{7!Mq*JOE_cdqP}94v}}x@O$Gsr7|aog zY!G(vAdnlBIC+j6Y~`WK&e4r#ijzUu%C@@T0(RJn`Ru`hgOi6$+?PP&-ctj;tV-Nq ziZM@Lx1>f|-H~s z1i~J_v$1;9@Q<+1EB1@V3AVG(Gxr+=Q3+MC&mZ(=p&v!%Ihdz&J*nU8+j1!8DX0$k zB_db{b$p5ZEiF;#1=bxr&wj7BO?l2BtG6-#W9q{n{uQ4w{n{6OtGhTra}MU|fwPdX zt^sRoPpC+8bENxgeyM+;kJS7**HcyO<7v-1=Mht<19nzrj+#}ue~Q$E{P6iz=_Yuz^c=b>LTU|z7UkbSemLCG(?jwelUlj8@zGbkj_#Fvl3uP zIMWuvQWRZ=yeYOKp*3f*57n@M6T_evNi|((maEtIrAV*um1`Y&gcnW5>Pt;!ULEpv*1qaMHD#N_^;bc3D#5`GI?F5%v>4}zTphlz*S`VNbwUL z8N8)dD|gYYIZu)N7!18VSl0d*x1#)KuGXBYWo7@QDse*qX>VNK1KavXw-ARf-+Z_J zgi|!cEj)D)eK;&k!-AO5pROcMKdYS%hgUC;5^J^^Vo+qZCI}xILX8dNn7v6&@<>EN zQ}c${=*hRhC=}F5-qQQVJe6WfW^b)Cqw+W#W`1nzW}&0v%z9ek)??&z)Ez~fG469z z1*xtYcIJBpa6QYfH9t&hx@K{~DRDGdQH1eH@j&&%RqL+JiHiEI;*rqE)cvg#)Wr`s zu`a(Uj8|I;y@L6LAk|Qkzb5wM;gLjJO8KFHlM(BOQDk*#-o7AV@yZ*W!$IbB%JE$K zP_7&j6*aOr&8IruTq+YaaBhuAN0mLTxth43Tb~6tz;@J6C2;dhC_Ujq&gEPo+G)X+ z`R{4Q(U1Oh3YHGb&H_k2W3e;aVGbOBjxNILC~uU-y;+Hur|+T6+YbWj&H}p!Ff7Zi z?b&Ww`?vx4D7zkf?O&9q1i8==dws+#iqnfEd3l2#Kj#`C%n#3L`?_HueUxcX4qv)b zQY{t>2YgZ$j@L4QMj<;ND)~H7TZour@(}EH-}n-&`y?LrrFp2gfo4gtzC$R@%z3hT z2WJyxSDT*U<}CKK<4B|bIl;}@|7j;!7I#X%Z3(-(g?8D*yP17-XLtu!B-8EEx?|d) z1LK&&6tmW=*zfTWpzPXsJA=7%sVO4yX>fe27C;w|X&*1QvCt$cARG|3muCwkEWXJ! zEi=_|hPnW6(^(k|-eM$Xfo&>P2*-FCNk+N5QIkx@ull-sb0xg8H^wK$szty88)kT# zXV~`D;BoT{7mCQHlXL)1^X=?vxY@~_6O^~Z`f-tnhgu%j>sKW;&zDxvOOw{+2Gp@KA%9NQqN8;N5c@#i%l!Sl&hWPc~w7tB+&P;j+_axUlm8vcM+*(1F$xvx6i#Cp&uV>wxwKDgY$NArO1V@j; zUVQ}Z(-`YP!@7I2<20y>Aj#|oQ4%eIA^^WJDMp+DOVxJ|^E;Qw1%5Sup|%kPy(G0% zH7kGIcJ$Xy{;iF>HrP6Z zxw|=hoKD1x)Xm`%L{p36>B5hDEZqYg)a!0Mhhy_@%O`879JeDxh#T|%RVz**Ab_TY zZmBtrg?6b@(t$weoh~4cfiw6 z%Mm9735#o2n-UP6X!W#`Px9|+R9SvNRBqK=eW&&*V>D7mi*8-*fy zwyD&b;#4lUw@M<&m7v-LHfQ{3ttYJ`w!S4a zt0SwP|9fi(@cQ0n^5B;@)@GmSy+6xd!G{#mZRaPf_Iv*99@hL<+|L8m*XsVDl1tbR z`q&o=+=1isR4iI^EgvVgy=};+v^4zEb$bytICH9gTvIeAfXd`sr80i8O8{a8Y*eoo zATF$6Lg%e*$U7YQIg%|!9R*t4$^`V8gAy!fwB}8mul$7YZ6XDN>mK~m3mDj0ag&5g z%hek@y5MD>5w7dJXier-L*Pnu#h`7{1Tgs#hk^$0s_7yiOHS?#Yy&*GW8$r6Eom8c35>=>yV0Ga<@XYs) zsFWO4JcrQYS@zT85~fnfU|C$g@m63*Y3y9L&{BpgI;94w2mGHXl6RbG%L0bK3Y5*2 z$I&e+yQ{8$@7)7ehe%_OuGQ7B_&Fs5sUbq-7Bo%Bh_u+k`vJU7mz*?QVTF{V$Wm1x>xYtj z(JJ$NY|YL)tFwkB`yo)2N_cVUW2(g5e5(~bLmqv(0r%1+e@46}6O1uT0R6)*qTnWm zP=cRrTuZA>q@(;gog9FqUSE%tmyOH9nk(unML~h0rAc4Ta2x%EkV<(mMOiwS+c&$Fuw(kFo^5VAl=R*N#GV9q z^?_g32!=A(UXTmdlJjpJVuG#^mMuj$a>wF{6EW*)xz(1KrfY!a@s|Dkpm19(YxEw^ zb*UV8In6}75YPGS5raJ%68wqkfi*PC$1wm|VoFT@O83{4YFSZ@$SqcZ761^ zMc96j+*dL4-*d$1T`|pkJkdfNT|t~5U_^CIFmKYF~VY(#84ImA=yb5H{!kg}w%ajmd6~ zPSEPFcJzhXVSh6k9J`w&iCS9YVIPN@Or7B`>U5I|7Rg7>UJWp^=woBs^N)OmR%}7i zgx6VS7y1!wo@(@@xerh7<@>&+f#;#%n~=tyYKQ;;H2Xvo-Wax?$r!uvp`oxNp{1H>5raoBURLP(X@gtGCJmC*U+OA7f2wY|2N*1c_*TozzuZ1TM1nOMe$ zRM>iem)pvSt4@bMi_sLdxyvd->XUJOO(enNd{VYE-3g>|_x(C>Pl*h4 zg$PA91t`l4rI#pHLuqdTqg1XVyLD*rOr+O;mA8%d+)t3f3 zY42=+lz9km1fT-F~(`kq2@7erPFDvLD?Z0#g~zvfnEV+@BN;9=f9a$CsP6&vSr zso>dfw8ob_rYz*>SX9=#NtmHhR#Q3vEYGiz&2P6#tTNung22B#QS;-Ec?iZgc%pU` zU4Oxk_v#4-g-G!jZV*xdLuVwRTgZH?htLShR|S$5zR`(1PLOW9~WJrG1g1bCVDC{DHUj5p`!@QJx#nOU*+KCO;k8)$9O$I z6ZUQVkuet*b-5$I0b17u4Xauwpz*?JbnGpDGzpE7p_x!!m9RaPiKQ9{oyT%TnI$I_ zyW|V%ur0LBh3m?vZaU8!dic?B&I@$K|Q=pLwaY1&3k%r)eo*I7zY z393CnaVmPGKq(H=#^cg^H*QEdx=Xl^QGDdXlD0wj(p6ZtQFXbk6$(lOh@jTwZ8%`+ z!vvs4x%cD~j@d_(7&_>1-N_+kBMB3ol6biuPP;WQNxlf_D28qg@Rdjp2&Qo?nA^1f zD5`@)Fvmd%rj8dHCmmfCYb{f3#dGMyp$-Z)2UhNxu32|J>AT|=wWGGpA>7v*2=f$r zOCU-W2{8mIU+I#ch`(`Ki_tZaPIMeyTR~$*RW{D$L%RMXH#@oFCn(%&x5_&6U*$S zok(|ZtS2S$)ZI1d^ks?6aNOgAklPdW>?P3ug;C(e!INnJjv>j!GJF9eAzF$c+BUBy+Zi)1dHc~uKj%?l*Ye$x8YIRIte z;{)I0`o{+?_xcYs3kUPK^Y(j>fWO^)OcL6c?<8PgJhK1Qy$AjM=e)naEkjFIg}?@o zgF_(w!DwQFQWnDyC99JV7ZpWQc1uJuHX9lE4khu6rO~Fsoz;q&B~`alG8D|D!lSoM zqsXJVQohl_zVWd#%E&**bu)t(D5U&nxSIR=to_$A$oG7AnU(YpJh~$H&p)yW#)-oe ztPiPmQ^*cTIMPAxjf2tUlgJvwX?}Bne)sKr1sc<}`~9ONsUw;P<}tEp>(32&O)Ua# z#^MbQ;x)!!oLg8(Y)TQOqQ-wwY`0DC7>P5@D|h7y_nB!*&v*&bFqK+ymK%85au^zvw)jF&hbm*E;(CCZ@5Ojv4<@b~;}E(l`%CBefHu6+4;T$o?n0|iWD z1v3g?Yy{E^v@*~k4z#0(;4`1~0ep;o?!WYcQyo+IS7@%H)+L9Am z)tEk7ieh@qsiDg4$ptu;TI^XI)D(a{1+Q5hCmB@hUM81l8NFg5GC?kmlVLgIrwc}m z`eUALUqHTiDRB0(LP4O&a(u8~yKZ-XY;cLmEd9p>m+P;c?fajx2c_}+IGo8IoWmzW zUg}gOyE-_dO!8^P9-QMr_kb{&VNRw5{1i^b6N|7qD{H)`3+OX3E$a8S17g5kEd+>Q#UP zqw+oEV0UH%!Q9Qv7j>|TUDF=L&IB4%OjQq9q)lrWFc|Dj-G*4FashDmY-N-AbiFV) z4kBUnia$|;JhiKmt?4|EjXMbFEL7L>rB+f?i!^ZWYu$Ubi#*sa!Yj-M9&qf75mP_7 zx3xK%oT=|AJ`&9B#dd;hwW3$m$bwl4qnX=6SVHpx`1RFE%MlkB+B_u1RcJa{nh&ES zs_SI9QdY)4=^g%}(Fd5%@E#tA49;v7DVRARNfC%g_xwL>{bg7jUDU3NLgVi44#Axe z+}+*XEx0!XXxufpYtZ1q-Q5Wu+}&Z5yz5)*oVE9lzOL?BbJmousxfNRsOO#p-x*O+ zc6v^V*ll0PcbsXeaj0BcVkOd!h?(jnmS|u%*270xSODRR5J?5(R22~Pp{~O|0e3M3(M9vALM0BW@vJg@Kfb%p5dHmNs7*RRq1Ux&n=%Shd~ z=(cJwJM=x5ZnXW|-L0N-a(?s%%+cIJP5}#9^`b-mh6I+I^$3_7ieiy;#N&$cChWwh z`o1;EwhPg^2V{}{lq%^4Na+kXfr(^56x|zGet3&Mv0}cDdtga*Hfi=*I3kS7Pnam! z9{36N6S-^ki}`-&WH%wDOt!F*QB*{Au1k*7J2$4mi1SEfkbo(rgR^Ny&6SL_?3x2< z?}%Z7AJwsT7WfMzZ9nXP%o6|d%vPnvqIhSI^jGK<0t;y%4a&P}_*r3+mQwZusA_y- z){6W`Wr$mmJi$=s?-TUX77}jd>quux_SYRo@72Oi-J2LCH?gMK9#zr3(}<$m?$)%SULWjs zW`}Xa!99o4SV!#3hfwkNLSXlN$ZWGNYnD|hR_4$B74`l*U-SkljcI3J=<{OakLUx}`dM+=1GLDFLhSI} zhBx=z?Ak`_fW&zg-5-<{!-yq)?yQOYSwp2#fTb>hNO=X*tH_K7O`GE@46Y=kl|Yh- zni?%?SX|qFbXc9|7ld!X2mJdw9^I(I5&=vd6uy?Ge!phslghpNJ}{;{=%ywu>07YH z780?PXVKFy_j8pZY{*)CN`(yi%v>;QMea5IqL9Ia`t;xuLxI9Nq1t?UIzL@2!Zrz= zAZxfUrTP%~MjDSQ3eT+~2c-;s{4=VmFL@#dT?D?>dj~U_%%=?i-R+}rz7WaEGnu73 zxmtV)Lh$_7-_M68J3zp7tW%tvRc1HBcLy1!y`5Lppy~0W76yE1SgwC9c&CiQY_V@L z@xe1v5!LxSDvv#_GWYy8Mu-+(scf8Zn3l;`I*Qk^FskG418(6-vJ&y_K{t(KE(!fV zamy@QZN<{^`7??vfwH$N=Gx82tvWy1Q zZ(WdBeG^h^&XJl@`uIon+s|IC)ncwg6>&w4KaI^RG;W7>fyJgN?2H1knUXqwqE@Cn zE4YaxKdEw_)c&y0QsvZ?tZd_hFuhOO+Y@7k8(KkxjV&pQ-w7KZ^bBG>D+w%v+{`Hg z4_jhP(fIc@ONiH=I{-+m)HU34DQMvt z@7n&J-J(WG&?N z>*G@tf|WZthx7~VH&DOkHD_)^A_j|JlPt_0(|n>Q@P!tcrM2Htnsxy<9HQ5e4a*IK zgz|ZHy1T)*?L{s*$5GceXuTeO5H*9NZ=X|)nhFtO9}(!HbNHAM%d7z}k9l+MC?IR4W){>q1;Bh`b{X=M)ehX>LYo+R^*^se@N zv9yi+BV424$4R=^e!)Gr#80ZD zcXFo1hG8z8taH+9v<}igvKE1g{nTO84(WP2c-oZAOOlft-&S~y@lrUfsQse)rj6rs zvjzayu8`JfDG@D$EBtYb5Q#D*vfhk%b-nW<3)hxyys}Q=k}|S*M^9)fulO^Z!+&BM zxc?ZE)aK+TUh@fanxKl`#2H5WHu5HWn7M(sym3`b4n^n1_G_(1a;3u0#iOpq6rky) zqxM}&CiJvuaiD%k81#GhwqR>Zs)8EI6^U7+pzaIKG;{_0D2-DJXpzBRzaspnoXu(m z_PhMIwM?;^40Nx>t5xiGeK5I1x>K=9;HC$ozhXXwVZqR>_u+kD@R%X&*LUm7PP5gD zP9omspIP|u^IvprUaI=6-y0uHSySHRkEe(ePYLkef!OboX|s#w3K4NKp_2@6ZJhTh z%PJ3$Kr$6iE$5qTDa7Ew&Og|y@kLr?OlL?u)?#bk9ypb;lxFq;v&VO0{;0_vz*4@H zEBL1lsnRO04ux_#*`hL6%I4aE@-&e0MDWPy7j&NFJO)*Bolmm2-x`k5uUfzw4JK3O z!!RM4^NJ>JOnFx%&ZRm!)jp>jF{+Ko<(|d8%FZvUw9L$KPv_4MFE6vGzu#GBV;?|u zgVO&LM;%Fm%Ann6Jgi;q`HCC^fQX&=`Ji;0v?5Rinw;orR02y0&u#7(_C^6c=KZdW z8iw`I7}><0h!Y45y{=iRu9!scZ*y_=#l9S@hKueoFQTvC>tqC@59-EatT zT|QAir@c+eM#gsCgH+orz!{hFlhG}vK8!_LWuK$4?31i|1^(xRM4&44eL$Yx-G-@g zp7OKlxY?hjU1eATo5~^^jMZ7Jr?xNTkswC5DjnuJ=E#)lO2iNw5l*6yr|#@0X0neD zyTvPDm@7KfpQDA)la$f0l4pA*i(Ipd@G)JNEOU-XM-StvT=zb4s+&F|;SZ{`_#FCU zg{IUAI~Ejj=^g==oq+dHwl)@$<}|9* zIsP00jWYeW7jFFDPCE;ruoH@?T`i7y$Hr58)shc|YEqlqMt}oI>S4*JtK{wU`SaaF zS4N^*>sd02zWTWNnHxKQ3e?!B{h*k3opWgN&nNyA=bo&;^aS`y2UM!p52^x;v14_TjzA+T>ssF00%WhdVM@Ub)54>7|x|F+=K3o#8WmZMANm!NPCWiMP(3>?K1-K3?6b%;Jy<6j^_mPwNlr zdPz^^TYqd8jhen=0BRPv3}Dw{rjLr&s}$smR2(%&LyUoa9O_T`SXaXf@d826reGS);sc9Drh8g z^o!t}l^Y_*nb#0ThY={J2x`wU8h%a8c9$RMV})x_Ow!uOX1Z_qQZAx@GV4=0XId`N zr@JRjqjm#&XiVK5K~guUlo%g9>LVe_w`28j?04=rlx0Jp`P8`Bl;flg+@Y!!Z@U{- zyGq&?2wVAX*RCrH4a^d8CVbETp?N+3d*%R{(NRvJ-7JW^o@>QuLn$H1ei_W&z*o5) zkI7?PMN#Dy?LH1R>3qv8YkjsR6q97_Gd9R#a3vEsHGJDLM_U(!S#TYOF~Po_J?id- zzeDUyK3u98wOA4&edzPkmQ`NPxV&k_5#%mMuf&t?%#^G@dq!J$t)Fp*;?gI!Yzf~^ zSw#&#|l<3PGL0sRnJMaB5Ti8Q%=~DgO`-R zo4yzLLqQMxra#k1ML_qBMRle?lAtJZqcZOKd$^B-OXisYV;L;u$>naDPk0yuM#J!_ zsM-;kz4snZav4#jl$E_N@ynt&k&!u9ua2rH;0Nmx4O)Ak&KQGjmE^XdgQ8Tp&F8c6Z4XZjpCsY__}_4&m-ch{Q7C zZGVA#_b-jcUCMprqjPl=b-6$V?hHM}KfkB!Jdher2UN@K+&?s=?#9B}gCNtx30Hm% zP8CTxiK@%9R9_R6dts~+7EoR~dZ;3`ee<|o1sg+%B;9LNkB4J}4pS3}zyX;_is~H! zGp#s?BSjBzK-xkD)dXiFCr&MjT)qskD}aL~7e2tX%y}{T68wE1}(i&Py$=$0)p+bR*y5hg3Fo;gjHBB=VHa@G%$) zmeQ7v3J^*>LM)h4kXq@420(L7`|tM$w{6n~b;q^(@sOZGz5Hpm0~H2L_UIi_k+p{o zWI@5;Mjn6>zN$Bu?!1H88>I$sv&ZX3Nulf1fH*b?4KcyJvOA%R{9?WYu_c5@aa^JoZYC*l^h?7Ghipd zkSH|_CAG^cF0v&H*6tlQ{X}G*=RKK=4pmYJZXI4Z(;o4>HAb$&1O4AJ1QsUWr%Il@ z!aBNK7`o*uY+0`|Jb#5F)}xLCCpSbh4Qn#SUS7WWB@NHX`MIkCz3}?#Q$c6N@vYWT z9MK!{A&-y0to{gmlDMgld^#_}aG$LYQ_T*=)mC#^)8T1r-b&p1P(bMDSN<6Ev64OInOmo;XlJDn=2Asu2$xhum9KZeJ z-K457TxH3u-x6D;JX6t!b3v3V4xV$yfO4~@zz)$-a?o0tgm=L&y_lRPpY$uIO85Km zvgigAD}+VYq8vBW82QV}HPo1&YlSd<`cTd>9e}lwQ#nR;L~&8qoomFbb8Fm0?x+=&zGB6JgbotJWd0W`q_rRe z!CcbUxN;8r)Bti@;rB1|_oU5V@&6=Q%;MSnYK`>OIwUx9;FPufU35g8)E2P0dSp-^ z@tY5F<$TKdI&P(0UNV7s#@#R;8Q_@ux}Z{a@OC3KrYs<4W4@fB9Y+_Gx>`rMVL@tsW)!q3T>PKujq zLw}D}$WMXMq$^;qM^>2P#)ijbX%hvirQn>bE0A<80rwD-Z< zu*H&Zpgk^%rIWISS}hr0C4tI z7{j?EbdvxfwENLrg?7G{aWKI?5Eta2zAP%{6n@$o0f(w|@G2_XefvgfENQdj!s^c) z$fplq?SzMU?>w}HrL;;I%k)QH8{NRv zOmI>ku(+PZpn^V;hhpSO6!@cG?fDv78eabi>(^7h6TR;%lFEYZK7- ziUv)k_*FwdR1D7fTV6cpHls{>JwlD&==rm^YiZwbJf@eHN~x}3>&W+jtISaHX>Bti zdS<}gJn5>AB0T<<>zrh^E7nZZ`2xOqMf@6p>)$&`DZDan;L ziYiE2y>a&`6BH5LA=K%N+NmnS!l#H@a<{m4Q;)jo_q^V zfSyVB0_}19@D#eIb;h>c`<`Cz0h=~?x36{j$w|0xbA_0!0CAtzO#&Ltu>?E1+b z7+V2NK!&+JHDeT4JnP>lBUtS0{Y{~uWb+sZ-O7*TawV&^wr^yX9ct_qSQQeruE;!7 zaDy({44_QNa}ll(pt-Mo zSxpSqwd*4l8882w@AuO~WOsY&e(Rj=9#Oozz{{VbJ>8xU6Ua>9bHB!~sf)&Wz>#_& zvs;l&lFsRB^@acPj+Y-YY21$dYXRZ-S45*wVyK(631&F8MFq~htkRGG(Dj?IWf&Iv zg6v{xs`6|hmNrqbTp~U4teVl8kuNIl{Z>beax)Yn<|5xX+8X?`SIl**(o9_m0=#&B zOF3I-X)Y>O4%{~%FMD>$hy-`j+-5L|ALGPF{RT%U&aoDdqIN~WIT+*-jbv-Nw z6uZ}u36S;G-h>N~+QGg9z!RPeg9G}B-R%jXK8#DGMMv@VLn|Npn(i-Nj10~O?T_G! z!d<#rNn%vcYJltj9J&z&AG?T8F3APajkOavzn}ocUzsjWVECSAX^DlP2y@Z9^e03Q z?1*I=_%yNx{^ta@?LGY}N;S?=VlI7xdy7TL|j)|4Z z@e#WY!|2Bqh^E50up;eCa|FhQS}EjN^Cj=Oz%g#C=nTwSLrp?fTBvePN~67B>)8a) z(<5_glxx=ob5ZQG>Gd`ir>($_1` zH@uiq81D0+A>GPXMSnTE^F)Uidl9Yjq`b zI8_y*I(NJ+q4Chrc{i8BYutDRp#Q)7nz+ zS26%Wch@`gkpN=k2lq?GKl}UO!J3MzcGoMy5UqmrS}#s%Qsr9H5H1aOEOa$W=;u~t+7JnP(7+#P3N+TW=5s7q_WhF8y;0!e z`Q_uK4Tti5A0tQiseWG)DStuzalzc@rYVNVB}|;X_EKk;4@{B6yye2~gr$E+uiquT-8C$s z3~gcZY|#Nb`7;%VDl?pVG@(Ovz!0a~Q#eW5Jb~_xOY>gJaOt=u=AW8yt2;60{|G<# zeIEr(LZsE}ad`*T-+p$z{=1+~d}k_9u#9$UJsC%4e2gsn7cIto4paRXvsgvMrAfsf z479&{Ls#${1w|d-0JH`rcK#5p*VIrCj#D|EK{@9_!1aRK7Xhp*7>@Aw@UCNui~F4< zA(w2IZ}E{r*M=+#QIs}qzHx9b5+cL`#j#lof}wnP=u8)plC(ITVcM@(ZdpOVJzE7U zH<^yYx<}shl~GBKo1nT9$CCKRkjHSPY5JM)_w?kgGHZ>F5$X{I`znT&iWhs+VbQcB zgdbkGjfBXGtWZh9rpYkU9Ul>Rf%J-*H7#cb^D>kMMgj1jur>)9Ior9%;v2E9DZ3@w zygeFHOl|Ih(GFaATES$oUZGn+X)<~LN42T$JB`pX{Jn^m_D`#Ow!-M4AtBi!IGqa* z2ZTcArtO4ba*jePvCw62UFJgYw($B|gS?-+NJo_47k=PH&LcP19F5O21VofxdEpGC zW+H7aKk}X_!e&D^#XdK(2tG43&BJL51BJ3pUtSHemZ-pU7~=ErB@S(XJm#g!NtIVd z;1WS-rq-qSC_>lPZJ+XY)L2zE!(9`2nV|BPkwumrRM?Xw%3?V$VZ9aXs!M|0Z3h?oc z*hBuw$!!eZcM|n=7Bor(M0j%wwH957>ejW6JEP}Y&%x1fFLju8LiS4?e3DoJ zXHeJdTm!02`a}`@tx!Q?h!tmv8SHMCLm~^{pdO$bSt`d^?A#Cx#4a<3HBcEFxn|PM(I$^t9rMP!VmA}4 zpJlsLKD*MYGkvGX%M~BlShKDr7UjAHL32^R>*oyc9Q5mQl5On^{9EvJ>DU)Lqi39F z*QoWU6+f{RsiwO+r`JJS=Co%~?^`$&W&ZwASqZvLh#<6<0TRWpiS@TWZvyNr{(f&5L&LsO966X%JX< ztcc0ZJsQ1QvypO zaVx-XqA`w;1PYO-khva&oGirwtKmS9Y;hNRw4XDCXqPjDtO=Fh(O{rsl`BK0Ar_le z{K~}}AS--}?Js?qRB{UD3+WFi++ZuMT@hZ@{Q@~>%EAqlLY1#({Z~q24#rN!X?s&? zwQq>^3v`r5%$UWImfJ=|kiYK>wPHKst9V>XSC<=519PzN*{%ChFUArg!Zqi8ToO?r zw22ON?eNSS z;+*6ndTDSqyi^>3G1IOTS;(Q;<1ars;S`IHgE*kt6pz7eSvGUc-kn)a*o)JK#&Q8{ zSTkOoKtjl8Ru8W(!?a8*7zg6onOZbG~fKIENblWLR_Qkfu8Gh9n zBiU(53tJm6N^W}sti58#0^>Wox+p&x#F~*@?8lm_cc-pTSX84!oae=tbt8b+pNh$& z{6l`_fQK4o6DWp1Oqv!>s-uo;Z=wOOfPw-6pyMBi9*YL8E<;c~wIO^7&S5H{b`vE8 zY3VEkUb4KQfW_eRt83fFrzIe_m%9ttAxYV4uGlKA>Kd}5H%zqBM!~er7p&4>*2S%% z3d;9AOy>dUemNQyFjmptao>(Y)e4C7UFKu0B3GoF%0i9JN%EfO3T^^cpuV&dq)FZ)Lsp`6V4I_7C-M(fxiH>@m2-J(s5P1O&Td&MXWcHSuBX z;vJ#*)_Et>&*gZ9dm}|$^X62pZ{pulFP1kw=-nbaO33&Wc^lFnuA%laEM3MLjWa$4 zL?D7bnP2=7BSI-gQ&?M8svWXD9cXusLr%){?YZxdXo@uDX<9~HgPb(aO#&uRKW(miq` zfd+|+1-^1anpfO9b}5rrZaGA->&;4%XKtkf>Yhl)F3K>hi$>3yaN^+8=+PGdX!TiE zk5>rk^LX|%#9C6-PvleuS1qHDAJ0Dx6oxxjrxRO9kqv5EM_c~vxLQ`xXSPsd9~1;L zcx^h4I~Y*JmgJeMG-L=^&qUka5LAD>a5}h-N`fIWLqG{vb_+dbfhE#K z8=p_7{HN4sU}wsM#3C`pVoDj!29%h_HRT`*CABYSO_7QEs%8;Y(jpH*Y>qdpX z545_i$clnH;iHaH(fz_f?#m$bo2lQ0TN-q}Z`jj~EQYO9mCm`+Gmxo$N7Pla8+=8> zGr)n7_O~$iiDrDV=v^tVv=IV_+p%WN`u>X%{qC9O*WgqFDrm`_VhcC_z>}dz_}xXs z0QxTnJYttUG?q1XiRL}mffwvkf}8ZxE@`AbnJ7x0ostPEFf}iwlLIy9Pc_$xCQRd?$FO_4oTA{J7zkjV?{Qm#8!q1`*h#NfxkRHWxo0uCHLMN2m>4=dZ2?1My@ zl(=<>7v;0p3rnl1qaP^ZS&pVzI)Saw@Ja}?&FM@y5iD?^J z)>r7kz}l_;KhlXwQ!f|+h^Z{Z5E!WdM!@Jl2FM2<a>;W7rg7H20jBz+%I<|^QWrEDY@J-cim54@iJxkUoh8Z5}kmJQU%#eqI`ImZ`7 zR>+{!Tn!m1MLpn)M_DP&t=wA773~fzONWGJ-CQa2RT%sH=m&y1b{jWxWotx8ovo~r zZa?38x<$?OnDp{cv-sm1r62hAEAcS!n?pa|kR@y{hYFd^- zFR!tpZH>dpe`aM8c@EteU)PvcAH?rIJab80jokT9*SBPSr5gJ~Z*b$|^Z%#o`$Yrq8T6_2$xnZP<0rrom0>n$6`#HBR`YoCl2$?*W(^nLjvCu zQKJY>v-IS`@br72!$9l?zU8i2dah>>{Vos6BQ^#{6TK~(n`t-US$-iY?_^ye4D(Fw z`JNTEs<-4xNf`S~ovMJpW^?Anj7`DdMbXpk-nn>Y7uq~l!wLl~r|iQ5?V9@cnD*Zq zzqq?HpiACa6$}^cS-7OfsAgje^HOFQhew!rB*X+0UB&0iyaw$8mz8{7^~arD2R@|0 ze2srBFXqF1s$f&n7#vVYHLHHd0&deBVe5KcHM@v!F8Jw$ zT^vM!Ss`v8|Kwm|)^K8Lii|Z9eQtE#xjC~_SzYQSwTm)Dln>E>6WtuL3gs4b;eGYq$mQA`A>@Z{FvV<5aU}}hcu9mrC&Nd|c`b;#=P${{-C3!p zx$kh9e4Spc-VpEyX9<;rHbHzO{qcD|*8t^(7v()$xSqHU*WY7jxmKv@)K!0@9pE`}bP!Icfyba!|AcpklX zF2g-U-j%{UcUA;tM$Kp*!MA%V<7ecrmw+$C_qG!f=9+30+jraPfdUAx%@b2@3R<@r zZsj`xKJvA-<187!P=W2+mlCFL-wH58sthwa(}dw^U!y{V5m{XsnmY&>*=}~3B(YDN z0bdg(;-pFGzV`Ld);VLAgP?m|CmeimlkO~=JJ9W>30uRd7cy?)Sv~tHCKEg7Oq+6O z^%2W|(_c>|*D>0!?YogpGMO7mRfb#9EO`%$Zi|s8aY}q)5(d`&S@0$16osF6cK^<0 zo_EwRaQ_fX#$2y^M83-WWU|gQ&f|Ms1szMr_kyW8*+nUMM<6KacnpKUH2_CrX5ieGsHUT2C1V$%M8PpY z15#jddO)FqxHrR*p~EZqNc(;MM47|3`_`yamsgSEy`9s|)j(lYB>xI4ap-Ib$1~K_ zlcH-(kwg2*PxMRoxT)0$?n1J0=Jo>XSg#?Qe)*FzzAZO4Uc#*It(=M_I*F0a79w%E zF-xl@OB2Th(ch!m=2*ll;6r~B<9|~d{)ck*f3AFvWDw|0E24nm|D`hS{&BchQ$Zl6 zE{g+@fvT%Ay+Wv2w;IQ<{=J&r9nG=d7@@3bBf$G3&R1O#D~7916vTkzFoIpN=rm}n zOBz!`Mw4a}<_W{kgU1A5guU)i)R1#OBF)Wa=hD?$U>-{|C21z*^N|d&a?O#p*wu|> zx<=Z)RoIlNQ&QJ_qNKWnqvl5VmTw}}>It5`1Q|%3*SZ?C4}5X8B1gPXAdp|d2QLZT+O%~Yvc_1n?R^@!Q+gxshIRoL z0P;p*8Y_04xmie+cviHZQG41%Q6+O<(dtrFgNI^ae>V9%|Mjyvz4H3vU_aqHg@z61 zx5R007qRNE7#E{>6eDigrKapS#=10ZDql?R9%yMMU{P7%9y!Nt`H|S8=%c8OQoc3> z@8eFUUI2E)wYF!SyA8L#09)Z7QR<+NU#TXL1njX(Di#0!n`ZgBzd#??DEI$crBy0;l_*f*cPBhP)hS6<@a;jJe;Ui#8=nwq{wMmE!)9h%$5Y54E zf*!-ze!6~Mb>4A*v)9So1~6h?kH|+l1(1{TP7R}eq00g$sFW8n7RNATCS6mD?ic3M z?fHZ5`j*-Pm_YuKr8b{zjx>7XQrKnsqeO&!xV=f?wP^Bj{17QxYtu%KixR4mDGSm* z$x4WGskmscv#G1keY0ahWGMCSu$m-Jx+->{bq-M*p6hplvySO75X%%bEV3%kAD(Ts z7)f958-)YHh}mrhzd~uN%S6x-xPY=#>9N*o7B;9&C=Ac3(oA+{;=;xkRJ5zpZi{HE z2C%^w!*B;QKt%EbbcNx0(l$o{+0`jFGOUP@Ico zyY6TdxJByPiP&l_Mwg!n{fM8kq+oF|;`?|+dp3akKXnW$vHxTma9%lAF<1v<4igVg zuu!raYcs65N2YCl+m5i*?;?(ntH_m%?^*RK*B@j_fkpkDMsisD$kY~O{L?pGL|@sp zl1;B%W6W5dI~3=Sab&xKk&?_EAZ-yWw*Oe z3NeojApRYB59?VS_Ix1#?`+yn+9@3Z=!MQviX}Sl0VLDr@NUP?KmnG|7%2sUX>c1k z)G$fXsq(F98Hw>bCKV!Rzg^XDEYx(PAnpWaEQn^ts1_}X9ndCoODxfbFIEh#j!KE~)i;MXl)7BLOei{p#sXDt}eQvb-5kyvN z(~`!!IV^)*Bi(u}cSvO$pGH<2{}#NKC&&hVPSy0KO-SEJ_tUU3Mue8&jx6gI>$ zei0PImt2{GeNaAAe*sz9U_Zu zz4oh|DbY1;?z>ASsQAQ>& zjJ5tm(p7)2%5pc)-hTE1X`WxxqKioIuAaFWyZ;(-q5a z3`*u2t&kM_`|LJEA0|ygdsf}&&GbPh!(6QQ0v!;S1?@#q&DinpWa(=00bPH*Go-pQ z^Lb0ixTRWsz_K);FbDR>xu7GDparvhw9j=U!QDn;)39-8~N|9Age8IR)$8fuHz<{+iL0b zx#^3^l2JzY5)4ZFoFolt45DVDuS&@M1K3&L-r0Jyj1lV--d&x#-DZoQfvq+8{a$*g zPVt?W{(FAW3&g_?1IsGk&ss22izfN-Ze=j5w-W*u#a;lNg)q|Xjr1#Y?X)FqDXPO5 zGvS<)_esACntqq0^qPG+iz~!ZYhg>6zBOq$xn@H&`LlnN%(z0XdmZDYSwf{gK0Q!; zgKo(go!N)N^;U;&BUpRG30$Lwd;v9z(9V7YqR*2T3SEhs!fTVSenhVm=!acz1RV6d zfkm%efa4G9@1V?B1=+rk;XArUlN4TBEI#z!;B{Nszo7aZc$wYOuqd4J>KqHv_yL0@ zVhggoyH1B)jD{moW3oi=;qz}DeypEXd%zs8$q%dRHGH!l#;G-h0{$|nG4o66Xo`2s z)s%v?l*G! z=pdl{0&BGei`{0;-v+BzSrxYT=JS93a$9T8h)8?^=Xsc#T@(H)oRDQn$=4p1_OaK$E+%a?V8_;|w zSj&YNC$kpzT% zHoSPHdt;bo5XEK?4FhnR=(S@d=FNHw=mJmiHuP`oVJ zs6K=jY)uX$SzZDR>b&Xe6E!aAbqMm6QKs7!%xPp#39{B6IQ=6xjAw!1fBlvyd0H0M z5AZt&?*D!N{r9FiHChLd{?{S-2buos#58?4F}nZh{C~V?{egHV|3Dlr8UPCaF>jha z92ddANPyIj)_eb48v2M2Ve|lH0Mh?r;uUEedSIwyzPH!Au9z*U1jAzn6~z_VYt;vo z-JhIcT0jo7cpJo!v4_&f~k0ru=DpZl;QS*PH~ zl$3aVI4EcS=Z=Dk2o{w!tp$^pi8D|}RUecBzBace ziYPz5Bu1b!O-)8i0r}lH)OS{k)*t^fEbo9rw7OF_YLly(?@W)^T|#G>Koq zNNi`_5}+)sg@fXX5D

    $<7!*k$vH3pma!|~k@ivzDL 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 delta 3438 zcmZ8jc|4R|8y;iHGK4In!4%2P$i9u8u?@zO^|hyDZ1Ev9LL=GY$=ZT!5sJt#WLHzN zlRZmzL!uDX$MpW*@9lg3xz6u8_kEpnKj+-{eQFA*-e*xUn;TQpFoHnzAW*s8aw@Y3 zxZDm<*My~FcBzjDz=TSPf^k$@6nsY|M!`KQWeUoHF%E;k%L#qf8&XPK zZ@SJG-|Q<63&y}i#PUtgqEXb$Lh)xgo-km6Z$9um+Yy@}|tGrAHG@Q^e+9k-xa3p5;GPibK+-D)k7yMeO7>&*rqgcOr*v)ru%X z`VSgPRktCL**;oY8n~GA6;2iBo?2hAskiR$xLH6(tz-?by?i-zSsm#gdu46FDxYw* z1Iiy7w6a-txqdV$P3Y3#=3BV~H7*e{Q@1WOww z0t#9rr^p8}Y+hz{D>FO1Vfc5m5lm=WA22%FW1vRhBTBkL#Bi_8ZwsJx7 z9sc=Xn5cN|4@XUGdsWai#ScCH+vHbD6NPmiUK2i{|4D^);Wy}2OtyrJ4bc|}SSE+o z1b@5DpLQL2dtdEZ&8*~97Gzhx3){Dfi}5-w<>R8ARVOE~+i}&+MNecM)vD04iM5jT zj3NuZ!JIf+BIKgVQ_RB7y?}>*743ZMcYW(Y34hZ~Ek*gSmrxf%f)4pcbBC1T zo-MB-GjBo!-ponW&OKspD)cgB>AQcW=LEs#1I_o8JfG(F7WmMm;Ka*Qm(pJC-rcUP zyM6m9PD3StCVgl=4yx9MsFmV(^H|H$ypus!+;8^4vLi6I+etw1QN39QcItJ^cm566 zX=jhrAjgW)j_?Qw@7!CPwVq3cJ+vTq(-tWI91Q+B^&~;p!?A*<3hf7!_`(HXZ4psg z5+@L+OuK1ZrC4oZpVTXSoRcBZClxYGY;Rn%{L&o~s{IR`q$UJ^`l$k&#&CE$*YK~- zcMT@(2TAjp*Kv0i!-AsP4%qe5LM}JzRwweUyRK`P8=s(ePDF%B(||xU%plNlQQ`p6 z)6*Xpr5D=_4(!K8=7k0C9+)yPfiM3aC<<`UP#E-i<=@O5k;dPQp(G!L0j@|};asns z(u3X@aSX%;7757>SY7SJphQ;UU7j-2=G!L4vNL3?CieJL-v74jsrVu!_^=Hg(Df_I zxn(tRUO0P8v2>o8$%n4(>jmMag*IHGzAI+EEoKti}$7j)Q7!A$L6m0Vz2Qrk`;72 zrplyu#i~o87bXM}BS?bIhIo>8)pxhd>xGf^mOV2xU04$(rFe<I11HwPI}J!VI?iP#VG)4Ov0VsW8HEd;L;6mHxKc zTQF+m+KdzRBS@$Yjl#6M?Q+5S;g`#S-i(rk!oKmv@iMoBV_sy{1@yFraiB(BtT}o1 zFhg$criKMEu0963(oxV1=S2e7XN1JbGfrf)(6QLL=onf@4=D34%vBLoukEQh=Ob}} z5Gfa*GGQf_CdQsmoaVzdl?T#nsuE&PiVQXKFhu4$`g(7W88CrAmxD&Epap%?7ol8n z<3#RNIVpD%$H5ozYQhzxE%y`RB9;r@{VW7w6}yj;JA-#D>$Ob7MB3Uft}v9V5H2OR z={kn2+1EB~Rc$fo?4yQ}>9HAV%Ou57`3f~QywL=KWUhoa^ux(N1mxM@Akc$u?#;t_ zK3n>lvSVdmLZ6dr{nj@MImzG8wtF`ZeQ-sk)=lum%$Dd_z=PiLW=A!=F5>uZeU*;4 zB;T?V!M-Eau%DlmMtH7sdv+aBLuw7b@s|59ofuMIKDZ=2!aL8zR0B zEp3V}aVX`t7{*P{l6}Jp*Swv>-KG?~c3Re@PxmOrtnJ9jOy-5W-PuvIAnIors}~@{ zW<^JPw>BMyiswiH5k?h*c2U6*`s(dVPl6tdv9ky5gHpIyTx1U!4!9H5&(CwT-$}2l z_CvM~r8JF&bf=YKzL|JMMAdg(%Wd>j*9s7_dzZV?eOq0pCG_*NGL?kZN+$7dqWFhVhyReOOwpCd8zeJ=+GYIM32A<3# zeIoRbB`z{aKaw6K9d>JE74_)HyC}}1H1q<(u3xjKuXXK^`}_|Rt<&3^RCcHOQchaVhVm>P zNT!RYUwOQy?f0~cX=6JhkHl&*zD4^%w=vj$Ate^xU2F_RbGMo+JL%!Kiu-Eo+5+n9 zs!dImryh0ZOx$y$&eOu|c+VYdG6*Qpu}Wb)?vyi<8OCL0J8{x3vP1+D z$ZQd^AB?5ppS@6VYD&Vf)%r{|-QzvEG3tBYWQ=>{9ZQ16z(Rsi`+V)s5{S_Kq4w{4 zpr`e{-g9(;9A1QY(jNXr>dC@aZsnPt@@`cPTUiS>_paSPjPT$@oYG4mB-Ae#-exDe z2Q1BQ@^gI#E&3f_(O+)#T+ESR5C}r||9AAKS{@ap`{W~4PEZEZdK?r6_^SW=-Hb5U zJe~jqP$&vwQ5Fw-Xop*3YH(g+4-IRVU~;Q)^JEHG|F zX@@FYe8bb>LS%d!ldGS)5o*C<&IbKnpA+fpa zC3-$VjZdg{Q6xg7l1WvUeD6U1Qu~%zW`wfbKPJ8i@f72gD}#Cw{U<(qCT_Ae%7p3VC!~0a+0D4|v>;M1& delta 249 zcmccOdBu}Az?+$ci-CcIfni3@vwAo0l_Oj=;N zl*tlIZ)A!9$#3RiUI5mxc|A)X6IjH7{Q`s`%yokWEb@-848lkk-ogPEk&}^O1RG;3 zYXPD+SI9O%?ENk02U0QFM?RcsUF77~vNDqo%FBb*K9=_c)A|Y-U?sB@(!eycVh)%t bQY-`0uN5o7bh=U(h~E4~X*$I0J{30rA6RCu diff --git a/src/nextjournal/markdown/commonmark.clj b/src/nextjournal/markdown/commonmark.clj index 087ca06..06740e4 100644 --- a/src/nextjournal/markdown/commonmark.clj +++ b/src/nextjournal/markdown/commonmark.clj @@ -5,7 +5,7 @@ [nextjournal.markdown.parser2.formulas :as formulas]) (:import (org.commonmark.parser Parser) (org.commonmark.ext.task.list.items TaskListItemsExtension TaskListItemMarker) - (org.commonmark.ext.footnotes FootnotesExtension FootnoteReference FootnoteDefinition) + (org.commonmark.ext.footnotes FootnotesExtension FootnoteReference FootnoteDefinition InlineFootnote) (org.commonmark.node Node AbstractVisitor ;;;;;;;;;; node types ;;;;;;;;;;;;;;;;;; Document @@ -56,86 +56,119 @@ (.. Parser builder (extensions [(formulas/extension) - (FootnotesExtension/create) - (TaskListItemsExtension/create)]) + (TaskListItemsExtension/create) + (.. (FootnotesExtension/builder) + (inlineFootnotes true) + (build))]) build)) ;; helpers / ctx (def ^:dynamic *in-tight-list?* false) -(def ^:dynamic *current-root* :doc) ;; :doc | :footnotes + (defn paragraph-type [] (if *in-tight-list?* :plain :paragraph)) -(defn current-root [] *current-root*) + (defn in-tight-list? [node] (if (instance? ListBlock node) (.isTight ^ListBlock node) *in-tight-list?*)) -(defn current-root-for [node] (if (instance? FootnoteDefinition node) :footnotes *current-root*)) + (defmacro with-tight-list [node & body] `(binding [*in-tight-list?* (in-tight-list? ~node)] ~@body)) -(defmacro with-current-root [node & body] - `(binding [*current-root* (current-root-for ~node)] - ~@body)) ;; multi stuff (defmulti open-node (fn [_ctx node] (type node))) (defmulti close-node (fn [_ctx node] (type node))) -(defmethod close-node :default [loc _node] (z/up loc)) - -(defmethod open-node Document [loc _node] loc) -(defmethod close-node Document [loc _node] loc) - -(defmethod open-node Paragraph [loc _node] - (-> loc (z/append-child {:type (paragraph-type) :content []}) z/down z/rightmost)) - -(defmethod open-node BlockQuote [loc _node] - (-> loc (z/append-child {:type :blockquote :content []}) z/down z/rightmost)) - -(defmethod open-node Heading [loc ^Heading node] - (-> loc (z/append-child {:type :heading :content [] :heading-level (.getLevel node)}) z/down z/rightmost)) - -(defmethod open-node BulletList [loc ^ListBlock node] - (-> loc (z/append-child {:type :bullet-list :content [] :tight? (.isTight node)}) z/down z/rightmost)) - -(defmethod open-node OrderedList [loc _node] - (-> loc (z/append-child {:type :numbered-list :content []}) z/down z/rightmost)) - -(defmethod open-node ListItem [loc _node] - (-> loc (z/append-child {:type :list-item :content []}) z/down z/rightmost)) - -(defmethod open-node Emphasis [loc _node] - (-> loc (z/append-child {:type :em :content []}) z/down z/rightmost)) - -(defmethod open-node StrongEmphasis [loc _node] - (-> loc (z/append-child {:type :strong :content []}) z/down z/rightmost)) - -(defmethod open-node Code [loc ^Code node] - (-> loc (z/append-child {:type :monospace - :content [{:type :text - :text (.getLiteral node)}]}) z/down z/rightmost)) - -(defmethod open-node Link [loc ^Link node] - (-> loc (z/append-child {:type :link - :attrs {:href (.getDestination node) :title (.getTitle node)} - :content []}) z/down z/rightmost)) - -(defmethod open-node IndentedCodeBlock [loc ^IndentedCodeBlock node] - (-> loc (z/append-child {:type :code - :content [{:text (.getLiteral node)}]}) z/down z/rightmost)) - -(defmethod open-node FencedCodeBlock [loc ^FencedCodeBlock node] - (-> loc (z/append-child (merge {:type :code - :info (.getInfo node) - :content [{:text (.getLiteral node)}]} - (parser/parse-fence-info (.getInfo node)))) z/down z/rightmost)) - -(defmethod open-node Image [loc ^Image node] - (-> loc (z/append-child {:type :image - :attrs {:src (.getDestination node) :title (.getTitle node)} - :content []}) z/down z/rightmost)) - -(defmethod open-node FootnoteDefinition [loc ^FootnoteDefinition node] - (-> loc (z/append-child {:type :footnote - :label (.getLabel node) - :content []}) z/down z/rightmost)) +(defn update-current [{:as ctx :keys [root]} f & args] + (assert root (str "Missing root: '" (keys ctx) "'")) + (apply update ctx root f args)) + +(defmethod close-node :default [ctx _node] (update-current ctx z/up)) + +(defmethod open-node Document [ctx _node] ctx) +(defmethod close-node Document [ctx _node] ctx) + +(defmethod open-node Paragraph [ctx _node] + (update-current ctx (fn [loc] (-> loc (z/append-child {:type (paragraph-type) :content []}) z/down z/rightmost)))) + +(defmethod open-node BlockQuote [ctx _node] + (update-current ctx (fn [loc] (-> loc (z/append-child {:type :blockquote :content []}) z/down z/rightmost)))) + +(defmethod open-node Heading [ctx ^Heading node] + (update-current ctx (fn [loc] (-> loc (z/append-child {:type :heading :content [] :heading-level (.getLevel node)}) z/down z/rightmost)))) + +(defmethod open-node BulletList [ctx ^ListBlock node] + (update-current ctx (fn [loc] (-> loc (z/append-child {:type :bullet-list :content [] :tight? (.isTight node)}) z/down z/rightmost)))) + +(defmethod open-node OrderedList [ctx _node] + (update-current ctx (fn [loc] (-> loc (z/append-child {:type :numbered-list :content []}) z/down z/rightmost)))) + +(defmethod open-node ListItem [ctx _node] + (update-current ctx (fn [loc] (-> loc (z/append-child {:type :list-item :content []}) z/down z/rightmost)))) + +(defmethod open-node Emphasis [ctx _node] + (update-current ctx (fn [loc] (-> loc (z/append-child {:type :em :content []}) z/down z/rightmost)))) + +(defmethod open-node StrongEmphasis [ctx _node] + (update-current ctx (fn [loc] (-> loc (z/append-child {:type :strong :content []}) z/down z/rightmost)))) + +(defmethod open-node Code [ctx ^Code node] + (update-current ctx (fn [loc] (-> loc (z/append-child {:type :monospace + :content [{:type :text + :text (.getLiteral node)}]}) z/down z/rightmost)))) + +(defmethod open-node Link [ctx ^Link node] + (update-current ctx (fn [loc] + (-> loc (z/append-child {:type :link + :attrs {:href (.getDestination node) :title (.getTitle node)} + :content []}) z/down z/rightmost)))) + +(defmethod open-node IndentedCodeBlock [ctx ^IndentedCodeBlock node] + (update-current ctx (fn [loc] + (-> loc (z/append-child {:type :code + :content [{:text (.getLiteral node)}]}) z/down z/rightmost)))) + +(defmethod open-node FencedCodeBlock [ctx ^FencedCodeBlock node] + (update-current ctx (fn [loc] + (-> loc (z/append-child (merge {:type :code + :info (.getInfo node) + :content [{:text (.getLiteral node)}]} + (parser/parse-fence-info (.getInfo node)))) z/down z/rightmost)))) + +(defmethod open-node Image [ctx ^Image node] + (update-current ctx (fn [loc] (-> loc (z/append-child {:type :image + :attrs {:src (.getDestination node) :title (.getTitle node)} + :content []}) z/down z/rightmost)))) + +(defmethod open-node FootnoteDefinition [ctx ^FootnoteDefinition node] + (-> ctx + (assoc :root :footnotes) + (update-current (fn [loc] + (-> loc + (z/append-child {:type :footnote + :label (.getLabel node) + :content []}) z/down z/rightmost))))) + +(defmethod close-node FootnoteDefinition [ctx ^FootnoteDefinition _node] + (-> ctx (update-current z/up) (assoc :root :doc))) + +(defmethod open-node InlineFootnote [{:as ctx :keys [label->footnote-ref]} ^InlineFootnote _node] + (let [label (str "note-" (count label->footnote-ref)) + footnote-ref {:type :footnote-ref + :inline? true + :ref (count label->footnote-ref) + :label label}] + (-> ctx + (update-current z/append-child footnote-ref) + (update :label->footnote-ref assoc label footnote-ref) + (assoc :root :footnotes) + (update-current (fn [loc] + (-> loc + (z/append-child {:type :footnote + :inline? true + :label label + :content []}) z/down z/rightmost)))))) + +(defmethod close-node InlineFootnote [ctx ^FootnoteDefinition _node] + (-> ctx (update-current z/up) (assoc :root :doc))) (defn handle-todo-list [loc ^TaskListItemMarker node] (-> loc @@ -143,12 +176,10 @@ z/up (z/edit assoc :type :todo-list) z/down z/rightmost)) -(defn update-current [ctx f & args] - (apply update ctx (current-root) f args)) - (defn node->data [^Node node] (let [!ctx (atom {:doc (parser/->zip {:type :doc :content []}) :footnotes (parser/->zip {:type :footnotes :content []}) + :root :doc :label->footnote-ref {}})] (.accept node (proxy [AbstractVisitor] [] @@ -176,10 +207,9 @@ ;; else (if (get-method open-node (class node)) (with-tight-list node - (with-current-root node - (swap! !ctx update-current open-node node) - (proxy-super visitChildren node) - (swap! !ctx update-current close-node node))) + (swap! !ctx open-node node) + (proxy-super visitChildren node) + (swap! !ctx close-node node)) (prn :open-node/not-implemented node)))))) (let [{:as ctx :keys [label->footnote-ref]} (deref !ctx)] @@ -218,22 +248,20 @@ ![img](/some/src 'title')") ;; footnotes - (def text-with-footnotes "_hello_ what and foo[^note1] and + (parse "_hello_ what and foo[^note1] and And what. [^note1]: the _what_ * and new text[^note2] at the end. -* the hell +* the hell^[this is an inline note] [^note2]: conclusion and $\\phi$ [^note3]: this should just be ignored ") - (parse text-with-footnotes) - (require '[nextjournal.markdown :as md]) (md/parse text-with-footnotes) From 5290d90769e2a6381c7a2d8c078459a7e5d6325f Mon Sep 17 00:00:00 2001 From: Andrea Amantini Date: Thu, 1 Aug 2024 15:29:01 +0200 Subject: [PATCH 26/83] Allow to add parsed text to same context --- src/nextjournal/markdown/commonmark.clj | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/nextjournal/markdown/commonmark.clj b/src/nextjournal/markdown/commonmark.clj index 06740e4..a7d787d 100644 --- a/src/nextjournal/markdown/commonmark.clj +++ b/src/nextjournal/markdown/commonmark.clj @@ -176,11 +176,11 @@ z/up (z/edit assoc :type :todo-list) z/down z/rightmost)) -(defn node->data [^Node node] - (let [!ctx (atom {:doc (parser/->zip {:type :doc :content []}) - :footnotes (parser/->zip {:type :footnotes :content []}) +(defn node->data [{:as _ctx :keys [content footnotes label->footnote-ref]} ^Node node] + (let [!ctx (atom {:doc (parser/->zip {:type :doc :content (or content [])}) + :footnotes (parser/->zip {:type :footnotes :content (or footnotes [])}) :root :doc - :label->footnote-ref {}})] + :label->footnote-ref (or label->footnote-ref {})})] (.accept node (proxy [AbstractVisitor] [] ;; proxy can't overload method by arg type, while gen-class can: https://groups.google.com/g/clojure/c/TVRsy4Gnf70 @@ -215,7 +215,8 @@ (let [{:as ctx :keys [label->footnote-ref]} (deref !ctx)] (-> ctx :doc z/root - (assoc :footnotes + (assoc :label->footnote-ref label->footnote-ref + :footnotes ;; there will never be references without definitions, but the contrary may happen (->> @!ctx :footnotes z/root :content (keep (fn [{:as footnote :keys [label]}] @@ -226,9 +227,14 @@ (defn parse ([md] (parse {} md)) - ([_doc md] (node->data (.parse parser md)))) + ([ctx md] (node->data ctx (.parse parser md)))) (comment + (-> {} + (parse "# Title") + (parse "some para^[with note]") + (parse "some para^[with other note]")) + (parse "some `marks` inline and inline $formula$ with a [link _with_ em](https://what.tfk)") (parse "# Ahoi @@ -255,7 +261,7 @@ And what. [^note1]: the _what_ * and new text[^note2] at the end. -* the hell^[this is an inline note] +* the hell^[crazy _inline_ note with [a](https://a-link.xx) inside] [^note2]: conclusion and $\\phi$ From 10baed769fddd0fa9d8db0a2346e03dcc713b9e5 Mon Sep 17 00:00:00 2001 From: Andrea Amantini Date: Tue, 13 Aug 2024 10:38:48 +0200 Subject: [PATCH 27/83] First step toward code reorganization keep cljs tests passing --- notebooks/benchmarks.clj | 4 +- notebooks/tight_lists.clj | 34 - src/nextjournal/markdown.clj | 100 --- src/nextjournal/markdown.cljc | 57 ++ src/nextjournal/markdown.cljs | 51 -- src/nextjournal/markdown/parser.cljc | 26 - .../{commonmark.clj => parser/impl.clj} | 2 +- src/nextjournal/markdown/parser/impl.cljs | 644 ++++++++++++++++++ .../markdown/parser/impl/utils.cljc | 48 ++ .../markdown/multi_threading_test.clj | 2 +- test/nextjournal/markdown_test.cljc | 16 +- 11 files changed, 757 insertions(+), 227 deletions(-) delete mode 100644 src/nextjournal/markdown.clj create mode 100644 src/nextjournal/markdown.cljc delete mode 100644 src/nextjournal/markdown.cljs rename src/nextjournal/markdown/{commonmark.clj => parser/impl.clj} (99%) create mode 100644 src/nextjournal/markdown/parser/impl.cljs create mode 100644 src/nextjournal/markdown/parser/impl/utils.cljc diff --git a/notebooks/benchmarks.clj b/notebooks/benchmarks.clj index cf7e184..50274fe 100644 --- a/notebooks/benchmarks.clj +++ b/notebooks/benchmarks.clj @@ -20,8 +20,8 @@ (defn parse ([text] (parse [] text)) ([extra-tokenizers text] - (md.parser/parse (update md.parser/empty-doc :text-tokenizers concat extra-tokenizers) - (md/tokenize text)))) + (md/parse (update md.parser/empty-doc :text-tokenizers concat extra-tokenizers) + text))) (comment diff --git a/notebooks/tight_lists.clj b/notebooks/tight_lists.clj index 640ac3a..d3ea26f 100644 --- a/notebooks/tight_lists.clj +++ b/notebooks/tight_lists.clj @@ -35,40 +35,6 @@ ;; * to hide paragraphs. ;; **/ ;; this.hidden = false -;; -;; so when a paragraph is marked as hidden, markdown-it will unwrap its contents. - -(defn flat-tokenize [text] - (into [] - (comp - (mapcat (partial tree-seq (comp seq :children) :children)) - (map #(select-keys % [:type :content :hidden :level :info]))) - (md/tokenize text))) - -;; Some examples follow of a -;; * tight list -(flat-tokenize " -- one -- two") - -;; * loose list because of an inner paragraph -(flat-tokenize " -- one - - inner par -- two") - -;; * loose list with 2-newline separated items -(flat-tokenize " -- one - -- two") - -(flat-tokenize " -- one - * thight sub one -- two -") ;; ## Pandoc to the Rescue ;; diff --git a/src/nextjournal/markdown.clj b/src/nextjournal/markdown.clj deleted file mode 100644 index aeabd93..0000000 --- a/src/nextjournal/markdown.clj +++ /dev/null @@ -1,100 +0,0 @@ -(ns nextjournal.markdown - "Facility functions for handling markdown conversions" - (:require [clojure.java.io :as io] - [clojure.data.json :as json] - [nextjournal.markdown.parser :as markdown.parser] - [nextjournal.markdown.commonmark :as commonmark] - [nextjournal.markdown.transform :as markdown.transform]) - (:import (org.graalvm.polyglot Context Context$Builder Source Value) - (java.io Reader))) - -(set! *warn-on-reflection* true) - -(def ^Context$Builder context-builder - (doto (Context/newBuilder (into-array String ["js"])) - (.option "js.timer-resolution" "1") - (.option "js.java-package-globals" "false") - (.option "js.esm-eval-returns-exports", "true") - ;; ⬆ returns module exports when evaling an esm module file, note this will only work on stock JVM or on GraalJVM - ;; matching the poliglot library versions specified in deps.edn - (.out System/out) - (.err System/err) - (.allowIO true) - (.allowExperimentalOptions true) - (.allowAllAccess true) - (.allowNativeAccess true) - (.option "engine.WarnInterpreterOnly" "false"))) - -(def ^Context ctx (.build context-builder)) - -(def ^Value MD-imports - ;; Contructing a `java.io.Reader` first to work around a bug with graal on windows - ;; see https://github.com/oracle/graaljs/issues/534 and https://github.com/nextjournal/viewers/pull/33 - (let [source (-> (io/resource "js/markdown.mjs") - io/input-stream - io/reader - (as-> r (Source/newBuilder "js" ^Reader r "markdown.mjs")))] - (locking ctx - (.. ctx - (eval (.build source)) - (getMember "default"))))) - -(def ^Value tokenize-fn (.getMember MD-imports "tokenizeJSON")) - -(defn tokenize [markdown-text] - (let [^Value tokens-json (locking ctx - (.execute tokenize-fn (to-array [markdown-text])))] - (json/read-str (.asString tokens-json) :key-fn keyword))) - -(def ^:dynamic *legacy-graal-js-parser* true) -(defmacro with-new-parser [& body] - `(binding [*legacy-graal-js-parser* false] ~@body)) - -(defn parse - "Turns a markdown string into a nested clojure structure." - ([markdown-text] (parse markdown.parser/empty-doc markdown-text)) - ([doc markdown-text] - (if *legacy-graal-js-parser* - (markdown.parser/parse doc (tokenize markdown-text)) - (commonmark/parse doc markdown-text)))) - -(defn ->hiccup - "Turns a markdown string into hiccup." - ([markdown-text] (->hiccup markdown.transform/default-hiccup-renderers markdown-text)) - ([ctx markdown-text] (->> markdown-text parse (markdown.transform/->hiccup ctx)))) - -(comment - (tokenize "# Title -- [ ] one -- [x] two -") - - (parse "# Hello Markdown -- [ ] what -- [ ] [nice](very/nice/thing) -- [x] ~~thing~~ -") - - (with-new-parser - (parse "# Hello Markdown -- [ ] what -- [ ] [nice](very/nice/thing) -- [x] ~~thing~~ -")) - - (->hiccup "# Hello Markdown - -* What's _going_ on? -") - - (->hiccup - (assoc markdown.transform/default-hiccup-renderers - :heading (fn [ctx node] - [:h1.some-extra.class - (markdown.transform/into-markup [:span.some-other-class] ctx node)])) - "# Hello Markdown -* What's _going_ on? -") - - ;; launch shadow cljs repl - (shadow.cljs.devtools.api/repl :sci)) diff --git a/src/nextjournal/markdown.cljc b/src/nextjournal/markdown.cljc new file mode 100644 index 0000000..87b7633 --- /dev/null +++ b/src/nextjournal/markdown.cljc @@ -0,0 +1,57 @@ +(ns nextjournal.markdown + "Markdown as data" + (:require [nextjournal.markdown.parser.impl :as impl] + [nextjournal.markdown.parser.impl.utils :as u] + [nextjournal.markdown.transform :as markdown.transform])) + + +;; TODO: remove fixme (shadow compile warnings) +(defn tokenize [_] []) + +(defn parse + "Turns a markdown string into a nested clojure structure." + ([markdown-text] (impl/parse markdown-text)) + ([doc markdown-text] + (-> doc + (impl/parse markdown-text) + (dissoc :text-tokenizers + :nextjournal.markdown.parser.impl/id->index + :nextjournal.markdown.parser.impl/path)))) + +(defn ->hiccup + "Turns a markdown string into hiccup." + ([markdown-text] (->hiccup markdown.transform/default-hiccup-renderers markdown-text)) + ([ctx markdown-text] (->> markdown-text parse (markdown.transform/->hiccup ctx)))) + +(comment + (parse "# 🎱 Hello") + + (parse "# Hello Markdown +- [ ] what +- [ ] [nice](very/nice/thing) +- [x] ~~thing~~ +") + + (with-new-parser + (parse "# Hello Markdown +- [ ] what +- [ ] [nice](very/nice/thing) +- [x] ~~thing~~ +")) + + (->hiccup "# Hello Markdown + +* What's _going_ on? +") + + (->hiccup + (assoc markdown.transform/default-hiccup-renderers + :heading (fn [ctx node] + [:h1.some-extra.class + (markdown.transform/into-markup [:span.some-other-class] ctx node)])) + "# Hello Markdown +* What's _going_ on? +") + + ;; launch shadow cljs repl + (shadow.cljs.devtools.api/repl :sci)) diff --git a/src/nextjournal/markdown.cljs b/src/nextjournal/markdown.cljs deleted file mode 100644 index 53b851d..0000000 --- a/src/nextjournal/markdown.cljs +++ /dev/null @@ -1,51 +0,0 @@ -(ns nextjournal.markdown - (:require ["/js/markdown" :as md] - ["markdown-it/lib/token" :as Token] - [applied-science.js-interop :as j] - [nextjournal.markdown.parser :as markdown.parser] - [nextjournal.markdown.transform :as markdown.transform])) - -(extend-type Token - ILookup - (-lookup [this key] (j/get this key))) - -(def tokenize md/tokenize) - -(defn parse - "Turns a markdown string into a nested clojure structure." - ([markdown-text] (parse markdown.parser/empty-doc markdown-text)) - ([doc markdown-text] (markdown.parser/parse doc (tokenize markdown-text)))) - -(defn ->hiccup - "Turns a markdown string into hiccup." - ([markdown-text] (->hiccup markdown.transform/default-hiccup-renderers markdown-text)) - ([ctx markdown-text] (->> markdown-text parse (markdown.transform/->hiccup ctx)))) - -(comment - (tokenize "# Title -- [ ] one -- [x] two -") - - (parse "# Hello Markdown -- [ ] what -- [ ] [nice](very/nice/thing) -- [x] ~~thing~~ -") - - (->hiccup "# Hello Markdown - -* What's _going_ on? -") - - (->hiccup - (assoc markdown.transform/default-hiccup-renderers - :heading (fn [ctx node] - [:h1.some-extra.class - (markdown.transform/into-markup [:span.some-other-class] ctx node)])) - "# Hello Markdown -* What's _going_ on? -") - - ;; launch shadow cljs repl - (shadow.cljs.devtools.api/repl :browser-test)) diff --git a/src/nextjournal/markdown/parser.cljc b/src/nextjournal/markdown/parser.cljc index 437dfae..763ab2e 100644 --- a/src/nextjournal/markdown/parser.cljc +++ b/src/nextjournal/markdown/parser.cljc @@ -422,33 +422,7 @@ end" :else (recur (z/right loc) parent)))))) -(comment - (-> "_hello_ what and foo[^note1] and^[some other note]. - -And what. - -[^note1]: the _what_ -* and new text[^endnote] at the end. -* the - * hell^[that warm place] - -[^endnote]: conclusion. -" - nextjournal.markdown/tokenize - parse - #_ flatten-tokens - #_ - insert-sidenote-containers) - - (-> empty-doc - (update :text-tokenizers (partial map normalize-tokenizer)) - (apply-tokens (nextjournal.markdown/tokenize "what^[the heck]")) - insert-sidenote-columns - (apply-tokens (nextjournal.markdown/tokenize "# Hello")) - insert-sidenote-columns - (apply-tokens (nextjournal.markdown/tokenize "is^[this thing]")) - insert-sidenote-columns)) ;; tables ;; table data tokens might have {:style "text-align:right|left"} attrs, maybe better nested node > :attrs > :style ? diff --git a/src/nextjournal/markdown/commonmark.clj b/src/nextjournal/markdown/parser/impl.clj similarity index 99% rename from src/nextjournal/markdown/commonmark.clj rename to src/nextjournal/markdown/parser/impl.clj index a7d787d..0442f74 100644 --- a/src/nextjournal/markdown/commonmark.clj +++ b/src/nextjournal/markdown/parser/impl.clj @@ -1,4 +1,4 @@ -(ns nextjournal.markdown.commonmark +(ns nextjournal.markdown.parser.impl (:require [clojure.zip :as z] [nextjournal.markdown.parser :as parser] [nextjournal.markdown.parser2.types] diff --git a/src/nextjournal/markdown/parser/impl.cljs b/src/nextjournal/markdown/parser/impl.cljs new file mode 100644 index 0000000..1a73ba4 --- /dev/null +++ b/src/nextjournal/markdown/parser/impl.cljs @@ -0,0 +1,644 @@ +;; # 🧩 Parsing +;; plan +;; - write this with parse/2 copying from parser.cljc +;; - introduce impl.shared +;; - copy tokenizer from markdown cljs +;; - make markdown.clj cljc (break clj parsing) +;; - delete markdown.cljs +;; - + +(ns nextjournal.markdown.parser.impl + (:require ["/js/markdown" :as md] + ["markdown-it/lib/token" :as Token] + [applied-science.js-interop :as j] + [clojure.string :as str] + [clojure.zip :as z] + [nextjournal.markdown.transform :as md.transform] + [nextjournal.markdown.parser.emoji :as emoji] + ;; TODO: drop refers + [nextjournal.markdown.parser.impl.utils :as u :refer [empty-doc re-idx-seq]])) + +(extend-type Token + ILookup + (-lookup [this key] (j/get this key))) + +(defn inc-last [path] (update path (dec (count path)) inc)) +(defn hlevel [{:as _token hn :tag}] (when (string? hn) (some-> (re-matches #"h([\d])" hn) second js/parseInt))) + +(defn split-by-emoji [s] + (let [[match start end] (first (re-idx-seq emoji/regex s))] + (if match + [(subs s start end) (str/trim (subs s end))] + [nil s]))) + +#_(split-by-emoji " Stop") +#_(split-by-emoji "🤚🏽 Stop") +#_(split-by-emoji "🤚🏽🤚 Stop") +#_(split-by-emoji "🤚🏽Stop") +#_(split-by-emoji "🤚🏽 Stop") +#_(split-by-emoji "😀 Stop") +#_(split-by-emoji "⚛️ Stop") +#_(split-by-emoji "⚛ Stop") +#_(split-by-emoji "⬇ Stop") +#_(split-by-emoji "Should not 🙁️ Split") + +(defn text->id+emoji [text] + (when (string? text) + (let [[emoji text'] (split-by-emoji (str/trim text))] + (cond-> {:id (apply str (map (comp str/lower-case (fn [c] (case c (\space \_) \- c))) text'))} + emoji (assoc :emoji emoji))))) + +#_(text->id+emoji "Hello There") +#_(text->id+emoji "Hello_There") +#_(text->id+emoji "👩‍🔬 Quantum Physics") + +;; `parse-fence-info` ingests nextjournal, GFM, Pandoc and RMarkdown fenced code block info (any text following the leading 3 backticks) and returns a map +;; +;; _nextjournal_ / _GFM_ +;; +;; ```python id=2e3541da-0735-4b7f-a12f-4fb1bfcb6138 +;; python code +;; ``` +;; +;; _Pandoc_ +;; +;; ```{#pandoc-id .languge .extra-class key=Val} +;; code in language +;; ``` +;; +;; _Rmd_ +;; +;; ```{r cars, echo=FALSE} +;; R code +;; ``` +;; +;; See also: +;; - https://github.github.com/gfm/#info-string +;; - https://pandoc.org/MANUAL.html#fenced-code-blocks +;; - https://rstudio.com/wp-content/uploads/2016/03/rmarkdown-cheatsheet-2.0.pdf" + +(defn parse-fence-info [info-str] + (try + (when (string? info-str) + (let [tokens (-> info-str + str/trim + (str/replace #"[\{\}\,]" "") ;; remove Pandoc/Rmarkdown brackets and commas + (str/replace "." "") ;; remove dots + (str/split #" "))] ;; split by spaces + (reduce + (fn [{:as info-map :keys [language]} token] + (let [[_ k v] (re-matches #"^([^=]+)=([^=]+)$" token)] + (cond + (str/starts-with? token "#") (assoc info-map :id (str/replace token #"^#" "")) ;; pandoc #id + (and k v) (assoc info-map (keyword k) v) + (not language) (assoc info-map :language token) ;; language is the first simple token which is not a pandoc's id + :else (assoc info-map (keyword token) true)))) + {} + tokens))) + (catch :default _ {}))) + +(comment + (parse-fence-info "python runtime-id=5f77e475-6178-47a3-8437-45c9c34d57ff") + (parse-fence-info "{#some-id .lang foo=nex}") + (parse-fence-info "#id clojure") + (parse-fence-info "clojure #id") + (parse-fence-info "clojure") + (parse-fence-info "{r cars, echo=FALSE}")) + +;; leaf nodes +(defn text-node [text] {:type :text :text text}) +(defn formula [text] {:type :formula :text text}) +(defn block-formula [text] {:type :block-formula :text text}) +(defn footnote-ref [ref label] (cond-> {:type :footnote-ref :ref ref} label (assoc :label label))) + +;; node constructors +(defn node + [type content attrs top-level] + (cond-> {:type type :content content} + (seq attrs) (assoc :attrs attrs) + (seq top-level) (merge top-level))) + +(defn empty-text-node? [{text :text t :type}] (and (= :text t) (empty? text))) + +(defn push-node [{:as doc ::keys [path]} node] + (try + (cond-> doc + ;; ⬇ mdit produces empty text tokens at mark boundaries, see edge cases below + (not (empty-text-node? node)) + (-> #_doc + (update ::path inc-last) + (update-in (pop path) conj node))) + (catch js/Error e + (throw (ex-info (str "nextjournal.markdown cannot add node: " node " at path: " path) + {:doc doc :node node} e))))) + +(def push-nodes (partial reduce push-node)) + +(defn open-node + ([doc type] (open-node doc type {})) + ([doc type attrs] (open-node doc type attrs {})) + ([doc type attrs top-level] + (-> doc + (push-node (node type [] attrs top-level)) + (update ::path into [:content -1])))) + +;; after closing a node, document ::path will point at it +(def ppop (comp pop pop)) +(defn close-node [doc] (update doc ::path ppop)) +(defn update-current [{:as doc path ::path} fn & args] (apply update-in doc path fn args)) + +(defn current-parent-node + "Given an open parsing context `doc`, returns the parent of the node which was last parsed into the document." + [{:as doc ::keys [path]}] + (assert path "A path is needed in document context to retrieve the current node: `current-parent-node` cannot be called after `parse`.") + (get-in doc (ppop path))) + +(defn current-ancestor-nodes + "Given an open parsing context `doc`, returns the list of ancestors of the node last parsed into the document, up to but + not including the top document." + [{:as doc ::keys [path]}] + (assert path "A path is needed in document context to retrieve the current node: `current-ancestor-nodes` cannot be called after `parse`.") + (loop [p (ppop path) ancestors []] + (if (seq p) + (recur (ppop p) (conj ancestors (get-in doc p))) + ancestors))) + +(defn ->zip [doc] + (z/zipper (every-pred map? :type) :content + (fn [node cs] (assoc node :content (vec cs))) + doc)) + +(defn assign-node-id+emoji [{:as doc ::keys [id->index path] :keys [text->id+emoji-fn]}] + (let [{:keys [id emoji]} (when (ifn? text->id+emoji-fn) (-> doc (get-in path) text->id+emoji-fn)) + id-count (when id (get id->index id))] + (cond-> doc + id + (update-in [::id->index id] (fnil inc 0)) + (or id emoji) + (update-in path (fn [node] + (cond-> node + id (assoc-in [:attrs :id] (cond-> id id-count (str "-" (inc id-count)))) + emoji (assoc :emoji emoji))))))) + +(comment ;; path after call + (-> empty-doc ;; [:content -1] + (open-node :heading) ;; [:content 0 :content -1] + (push-node {:node/type :text :text "foo"}) ;; [:content 0 :content 0] + (push-node {:node/type :text :text "foo"}) ;; [:content 0 :content 1] + close-node ;; [:content 1] + + (open-node :paragraph) ;; [:content 1 :content] + (push-node {:node/type :text :text "hello"}) + close-node + (open-node :bullet-list) + ;; + )) +;; endregion + +;; region TOC builder: +;; toc nodes are heading nodes but with `:type` `:toc` and an extra branching along +;; the key `:children` representing the sub-sections of the node +(defn into-toc [toc {:as toc-item :keys [heading-level]}] + (loop [toc toc l heading-level toc-path [:children]] + ;; `toc-path` is `[:children i₁ :children i₂ ... :children]` + (let [type-path (assoc toc-path (dec (count toc-path)) :type)] + (cond + ;; insert intermediate default empty :content collections for the final update-in (which defaults to maps otherwise) + (not (get-in toc toc-path)) + (recur (assoc-in toc toc-path []) l toc-path) + + ;; fill in toc types for non-contiguous jumps like h1 -> h3 + (not (get-in toc type-path)) + (recur (assoc-in toc type-path :toc) l toc-path) + + (= 1 l) + (update-in toc toc-path (fnil conj []) toc-item) + + :else + (recur toc + (dec l) + (conj toc-path + (max 0 (dec (count (get-in toc toc-path)))) ;; select last child at level if it exists + :children)))))) + +(defn add-to-toc [doc {:as h :keys [heading-level]}] + (cond-> doc (pos-int? heading-level) (update :toc into-toc (assoc h :type :toc)))) + +(defn set-title-when-missing [{:as doc :keys [title]} heading] + (cond-> doc (nil? title) (assoc :title (md.transform/->text heading)))) + +(defn add-title+toc + "Computes and adds a :title and a :toc to the document-like structure `doc` which might have not been constructed by means of `parse`." + [{:as doc :keys [content]}] + (let [rf (fn [doc heading] (-> doc (add-to-toc heading) (set-title-when-missing heading))) + xf (filter (comp #{:heading} :type))] + (reduce (xf rf) (assoc doc :toc {:type :toc}) content))) + +(comment + (-> {:type :toc} + ;;(into-toc {:heading-level 3 :title "Foo"}) + ;;(into-toc {:heading-level 2 :title "Section 1"}) + (into-toc {:heading-level 1 :title "Title" :type :toc}) + (into-toc {:heading-level 4 :title "Section 2" :type :toc}) + ;;(into-toc {:heading-level 4 :title "Section 2.1"}) + ;;(into-toc {:heading-level 2 :title "Section 3"}) + ) + + (-> "# Top _Title_ + +par + +### Three + +## Two + +par +- and a nested +- ### Heading not included + +foo + +## Two Again + +par + +# One Again + +[[TOC]] + +#### Four + +end" + nextjournal.markdown/parse + :toc + )) +;; endregion + +;; region token handlers +(declare apply-tokens) +(defmulti apply-token (fn [_doc token] (:type token))) +(defmethod apply-token :default [doc token] + (prn :apply-token/unknown-type {:token token}) + doc) + +;; blocks +(defmethod apply-token "heading_open" [doc token] (open-node doc :heading {} {:heading-level (hlevel token)})) +(defmethod apply-token "heading_close" [doc {doc-level :level}] + (let [{:as doc ::keys [path]} (close-node doc) + doc' (assign-node-id+emoji doc) + heading (-> doc' (get-in path) (assoc :path path))] + (cond-> doc' + ;; We're only considering top-level headings (e.g. not those contained inside quotes or lists) + (zero? doc-level) + (-> (add-to-toc heading) + (set-title-when-missing heading))))) + +;; for building the TOC we just care about headings at document top level (not e.g. nested under lists) ⬆ + +(defmethod apply-token "paragraph_open" [doc {:as _token :keys [hidden]}] (open-node doc (if hidden :plain :paragraph))) +(defmethod apply-token "paragraph_close" [doc _token] (close-node doc)) + +(defmethod apply-token "bullet_list_open" [doc {{:as attrs :keys [has-todos]} :attrs}] (open-node doc (if has-todos :todo-list :bullet-list) attrs)) +(defmethod apply-token "bullet_list_close" [doc _token] (close-node doc)) + +(defmethod apply-token "ordered_list_open" [doc {:keys [attrs]}] (open-node doc :numbered-list attrs)) +(defmethod apply-token "ordered_list_close" [doc _token] (close-node doc)) + +(defmethod apply-token "list_item_open" [doc {{:as attrs :keys [todo]} :attrs}] (open-node doc (if todo :todo-item :list-item) attrs)) +(defmethod apply-token "list_item_close" [doc _token] (close-node doc)) + +(defmethod apply-token "math_block" [doc {text :content}] (push-node doc (block-formula text))) +(defmethod apply-token "math_block_end" [doc _token] doc) + +(defmethod apply-token "hr" [doc _token] (push-node doc {:type :ruler})) + +(defmethod apply-token "blockquote_open" [doc _token] (open-node doc :blockquote)) +(defmethod apply-token "blockquote_close" [doc _token] (close-node doc)) + +(defmethod apply-token "tocOpen" [doc _token] (open-node doc :toc)) +(defmethod apply-token "tocBody" [doc _token] doc) ;; ignore body +(defmethod apply-token "tocClose" [doc _token] (-> doc close-node (update-current dissoc :content))) + +(defmethod apply-token "code_block" [doc {:as _token c :content}] + (-> doc + (open-node :code) + (push-node (text-node c)) + close-node)) +(defmethod apply-token "fence" [doc {:as _token i :info c :content}] + (-> doc + (open-node :code {} (assoc (parse-fence-info i) :info i)) + (push-node (text-node c)) + close-node)) + +;; footnotes +(defmethod apply-token "footnote_ref" [{:as doc :keys [footnotes]} token] + (push-node doc (footnote-ref (+ (count footnotes) (j/get-in token [:meta :id])) + (j/get-in token [:meta :label])))) + +(defmethod apply-token "footnote_anchor" [doc token] doc) + +(defmethod apply-token "footnote_open" [{:as doc ::keys [footnote-offset]} token] + ;; consider an offset in case we're parsing multiple inputs into the same context + (let [ref (+ (j/get-in token [:meta :id]) footnote-offset) + label (j/get-in token [:meta :label])] + (open-node doc :footnote nil (cond-> {:ref ref} label (assoc :label label))))) + +(defmethod apply-token "footnote_close" [doc token] (close-node doc)) + +(defmethod apply-token "footnote_block_open" [{:as doc :keys [footnotes] ::keys [path]} _token] + ;; store footnotes at a top level `:footnote` key + (let [footnote-offset (count footnotes)] + (-> doc + (assoc ::path [:footnotes (dec footnote-offset)] + ::footnote-offset footnote-offset + ::path-to-restore path)))) + +(defmethod apply-token "footnote_block_close" + ;; restores path for addding new tokens + [{:as doc ::keys [path-to-restore]} _token] + (-> doc + (assoc ::path path-to-restore) + (dissoc ::path-to-restore ::footnote-offset))) + +(defn footnote->sidenote [{:keys [ref label content]}] + ;; this assumes the footnote container is a paragraph, won't work for lists + (node :sidenote (-> content first :content) nil (cond-> {:ref ref} label (assoc :label label)))) + +(defn node-with-sidenote-refs [p-node] + (loop [l (->zip p-node) refs []] + (if (z/end? l) + (when (seq refs) + {:node (z/root l) :refs refs}) + (let [{:keys [type ref]} (z/node l)] + (if (= :footnote-ref type) + (recur (z/next (z/edit l assoc :type :sidenote-ref)) (conj refs ref)) + (recur (z/next l) refs)))))) + +(defn insert-sidenote-containers + "Handles footnotes as sidenotes. + + Takes and returns a parsed document. When the document has footnotes, wraps every top-level block which contains footnote references + with a `:footnote-container` node, into each of such nodes, adds a `:sidenote-column` node containing a `:sidenote` node for each found ref. + Renames type `:footnote-ref` to `:sidenote-ref." + [{:as doc ::keys [path] :keys [footnotes]}] + (if-not (seq footnotes) + doc + (let [root (->zip doc)] + (loop [loc (z/down root) parent root] + (cond + (nil? loc) + (-> parent z/node (assoc :sidenotes? true)) + (contains? #{:plain :paragraph :blockquote :numbered-list :bullet-list :todo-list :heading :table} + (:type (z/node loc))) + (if-some [{:keys [node refs]} (node-with-sidenote-refs (z/node loc))] + (let [new-loc (-> loc (z/replace {:type :sidenote-container :content []}) + (z/append-child node) + (z/append-child {:type :sidenote-column + :content (mapv #(footnote->sidenote (get footnotes %)) (distinct refs))}))] + (recur (z/right new-loc) (z/up new-loc))) + (recur (z/right loc) parent)) + :else + (recur (z/right loc) parent)))))) + +(comment + (-> "_hello_ what and foo[^note1] and^[some other note]. + +And what. + +[^note1]: the _what_ + +* and new text[^endnote] at the end. +* the + * hell^[that warm place] + +[^endnote]: conclusion. +" + nextjournal.markdown/tokenize + parse + #_flatten-tokens + #_insert-sidenote-containers) + + (-> empty-doc + (update :text-tokenizers (partial map normalize-tokenizer)) + (apply-tokens (nextjournal.markdown/tokenize "what^[the heck]")) + insert-sidenote-columns + (apply-tokens (nextjournal.markdown/tokenize "# Hello")) + insert-sidenote-columns + (apply-tokens (nextjournal.markdown/tokenize "is^[this thing]")) + insert-sidenote-columns)) + +;; tables +;; table data tokens might have {:style "text-align:right|left"} attrs, maybe better nested node > :attrs > :style ? +(defmethod apply-token "table_open" [doc _token] (open-node doc :table)) +(defmethod apply-token "table_close" [doc _token] (close-node doc)) +(defmethod apply-token "thead_open" [doc _token] (open-node doc :table-head)) +(defmethod apply-token "thead_close" [doc _token] (close-node doc)) +(defmethod apply-token "tr_open" [doc _token] (open-node doc :table-row)) +(defmethod apply-token "tr_close" [doc _token] (close-node doc)) +(defmethod apply-token "th_open" [doc token] (open-node doc :table-header (:attrs token))) +(defmethod apply-token "th_close" [doc _token] (close-node doc)) +(defmethod apply-token "tbody_open" [doc _token] (open-node doc :table-body)) +(defmethod apply-token "tbody_close" [doc _token] (close-node doc)) +(defmethod apply-token "td_open" [doc token] (open-node doc :table-data (:attrs token))) +(defmethod apply-token "td_close" [doc _token] (close-node doc)) + +(comment + (-> + " + | Syntax | JVM | JavaScript | + |--------|:------------------------:|--------------------------------:| + | foo | Loca _lDate_ ahoiii | goog.date.Date | + | bar | java.time.LocalTime | some [kinky](link/to/something) | + | bag | java.time.LocalDateTime | $\\phi$ | + " + nextjournal.markdown/parse + nextjournal.markdown.transform/->hiccup + )) + +;; ## Handling of Text Tokens +;; +;; normalize-tokenizer :: {:regex, :doc-handler} | {:tokenizer-fn, :handler} -> Tokenizer +;; Tokenizer :: {:tokenizer-fn :: TokenizerFn, :doc-handler :: DocHandler} +;; +;; Match :: Any +;; Handler :: Match -> Node +;; IndexedMatch :: (Match, Int, Int) +;; TokenizerFn :: String -> [IndexedMatch] +;; DocHandler :: Doc -> {:match :: Match} -> Doc + +(def hashtag-tokenizer + {:regex #"(^|\B)#[\w-]+" + :pred #(every? (complement #{:link}) (map :type (current-ancestor-nodes %))) + :handler (fn [match] {:type :hashtag :text (subs (match 0) 1)})}) + +(def internal-link-tokenizer + {:regex #"\[\[([^\]]+)\]\]" + :pred #(every? (complement #{:link}) (map :type (current-ancestor-nodes %))) + :handler (fn [match] {:type :internal-link :text (match 1)})}) + +(comment + (->> "# Hello #Fishes + +> what about #this + +_this #should be a tag_, but this [_actually #foo shouldnt_](/bar/) is not." + nextjournal.markdown/tokenize + (parse (update empty-doc :text-tokenizers conj hashtag-tokenizer)))) + + +(defn normalize-tokenizer + "Normalizes a map of regex and handler into a Tokenizer" + [{:as tokenizer :keys [doc-handler pred handler regex tokenizer-fn]}] + (assert (and (or doc-handler handler) (or regex tokenizer-fn))) + (cond-> tokenizer + (not doc-handler) (assoc :doc-handler (fn [doc {:keys [match]}] (push-node doc (handler match)))) + (not tokenizer-fn) (assoc :tokenizer-fn (partial re-idx-seq regex)) + (not pred) (assoc :pred (constantly true)))) + +(defn tokenize-text-node [{:as tkz :keys [tokenizer-fn pred doc-handler]} doc {:as node :keys [text]}] + ;; TokenizerFn -> HNode -> [HNode] + (assert (and (fn? tokenizer-fn) (fn? doc-handler) (fn? pred) (string? text)) + {:text text :tokenizer tkz}) + (let [idx-seq (when (pred doc) (tokenizer-fn text))] + (if (seq idx-seq) + (let [text-hnode (fn [s] (assoc (text-node s) :doc-handler push-node)) + {:keys [nodes remaining-text]} + (reduce (fn [{:as acc :keys [remaining-text]} [match start end]] + (-> acc + (update :remaining-text subs 0 start) + (cond-> + (< end (count remaining-text)) + (update :nodes conj (text-hnode (subs remaining-text end)))) + (update :nodes conj {:doc-handler doc-handler + :match match :text text + :start start :end end}))) + {:remaining-text text :nodes ()} + (reverse idx-seq))] + (cond-> nodes + (seq remaining-text) + (conj (text-hnode remaining-text)))) + [node]))) + +(defmethod apply-token "text" [{:as doc :keys [text-tokenizers]} {:keys [content]}] + (reduce (fn [doc {:as node :keys [doc-handler]}] (doc-handler doc (dissoc node :doc-handler))) + doc + (reduce (fn [nodes tokenizer] + (mapcat (fn [{:as node :keys [type]}] + (if (= :text type) (tokenize-text-node tokenizer doc node) [node])) + nodes)) + [{:type :text :text content :doc-handler push-node}] + text-tokenizers))) + +(comment + (def mustache (normalize-tokenizer {:regex #"\{\{([^\{]+)\}\}" :handler (fn [m] {:type :eval :text (m 1)})})) + (tokenize-text-node mustache {} {:text "{{what}} the {{hellow}}"}) + (apply-token (assoc empty-doc :text-tokenizers [mustache]) + {:type "text" :content "foo [[bar]] dang #hashy taggy [[what]] #dangy foo [[great]] and {{eval}} me"}) + + (parse (assoc empty-doc + :text-tokenizers + [(normalize-tokenizer {:regex #"\{\{([^\{]+)\}\}" + :doc-handler (fn [{:as doc ::keys [path]} {[_ meta] :match}] + (update-in doc (ppop path) assoc :meta meta))})]) + (nextjournal.markdown/tokenize "# Title {{id=heading}} +* one +* two"))) + +;; inlines +(defmethod apply-token "inline" [doc {:as _token ts :children}] (apply-tokens doc ts)) +(defmethod apply-token "math_inline" [doc {text :content}] (push-node doc (formula text))) +(defmethod apply-token "math_inline_double" [doc {text :content}] (push-node doc (formula text))) + +;; https://spec.commonmark.org/0.30/#softbreak +(defmethod apply-token "softbreak" [doc _token] (push-node doc {:type :softbreak})) +;; https://spec.commonmark.org/0.30/#hard-line-break +(defmethod apply-token "hardbreak" [doc _token] (push-node doc {:type :hardbreak})) + +;; images +(defmethod apply-token "image" [doc {:keys [attrs children]}] (-> doc (open-node :image attrs) (apply-tokens children) close-node)) + +;; marks +(defmethod apply-token "em_open" [doc _token] (open-node doc :em)) +(defmethod apply-token "em_close" [doc _token] (close-node doc)) +(defmethod apply-token "strong_open" [doc _token] (open-node doc :strong)) +(defmethod apply-token "strong_close" [doc _token] (close-node doc)) +(defmethod apply-token "s_open" [doc _token] (open-node doc :strikethrough)) +(defmethod apply-token "s_close" [doc _token] (close-node doc)) +(defmethod apply-token "link_open" [doc token] (open-node doc :link (:attrs token))) +(defmethod apply-token "link_close" [doc _token] (close-node doc)) +(defmethod apply-token "code_inline" [doc {text :content}] (-> doc (open-node :monospace) (push-node (text-node text)) close-node)) + +;; html (ignored) +(defmethod apply-token "html_inline" [doc _] doc) +(defmethod apply-token "html_block" [doc _] doc) +;; endregion + +;; region data builder api +(defn pairs->kmap [pairs] (into {} (map (juxt (comp keyword first) second)) pairs)) +(defn apply-tokens [doc tokens] + (let [mapify-attrs-xf (map (fn [x] (j/update! x :attrs pairs->kmap)))] + (reduce (mapify-attrs-xf apply-token) doc tokens))) + +(defn parse + ([markdown] + ;; TODO: unify emoji extraction + (parse empty-doc markdown)) + ([ctx markdown] + (apply-tokens (-> ctx + (assoc :text->id+emoji-fn (comp text->id+emoji md.transform/->text)) + ;; TODO: 👆unify + (update :text-tokenizers (partial map normalize-tokenizer))) + (md/tokenize markdown)))) + +(comment + (defn pr-dbg [x] (js/console.log (js/JSON.parse (js/JSON.stringify x)))) + (parse "# 🎱 Hello") + ) + +(comment + (some-> "# Title + +## Section 1 + +foo + +- # What is this? (no!) +- maybe + +### Section 1.2 + +## Section 2 + +some par + +### Section 2.1 + +some other par + +### Section 2.2 + +#### Section 2.2.1 + +two two one + +#### Section 2.2.2 + +two two two + +## Section 3 + +some final par" + nextjournal.markdown/parse + (section-at [:content 9]) ;; ⬅ paths are stored in TOC sections + nextjournal.markdown.transform/->hiccup)) +;; endregion + + +;; ## 🔧 Debug +;; A view on flattened tokens to better inspect tokens +(defn flatten-tokens [tokens] + (into [] + (comp + (mapcat (partial tree-seq (comp seq :children) :children)) + (map #(select-keys % [:type :content :hidden :level :info :meta]))) + tokens)) diff --git a/src/nextjournal/markdown/parser/impl/utils.cljc b/src/nextjournal/markdown/parser/impl/utils.cljc new file mode 100644 index 0000000..18bb8fd --- /dev/null +++ b/src/nextjournal/markdown/parser/impl/utils.cljc @@ -0,0 +1,48 @@ +(ns nextjournal.markdown.parser.impl.utils) + +(def empty-doc {:type :doc + :content [] + ;; Id -> Nat, to disambiguate ids for nodes with the same textual content + :nextjournal.markdown.parser.impl/id->index {} + ;; Node -> {id : String, emoji String}, dissoc from context to opt-out of ids + :toc {:type :toc} + :footnotes [] + :nextjournal.markdown.parser.impl/path [:content -1] ;; private + :text-tokenizers []}) + +#?(:clj (defn re-groups* [m] (let [g (re-groups m)] (cond-> g (not (vector? g)) vector)))) +(defn re-idx-seq + "Takes a regex and a string, returns a seq of triplets comprised of match groups followed by indices delimiting each match." + [re text] + #?(:clj (let [m (re-matcher re text)] + (take-while some? (repeatedly #(when (.find m) [(re-groups* m) (.start m) (.end m)])))) + :cljs (let [rex (js/RegExp. (.-source re) "g")] + (take-while some? (repeatedly #(when-some [m (.exec rex text)] [(vec m) (.-index m) (.-lastIndex rex)])))))) + +;; TODO: rewrite in terms of zippers +(def ppop (comp pop pop)) + +(defn current-ancestor-nodes + "Given an open parsing context `doc`, returns the list of ancestors of the node last parsed into the document, up to but + not including the top document." + [{:as doc :nextjournal.markdown.parser.impl/keys [path]}] + (assert path "A path is needed in document context to retrieve the current node: `current-ancestor-nodes` cannot be called after `parse`.") + (loop [p (ppop path) ancestors []] + (if (seq p) + (recur (ppop p) (conj ancestors (get-in doc p))) + ancestors))) + +(def hashtag-tokenizer + {:regex #"(^|\B)#[\w-]+" + :pred #(every? (complement #{:link}) (map :type (current-ancestor-nodes %))) + :handler (fn [match] {:type :hashtag :text (subs (match 0) 1)})}) + +(def internal-link-tokenizer + {:regex #"\[\[([^\]]+)\]\]" + :pred #(every? (complement #{:link}) (map :type (current-ancestor-nodes %))) + :handler (fn [match] {:type :internal-link :text (match 1)})}) + + +(comment + (re-idx-seq #"\{\{([^{]+)\}\}" "foo {{hello}} bar") + (re-idx-seq #"\{\{[^{]+\}\}" "foo {{hello}} bar {{what}} the")) diff --git a/test/nextjournal/markdown/multi_threading_test.clj b/test/nextjournal/markdown/multi_threading_test.clj index e53226e..a0265d4 100644 --- a/test/nextjournal/markdown/multi_threading_test.clj +++ b/test/nextjournal/markdown/multi_threading_test.clj @@ -5,7 +5,7 @@ (deftest multithreading (let [!exs (atom []) proc (fn [] - (try (md/tokenize (slurp "notebooks/reference.md")) + (try (md/parse (slurp "notebooks/reference.md")) (catch IllegalStateException e (swap! !exs conj e)))) t1 (new Thread proc) diff --git a/test/nextjournal/markdown_test.cljc b/test/nextjournal/markdown_test.cljc index 18693b5..9e2457c 100644 --- a/test/nextjournal/markdown_test.cljc +++ b/test/nextjournal/markdown_test.cljc @@ -1,22 +1,14 @@ (ns nextjournal.markdown-test - (:require [clojure.test :as t :refer [deftest testing is use-fixtures]] + (:require [clojure.test :as t :refer [deftest testing is]] [matcher-combinators.test :refer [match?]] [matcher-combinators.standalone :as standalone] [matcher-combinators.matchers :as m] [nextjournal.markdown :as md] [matcher-combinators.ansi-color] [nextjournal.markdown.parser :as md.parser] + [nextjournal.markdown.parser.impl.utils :as u] [nextjournal.markdown.transform :as md.transform])) -#?(:clj (use-fixtures :once - (fn [f] - (prn "Running Tests with legacy GraalJS parser") - (f) - (prn "----------------------------------------------------------------------------------") - (flush) - (prn "Running Tests with new Java parser") - (md/with-new-parser (f))))) - ;; com.bhauman/cljs-test-display doesn't play well with ANSI codes (matcher-combinators.ansi-color/disable!) @@ -39,11 +31,11 @@ $$\\int_a^bf(t)dt$$ ") (defn parse-internal-links [text] - (md/parse (update md.parser/empty-doc :text-tokenizers conj md.parser/internal-link-tokenizer) + (md/parse (update u/empty-doc :text-tokenizers conj u/internal-link-tokenizer) text)) (defn parse-hashtags [text] - (md/parse (update md.parser/empty-doc :text-tokenizers conj md.parser/hashtag-tokenizer) + (md/parse (update u/empty-doc :text-tokenizers conj u/hashtag-tokenizer) text)) (deftest parse-test From 020a93e0dd20b0bc9d9ad47ecf94a744e4999e83 Mon Sep 17 00:00:00 2001 From: Andrea Amantini Date: Tue, 13 Aug 2024 13:32:44 +0200 Subject: [PATCH 28/83] Rename parser2 ns --- src/nextjournal/markdown.cljc | 1 - src/nextjournal/markdown/parser/impl.clj | 10 +++++----- .../markdown/{parser2 => parser/impl}/formulas.clj | 2 +- .../markdown/{parser2 => parser/impl}/types.clj | 2 +- 4 files changed, 7 insertions(+), 8 deletions(-) rename src/nextjournal/markdown/{parser2 => parser/impl}/formulas.clj (98%) rename src/nextjournal/markdown/{parser2 => parser/impl}/types.clj (95%) diff --git a/src/nextjournal/markdown.cljc b/src/nextjournal/markdown.cljc index 87b7633..d66eb1d 100644 --- a/src/nextjournal/markdown.cljc +++ b/src/nextjournal/markdown.cljc @@ -1,7 +1,6 @@ (ns nextjournal.markdown "Markdown as data" (:require [nextjournal.markdown.parser.impl :as impl] - [nextjournal.markdown.parser.impl.utils :as u] [nextjournal.markdown.transform :as markdown.transform])) diff --git a/src/nextjournal/markdown/parser/impl.clj b/src/nextjournal/markdown/parser/impl.clj index 0442f74..c5915d3 100644 --- a/src/nextjournal/markdown/parser/impl.clj +++ b/src/nextjournal/markdown/parser/impl.clj @@ -1,8 +1,8 @@ (ns nextjournal.markdown.parser.impl (:require [clojure.zip :as z] [nextjournal.markdown.parser :as parser] - [nextjournal.markdown.parser2.types] - [nextjournal.markdown.parser2.formulas :as formulas]) + [nextjournal.markdown.parser.impl.types] + [nextjournal.markdown.parser.impl.formulas :as formulas]) (:import (org.commonmark.parser Parser) (org.commonmark.ext.task.list.items TaskListItemsExtension TaskListItemMarker) (org.commonmark.ext.footnotes FootnotesExtension FootnoteReference FootnoteDefinition InlineFootnote) @@ -35,13 +35,13 @@ (set! *warn-on-reflection* true) ;; TODO: ;; - [x] inline formulas -;; - [ ] block formulas +;; - [x] block formulas ;; - [x] tight lists ;; - [x] task lists -;; - [ ] footnotes +;; - [x] footnotes ;; - [ ] strikethroughs ext ;; - [ ] tables -;; - [ ] fenced code info +;; - [x] fenced code info ;; - [ ] html nodes ;; - [ ] auto link ;; - [ ] promote single images as blocks diff --git a/src/nextjournal/markdown/parser2/formulas.clj b/src/nextjournal/markdown/parser/impl/formulas.clj similarity index 98% rename from src/nextjournal/markdown/parser2/formulas.clj rename to src/nextjournal/markdown/parser/impl/formulas.clj index 6086632..231e9db 100644 --- a/src/nextjournal/markdown/parser2/formulas.clj +++ b/src/nextjournal/markdown/parser/impl/formulas.clj @@ -1,4 +1,4 @@ -(ns nextjournal.markdown.parser2.formulas +(ns nextjournal.markdown.parser.impl.formulas (:require [clojure.string :as str]) (:import (java.util Set) (java.util.regex Matcher) diff --git a/src/nextjournal/markdown/parser2/types.clj b/src/nextjournal/markdown/parser/impl/types.clj similarity index 95% rename from src/nextjournal/markdown/parser2/types.clj rename to src/nextjournal/markdown/parser/impl/types.clj index acdfb93..7c4cc3b 100644 --- a/src/nextjournal/markdown/parser2/types.clj +++ b/src/nextjournal/markdown/parser/impl/types.clj @@ -1,4 +1,4 @@ -(ns nextjournal.markdown.parser2.types) +(ns nextjournal.markdown.parser.impl.types) ;; See also ;; https://github.com/noties/Markwon/blob/master/markwon-ext-latex/src/main/java/io/noties/markwon/ext/latex/JLatexMathBlockParser.java From b73dd6ffc53723e09c59e6a92faaa95d72fe42b6 Mon Sep 17 00:00:00 2001 From: Andrea Amantini Date: Tue, 13 Aug 2024 13:40:43 +0200 Subject: [PATCH 29/83] Cleanup classes --- .../types$block_formula_getLiteral.class | Bin 1114 -> 1122 bytes .../impl}/types$block_formula_init.class | Bin 1097 -> 1105 bytes .../types$block_formula_setLiteral.class | Bin 1155 -> 1163 bytes .../impl/types$fn__40546.class} | Bin 1395 -> 1408 bytes .../impl/types$fn__44181.class} | Bin 1395 -> 1408 bytes .../types$inline_formula_getLiteral.class | Bin 1692 -> 1700 bytes .../impl}/types$inline_formula_init.class | Bin 1473 -> 1481 bytes .../types$loading__6810__auto____40544.class} | Bin 1614 -> 1623 bytes .../types$loading__6810__auto____44179.class} | Bin 1614 -> 1623 bytes .../parser/impl/types/BlockFormula.class | Bin 0 -> 6247 bytes .../parser/impl/types/InlineFormula.class | Bin 0 -> 5773 bytes .../impl}/types__init.class | Bin 4068 -> 4114 bytes .../markdown/parser2/types$fn__2219.class | Bin 1395 -> 0 bytes .../markdown/parser2/types$fn__2236.class | Bin 1395 -> 0 bytes .../markdown/parser2/types$fn__24779.class | Bin 1396 -> 0 bytes .../markdown/parser2/types$fn__2719.class | Bin 1395 -> 0 bytes .../markdown/parser2/types$fn__2723.class | Bin 1395 -> 0 bytes .../markdown/parser2/types$fn__2814.class | Bin 1395 -> 0 bytes .../markdown/parser2/types$fn__2842.class | Bin 1395 -> 0 bytes .../markdown/parser2/types$fn__2853.class | Bin 1395 -> 0 bytes .../markdown/parser2/types$fn__2892.class | Bin 1395 -> 0 bytes .../markdown/parser2/types$fn__2900.class | Bin 1395 -> 0 bytes .../markdown/parser2/types$fn__2908.class | Bin 1395 -> 0 bytes .../markdown/parser2/types$fn__3261.class | Bin 1395 -> 0 bytes .../markdown/parser2/types$fn__4781.class | Bin 1395 -> 0 bytes .../parser2/types$footnote_getLabel.class | Bin 1682 -> 0 bytes .../parser2/types$footnote_init.class | Bin 1459 -> 0 bytes .../parser2/types$footnote_ref_getLabel.class | Bin 1686 -> 0 bytes .../parser2/types$footnote_ref_init.class | Bin 1463 -> 0 bytes ...s$inline_formula_getClosingDelimiter.class | Bin 673 -> 0 bytes ...s$inline_formula_getOpeningDelimiter.class | Bin 673 -> 0 bytes .../types$loading__6803__auto____2217.class | Bin 2003 -> 0 bytes .../types$loading__6803__auto____2234.class | Bin 2003 -> 0 bytes .../types$loading__6803__auto____24777.class | Bin 1615 -> 0 bytes .../types$loading__6803__auto____2717.class | Bin 1614 -> 0 bytes .../types$loading__6803__auto____2721.class | Bin 1614 -> 0 bytes .../types$loading__6803__auto____2812.class | Bin 2003 -> 0 bytes .../types$loading__6803__auto____2840.class | Bin 2003 -> 0 bytes .../types$loading__6803__auto____2851.class | Bin 2003 -> 0 bytes .../types$loading__6803__auto____2890.class | Bin 2003 -> 0 bytes .../types$loading__6803__auto____2898.class | Bin 2003 -> 0 bytes .../types$loading__6803__auto____2906.class | Bin 2003 -> 0 bytes .../types$loading__6803__auto____3259.class | Bin 1614 -> 0 bytes .../types$loading__6803__auto____4779.class | Bin 1614 -> 0 bytes .../markdown/parser2/types/BlockFormula.class | Bin 6223 -> 0 bytes .../markdown/parser2/types/Footnote.class | Bin 5761 -> 0 bytes .../markdown/parser2/types/FootnoteRef.class | Bin 5693 -> 0 bytes .../parser2/types/InlineFormula.class | Bin 5753 -> 0 bytes deps.edn | 1 + src/nextjournal/markdown/parser/impl.clj | 19 ++++------ .../markdown/parser/impl/formulas.clj | 2 +- .../markdown/parser/impl/types.clj | 6 +-- .../markdown/parser/impl/utils.cljc | 35 +++++++++++++++++- 53 files changed, 47 insertions(+), 16 deletions(-) rename classes/nextjournal/markdown/{parser2 => parser/impl}/types$block_formula_getLiteral.class (82%) rename classes/nextjournal/markdown/{parser2 => parser/impl}/types$block_formula_init.class (79%) rename classes/nextjournal/markdown/{parser2 => parser/impl}/types$block_formula_setLiteral.class (81%) rename classes/nextjournal/markdown/{parser2/types$fn__1944.class => parser/impl/types$fn__40546.class} (70%) rename classes/nextjournal/markdown/{parser2/types$fn__1950.class => parser/impl/types$fn__44181.class} (70%) rename classes/nextjournal/markdown/{parser2 => parser/impl}/types$inline_formula_getLiteral.class (86%) rename classes/nextjournal/markdown/{parser2 => parser/impl}/types$inline_formula_init.class (85%) rename classes/nextjournal/markdown/{parser2/types$loading__6798__auto____1942.class => parser/impl/types$loading__6810__auto____40544.class} (84%) rename classes/nextjournal/markdown/{parser2/types$loading__6798__auto____1948.class => parser/impl/types$loading__6810__auto____44179.class} (84%) create mode 100644 classes/nextjournal/markdown/parser/impl/types/BlockFormula.class create mode 100644 classes/nextjournal/markdown/parser/impl/types/InlineFormula.class rename classes/nextjournal/markdown/{parser2 => parser/impl}/types__init.class (70%) delete mode 100644 classes/nextjournal/markdown/parser2/types$fn__2219.class delete mode 100644 classes/nextjournal/markdown/parser2/types$fn__2236.class delete mode 100644 classes/nextjournal/markdown/parser2/types$fn__24779.class delete mode 100644 classes/nextjournal/markdown/parser2/types$fn__2719.class delete mode 100644 classes/nextjournal/markdown/parser2/types$fn__2723.class delete mode 100644 classes/nextjournal/markdown/parser2/types$fn__2814.class delete mode 100644 classes/nextjournal/markdown/parser2/types$fn__2842.class delete mode 100644 classes/nextjournal/markdown/parser2/types$fn__2853.class delete mode 100644 classes/nextjournal/markdown/parser2/types$fn__2892.class delete mode 100644 classes/nextjournal/markdown/parser2/types$fn__2900.class delete mode 100644 classes/nextjournal/markdown/parser2/types$fn__2908.class delete mode 100644 classes/nextjournal/markdown/parser2/types$fn__3261.class delete mode 100644 classes/nextjournal/markdown/parser2/types$fn__4781.class delete mode 100644 classes/nextjournal/markdown/parser2/types$footnote_getLabel.class delete mode 100644 classes/nextjournal/markdown/parser2/types$footnote_init.class delete mode 100644 classes/nextjournal/markdown/parser2/types$footnote_ref_getLabel.class delete mode 100644 classes/nextjournal/markdown/parser2/types$footnote_ref_init.class delete mode 100644 classes/nextjournal/markdown/parser2/types$inline_formula_getClosingDelimiter.class delete mode 100644 classes/nextjournal/markdown/parser2/types$inline_formula_getOpeningDelimiter.class delete mode 100644 classes/nextjournal/markdown/parser2/types$loading__6803__auto____2217.class delete mode 100644 classes/nextjournal/markdown/parser2/types$loading__6803__auto____2234.class delete mode 100644 classes/nextjournal/markdown/parser2/types$loading__6803__auto____24777.class delete mode 100644 classes/nextjournal/markdown/parser2/types$loading__6803__auto____2717.class delete mode 100644 classes/nextjournal/markdown/parser2/types$loading__6803__auto____2721.class delete mode 100644 classes/nextjournal/markdown/parser2/types$loading__6803__auto____2812.class delete mode 100644 classes/nextjournal/markdown/parser2/types$loading__6803__auto____2840.class delete mode 100644 classes/nextjournal/markdown/parser2/types$loading__6803__auto____2851.class delete mode 100644 classes/nextjournal/markdown/parser2/types$loading__6803__auto____2890.class delete mode 100644 classes/nextjournal/markdown/parser2/types$loading__6803__auto____2898.class delete mode 100644 classes/nextjournal/markdown/parser2/types$loading__6803__auto____2906.class delete mode 100644 classes/nextjournal/markdown/parser2/types$loading__6803__auto____3259.class delete mode 100644 classes/nextjournal/markdown/parser2/types$loading__6803__auto____4779.class delete mode 100644 classes/nextjournal/markdown/parser2/types/BlockFormula.class delete mode 100644 classes/nextjournal/markdown/parser2/types/Footnote.class delete mode 100644 classes/nextjournal/markdown/parser2/types/FootnoteRef.class delete mode 100644 classes/nextjournal/markdown/parser2/types/InlineFormula.class diff --git a/classes/nextjournal/markdown/parser2/types$block_formula_getLiteral.class b/classes/nextjournal/markdown/parser/impl/types$block_formula_getLiteral.class similarity index 82% rename from classes/nextjournal/markdown/parser2/types$block_formula_getLiteral.class rename to classes/nextjournal/markdown/parser/impl/types$block_formula_getLiteral.class index 9b5a4f171dfe9ff112f4907e2e4a4e6857bf5717..acf3e4665c6196c81d96adfe93eccc44c59b55cf 100644 GIT binary patch delta 47 zcmcb`@rZ->)W2Q(7#J8#7|a?iU{v+8H&7UXQyJjTqJH~9mzKZHNofkg@cd$|uH delta 61 zcmaFFaf^fZ)W2Q(7#J8#7|ax$I delta 61 zcmcb}agu}g)W2Q(7#J8#7%UhWOegY6Ga7Bw-O9|EHTf~KzqFBlNo7H5v0idc7MGR} RmywyWp^mYYkr|hkD*#Ke5hnlu diff --git a/classes/nextjournal/markdown/parser2/types$block_formula_setLiteral.class b/classes/nextjournal/markdown/parser/impl/types$block_formula_setLiteral.class similarity index 81% rename from classes/nextjournal/markdown/parser2/types$block_formula_setLiteral.class rename to classes/nextjournal/markdown/parser/impl/types$block_formula_setLiteral.class index fdedde02c06de56d18368d4bd241dfd7b4401955..81c6493f5dbbb0397384d329d2b6795ba30f6edf 100644 GIT binary patch delta 69 zcmZqX?B?V>^>5cc1_lNb1`9?8`-!~LtooU`1vwiv-!n7jO_pTwmk0CpODYRei}jLo VvbeN-xQr~74RwsHj4ZjdTmjcT6N3N% delta 40 wcmeC?Z06)W^>5cc1_lNb1`9?8>&byE(u_tMb>A~HW=)o5@nff$?3=9k=3_gqu29xbsrA75Ka|?3xODYRei&fI{;^R#WOij!-T1;eO uRGWN?Nt#s;B)|C?lL`}K&SY*@e_13AddWFiTv|R{hRTLIhE|4LTCM;<>>bAd delta 87 zcmZqR{>;UD>ff$?3=9k=3_gqu+7o%D1&s7dDhpDJRnqd};|(oMOg7q1WMWjBe4a^~ m(P;B~CKV>ejL9Ob{*q92ddWFiTv|R{hRTLIhE|4LTCMff$?3=9k=3_gqu29xbsrA75Ka|?3xODYRei&fI{;^R$B3@r>dT1;eO uRGWN?Nt#s;B)|C?lL`}K&SY*@e_13AddWFiTv|R{hRTLIhE|4LTCM;;UD>ff$?3=9k=3_gqu+7o%D1&s7dDhpDJRnqd};|(oM4K~_NWMWjBe4a^~ m(P;B~CKV>ejL9Ob{*q92ddWFiTv|R{hRTLIhE|4LTCMd$C2c|EHX00hqqYybcN diff --git a/classes/nextjournal/markdown/parser2/types$loading__6798__auto____1942.class b/classes/nextjournal/markdown/parser/impl/types$loading__6810__auto____40544.class similarity index 84% rename from classes/nextjournal/markdown/parser2/types$loading__6798__auto____1942.class rename to classes/nextjournal/markdown/parser/impl/types$loading__6810__auto____40544.class index 660fc69ae960f0950299ae03d42ec9bf024a5851..7bb866ec38d547eb7633df78a4340fcf31b89803 100644 GIT binary patch delta 102 zcmX@dbDf9x)W2Q(7#J8#7$O-NoG0>1Yv^a@7UbxcR2HNbtK{S-rex-&$H$vl7#hUK wCzh7v#{+?hfvJhfM(P%T;WAV<)G@R&4i)W2Q(7#J8#7$O-N>?X^zNh=%amsA#{7OUjsC#GcPrN_scnOj=K$0wGS d1Yv^a@7UbxcR2HNbtK{S-rex-&$H$vl7#hUK wCzh7v#{+?hiJ`gWM(P%T;WAV<)G@R&4i)W2Q(7#J8#7$O-N>?X^zNh=%amsA#{7OUjsC#GcPrN_scnOj=K$0wGS d{ zMNv@^+&5IfeI+hbAxIahP&ZU?-*Dge1>8|l@Z5W6-pu4qAAIy{d(WG9=D+_v=iL9C zchAFj+zDVcTfnf&wGRddyo&Ey#r%Zjj~Bel-F(UN%eJ3)CQ8M8a7D>3=X;CZ==c`T zpQscq1B~G`&)=UP^(H1fSG<;Yy@H+JSSbhIg!DB~$I$4wPOxXsq~$Z@`bLZ1fr@YE ziG3SVloN+sJZY#einh44`ac?=NYQG1|dx#jR_ zD?ROV0^7HW;gj}~Z_j+UCGZ9U-*NYcJ~^vUh_Rv#h*SJ9+Mr!*V3mU;m3GIaFa^E# zKF_zqx0@?&(Q(J4PuA$DU5ZXKhcHs7ZKbW!teYrEZiLk`W|hY_QeZ>01rhxX0i9x` z64(*D93gLU{4~8bMQ_7C3QLI4CK&kkq~lehSDWq2DpoQ2)KCtrz!up$U`<*oRoh1n z*rNeu%Um}~XLEw}40T=IgA7X()zcGIPmije9#K6#vU*IMPKYC-gjP_fL=CMFI3~_u zXq#CU2A<5&;<&`x?f0EY$!AShf{@DLTK!44USk|*qN@o@(aq6-*^QWmRSb*LPKk;&@l=jR<#-OmDQQPSOO%<3r*kwZUkdd? z%{QzQ6VK#mR(|I)EKd6+Yu>~L4z4^mGR#kVMx|t8Ge?W^dKSZyv{&kWnAplON4Z|8 z9VdNjOkBj#s(iO=H0kKoyJX^GjyB~vpm`>5n2B8+?aFhAVQ!kLx_2gqIdaP9*_w~K zjV7MM(V=|yXtf}2h*TsK7ROxWHmYSLzPToBj(N&&KSM{Fmb}j<9FF9z$muC`wp-_f1^Ju~7M!wbao$Vnr}f;aH?xFV{*op%W&q;8?62pRYNJ*o5j~ z;sqQ_l;exEKr2l#@nVisl+Q~U&dev|qDHeZ@iK2sP_TNVB znDlvR@|5AeC)wqQ*ySh*$jRUg+`(}>4hs&SU}%t%!EvW3t9snU(44q;9G_C2pH|aT z91pq;9U-dRR z$5+(XUu6*ETUFUPzOJZ#gYJM*gc;=#1#UOp_qZr}J+Ek6RG8l(z!CLf&?;8w27OoD z$oud;j&I@Hg3=FY$gFm6hEubPMkY;!;z#(gcAFVz`- zMQ2d$gOoXYmqDlO1fDNr{u}&OZ1g)y65*wil#5g(&Juaa<5!;;_!Gw;@JE610Fh1h zb&kI%vVWz7M!iEy*49-1wpAuZY~R2?$&IF|FoOTWKbr6${>|}sVb$Xys;|V%!tpQ*O%|DbA{u zbJi?njnO+zqOR0<&oCT+=$k(~uCTpd=;?_Rno=0ky5SZ%48IIq2oTL%} zGe~tX)Qg`1RGb5WH9CHgRoZEd6m6VNQeRI$XlPis6a;1Swt~6B1l?Erd(qtr8ntbF+v__;lB^d>>ngHdBCV@)*W_j$ z#jA&Im4{}cori%Kr}T zKGeyLmrtWl-?*JNUbg%grt2^?g~p*}%a7pW@h+|LE*BGY10hp;3z4@IE{OmLd9{w5 z6UfJKY!*)7_!P{cWk>MITdMqXG4c*V-ell7fl;Td(pKPI(&Qvk_l7a~axL2TQcS4Z z>)^p-1OM8ifz!mGgYT>j9@WV=Yk`Y8p_w5B-w~Gg%4uA!gU^r4`vmSgjPFM^{==KA zmDmMLck_oj}ei!P?+aZ(v3ZaM2sYSQ#=;+{r6-<{2?zO*Lae(`kr&L72<#XmaF=Xq9JA<2)TV5o?fmw+@Mh-@)2M$3JOQE;K+I h&e~Zn3eh}l`yf%+>>rHK&OzK;Qy@oP2&In literal 0 HcmV?d00001 diff --git a/classes/nextjournal/markdown/parser/impl/types/InlineFormula.class b/classes/nextjournal/markdown/parser/impl/types/InlineFormula.class new file mode 100644 index 0000000000000000000000000000000000000000..7db457055a8b428d9a0c93c6592193f10c67bf1b GIT binary patch literal 5773 zcmbVPd3+sJ75;9M@TTc)lf2S}0;LrxNo(^Eszp<+ZD_GHZA#N7wy1TIH%+E_nR&c7 zFD;_t0`5Dw;I62(78Qb|1r+LriW~0xF5)h@ui$s@oq2EaW_a*3|D10oXTJO0bI(2J zyt^K_^>zSjL`GnZ=Nt+S_?41p7jhGJX*};A^m0YJRCY=^ccNIx1(y|_a&C)Pa6M#dXne_}gf22BF9UC#~n?VGeq0@=Qif`6b= za&iUR8_f;cr5=HKWhdBSmmDwhlA}(roszpBp$OyAZzVD3+Z1Z|4U7Ku~hM(a}WdieEoiM8z8I>`s6_JHU3AEQ| zK?aW&nCp6!?d>SJlUmUEoiRn`$a<1*x{@g+u>xne;w*GZwBV%Kn1z)Bi|f=>v(Ca} zBr?XYTVP?GALFNz(ZV?rmhn1QU`d@>-GN)k;Dsy#1>epOxxrX(!7i5t);2Bz z+N-B4Ru;n2C2=LLYQ>B2Vu6#^g(Yl33YjWu8MnOAuXuS~HhUSop6j~aq(9Emx+1=AC@_`r8oXf+uErY$+Gd1j=dKLiOf_CG z#xSR_ZAqnj3*Op_YwRb@k@%Zo|2rc~>88U;{L_Tt zU-XXk35ow0@BcD9rn5>ssB4ITKr0Etu|!~R?O|Ex|5qhq46$0VzRME){m`t&VV>VW zV2_M%vx~dz;evzZtYOXk0keoriZdS35;enV%PCD;&S2VdywaA_leQda7aZ2*U0AJj^D(T|b3Yd#3TKYcYEouRDyEA+hI9 zEI)y(SKWd)&BC6h<9PeFm3xojoy|ly|q8#^laMvX3$*Y=KE~|B;b@{^7{kMw8?Njme`t`C=n-l_zYZA^FZQz0aA# z6-n}iwe&uLyQlH>D968feKix?YneF6eA%RW09$UzAGe=4U)3=CCSqQ^7DqWIWQz;_avF)vhNKu{MU_S-^+94 z(2$#L zwTuo(d>)oCMoT1qJ&Ql1JqllR5~~Bc(BvZ4EsScDZMdXa^*~PF?97(M#HfYPxA_!D OAtR#>l8Okf9##M+AWCZh delta 184 zcmbQF@I;>X)W2Q(7#J8#816ALXiSc0m1Z>Bs4K_FXa`|W&S8{eF|{x?n%vJ=&8Q6$ z6fn{+sVqn>R!Pf?j|WPbY_?|7U}Q9dYG`4uWwe2^l~}?UO`+_1R?*4pSgaVWk@#|~ m4oLiyj7pO|*?QxcLi5AtR#(RHluqhZO*^F)xY$ diff --git a/classes/nextjournal/markdown/parser2/types$fn__2219.class b/classes/nextjournal/markdown/parser2/types$fn__2219.class deleted file mode 100644 index 90d948734ecf850a99128eb125541c21f0dae0be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1395 zcmbVMZBr6a6n-wE;JSw5OHo=Rrhp28Rx0*FDy7kzIL`EmS(d9UF1yaM`0}p`XG;6f z__-g|bat0FMZd(%<=p3RIrlmDJm>uR`|CG=1!Ng!G=6NB^s1prYP>8N`$hdoiyufv zg&WDZd2+xjle=0zpG+o}JYWo?vZ|M=29K+fwii!ls+w#ny5>O_L$7^4CaWceo)tw? z%ohw@;mD4N9(V+};bjmN?NHz6Ia4wfnPE5_$(E!;$%*%|P~x(gV(`kkRx$JW#|-}L zr7L$NBPBvae=l6P#V~O7R}TglggtIe z&ZLODj`JR6<&bBX3U{);CJ_GFQ zV<(4B&kd}?7ORK|!Fn4PW{Ap)tk!EL*55QH>jw8C#^90la=B^}po;h|J^9wQ2T7{) zp=2;DwzJHchNA7I+Bnrck?TsjfF}ax@sy#v$PK>h#Uew0RMn*-FV3k-p%V3CnZZrc zD0#8MFwrL7SVO$Ax_D!@7`-3~4qf7#J1G}*)q_`dIZbY845|O2?F6DCy~e75G}f-_ zi%RH0h8VBvMNZF_RW$ygS}t&7TPmpJ5pvXdGS4U$7&ssIQQq;<%|> zyAiNNPrHC6QrnU)ZA)^pEs2G!8>NQCY6y{|hUs%e-T2lFH%k1h&{kL*gdejp z@jJt8>z^$mb4|`)C}-=F_Q(B+Gd#P%;3<3rmKq>HAk_e41fDlQi1}ZhVf_McPBGn? zuM3+L*hO^Tk^P!`pZ+8`Q_C7c!m2aeglI0<+-8KCU?SKYZ9<#qZkU+X1QeoKArVT< KCYKXJbp0Q(%}f~p diff --git a/classes/nextjournal/markdown/parser2/types$fn__2236.class b/classes/nextjournal/markdown/parser2/types$fn__2236.class deleted file mode 100644 index 4fa3bbfb74e1c5bd754891223834b78cd5df4ccc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1395 zcmbVMZBr6a6n-wE;JSvQQkE8pDWF22nTfrSN@?^ajx&8?mgP!|%dWF5zWl4gnbJNq ze(py#o!#X{MZd(%<=p3RIrlmDJm>uR`|CG=1!Ng!G=5~3^_rncYP=#Ddqw?Fi|@skrE-IzZWjtVi>sks|N!NLW!GO(&3h_n%Ipi6p!kw(INkqgr?)M>p2kn6KA|5&cC)&=1jy%&Djq;qtBP-7-hRthk z?Bvktxq(&KVige~Sa0LP3{hE;)ke+4#+$}u-QZrt7(B9GsnkpYR1x2$C*RukAW3yT zkPL>Ui!5`dp=hPl1x^i5NoRMlVQ$LznpGjw=OS_289VPLmrNL+XEMJAtT3udym1jkT-# zq7r(LA;znEk<+tf6^(zWRSMkLmI^9)gdBCA%rlAwh8?iR3$@bvk;%0x^%W9S95;1q zH%2Yd({9ufsclJ@wk0{)mc&BV4N45utawXkoGc^T9sP;k@3djqpzj{rNiAy$fcDnW z&-O(?qz>N?44)%V$7pjic7~t}b%e-K$MhMZZhUKn3lKjmv=!DzYlK#a7Nh%{;m2%D z{7y03{%4!WT#NG;%Gvs){c(Td6i?4Fcmf}RXH76lAk_q81fDlRi1}ZhV*MO%PB7h> zuM3+L*hO^Tk^P!`pZ+8`Q_C7c!m2aeglI0<+Gd2AU?SKWZNdf7-7qn&2`EIfLL!uy KO)e*d==wjblS~)@ diff --git a/classes/nextjournal/markdown/parser2/types$fn__24779.class b/classes/nextjournal/markdown/parser2/types$fn__24779.class deleted file mode 100644 index 8d535d85a578276ec089d6402a8966845954b17b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1396 zcmbVMTT|0e5dKanw1i-xT(k;W0f8214OF=lFBPbQ^+p+HeCnj>p{Aq>lcrq$m6jO= z9~_?jQI4CW7ohlJXHNHgn`FnKMi_1PRhG9iBN>!7`HCZplQ|YR%SgN7>(818{d=OK#5<}Oj zs;ky>hK}jTu81!91bE?R5LNxq*ymYGwp4{-a5|DH$%nEV??b-C6)VZ$R}8&k<#LZ1 zf|)Bv?#gCTgoxg5cyNoM@A^|8`WS>Fx3=Y@ZNsoc1kod)9|PB4-b@qkq1IuNh}&-5 zJ1ytDh`X-y9%bc{XPBIBXMIB=B1Un)2g7*K3b-KRp&M|laQ8Pch2nszrb*61Z~Z+dDqY zQ=JcGlVRyH%dBOpdNFy4Q{5A}siX-!5wL)#44nmT@;yJ672_xnD4j^u&Q| zR=Al=SSJU(GO?%c?j{$cB_9|=P|=K1)#M3H){BXBrm8EJYUn<6FmyZTd=vq;A z)q2j*5sB`I=z>px7k&m&)ent*p0i|2RTzdM(QHXRl-+nA@+GcVDF(k{=oM>s_c22t zd*#X<*-VKL(c29VZZY&<|J8?n2BFBUE%|86Ff0)P^avQh;Pt~B8R9+Myi5{t+l_mt z=}d~a>pJgIRxWvl$w)iv8xj#Qiu*kX;z2XuoQQ{R!11PYzAevmMyEU{@W{?{l40|P z8{0Xwd;Y;HVzY{h5bU?{V4A3`DB5Ms#LG90D~8Gah%@*Uqg<|91gIi?SDt)p+lM68 z`A{|)7F${7EK}8ssTNL`p6E>_oyQXab9lPt$^J9^rH>MeKffr^qHD8JOvCQBl zX_Wj}VHj@_Z@ezv_@#K`ju`zQ2@YQ2n>#7z4b6v_PB|@Z>I|v>q3s5uBE7<@fHc;w z>x)Y0Lxvcy8U;?zmQ{8BzFN+6b6d`9{HW+fj8qZgY>&F(?E7Vtzs5oBg z)=q?M(bFzui`22COUII&97|#$>jfnSYF4}r+g% z=j*{H1@;i#w`9NM-labZ?$ok}kg)0wHzAfAYiu*Z^q4f(7;Qp}=>9P=?FlHvvVs(r LW~60Fh^_wx%l%9p diff --git a/classes/nextjournal/markdown/parser2/types$fn__2723.class b/classes/nextjournal/markdown/parser2/types$fn__2723.class deleted file mode 100644 index 93ffde848b554e66e219f6b750315eaa6e2267a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1395 zcmbVMZBr6a6n-wE;JSvQQj`{nDWF22rHQ?eN@?^ajx&8?mgP!|%dWF5zWl4gnbJNq ze(py#o!u2s(JwJ`IrlkS&V9~3&pCho{`w7I9yx|-jUSp7y>4idny5;~Zb?7T5_^(S z<3=iB9_{hk#Ew=dq!v7z!4s;al@pn4U6V~k*F5NA=(W$sWwpZ4v#e-} z`GTP<65STj1CIbVybPkE?d!WdZ%U>jGYm(fxr($eIq^OgD_l0y3|?8+YG$GEn8BaB zbmg{Wq(zA6?}ZDu7zVEX>cIemQ0C^Qbg-%GrU*a!1Po&6>f!Y)@g8YkmK1T@iF>E* zOo_PbIPXzb4ta*jNGI!S5)mSb7{4IicvHObbMeM)F?vA~9J<6ee^f2%st2#^a+=)G7}Ebk+X+NPdW{tU8LVE_ z7nRV1EHPfuOPro9r)c~`y;|hPmQ+;9Bjl;`WS&(lFzkR;UaXhb4o$ArsIQQu;<%|> zyAiZRPrINcQrnU)ZA)^pEs2G!84TQV?3%Gvs4{0V>Z1Pf;vJcf_JvnB`%s;Fb`jloWWVO$XFdte)Ut+N&-rh*EAR3`R9Dy7kzIL`EmS(Ym;F1yaM`0}p`XG;6f z__-g|bat0F#lFPM<=p3RIrlmDJm>uW^Ya&g1TqZsIzP5bM%C11En1e%{ep3%M-ODP z!p(TpIyvB#={-G{i!a9#0vJO;(Tq~nsR$f zB@~b*#%o4_)3aq%oxiV^^W5B#^BQ@?EOnm3)2as7qms{Skk3qNluO>v5@tG5(70W-Vhom%gA^Z_-d~Jpc5I;M#9d>}$D6J`4jP7rQA9FDA zJHtZjpDiMbP0pVwXZw@#NByxgJh{NoDFz5UZGa$wWCM&5c-8<@%>UvH8y9$eirLP5 zJ=mha9-{k}?3e7j)JM^sTJ{hU*WBSIhO-mRZCae4h)py{o7g70e@sk!0*c{`7@LYM K#8+Zsc;hd(6-*ic diff --git a/classes/nextjournal/markdown/parser2/types$fn__2842.class b/classes/nextjournal/markdown/parser2/types$fn__2842.class deleted file mode 100644 index e53ba67d681178e9233ab1b316c5415e8c96c81d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1395 zcmbVMZBr6a6n-wE;JSvQQj`{{sh~n2m5IHON@?^ajx&8?mgP!|%dWF5zWl4gnbJNq ze(py#o!#Y4u`e-mIrlkS&V9~3&pE&U{QLzVi7dms#*fXiUNbaFja4LLzo;K+u>;Ad zaw8ElPY!r>dQZ#e6U)hj2aF*gt9rR+@R%xTrC2&s(_~Z8H4l0i`t9>kSuHd4tty&g zK4<8e3-5~PgGYcHUItOo4)uMWGbK}z8Aj*A*|KyfIq^Oe%3L;63|?8+s%Ad_kinn5 zbmgvOq(q1q?1u|C7>2I?>cJ3$P~zscbhNGOrU*X<1Po*3>fy}{@g8em78h~TiF>Q< zOo+JcIPXwa4ta)|xo+0iBqCx0cLxx_y>`GQ5%-;dlWk|RE6;RBqdceaz{+!mVe6V3 zyE$}w{=sU_Vigu4Sa0LPJW*Md)ke+4#+ycE-QZqC89cIHsnkpYR1x2$C*R)jAVGCL zlnjRDPL?^-P_$C2gHyv3zOJN6JQA>k#|*tiZty)XmKg>ksxB3IaZyzY)rc1>3~rJ} z*^5<%$qw;Go8pZdB6=mkk|6X>vnjNc|6OClD3s71ji#v3^xw zR6-9j#CT0Fa(cF`qVe~&N`V_YQb8q;kfY9%c}B6or~}q{p;p>BHn~=%zCxUeBYBo?x6P-38F#T!BsWEt7s$Pe^?qYc9*efQZ;YFSGFw6~6a zvM&O{b@;wx^a6o8g3ZnNIYKVfF-49#X3r6E<7+EifcROVt*|~?W3;AdF}lAQe%!{y z?+gp=f3}G%wm5&LoUKpVAM?l0@Z`@nE%BYHZJh`6tms= zy0AroT}1aS*)O?w>5qalwX7i|tU1F?h~z@8ZAO?6#Y3&pCUl7I9~0A>fI=iI#HZp5 KiIunz+4u{*R7@KH diff --git a/classes/nextjournal/markdown/parser2/types$fn__2853.class b/classes/nextjournal/markdown/parser2/types$fn__2853.class deleted file mode 100644 index 7bff723d092e05a69829005ce25a7683e1395f0e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1395 zcmbVMTT|Ll5dIFL!5FLJrKQ!Ds#QRRg4$ZK7pl@~=}jDG`ox5Aw84-#A$a*$EzY#s zhmOzvQJroQZi>E?nZurMIqdoN?6>>p@2}qg7LZ|>(fP4eG%BVpYq64S?iY+BJ$4|Q zWo{;7*2w`cPwwiuTw-Z)UI1elQ8c4iF?mdr^}SdsUC|XwHFNi(O zwO%lEgu*)#x*&+~!p9(~`k}GUvzBbB3d2w+oGHqOvK#MXzQ`3T$>38Ay=>)jj~V=# zOIPm5W>SKL-fnnsi=qGOuLAlR#650p$wym;VM*|#N5lXIuO8k=6Yt^XWpN3&-MDv} z&V+=!uJayc<&tNZ3bnJoCJ_l^xZi^jJZJ`-m+;UHINo$FwB?yf>y+mt9@%+LF>GFQ zV>^d-&kd|XHmk4%(S92bW{Ap)qSb09)!sC!7$)~2${;94sZ_BDP(}JKJ^9wQfCSa~ zP&OHsT3Kc-Q`Ps9Eu3ne@O33!z@mtGJYnc8aFg%)u*A?C(G0o33v-&9FGqY>X7G|U ziax9`jJJq4S{HA$Cf=wcMjuFmgO~VbPfB@16Y$C@r^QX3A^AVF-9S{N*H{&i!rE1R zQ3(a4iSepY;Ph-6Rp%cnr93yc<-A57F-x7N@U&`!As4Lid}VL_*y4Jb`U-I>j+eT% z69HTFvkZRk!55%BR|pooi+>`^xfq+sby^e(B3}! z*|`V^SJC$aLl+pSB2eFqo+Ic%6%*vBV)`5rFTORxjSxROv>mpO)-bIJT8!?mhaYt? z@jJt8^Pf#3a}Ca4C};bV^2hw~Gd#V(z$y9&Jgb8Mfn*(w5_nz*6U_he4C@zobBgKq zd_CBtz#gLej_lX$`_w1Vom%z~5?9^fCPuQs#x^a^1mnTRXcJpRcf-WAC!iR~i1CT| LY+^YsM%MoU#?4F} diff --git a/classes/nextjournal/markdown/parser2/types$fn__2892.class b/classes/nextjournal/markdown/parser2/types$fn__2892.class deleted file mode 100644 index 79ea863439cea7ca8154f9b354dc5c4f4c359bbb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1395 zcmbVMZBr6a6n-wEi|ZPSN>N%Srhp28Rx0*FDy7kzIL`EmS(Ym;F1yaM`0}p`XG;6f z__-g|baq!nMZd(%<=p3RIrlmDJm>uR`|CG=Ipi3obbeq}jJm1ITB0hOJ0)XZPwdKO zjhm^2b-2rG=yuM>6|KV1wWR8* z^@5=z65W!}1wn)tJ_bqE_lzB$w`5CI7zQKJTt(iK-FP316|Pum2A^W+HLFl~%n-<3 zx^hc4(-I`~cEf{P41HIB70|~ZmbtYd?{64}B_V(w5&amrdU!2MyoXwsB_-T;P-38F#alunWEt7c*iUqSrwzjzeRnxdYFS$Vw6~9b zb}j;<4fuax@D#xYLe0(a2}V6=AWV)1CQlIa;@f$+An~(9+hP5*hG>OpF}lAQe%Qgp z?-?AQGJ%qP*ETJ{hUm)+qe#`2@*+pIV>njAeJZQ=#d-7qoj2`I*LVlteZ KPAw+I*y=ylg-jp- diff --git a/classes/nextjournal/markdown/parser2/types$fn__2900.class b/classes/nextjournal/markdown/parser2/types$fn__2900.class deleted file mode 100644 index a0b3a7998bdd92e16f2b707d8e2da917e824007f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1395 zcmbVMZBr6a6n-wEi|ZPSFGXpYm;x#YTB+Czsgy=<;yBYMW?8Pbxa>O1;>*7(oGI-? znjGODI7Yw@yd?iYcWu*2w{{Ozi6Ud~#`SP5@&VRy3njHF;c<^}TpHQ`HqqHFNi(O zwVpF{gd;l=x*&+~!p9(~`k}GUbCztW3d3MHk}b)HvK#M1p~Mv{#o$v6y<+9_a}0s( zl`D5-GbKSnZ#O)+#n5;CR{?zt;vToQ+AHhTB=+kcfm)-0#6K9y9~aOL*u89B(=o+VV_ibjouAkL)}r88&aY zv7JM^=O3)XHmisP(S92brisdmqSb3A)!#Ix7$)~2#vmw0xm>jfP(}P#o_uRtK$7Zw zD4Pt6tt@kvsp@;F7EX0f5OX7G|U zNkWQl4WE&qd(C7jW!G$^xfq+sby^e(B3}! z$+-xK)ZqV)!3zx65NvEl&N1de4Iy&WFm;Zo7hf;K4HG{*v>nz@Ylv2e7Nh$c;YS=y z{LV1b{AZKM>?P;Vl(YRw2jYRm8J=FC{}g@#OAQbtkZOPt0?!&C!~!qQuzrEpr>;{u$$rVbOMevIsbvo#an&7eVl+2)xy^{vV~MfL(I&Qt?jIA=o`7OBD<(pT LndEXpjIRF$q9#lh diff --git a/classes/nextjournal/markdown/parser2/types$fn__2908.class b/classes/nextjournal/markdown/parser2/types$fn__2908.class deleted file mode 100644 index 25b5ca091815a2f609ec8667dce0cf6958529006..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1395 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 diff --git a/classes/nextjournal/markdown/parser2/types$footnote_init.class b/classes/nextjournal/markdown/parser2/types$footnote_init.class deleted file mode 100644 index 9c14dbdaec16e7859fe473c75de64b08c5c9b22d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1459 zcmbVMYf}EMERq=}b{G zHGb|#HJt@UTy$#c1H9)wob#NA=bZQa{PpbzfCtDjOl$neEa_E4lhoM0WbEzehgz&G z85M3MV&-v~S4MYr-PClGZ!4N&3SbNavZ|M=29K$dR*WrXs+w#nx+cKM;H@W3$!dwA zW8O+xU~q;bn?7_v5aEJ{!KY{k`X0}jlBviHW8rK`I*=N0Zwe(Yo2kfU7el~Sc%2&+ zrDAf;+@uWM5a45Qr`Oi=TMWVMA7fKKbfd?MF7z^ZWL>M6+uPF&etX)cWKg6Z*S&C{ zkD=EFO1}yiU=WMk+>j18NGOKB@D5gFK{C- z6;$&0v$`y)L{G8qO{bWnr!Mo1Vny^dF3Y@7EvAp?8CB>FBTmA(XgxSEWX(NUL)L`R z=>oMBv;gpeZUH(Oo$lxtct4TB@RGhe>dpwfRujm!Lf_Ssfba>fouL0SZk{3F{*K_5 z^8_QgEmxGS=4yz1#iRo@BtBA(qmI@MC)pNS1VQ?&(9Kt`FpeZ`FsmxfVY5znVd_`iqZ6M7$I{T diff --git a/classes/nextjournal/markdown/parser2/types$footnote_ref_getLabel.class b/classes/nextjournal/markdown/parser2/types$footnote_ref_getLabel.class deleted file mode 100644 index 00a2bb22a95f81ad8300a487a049ba3f3ebfb99f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1686 zcmbVNT~pge6g_JLvSp=EhfoMj;(RnUCdC0lN`NMz1UD2zQky_&A2hO99NCJ*$TB4V zq<^5(*EX4Hpq=UDxj(AyS<9g|Fw>dNXtldnclVxq?uY*T>$g7u+`+d3vz~kz*8FDR zS#JJ?71Ve9124a41q~TY<-=EdvTW$*`ecm8sY-U*5L`;tqJrkIGz*U7l>!aHVyPa)6s*3fZ=%ieqEMBD|Bpuo7rN` z+P9+Xo>Xem4(G>Ci+Ij7!{<$}Zko4EQ(&~%1!Se@`}OADhSHcfVBlO5F?=A9uzjx) zn&zZHy8Fnc6;N{kA1ckXz(Ci9{HkG4K&SU5>!3tJ1O~HbKr=9ek91tX@X0$?3gqRY zKyQQ2$^Nnc6sx^&p5smlT*5i{%lVo+TnXv?$ZntV}_fxx{pXzF0890rb8o&WAk zco|&PaRt{Hl*odC8%U)vice^?%j-@WHGInG(R~ABN29f6+kxzkW_ zK9y07%t@JsSpzy!I?>HBPZn&qov}t6=!ESDjM^6jw+So=;wp*? z!5T9n+fDa-ov4hT=y;5$NYp=ae7k%4u>87K; zw}pC{{l}ICN1YgqHjiYbSzUe^O0U6&!idJ$Fn~BlRFQHutdfayLX|h?9x$W9u7nbI zmpBW~y}7qY{=$VoneV=q@Gg=n)?6#qAKKD~uhGB#8s~q-$UBVY#A^Cd{1DfVa5IMQ zk1)>nkI=S$!ic#=y}WsZnHaX;pr0##{h4>gvBCEsVt=zrL@#0*?(uoX(XxM$wt%~> zp>rPK7~&Y^ct)ww!uNo?&$$z-GTSJxkboFv+PEklVqO{h*QGcQB(ZSp{alMH;9B~A z`r#o8?{MJ_&i{_b+amq-A=cmG8{*Cr`e|xn*yP9fNkHIDDTE)!gXBfQgXnsmEO-cAJs+-Wh3lIZQs z*7)(EZtM`d0Pb4s?lJVXvD?fE7-Q(!m&$K7uxQ)YC@mJP4z^8$L{uW^HA2)w0S3JfKk7;F8H1(pU8NUpO?{OEe;w5it!?!>LLI zu3G)-)Q!SKbc>`&ob*e|YI6oXO_tNLZg3aoX)0-`U05LFKr$HSFS5*=xKdSgmch}uwmGmd$NYD z38T{iYAI*|;04`$bTT@f;V*E1B7@;2eRtKJak#A}kZpy&t0w`$6I?&Rz-Qb#gU|UL z{%!jSMzh9a~VPrbqfW@(FARcQ{Jb^MfN zBcCwIGBrH3U|OW?b(lxz{A2Y{V8r{_o2cRG8HP?Vz`W0DSUE%b6r-2_lnt*4(*`Hj z=qzQ|mo~)4y0eB*TyAVdF`NyYn`v<}5DlE~MDg!C*IJ!oI3vcRqtU6^g?Lm9r+x#Q Ce028! diff --git a/classes/nextjournal/markdown/parser2/types$inline_formula_getClosingDelimiter.class b/classes/nextjournal/markdown/parser2/types$inline_formula_getClosingDelimiter.class deleted file mode 100644 index 5bfd9cabba5682bd0268b443469d1052e5f53afa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 673 zcmah{TWb?R6#mX8&1GDzuC>|+F<>cesxDiEf)=5)$)IM^)$xa-oYqDjPn0__MWyZJP#HbdPL*vCVKp;FUY9C1(oW+2VQn*~3)@D6 z(4BdDmYJN;+S69MSA@pq)=`KS+5$~<2%)y;#i<%O>2yZe*i3VIF6Zvvj&qf{ms{5% z0#-SS5lfi{kw&IeJaEK9}x?fo# z+~d1710!^OdaQfuQiz>N4%5(I5N*)e4lY diff --git a/classes/nextjournal/markdown/parser2/types$inline_formula_getOpeningDelimiter.class b/classes/nextjournal/markdown/parser2/types$inline_formula_getOpeningDelimiter.class deleted file mode 100644 index ae70abab956d006d0aa91a1834fb3608eb2bf1df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 673 zcmah{T~8B16g_ua`Z2B|1yLT1O(X=0xLM)@QDQ=%eOkq&hF3CO#yZP%w%N`i{wsab z_}~xlM;Y&QO^w0Cd6;|exo7U@{P_9pJAh}{AoQ)ec3EB)R+?xci_44rgN>%Ln5kkv zav!H^wyCYrR-M1gi%DtZ`B=Hrsj}LRPn6LU?NreO5!O?aXJw%xBkedk8k9D5I=4;K z2<>^Kr>V&ZjYDmx_hRcYr%sW{Yrl@$?b11IC)Wlzc_UKmU`b z2A^kjQPKu`{h^!X1h~(R084nlG8?`+dLybm`n`zbYTcqY>@L)S*zLyM#j?f!f0zFg SqL+yH;Bow9|9N~Mdi`J8pOmx! diff --git a/classes/nextjournal/markdown/parser2/types$loading__6803__auto____2217.class b/classes/nextjournal/markdown/parser2/types$loading__6803__auto____2217.class deleted file mode 100644 index 6895ad166ccd05f0caa67c3a89c61fabd40c6b4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2003 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 diff --git a/classes/nextjournal/markdown/parser2/types$loading__6803__auto____24777.class b/classes/nextjournal/markdown/parser2/types$loading__6803__auto____24777.class deleted file mode 100644 index 1765a34e3b190d96c5096bcdcea587e2b7731bd9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1615 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 diff --git a/classes/nextjournal/markdown/parser2/types$loading__6803__auto____2812.class b/classes/nextjournal/markdown/parser2/types$loading__6803__auto____2812.class deleted file mode 100644 index 168415d6a13bf9ab6fb845e04d0421564643e05d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2003 zcmbVNZBrXn6n<_3Y*+%cp{+$l(N+in6B25R4aJ6+C=d!wC@rlTZ#EaQ$!0g~ZlL@k zzbc)<=!}}r{vp3Oj^`$UB%tF=GjsRso^x}~bD#5a|M>ft-vHdhA;Y36Ub{uBYMb1M zl(}8XTgPUk!fi*`v50$85zbx1;(6UX$Y$@)&(3ADyy{w6`o-p>F$Ij_mS$MRsx2Z0 zHxD9-WYyGM-7*z;8TuP8!kSTJ=v&ZD-Cbnx2B&uY=!2r72R<_B=8;tr3^#&PsUkn( zO;207qR`wp!?nvg1%8H`U1684az!_Utzd{8rnV9*t7(Qns%z6Ox8r_X!}Wd)Bf#K0 z5bmW5XaAx;QTEcogw7gOEmS=$!2qdTrJ-A!Jh7~}Xz#fSKq;dWPy zgyUG6&RzXTD7Z_Ec3FuQ1rx+prRo%R3bx?+CEb)cCmdtJ?wB2};xdgvOsSYeh}hID z({Z!eSwChZ#U6ahpb|xCew?-}*N+GWj#{ctu2-x|Hw}IyWVKFWiJ`|W=)_Cl zDgdgYHUe^B9rK()geNJ^f@ZX;-{0astXa13VU3~J7W=~XVS`%Zh*KHOcb+ce+LVcS zN4S>eQZY1(dlOG&1#A(Pt{i7h$~ntW@U+oxuCPsp_}heOI-+D`u%jZ4XP1*nsZ#Kq zL9xYQRhLKHV;IQs9Cr#O9^Q9+c*Wr1B)_3uC2?|W*?ESAw?RX_BL7WrviMFOoRe!A zLZb|I5wKIO$Xw8r>C>pfU3z)Z8L?F{9W?)^<`VH8UARjF%aSwZ00kBM(5YOOtvtmV zPU)t2QZ46%y(6oF8b0H4twep>`VOQljT@9jUD{hpHAAym6G<9vG#;BDD7yTWAqGTnHuiY@ktHSrwE@RTF2Ze9{h}l z9y~wAqjSyUh9*_R^7rW9Br)^*^bZta94lBS?_QMYIRww2SXc1nU+7h6_DW1)LL%`= zY=g8$Xi4}Jv}S0{(^{mpLTiJTNxS_dfv2QfCE1U!E)M>(K^L$TSPu}I?K&pkAj|^m zHSE^$;td{<;pMsE5es}x1{V0Xh8zpz>Ai+xW8dSeta)HjG!J@FAz8?5Cbre)6(}cz qy4<`e)lg>q;x(yGk4MKZ?n(9kZ)AC$s-ct`y%U{@J&dZM)qemz9|)xY diff --git a/classes/nextjournal/markdown/parser2/types$loading__6803__auto____2840.class b/classes/nextjournal/markdown/parser2/types$loading__6803__auto____2840.class deleted file mode 100644 index 0b0c6a645df70d2c5884a3b706eda023b21659be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2003 zcmbVNZBrUo6n-wKt1D`PNgCVQ+9p**3xYPW!Pwvnt%}irF)?XNFUwUHmR;OkH2$J~ zZOx3OooT}7{-J*9bb2nJfVR__Fmw0po^v_pxzBmIfBgO18vt`SWLPxCE4N@(Y?B+| z61R&v>(~sJx$Ou$8g@_0!ntc$Jg1unnasWUnb}N+S6nMYzv%qji~`1ROEauO#TH?M zn+M@|qGD>UZkYdE-7#bg=-m{c)=AhD@g zrsHNZGd@g9iaq$8K_!Y({5WM;tCrmot9KMil?=g%A z{*9bgj+(XOgNpfn%;L+I^QaH82E2uqa@L2%hV!o&u9vNHCk;NtWwlOViJ{BQ>%@!y zDgdgY76Ni$9rLU~geNG@f@U2kD))yv)suSd1&A1#Y+YcC;1)iDvFb1%g!+@ybBuY75Q(1lfe)2;GA5` z5E^BugMgh%S>}SKOpitt?$XQi_K3}jX`}f+HJ6BQ>%v_cSeBeI2gs|~hfd|PY~?7{ zP*OL=<4P$j>>XJZ)bMGSYenkY=C?m-Y22VJ>eAj+s%e_dnn=)Sqw(1ISP|LE!RjmO zdWXg=BGeIGG|#(exKQ8G+lXwGx}-v{OR8;>UeMt|GaE(v8YRg{b_ah!-_P{IV9>Lt zu9PMf{q&SuYvkNZGS&S%2KKzC7*6kX1<&wa4I^h5O;>TJhR>>)Iz{LVks4-CasO95 z@Zi}g9-eC+)iuc~mVZRwCW+~{Q$JCJF|1&nyn9ii=O8?PVqL-4f1z8U*())H2#Lfe zu?^4~rX}Hz)0(C=Piv9Z3at%VChhi-1fGy?m1G~jxj6WXI$gk$f89@LwriMpjS%y% zSFu~e^Vhgfh8O3Chs^&i8JPe3DzeO5> q>T=_zRD&1mcuqI>GnspHGqaftueer*e$lzR5e1ClhGtlWiY>wh zH}}KwM8(ux-7*z;8T#rjLYh%v=$Y3|-Cbbt1}1lW=z*f53%z8}%|ojw7_J2-lLdar z8=f|^1);eyhAS6!3VaOLJHjqmrLt}aTfrbXOm4=PS5gfAWXGl*ZpVDMf~$QPf}f#x zU${#KcN~V{j?i@_ZM}x;Dh61j_$a^bT@dJVvON46`$gBhMOHR z;*Mi!I(PL$q2M+#+F>PH6pRyF<%*Nv&f9|L7IjnRoN$Z=I%BrEipewvFsWh!L1I(0 zOvlY+W_*~I6npR`gGv;o_)*HTTpz;dmwRU}0$5E@wM1JUB9}53PndMPJGd*|-eVXK z{2Mu~95rjl2NiSun8jBu=TRSG4S4e{<*W}24d-7oTrFGWP8xiO%W9p#B14y(*NGSZ zWdKw~Ed=DiI^tP_2v1O)dCh26zpu%CNV9Cwi&chhTkHwD7wgm-hn&i2uKjdr*QQLw z+QKz87mA@#+#7f-D`1nbbmTaFT*_L8f+zKMbA@d(#NH=N!x1GTjcpYvJiVAqN|l0V z42mrdD!M%4E<=BoXStIv^3a~si zAvDTR2LaoavdjfdnI4TQ+@+W2?Gc+5(?;`uYAz7p)`dGXuq-)a_K{by2c61g$;wfz zp`>n#$CXl6*xRxysNvHt*NW7)&2N9w(zroc)TO<+#`-!JsSV9>Lt zu9PMf{q&SuYvkNZGS&S%26nwC7*6kY1yAuo4I`%*O;>TNhA*m^Izi|Zks4-CaQ|04 z@Zi}A9-e6))iuc~mVQFt28rpnQ$JILF)U+^yn9ii=O8?PVokv}f1z8U*())H2#Lfe zu?^4~rX}Hz)0(C=M{9xBGOcx5Chhi-1fGy?g=8PTJwN!1I$gk`f6Y&5wrZGojS%y% zRk2gU^Vhgfh8Jgshs^&S8JPcvDzeOnv*v+C(LCrznPfh_5#Lf9SD>5> q>QdvTRDlUY4sYEW5b7X#7R} z+L{?dJJW{G`9uBE>GWJc0d1!({+;JF&J3`l$wDlUUs~EryhM^XQx>3PRhQYJ{Cy63qGmKpJ(lC*)5Al(T5qwO( zIzXki6@0=lP~zpMrhZTn>*AOIMFTG{b1~U@p4Ba3JG$cv)7{`@iZO=IRD6oh8E$sO zh&zs@>D<*1g@W6}Xor<(Q7}$yl`BquJ8uh~ThvXNbHXti=#1IsDkjqyz@&-^1c^<} zG95RQneky-QtZK(3@TBS;zudVa(xJ+U+$f`2w*iq)e>!ah+N8CJYmxD?%*rw_AbMC z;NQq;<)~RZKB$=M$1Lu*oJW0#HQ>#+l(Rl8G@O6UaJ6ieJ8AGCE~|9{iws?EUMF7s zmjO@}wGfa4>xgF!B0NEH<~5^P{k|smA~B`Zg< zhLXA|9#=|PVQA}{^wU#rt&wvt$yE367})imU^uI9)vL~58l!M$Jc zz=LNeczC9HRM#Y{So#Tl8ziRRPW?;~#;}Yv^6o{6o`dlGi8Te^{Dp3XX0OB)A|w)@ z#5O={n3jY;PHURh9IXXf%e2;MnY7zS5_m$o6_S1U_Wa;4>U05%{xv_L*{WgUHA2k4 zR>e*Y&tKyn8D5+j9y0%TWMKXus>m{bj^3*%)b~BQ%$f%lMf0E=Ws>>yMtnlUY4sYEW5b7X#7R} z+L{?dJJXiW{X_lI>GWK{0NPGx!pz;Xd(P#Y=RW7<{_*!OzX7;|Lxx3DymE_H)i${i zE_1t-w~ozlh1-s>qha@?BAnZX#q+v(kj>tW&CO@Cyy{w6`bA^+V+t6<4b8BMRa=A& zZXSda$*QTjx@9WxG7L0agfyeb(6^wQy1U5W4NUL)&<90D5BkZVn@3hjFkA~vr;7ZD zH$83Tib8Ya3|B7d6!;jfcZFTH$`#!Zwt``DnA%FLtfm?Ksjf}C+>ZNj1y=_!0zX6l zfpC`%?l=siU7;IF+IkJwRSe+HgU!|?h4Q$&%l8OAPqX`0B_`}jb`7(OIl zU7*rC3O-^OD)Y)yQ$MVV4RJz%qJfu}xtQ)g&)T-I9o=z->2C50#hAb+Dn7=i3^%)C zBpk=mbnfa$Lcwifw987gD3~O+DpjYjQ?LckFX^VtIpG)&bjR#)6_;rYU|Pi#g2bj~ znU0&y&iODaDfZxV29+pE^W(H-xjuw3DEH1?1hAH*YKgWzL@s46ku>ReckqRDdzWD{ z@NeX_bJVIGA5_E!F^~Ig=TRTxO?V4!<-8AzP3K=ST&-A@ZW??@$ZDO!5<`z$(1{oS zWdKw~Z3N`NI_5cp2v1U+14=h%!H$YFo?c8QrAomw z2E`VKRb3u&k6|#!bKEJEcxd10$4dqeC;2VyDv6V0%g!?_ybBuY75Q(1lg0P);GA5` z5E^Bui-4VKMdpI0OrJ&-?$XQi&WNpw>7e;PH5Z8Q=)zqZSeBeI2Pml6hfd|PY~?A| zNJ=-w<7zo4>>XJZ)bJUXYbEO2*0(=pY22VJ>eAj)su`Ninn==Uqw(1MSP{AE!RjmO zdWXg=BGeH*G|zizxKQ8G+n8*WhNMDoNUCj;UeMt|GaDuP8Yjs}_6FZz;3s-vFzDIW zP)d`EL3+xqb#m?{neP1+Lwnv+jAr(Ff@gTIj-rGe1&<39Mk9yn9im=P*2fVqL*kf1y{Q*())H2#Lfe zu?^80r6u7{(we0eqqRtDh1LcwlXm+^0#8V{N^$^SzdiVi23^3Cf89@Lw(FRBjS%y% z*RWg1^VhgXh8O3Chs^&C8JPdO8gk5^r}r9)jeU5> q>T>g@RD+p`x35WcW+F22_MTM#|3;SAsTxeFkz0}3=!1wFT>S^8r3kYC diff --git a/classes/nextjournal/markdown/parser2/types$loading__6803__auto____2906.class b/classes/nextjournal/markdown/parser2/types$loading__6803__auto____2906.class deleted file mode 100644 index 1673749f11e845edf5a403062a5a162117177411..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2003 zcmbVNZBrUo6n-wKt1D`PNgCVQ+9p**3xcUJ!Pwvnt%}irF)?XNFUwUHmR;OkH2$J~ zZOx3KooUPG{-J*9bb2nJfVR__Fmw0po^v_pxzBmIfBgN+ZvgJ$kYUjjuib)Gu}yA- zOWZEztYb4==C&j3XxKd|3+Jw3@tkfRWHNK}Gqaftueer*e$fXra|#&4EzPhB6ZHh4cGfH1V2OX zfpC`%?l=s?9ii(=+Ij;wRSe)3!%z!D-KgL;!{GV3O-^ODDm<$Q$MVT4RJz%qJdXextQ!c&)T-I9o=z->2C5e#TdgUDn7=i47WRC z#2v@dbnfa$Lcv{Pw8KiYC>STU$`vQSleY!WE$ODrIpG)$bjECR6_aTUU{b{dg2bj~ znU0&u%=j=ZDfZxV29+pE@#BuJI62{ z_&0J|IcnC94=U#SF^dN+=TRSG4R{MJ<*W~j4d-7nTrXSYP8xiO%W9p#5<{1p*NGSZ zRRB~)Ed=DiI_6n}2v1O)1 zAvDTR2LU^kvdjfdnI4TQ+@+Tn?Gc+5(?;`uYAzAq)`hz?uq-)a4v<%|51qn#CzVoG*gLW+sNvHt*NW7)&2N9w(zroc)TO<+#~-%s?yV9>Lt zu9PMf{q&SuYvkNZGS&Sn2KKzC7*6kX1<&wa4I^h5O;>TJhR>>)Iz{LVks4-CasOvL z^x*j^9-V6**EPv1mVZFsCW-0ar+%aeV_3mDdH143&p~+p#JYm7{zA7xvsYpY5fX_{ zVjG|}OiRKar!`G$p4K9*64eR1%Yb-I8h|GJ;hY}YXH1|jBO zuVS}`7jJN%3@^_OkC^`(GBE#lRb-hzNAFb>>iZsFWz7SNqIuAbGRb^;Grp}hu0S~% q)aAxasRq+y7q1C*YAiB#aZjrMe diff --git a/classes/nextjournal/markdown/parser2/types$loading__6803__auto____3259.class b/classes/nextjournal/markdown/parser2/types$loading__6803__auto____3259.class deleted file mode 100644 index e672ba04381147d982063fb82d992469b7093ee6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1614 zcmbVNZBrXn6n<_(Sh6go4Q(w|G};OwAR(bI&>%JqM6pZ3EJYbVWNwx#Y}o9^-3>4Q z#~HsWox$jgn$P|w$MM`G0!y56#+^C${XXZM=bU@?kH3ET4ZtJpGORe_B&fMf&*65a z&b`Au_t?oaxaSKmmkCZA!hdMHe9vt!`JA@T7 zs=Te>U51f5Z@hM_Z=2$!I3%0P$mtjm{TE!I7#HQ&w zeo(2*YnYW3NAMAYN)(m(aoKeP4H*o}v-8&tST9kwpm$=+qt z?&Y-BV|31RJu!qLL(CK32yX~$l<-HKl4J3z%|_r6zxgZbdMnpL+)dd}@tKV4I@uD6 zoN-#Oy0(IsoktW1&tb^_A2nSdqId(ZROr~e9wG{Wf-i`tqPs^gbyT+;@v2#`3U6D| zLHTP0+&rW-?9CIpYjT^+x8#0rQ8lR4n4&~4m0o*yvMQ?0{k0QHVxOu8vJ~I}Do+u5 zE0jhw8kcdWJ__;@RB~X@Y=U}5eJuSG;y==WVVl~)&Z68>F-)yI`W*pAsec~(6(hUR zGmII#1LjKaedY(kOCpCw z!iwTGwHhKP3JQNBrcjxX`X>>mRvJo_kc^Q?QzuDgNpd7hBs-nk(t%H~LIS$?;=;Kc zxi7!_iPc1@h0oiVdV@KZSZ!gejq)2j?e{o>FX=`EF?>b+fw588QoGexrmtG;7HKtY iBrk>~btaijUX*C{zkdd@lB;Q5%|6J^W}ju%^xEH~4w`ZR diff --git a/classes/nextjournal/markdown/parser2/types$loading__6803__auto____4779.class b/classes/nextjournal/markdown/parser2/types$loading__6803__auto____4779.class deleted file mode 100644 index 89f3102574b6b3d0b1d09c15811ed537d0881ce8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1614 zcmbVNZBrXn6n<_(Sh6go4Q(w|G};zIKtci*Xb_tQqS&R-gwis8$lNSf*s$4+yBl8q zk28K%I)kw@YCij$9LIB$2rO~N8F%K~_xqf4o^$TmKmL068-RK2GOXC*#IHIH*XCBL z#@)j`=h#lwx$6lxlk!jN!h2{re9yG^%jL(5vvcJ#Z}?7`zWIfPB?XM(u3yX>8~(^6O%g{`k|=k!vJlV_K|Za7;Yyf^(sH& z9i+`lRTzGj;pX)<1scPhfZDuMtDBZ^72F^|eKWVZR%D3jfkQjo&1$%bTTu)n#xSri z{Jh0Ik6|RBy1ht8Z{v=NA>3sczOQT*3FAnYN5M*)f&~>bwG#m0?U^QpE(4#HQic zo?kA{YM7Q3hwv$bN)#3OanW&n4Ji!Dv$NL?ST9hvWG)fXJ(0^5Y;tcNpGnxq4C9G^ zBj++k-Q3ZjVsQ|2SYo(Ucj`gsG-PECPGFg#&p$B9+gL9w<;Ep00XWCJViAo`$=+qd z>gKf8Wpu`HTrq$=L&O!|3U>f&l<-HKl4J3z%_ZL@ezRB9byu#1xRbJ9;wu@~b+RQ8 zxzcH^;#dlvw;z!&T$>^Lf7EnrP@!YacFw;zgrY5$?96 zgYviJbK{WGuse_Gj=?Q5-<12^MYTkw#t;R1sr1@AlT}e^?5~|r5_?oNkfs3lQF#i{ zTcI?f(Ws0&^3CReFG4{o jDSk05s8jKD{Gvpw|NS$Nm0V5gYWhKXI{hTACfEK3)IFMd diff --git a/classes/nextjournal/markdown/parser2/types/BlockFormula.class b/classes/nextjournal/markdown/parser2/types/BlockFormula.class deleted file mode 100644 index ccef36b6b4bd62a885bcc9e095a67a06d7940dcf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6223 zcmbVP349$z8UIg??k1Tu$xH8o1kjSSw6B&b)z(6iwo(XfXqtpnwB6)wn@wJJAN%%& zqNu0{-WMw1eNqpq5TI#6p(<8Iyl=%@ycNY;6#Qmp_r2ZB%WJT|w%@mtZ~pVmf4(dC zKX%tW0M@g`3~ARs7>s!Z-?g&o3CkbPcvraToaN_je_cAbGH2)0U0H8re4FP_6tb29 z#&DYFA4rdQ6BC{*wxnGzW2d_d`M{fywg##h>KxYz_U@gue1=rdNY)!G_;xyLxd+k% zmcNl%zx0z2EiQ6{OQAw}si6l3|Y8N}B@-9Wl z+Z;dXUbAwqb3f4%A~XvRe0$RI3enaE`|^U7jlOF0ffd-|wZ^PTOFh-j;W2w8pw}`t zjnLhkU^7E?d&dC78L`M&6GhINFml$&$T4v`p$&`hSxq#F_*pG5Oq|KkJToK=JcXgr zami!1*LNnRFB{rp&Zzg>sIPSB@x^f#+Uv0b9UQfoSBEOBVpyDXrWk=HR&yB2EX}Ym zX-33}xHR!p4pSMO!>}}I6pL09PvfXlhUYSzk~Ac=ScsW;21mWJC7PFLwqcBzcos*4 zvOAAqS<)^Z?IunO>w_Cz&xOF6L-b zwmUU9>FUKiGI0qK$u}GPWYflknxQPjl#mdTKXiEY` z4_3;16PI%=QTBQ5>F6G%YG9(ku~eB}p@nR$MwqygW0^91fo3SU2`h(*7ji6DhA-BL zR`tZhOE^wZHZNm1a}G_$#LF345+$KOaIyxjqneQQtjwSjjCN)1r&PH6-FzXJ^ZdZh?95SX3>?qhdQdbZQVe{Mq4VSgJe>?h zL0OyY1#KC7zvJ2&6Nji)#(fVfbjN`3@5A-D86P2rN?xhE8MuXBH4&&(R*2|wbHxto zfm9e*#E%InD$CG~xK$8-8)fcna0YJY_!vGe_`8!P6%pPt^*N^1>QQ<@RWv9c+spbj z;N+da^EZlKnCMcWb9(&E;_fGeyPxE^3wH~L?xmwuP2>2KdgD(soH`3TU81=XJxj~o zRsPVxXT`Pd6WE_4Y?Y!j-Yp_@4<%vgwYoenYg-g8Uu59J>SMsl7AUO0B+}#oe3|15 zxL-hjm0mQ_H7M`P6IW_}#2v@i@eQ&6n+&zGW^#O6#7LqkVY{AT817-xytQfmf& z!0|nNUm*ODrjH1rR6aR=tbY6xIv}dSGX1wF@OBg?hHc-#FUX9hlJMfc#Lw&T5Prq+ zGojVsH)@hC-HIwyYZ$BrDq-m!Cm+b0{tmwv8~#8WDB=q7R(Ov8D8Tn}n16jvr9nPxMdNmzSD8>HHS*?U&^Jqh?({N_04Ry33-sU-LP(R=d^#Vza^bGx_ zkGA$FT(n}FW2Ni74wE&}Ii+?!qr^m&ESAQ_pzAN~`ac|sZJyy!D?^PK`6-q90&8Ua zVk@`X8qV4{oyvO+{mQn4S~Lx_q%9NEs+2U4N=fsklr&39NwcDqGzm&cv!0YR$Vo{< znv^txNl62ilr%(1NrRGCT&1!my)(eYL}7rJgMy?ZCGj<()LSjl(aFa zWl3|TmLtuVT0q*Q)DDvNe5qYU+KZ%iHEA!E+BK3& zQ#gC*2;O)T>W<(ohfq7nhEAaEIBqzGw=oP=AH{omR_>X``)WwL6CXH)#=CLzQ0ha| z_~^X?m$60k|8msy8d%Y3;P5{B_c*a$Wr)9rg^B2W;lVrUSVn8Brf^U{I7J7qJcg+% z9LF7pU=FUF#*tf#r=&`!>>}tb2JRp*YN0xKW^UleP6kd*G6e5IwWN$Z-=~AO2+vm? z!#&j)JcPQzm8+(4yu?pa$@5Fd^ICG7dToe&VaQ3x6fV<|n~R(fuw>*jWpRoB!!?qQ z`<^fzCqm@USEAztfm8Dh!FPpptewI&y3>nFbR5S6NAQ)1lds)Ue9h((Cj;dBR#EAx zIqP)y==kO6{#IF9BD$%`7m-y6wof6eBR3W44mtU5Sx$DU_&ZEKQ}fpezd%Qh2ls;^ z_>anhhr#_Ifz#-qg9md1|LMuVX`%?hd&3Z1GliTEzOcy2aXfSczYd-MZP~Z%7tDya zr17K3crkT)b@Xy?`NxWHNkfTF$|fB-&iEst(|@f*$|K}9O*cCD`pV!@t@=kLa8avh z0@69zqJx*?d2SQ4Y{!*^88{c8KBxNn((?QoUbFt z386aGG$DGC<{uwXjs^{b1N1&Y8lfenxA&Kg14MFzX?GR9566_#Z@6 BM@0Yt diff --git a/classes/nextjournal/markdown/parser2/types/Footnote.class b/classes/nextjournal/markdown/parser2/types/Footnote.class deleted file mode 100644 index 409eec0a97843fc46f90e66a35323a989a0fd8fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5761 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 diff --git a/classes/nextjournal/markdown/parser2/types/InlineFormula.class b/classes/nextjournal/markdown/parser2/types/InlineFormula.class deleted file mode 100644 index 70040a35632a72fc21d6528de7b6488c747a8068..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5753 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 diff --git a/deps.edn b/deps.edn index c3a43bb..b836179 100644 --- a/deps.edn +++ b/deps.edn @@ -37,6 +37,7 @@ :test {:extra-paths ["test"] + :jvm-opts ["-Dclojure.main.report=stderr"] :extra-deps {nubank/matcher-combinators {:mvn/version "3.8.3"}} :exec-fn test-runner/run} diff --git a/src/nextjournal/markdown/parser/impl.clj b/src/nextjournal/markdown/parser/impl.clj index c5915d3..03d7046 100644 --- a/src/nextjournal/markdown/parser/impl.clj +++ b/src/nextjournal/markdown/parser/impl.clj @@ -1,13 +1,12 @@ (ns nextjournal.markdown.parser.impl (:require [clojure.zip :as z] - [nextjournal.markdown.parser :as parser] [nextjournal.markdown.parser.impl.types] - [nextjournal.markdown.parser.impl.formulas :as formulas]) + [nextjournal.markdown.parser.impl.formulas :as formulas] + [nextjournal.markdown.parser.impl.utils :as u]) (:import (org.commonmark.parser Parser) (org.commonmark.ext.task.list.items TaskListItemsExtension TaskListItemMarker) (org.commonmark.ext.footnotes FootnotesExtension FootnoteReference FootnoteDefinition InlineFootnote) (org.commonmark.node Node AbstractVisitor - ;;;;;;;;;; node types ;;;;;;;;;;;;;;;;;; Document BlockQuote BulletList @@ -29,8 +28,8 @@ SoftLineBreak HardLineBreak Image) - ;; custom types - (nextjournal.markdown.parser2.types InlineFormula BlockFormula))) + (nextjournal.markdown.parser.impl.types InlineFormula + BlockFormula))) (set! *warn-on-reflection* true) ;; TODO: @@ -131,7 +130,7 @@ (-> loc (z/append-child (merge {:type :code :info (.getInfo node) :content [{:text (.getLiteral node)}]} - (parser/parse-fence-info (.getInfo node)))) z/down z/rightmost)))) + (u/parse-fence-info (.getInfo node)))) z/down z/rightmost)))) (defmethod open-node Image [ctx ^Image node] (update-current ctx (fn [loc] (-> loc (z/append-child {:type :image @@ -177,8 +176,8 @@ z/down z/rightmost)) (defn node->data [{:as _ctx :keys [content footnotes label->footnote-ref]} ^Node node] - (let [!ctx (atom {:doc (parser/->zip {:type :doc :content (or content [])}) - :footnotes (parser/->zip {:type :footnotes :content (or footnotes [])}) + (let [!ctx (atom {:doc (u/->zip {:type :doc :content (or content [])}) + :footnotes (u/->zip {:type :footnotes :content (or footnotes [])}) :root :doc :label->footnote-ref (or label->footnote-ref {})})] (.accept node @@ -268,10 +267,8 @@ And what. [^note3]: this should just be ignored ") - (require '[nextjournal.markdown :as md]) - (md/parse text-with-footnotes) - (parse (slurp "../clerk-px23/README.md")) + ;; => :ref 27 (parse "Knuth's _Literate Programming_[^literateprogramming][^knuth84] emphasized the importance of focusing on human beings as consumers of computer programs. His original implementation involved authoring files that combine source code and documentation, which were then divided into two derived artifacts: source code for the computer and a typeset document in natural language to explain the program. diff --git a/src/nextjournal/markdown/parser/impl/formulas.clj b/src/nextjournal/markdown/parser/impl/formulas.clj index 231e9db..2054273 100644 --- a/src/nextjournal/markdown/parser/impl/formulas.clj +++ b/src/nextjournal/markdown/parser/impl/formulas.clj @@ -2,7 +2,7 @@ (:require [clojure.string :as str]) (:import (java.util Set) (java.util.regex Matcher) - (nextjournal.markdown.parser2.types InlineFormula BlockFormula) + (nextjournal.markdown.parser.impl.types InlineFormula BlockFormula) (org.commonmark.parser Parser$ParserExtension Parser$Builder SourceLine) (org.commonmark.parser.beta InlineContentParser InlineContentParserFactory ParsedInline InlineParserState) (org.commonmark.parser.block AbstractBlockParser BlockContinue BlockParserFactory BlockStart ParserState BlockParser))) diff --git a/src/nextjournal/markdown/parser/impl/types.clj b/src/nextjournal/markdown/parser/impl/types.clj index 7c4cc3b..0788547 100644 --- a/src/nextjournal/markdown/parser/impl/types.clj +++ b/src/nextjournal/markdown/parser/impl/types.clj @@ -4,7 +4,7 @@ ;; https://github.com/noties/Markwon/blob/master/markwon-ext-latex/src/main/java/io/noties/markwon/ext/latex/JLatexMathBlockParser.java (gen-class - :name nextjournal.markdown.parser2.types.InlineFormula + :name nextjournal.markdown.parser.impl.types.InlineFormula :extends org.commonmark.node.CustomNode :constructors {[String] []} :init init @@ -16,7 +16,7 @@ (defn inline-formula-getLiteral [this] (:literal @(.state this))) (gen-class - :name nextjournal.markdown.parser2.types.BlockFormula + :name nextjournal.markdown.parser.impl.types.BlockFormula :extends org.commonmark.node.CustomBlock :constructors {[] []} :init init @@ -30,4 +30,4 @@ (defn block-formula-setLiteral [this val] (reset! (.state this) val)) (comment - (compile 'nextjournal.markdown.parser2.types)) + (compile 'nextjournal.markdown.parser.impl.types)) diff --git a/src/nextjournal/markdown/parser/impl/utils.cljc b/src/nextjournal/markdown/parser/impl/utils.cljc index 18bb8fd..644aefb 100644 --- a/src/nextjournal/markdown/parser/impl/utils.cljc +++ b/src/nextjournal/markdown/parser/impl/utils.cljc @@ -1,4 +1,6 @@ -(ns nextjournal.markdown.parser.impl.utils) +(ns nextjournal.markdown.parser.impl.utils + (:require [clojure.string :as str] + [clojure.zip :as z])) (def empty-doc {:type :doc :content [] @@ -19,9 +21,17 @@ :cljs (let [rex (js/RegExp. (.-source re) "g")] (take-while some? (repeatedly #(when-some [m (.exec rex text)] [(vec m) (.-index m) (.-lastIndex rex)])))))) +;; zipper utils + +(defn ->zip [doc] + (z/zipper (every-pred map? :type) :content + (fn [node cs] (assoc node :content (vec cs))) + doc)) + ;; TODO: rewrite in terms of zippers (def ppop (comp pop pop)) +;; TODO: rewrite in terms of zippers (defn current-ancestor-nodes "Given an open parsing context `doc`, returns the list of ancestors of the node last parsed into the document, up to but not including the top document." @@ -42,7 +52,30 @@ :pred #(every? (complement #{:link}) (map :type (current-ancestor-nodes %))) :handler (fn [match] {:type :internal-link :text (match 1)})}) +(defn parse-fence-info [info-str] + (try + (when (string? info-str) + (let [tokens (-> info-str + str/trim + (str/replace #"[\{\}\,]" "") ;; remove Pandoc/Rmarkdown brackets and commas + (str/replace "." "") ;; remove dots + (str/split #" "))] ;; split by spaces + (reduce + (fn [{:as info-map :keys [language]} token] + (let [[_ k v] (re-matches #"^([^=]+)=([^=]+)$" token)] + (cond + (str/starts-with? token "#") (assoc info-map :id (str/replace token #"^#" "")) ;; pandoc #id + (and k v) (assoc info-map (keyword k) v) + (not language) (assoc info-map :language token) ;; language is the first simple token which is not a pandoc's id + :else (assoc info-map (keyword token) true)))) + {} + tokens))) + (catch #?(:clj Throwable :cljs :default) _ {}))) + (comment + (->zip {:type :doc :content []}) + + (re-idx-seq #"\{\{([^{]+)\}\}" "foo {{hello}} bar") (re-idx-seq #"\{\{[^{]+\}\}" "foo {{hello}} bar {{what}} the")) From 204c9eb4bf119c728ead34ab416dae4dadaa96e8 Mon Sep 17 00:00:00 2001 From: Andrea Amantini Date: Tue, 13 Aug 2024 16:38:52 +0200 Subject: [PATCH 30/83] Rebuild customizable leaf text parsing --- notebooks/benchmarks.clj | 71 +++---- src/nextjournal/markdown.cljc | 14 +- src/nextjournal/markdown/parser/impl.clj | 16 +- src/nextjournal/markdown/parser/impl.cljs | 109 +--------- .../markdown/parser/impl/utils.cljc | 132 ++++++++++-- test/nextjournal/markdown_test.cljc | 197 +++++++++++------- 6 files changed, 298 insertions(+), 241 deletions(-) diff --git a/notebooks/benchmarks.clj b/notebooks/benchmarks.clj index 50274fe..df5b710 100644 --- a/notebooks/benchmarks.clj +++ b/notebooks/benchmarks.clj @@ -1,12 +1,12 @@ ;; # ⏱ Some Naïve Benchmarks -(ns ^:nextjournal.clerk/no-cache benchmarks +(ns benchmarks + {:nextjournal.clerk/no-cache true} (:require [clojure.test :refer :all] [nextjournal.clerk :as clerk] [nextjournal.clerk.eval :as clerk.eval] [nextjournal.markdown :as md] - [nextjournal.markdown.commonmark :as commonmark] - parsing-extensibility - [nextjournal.markdown.parser :as md.parser])) + [nextjournal.markdown.parser.impl.utils :as u] + [parsing-extensibility])) (def reference-text (slurp "notebooks/reference.md")) @@ -20,43 +20,36 @@ (defn parse ([text] (parse [] text)) ([extra-tokenizers text] - (md/parse (update md.parser/empty-doc :text-tokenizers concat extra-tokenizers) + (md/parse (assoc u/empty-doc :text-tokenizers extra-tokenizers) text))) -(comment - - ;; Default set of tokenizers - (time-ms (parse reference-text)) - (time-ms (commonmark/parse reference-text)) - - (-> (parse reference-text) - :content count ) - - (-> (commonmark/parse reference-text) - :content count ) - - - ;; With an extra brace-brace parser - (time-ms (parse [{:regex #"\{\{([^\{]+)\}\}" - :handler (fn [m] {:type :var :text (m 1)})}] - reference-text)) - - ;; With the losange reader - (time-ms (parse [{:regex #"\{\{([^\{]+)\}\}" - :handler (fn [m] {:type :var :text (m 1)})} - {:tokenizer-fn parsing-extensibility/losange-tokenizer-fn - :handler (fn [data] {:type :losange :data data})}] - reference-text)) - - ;; With hashtags and internal links - (time-ms - (parse [md.parser/hashtag-tokenizer - md.parser/internal-link-tokenizer - {:regex #"\{\{([^\{]+)\}\}" - :handler (fn [m] {:type :var :text (m 1)})} - {:tokenizer-fn parsing-extensibility/losange-tokenizer-fn - :handler (fn [data] {:type :losange :data data})}] - reference-text))) +;; Default set of tokenizers +(time-ms (parse reference-text)) + +(-> (parse reference-text) + :content count) + +;; With an extra brace-brace parser +(time-ms (parse [{:regex #"\{\{([^\{]+)\}\}" + :handler (fn [m] {:type :var :text (m 1)})}] + reference-text)) + +;; With the losange reader +(time-ms (parse [{:regex #"\{\{([^\{]+)\}\}" + :handler (fn [m] {:type :var :text (m 1)})} + {:tokenizer-fn parsing-extensibility/losange-tokenizer-fn + :handler (fn [data] {:type :losange :data data})}] + reference-text)) + +;; With hashtags and internal links +(time-ms + (parse [u/hashtag-tokenizer + u/internal-link-tokenizer + {:regex #"\{\{([^\{]+)\}\}" + :handler (fn [m] {:type :var :text (m 1)})} + {:tokenizer-fn parsing-extensibility/losange-tokenizer-fn + :handler (fn [data] {:type :losange :data data})}] + reference-text)) ^{::clerk/visibility {:code :hide :result :hide}} (comment diff --git a/src/nextjournal/markdown.cljc b/src/nextjournal/markdown.cljc index d66eb1d..577ef44 100644 --- a/src/nextjournal/markdown.cljc +++ b/src/nextjournal/markdown.cljc @@ -1,6 +1,7 @@ (ns nextjournal.markdown "Markdown as data" (:require [nextjournal.markdown.parser.impl :as impl] + [nextjournal.markdown.parser.impl.utils :as u] [nextjournal.markdown.transform :as markdown.transform])) @@ -9,13 +10,16 @@ (defn parse "Turns a markdown string into a nested clojure structure." - ([markdown-text] (impl/parse markdown-text)) - ([doc markdown-text] - (-> doc + ([markdown-text] (parse u/empty-doc markdown-text)) + ([ctx markdown-text] + (-> ctx + (update :text-tokenizers (partial map u/normalize-tokenizer)) (impl/parse markdown-text) - (dissoc :text-tokenizers + (dissoc :label->footnote-ref :nextjournal.markdown.parser.impl/id->index - :nextjournal.markdown.parser.impl/path)))) + :nextjournal.markdown.parser.impl/path + :text-tokenizers + :text->id+emoji-fn)))) (defn ->hiccup "Turns a markdown string into hiccup." diff --git a/src/nextjournal/markdown/parser/impl.clj b/src/nextjournal/markdown/parser/impl.clj index 03d7046..473b760 100644 --- a/src/nextjournal/markdown/parser/impl.clj +++ b/src/nextjournal/markdown/parser/impl.clj @@ -175,18 +175,22 @@ z/up (z/edit assoc :type :todo-list) z/down z/rightmost)) -(defn node->data [{:as _ctx :keys [content footnotes label->footnote-ref]} ^Node node] - (let [!ctx (atom {:doc (u/->zip {:type :doc :content (or content [])}) - :footnotes (u/->zip {:type :footnotes :content (or footnotes [])}) - :root :doc - :label->footnote-ref (or label->footnote-ref {})})] +(defn node->data [{:as ctx :keys [footnotes]} ^Node node] + (assert (:type ctx) ":type must be set on initial doc") + (assert (:content ctx) ":content must be set on initial doc") + (let [!ctx (atom (-> ctx + (update :label->footnote-ref #(or % {})) + (assoc :doc (u/->zip ctx) + :footnotes (u/->zip {:type :footnotes :content (or footnotes [])}) + :root :doc)))] (.accept node (proxy [AbstractVisitor] [] ;; proxy can't overload method by arg type, while gen-class can: https://groups.google.com/g/clojure/c/TVRsy4Gnf70 (visit [^Node node] (condp instance? node LinkReferenceDefinition :ignore - Text (swap! !ctx update-current z/append-child {:type :text :text (.getLiteral ^Text node)}) + ;;Text (swap! !ctx update-current z/append-child {:type :text :text (.getLiteral ^Text node)}) + Text (swap! !ctx update-current u/handle-text-token (.getLiteral ^Text node)) ThematicBreak (swap! !ctx update-current z/append-child {:type :ruler}) SoftLineBreak (swap! !ctx update-current z/append-child {:type :softbreak}) HardLineBreak (swap! !ctx update-current z/append-child {:type :hardbreak}) diff --git a/src/nextjournal/markdown/parser/impl.cljs b/src/nextjournal/markdown/parser/impl.cljs index 1a73ba4..e8bd461 100644 --- a/src/nextjournal/markdown/parser/impl.cljs +++ b/src/nextjournal/markdown/parser/impl.cljs @@ -77,34 +77,6 @@ ;; - https://pandoc.org/MANUAL.html#fenced-code-blocks ;; - https://rstudio.com/wp-content/uploads/2016/03/rmarkdown-cheatsheet-2.0.pdf" -(defn parse-fence-info [info-str] - (try - (when (string? info-str) - (let [tokens (-> info-str - str/trim - (str/replace #"[\{\}\,]" "") ;; remove Pandoc/Rmarkdown brackets and commas - (str/replace "." "") ;; remove dots - (str/split #" "))] ;; split by spaces - (reduce - (fn [{:as info-map :keys [language]} token] - (let [[_ k v] (re-matches #"^([^=]+)=([^=]+)$" token)] - (cond - (str/starts-with? token "#") (assoc info-map :id (str/replace token #"^#" "")) ;; pandoc #id - (and k v) (assoc info-map (keyword k) v) - (not language) (assoc info-map :language token) ;; language is the first simple token which is not a pandoc's id - :else (assoc info-map (keyword token) true)))) - {} - tokens))) - (catch :default _ {}))) - -(comment - (parse-fence-info "python runtime-id=5f77e475-6178-47a3-8437-45c9c34d57ff") - (parse-fence-info "{#some-id .lang foo=nex}") - (parse-fence-info "#id clojure") - (parse-fence-info "clojure #id") - (parse-fence-info "clojure") - (parse-fence-info "{r cars, echo=FALSE}")) - ;; leaf nodes (defn text-node [text] {:type :text :text text}) (defn formula [text] {:type :formula :text text}) @@ -326,7 +298,7 @@ end" close-node)) (defmethod apply-token "fence" [doc {:as _token i :info c :content}] (-> doc - (open-node :code {} (assoc (parse-fence-info i) :info i)) + (open-node :code {} (assoc (u/parse-fence-info i) :info i)) (push-node (text-node c)) close-node)) @@ -419,7 +391,7 @@ And what. #_insert-sidenote-containers) (-> empty-doc - (update :text-tokenizers (partial map normalize-tokenizer)) + (update :text-tokenizers (partial map u/normalize-tokenizer)) (apply-tokens (nextjournal.markdown/tokenize "what^[the heck]")) insert-sidenote-columns (apply-tokens (nextjournal.markdown/tokenize "# Hello")) @@ -455,94 +427,31 @@ And what. nextjournal.markdown.transform/->hiccup )) -;; ## Handling of Text Tokens -;; -;; normalize-tokenizer :: {:regex, :doc-handler} | {:tokenizer-fn, :handler} -> Tokenizer -;; Tokenizer :: {:tokenizer-fn :: TokenizerFn, :doc-handler :: DocHandler} -;; -;; Match :: Any -;; Handler :: Match -> Node -;; IndexedMatch :: (Match, Int, Int) -;; TokenizerFn :: String -> [IndexedMatch] -;; DocHandler :: Doc -> {:match :: Match} -> Doc - -(def hashtag-tokenizer - {:regex #"(^|\B)#[\w-]+" - :pred #(every? (complement #{:link}) (map :type (current-ancestor-nodes %))) - :handler (fn [match] {:type :hashtag :text (subs (match 0) 1)})}) - -(def internal-link-tokenizer - {:regex #"\[\[([^\]]+)\]\]" - :pred #(every? (complement #{:link}) (map :type (current-ancestor-nodes %))) - :handler (fn [match] {:type :internal-link :text (match 1)})}) - (comment (->> "# Hello #Fishes > what about #this _this #should be a tag_, but this [_actually #foo shouldnt_](/bar/) is not." - nextjournal.markdown/tokenize - (parse (update empty-doc :text-tokenizers conj hashtag-tokenizer)))) - - -(defn normalize-tokenizer - "Normalizes a map of regex and handler into a Tokenizer" - [{:as tokenizer :keys [doc-handler pred handler regex tokenizer-fn]}] - (assert (and (or doc-handler handler) (or regex tokenizer-fn))) - (cond-> tokenizer - (not doc-handler) (assoc :doc-handler (fn [doc {:keys [match]}] (push-node doc (handler match)))) - (not tokenizer-fn) (assoc :tokenizer-fn (partial re-idx-seq regex)) - (not pred) (assoc :pred (constantly true)))) - -(defn tokenize-text-node [{:as tkz :keys [tokenizer-fn pred doc-handler]} doc {:as node :keys [text]}] - ;; TokenizerFn -> HNode -> [HNode] - (assert (and (fn? tokenizer-fn) (fn? doc-handler) (fn? pred) (string? text)) - {:text text :tokenizer tkz}) - (let [idx-seq (when (pred doc) (tokenizer-fn text))] - (if (seq idx-seq) - (let [text-hnode (fn [s] (assoc (text-node s) :doc-handler push-node)) - {:keys [nodes remaining-text]} - (reduce (fn [{:as acc :keys [remaining-text]} [match start end]] - (-> acc - (update :remaining-text subs 0 start) - (cond-> - (< end (count remaining-text)) - (update :nodes conj (text-hnode (subs remaining-text end)))) - (update :nodes conj {:doc-handler doc-handler - :match match :text text - :start start :end end}))) - {:remaining-text text :nodes ()} - (reverse idx-seq))] - (cond-> nodes - (seq remaining-text) - (conj (text-hnode remaining-text)))) - [node]))) + (parse (update empty-doc :text-tokenizers conj (u/normalize-tokenizer u/hashtag-tokenizer))))) (defmethod apply-token "text" [{:as doc :keys [text-tokenizers]} {:keys [content]}] - (reduce (fn [doc {:as node :keys [doc-handler]}] (doc-handler doc (dissoc node :doc-handler))) - doc - (reduce (fn [nodes tokenizer] - (mapcat (fn [{:as node :keys [type]}] - (if (= :text type) (tokenize-text-node tokenizer doc node) [node])) - nodes)) - [{:type :text :text content :doc-handler push-node}] - text-tokenizers))) + (u/handle-text-token doc content)) (comment - (def mustache (normalize-tokenizer {:regex #"\{\{([^\{]+)\}\}" :handler (fn [m] {:type :eval :text (m 1)})})) + (def mustache (u/normalize-tokenizer {:regex #"\{\{([^\{]+)\}\}" :handler (fn [m] {:type :eval :text (m 1)})})) (tokenize-text-node mustache {} {:text "{{what}} the {{hellow}}"}) (apply-token (assoc empty-doc :text-tokenizers [mustache]) {:type "text" :content "foo [[bar]] dang #hashy taggy [[what]] #dangy foo [[great]] and {{eval}} me"}) (parse (assoc empty-doc :text-tokenizers - [(normalize-tokenizer {:regex #"\{\{([^\{]+)\}\}" + [(u/normalize-tokenizer {:regex #"\{\{([^\{]+)\}\}" :doc-handler (fn [{:as doc ::keys [path]} {[_ meta] :match}] (update-in doc (ppop path) assoc :meta meta))})]) - (nextjournal.markdown/tokenize "# Title {{id=heading}} + "# Title {{id=heading}} * one -* two"))) +* two")) ;; inlines (defmethod apply-token "inline" [doc {:as _token ts :children}] (apply-tokens doc ts)) @@ -587,7 +496,7 @@ _this #should be a tag_, but this [_actually #foo shouldnt_](/bar/) is not." (apply-tokens (-> ctx (assoc :text->id+emoji-fn (comp text->id+emoji md.transform/->text)) ;; TODO: 👆unify - (update :text-tokenizers (partial map normalize-tokenizer))) + ) (md/tokenize markdown)))) (comment diff --git a/src/nextjournal/markdown/parser/impl/utils.cljc b/src/nextjournal/markdown/parser/impl/utils.cljc index 644aefb..e5bf3d0 100644 --- a/src/nextjournal/markdown/parser/impl/utils.cljc +++ b/src/nextjournal/markdown/parser/impl/utils.cljc @@ -12,6 +12,9 @@ :nextjournal.markdown.parser.impl/path [:content -1] ;; private :text-tokenizers []}) +;; node utils +(defn text-node [s] {:type :text :text s}) + #?(:clj (defn re-groups* [m] (let [g (re-groups m)] (cond-> g (not (vector? g)) vector)))) (defn re-idx-seq "Takes a regex and a string, returns a seq of triplets comprised of match groups followed by indices delimiting each match." @@ -21,6 +24,10 @@ :cljs (let [rex (js/RegExp. (.-source re) "g")] (take-while some? (repeatedly #(when-some [m (.exec rex text)] [(vec m) (.-index m) (.-lastIndex rex)])))))) + +#_ (re-idx-seq #"\{\{([^{]+)\}\}" "foo {{hello}} bar") +#_ (re-idx-seq #"\{\{[^{]+\}\}" "foo {{hello}} bar {{what}} the") + ;; zipper utils (defn ->zip [doc] @@ -28,19 +35,111 @@ (fn [node cs] (assoc node :content (vec cs))) doc)) +(def zip? (comp some? :zip/children meta)) + +#_(zip? (->zip {:type :doc :content []})) +#_(->zip {:type :doc :content []}) + ;; TODO: rewrite in terms of zippers (def ppop (comp pop pop)) +(defn inc-last [path] (update path (dec (count path)) inc)) +(defn empty-text-node? [{text :text t :type}] (and (= :text t) (empty? text))) +;; TODO: unify in terms of zippers +#?(:cljs + (defn push-node [{:as doc :nextjournal.markdown.parser.impl/keys [path]} node] + (try + (cond-> doc + ;; ⬇ mdit produces empty text tokens at mark boundaries, see edge cases below + (not (empty-text-node? node)) + (-> #_doc + (update :nextjournal.markdown.parser.impl/path inc-last) + (update-in (pop path) conj node))) + (catch js/Error e + (throw (ex-info (str "nextjournal.markdown cannot add node: " node " at path: " path) + {:doc doc :node node} e))))) + :clj + (def push-node z/append-child)) + +;; ## Handling of Text Tokens +;; +;; normalize-tokenizer :: {:regex, :doc-handler} | {:tokenizer-fn, :handler} -> Tokenizer +;; Tokenizer :: {:tokenizer-fn :: TokenizerFn, :doc-handler :: DocHandler} +;; +;; Match :: Any +;; Handler :: Match -> Node +;; IndexedMatch :: (Match, Int, Int) +;; TokenizerFn :: String -> [IndexedMatch] +;; DocHandler :: Doc -> {:match :: Match} -> Doc + +(defn tokenize-text-node [{:as tkz :keys [tokenizer-fn pred doc-handler]} doc {:as node :keys [text]}] + ;; TokenizerFn -> HNode -> [HNode] + (assert (and (fn? tokenizer-fn) + (fn? doc-handler) + (fn? pred) + (string? text)) + {:text text :tokenizer tkz}) + (let [idx-seq (when (pred doc) (tokenizer-fn text))] + (if (seq idx-seq) + (let [text-hnode (fn [s] (assoc (text-node s) :doc-handler push-node)) + {:keys [nodes remaining-text]} + (reduce (fn [{:as acc :keys [remaining-text]} [match start end]] + (-> acc + (update :remaining-text subs 0 start) + (cond-> + (< end (count remaining-text)) + (update :nodes conj (text-hnode (subs remaining-text end)))) + (update :nodes conj {:doc-handler doc-handler + :match match :text text + :start start :end end}))) + {:remaining-text text :nodes ()} + (reverse idx-seq))] + (cond-> nodes + (seq remaining-text) + (conj (text-hnode remaining-text)))) + [node]))) + +(defn handle-text-token [{:as doc :keys [text-tokenizers]} text] + (let [text-tokenizers (:text-tokenizers (if (zip? doc) (z/root doc) doc))] + (reduce (fn [doc {:as node :keys [doc-handler]}] (doc-handler doc (dissoc node :doc-handler))) + doc + (reduce (fn [nodes tokenizer] + (mapcat (fn [{:as node :keys [type]}] + (if (= :text type) (tokenize-text-node tokenizer doc node) [node])) + nodes)) + [{:type :text :text text :doc-handler push-node}] + text-tokenizers)))) + +;; clj +#_(handle-text-token (->zip {:type :doc :content []}) "some-text") + +;; tokenizers +(defn normalize-tokenizer + "Normalizes a map of regex and handler into a Tokenizer" + [{:as tokenizer :keys [doc-handler pred handler regex tokenizer-fn]}] + (assert (and (or doc-handler handler) (or regex tokenizer-fn))) + (cond-> tokenizer + (not doc-handler) (assoc :doc-handler (fn [doc {:keys [match]}] (push-node doc (handler match)))) + (not tokenizer-fn) (assoc :tokenizer-fn (partial re-idx-seq regex)) + (not pred) (assoc :pred (constantly true)))) ;; TODO: rewrite in terms of zippers -(defn current-ancestor-nodes - "Given an open parsing context `doc`, returns the list of ancestors of the node last parsed into the document, up to but - not including the top document." - [{:as doc :nextjournal.markdown.parser.impl/keys [path]}] - (assert path "A path is needed in document context to retrieve the current node: `current-ancestor-nodes` cannot be called after `parse`.") - (loop [p (ppop path) ancestors []] - (if (seq p) - (recur (ppop p) (conj ancestors (get-in doc p))) - ancestors))) +#?(:cljs + (defn current-ancestor-nodes + "Given an open parsing context `doc`, returns the list of ancestors of the node last parsed into the document, up to but + not including the top document." + [{:as doc :nextjournal.markdown.parser.impl/keys [path]}] + (assert path "A path is needed in document context to retrieve the current node: `current-ancestor-nodes` cannot be called after `parse`.") + (loop [p (ppop path) ancestors []] + (if (seq p) + (recur (ppop p) (conj ancestors (get-in doc p))) + ancestors))) + :clj + (defn current-ancestor-nodes [loc] + (loop [loc loc ancestors []] + (let [parent (z/up loc)] + (if (and parent (not= :doc (:type (z/node parent)))) + (recur parent (conj ancestors (z/node parent))) + ancestors))))) (def hashtag-tokenizer {:regex #"(^|\B)#[\w-]+" @@ -52,6 +151,9 @@ :pred #(every? (complement #{:link}) (map :type (current-ancestor-nodes %))) :handler (fn [match] {:type :internal-link :text (match 1)})}) +#_(normalize-tokenizer internal-link-tokenizer) +#_(normalize-tokenizer hashtag-tokenizer) + (defn parse-fence-info [info-str] (try (when (string? info-str) @@ -72,10 +174,10 @@ tokens))) (catch #?(:clj Throwable :cljs :default) _ {}))) - (comment - (->zip {:type :doc :content []}) - - - (re-idx-seq #"\{\{([^{]+)\}\}" "foo {{hello}} bar") - (re-idx-seq #"\{\{[^{]+\}\}" "foo {{hello}} bar {{what}} the")) + (parse-fence-info "python runtime-id=5f77e475-6178-47a3-8437-45c9c34d57ff") + (parse-fence-info "{#some-id .lang foo=nex}") + (parse-fence-info "#id clojure") + (parse-fence-info "clojure #id") + (parse-fence-info "clojure") + (parse-fence-info "{r cars, echo=FALSE}")) diff --git a/test/nextjournal/markdown_test.cljc b/test/nextjournal/markdown_test.cljc index 9e2457c..a10eb5d 100644 --- a/test/nextjournal/markdown_test.cljc +++ b/test/nextjournal/markdown_test.cljc @@ -10,7 +10,22 @@ [nextjournal.markdown.transform :as md.transform])) ;; com.bhauman/cljs-test-display doesn't play well with ANSI codes -(matcher-combinators.ansi-color/disable!) +#?(:cljs (matcher-combinators.ansi-color/disable!)) + +(deftest simple-parsing + (is (match? {:type :doc, + :content [{:type :heading + :heading-level 1 + :content [{:type :text, :text "Ahoi"}]} + {:type :bullet-list, + :content [{:type :list-item, :content [{:type :plain, :content [{:type :text, :text "one"}]}]} + {:type :list-item, :content [{:type :plain, :content [{:type :em, :content [{:type :text, :text "nice"}]}]}]} + {:type :list-item, :content [{:type :plain, :content [{:type :text, :text "list"}]}]}]}] + :footnotes []} + (md/parse "# Ahoi +* one +* _nice_ +* list")))) (def markdown-text "# 🎱 Hello @@ -96,63 +111,50 @@ $$\\int_a^bf(t)dt$$ (testing "parses internal links / plays well with todo lists" - (is (match? {:toc {:type :toc} - :type :doc - :content [{:type :paragraph - :content [{:text "a " - :type :text} - {:text "wikistyle" - :type :internal-link} - {:text " link" - :type :text}]}]} + (is (match? {:type :doc + :content [{:type :paragraph + :content [{:text "a " + :type :text} + {:text "wikistyle" + :type :internal-link} + {:text " link" + :type :text}]}]} (parse-internal-links "a [[wikistyle]] link"))) (is (match? {:type :doc - :title "a wikistyle link in title" - :content [{:heading-level 1 - :type :heading - :content [{:text "a " - :type :text} - {:text "wikistyle" - :type :internal-link} - {:text " link in title" - :type :text}]}] - :toc {:type :toc - :children [{:type :toc - :content [{:text "a " - :type :text} - {:text "wikistyle" - :type :internal-link} - {:text " link in title" - :type :text}] - :heading-level 1 - :path [:content 0]}]}} + :content [{:heading-level 1 + :type :heading + :content [{:text "a " + :type :text} + {:text "wikistyle" + :type :internal-link} + {:text " link in title" + :type :text}]}]} (parse-internal-links "# a [[wikistyle]] link in title"))) (is (match? {:type :doc - :toc {:type :toc} - :content [{:type :todo-list - :attrs {:has-todos true} - :content [{:type :todo-item - :attrs {:checked true :todo true} - :content [{:content [{:text "done " - :type :text} - {:text "linkme" - :type :internal-link} - {:text " to" - :type :text}] - :type :plain}]} - {:type :todo-item - :attrs {:checked false :todo true} - :content [{:type :plain - :content [{:text "pending" - :type :text}]}]} - {:type :todo-item - :attrs {:checked false :todo true} - :content [{:type :plain - :content [{:text "pending" - :type :text}]}]}]}]} - (parse-internal-links "- [x] done [[linkme]] to + :toc {:type :toc} + :content [{:type :todo-list + :content [{:type :todo-item + :attrs {:checked true} + :content [{:content [{:text "done " + :type :text} + {:text "linkme" + :type :internal-link} + {:text " to" + :type :text}] + :type :plain}]} + {:type :todo-item + :attrs {:checked false} + :content [{:type :plain + :content [{:text "pending" + :type :text}]}]} + {:type :todo-item + :attrs {:checked false} + :content [{:type :plain + :content [{:text "pending" + :type :text}]}]}]}]} + (parse-internal-links "- [x] done [[linkme]] to - [ ] pending - [ ] pending"))))) @@ -348,32 +350,25 @@ rupt me when I'm writing.")))) - [ ] nested "))))) -(deftest tags-text +(deftest hashtags-test (testing "parsing tags" (is (match? {:type :doc - :title "Hello Tags" - :content [{:content [{:text "Hello Tags" - :type :text}] - :heading-level 1 - :type :heading} - {:content [{:text "par with " - :type :text} - {:text "really_nice" - :type :hashtag} - {:text " " - :type :text} - {:text "useful-123" - :type :hashtag} - {:text " tags" - :type :text}] - :type :paragraph}] - :toc {:type :toc - :children [{:type :toc - :content [{:text "Hello Tags" - :type :text}] - :heading-level 1 - :path [:content 0]}]}} - (parse-hashtags "# Hello Tags + :content [{:content [{:text "Hello Tags" + :type :text}] + :heading-level 1 + :type :heading} + {:content [{:text "par with " + :type :text} + {:text "really_nice" + :type :hashtag} + {:text " " + :type :text} + {:text "useful-123" + :type :hashtag} + {:text " tags" + :type :text}] + :type :paragraph}]} + (parse-hashtags "# Hello Tags par with #really_nice #useful-123 tags ")))) @@ -818,6 +813,56 @@ $$ $$\\bigoplus$$ ")))) +(deftest toc-test + (testing "extracts toc structure" + (is (match? {:type :toc, + :children [{:type :toc, + :content [{:type :text, :text "Title"}], + :heading-level 1, + :attrs {:id "title"}, + :path [:content 0], + :children [{:type :toc, + :content [{:type :text, :text "Section One"}], + :heading-level 2, + :attrs {:id "section-one"}, + :path [:content 1], + :children [{:type :toc, + :content [{:type :text, :text "Section 1.1"}], + :heading-level 3, + :attrs {:id "section-1.1"}, + :path [:content 3]} + {:type :toc, + :content [{:type :text, :text "Section 1.2"}], + :heading-level 3, + :attrs {:id "section-1.2"}, + :path [:content 4]}]} + {:type :toc, + :content [{:type :text, :text "Section Two"}], + :heading-level 2, + :attrs {:id "section-two"}, + :path [:content 6], + :children [{:type :toc, + :content [{:type :text, :text "Section 2.1"}], + :heading-level 3, + :attrs {:id "section-2.1"}, + :path [:content 8], + :children [{:type :toc, + :content [{:type :text, :text "Section 3.1"}], + :heading-level 4, + :attrs {:id "section-3.1"}, + :path [:content 9]}]}]}]}]} + (:toc (md/parse "# Title +## Section One +some text +### Section 1.1 +### Section 1.2 +some text +## Section Two +some text +### Section 2.1 +#### Section 3.1 +")))))) + (comment (clojure.test/run-test-var #'formulas) From cdec3d4fccbbbceffd5e23e0eccf0c4839b7aee0 Mon Sep 17 00:00:00 2001 From: Andrea Amantini Date: Tue, 13 Aug 2024 18:52:00 +0200 Subject: [PATCH 31/83] Use latest commit available on jitpack (temporarily disable footnotes) --- deps.edn | 32 ++++++++++++------ jars/commonmark-0.22.1-SNAPSHOT.jar | Bin 211101 -> 0 bytes ...mmonmark-ext-footnotes-0.22.1-SNAPSHOT.jar | Bin 20916 -> 0 bytes ...rk-ext-task-list-items-0.22.1-SNAPSHOT.jar | Bin 9428 -> 0 bytes src/nextjournal/markdown.cljc | 1 - src/nextjournal/markdown/parser/impl.clj | 11 +++--- 6 files changed, 28 insertions(+), 16 deletions(-) delete mode 100644 jars/commonmark-0.22.1-SNAPSHOT.jar delete mode 100644 jars/commonmark-ext-footnotes-0.22.1-SNAPSHOT.jar delete mode 100644 jars/commonmark-ext-task-list-items-0.22.1-SNAPSHOT.jar diff --git a/deps.edn b/deps.edn index b836179..5d62fb5 100644 --- a/deps.edn +++ b/deps.edn @@ -1,18 +1,31 @@ {:paths ["src" "resources" "classes"] + :mvn/repos {"jitpack.io" {:url "https://jitpack.io"}} :deps {applied-science/js-interop {:mvn/version "0.3.3"} org.clojure/data.json {:mvn/version "2.4.0"} org.graalvm.js/js {:mvn/version "21.3.2.1"} ;; commonmark - ;; org.commonmark/commonmark {:mvn/version "0.22.0"} - ;; use temporary jitpack commit until release - ;; com.github.commonmark/commonmark-java {:mvn/version "3733963"} - com.github.commonmark/commonmark-java {:local/root "./jars/commonmark-0.22.1-SNAPSHOT.jar"} - org.commonmark/commonmark-ext-task-list-items {:local/root "./jars/commonmark-ext-task-list-items-0.22.1-SNAPSHOT.jar"} - org.commonmark/commonmark-ext-footnotes {:local/root "./jars/commonmark-ext-footnotes-0.22.1-SNAPSHOT.jar"} - } + ;;org.commonmark/commonmark {:mvn/version "0.22.0"} + ;;org.commonmark/commonmark-ext-task-list-items {:mvn/version "0.22.0"} - :mvn/repos {"jitpack.io" {:url "https://jitpack.io"}} + ;; use jitpack until release + com.github.commonmark/commonmark-java {:mvn/version "faea2a2a61cfa1b1f26a4e914532b651b3602e34"} + com.github.commonmark.commonmark-java/commonmark-ext-task-list-items {:mvn/version "faea2a2a61cfa1b1f26a4e914532b651b3602e34"} + + ;; jitpack bisect + + ;; origin/main bad + ;; 7b48401897a0c0bf46e757445a20deab78796101 bad (first) + + ;; faea2a2a61cfa1b1f26a4e914532b651b3602e34 good + ;; dd0a4be86643ba95da7304336e2ab123a74d0e35 good + ;; 3733963538bd52d619da40508d837186316dadbb good + + ;; jitpack stopped working as of commit, use local jars + ;; com.github.commonmark/commonmark-java {:local/root "./jars/commonmark-0.22.1-SNAPSHOT.jar"} + ;; org.commonmark/commonmark-ext-task-list-items {:local/root "./jars/commonmark-ext-task-list-items-0.22.1-SNAPSHOT.jar"} + ;; org.commonmark/commonmark-ext-footnotes {:local/root "./jars/commonmark-ext-footnotes-0.22.1-SNAPSHOT.jar"} + } :aliases {:nextjournal/clerk @@ -55,9 +68,6 @@ :git/sha "e8f275b5cf077ec9441e404c1885ff0b6ee0aef9" :deps/root "render"}}} - :commonmark-java-local - {:extra-paths ["../commonmark-java/commonmark/target/classes"]} - :build {:ns-default build :deps {io.github.clojure/tools.build {:git/tag "v0.6.1" :git/sha "515b334"} diff --git a/jars/commonmark-0.22.1-SNAPSHOT.jar b/jars/commonmark-0.22.1-SNAPSHOT.jar deleted file mode 100644 index e81fd26ff518bc16b173eac37c11abb8c73d67c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 211101 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%0AGyszL`ekN72J7=7rsBAttg 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%0A1}TM$m*SOfw@Rf+q}`~rXw~OcB)8}5 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