mirror of https://github.com/logseq/logseq
Merge branch 'master' into enhance/undo-redo
commit
eb4d56f666
4
deps.edn
4
deps.edn
|
@ -28,13 +28,13 @@
|
||||||
hiccups/hiccups {:mvn/version "0.3.0"}
|
hiccups/hiccups {:mvn/version "0.3.0"}
|
||||||
tongue/tongue {:mvn/version "0.2.9"}
|
tongue/tongue {:mvn/version "0.2.9"}
|
||||||
org.clojure/core.async {:mvn/version "1.3.610"}
|
org.clojure/core.async {:mvn/version "1.3.610"}
|
||||||
thheller/shadow-cljs {:mvn/version "2.11.11"}
|
thheller/shadow-cljs {:mvn/version "2.8.81"}
|
||||||
expound/expound {:mvn/version "0.8.6"}
|
expound/expound {:mvn/version "0.8.6"}
|
||||||
lambdaisland/glogi {:mvn/version "1.0.74"}}
|
lambdaisland/glogi {:mvn/version "1.0.74"}}
|
||||||
|
|
||||||
:aliases {:cljs {:extra-paths ["src/dev-cljs/" "src/test/"]
|
:aliases {:cljs {:extra-paths ["src/dev-cljs/" "src/test/"]
|
||||||
:extra-deps {org.clojure/clojurescript {:mvn/version "1.10.764"}
|
:extra-deps {org.clojure/clojurescript {:mvn/version "1.10.764"}
|
||||||
thheller/shadow-cljs {:mvn/version "2.11.11"}
|
thheller/shadow-cljs {:mvn/version "2.8.81"}
|
||||||
binaryage/devtools {:mvn/version "1.0.2"}
|
binaryage/devtools {:mvn/version "1.0.2"}
|
||||||
org.clojure/tools.namespace {:mvn/version "0.2.11"}
|
org.clojure/tools.namespace {:mvn/version "0.2.11"}
|
||||||
cider/cider-nrepl {:mvn/version "0.25.5"}}
|
cider/cider-nrepl {:mvn/version "0.25.5"}}
|
||||||
|
|
|
@ -565,15 +565,6 @@ li p:last-child,
|
||||||
/** endregion **/
|
/** endregion **/
|
||||||
|
|
||||||
/* region FIXME: override elements (?) */
|
/* region FIXME: override elements (?) */
|
||||||
a.block-control,
|
|
||||||
a.block-control:hover {
|
|
||||||
text-decoration: none;
|
|
||||||
cursor: pointer;
|
|
||||||
font-size: 14px;
|
|
||||||
min-width: 10px;
|
|
||||||
color: initial;
|
|
||||||
}
|
|
||||||
|
|
||||||
h1.title {
|
h1.title {
|
||||||
margin-bottom: 1.5rem;
|
margin-bottom: 1.5rem;
|
||||||
color: var(--ls-title-text-color, #222);
|
color: var(--ls-title-text-color, #222);
|
||||||
|
|
|
@ -1,6 +1,16 @@
|
||||||
.blocks-container {
|
.blocks-container {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.block-control,
|
||||||
|
.block-control:hover {
|
||||||
|
text-decoration: none;
|
||||||
|
cursor: pointer;
|
||||||
|
font-size: 14px;
|
||||||
|
min-width: 10px;
|
||||||
|
color: initial;
|
||||||
|
user-select: none;
|
||||||
|
}
|
||||||
|
|
||||||
.block-content {
|
.block-content {
|
||||||
min-height: 24px;
|
min-height: 24px;
|
||||||
max-width: 100%;
|
max-width: 100%;
|
||||||
|
@ -12,6 +22,7 @@
|
||||||
max-width: 100%;
|
max-width: 100%;
|
||||||
|
|
||||||
/* FIXME: img macros */
|
/* FIXME: img macros */
|
||||||
|
|
||||||
&.left {
|
&.left {
|
||||||
float: left;
|
float: left;
|
||||||
}
|
}
|
||||||
|
@ -201,8 +212,8 @@
|
||||||
|
|
||||||
.bullet-container {
|
.bullet-container {
|
||||||
display: flex;
|
display: flex;
|
||||||
height: 13px;
|
height: 12px;
|
||||||
width: 13px;
|
width: 12px;
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
|
@ -213,9 +224,16 @@
|
||||||
|
|
||||||
.bullet {
|
.bullet {
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
width: 5px;
|
width: 6px;
|
||||||
height: 5px;
|
height: 6px;
|
||||||
background-color: var(--ls-block-bullet-color, #394b59);
|
background-color: var(--ls-block-bullet-color, #394b59);
|
||||||
|
transition: transform .2s;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
.bullet {
|
||||||
|
transform: scale(1.2);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&.bullet-closed {
|
&.bullet-closed {
|
||||||
|
|
|
@ -42,6 +42,14 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.is-mobile {
|
||||||
|
.absolute-modal {
|
||||||
|
&.is-overflow-vw-x {
|
||||||
|
transform: translateX(-1%);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.non-block-editor textarea,
|
.non-block-editor textarea,
|
||||||
pre {
|
pre {
|
||||||
display: block;
|
display: block;
|
||||||
|
|
|
@ -237,8 +237,8 @@
|
||||||
[:tr [:td (t :help/new-line-in-block)] [:td "Shift-Enter"]]
|
[:tr [:td (t :help/new-line-in-block)] [:td "Shift-Enter"]]
|
||||||
[:tr [:td (t :undo)] [:td (util/->platform-shortcut "Ctrl-z")]]
|
[:tr [:td (t :undo)] [:td (util/->platform-shortcut "Ctrl-z")]]
|
||||||
[:tr [:td (t :redo)] [:td (util/->platform-shortcut "Ctrl-y")]]
|
[:tr [:td (t :redo)] [:td (util/->platform-shortcut "Ctrl-y")]]
|
||||||
[:tr [:td (t :help/zoom-in)] [:td (util/->platform-shortcut "Alt-Right")]]
|
[:tr [:td (t :help/zoom-in)] [:td (util/->platform-shortcut (if util/mac? "Alt-." "Alt-Right"))]]
|
||||||
[:tr [:td (t :help/zoom-out)] [:td (util/->platform-shortcut "Alt-left")]]
|
[:tr [:td (t :help/zoom-out)] [:td (util/->platform-shortcut (if util/mac? "Alt-," "Alt-left"))]]
|
||||||
[:tr [:td (t :help/follow-link-under-cursor)] [:td (util/->platform-shortcut "Ctrl-o")]]
|
[:tr [:td (t :help/follow-link-under-cursor)] [:td (util/->platform-shortcut "Ctrl-o")]]
|
||||||
[:tr [:td (t :help/open-link-in-sidebar)] [:td (util/->platform-shortcut "Ctrl-shift-o")]]
|
[:tr [:td (t :help/open-link-in-sidebar)] [:td (util/->platform-shortcut "Ctrl-shift-o")]]
|
||||||
[:tr [:td (t :expand)] [:td (util/->platform-shortcut "Ctrl-Down")]]
|
[:tr [:td (t :expand)] [:td (util/->platform-shortcut "Ctrl-Down")]]
|
||||||
|
|
|
@ -86,7 +86,7 @@
|
||||||
properties (->> (take-while directive? ast)
|
properties (->> (take-while directive? ast)
|
||||||
(map (fn [[_ k v]]
|
(map (fn [[_ k v]]
|
||||||
(let [k (keyword (string/lower-case k))
|
(let [k (keyword (string/lower-case k))
|
||||||
v (if (contains? #{:title :description} k)
|
v (if (contains? #{:title :description :roam_tags} k)
|
||||||
v
|
v
|
||||||
(text/split-page-refs-without-brackets v))]
|
(text/split-page-refs-without-brackets v))]
|
||||||
[k v])))
|
[k v])))
|
||||||
|
@ -115,11 +115,22 @@
|
||||||
(seq macros)
|
(seq macros)
|
||||||
(assoc :macros macros))
|
(assoc :macros macros))
|
||||||
alias (->vec-concat (:roam_alias properties) (:alias properties))
|
alias (->vec-concat (:roam_alias properties) (:alias properties))
|
||||||
tags (->vec-concat (:roam_tags properties) (:tags properties) definition-tags)
|
filetags (if-let [org-file-tags (:filetags properties)]
|
||||||
|
(->> (string/split org-file-tags ":")
|
||||||
|
(remove string/blank?)))
|
||||||
|
roam-tags (if-let [org-roam-tags (:roam_tags properties)]
|
||||||
|
(let [pat #"\"(.*?)\"" ;; note: lazy, capturing group
|
||||||
|
quoted (map second (re-seq pat org-roam-tags))
|
||||||
|
rest (string/replace org-roam-tags pat "")
|
||||||
|
rest (->> (string/split rest " ")
|
||||||
|
(remove string/blank?))]
|
||||||
|
(concat quoted rest)))
|
||||||
|
tags (->vec-concat roam-tags (:tags properties) definition-tags filetags)
|
||||||
properties (assoc properties :tags tags :alias alias)
|
properties (assoc properties :tags tags :alias alias)
|
||||||
properties (-> properties
|
properties (-> properties
|
||||||
(update :roam_alias ->vec)
|
(update :roam_alias ->vec)
|
||||||
(update :roam_tags ->vec))
|
(update :roam_tags (constantly roam-tags))
|
||||||
|
(update :filetags (constantly filetags)))
|
||||||
properties (medley/filter-kv (fn [k v] (not (empty? v))) properties)
|
properties (medley/filter-kv (fn [k v] (not (empty? v))) properties)
|
||||||
other-ast (drop-while (fn [[item _pos]] (directive? item)) original-ast)]
|
other-ast (drop-while (fn [[item _pos]] (directive? item)) original-ast)]
|
||||||
(if (seq properties)
|
(if (seq properties)
|
||||||
|
|
|
@ -0,0 +1,44 @@
|
||||||
|
(ns frontend.format.mldoc-test
|
||||||
|
(:require [frontend.format.mldoc :refer [parse-properties]]
|
||||||
|
[clojure.string :as string]
|
||||||
|
[cljs.test :refer [deftest are is testing]]))
|
||||||
|
|
||||||
|
(deftest test-parse-org-properties
|
||||||
|
[]
|
||||||
|
(testing "just title"
|
||||||
|
(let [content "#+TITLE: some title "
|
||||||
|
props (parse-properties content "org")]
|
||||||
|
(are [x y] (= x y)
|
||||||
|
;; TODO: should we trim in parse-properties?
|
||||||
|
"some title" (string/trim (:title props)))))
|
||||||
|
|
||||||
|
(testing "filetags"
|
||||||
|
(let [content "
|
||||||
|
#+FILETAGS: :tag1:tag_2:@tag:
|
||||||
|
#+ROAM_TAGS: roamtag
|
||||||
|
body"
|
||||||
|
props (parse-properties content "org")]
|
||||||
|
(are [x y] (= x y)
|
||||||
|
(list "@tag" "tag1" "tag_2") (sort (:filetags props))
|
||||||
|
["roamtag"] (:roam_tags props)
|
||||||
|
(list "@tag" "roamtag" "tag1" "tag_2") (sort (:tags props)))))
|
||||||
|
|
||||||
|
(testing "roam tags"
|
||||||
|
(let [content "
|
||||||
|
#+FILETAGS: filetag
|
||||||
|
#+ROAM_TAGS: roam1 roam2
|
||||||
|
body
|
||||||
|
"
|
||||||
|
props (parse-properties content "org")]
|
||||||
|
(are [x y] (= x y)
|
||||||
|
["roam1" "roam2"] (:roam_tags props)
|
||||||
|
(list "filetag" "roam1" "roam2") (sort (:tags props)))))
|
||||||
|
|
||||||
|
(testing "quoted roam tags"
|
||||||
|
(let [content "
|
||||||
|
#+ROAM_TAGS: \"why would\" you use \"spaces\" xxx
|
||||||
|
body
|
||||||
|
"
|
||||||
|
props (parse-properties content "org")]
|
||||||
|
;; TODO maybe need to sort or something
|
||||||
|
(is (= ["why would" "spaces" "you" "use" "xxx"] (:roam_tags props))))))
|
|
@ -60,8 +60,10 @@
|
||||||
"ctrl+y" history-handler/redo!
|
"ctrl+y" history-handler/redo!
|
||||||
"ctrl+u" route-handler/go-to-search!
|
"ctrl+u" route-handler/go-to-search!
|
||||||
"alt+j" route-handler/go-to-journals!
|
"alt+j" route-handler/go-to-journals!
|
||||||
(or (state/get-shortcut :editor/zoom-in) "alt+right") editor-handler/zoom-in!
|
(or (state/get-shortcut :editor/zoom-in)
|
||||||
(or (state/get-shortcut :editor/zoom-out) "alt+left") editor-handler/zoom-out!
|
(if util/mac? "alt+." "alt+right")) editor-handler/zoom-in!
|
||||||
|
(or (state/get-shortcut :editor/zoom-out)
|
||||||
|
(if util/mac? "alt+," "alt+left")) editor-handler/zoom-out!
|
||||||
"ctrl+enter" editor-handler/cycle-todo!
|
"ctrl+enter" editor-handler/cycle-todo!
|
||||||
"ctrl+down" editor-handler/expand!
|
"ctrl+down" editor-handler/expand!
|
||||||
"ctrl+up" editor-handler/collapse!
|
"ctrl+up" editor-handler/collapse!
|
||||||
|
|
|
@ -228,6 +228,7 @@
|
||||||
(let [cl (.-classList js/document.documentElement)]
|
(let [cl (.-classList js/document.documentElement)]
|
||||||
(if util/mac? (.add cl "is-mac"))
|
(if util/mac? (.add cl "is-mac"))
|
||||||
(if (util/ios?) (.add cl "is-ios"))
|
(if (util/ios?) (.add cl "is-ios"))
|
||||||
|
(if (util/mobile?) (.add cl "is-mobile"))
|
||||||
(if (util/safari?) (.add cl "is-safari"))))
|
(if (util/safari?) (.add cl "is-safari"))))
|
||||||
|
|
||||||
(defn inject-dynamic-style-node!
|
(defn inject-dynamic-style-node!
|
||||||
|
|
|
@ -40,6 +40,11 @@
|
||||||
(and (string/includes? ua "webkit")
|
(and (string/includes? ua "webkit")
|
||||||
(not (string/includes? ua "chrome")))))
|
(not (string/includes? ua "chrome")))))
|
||||||
|
|
||||||
|
(defn mobile?
|
||||||
|
[]
|
||||||
|
(when-not node-test?
|
||||||
|
(re-find #"Mobi" js/navigator.userAgent)))
|
||||||
|
|
||||||
(defn format
|
(defn format
|
||||||
[fmt & args]
|
[fmt & args]
|
||||||
(apply gstring/format fmt args))
|
(apply gstring/format fmt args))
|
||||||
|
@ -877,7 +882,9 @@
|
||||||
(defn ->system-modifier
|
(defn ->system-modifier
|
||||||
[keyboard-shortcut]
|
[keyboard-shortcut]
|
||||||
(if mac?
|
(if mac?
|
||||||
(string/replace keyboard-shortcut "ctrl" "meta")
|
(-> keyboard-shortcut
|
||||||
|
(string/replace "ctrl" "meta")
|
||||||
|
(string/replace "alt" "meta"))
|
||||||
keyboard-shortcut))
|
keyboard-shortcut))
|
||||||
|
|
||||||
(defn default-content-with-title
|
(defn default-content-with-title
|
||||||
|
|
|
@ -128,10 +128,10 @@ export var verifyPermission = async function (handle, readWrite) {
|
||||||
throw new Error("Permission is not granted");
|
throw new Error("Permission is not granted");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NOTE: Need externs to prevent `options.recursive` been munged
|
||||||
|
// When building with release.
|
||||||
export var openDirectory = async function (options = {}, cb) {
|
export var openDirectory = async function (options = {}, cb) {
|
||||||
// FIXME: options.recursive will be undefined after the `getFiles` call get resolved
|
options.recursive = options.recursive || false;
|
||||||
// It's caused by bumping shadow-cljs to 2.11.11.
|
|
||||||
options.recursive = true;
|
|
||||||
const handle = await window.showDirectoryPicker({ mode: 'readwrite' });
|
const handle = await window.showDirectoryPicker({ mode: 'readwrite' });
|
||||||
const _ask = await verifyPermission(handle, true);
|
const _ask = await verifyPermission(handle, true);
|
||||||
return [handle, getFiles(handle, options.recursive, cb)];
|
return [handle, getFiles(handle, options.recursive, cb)];
|
||||||
|
|
Loading…
Reference in New Issue