Wrap up carving

pull/4023/head
Gabriel Horner 2022-01-27 14:13:42 -05:00
parent 86868f1e15
commit 1c8586e2ac
12 changed files with 11 additions and 425 deletions

View File

@ -86,61 +86,23 @@ frontend.modules.outliner.datascript/transact!
frontend.page/route-view
;; placeholder fn
frontend.publishing/stop
frontend.state/get-changed-files
frontend.state/online?
frontend.state/reset-published-pages
;; comment?
frontend.state/set-db-persisted!
frontend.state/persist-transaction!
frontend.state/get-repo-latest-txs
frontend.state/get-editor-cp
frontend.state/get-favorites-name
;; repl fn
frontend.state/remove-watch-state
;; Future use?
frontend.state/get-visual-viewport-state
frontend.storage/get-json
frontend.storage/set-json
frontend.text/remove-lines-level-spaces
frontend.tools.html-export/export-page
;; Future use?
frontend.ui/reset-ios-whole-page-offset!
frontend.ui/badge
frontend.ui/get-doc-scroll-top
frontend.ui/modal-show?
frontend.ui.date-picker/date-format
frontend.ui.date-picker/iso8601->date
frontend.utf8/delete!
frontend.util/indexed
frontend.util/dissoc-in
frontend.util/remove-nils-or-empty
frontend.util/index-by
frontend.util/patch
frontend.util/minimize-html
frontend.util/speed
frontend.util/moving-frequency
frontend.util/lock-global-scroll
frontend.util/scroll-to-element-v2
frontend.util/scroll-to-bottom
frontend.util/drop-first-line
frontend.util/safe-split-first
frontend.util/trim-only-newlines
frontend.util/join-newline
frontend.util/replace-first-ignore-case
frontend.util/node-in-viewpoint?
frontend.util/input-selected?
frontend.util/extract-uuid
frontend.util/file-page?
;; For debugging
frontend.util/d
frontend.util/get-prev-block-with-same-level
frontend.util/get-next-block-with-same-level
frontend.util/sort-by-value
frontend.util/encode-str
frontend.util/->system-modifier
;; Future use?
frontend.util/safe-search-normalize
frontend.util/get-element-width
;; For debugging
frontend.util/trace!
frontend.util/unquote-string-if-wrapped
frontend.util.cursor/end-of-line?
frontend.util.cursor/move-cursor-to-beginning
frontend.util.pool/terminate-parser-pool!
frontend.util.property/goto-properties-beginning
;; Repl fn
frontend.util.pool/terminate-pool!
;; Repl fn
frontend.util.property/add-page-properties
;; Used by shadow
frontend.worker.parser/init

View File

@ -1230,10 +1230,6 @@
[repo changed-files]
(set-state! [:repo/changed-files repo] changed-files))
(defn get-changed-files
[]
(get-in @state [:repo/changed-files (get-current-repo)]))
(defn get-wide-mode?
[]
(:ui/wide-mode? @state))
@ -1246,10 +1242,6 @@
[value]
(set-state! :network/online? value))
(defn online?
[]
(:network/online? @state))
(defn get-commands
[]
(:commands (get-config)))
@ -1309,15 +1301,6 @@
;; THINK: new block, indent/outdent, drag && drop, etc.
(set-editor-last-input-time! repo time))
(defn set-published-pages
[pages]
(when-let [repo (get-current-repo)]
(set-state! [:me :published-pages repo] pages)))
(defn reset-published-pages
[]
(set-published-pages []))
(defn set-db-persisted!
[repo value]
(swap! state assoc-in [:db/persisted? repo] value))
@ -1343,30 +1326,6 @@
[_repo files? id]
(swap! state assoc-in [:db/last-persist-transact-ids :repo files?] id))
(defn get-last-persist-transact-id
[_repo files?]
(get-in @state [:db/last-persist-transact-ids :repo files?]))
(defn persist-transaction!
[repo files? tx-id tx-data]
(when (seq tx-data)
(let [latest-txs (:db/latest-txs @state)
last-persist-tx-id (get-last-persist-transact-id repo files?)
latest-txs (if last-persist-tx-id
(update-in latest-txs [repo files?]
(fn [result]
(remove (fn [tx] (<= (:tx-id tx) last-persist-tx-id)) result)))
latest-txs)
new-txs (update-in latest-txs [repo files?] (fn [result]
(vec (conj result {:tx-id tx-id
:tx-data tx-data}))))]
(storage/set-transit! :db/latest-txs new-txs)
(set-state! :db/latest-txs new-txs))))
(defn get-repo-latest-txs
[repo file?]
(get-in (:db/latest-txs @state) [repo file?]))
(defn set-nfs-refreshing!
[value]
(set-state! :nfs/refreshing? value))
@ -1542,10 +1501,6 @@
[value]
(set-state! [:view/components :editor] value))
(defn get-editor-cp
[]
(get-in @state [:view/components :editor]))
(defn exit-editing-and-set-selected-blocks!
([blocks]
(exit-editing-and-set-selected-blocks! blocks :down))
@ -1556,10 +1511,6 @@
(set-selection-blocks! blocks direction)
(util/select-highlight! blocks)))
(defn get-favorites-name
[]
(or (:name/favorites (get-config)) "Favorites"))
(defn add-watch-state [key f]
(add-watch state key f))

View File

@ -20,22 +20,6 @@
(when-not util/node-test?
(dt/read-transit-str ^js (.getItem js/localStorage (name key)))))
(defn set-transit!
[key value]
(when-not util/node-test?
(.setItem ^js js/localStorage (name key) (dt/write-transit-str value))))
(defn get-json
[key]
(when-not util/node-test?
(when-let [value (.getItem js/localStorage (name key))]
(js/JSON.parse value))))
(defn set-json
[key value]
(when-not util/node-test?
(.setItem ^js js/localStorage (name key) (js/JSON.stringify value))))
(defn remove
[key]
(when-not util/node-test?

View File

@ -221,12 +221,6 @@
:else
(remove-level-space-aux! text (config/get-block-pattern format) space? trim-left?)))))
(defn remove-lines-level-spaces
[text format]
(->> (string/split-lines text)
(map #(remove-level-spaces (string/triml %) format true false))
(string/join "\n")))
(defn build-data-value
[col]
(let [items (map (fn [item] (str "\"" item "\"")) col)]

View File

@ -1,49 +0,0 @@
(ns frontend.tools.html-export
(:require-macros [hiccups.core :as hiccups :refer [html]])
(:require [clojure.set :as set]
[clojure.walk :as walk]
[frontend.components.block :as block]
[frontend.db :as db]
[medley.core :as medley]
[frontend.format.block :as format-block]))
;; Consider generate a db index so that search can still works
;; Or maybe TiddlyWiki
;; It could be better that we can reuse some parts of this module in a nodejs tool,
;; so users don't have to use the web for exporting to htmls or publishing.
(defn- build-block
[config block]
(let [block (format-block/parse-title-and-body block)
body (:block/body block)
block (block/build-block-title config block)]
[:div.block
block
(when (seq body)
(for [child body]
(block/markup-element-cp config child)))]))
(defn export-page
[page-name blocks show-notification!]
(let [{:keys [slide]} (db/get-page-properties page-name)
slide? slide
blocks (if (:block/pre-block? (first blocks))
(rest blocks)
blocks)]
(if (seq blocks)
(let [config {:html-export? true :slide? slide?}
hiccup [:div.page
(for [block blocks]
(build-block config block))]
remove-attrs #{:on-click :on-change}
hiccup (walk/postwalk (fn [f]
(if (and (map? f)
(seq (set/intersection remove-attrs (set (keys f)))))
(medley/remove-keys remove-attrs f)
f))
hiccup)]
(html hiccup))
(show-notification! "The published content can't be empty." :error))))

View File

@ -249,16 +249,6 @@
[:input.form-checkbox.h-4.w-4.transition.duration-150.ease-in-out
(merge {:type "checkbox"} option)])
(defn badge
[text option]
[:span.inline-flex.items-center.px-2.5.py-0.5.rounded-full.text-xs.font-medium.leading-4.bg-purple-100.text-purple-800
option
text])
;; scroll
(defn get-doc-scroll-top []
(.-scrollTop js/document.documentElement))
(defn main-node
[]
(gdom/getElement "main-content-container"))
@ -493,7 +483,6 @@
binding (or custom-binding default-binding)]
(shortcut-helper/decorate-binding binding)))
(defonce modal-show? (atom false))
(rum/defc modal-overlay
[state close-fn]
[:div.ui__modal-overlay

View File

@ -1,6 +1,6 @@
(ns frontend.ui.date-picker
(:require [cljs-time.core :refer [after? before? day day-of-week days first-day-of-the-month minus month months plus year]]
[cljs-time.format :refer [formatter formatters parse unparse]]
[cljs-time.format :refer [formatter unparse]]
[frontend.modules.shortcut.core :as shortcut]
[frontend.state :as state]
[frontend.util :as util :refer [deref-or-value now->utc]]
@ -18,12 +18,6 @@
(def ^:const week-format (formatter "ww"))
(def ^:const date-format (formatter "yyyy MMM dd"))
(defn iso8601->date [iso8601]
(when (seq iso8601)
(parse (formatters :basic-date) iso8601)))
(defn- month-label [date] (unparse month-format date))
(defn- dec-month [date] (minus date (months 1)))

View File

@ -26,17 +26,3 @@
(defn length
[arr]
(gobj/get arr "length"))
;; start-pos inclusive
;; end-pos exclusive
(defn insert!
[s start-pos end-pos content]
(let [arr (encode s)
end-pos (or end-pos (length arr))]
(str (substring arr 0 start-pos)
content
(substring arr end-pos))))
(defn delete!
[s start-pos end-pos]
(insert! s start-pos end-pos ""))

View File

@ -142,28 +142,10 @@
(p/do!
(.setStyle StatusBar (clj->js {:style (.-Dark Style)})))))
(defn indexed
[coll]
(map-indexed vector coll))
(defn find-first
[pred coll]
(first (filter pred coll)))
(defn dissoc-in
"Dissociates an entry from a nested associative structure returning a new
nested structure. keys is a sequence of keys. Any empty maps that result
will not be present in the new structure."
[m [k & ks]]
(if ks
(if-let [nextmap (get m k)]
(let [newmap (dissoc-in nextmap ks)]
(if (seq newmap)
(assoc m k newmap)
(dissoc m k)))
m)
(dissoc m k)))
;; (defn format
;; [fmt & args]
;; (apply gstring/format fmt args))
@ -194,24 +176,6 @@
[nm]
(into {} (remove (comp nil? second)) nm))
(defn remove-nils-or-empty
[nm]
(walk/postwalk
(fn [el]
(if (map? el)
(not-empty (into {} (remove (comp #(or
(nil? %)
(and (coll? %)
(empty? %))) second)) el))
el))
nm))
(defn index-by
[col k]
(->> (map (fn [entry] [(get entry k) entry])
col)
(into {})))
(defn ext-of-image? [s]
(some #(string/ends-with? s %)
[".png" ".jpg" ".jpeg" ".bmp" ".gif" ".webp" ".svg"]))
@ -276,15 +240,6 @@
on-ok
on-failed)))
#?(:cljs
(defn patch
[url body on-ok on-failed]
(fetch url {:method "patch"
:headers {:Content-Type "application/json"}
:body (js/JSON.stringify (clj->js body))}
on-ok
on-failed)))
#?(:cljs
(defn delete
[url on-ok on-failed]
@ -419,13 +374,6 @@
last-newline-pos (or (string/last-index-of value \newline (dec pos)) -1)]
(- pos last-newline-pos 1)))
(defn minimize-html
[s]
(->> s
(string/split-lines)
(map string/trim)
(string/join "")))
#?(:cljs
(defn stop [e]
(when e (doto e (.preventDefault) (.stopPropagation)))))
@ -435,20 +383,10 @@
(when e (.stopPropagation e))))
(def speed 500)
(def moving-frequency 15)
#?(:cljs
(defn cur-doc-top []
(.. js/document -documentElement -scrollTop)))
#?(:cljs
(defn lock-global-scroll
([] (lock-global-scroll true))
([v] (js-invoke (.-classList (app-scroll-container-node))
(if v "add" "remove")
"locked-scroll"))))
#?(:cljs
(defn element-top [elem top]
(when elem
@ -471,15 +409,6 @@
(- top 80)))
:behavior "smooth"}))))))
#?(:cljs
(defn scroll-to-element-v2
[elem-id]
(when elem-id
(when-let [elem (gdom/getElement elem-id)]
(.scroll (app-scroll-container-node)
#js {:top (element-top elem 0)
:behavior "auto"})))))
#?(:cljs
(defn scroll-to
([pos]
@ -508,13 +437,6 @@
([animate?]
(scroll-to (app-scroll-container-node) 0 animate?))))
#?(:cljs
(defn scroll-to-bottom
[node]
(when-let [node ^js (or node (app-scroll-container-node))]
(let [bottom (.-scrollHeight node)]
(scroll-to node bottom false)))))
#?(:cljs
(defn url-encode
[string]
@ -573,11 +495,6 @@
[s substr]
(string/starts-with? s substr))
(defn drop-first-line
[s]
(let [lines (string/split-lines s)]
[(first lines)]))
(defn distinct-by
[f col]
(reduce
@ -607,12 +524,6 @@
[repo-url]
(take-last 2 (string/split repo-url #"/")))
(defn safe-split-first [pattern s]
(if-let [first-index (string/index-of s pattern)]
[(subs s 0 first-index)
(subs s (+ first-index (count pattern)) (count s))]
[s ""]))
(defn safe-lower-case
[s]
(if (string? s)
@ -637,12 +548,6 @@
[s]
(.replace s #"[ \t\r]+$" ""))
(defn trim-only-newlines
[s]
(-> s
(.replace #"[\n]+$" "")
(.replace #"^[\n]+" "")))
(defn triml-without-newlines
[s]
(.replace s #"^[ \t\r]+" ""))
@ -659,16 +564,6 @@
(when-not not-space? " ")
(triml-without-newlines right)))))
#?(:cljs
(defn join-newline
[& col]
(let [col (remove nil? col)]
(reduce (fn [acc s]
(if (or (= acc "") (= "\n" (last acc)))
(str acc s)
(str acc "\n"
(.replace s #"^[\n]+" "")))) "" col))))
;; Add documentation
(defn replace-first [pattern s new-value]
(if-let [first-index (string/index-of s pattern)]
@ -698,16 +593,6 @@
old-value)]
(string/replace s (re-pattern (str "(?i)" old-value)) new-value)))
(defn replace-first-ignore-case
[s old-value new-value & [escape-chars]]
(let [escape-chars (or escape-chars default-escape-chars)
old-value (if (string? escape-chars)
(reduce (fn [acc escape-char]
(string/replace acc escape-char (str "\\" escape-char)))
old-value escape-chars)
old-value)]
(string/replace-first s (re-pattern (str "(?i)" old-value)) new-value)))
;; copy from https://stackoverflow.com/questions/18735665/how-can-i-get-the-positions-of-regex-matches-in-clojurescript
#?(:cljs
(defn re-pos [re s]
@ -873,16 +758,6 @@
(and node
(rec-get-blocks-content-section (gobj/get node "parentNode"))))))
#?(:cljs
(defn node-in-viewpoint?
[node]
(let [rect (.getBoundingClientRect node)
height (or (.-innerHeight js/window)
(.. js/document -documentElement -clientHeight))]
(and
(> (.-top rect) (.-clientHeight (d/by-id "head")))
(<= (.-bottom rect) height)))))
#?(:cljs
(defn get-blocks-noncollapse []
(->> (d/by-class "ls-block")
@ -916,12 +791,6 @@
(catch js/Error _e
nil))))
#?(:cljs
(defn input-selected?
[input]
(not= (get-selection-start input)
(get-selection-end input))))
#?(:cljs
(defn get-selected-text
[]
@ -942,10 +811,6 @@
[s]
(safe-re-find exactly-uuid-pattern s))
(defn extract-uuid
[s]
(safe-re-find (re-pattern uuid-pattern) s))
(defn drop-nth [n coll]
(keep-indexed #(when (not= %1 n) %2) coll))
@ -954,10 +819,6 @@
(map string/capitalize)
(string/join " ")))
(defn file-page?
[page-name]
(when page-name (safe-re-find #"\." page-name)))
#?(:cljs
(defn react
[ref]
@ -992,40 +853,6 @@
[title]
(set! (.-title js/document) title)))
#?(:cljs
(defn get-prev-block-with-same-level
[block]
(let [id (gobj/get block "id")
prefix (safe-re-find #"ls-block-[\d]+" id)]
(when-let [blocks (d/by-class "ls-block")]
(when-let [index (.indexOf blocks block)]
(let [level (d/attr block "level")]
(when (> index 0)
(loop [idx (dec index)]
(if (>= idx 0)
(let [block (nth blocks idx)
prefix-match? (starts-with? (gobj/get block "id") prefix)]
(if (and prefix-match?
(= level (d/attr block "level")))
block
(recur (dec idx))))
nil)))))))))
#?(:cljs
(defn get-next-block-with-same-level
[block]
(when-let [blocks (d/by-class "ls-block")]
(when-let [index (.indexOf blocks block)]
(let [level (d/attr block "level")]
(when (> (count blocks) (inc index))
(loop [idx (inc index)]
(if (< idx (count blocks))
(let [block (nth blocks idx)]
(if (= level (d/attr block "level"))
block
(recur (inc idx))))
nil))))))))
#?(:cljs
(defn get-block-container
[block-element]
@ -1077,17 +904,6 @@
(recur (inc idx))
block))))))))
(defn sort-by-value
[order m]
(into (sorted-map-by
(fn [k1 k2]
(let [v1 (get m k1)
v2 (get m k2)]
(if (= order :desc)
(compare [v2 k2] [v1 k1])
(compare [v1 k1] [v2 k2])))))
m))
(defn rand-str
[n]
#?(:cljs (-> (.toString (js/Math.random) 36)
@ -1105,13 +921,6 @@
(when (string? tag-name)
(not (safe-re-find #"[# \t\r\n]+" tag-name))))
#?(:cljs
(defn encode-str
[s]
(if (tag-valid? s)
s
(url-encode s))))
(defn pp-str [x]
#_:clj-kondo/ignore
(with-out-str (clojure.pprint/pprint x)))
@ -1159,14 +968,6 @@
(catch js/Error _
(utils/win32 path)))))
(defn ->system-modifier
[keyboard-shortcut]
(if mac?
(-> keyboard-shortcut
(string/replace "ctrl" "meta")
(string/replace "alt" "meta"))
keyboard-shortcut))
(defn default-content-with-title
[text-format]
(case (name text-format)
@ -1391,11 +1192,6 @@
[]
(contains? (set (system-locales)) "zh-CN")))
#?(:cljs
(defn get-element-width
[id]
(when-let [element (gdom/getElement id)]
(gobj/get element "offsetWidth"))))
(comment
(= (get-relative-path "journals/2020_11_18.org" "pages/grant_ideas.org")
"../pages/grant_ideas.org")

View File

@ -115,13 +115,6 @@
(when-let [pre-char (subs content (dec pos) pos)]
(= pre-char \newline)))))
(defn end-of-line?
[input]
(let [[content pos] (get-input-content&pos input)]
(or (= pos (count content))
(when-let [next-char (subs content pos (inc pos))]
(= next-char \newline)))))
(defn move-cursor-to-line-end
[input]
(move-cursor-to input (line-end-pos input)))
@ -130,10 +123,6 @@
[input]
(move-cursor-to input (line-beginning-pos input)))
(defn move-cursor-to-beginning
[input]
(move-cursor-to input 0))
(defn move-cursor-to-end
[input]
(let [pos (count (gobj/get input "value"))]

View File

@ -51,11 +51,6 @@
(p/let [_ (.completed pool)]
(.terminate pool)))
(defn terminate-parser-pool!
[]
(when-let [pool @parser-pool]
(terminate-pool! pool)))
(defn add-parse-job!
[content config]
(when-let [pool @parser-pool]

View File

@ -122,11 +122,6 @@
(let [key (string/upper-case key)]
(contains? (set (util/remove-first #{key} (get-property-keys format content))) key)))
(defn goto-properties-beginning
[_format input]
(cursor/move-cursor-to-thing input properties-start 0)
(cursor/move-cursor-forward input (count properties-start)))
(defn goto-properties-end
[_format input]
(cursor/move-cursor-to-thing input properties-start 0)