mirror of https://github.com/logseq/logseq
fix: page-add-property!
parent
df87d047dc
commit
b19b373b63
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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]
|
||||
|
|
|
@ -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]
|
||||
|
|
|
@ -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)]
|
||||
|
|
Loading…
Reference in New Issue