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

pull/3954/head
Junyi Du 2022-01-19 01:34:28 +08:00 committed by Tienson Qin
parent 226541ff5e
commit 694dfe52ec
5 changed files with 51 additions and 41 deletions

View File

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

View File

@ -98,6 +98,7 @@
(rum/defc page-search < rum/reactive (rum/defc page-search < rum/reactive
{:will-unmount (fn [state] (reset! editor-handler/*selected-text nil) state)} {:will-unmount (fn [state] (reset! editor-handler/*selected-text nil) state)}
"Editor embedded page searching"
[id format] [id format]
(when (state/sub :editor/show-page-search?) (when (state/sub :editor/show-page-search?)
(let [pos (:editor/last-saved-cursor @state/state) (let [pos (:editor/last-saved-cursor @state/state)
@ -116,7 +117,7 @@
matched-pages (when-not (string/blank? q) matched-pages (when-not (string/blank? q)
(editor-handler/get-matched-pages q)) (editor-handler/get-matched-pages q))
matched-pages (cond 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 matched-pages
(empty? matched-pages) (empty? matched-pages)

View File

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

View File

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

View File

@ -55,13 +55,18 @@
(swap! indices assoc-in [repo :blocks] indice) (swap! indices assoc-in [repo :blocks] indice)
indice)) indice))
(defn original-page-name->index
[p] {:name (util/search-normalize p)
:original-name p})
(defn make-pages-indice! (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)] (when-let [repo (state/get-current-repo)]
(let [pages (->> (db/get-pages (state/get-current-repo)) (let [pages (->> (db/get-pages (state/get-current-repo))
(remove string/blank?) (remove string/blank?)
(map (fn [p] {:name (util/search-normalize p) (map original-page-name->index)
:original-name p}))
(bean/->js)) (bean/->js))
indice (fuse. pages indice (fuse. pages
(clj->js {:keys ["name"] (clj->js {:keys ["name"]