Browse Source

enhance: page name index sync normalization; e2e alias diacritic test

Junyi Du 3 years ago
parent
commit
694dfe52ec

+ 39 - 36
e2e-tests/page-refs.spec.ts

@@ -8,7 +8,7 @@ import { IsMac, createRandomPage, newBlock, newInnerBlock, randomString, lastInn
  * Consider diacritics
  ***/
 
-async function alias_test (page, page_name: string){
+async function alias_test (page, page_name: string, search_kws: string[]){
   let hotkeyOpenLink = 'Control+o'
   let hotkeyBack = 'Control+['
   if (IsMac) {
@@ -69,40 +69,43 @@ async function alias_test (page, page_name: string){
   // TODO: test alias from graph clicking
 
   // test alias from search
-  await page.click('#search-button')
-  await page.waitForSelector('[placeholder="Search or create page"]')
-  await page.fill('[placeholder="Search or create page"]', alias_name)
-  await page.waitForTimeout(500)
-
-  const results = await page.$$('#ui__ac-inner .block')
-  expect(results.length).toEqual(3) // page + block + alias property
-
-  // test search results
-  expect(await results[0].innerText()).toContain("Alias -> " + target_name)
-  expect(await results[0].innerText()).toContain(alias_name)
-  expect(await results[1].innerText()).toContain(parent_title)
-  expect(await results[1].innerText()).toContain("[[" + alias_name + "]]")
-  expect(await results[2].innerText()).toContain(target_name)
-  expect(await results[2].innerText()).toContain("alias:: [[" + alias_name + "]]")
-
-  // test search entering (page)
-  page.keyboard.press("Enter")
-  await page.waitForNavigation()
-  await page.waitForTimeout(100)
-  await lastInnerBlock(page)
-  expect(await page.inputValue(':nth-match(textarea, 1)')).toBe(alias_test_content_3)
-
-  // test search clicking (block)
-  await page.click('#search-button')
-  await page.waitForSelector('[placeholder="Search or create page"]')
-  await page.fill('[placeholder="Search or create page"]', alias_name)
-  await page.waitForTimeout(500)
-  page.click(":nth-match(.menu-link, 2)")
-  await page.waitForNavigation()
-  await page.waitForTimeout(100)
-  await lastInnerBlock(page)
-  expect(await page.inputValue(':nth-match(textarea, 1)')).toBe("[[" + alias_name + "]]")
-  await page.keyboard.press(hotkeyBack)
+  for (let kw of search_kws){
+    let kw_name = kw + ' alias ' + rand
+
+    await page.click('#search-button')
+    await page.waitForSelector('[placeholder="Search or create page"]')
+    await page.fill('[placeholder="Search or create page"]', kw_name)
+    await page.waitForTimeout(500)
+
+    const results = await page.$$('#ui__ac-inner .block')
+    expect(results.length).toEqual(3) // page + block + alias property
+
+    // test search results
+    expect(await results[0].innerText()).toContain("Alias -> " + target_name)
+    expect(await results[0].innerText()).toContain(alias_name)
+    expect(await results[1].innerText()).toContain(parent_title)
+    expect(await results[1].innerText()).toContain("[[" + alias_name + "]]")
+    expect(await results[2].innerText()).toContain(target_name)
+    expect(await results[2].innerText()).toContain("alias:: [[" + alias_name + "]]")
+
+    // test search entering (page)
+    page.keyboard.press("Enter")
+    await page.waitForNavigation()
+    await page.waitForTimeout(100)
+    await lastInnerBlock(page)
+    expect(await page.inputValue(':nth-match(textarea, 1)')).toBe(alias_test_content_3)
+
+    // test search clicking (block)
+    await page.click('#search-button')
+    await page.waitForSelector('[placeholder="Search or create page"]')
+    await page.fill('[placeholder="Search or create page"]', kw_name)
+    await page.waitForTimeout(500)
+    page.click(":nth-match(.menu-link, 2)")
+    await page.waitForNavigation()
+    await page.waitForTimeout(100)
+    await lastInnerBlock(page)
+    expect(await page.inputValue(':nth-match(textarea, 1)')).toBe("[[" + alias_name + "]]")
+    await page.keyboard.press(hotkeyBack)}
 
   // TODO: search clicking (alias property)
 }
@@ -113,5 +116,5 @@ async function alias_test (page, page_name: string){
 
 
 test('page diacritic alias', async ({ page }) => {
-  await alias_test(page, "ü")
+  await alias_test(page, "ü", ["ü", "ü", "Ü"])
 })

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

@@ -98,6 +98,7 @@
 
 (rum/defc page-search < rum/reactive
   {:will-unmount (fn [state] (reset! editor-handler/*selected-text nil) state)}
+  "Editor embedded page searching"
   [id format]
   (when (state/sub :editor/show-page-search?)
     (let [pos (:editor/last-saved-cursor @state/state)
@@ -116,7 +117,7 @@
               matched-pages (when-not (string/blank? q)
                               (editor-handler/get-matched-pages q))
               matched-pages (cond
-                              (contains? (set (map util/search-normalize matched-pages)) (util/search-normalize (string/trim q)))
+                              (contains? (set (map util/page-name-sanity-lc matched-pages)) (util/page-name-sanity-lc (string/trim q)))  ;; TODO: merge with frontend.search.exact-matched?
                               matched-pages
 
                               (empty? matched-pages)

+ 2 - 2
src/main/frontend/components/search.cljs

@@ -97,8 +97,8 @@
           search-mode (state/sub :search/mode)
           new-page (if (or
                         (and (seq pages)
-                             (= (util/safe-search-normalize search-q)
-                                (util/safe-search-normalize (:data (first pages)))))
+                             (= (util/page-name-sanity-lc search-q)
+                                (util/page-name-sanity-lc (:data (first pages)))))
                         (nil? result)
                         all?)
                      []

+ 5 - 4
src/main/frontend/search.cljs

@@ -100,7 +100,7 @@
     (protocol/transact-blocks! engine data)))
 
 (defn exact-matched?
-  "Check if two strings the same thing"
+  "Check if two strings points toward same file"
   [q match]
   (when (and (string? q) (string? match))
     (boolean
@@ -175,8 +175,9 @@
                                       (set))
                 pages-to-add (->> (filter (fn [page]
                                             (contains? pages-to-add-set (:db/id page))) pages-result)
-                                  (map (fn [p] {:name (or (:block/original-name p)
-                                                          (:block/name p))})))
+                                  (map (fn [p] (or (:block/original-name p)
+                                                   (:block/name p))))
+                                  (map search-db/original-page-name->index))
                 pages-to-remove-set (->> (remove :added pages)
                                          (map :v))]
             (swap! search-db/indices update-in [repo :pages]
@@ -186,7 +187,7 @@
                          (.remove indice
                                   (fn [page]
                                     (= (util/safe-page-name-sanity-lc page-name)
-                                       (util/safe-page-name-sanity-lc (gobj/get page "name"))))))
+                                       (util/safe-page-name-sanity-lc (gobj/get page "original-name"))))))
                        (when (seq pages-to-add)
                          (doseq [page pages-to-add]
                            (.add indice (bean/->js page)))))

+ 7 - 2
src/main/frontend/search/db.cljs

@@ -55,13 +55,18 @@
     (swap! indices assoc-in [repo :blocks] indice)
     indice))
 
+(defn original-page-name->index
+  [p] {:name (util/search-normalize p)
+       :original-name p})
+
 (defn make-pages-indice!
+  "Build a page indice from scratch.
+   Incremental page indice is implemented in frontend.search.sync-search-indice!"
   []
   (when-let [repo (state/get-current-repo)]
     (let [pages (->> (db/get-pages (state/get-current-repo))
                      (remove string/blank?)
-                     (map (fn [p] {:name (util/search-normalize p)
-                                   :original-name p}))
+                     (map original-page-name->index)
                      (bean/->js))
           indice (fuse. pages
                         (clj->js {:keys ["name"]