diff --git a/.carve/ignore b/.carve/ignore index ac491435a6..c4f4fb05d4 100644 --- a/.carve/ignore +++ b/.carve/ignore @@ -29,7 +29,7 @@ frontend.extensions.zotero.api/item ;; For repl frontend.external.roam/reset-state! ;; For repl -frontend.format.mldoc/ast-export-markdown +logseq.graph-parser.mldoc/ast-export-markdown ;; Protocol fn wrapper that could be used frontend.fs/readdir ;; Referenced in TODO diff --git a/src/main/frontend/components/block.cljs b/src/main/frontend/components/block.cljs index 625161d82d..8e56a5b573 100644 --- a/src/main/frontend/components/block.cljs +++ b/src/main/frontend/components/block.cljs @@ -720,13 +720,13 @@ (inline-text {} format v)) ([config format v] (when (string? v) - (let [inline-list (mldoc/inline->edn v (gp-mldoc/default-config format))] + (let [inline-list (gp-mldoc/inline->edn v (gp-mldoc/default-config format))] [:div.inline.mr-1 (map-inline config inline-list)])))) (defn- render-macro [config name arguments macro-content format] (if macro-content - (let [ast (->> (mldoc/->edn macro-content (gp-mldoc/default-config format)) + (let [ast (->> (gp-mldoc/->edn macro-content (gp-mldoc/default-config format)) (map first)) paragraph? (and (= 1 (count ast)) (= "Paragraph" (ffirst ast)))] @@ -2708,11 +2708,11 @@ ;; (cond ;; (= lang "quote") ;; (let [content (string/trim (string/join "\n" lines))] -;; ["Quote" (first (mldoc/->edn content (gp-mldoc/default-config :markdown)))]) +;; ["Quote" (first (gp-mldoc/->edn content (gp-mldoc/default-config :markdown)))]) ;; (contains? #{"query" "note" "tip" "important" "caution" "warning" "pinned"} lang) ;; (let [content (string/trim (string/join "\n" lines))] -;; ["Custom" lang nil (first (mldoc/->edn content (gp-mldoc/default-config :markdown))) content]) +;; ["Custom" lang nil (first (gp-mldoc/->edn content (gp-mldoc/default-config :markdown))) content]) ;; :else ;; ["Src" options]))) diff --git a/src/main/frontend/format.cljs b/src/main/frontend/format.cljs index ced7e00688..e9c24b45f0 100644 --- a/src/main/frontend/format.cljs +++ b/src/main/frontend/format.cljs @@ -6,7 +6,7 @@ [logseq.graph-parser.mldoc :as gp-mldoc] [clojure.string :as string])) -(set! mldoc/parse-property text/parse-property) +(set! gp-mldoc/parse-property text/parse-property) (defonce mldoc-record (->MldocMode)) (defonce adoc-record (->AdocMode)) diff --git a/src/main/frontend/format/block.cljs b/src/main/frontend/format/block.cljs index 19474ece77..28e0394805 100644 --- a/src/main/frontend/format/block.cljs +++ b/src/main/frontend/format/block.cljs @@ -15,8 +15,7 @@ [logseq.graph-parser.config :as gp-config] [logseq.graph-parser.mldoc :as gp-mldoc] [lambdaisland.glogi :as log] - [medley.core :as medley] - [frontend.format.mldoc :as mldoc])) + [medley.core :as medley])) (defn heading-block? [block] @@ -166,7 +165,7 @@ (map last) (map (fn [v] (when (and (string? v) - (not (mldoc/link? format v))) + (not (gp-mldoc/link? format v))) (let [v (string/trim v) result (text/split-page-refs-without-brackets v {:un-brackets? false})] (if (coll? result) @@ -430,7 +429,7 @@ (if (or (:pre-block? block) (= (:format block) :org)) content - (mldoc/remove-indentation-spaces content (inc (:level block)) false))))] + (gp-mldoc/remove-indentation-spaces content (inc (:level block)) false))))] (if (= format :org) content (property/->new-properties content)))) diff --git a/src/main/frontend/format/mldoc.cljs b/src/main/frontend/format/mldoc.cljs index ae0854234b..dc980225ae 100644 --- a/src/main/frontend/format/mldoc.cljs +++ b/src/main/frontend/format/mldoc.cljs @@ -1,15 +1,11 @@ (ns frontend.format.mldoc (:require [clojure.string :as string] [frontend.format.protocol :as protocol] - [frontend.utf8 :as utf8] [goog.object :as gobj] [lambdaisland.glogi :as log] - [medley.core :as medley] ["mldoc" :as mldoc :refer [Mldoc]] - [linked.core :as linked] [logseq.graph-parser.mldoc :as gp-mldoc] - [logseq.graph-parser.util :as gp-util] - [logseq.graph-parser.config :as gp-config])) + [logseq.graph-parser.util :as gp-util])) (defonce anchorLink (gobj/get Mldoc "anchorLink")) (defonce parseOPML (gobj/get Mldoc "parseOPML")) @@ -34,104 +30,6 @@ title (or references gp-mldoc/default-references))) -(defn remove-indentation-spaces - [s level remove-first-line?] - (let [lines (string/split-lines s) - [f & r] lines - body (map (fn [line] - (if (string/blank? (gp-util/safe-subs line 0 level)) - (gp-util/safe-subs line level) - line)) - (if remove-first-line? lines r)) - content (if remove-first-line? body (cons f body))] - (string/join "\n" content))) - -(defn- ->vec - [s] - (if (string? s) [s] s)) - -(defn- ->vec-concat - [& coll] - (->> (map ->vec coll) - (remove nil?) - (apply concat) - (distinct))) - -(defn collect-page-properties - [ast parse-property] - (if (seq ast) - (let [original-ast ast - ast (map first ast) ; without position meta - directive? (fn [[item _]] (= "directive" (string/lower-case (first item)))) - grouped-ast (group-by directive? original-ast) - directive-ast (take-while directive? original-ast) - [properties-ast other-ast] (if (= "Property_Drawer" (ffirst ast)) - [(last (first ast)) - (rest original-ast)] - [(->> (map first directive-ast) - (map rest)) - (get grouped-ast false)]) - properties (->> - properties-ast - (map (fn [[k v]] - (let [k (keyword (string/lower-case k)) - v (if (contains? #{:title :description :filters :macro} k) - v - (parse-property k v))] - [k v])))) - properties (into (linked/map) properties) - macro-properties (filter (fn [x] (= :macro (first x))) properties) - macros (if (seq macro-properties) - (->> - (map - (fn [[_ v]] - (let [[k v] (gp-util/split-first " " v)] - (mapv - string/trim - [k v]))) - macro-properties) - (into {})) - {}) - properties (->> (remove (fn [x] (= :macro (first x))) properties) - (into (linked/map))) - properties (cond-> properties - (seq macros) - (assoc :macros macros)) - alias (:alias properties) - alias (when alias - (if (coll? alias) - (remove string/blank? alias) - [alias])) - filetags (when-let [org-file-tags (:filetags properties)] - (->> (string/split org-file-tags ":") - (remove string/blank?))) - tags (:tags properties) - tags (->> (->vec-concat tags filetags) - (remove string/blank?)) - properties (assoc properties :tags tags :alias alias) - properties (-> properties - (update :filetags (constantly filetags))) - properties (medley/remove-kv (fn [_k v] (or (nil? v) (and (coll? v) (empty? v)))) properties)] - (if (seq properties) - (cons [["Properties" properties] nil] other-ast) - original-ast)) - ast)) - -(defn update-src-full-content - [ast content] - (let [content (utf8/encode content)] - (map (fn [[block pos-meta]] - (if (and (vector? block) - (= "Src" (first block))) - (let [{:keys [start_pos end_pos]} pos-meta - content (utf8/substring content start_pos end_pos) - spaces (re-find #"^[\t ]+" (first (string/split-lines content))) - content (if spaces (remove-indentation-spaces content (count spaces) true) - content) - block ["Src" (assoc (second block) :full_content content)]] - [block pos-meta]) - [block pos-meta])) ast))) - (defn block-with-title? [type] (contains? #{"Paragraph" @@ -139,50 +37,21 @@ "Hiccup" "Heading"} type)) -(def parse-property nil) - -(defn ->edn - [content config] - (if (string? content) - (try - (if (string/blank? content) - [] - (-> content - (gp-mldoc/parse-json config) - (gp-util/json->clj) - (update-src-full-content content) - (collect-page-properties parse-property))) - (catch js/Error e - (js/console.error e) - [])) - (log/error :edn/wrong-content-type content))) - (defn opml->edn [content] (try (if (string/blank? content) {} (let [[headers blocks] (-> content (parse-opml) (gp-util/json->clj))] - [headers (collect-page-properties blocks parse-property)])) + [headers (gp-mldoc/collect-page-properties blocks gp-mldoc/parse-property)])) (catch js/Error e (log/error :edn/convert-failed e) []))) -(defn inline->edn - [text config] - (try - (if (string/blank? text) - {} - (-> text - (gp-mldoc/inline-parse-json config) - (gp-util/json->clj))) - (catch js/Error _e - []))) - (defrecord MldocMode [] protocol/Format (toEdn [_this content config] - (->edn content config)) + (gp-mldoc/->edn content config)) (toHtml [_this content config references] (export "html" content config references)) (loaded? [_this] @@ -206,21 +75,3 @@ [ast typ] (and (contains? #{"Drawer"} (ffirst ast)) (= typ (second (first ast))))) - -(defn link? - [format link] - (when (string? link) - (let [[type link] (first (inline->edn link (gp-mldoc/default-config format))) - [ref-type ref-value] (:url link)] - (and (= "Link" type) - (or - ;; 1. url - (not (contains? #{"Page_ref" "Block_ref"} ref-type)) - - (and (contains? #{"Page_ref"} ref-type) - (or - ;; 2. excalidraw link - (gp-config/draw? ref-value) - - ;; 3. local asset link - (boolean (gp-config/local-asset? ref-value))))))))) diff --git a/src/main/frontend/handler/editor.cljs b/src/main/frontend/handler/editor.cljs index fcc769b4d3..4782e476a3 100644 --- a/src/main/frontend/handler/editor.cljs +++ b/src/main/frontend/handler/editor.cljs @@ -357,7 +357,7 @@ content (drawer/with-logbook block content) content (with-timetracking block content) first-block? (= left page) - ast (mldoc/->edn (string/trim content) (gp-mldoc/default-config format)) + ast (gp-mldoc/->edn (string/trim content) (gp-mldoc/default-config format)) first-elem-type (first (ffirst ast)) first-elem-meta (second (ffirst ast)) properties? (contains? #{"Property_Drawer" "Properties"} first-elem-type) @@ -1942,7 +1942,7 @@ props (into [] (:properties block)) content* (str (if (= :markdown format) "- " "* ") (property/insert-properties format content props)) - ast (mldoc/->edn content* (gp-mldoc/default-config format)) + ast (gp-mldoc/->edn content* (gp-mldoc/default-config format)) blocks (block/extract-blocks ast content* true format) fst-block (first blocks)] (assert fst-block "fst-block shouldn't be nil") @@ -2851,7 +2851,7 @@ (when-let [editing-block (state/get-edit-block)] (let [page-id (:db/id (:block/page editing-block)) blocks (block/extract-blocks - (mldoc/->edn text (gp-mldoc/default-config format)) text true format) + (gp-mldoc/->edn text (gp-mldoc/default-config format)) text true format) blocks' (block/with-parent-and-left page-id blocks)] (paste-blocks blocks' {})))) @@ -3169,7 +3169,7 @@ [format content semantic?] (and (string/includes? content "\n") (if semantic? - (let [ast (mldoc/->edn content (gp-mldoc/default-config format)) + (let [ast (gp-mldoc/->edn content (gp-mldoc/default-config format)) first-elem-type (first (ffirst ast))] (mldoc/block-with-title? first-elem-type)) true))) diff --git a/src/main/frontend/handler/export.cljs b/src/main/frontend/handler/export.cljs index 427d574988..50f27864df 100644 --- a/src/main/frontend/handler/export.cljs +++ b/src/main/frontend/handler/export.cljs @@ -15,7 +15,6 @@ [frontend.publishing.html :as html] [frontend.state :as state] [frontend.util :as util] - [frontend.format.mldoc :as mldoc] [logseq.graph-parser.mldoc :as gp-mldoc] [goog.dom :as gdom] [promesa.core :as p]) @@ -215,7 +214,7 @@ (let [block (db/entity [:block/uuid (uuid block-uuid)]) block-content (get-blocks-contents repo (:block/uuid block)) format (:block/format block) - ast (mldoc/->edn block-content (gp-mldoc/default-config format)) + ast (gp-mldoc/->edn block-content (gp-mldoc/default-config format)) embed-pages-new (get-embed-pages-from-ast ast) embed-blocks-new (get-embed-blocks-from-ast ast) block-refs-new (get-block-refs-from-ast ast) @@ -259,7 +258,7 @@ (let [page-name* (util/page-name-sanity-lc page-name) page-content (get-page-content repo page-name*) format (:block/format (db/entity [:block/name page-name*])) - ast (mldoc/->edn page-content (gp-mldoc/default-config format)) + ast (gp-mldoc/->edn page-content (gp-mldoc/default-config format)) embed-pages-new (get-embed-pages-from-ast ast) embed-blocks-new (get-embed-blocks-from-ast ast) block-refs-new (get-block-refs-from-ast ast) diff --git a/src/main/frontend/handler/extract.cljs b/src/main/frontend/handler/extract.cljs index cddde05c20..20bb7e08a5 100644 --- a/src/main/frontend/handler/extract.cljs +++ b/src/main/frontend/handler/extract.cljs @@ -7,7 +7,6 @@ [frontend.db :as db] [frontend.format :as format] [frontend.format.block :as block] - [frontend.format.mldoc :as mldoc] [frontend.state :as state] [frontend.text :as text] [frontend.util :as util] @@ -143,7 +142,7 @@ [] (let [format (format/get-format file) _ (println "Parsing start: " file) - ast (mldoc/->edn content (gp-mldoc/default-config format + ast (gp-mldoc/->edn content (gp-mldoc/default-config format ;; {:parse_outline_only? true} ))] (println "Parsing finished : " file) diff --git a/src/main/frontend/mobile/intent.cljs b/src/main/frontend/mobile/intent.cljs index fa84298429..5516d9833e 100644 --- a/src/main/frontend/mobile/intent.cljs +++ b/src/main/frontend/mobile/intent.cljs @@ -10,7 +10,7 @@ [frontend.date :as date] [frontend.util :as util] [frontend.config :as config] - [frontend.format.mldoc :as mldoc] + [logseq.graph-parser.mldoc :as gp-mldoc] ["path" :as path] [frontend.mobile.util :as mobile-util] [frontend.handler.notification :as notification] @@ -23,11 +23,11 @@ (string/lower-case (date/journal-name))) format (db/get-page-format page) time (date/get-current-time) - url (if (and (mldoc/link? format title) (not url)) + url (if (and (gp-mldoc/link? format title) (not url)) title url) text (if (= url title) nil title) - [text url] (if (or (mldoc/link? format url) (not url)) + [text url] (if (or (gp-mldoc/link? format url) (not url)) [text url] (string/split url "\"\n")) text (some-> text (string/replace #"^\"" "")) diff --git a/src/main/frontend/text.cljs b/src/main/frontend/text.cljs index 92b59f00c5..e8da33b87f 100644 --- a/src/main/frontend/text.cljs +++ b/src/main/frontend/text.cljs @@ -2,8 +2,8 @@ (:require [frontend.config :as config] [frontend.util :as util] [clojure.string :as string] - [frontend.format.mldoc :as mldoc] [clojure.set :as set] + [logseq.graph-parser.mldoc :as gp-mldoc] [logseq.graph-parser.util :as gp-util] [frontend.state :as state])) @@ -366,7 +366,7 @@ (contains? @non-parsing-properties (string/lower-case k)) v - (mldoc/link? format v) + (gp-mldoc/link? format v) v :else diff --git a/src/main/frontend/util/drawer.cljs b/src/main/frontend/util/drawer.cljs index cf3f81c84e..3c742c3ec3 100644 --- a/src/main/frontend/util/drawer.cljs +++ b/src/main/frontend/util/drawer.cljs @@ -24,7 +24,7 @@ (defn get-drawer-ast [format content typ] - (let [ast (mldoc/->edn content (gp-mldoc/default-config format)) + (let [ast (gp-mldoc/->edn content (gp-mldoc/default-config format)) typ-drawer (ffirst (filter (fn [x] (mldoc/typ-drawer? x typ)) ast))] typ-drawer)) @@ -33,7 +33,7 @@ [format content typ value] (when (string? content) (try - (let [ast (mldoc/->edn content (gp-mldoc/default-config format)) + (let [ast (gp-mldoc/->edn content (gp-mldoc/default-config format)) has-properties? (some (fn [x] (mldoc/properties? x)) ast) has-typ-drawer? (some (fn [x] (mldoc/typ-drawer? x typ)) ast) lines (string/split-lines content) diff --git a/src/main/frontend/util/property.cljs b/src/main/frontend/util/property.cljs index 1840289764..7944cb48c7 100644 --- a/src/main/frontend/util/property.cljs +++ b/src/main/frontend/util/property.cljs @@ -188,7 +188,7 @@ properties (filter (fn [[k _v]] ((built-in-properties) k)) properties)] (if (seq properties) (let [lines (string/split-lines content) - ast (mldoc/->edn content (gp-mldoc/default-config format)) + ast (gp-mldoc/->edn content (gp-mldoc/default-config format)) [title body] (if (mldoc/block-with-title? (first (ffirst ast))) [(first lines) (rest lines)] [nil lines]) @@ -234,7 +234,7 @@ (insert-property format content key value false)) ([format content key value front-matter?] (when (string? content) - (let [ast (mldoc/->edn content (gp-mldoc/default-config format)) + (let [ast (gp-mldoc/->edn content (gp-mldoc/default-config format)) title? (mldoc/block-with-title? (ffirst (map first ast))) has-properties? (or (and title? (mldoc/properties? (second ast))) diff --git a/src/main/logseq/graph_parser/log.cljs b/src/main/logseq/graph_parser/log.cljs new file mode 100644 index 0000000000..60ef312ae6 --- /dev/null +++ b/src/main/logseq/graph_parser/log.cljs @@ -0,0 +1,6 @@ +(ns logseq.graph-parser.log + "Minimal logging ns that implements basic lambdaisland.glogi fns. May use + glogi later if this ns is used more") + +(defn error [& msgs] + (apply js/console.error (map clj->js msgs))) diff --git a/src/main/logseq/graph_parser/mldoc.cljc b/src/main/logseq/graph_parser/mldoc.cljc index 8c04a6e1d7..a1ac73e054 100644 --- a/src/main/logseq/graph_parser/mldoc.cljc +++ b/src/main/logseq/graph_parser/mldoc.cljc @@ -1,21 +1,27 @@ (ns ^:nbb-compatible logseq.graph-parser.mldoc + ;; Disable clj linters since we don't support clj + #?(:clj {:clj-kondo/config {:linters {:unresolved-namespace {:level :off} + :unresolved-symbol {:level :off}}}}) (:require #?(:org.babashka/nbb ["mldoc$default" :refer [Mldoc]] - :default ["mldoc" :refer [Mldoc]]) + :default ["mldoc" :refer [Mldoc]]) + #?(:org.babashka/nbb [logseq.graph-parser.log :as log] + :default [lambdaisland.glogi :as log]) [goog.object :as gobj] [cljs-bean.core :as bean] - [clojure.string :as string])) + [frontend.utf8 :as utf8] + [clojure.string :as string] + [linked.core :as linked] + [logseq.graph-parser.util :as gp-util] + [logseq.graph-parser.config :as gp-config])) (defonce parseJson (gobj/get Mldoc "parseJson")) (defonce parseInlineJson (gobj/get Mldoc "parseInlineJson")) (defonce astExportMarkdown (gobj/get Mldoc "astExportMarkdown")) -;; NOTE: All references to js/ have to have a :default conditional because of clojure (def default-references - #?(:cljs - (js/JSON.stringify - (clj->js {:embed_blocks [] - :embed_pages []})) - :default {})) + (js/JSON.stringify + (clj->js {:embed_blocks [] + :embed_pages []}))) (defn- convert-export-md-remove-options [opts] (->> opts @@ -58,4 +64,152 @@ (filter #(not (nil? (second %)))) (into {}) (bean/->js) - #?(:cljs js/JSON.stringify :default identity))))) + js/JSON.stringify)))) + +(defn remove-indentation-spaces + [s level remove-first-line?] + (let [lines (string/split-lines s) + [f & r] lines + body (map (fn [line] + (if (string/blank? (gp-util/safe-subs line 0 level)) + (gp-util/safe-subs line level) + line)) + (if remove-first-line? lines r)) + content (if remove-first-line? body (cons f body))] + (string/join "\n" content))) + +(defn- update-src-full-content + [ast content] + (let [content (utf8/encode content)] + (map (fn [[block pos-meta]] + (if (and (vector? block) + (= "Src" (first block))) + (let [{:keys [start_pos end_pos]} pos-meta + content (utf8/substring content start_pos end_pos) + spaces (re-find #"^[\t ]+" (first (string/split-lines content))) + content (if spaces (remove-indentation-spaces content (count spaces) true) + content) + block ["Src" (assoc (second block) :full_content content)]] + [block pos-meta]) + [block pos-meta])) ast))) + +(defn- ->vec + [s] + (if (string? s) [s] s)) + +(defn- ->vec-concat + [& coll] + (->> (map ->vec coll) + (remove nil?) + (apply concat) + (distinct))) + +(defn collect-page-properties + [ast parse-property] + (if (seq ast) + (let [original-ast ast + ast (map first ast) ; without position meta + directive? (fn [[item _]] (= "directive" (string/lower-case (first item)))) + grouped-ast (group-by directive? original-ast) + directive-ast (take-while directive? original-ast) + [properties-ast other-ast] (if (= "Property_Drawer" (ffirst ast)) + [(last (first ast)) + (rest original-ast)] + [(->> (map first directive-ast) + (map rest)) + (get grouped-ast false)]) + properties (->> + properties-ast + (map (fn [[k v]] + (let [k (keyword (string/lower-case k)) + v (if (contains? #{:title :description :filters :macro} k) + v + (parse-property k v))] + [k v])))) + properties (into (linked/map) properties) + macro-properties (filter (fn [x] (= :macro (first x))) properties) + macros (if (seq macro-properties) + (->> + (map + (fn [[_ v]] + (let [[k v] (gp-util/split-first " " v)] + (mapv + string/trim + [k v]))) + macro-properties) + (into {})) + {}) + properties (->> (remove (fn [x] (= :macro (first x))) properties) + (into (linked/map))) + properties (cond-> properties + (seq macros) + (assoc :macros macros)) + alias (:alias properties) + alias (when alias + (if (coll? alias) + (remove string/blank? alias) + [alias])) + filetags (when-let [org-file-tags (:filetags properties)] + (->> (string/split org-file-tags ":") + (remove string/blank?))) + tags (:tags properties) + tags (->> (->vec-concat tags filetags) + (remove string/blank?)) + properties (assoc properties :tags tags :alias alias) + properties (-> properties + (update :filetags (constantly filetags))) + properties (into (linked/map) + (remove (fn [[_k v]] + (or (nil? v) (and (coll? v) (empty? v)))) + properties))] + (if (seq properties) + (cons [["Properties" properties] nil] other-ast) + original-ast)) + ast)) + +(def parse-property nil) + +(defn ->edn + [content config] + (if (string? content) + (try + (if (string/blank? content) + [] + (-> content + (parse-json config) + (gp-util/json->clj) + (update-src-full-content content) + (collect-page-properties parse-property))) + (catch js/Error e + (js/console.error e) + [])) + (log/error :edn/wrong-content-type content))) + +(defn inline->edn + [text config] + (try + (if (string/blank? text) + {} + (-> text + (inline-parse-json config) + (gp-util/json->clj))) + (catch js/Error _e + []))) + +(defn link? + [format link] + (when (string? link) + (let [[type link] (first (inline->edn link (default-config format))) + [ref-type ref-value] (:url link)] + (and (= "Link" type) + (or + ;; 1. url + (not (contains? #{"Page_ref" "Block_ref"} ref-type)) + + (and (contains? #{"Page_ref"} ref-type) + (or + ;; 2. excalidraw link + (gp-config/draw? ref-value) + + ;; 3. local asset link + (boolean (gp-config/local-asset? ref-value))))))))) diff --git a/src/test/frontend/parser.cljs b/src/test/frontend/parser.cljs deleted file mode 100644 index f4df43ff33..0000000000 --- a/src/test/frontend/parser.cljs +++ /dev/null @@ -1,29 +0,0 @@ -(ns frontend.parser - (:require [cljs.test :refer [is deftest]] - [logseq.graph-parser.mldoc :as gp-mldoc] - [frontend.format.mldoc :as mldoc :refer [->edn]])) - -(def md-config (gp-mldoc/default-config :markdown)) - -(deftest src-test - (is (= - (first (->edn "``` -: hello -```" md-config)) - [["Src" - {:lines [": hello" "\n"], - :pos_meta {:start_pos 4, :end_pos 12}, - :full_content "```\n: hello\n```"}] - {:start_pos 0, :end_pos 15}]))) - -(deftest name-definition-test - (is (= - (first (->edn "term -: definition" md-config)) - [["List" - [{:content [["Paragraph" [["Plain" "definition"]]]], - :items [], - :name [["Plain" "term"]], - :indent 0, - :ordered false}]] - {:start_pos 0, :end_pos 17}]))) diff --git a/src/test/frontend/format/mldoc_test.cljs b/src/test/logseq/graph_parser/mldoc_test.cljs similarity index 70% rename from src/test/frontend/format/mldoc_test.cljs rename to src/test/logseq/graph_parser/mldoc_test.cljs index cadcb61373..693e6ced38 100644 --- a/src/test/frontend/format/mldoc_test.cljs +++ b/src/test/logseq/graph_parser/mldoc_test.cljs @@ -1,38 +1,38 @@ -(ns frontend.format.mldoc-test - (:require [frontend.format.mldoc :as mldoc] - [logseq.graph-parser.mldoc :as gp-mldoc] +(ns logseq.graph-parser.mldoc-test + (:require [logseq.graph-parser.mldoc :as gp-mldoc] ["fs" :as fs] ["child_process" :as child-process] [clojure.string :as string] [clojure.edn :as edn] + [frontend.format] [cljs.test :refer [testing deftest are is]])) (deftest test-link (testing "non-link" - (are [x y] (= (mldoc/link? :markdown x) y) + (are [x y] (= (gp-mldoc/link? :markdown x) y) "google.com" false)) (testing "plain links" - (are [x y] (= (mldoc/link? :markdown x) y) + (are [x y] (= (gp-mldoc/link? :markdown x) y) "http://www.google.com" true "http://google.com" true)) (testing "org links with labels" - (are [x y] (= (mldoc/link? :org x) y) + (are [x y] (= (gp-mldoc/link? :org x) y) "[[http://www.google.com][google]]" true "[[http://google.com][google]]" true "[[https://www.google.com][google]]" true "[[https://google.com][google]]" true)) (testing "org links without labels" - (are [x y] (= (mldoc/link? :org x) y) + (are [x y] (= (gp-mldoc/link? :org x) y) "[[http://www.google.com]]" true "[[https://www.google.com]]" true "[[draws/2022-03-06-15-00-28.excalidraw]]" true "[[assets/2022-03-06-15-00-28.pdf]]" true)) (testing "markdown links" - (are [x y] (= (mldoc/link? :markdown x) y) + (are [x y] (= (gp-mldoc/link? :markdown x) y) "[google](http://www.google.com)" true "[google](https://www.google.com)" true "[[draws/2022-03-06-15-00-28.excalidraw]]" true @@ -40,7 +40,7 @@ ;; https://github.com/logseq/logseq/issues/4308 (testing "parsing links should be finished" - (are [x y] (= (mldoc/link? :markdown x) y) + (are [x y] (= (gp-mldoc/link? :markdown x) y) "[YouTube](https://www.youtube.com/watch?v=-8ym7pyUs9gL) - [Vimeo](https://vimeo.com/677920303) {{youtube https://www.youtube.com/watch?v=-8ym7pyUs9g}}" true))) ;; TODO: Reuse with repo-test fns @@ -75,8 +75,8 @@ (let [format (if (string/ends-with? path ".org") :org :markdown)] [path - (mldoc/->edn content - (gp-mldoc/default-config format))]))) + (gp-mldoc/->edn content + (gp-mldoc/default-config format))]))) (into {}))] (is (= {"CommentBlock" 1, "Custom" 41, @@ -97,9 +97,35 @@ (->> asts-by-file (mapcat val) (map ffirst) frequencies)) "AST node type counts") + ; (println :DIFF) + ; (prn (butlast (clojure.data/diff (edn/read-string (slurp "mldoc-asts.edn")) + ; asts-by-file))) ;; This is just temporary (is (= (edn/read-string (slurp "mldoc-asts.edn")) asts-by-file) "Matches initial AST") #_(println "Wrote asts for" (count asts-by-file) "files") #_(fs/writeFileSync "mldoc-asts.edn" (pr-str asts-by-file)))) + +(def md-config (gp-mldoc/default-config :markdown)) + +(deftest src-test + (is (= [["Src" + {:lines [": hello" "\n"], + :pos_meta {:start_pos 4, :end_pos 12}, + :full_content "```\n: hello\n```"}] + {:start_pos 0, :end_pos 15}] + (first (gp-mldoc/->edn "``` +: hello +```" md-config))))) + +(deftest name-definition-test + (is (= [["List" + [{:content [["Paragraph" [["Plain" "definition"]]]], + :items [], + :name [["Plain" "term"]], + :indent 0, + :ordered false}]] + {:start_pos 0, :end_pos 17}] + (first (gp-mldoc/->edn "term +: definition" md-config)))))