From 7fa5a897228e24599d5cec0af7da8157b8af79df Mon Sep 17 00:00:00 2001 From: Superkooka Date: Tue, 12 Dec 2023 11:49:07 +0100 Subject: [PATCH] parse rich text Signed-off-by: Superkooka --- blog.janet | 69 ++++++++++++++++++++---------------------------------- 1 file changed, 25 insertions(+), 44 deletions(-) diff --git a/blog.janet b/blog.janet index d674133..9e83fe6 100644 --- a/blog.janet +++ b/blog.janet @@ -12,65 +12,46 @@ # Symbole :end-of-line (* (? "\r") "\n") :space "\u0020" + :tab (+ "\u0009" (4 :space)) + :code-block-tag "```" :list-item-starter (+ "*" "-") + :italic-tag "*" + :bold-tag "**" + :stroke-tag "~~" + :code-line-tag "`" - :paragraph (some (if-not :end-of-line 1)) + :rich-text-tag (+ :italic-tag :bold-tag :stroke-tag :code-line-tag) + :basic-text (some (if-not (+ :end-of-line :code-line-tag :stroke-tag :bold-tag :italic-tag) 1)) + + :c-basic-text (cmt (<- :basic-text),|[:text $0]) + + :bold (cmt (* :bold-tag :rich-text :bold-tag),|[:bold $0 $&]) + :italic (cmt (* :italic-tag :rich-text :italic-tag),|[:italic $0 $&]) + :stroke (cmt (* :stroke-tag :rich-text :stroke-tag),|[:stroke $0 $&]) + :code-line (cmt (* :code-line-tag (<- :rich-text) :code-line-tag),|[:code-line $0 $&]) + + :rich-text (cmt (some (+ :code-line :bold :italic :stroke :c-basic-text)),|(map (fn [arg] [(get arg 0) (get arg 1)]) $&)) + :line (cmt (* :rich-text :end-of-line),|[:line $0]) # Block - :heading (cmt (* (<- (between 1 6 "#")) :space (<- :paragraph)),|[:heading (length $0) $1]) - :hr (cmt (at-least 3 (+ "-" "_" "*")),|[:hr]) - :code-block (cmt (* :code-block-tag (? (<- :paragraph)) :end-of-line (<- (some (if-not :code-block-tag 1))) :code-block-tag),|[:code-block $0 $1]) - :quote (cmt (* ">" :space (<- :paragraph)),|[:quote $0]) - :list-item (cmt (* :list-item-starter :space (<- :paragraph)),|[:list-item $0]) - :list (cmt (some (* :list-item (? :end-of-line))),|[:list $&]) - - # :table-cel "" - :table-row (* "|" (cmt (some (* (<- (some (if-not "|" 1))) "|")),|[:table-row (map string/trim $&)]) :end-of-line) - :table-delimiter (* "|" (cmt (some (* (any :space) (at-least 3 "-") (any :space) "|")),|[:delimiter]) :end-of-line) # Delimiter Row - :table # - (cmt (* - :table-row - :table-delimiter - (some :table-row)),|[:table $&]) - - :line (cmt (<- :paragraph),|[:line $0]) + :heading (cmt (* (<- (between 1 6 "#")) :space (<- :basic-text)),|[:heading (length $0) $1]) + :hr (cmt (* (at-least 3 (+ "-" "_" "*")) :end-of-line),|[:hr]) + :code-block (cmt (* :code-block-tag (? (<- :basic-text)) :end-of-line (<- (some (if-not :code-block-tag 1))) :code-block-tag),|[:code-block $0 $1]) + :quote (cmt (* ">" :space (? :rich-text)),|[:quote $0]) + :list-item (cmt (* (<- (? (between 0 2 :tab))) :list-item-starter :space :rich-text),|[:list-item (/ (length $0) 4) $1]) + :list (cmt (some (* :list-item (? :end-of-line))),|[:list $&]) :block (+ :heading :hr :code-block :quote :list - :table - :table-row :line :end-of-line) :main (some (* :block (? :end-of-line)))}) -(defn to-html - "Convert AST to HTML" - [ast] - (if ast - (string/join - (map - |(match $0 - [:heading level value] - (string "" value "") - [:quote value] - (string "
" value "
") - [:list items] - (string/join @["
    " - ;(map |(string "
  • " $0 "
  • ") (get items 0)) - "
"] "\n") - [:line value] - (string "

" value "

") - [:code-block lang value] - (string "
" value "
") - _ - (error (string "Invalid symbol: " (get $0 0)))) - ast) "\n" ))) - (defn pp-ast "Pretty prints the Mardown AST (as provided by (peg/match md-to-ast))" [ast] @@ -81,5 +62,5 @@ (print "]")))) (defn main [bin & args] - (pp-ast (peg/match md-to-ast (read-from-file "raw/~notes/blog.md")))) + (pp-ast (peg/match md-to-ast (read-from-file "raw/~blog/blog.md")))) # (print (to-html (peg/match md-to-ast (read-from-file "raw/~notes/blog.md")))))