Преглед изворни кода

Merge remote-tracking branch 'upstream/master' into whiteboards

Peng Xiao пре 3 година
родитељ
комит
45272ef52b

+ 3 - 1
deps/graph-parser/src/logseq/graph_parser/property.cljs

@@ -33,7 +33,9 @@
 (defn editable-built-in-properties
   "Properties used by logseq that user can edit"
   []
-  (into #{:title :icon :template :template-including-parent :public :filters :exclude-from-graph-view}
+  (into #{:title :icon :template :template-including-parent :public :filters :exclude-from-graph-view
+          ;; org-mode only
+          :macro :filetags}
         editable-linkable-built-in-properties))
 
 (defn hidden-built-in-properties

+ 23 - 1
deps/graph-parser/test/logseq/graph_parser/mldoc_test.cljs

@@ -67,7 +67,7 @@
 " md-config {})))
       "Src example with leading whitespace"))
 
-(deftest properties-test
+(deftest md-properties-test
   (are [x y] (= [["Properties" y] nil]
                 (first (gp-mldoc/->edn x md-config {})))
 
@@ -98,6 +98,28 @@
          (first (gp-mldoc/->edn "term
 : definition" md-config {})))))
 
+(defn- parse-properties
+  [text]
+  (->> (gp-mldoc/->edn text (gp-mldoc/default-config :org) {})
+       (filter #(= "Properties" (ffirst %)))
+       ffirst
+       second))
+
+(deftest org-properties-test
+  []
+  (testing "just title"
+    (let [content "#+TITLE:   some title   "
+          props (parse-properties content)]
+      (is (= "some title   " (:title props)))))
+
+  (testing "filetags"
+    (let [content "#+FILETAGS:   :tag1:tag2:@tag:
+#+TAGS: tag3
+body"
+          props (parse-properties content)]
+      (is ["@tag" "tag1" "tag2"] (sort (:filetags props)))
+      (is ["@tag" "tag1" "tag2" "tag3"] (sort (:tags props))))))
+
 (deftest ^:integration test->edn
   (let [graph-dir "test/docs"
         _ (docs-graph-helper/clone-docs-repo-if-not-exists graph-dir)

+ 48 - 1
src/main/frontend/db/model.cljs

@@ -18,6 +18,7 @@
             [logseq.db.rules :refer [rules]]
             [logseq.db.schema :as db-schema]
             [logseq.graph-parser.config :as gp-config]
+            [logseq.graph-parser.text :as text]
             [logseq.graph-parser.util :as gp-util]))
 
 ;; lazy loading
@@ -1095,6 +1096,51 @@
       (util/safe-page-name-sanity-lc page))
      (distinct))))
 
+(def ns-char "/")
+(def ns-re #"/")
+
+(defn- get-parents-namespace-list
+  "Return list of parents namespace"
+  [page-namespace & nested-found]
+  (if (text/namespace-page? page-namespace)
+    (let [pre-nested-vec (drop-last (string/split page-namespace ns-re))
+          my-nested-found (if (nil? nested-found)
+                            []
+                            nested-found)]
+      (if (= (count pre-nested-vec) 1)
+        (conj my-nested-found (nth pre-nested-vec 0))
+        (let [pre-nested-str (string/join ns-char pre-nested-vec)]
+          (recur pre-nested-str (conj my-nested-found pre-nested-str)))))
+    []))
+
+(defn- get-unnecessary-namespaces-name
+  "Return unnecessary namespace from a list of page's name"
+  [pages-list]
+  (->> pages-list
+       (remove nil?)
+       (mapcat get-parents-namespace-list)
+       distinct))
+
+(defn- remove-nested-namespaces-link
+  "Remove relations between pages and their nested namespace"
+  [pages-relations]
+  (let [pages-relations-to-return (distinct (mapcat
+                                             identity
+                                             (for [item (for [a-link-from (mapv (fn [a-rel] (first a-rel)) pages-relations)]
+                                                          [a-link-from (mapv
+                                                                        (fn [a-rel] (second a-rel))
+                                                                        (filterv
+                                                                         (fn [link-target] (=  a-link-from (first link-target)))
+                                                                         pages-relations))])
+                                                   :let [list-to (get item 1)
+                                                         page (get item 0)
+                                                         namespaces-to-remove (get-unnecessary-namespaces-name list-to)
+                                                         list-to-without-nested-ns (filterv (fn [elem] (not (some #{elem} namespaces-to-remove))) list-to)
+                                                         node-links (for [item-ok list-to-without-nested-ns]
+                                                                      [page item-ok])]]
+                                               (seq node-links))))]
+    pages-relations-to-return))
+
 ;; Ignore files with empty blocks for now
 (defn get-pages-relation
   [repo with-journal?]
@@ -1116,7 +1162,8 @@
       (->>
        (d/q q db)
        (map (fn [[page ref-page-name]]
-              [page ref-page-name]))))))
+              [page ref-page-name]))
+       (remove-nested-namespaces-link)))))
 
 ;; get pages who mentioned this page
 ;; TODO: use :block/_refs

+ 10 - 2
src/main/frontend/extensions/pdf/utils.cljs

@@ -161,11 +161,12 @@
   [text]
 
   (when-not (string/blank? text)
-    (let [sp "@#~#@"]
+    (let [sp "|#|"]
       (-> text
           (string/replace #"[\r\n]+" sp)
           (string/replace (str "-" sp) "")
-          (string/replace sp " ")))))
+          (string/replace #"\|#\|([a-zA-Z_])" " $1")
+          (string/replace sp "")))))
 
 ;; TODO: which viewer instance?
 (defn next-page
@@ -179,3 +180,10 @@
   (try
     (js-invoke js/window.lsPdfViewer "previousPage")
     (catch js/Error _e nil)))
+
+(comment
+ (fix-selection-text-breakline "this is a\ntest paragraph")
+ (fix-selection-text-breakline "he is 1\n8 years old")
+ (fix-selection-text-breakline "这是一个\n\n段落")
+ (fix-selection-text-breakline "これ\n\nは、段落")
+ (fix-selection-text-breakline "this is a te-\nst paragraph"))

+ 28 - 0
src/test/frontend/db/model_test.cljs

@@ -111,4 +111,32 @@
          (map first (model/get-pages-that-mentioned-page test-helper/test-db "generic page" false)))
       "Must be empty"))
 
+(deftest remove-links-for-each-level-of-the-namespaces
+  (load-test-files [{:file/path "pages/generic page.md"
+                     :file/content "tags:: [[one/two/tree]], one/two
+- link to ns [[one]]
+- link to page one [[page ONE]]"}])
+
+  (is (= '("one/two/tree" "page one")
+         (map second (model/get-pages-relation test-helper/test-db true)))
+      "(get-pages-relation) Must be only ns one/two/tree")
+
+  (is (= '("one/two/tree" "page one")
+         (map second (#'model/remove-nested-namespaces-link [["generic page" "one/two/tree"]
+                                                           ["generic page" "one/two"]
+                                                           ["generic page" "one"]
+                                                           ["generic page" "page one"]])))
+      "(model/remove-nested-namespaces-link) Must be only ns one/two/tree")
+
+  (is (= '("one/two/tree" "one/two" "one")
+         (#'model/get-parents-namespace-list "one/two/tree/four"))
+      "Must be one/two/tree one/two one")
+
+  (is (= '("one/two" "one")
+         (#'model/get-unnecessary-namespaces-name '("one/two/tree" "one" "one/two" "non nested tag" "non nested link")))
+      "Must be  one/two one"))
+
+
+
+
 #_(cljs.test/test-ns 'frontend.db.model-test)