Browse Source

feat: support both markdown headings and bullets

Tienson Qin 4 years ago
parent
commit
b34be68137

+ 12 - 9
src/main/frontend/components/block.cljs

@@ -1197,7 +1197,7 @@
 (declare block-content)
 
 (defn build-block-title
-  [{:keys [slide?] :as config} {:block/keys [uuid title tags marker priority anchor meta format content pre-block? dummy? block-refs-count page properties]
+  [{:keys [slide?] :as config} {:block/keys [uuid title tags marker priority anchor meta format content pre-block? dummy? block-refs-count page properties unordered level heading-level]
                                 :as t}]
   (let [config (assoc config :block t)
         slide? (boolean (:slide? config))
@@ -1211,10 +1211,14 @@
         marker-cp (marker-cp t)
         priority (priority-cp t)
         tags (block-tags-cp t)
-        contents? (= (:id config) "contents")
-        bg-color (:background-color properties)]
+        bg-color (:background-color properties)
+        elem (if (and (false? unordered)
+                      heading-level
+                      (<= heading-level 6))
+               (keyword (str "h" heading-level))
+               :div)]
     (->elem
-     :div
+     elem
      (merge
       {:id anchor}
       (when (and marker
@@ -1394,11 +1398,10 @@
   (util/stop event)
   (when (and (not (dnd-same-block? uuid))
              (not (:block/dummy? block)))
-    (let [from-dom-id (get-data-transfer-attr event "block-dom-id")]
-      (dnd/move-block @*dragging-block
-                      block
-                      false
-                      true)))
+    (dnd/move-block @*dragging-block
+                    block
+                    false
+                    true))
   (reset! *dragging? false)
   (reset! *dragging-block nil)
   (editor-handler/unhighlight-blocks!))

+ 13 - 8
src/main/frontend/format/block.cljs

@@ -397,7 +397,7 @@
     block))
 
 (defn extract-blocks
-  [blocks content with-id?]
+  [blocks content with-id? format]
   (let [encoded-content (utf8/encode content)
         last-pos (utf8/length encoded-content)
         pre-block-body (atom nil)
@@ -412,7 +412,8 @@
                children []]
           (if (seq blocks)
             (let [[block {:keys [start_pos end_pos]}] (first blocks)
-                  level (:level (second block))]
+                  unordered? (:unordered (second block))
+                  markdown-heading? (and (false? unordered?) (= :markdown format))]
               (cond
                 (paragraph-timestamp-block? block)
                 (let [timestamps (extract-timestamps block)
@@ -435,13 +436,12 @@
                       ref-pages-in-properties (->> (:page-refs properties)
                                                    (remove string/blank?))
                       block (second block)
+                      block (if markdown-heading?
+                              (assoc block :level 1 :heading-level (:level block))
+                              block)
                       level (:level block)
                       [children current-block-children]
                       (cond
-                        (>= level last-level)
-                        [(conj children [id level])
-                         #{}]
-
                         (< level last-level)
                         (let [current-block-children (set (->> (filter #(< level (second %)) children)
                                                                (map first)
@@ -449,7 +449,12 @@
                                                                       [:block/uuid id]))))
                               others (vec (remove #(< level (second %)) children))]
                           [(conj others [id level])
-                           current-block-children]))
+                           current-block-children])
+
+                        (>= level last-level)
+                        [(conj children [id level])
+                         #{}])
+
                       block (-> (assoc block
                                        :uuid id
                                        :body (vec (reverse block-body))
@@ -541,7 +546,7 @@
    (when-not (string/blank? content)
      (let [block (dissoc block :block/pre-block?)
            ast (format/to-edn content format nil)
-           new-block (first (extract-blocks ast content with-id?))
+           new-block (first (extract-blocks ast content with-id? format))
            parent-refs (->> (db/get-block-parent (state/get-current-repo) uuid)
                             :block/path-refs
                             (map :db/id))

+ 10 - 17
src/main/frontend/handler/editor.cljs

@@ -15,8 +15,6 @@
             [frontend.format :as format]
             [frontend.format.block :as block]
             [frontend.image :as image]
-            [cljs-time.core :as t]
-            [cljs-time.coerce :as tc]
             [frontend.db :as db]
             [goog.object :as gobj]
             [goog.dom :as gdom]
@@ -126,12 +124,6 @@
       (state/set-edit-content! edit-id new-value)
       (util/move-cursor-to input (+ cur-pos forward-pos)))))
 
-(defn focus-on-block!
-  [block-id]
-  (when block-id
-    (route-handler/redirect! {:to :page
-                              :path-params {:name (str block-id)}})))
-
 (defn open-block-in-sidebar!
   [block-id]
   (when block-id
@@ -288,9 +280,11 @@
   (let [ast (mldoc/->edn (string/trim content) (mldoc/default-config format))
         first-elem-type (first (ffirst ast))
         properties? (= "Properties" first-elem-type)
+        markdown-heading? (and (= format :markdown)
+                               (= "Heading" first-elem-type))
         heading? (= "Paragraph" first-elem-type)
         content (string/triml content)
-        content' (if properties?
+        content' (if (or properties? markdown-heading?)
                    content
                    (str (config/get-block-pattern format) (if heading? " " "\n") content))
         block (block/parse-block (assoc block :block/content content'))
@@ -1655,9 +1649,10 @@
 
 (defn close-autocomplete-if-outside
   [input]
-  (when (or (state/get-editor-show-page-search?)
-            (state/get-editor-show-page-search-hashtag?)
-            (state/get-editor-show-block-search?))
+  (when (and input
+             (or (state/get-editor-show-page-search?)
+                 (state/get-editor-show-page-search-hashtag?)
+                 (state/get-editor-show-block-search?)))
     (when-let [q (get-search-q)]
       (let [value (gobj/get input "value")
             pos (:editor/last-saved-cursor @state/state)
@@ -2188,11 +2183,6 @@
           (state/set-last-pos! (:pos (util/get-caret-pos input)))
           (reset! commands/*slash-caret-pos (util/get-caret-pos input)))
 
-        (and
-         (= key " ")
-         (state/get-editor-show-page-search-hashtag?))
-        (state/set-editor-show-page-search-hashtag! false)
-
         (and
          (contains? (set/difference (set (keys reversed-autopair-map))
                                     #{"`"})
@@ -2248,6 +2238,9 @@
     (let [k (gobj/get e "key")
           format (:format (get-state))]
       (when-not (state/get-editor-show-input)
+        (when (= k " ")
+          (state/set-editor-show-page-search-hashtag! false))
+
         (when (and @*show-commands (not= key-code 191)) ; not /
           (let [matched-commands (get-matched-commands input)]
             (if (seq matched-commands)

+ 2 - 7
src/main/frontend/handler/editor/lifecycle.cljs

@@ -1,21 +1,17 @@
 (ns frontend.handler.editor.lifecycle
   (:require [frontend.state :as state]
-            [lambdaisland.glogi :as log]
             [goog.dom :as gdom]
             [goog.object :as gobj]
             [clojure.string :as string]
-            [frontend.util :as util :refer-macros [profile]]
             [cljs-drag-n-drop.core :as dnd]
             [frontend.handler.editor.keyboards :as keyboards-handler]
             [frontend.handler.page :as page-handler]
-            [frontend.handler.repo :as repo-handler]
             [frontend.handler.editor :as editor-handler :refer [get-state]]
             [frontend.handler.notification :as notification]
             [frontend.db :as db]
             [frontend.date :as date]
             [frontend.handler.file :as file]
-            [promesa.core :as p]
-            [frontend.debug :as debug]))
+            [promesa.core :as p]))
 
 (defn did-mount!
   [state]
@@ -70,8 +66,7 @@
         (when (and
                (not (string/blank? value))
                (not= (string/trim value) (string/trim content)))
-          (let [old-page-name (db/get-file-page path false)
-                journal? (date/valid-journal-title? path)]
+          (let [old-page-name (db/get-file-page path false)]
             (p/let [[journal? new-name] (page-handler/rename-when-alter-title-property! old-page-name path format content value)]
               (if (and journal? new-name (not= old-page-name (string/lower-case new-name)))
                 (notification/show! "Journal title can't be changed." :warning)

+ 1 - 1
src/main/frontend/handler/extract.cljs

@@ -59,7 +59,7 @@
     (let [now (tc/to-long (t/now))
           page (db/get-page-name file ast)
           [page page-name journal-day] (block/convert-page-if-journal page)
-          blocks (->> (block/extract-blocks ast content false)
+          blocks (->> (block/extract-blocks ast content false format)
                       (block/with-parent-and-left [:block/name (string/lower-case page)]))
           ref-pages (atom #{})
           ref-tags (atom #{})

+ 1 - 3
src/main/frontend/handler/repo.cljs

@@ -24,9 +24,7 @@
             [clojure.string :as string]
             [frontend.dicts :as dicts]
             [frontend.spec :as spec]
-            [frontend.encrypt :as encrypt]
-            [goog.dom :as gdom]
-            [goog.object :as gobj]))
+            [frontend.encrypt :as encrypt]))
 
 ;; Project settings should be checked in two situations:
 ;; 1. User changes the config.edn directly in logseq.com (fn: alter-file)

+ 3 - 1
src/main/frontend/modules/file/core.cljs

@@ -23,7 +23,9 @@
 (defn transform-content
   [{:block/keys [format pre-block? content unordered]} level]
   (let [content (or content "")]
-    (if pre-block?
+    (if (or pre-block?
+            (and (= format :markdown)
+                 (re-find #"#+\s+" content)))
       (string/trim content)
       (let [[prefix spaces-tabs]
             (cond