fix: page-add-property!

pull/1735/head
Tienson Qin 2021-05-03 22:37:26 +08:00
parent df87d047dc
commit b19b373b63
8 changed files with 113 additions and 141 deletions

View File

@ -1253,26 +1253,6 @@
(d/remove-class! element "dnd-separator-cur")
(d/add-class! element "dnd-separator"))))
(defn- pre-block-cp
[config content format]
(rum/with-context [[t] i18n/*tongue-context*]
(let [ast (mldoc/->edn content (mldoc/default-config format))
ast (map first ast)
slide? (:slide? config)
only-title? (and (= 1 (count ast))
(= "Property_Drawer" (ffirst ast))
(let [m (second (first ast))]
(every? #(contains? #{:title :filters} %) (keys m))))
block-cp [:div {:class (if only-title?
(util/hiccup->class "pre-block.opacity-50")
(util/hiccup->class "pre-block.p-2"))}
(if only-title?
[:span (t :page/edit-properties-placeholder)]
(markup-elements-cp (assoc config :block/format format) ast))]]
(if slide?
[:div [:h1 (:page-name config)]]
block-cp))))
(rum/defc span-comma
[]
[:span ", "])
@ -1451,10 +1431,7 @@
(not (:slide? config)))
(properties-cp config block))
(when pre-block?
(pre-block-cp config content format))
(when (and (not pre-block?) (seq body))
(when (seq body)
(do
[:div.block-body {:style {:display (if (and collapsed? (seq title)) "none" "")}}
;; TODO: consistent id instead of the idx (since it could be changed later)

View File

@ -34,7 +34,7 @@
entity pull pull-many transact! get-key-value]
[frontend.db.model
add-properties! block-and-children-transform blocks-count blocks-count-cache clean-export! cloned? delete-blocks get-pre-block
block-and-children-transform blocks-count blocks-count-cache clean-export! cloned? delete-blocks get-pre-block
delete-file! delete-file-blocks! delete-file-pages! delete-file-tx delete-files delete-pages-by-files
filter-only-public-pages-and-blocks get-all-block-contents get-all-tagged-pages
get-all-templates get-block-and-children get-block-by-uuid get-block-children sort-by-left

View File

@ -400,46 +400,6 @@
(when-let [page (db-utils/entity [:block/name page])]
(:block/properties page)))
(defn add-properties!
[page-format properties-content properties]
(let [properties (medley/map-keys name properties)
lines (string/split-lines properties-content)
front-matter-format? (contains? #{:markdown} page-format)
lines (if front-matter-format?
(remove (fn [line]
(contains? #{"---" ""} (string/trim line))) lines)
lines)
property-keys (keys properties)
prefix-f (case page-format
:org (fn [k]
(str "#+" (string/upper-case k) ": "))
:markdown (fn [k]
(str (string/lower-case k) ": "))
identity)
exists? (atom #{})
lines (doall
(mapv (fn [line]
(let [result (filter #(and % (util/starts-with? line (prefix-f %)))
property-keys)]
(if (seq result)
(let [k (first result)]
(swap! exists? conj k)
(str (prefix-f k) (get properties k)))
line))) lines))
lines (concat
lines
(let [not-exists (remove
(fn [[k _]]
(contains? @exists? k))
properties)]
(when (seq not-exists)
(mapv
(fn [[k v]] (str (prefix-f k) v))
not-exists))))]
(util/format
(config/properties-wrapper-pattern page-format)
(string/join "\n" lines))))
(defn get-page-blocks
([page]
(get-page-blocks (state/get-current-repo) page nil))

View File

@ -178,7 +178,8 @@
(remove string/blank?))
properties (->> properties
(medley/map-kv (fn [k v]
(let [v (string/trim v)
(let [k (name k)
v (string/trim v)
k (string/replace k " " "-")
k (string/replace k "_" "-")
k (string/lower-case k)

View File

@ -279,7 +279,7 @@
[{:block/keys [content format parent page] :as block}]
(let [ast (mldoc/->edn (string/trim content) (mldoc/default-config format))
first-elem-type (first (ffirst ast))
properties? (= "Property_Drawer" first-elem-type)
properties? (contains? #{"Property_Drawer" "Properties"} first-elem-type)
top-level? (= parent page)
markdown-heading? (and (= format :markdown)
(= "Heading" first-elem-type))

View File

@ -18,7 +18,6 @@
[lambdaisland.glogi :as log]
[clojure.core.async :as async]
[cljs.core.async.interop :refer-macros [<p!]]
[goog.object :as gobj]
[cljs-time.core :as t]
[cljs-time.coerce :as tc]
[frontend.utf8 :as utf8]

View File

@ -15,6 +15,7 @@
[frontend.handler.config :as config-handler]
[frontend.handler.ui :as ui-handler]
[frontend.modules.outliner.file :as outliner-file]
[frontend.modules.outliner.core :as outliner-core]
[frontend.commands :as commands]
[frontend.date :as date]
[clojure.walk :as walk]
@ -55,67 +56,49 @@
(route-handler/redirect! {:to :page
:path-params {:name page}})))))
(defn page-add-properties!
[page-name properties]
(let [page (db/entity [:block/name page-name])
page-title (:or (:block/original-name page) (:block/name page))
file (:block/file page)]
(if file
(let [page-format (db/get-page-format page-name)
properties-content (db/get-page-properties-content page-name)
properties-content (if properties-content
(string/trim properties-content)
(config/properties-wrapper page-format))
file (db/entity (:db/id (:block/file page)))
file-path (:file/path file)
file-content (db/get-file file-path)
after-content (if (string/blank? properties-content)
file-content
(subs file-content (inc (count properties-content))))
properties-content (if properties-content
(string/trim properties-content)
(config/properties-wrapper page-format))
new-properties-content (db/add-properties! page-format properties-content properties)
full-content (str new-properties-content "\n\n" (string/trim after-content))]
(file-handler/alter-file (state/get-current-repo)
file-path
full-content
{:reset? true
:re-render-root? true}))
(p/let [_ (create! page-name)]
(page-add-properties! page-name properties)))))
(defn- remove-property-from-frontmatter-or-directives!
[content format k]
(let [k (name k)
lines (string/split-lines content)
prefix (case format
:org (str "#+" (string/upper-case k) ": ")
:markdown (str (string/lower-case k) ": ")
"")
lines (remove #(util/starts-with? % prefix) lines)]
(string/join "\n" lines)))
(defn page-remove-property!
[page-name k]
(when-let [page (db/entity [:block/name (string/lower-case page-name)])]
(defn page-add-property!
[page-name key value]
(when-let [page (db/pull [:block/name (string/lower-case page-name)])]
(let [repo (state/get-current-repo)
k (keyword k)
key (keyword key)
pre-block (db/get-pre-block repo (:db/id page))
pre-block-tx (when pre-block
(let [{:block/keys [properties format content]} pre-block]
[{:db/id (:db/id pre-block)
:block/properties (dissoc properties k)
:block/content (-> (text/remove-property! format k content)
(remove-property-from-frontmatter-or-directives! format k))}]))
page-block-tx [{:db/id (:db/id page)
:block/properties (dissoc (:block/properties page) k)}]
txs (->> (concat pre-block-tx page-block-tx)
(remove nil?))]
(db/transact! txs)
(outliner-file/sync-to-file {:db/id (:db/id page)})
(db/refresh! repo {:key :block/change
:data [pre-block]}))))
format (state/get-preferred-format)
page-id {:db/id (:db/id page)}
org? (= format :org)]
(if pre-block
(let [properties (:block/properties pre-block)
new-properties (assoc properties key value)
content (:block/content pre-block)
front-matter? (text/front-matter? content)
new-content (text/insert-property! format content key value front-matter?)
block {:db/id (:db/id pre-block)
:block/properties new-properties
:block/content new-content
:block/page page}
tx [(assoc page-id :block/properties new-properties)
block]]
(db/transact! tx)
(db/refresh! repo {:key :block/change
:data [block]}))
(let [block {:block/uuid (db/new-block-id)
:block/left page-id
:block/parent page-id
:block/page page-id
:block/title []
:block/content (if org?
(str "#+" (string/upper-case (name key)) ": " value)
(str (name key) ":: " value))
:block/format format
:block/properties {key value}
:block/file (:block/file page)
:block/pre-block? true}]
(outliner-core/insert-node (outliner-core/block block)
(outliner-core/block page)
false)
(db/transact! [(assoc page-id :block/properties {key value})])
(db/refresh! repo {:key :block/change
:data [block]})))
(outliner-file/sync-to-file page-id))))
(defn get-plugins
[blocks]
@ -312,7 +295,7 @@
(defn update-public-attribute!
[page-name value]
(page-add-properties! page-name {:public value}))
(page-add-property! page-name :public value))
(defn get-page-ref-text
[page]
@ -372,9 +355,7 @@
(defn save-filter!
[page-name filter-state]
(if (empty? filter-state)
(page-remove-property! page-name "filters")
(page-add-properties! page-name {"filters" filter-state})))
(page-add-property! page-name :filters filter-state))
(defn get-filter
[page-name]

View File

@ -2,7 +2,8 @@
(:require [frontend.config :as config]
[frontend.util :as util]
[clojure.string :as string]
[clojure.set :as set]))
[clojure.set :as set]
[medley.core :as medley]))
(defonce properties-start ":PROPERTIES:")
(defonce properties-end ":END:")
@ -158,6 +159,10 @@
[line]
(some? (first (util/split-first ":: " line))))
(defn front-matter-property?
[line]
(some? (first (util/split-first ": " line))))
(defn remove-properties!
[format content]
(let [org? (= format :org)]
@ -200,9 +205,16 @@
(string/join "\n"))]
(util/format full-format properties-content))))
;; FIXME:
(defn front-matter?
[s]
(string/starts-with? s "---\n"))
(defn insert-property!
[format content key value]
(when (and (not (string/blank? (name key)))
([format content key value]
(insert-property! format content key value false))
([format content key value front-matter?]
(when (and (not (string/blank? (name key)))
(not (string/blank? (str value))))
(let [org? (= :org format)
key (string/lower-case (name key))
@ -236,20 +248,22 @@
(not org?)
(let [exists? (atom false)
new-property-s (str key ":: " value)
groups (partition-by simplified-property? lines)
sym (if front-matter? ": " ":: ")
new-property-s (str key sym value)
property-f (if front-matter? front-matter-property? simplified-property?)
groups (partition-by property-f lines)
no-properties? (and (= 1 (count groups))
(not (simplified-property? (ffirst groups))))
(not (property-f (ffirst groups))))
lines (mapcat (fn [lines]
(if (simplified-property? (first lines))
(if (property-f (first lines))
(let [lines (doall
(mapv (fn [text]
(let [[k v] (util/split-first ":: " text)]
(let [[k v] (util/split-first sym text)]
(if (and k v)
(let [key-exists? (= k key)
_ (when key-exists? (reset! exists? true))
v (if key-exists? value v)]
(str k ":: " (string/trim v)))
(str k sym (string/trim v)))
text)))
lines))
lines (if @exists? lines (conj lines new-property-s))]
@ -264,7 +278,7 @@
(string/join "\n" lines))
:else
content))))
content)))))
(defn remove-property!
([format key content]
@ -308,6 +322,46 @@
content))
content))
(defn add-page-properties!
[page-format properties-content properties]
(let [properties (medley/map-keys name properties)
lines (string/split-lines properties-content)
front-matter-format? (contains? #{:markdown} page-format)
lines (if front-matter-format?
(remove (fn [line]
(contains? #{"---" ""} (string/trim line))) lines)
lines)
property-keys (keys properties)
prefix-f (case page-format
:org (fn [k]
(str "#+" (string/upper-case k) ": "))
:markdown (fn [k]
(str (string/lower-case k) ": "))
identity)
exists? (atom #{})
lines (doall
(mapv (fn [line]
(let [result (filter #(and % (util/starts-with? line (prefix-f %)))
property-keys)]
(if (seq result)
(let [k (first result)]
(swap! exists? conj k)
(str (prefix-f k) (get properties k)))
line))) lines))
lines (concat
lines
(let [not-exists (remove
(fn [[k _]]
(contains? @exists? k))
properties)]
(when (seq not-exists)
(mapv
(fn [[k v]] (str (prefix-f k) v))
not-exists))))]
(util/format
(config/properties-wrapper-pattern page-format)
(string/join "\n" lines))))
(defn build-data-value
[col]
(let [items (map (fn [item] (str "\"" item "\"")) col)]