Browse Source

Merge branch 'logseq:master' into fix/remove-namespace-parents-graph-links

8N9KT 3 năm trước cách đây
mục cha
commit
a18500ac53
45 tập tin đã thay đổi với 328 bổ sung113 xóa
  1. 2 2
      android/app/build.gradle
  2. 1 1
      deps/db/package.json
  3. 4 4
      deps/db/yarn.lock
  4. 1 1
      deps/graph-parser/package.json
  5. 4 4
      deps/graph-parser/src/logseq/graph_parser/block.cljs
  6. 3 6
      deps/graph-parser/src/logseq/graph_parser/extract.cljc
  7. 1 1
      deps/graph-parser/src/logseq/graph_parser/property.cljs
  8. 18 3
      deps/graph-parser/test/logseq/graph_parser/extract_test.cljs
  9. 4 4
      deps/graph-parser/yarn.lock
  10. 15 0
      docs/dev-practices.md
  11. 1 1
      e2e-tests/basic.spec.ts
  12. 3 2
      e2e-tests/flashcards.spec.ts
  13. 4 4
      ios/App/App.xcodeproj/project.pbxproj
  14. 54 18
      libs/yarn.lock
  15. 2 0
      resources/css/common.css
  16. BIN
      resources/icons/logseq_big_sur.icns
  17. BIN
      resources/icons/logseq_big_sur.ico
  18. BIN
      resources/icons/logseq_big_sur.png
  19. 3 2
      resources/package.json
  20. 7 2
      src/main/frontend/components/block.cljs
  21. 1 1
      src/main/frontend/components/onboarding/quick_tour.cljs
  22. 17 3
      src/main/frontend/components/page.cljs
  23. 2 1
      src/main/frontend/components/query_table.cljs
  24. 1 1
      src/main/frontend/components/right_sidebar.cljs
  25. 13 8
      src/main/frontend/db/model.cljs
  26. 2 0
      src/main/frontend/dicts.cljc
  27. 1 1
      src/main/frontend/extensions/pdf/_viewer.css
  28. 3 3
      src/main/frontend/extensions/pdf/highlights.cljs
  29. 12 1
      src/main/frontend/extensions/pdf/utils.cljs
  30. 3 0
      src/main/frontend/fs/capacitor_fs.cljs
  31. 2 1
      src/main/frontend/handler.cljs
  32. 5 3
      src/main/frontend/handler/editor.cljs
  33. 12 9
      src/main/frontend/handler/file.cljs
  34. 3 3
      src/main/frontend/handler/graph.cljs
  35. 4 2
      src/main/frontend/handler/page.cljs
  36. 7 7
      src/main/frontend/handler/repo.cljs
  37. 9 0
      src/main/frontend/modules/shortcut/config.cljs
  38. 2 2
      src/main/frontend/modules/shortcut/dicts.cljc
  39. 5 3
      src/main/frontend/state.cljs
  40. 1 1
      src/main/frontend/version.cljs
  41. 29 0
      src/test/frontend/db/model_test.cljs
  42. 55 1
      src/test/frontend/handler/editor_test.cljs
  43. 1 1
      src/test/frontend/handler/repo_test.cljs
  44. 1 1
      src/test/frontend/test/helper.cljs
  45. 10 5
      templates/config.edn

+ 2 - 2
android/app/build.gradle

@@ -6,8 +6,8 @@ android {
         applicationId "com.logseq.app"
         minSdkVersion rootProject.ext.minSdkVersion
         targetSdkVersion rootProject.ext.targetSdkVersion
-        versionCode 31
-        versionName "0.7.7"
+        versionCode 33
+        versionName "0.7.9"
         testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
         aaptOptions {
              // Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps.

+ 1 - 1
deps/db/package.json

@@ -3,6 +3,6 @@
   "version": "1.0.0",
   "private": true,
   "devDependencies": {
-    "@logseq/nbb-logseq": "^0.5.103"
+    "@logseq/nbb-logseq": "^0.6.125"
   }
 }

+ 4 - 4
deps/db/yarn.lock

@@ -2,10 +2,10 @@
 # yarn lockfile v1
 
 
-"@logseq/nbb-logseq@^0.5.103":
-  version "0.5.103"
-  resolved "https://registry.yarnpkg.com/@logseq/nbb-logseq/-/nbb-logseq-0.5.103.tgz#1084380cd54c92ca8cc94a8934cc777206e45cc0"
-  integrity sha512-V9UW0XrCaaadHUc6/Hp9wfGpQqkzqzoqnDGeSVZkWR6l3QwyqGi9mkhnhVcfTwAvxIfOgrfz93GcaeepV4pYNA==
+"@logseq/nbb-logseq@^0.6.125":
+  version "0.6.125"
+  resolved "https://registry.yarnpkg.com/@logseq/nbb-logseq/-/nbb-logseq-0.6.125.tgz#197dbb01040f9cfdf7040399b9fbed9b862dee5b"
+  integrity sha512-1UB4Urt6O95Cwwni68B/f05x+wsL+ju+dCGLE47WTvF9F8WQwhiADfWhMbFOt35ImswLSzM1rgVGIMIj0g6fkQ==
   dependencies:
     import-meta-resolve "^1.1.1"
 

+ 1 - 1
deps/graph-parser/package.json

@@ -3,7 +3,7 @@
   "version": "1.0.0",
   "private": true,
   "devDependencies": {
-    "@logseq/nbb-logseq": "^0.5.103"
+    "@logseq/nbb-logseq": "^0.6.125"
   },
   "dependencies": {
     "mldoc": "^1.3.9"

+ 4 - 4
deps/graph-parser/src/logseq/graph_parser/block.cljs

@@ -480,8 +480,8 @@
       (d/squuid)))
 
 (defn get-page-refs-from-properties
-  [format properties db date-formatter]
-  (let [page-refs (get-page-ref-names-from-properties format properties {})]
+  [format properties db date-formatter user-config]
+  (let [page-refs (get-page-ref-names-from-properties format properties user-config)]
     (map (fn [page] (page-name->map page true db true date-formatter)) page-refs)))
 
 (defn- with-page-block-refs
@@ -493,7 +493,7 @@
           (update :refs (fn [col] (remove nil? col)))))
 
 (defn- with-pre-block-if-exists
-  [blocks body pre-block-properties encoded-content {:keys [supported-formats db date-formatter]}]
+  [blocks body pre-block-properties encoded-content {:keys [supported-formats db date-formatter user-config]}]
   (let [first-block (first blocks)
         format (or (:block/format first-block) :markdown)
         first-block-start-pos (get-in first-block [:block/meta :start_pos])
@@ -506,7 +506,7 @@
                    (let [content (utf8/substring encoded-content 0 first-block-start-pos)
                          {:keys [properties properties-order]} pre-block-properties
                          id (get-custom-id-or-new-id {:properties properties})
-                         property-refs (->> (get-page-refs-from-properties format properties db date-formatter)
+                         property-refs (->> (get-page-refs-from-properties format properties db date-formatter user-config)
                                             (map :block/original-name))
                          block {:uuid id
                                 :content content

+ 3 - 6
deps/graph-parser/src/logseq/graph_parser/extract.cljc

@@ -190,9 +190,6 @@
          (map (partial apply merge))
          (with-block-uuid))))
 
-#?(:org.babashka/nbb
-   (alter-var-root #'gp-mldoc/parse-property (constantly text/parse-property))
-   :default
-   ;; TODO: Properly fix this circular dependency:
-   ;; mldoc/->edn > text/parse-property > mldoc/link? ->mldoc/inline->edn + mldoc/default-config
-   (set! gp-mldoc/parse-property text/parse-property))
+;; TODO: Properly fix this circular dependency:
+;; mldoc/->edn > text/parse-property > mldoc/link? ->mldoc/inline->edn + mldoc/default-config
+(set! gp-mldoc/parse-property text/parse-property)

+ 1 - 1
deps/graph-parser/src/logseq/graph_parser/property.cljs

@@ -43,7 +43,7 @@
    #{:id :custom-id :background-color :background_color :heading :collapsed
      :created-at :updated-at :last-modified-at :created_at :last_modified_at
      :query-table :query-properties :query-sort-by :query-sort-desc :ls-type
-     :hl-type :hl-page :hl-stamp :file-path}
+     :hl-type :hl-page :hl-stamp}
    (set (map keyword markers))
    @built-in-extended-properties))
 

+ 18 - 3
deps/graph-parser/test/logseq/graph_parser/extract_test.cljs

@@ -1,19 +1,19 @@
 (ns logseq.graph-parser.extract-test
-  (:require [cljs.test :refer [deftest is]]
+  (:require [cljs.test :refer [deftest is are]]
             [logseq.graph-parser.extract :as extract]
             [clojure.pprint :as pprint]))
 
 (defn- extract
   [text]
   (let [{:keys [blocks]} (extract/extract "a.md" text {:block-pattern "-"})
-          lefts (map (juxt :block/parent :block/left) blocks)]
+        lefts (map (juxt :block/parent :block/left) blocks)]
     (if (not= (count lefts) (count (distinct lefts)))
       (do
         (pprint/pprint (map (fn [x] (select-keys x [:block/uuid :block/level :block/content :block/left])) blocks))
         (throw (js/Error. ":block/parent && :block/left conflicts")))
       (mapv :block/content blocks))))
 
-(deftest test-extract
+(deftest extract-blocks-for-headings
   []
   (is (= ["a" "b" "c"]
          (extract
@@ -41,6 +41,21 @@
   - i
 - j"))))
 
+(deftest extract-blocks-with-property-pages-config
+  []
+  (are [extract-args expected-refs]
+       (= expected-refs
+          (->> (apply extract/extract extract-args)
+               :blocks
+               (mapcat #(->> % :block/refs (map :block/name)))
+               set))
+
+       ["a.md" "foo:: #bar\nbaz:: #bing" {:block-pattern "-" :user-config {:property-pages/enabled? true}}]
+       #{"bar" "bing" "foo" "baz"}
+
+       ["a.md" "foo:: #bar\nbaz:: #bing" {:block-pattern "-" :user-config {:property-pages/enabled? false}}]
+       #{"bar" "bing"}))
+
 (deftest test-regression-1902
   []
   (is (= ["line1" "line2" "line3" "line4"]

+ 4 - 4
deps/graph-parser/yarn.lock

@@ -2,10 +2,10 @@
 # yarn lockfile v1
 
 
-"@logseq/nbb-logseq@^0.5.103":
-  version "0.5.103"
-  resolved "https://registry.yarnpkg.com/@logseq/nbb-logseq/-/nbb-logseq-0.5.103.tgz#1084380cd54c92ca8cc94a8934cc777206e45cc0"
-  integrity sha512-V9UW0XrCaaadHUc6/Hp9wfGpQqkzqzoqnDGeSVZkWR6l3QwyqGi9mkhnhVcfTwAvxIfOgrfz93GcaeepV4pYNA==
+"@logseq/nbb-logseq@^0.6.125":
+  version "0.6.125"
+  resolved "https://registry.yarnpkg.com/@logseq/nbb-logseq/-/nbb-logseq-0.6.125.tgz#197dbb01040f9cfdf7040399b9fbed9b862dee5b"
+  integrity sha512-1UB4Urt6O95Cwwni68B/f05x+wsL+ju+dCGLE47WTvF9F8WQwhiADfWhMbFOt35ImswLSzM1rgVGIMIj0g6fkQ==
   dependencies:
     import-meta-resolve "^1.1.1"
 

+ 15 - 0
docs/dev-practices.md

@@ -88,6 +88,10 @@ Our unit tests use the [shadow-cljs test-runner](https://shadow-cljs.github.io/d
 yarn test
 ```
 
+By convention, a namespace's tests are found at a corresponding namespace
+of the same name with an added `-test` suffix. For example, tests
+for `frontend.db.model` are found in `frontend.db.model-test`.
+
 There are a couple different ways to develop with tests:
 
 #### Focus Tests
@@ -115,6 +119,17 @@ To run tests automatically on file save, run `clojure -M:test watch test
 the `:ns-regexp` option e.g. `clojure -M:test watch test --config-merge
 '{:autorun true :ns-regexp "frontend.util.page-property-test"}'`.
 
+#### Database tests
+
+To write a test that uses a datascript db:
+
+* Be sure your test ns has test fixtures from `test-helper` ns to create and
+  destroy test databases after each test.
+* The easiest way to set up test data is to use `test-helper/load-test-files`.
+* For the repo argument that most fns take, pass it `test-helper/test-db`
+
+For examples of these tests, see `frontend.db.query-dsl-test` and `frontend.db.model-test`.
+
 ## Logging
 
 For logging, we use https://github.com/lambdaisland/glogi. When in development,

+ 1 - 1
e2e-tests/basic.spec.ts

@@ -15,7 +15,7 @@ test('create page and blocks, save to disk', async ({ page, block, graphDir }) =
   await block.waitForBlocks(2)
 
   await page.keyboard.type('second bullet')
-  await block.clickNext()
+  await block.enterNext()
 
   await page.keyboard.type('third bullet')
   expect(await block.indent()).toBe(true)

+ 3 - 2
e2e-tests/flashcards.spec.ts

@@ -46,6 +46,7 @@ test('flashcard demo', async ({ page, block }) => {
   await numberLabel.waitFor({ state: 'visible' })
   expect(await numberLabel.innerText()).toMatch(/\[\[logseq\]\]\s+2\/2/)
 
-  const cardsNum = page.locator('.flashcards-nav span >> nth=1')
-  expect(await cardsNum.innerText()).toBe('2')
+  // DO NOT check number label for now
+  //const cardsNum = page.locator('.flashcards-nav span >> nth=1')
+  //expect(await cardsNum.innerText()).toBe('2')
 })

+ 4 - 4
ios/App/App.xcodeproj/project.pbxproj

@@ -542,7 +542,7 @@
 				INFOPLIST_FILE = App/Info.plist;
 				IPHONEOS_DEPLOYMENT_TARGET = 13.0;
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
-				MARKETING_VERSION = 0.7.7;
+				MARKETING_VERSION = 0.7.9;
 				OTHER_SWIFT_FLAGS = "$(inherited) \"-D\" \"COCOAPODS\" \"-DDEBUG\"";
 				PRODUCT_BUNDLE_IDENTIFIER = com.logseq.logseq;
 				PRODUCT_NAME = "$(TARGET_NAME)";
@@ -568,7 +568,7 @@
 				INFOPLIST_FILE = App/Info.plist;
 				IPHONEOS_DEPLOYMENT_TARGET = 13.0;
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
-				MARKETING_VERSION = 0.7.7;
+				MARKETING_VERSION = 0.7.9;
 				PRODUCT_BUNDLE_IDENTIFIER = com.logseq.logseq;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				SWIFT_ACTIVE_COMPILATION_CONDITIONS = "";
@@ -593,7 +593,7 @@
 				INFOPLIST_KEY_NSHumanReadableCopyright = "";
 				IPHONEOS_DEPLOYMENT_TARGET = 13.0;
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
-				MARKETING_VERSION = 0.7.7;
+				MARKETING_VERSION = 0.7.9;
 				MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
 				MTL_FAST_MATH = YES;
 				PRODUCT_BUNDLE_IDENTIFIER = com.logseq.logseq.ShareViewController;
@@ -620,7 +620,7 @@
 				INFOPLIST_KEY_NSHumanReadableCopyright = "";
 				IPHONEOS_DEPLOYMENT_TARGET = 13.0;
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
-				MARKETING_VERSION = 0.7.7;
+				MARKETING_VERSION = 0.7.9;
 				MTL_FAST_MATH = YES;
 				PRODUCT_BUNDLE_IDENTIFIER = com.logseq.logseq.ShareViewController;
 				PRODUCT_NAME = "$(TARGET_NAME)";

+ 54 - 18
libs/yarn.lock

@@ -7,6 +7,46 @@
   resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.3.tgz#90420f9f9c6d3987f176a19a7d8e764271a2f55d"
   integrity sha512-Fxt+AfXgjMoin2maPIYzFZnQjAXjAL0PHscM5pRTtatFqB+vZxAM9tLp2Optnuw3QOQC40jTNeGYFOMvyf7v9g==
 
+"@jridgewell/gen-mapping@^0.3.0":
+  version "0.3.2"
+  resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9"
+  integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==
+  dependencies:
+    "@jridgewell/set-array" "^1.0.1"
+    "@jridgewell/sourcemap-codec" "^1.4.10"
+    "@jridgewell/trace-mapping" "^0.3.9"
+
+"@jridgewell/resolve-uri@^3.0.3":
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78"
+  integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==
+
+"@jridgewell/set-array@^1.0.1":
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72"
+  integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==
+
+"@jridgewell/source-map@^0.3.2":
+  version "0.3.2"
+  resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb"
+  integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==
+  dependencies:
+    "@jridgewell/gen-mapping" "^0.3.0"
+    "@jridgewell/trace-mapping" "^0.3.9"
+
+"@jridgewell/sourcemap-codec@^1.4.10":
+  version "1.4.14"
+  resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24"
+  integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==
+
+"@jridgewell/trace-mapping@^0.3.9":
+  version "0.3.14"
+  resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz#b231a081d8f66796e475ad588a1ef473112701ed"
+  integrity sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==
+  dependencies:
+    "@jridgewell/resolve-uri" "^3.0.3"
+    "@jridgewell/sourcemap-codec" "^1.4.10"
+
 "@polka/url@^1.0.0-next.17":
   version "1.0.0-next.17"
   resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.17.tgz#25fdbdfd282c2f86ddf3fcefbd98be99cd2627e2"
@@ -242,10 +282,10 @@ acorn-walk@^8.0.0:
   resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.1.1.tgz#3ddab7f84e4a7e2313f6c414c5b7dac85f4e3ebc"
   integrity sha512-FbJdceMlPHEAWJOILDk1fXD8lnTlEIWFkqtfk+MvmL5q/qlHfN7GEHcsFZWt/Tea9jRNPWUZG4G976nqAAmU9w==
 
-acorn@^8.0.4, acorn@^8.4.1:
-  version "8.4.1"
-  resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.4.1.tgz#56c36251fc7cabc7096adc18f05afe814321a28c"
-  integrity sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA==
+acorn@^8.0.4, acorn@^8.4.1, acorn@^8.5.0:
+  version "8.7.1"
+  resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30"
+  integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==
 
 ajv-keywords@^3.5.2:
   version "3.5.2"
@@ -920,10 +960,10 @@ [email protected]:
     dot-case "^3.0.4"
     tslib "^2.0.3"
 
-source-map-support@~0.5.19:
-  version "0.5.19"
-  resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61"
-  integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==
+source-map-support@~0.5.20:
+  version "0.5.21"
+  resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f"
+  integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==
   dependencies:
     buffer-from "^1.0.0"
     source-map "^0.6.0"
@@ -933,11 +973,6 @@ source-map@^0.6.0, source-map@^0.6.1:
   resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
   integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
 
-source-map@~0.7.2:
-  version "0.7.3"
-  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383"
-  integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==
-
 strip-final-newline@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad"
@@ -975,13 +1010,14 @@ terser-webpack-plugin@^5.1.3:
     terser "^5.7.0"
 
 terser@^5.7.0:
-  version "5.7.1"
-  resolved "https://registry.yarnpkg.com/terser/-/terser-5.7.1.tgz#2dc7a61009b66bb638305cb2a824763b116bf784"
-  integrity sha512-b3e+d5JbHAe/JSjwsC3Zn55wsBIM7AsHLjKxT31kGCldgbpFePaFo+PiddtO6uwRZWRw7sPXmAN8dTW61xmnSg==
+  version "5.14.2"
+  resolved "https://registry.yarnpkg.com/terser/-/terser-5.14.2.tgz#9ac9f22b06994d736174f4091aa368db896f1c10"
+  integrity sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==
   dependencies:
+    "@jridgewell/source-map" "^0.3.2"
+    acorn "^8.5.0"
     commander "^2.20.0"
-    source-map "~0.7.2"
-    source-map-support "~0.5.19"
+    source-map-support "~0.5.20"
 
 to-regex-range@^5.0.1:
   version "5.0.1"

+ 2 - 0
resources/css/common.css

@@ -1085,6 +1085,8 @@ mark {
   font-family: MonoLisa, 'Fira Code', Monaco, Menlo, Consolas, 'COURIER NEW',
     monospace;
   letter-spacing: 0;
+  background-color: var(--ls-page-inline-code-bg-color, #eee);
+  color: var(--ls-page-inline-code-color);
   word-spacing: -0.15em;
   text-rendering: optimizeSpeed;
 }

BIN
resources/icons/logseq_big_sur.icns


BIN
resources/icons/logseq_big_sur.ico


BIN
resources/icons/logseq_big_sur.png


+ 3 - 2
resources/package.json

@@ -1,6 +1,6 @@
 {
   "name": "Logseq",
-  "version": "0.7.7",
+  "version": "0.7.9",
   "main": "electron.js",
   "author": "Logseq",
   "license": "AGPL-3.0",
@@ -53,6 +53,7 @@
     "electron-rebuild": "3.2.5"
   },
   "resolutions": {
-    "**/electron": "15.1.2"
+    "**/electron": "15.1.2",
+    "**/node-gyp": "9.0.0"
   }
 }

+ 7 - 2
src/main/frontend/components/block.cljs

@@ -245,7 +245,11 @@
                                       images (if-not (= (count images) 1)
                                                (let [^js _image (.closest (.-target e) ".asset-container")
                                                      image (. _image querySelector "img")]
-                                                 (cons image (remove #(= image %) images)))
+                                                 (->> images
+                                                      (sort-by (juxt #(.-y %) #(.-x %)))
+                                                      (split-with (complement #{image}))
+                                                      reverse
+                                                      (apply concat)))
                                                images)
                                       images (for [^js it images] {:src (.-src it)
                                                                    :w (.-naturalWidth it)
@@ -1929,7 +1933,8 @@
    (and (util/sup? target)
         (dom/has-class? target "fn"))
    (dom/has-class? target "image-resize")
-   (dom/closest target "a")))
+   (dom/closest target "a")
+   (dom/closest target ".query-table")))
 
 (defn- block-content-on-mouse-down
   [e block block-id _content edit-input-id]

+ 1 - 1
src/main/frontend/components/onboarding/quick_tour.cljs

@@ -71,7 +71,7 @@
    {:id                "nav-journal-page"
     :text              (h/render-html [:section [:h2 "📆 Daily Journal Page"]
                                        [:p
-                                        [:span "This is today’s daily journal page. Here yo can dump your thoughts, learnings and ideas. Don’t worry about organizing. Just write and"]
+                                        [:span "This is today’s daily journal page. Here you can dump your thoughts, learnings and ideas. Don’t worry about organizing. Just write and"]
                                         [:a "[[link]]"]
                                         [:span "your thoughts."]]])
 

+ 17 - 3
src/main/frontend/components/page.cljs

@@ -434,6 +434,7 @@
 (defonce *orphan-pages? (atom true))
 (defonce *builtin-pages? (atom nil))
 (defonce *excluded-pages? (atom true))
+(defonce *show-journals-in-page-graph? (atom nil))
 
 (rum/defc ^:large-vars/cleanup-todo graph-filters < rum/reactive
   [graph settings n-hops]
@@ -630,9 +631,21 @@
         graph (update graph :nodes #(filter-graph-nodes % search-graph-filters))]
     (global-graph-inner graph settings theme)))
 
-(rum/defc page-graph-inner < rum/static
+(rum/defc page-graph-inner < rum/reactive
   [_page graph dark?]
+   (let [ show-journals-in-page-graph? (rum/react *show-journals-in-page-graph?) ]
   [:div.sidebar-item.flex-col
+             [:div.flex.items-center.justify-between.mb-0
+              [:span (t :right-side-bar/show-journals)]
+              [:div.mt-1
+               (ui/toggle show-journals-in-page-graph? ;my-val;
+                           (fn []
+                             (let [value (not show-journals-in-page-graph?)]
+                               (reset! *show-journals-in-page-graph? value)
+                               ))
+                          true)]
+              ]
+
    (graph/graph-2d {:nodes (:nodes graph)
                     :links (:links graph)
                     :width 600
@@ -640,7 +653,7 @@
                     :dark? dark?
                     :register-handlers-fn
                     (fn [graph]
-                      (graph-register-handlers graph (atom nil) (atom nil) dark?))})])
+                      (graph-register-handlers graph (atom nil) (atom nil) dark?))})]))
 
 (rum/defc page-graph < db-mixins/query rum/reactive
   []
@@ -650,9 +663,10 @@
               (date/today))
         theme (:ui/theme @state/state)
         dark? (= theme "dark")
+        show-journals-in-page-graph (rum/react *show-journals-in-page-graph?)
         graph (if (util/uuid-string? page)
                 (graph-handler/build-block-graph (uuid page) theme)
-                (graph-handler/build-page-graph page theme))]
+                (graph-handler/build-page-graph page theme show-journals-in-page-graph))]
     (when (seq (:nodes graph))
       (page-graph-inner page graph dark?))))
 

+ 2 - 1
src/main/frontend/components/query_table.cljs

@@ -112,7 +112,8 @@
                                  desc?
                                  result)]
       [:div.overflow-x-auto {:on-mouse-down (fn [e] (.stopPropagation e))
-                             :style {:width "100%"}}
+                             :style {:width "100%"}
+                             :class (when-not page? "query-table")}
        [:table.table-auto
         [:thead
          [:tr.cursor

+ 1 - 1
src/main/frontend/components/right_sidebar.cljs

@@ -127,8 +127,8 @@
            [:div.flex.flex-col
             [:div.flex.flex-row.justify-between
              [:div.flex.flex-row.justify-center
+              {:on-click #(state/sidebar-block-toggle-collapse! db-id)}
               [:a.opacity-50.hover:opacity-100.flex.items-center.pr-1
-               {:on-click #(state/sidebar-block-toggle-collapse! db-id)}
                (ui/rotating-arrow collapse?)]
               [:div.ml-1.font-medium
                title]]

+ 13 - 8
src/main/frontend/db/model.cljs

@@ -1165,18 +1165,23 @@
 ;; get pages who mentioned this page
 ;; TODO: use :block/_refs
 (defn get-pages-that-mentioned-page
-  [repo page]
+  [repo page include-journals]
   (when (conn/get-db repo)
     (let [page-id (:db/id (db-utils/entity [:block/name (util/safe-page-name-sanity-lc page)]))
           pages (page-alias-set repo page)
+          query-base '[:find ?mentioned-page-name
+                       :in $ ?pages ?page-name
+                       :where
+                       [?block :block/refs ?p]
+                       [(contains? ?pages ?p)]
+                       [?block :block/page ?mentioned-page]
+                       [?mentioned-page :block/name ?mentioned-page-name]]
+          query  (if include-journals
+                   query-base
+                   (conj query-base '[?mentioned-page :block/journal? false]))
+
           mentioned-pages (->> (react/q repo [:frontend.db.react/page<-pages page-id] {:use-cache? false}
-                                        '[:find ?mentioned-page-name
-                                          :in $ ?pages ?page-name
-                                          :where
-                                          [?block :block/refs ?p]
-                                          [(contains? ?pages ?p)]
-                                          [?block :block/page ?mentioned-page]
-                                          [?mentioned-page :block/name ?mentioned-page-name]]
+                                        query
                                         pages
                                         page)
                                react

+ 2 - 0
src/main/frontend/dicts.cljc

@@ -68,6 +68,7 @@
         :right-side-bar/all-pages "All pages"
         :right-side-bar/flashcards "Flashcards"
         :right-side-bar/new-page "New page"
+        :right-side-bar/show-journals "Show Journals"
         :left-side-bar/journals "Journals"
         :left-side-bar/new-page "New page"
         :left-side-bar/nav-favorites "Favorites"
@@ -3204,6 +3205,7 @@
         :right-side-bar/all-pages "Tutte le pagine"
         :right-side-bar/flashcards "Flashcard"
         :right-side-bar/new-page "Nuova pagina"
+        :right-side-bar/show-journals "Mostra diari"
         :left-side-bar/journals "Diario"
         :left-side-bar/new-page "Nuova pagina"
         :left-side-bar/nav-favorites "Preferiti"

+ 1 - 1
src/main/frontend/extensions/pdf/_viewer.css

@@ -774,8 +774,8 @@
   top: 0;
   right: 0;
   bottom: 0;
-  background: url("images/loading-icon.gif") center no-repeat;
 }
+
 .pdfViewer .page .loadingIcon.notVisible {
   background: none;
 }

+ 3 - 3
src/main/frontend/extensions/pdf/highlights.cljs

@@ -122,7 +122,7 @@
                         "copy"
                         (do
                           (util/copy-to-clipboard!
-                            (or (:text content) (.toString selection)))
+                            (or (:text content) (pdf-utils/fix-selection-text-breakline (.toString selection))))
                           (pdf-utils/clear-all-selection))
 
                         "link"
@@ -575,7 +575,7 @@
                              {:id         nil
                               :page       page
                               :position   sc-pos
-                              :content    {:text (.toString selection)}
+                              :content    {:text (pdf-utils/fix-selection-text-breakline (.toString selection))}
                               :properties {}})))]
 
             ;; show ctx menu
@@ -1061,7 +1061,7 @@
         (let [get-doc$ (fn [^js opts] (.-promise (js/pdfjsLib.getDocument opts)))
               opts {:url           url
                     :ownerDocument js/document
-                    :cMapUrl       "./js/pdfjs/cmaps/"
+                    :cMapUrl       "./cmaps/"
                     ;;:cMapUrl       "https://cdn.jsdelivr.net/npm/[email protected]/cmaps/"
                     :cMapPacked    true}]
 

+ 12 - 1
src/main/frontend/extensions/pdf/utils.cljs

@@ -4,7 +4,8 @@
             [frontend.util :as util]
             ["/frontend/extensions/pdf/utils" :as js-utils]
             [frontend.db :as front-db]
-            [frontend.loader :refer [load]]))
+            [frontend.loader :refer [load]]
+            [clojure.string :as string]))
 
 (defonce MAX-SCALE 5.0)
 (defonce MIN-SCALE 0.25)
@@ -156,6 +157,16 @@
                      :height (.-height rect)})]
         (optimize-client-reacts rects)))))
 
+(defn fix-selection-text-breakline
+  [text]
+
+  (when-not (string/blank? text)
+    (let [sp "@#~#@"]
+      (-> text
+          (string/replace #"[\r\n]+" sp)
+          (string/replace (str "-" sp) "")
+          (string/replace sp " ")))))
+
 ;; TODO: which viewer instance?
 (defn next-page
   []

+ 3 - 0
src/main/frontend/fs/capacitor_fs.cljs

@@ -259,6 +259,9 @@
     (readdir dir))
   (unlink! [this repo path _opts]
     (p/let [path (get-file-path nil path)
+            path (if (string/starts-with? path "file://")
+                   (string/replace-first path "file://" "")
+                   path)
             repo-dir (config/get-local-dir repo)
             recycle-dir (str repo-dir config/app-name "/.recycle")
             file-name (-> (string/replace path repo-dir "")

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

@@ -56,7 +56,8 @@
               (when (and (not (state/nfs-refreshing?))
                          (not (contains? (:file/unlinked-dirs @state/state)
                                          (config/get-repo-dir repo))))
-                (srs/update-cards-due-count!)
+                (when (state/enable-flashcards?)
+                  (srs/update-cards-due-count!))
                 ;; Don't create the journal file until user writes something
                 (page-handler/create-today-journal!))))]
     (f)

+ 5 - 3
src/main/frontend/handler/editor.cljs

@@ -660,9 +660,11 @@
 (defn properties-block
   [properties format page]
   (let [content (property/insert-properties format "" properties)
-        refs (gp-block/get-page-refs-from-properties format properties
+        refs (gp-block/get-page-refs-from-properties format
+                                                     properties
                                                      (db/get-db (state/get-current-repo))
-                                                     (state/get-date-formatter))]
+                                                     (state/get-date-formatter)
+                                                     (state/get-config))]
     {:block/pre-block? true
      :block/uuid (db/new-block-id)
      :block/properties properties
@@ -2756,7 +2758,7 @@
         (do (util/stop e)
             (autopair input-id key format nil))
 
-        hashtag?
+        (and hashtag? (or (zero? pos) (re-matches #"\s" (get value (dec pos)))))
         (do
           (commands/handle-step [:editor/search-page-hashtag])
           (if (= key "#")

+ 12 - 9
src/main/frontend/handler/file.cljs

@@ -106,7 +106,7 @@
 (defn reset-file!
   ([repo-url file content]
    (reset-file! repo-url file content {}))
-  ([repo-url file content options]
+  ([repo-url file content {:keys [verbose] :as options}]
    (let [electron-local-repo? (and (util/electron?)
                                    (config/local-db? repo-url))
          file (cond
@@ -135,18 +135,20 @@
        (db/get-db repo-url false)
        file
        content
-       (merge options
+       (merge (dissoc options :verbose)
               {:new? new?
                :delete-blocks-fn (partial get-delete-blocks repo-url)
-               :extract-options {:user-config (state/get-config)
-                                 :date-formatter (state/get-date-formatter)
-                                 :page-name-order (state/page-name-order)
-                                 :block-pattern (config/get-block-pattern (gp-util/get-format file))
-                                 :supported-formats (gp-config/supported-formats)}}))))))
+               :extract-options (merge
+                                 {:user-config (state/get-config)
+                                  :date-formatter (state/get-date-formatter)
+                                  :page-name-order (state/page-name-order)
+                                  :block-pattern (config/get-block-pattern (gp-util/get-format file))
+                                  :supported-formats (gp-config/supported-formats)}
+                                 (when (some? verbose) {:verbose verbose}))}))))))
 
 ;; TODO: Remove this function in favor of `alter-files`
 (defn alter-file
-  [repo path content {:keys [reset? re-render-root? from-disk? skip-compare? new-graph?]
+  [repo path content {:keys [reset? re-render-root? from-disk? skip-compare? new-graph? verbose]
                       :or {reset? true
                            re-render-root? false
                            from-disk? false
@@ -166,7 +168,8 @@
             [[:db/retract page-id :block/alias]
              [:db/retract page-id :block/tags]]
             opts))
-        (reset-file! repo path content opts))
+        (reset-file! repo path content (merge opts
+                                              (when (some? verbose) {:verbose verbose}))))
       (db/set-file-content! repo path content opts))
     (util/p-handle (write-file!)
                    (fn [_]

+ 3 - 3
src/main/frontend/handler/graph.cljs

@@ -120,7 +120,7 @@
           :page-name->original-name page-name->original-name})))))
 
 (defn build-page-graph
-  [page theme]
+  [page theme show-journal]
   (let [dark? (= "dark" theme)]
     (when-let [repo (state/get-current-repo)]
       (let [page (util/page-name-sanity-lc page)
@@ -128,7 +128,7 @@
             tags (:tags (:block/properties page-entity))
             tags (remove #(= page %) tags)
             ref-pages (db/get-page-referenced-pages repo page)
-            mentioned-pages (db/get-pages-that-mentioned-page repo page)
+            mentioned-pages (db/get-pages-that-mentioned-page repo page show-journal)
             namespaces (db/get-all-namespace-relation repo)
             links (concat
                    namespaces
@@ -148,7 +148,7 @@
                                  (let [ref-pages (-> (map first (db/get-page-referenced-pages repo page))
                                                      (set)
                                                      (set/intersection other-pages))
-                                       mentioned-pages (-> (map first (db/get-pages-that-mentioned-page repo page))
+                                       mentioned-pages (-> (map first (db/get-pages-that-mentioned-page repo page show-journal))
                                                            (set)
                                                            (set/intersection other-pages))]
                                    (concat

+ 4 - 2
src/main/frontend/handler/page.cljs

@@ -74,9 +74,11 @@
    (let [p (common-handler/get-page-default-properties title)
          ps (merge p properties)
          content (page-property/insert-properties format "" ps)
-         refs (gp-block/get-page-refs-from-properties format properties
+         refs (gp-block/get-page-refs-from-properties format
+                                                      properties
                                                       (db/get-db (state/get-current-repo))
-                                                      (state/get-date-formatter))]
+                                                      (state/get-date-formatter)
+                                                      (state/get-config))]
      {:block/uuid (db/new-block-id)
       :block/properties ps
       :block/properties-order (keys ps)

+ 7 - 7
src/main/frontend/handler/repo.cljs

@@ -183,14 +183,15 @@
     (load-pages-metadata! repo file-paths files force?)))
 
 (defn- parse-and-load-file!
-  [repo-url file new-graph?]
+  [repo-url file {:keys [new-graph? verbose]}]
   (try
     (file-handler/alter-file repo-url
                              (:file/path file)
                              (:file/content file)
-                             {:new-graph? new-graph?
-                              :re-render-root? false
-                              :from-disk? true})
+                             (merge {:new-graph? new-graph?
+                                     :re-render-root? false
+                                     :from-disk? true}
+                                    (when (some? verbose) {:verbose verbose})))
     (catch :default e
       (state/set-parsing-state! (fn [m]
                                   (update m :failed-parsing-files conj [(:file/path file) e])))))
@@ -215,7 +216,6 @@
 (defn- parse-files-and-create-default-files-inner!
   [repo-url files delete-files delete-blocks file-paths db-encrypted? re-render? re-render-opts opts]
   (let [supported-files (graph-parser/filter-files files)
-        new-graph? (:new-graph? opts)
         delete-data (->> (concat delete-files delete-blocks)
                          (remove nil?))
         chan (async/to-chan! supported-files)
@@ -229,7 +229,7 @@
         (doseq [file supported-files]
           (state/set-parsing-state! (fn [m]
                                       (assoc m :current-parsing-file (:file/path file))))
-          (parse-and-load-file! repo-url file new-graph?))
+          (parse-and-load-file! repo-url file (select-keys opts [:new-graph? :verbose])))
         (after-parse repo-url files file-paths db-encrypted? re-render? re-render-opts opts graph-added-chan))
       (async/go-loop []
         (if-let [file (async/<! chan)]
@@ -237,7 +237,7 @@
             (state/set-parsing-state! (fn [m]
                                         (assoc m :current-parsing-file (:file/path file))))
             (async/<! (async/timeout 10))
-            (parse-and-load-file! repo-url file new-graph?)
+            (parse-and-load-file! repo-url file (select-keys opts [:new-graph? :verbose]))
             (recur))
           (after-parse repo-url files file-paths db-encrypted? re-render? re-render-opts opts graph-added-chan))))
     graph-added-chan))

+ 9 - 0
src/main/frontend/modules/shortcut/config.cljs

@@ -17,6 +17,8 @@
             [frontend.state :as state]
             [frontend.util :refer [mac?] :as util]
             [frontend.commands :as commands]
+            [electron.ipc :as ipc]
+            [promesa.core :as p]
             [clojure.data :as data]
             [medley.core :as medley]))
 
@@ -291,6 +293,11 @@
    :graph/save                     {:fn #(state/pub-event! [:graph/save])
                                     :binding false}
 
+   :graph/re-index                 {:fn (fn []
+                                          (p/let [multiple-windows? (ipc/ipc "graphHasMultipleWindows" (state/get-current-repo))]
+                                                 (state/pub-event! [:graph/ask-for-re-index multiple-windows?])))
+                                    :binding false}
+
    :command/run                    {:binding "mod+shift+1"
                                     :inactive (not (util/electron?))
                                     :fn      #(do
@@ -459,6 +466,7 @@
                           :graph/remove
                           :graph/add
                           :graph/save
+                          :graph/re-index
                           :editor/cycle-todo
                           :editor/up
                           :editor/down
@@ -643,6 +651,7 @@
     :graph/remove
     :graph/add
     :graph/save
+    :graph/re-index
     :sidebar/clear
     :sidebar/open-today-page
     :search/re-index

+ 2 - 2
src/main/frontend/modules/shortcut/dicts.cljc

@@ -90,6 +90,7 @@
    :graph/remove                   "Remove a graph"
    :graph/add                      "Add a graph"
    :graph/save                     "Save current graph to disk"
+   :graph/re-index                 "Re-index current graph"
    :command/run                    "Run git command"
    :go/home                        "Go to home"
    :go/all-pages                   "Go to all pages"
@@ -106,7 +107,7 @@
    :ui/toggle-help                 "Toggle help"
    :ui/toggle-theme                "Toggle between dark/light theme"
    :ui/toggle-contents             "Toggle Contents in sidebar"
-  ;;  :ui/open-new-window             "Open another window"
+   ;;  :ui/open-new-window             "Open another window"
    :command/toggle-favorite        "Add to/remove from favorites"
    :editor/open-file-in-default-app "Open file in default app"
    :editor/open-file-in-directory   "Open file in parent directory"
@@ -1016,7 +1017,6 @@
              :command.editor/copy-text                "Copia le selezioni come testo"
              :command.pdf/close                       "Chiudi anteprima PDF"}
 
-   
    :tr      {:shortcut.category/basics "Temel bilgiler"
              :shortcut.category/formatting "Biçimlendirme"
              :shortcut.category/navigating "Gezinme"

+ 5 - 3
src/main/frontend/state.cljs

@@ -365,9 +365,11 @@
                 (get (sub-config) repo)))))
 
 (defn enable-flashcards?
-  [repo]
-  (not (false? (:feature/enable-flashcards?
-                (get (sub-config) repo)))))
+  ([]
+   (enable-flashcards? (get-current-repo)))
+  ([repo]
+   (not (false? (:feature/enable-flashcards?
+                 (get (sub-config) repo))))))
 
 (defn export-heading-to-list?
   []

+ 1 - 1
src/main/frontend/version.cljs

@@ -1,3 +1,3 @@
 (ns frontend.version)
 
-(defonce version "0.7.7")
+(defonce version "0.7.9")

+ 29 - 0
src/test/frontend/db/model_test.cljs

@@ -82,4 +82,33 @@
 ;;       1 (count a-ref-blocks)
 ;;       (set ["b" "c"]) (set alias-names))))
 
+(deftest get-pages-that-mentioned-page-with-show-journal
+  (load-test-files [{:file/path "journals/2020_08_15.md"
+                     :file/content "link 1 to [[page ONE]] and link to [[generic page]]"}
+                    {:file/path "journals/2020_09_18.md"
+                     :file/content "link 2 to [[page ONE]]"}
+                    {:file/path "pages/page ONE.md"
+                     :file/content "tags:: a tag
+- page one has link to [[Dec 26th, 2020]] journal page"}
+                    {:file/path "pages/a tag.md"
+                     :file/content "i'm a tag"}
+                    {:file/path "pages/generic page.md"
+                     :file/content "- link to page one [[page ONE]]"}])
+
+  (is (= '("sep 18th, 2020" "aug 15th, 2020" "generic page")
+         (map first (model/get-pages-that-mentioned-page test-helper/test-db "page ONE" true)))
+      "Must be 'generic page' + 2 journals")
+
+  (is (= '("generic page")
+         (map first (model/get-pages-that-mentioned-page test-helper/test-db "page ONE" false)))
+      "Must be only 'generic page'")
+
+  (is (= '("aug 15th, 2020")
+         (map first (model/get-pages-that-mentioned-page test-helper/test-db "generic page" true)))
+      "Must show only 'aug 15th, 2020'")
+
+  (is (= '()
+         (map first (model/get-pages-that-mentioned-page test-helper/test-db "generic page" false)))
+      "Must be empty"))
+
 #_(cljs.test/test-ns 'frontend.db.model-test)

+ 55 - 1
src/test/frontend/handler/editor_test.cljs

@@ -1,6 +1,9 @@
 (ns frontend.handler.editor-test
   (:require [frontend.handler.editor :as editor]
-            [clojure.test :refer [deftest is testing are]]))
+            [clojure.test :refer [deftest is testing are]]
+            [frontend.util :as util]
+            [frontend.state :as state]
+            [frontend.util.cursor :as cursor]))
 
 (deftest extract-nearest-link-from-text-test
   (testing "Page, block and tag links"
@@ -42,7 +45,58 @@
           "[[https://github.com/logseq/logseq][logseq]] is #awesome :)" 0 editor/url-regex))
       "Finds url in org link correctly"))
 
+(defn- keydown-not-matched-handler
+  "Spied version of editor/keydown-not-matched-handler"
+  [{:keys [value key format cursor-pos] :or {key "#" format "markdown"}}]
+  ;; Reset editor action in order to test result
+  (state/set-editor-action! nil)
+  ;; Default cursor pos to end of line
+  (let [pos (or cursor-pos (count value))]
+    (with-redefs [util/get-selected-text (constantly false)
+                  state/get-input (constantly #js {:value value})
+                  cursor/pos (constantly pos)
+                  cursor/get-caret-pos (constantly {})]
+      ((editor/keydown-not-matched-handler format)
+       #js {:key key} nil))))
+
+(deftest keydown-not-matched-handler-test
+  (testing "Tag autocompletion"
+    (keydown-not-matched-handler {:value "Some words "})
+    (is (= :page-search-hashtag (state/get-editor-action))
+        "Autocomplete tags if starting new word")
+
+    (keydown-not-matched-handler {:value ""})
+    (is (= :page-search-hashtag (state/get-editor-action))
+        "Autocomplete tags if starting a new line")
+
+    (keydown-not-matched-handler {:value "Some words" :cursor-pos 0})
+    (is (= :page-search-hashtag (state/get-editor-action))
+        "Autocomplete tags if there is are existing words and cursor is at start of line")
+
+    (keydown-not-matched-handler {:value "Some words" :cursor-pos 5})
+    (is (= :page-search-hashtag (state/get-editor-action))
+        "Autocomplete tags if there is whitespace before cursor")
+
+    (keydown-not-matched-handler {:value "String"})
+    (is (= nil (state/get-editor-action))
+        "Don't autocomplete tags if at end of word")
+
+    (keydown-not-matched-handler {:value "String" :cursor-pos 3})
+    (is (= nil (state/get-editor-action))
+        "Don't autocomplete tags if in middle of word")
+
+    (keydown-not-matched-handler {:value "`One backtick "})
+    (is (= :page-search-hashtag (state/get-editor-action))
+        "Autocomplete tags if only one backtick")
+
+    (keydown-not-matched-handler {:value "`String#gsub and String`"
+                                  :cursor-pos (dec (count "`String#gsub and String`"))})
+    (is (= nil (state/get-editor-action))
+        "Don't autocomplete tags within backticks")
+    (state/set-editor-action! nil)))
+
 (defn- set-marker
+  "Spied version of editor/set-marker"
   [marker content format]
   (let [actual-content (atom nil)]
     (with-redefs [editor/save-block-if-changed! (fn [_ content]

+ 1 - 1
src/test/frontend/handler/repo_test.cljs

@@ -14,7 +14,7 @@
   (let [graph-dir "src/test/docs"
         _ (docs-graph-helper/clone-docs-repo-if-not-exists graph-dir)
         files (gp-cli/build-graph-files graph-dir)
-        _ (repo-handler/parse-files-and-load-to-db! test-helper/test-db files {:re-render? false})
+        _ (repo-handler/parse-files-and-load-to-db! test-helper/test-db files {:re-render? false :verbose false})
         db (conn/get-db test-helper/test-db)]
 
     (docs-graph-helper/docs-graph-assertions db (map :file/path files))))

+ 1 - 1
src/test/frontend/test/helper.cljs

@@ -22,4 +22,4 @@
     (conn/start! current-repo)))
 
 (defn load-test-files [files]
-  (repo-handler/parse-files-and-load-to-db! test-db files {:re-render? false}))
+  (repo-handler/parse-files-and-load-to-db! test-db files {:re-render? false :verbose false}))

+ 10 - 5
templates/config.edn

@@ -12,7 +12,7 @@
  :preferred-workflow :now
 
  ;; The app will ignore those directories or files.
- ;; E.g. "/archived" "/test.md"
+ ;; E.g. :hidden ["/archived" "/test.md" "../assets/archived"]
  :hidden []
 
  ;; When creating the new journal page, the app will use your template if there is one.
@@ -166,8 +166,13 @@
     :inputs [:today :7d-after]
     :collapsed? false}]}
 
- ;; Add your own commands to speedup.
- ;; E.g. [["js" "Javascript"]]
+ ;; Add your own commands to slash menu to speedup.
+ ;; E.g.
+ ;; :commands
+ ;; [
+ ;; ["js" "Javascript"]
+ ;; ["md" "Markdown"]
+ ;; ]
  :commands
  []
 
@@ -209,14 +214,14 @@
  ;; :srs/initial-interval 4
 
  ;; hide specific properties for blocks
- ;; E.g. #{:created-at :updated-at}
+ ;; E.g. :block-hidden-properties #{:created-at :updated-at}
  ;; :block-hidden-properties #{}
 
  ;; Enable all your properties to have corresponding pages
  :property-pages/enabled? true
 
  ;; Properties to exclude from having property pages
- ;; E.g. #{:duration :author}
+ ;; E.g.:property-pages/excludelist #{:duration :author}
  ;; :property-pages/excludelist
 
  ;; logbook setup