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
***/
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)
for (let kw of search_kws){
let kw_name = kw + ' alias ' + rand
const results = await page.$$('#ui__ac-inner .block')
expect(results.length).toEqual(3) // page + block + alias property
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)
// 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 + "]]")
const results = await page.$$('#ui__ac-inner .block')
expect(results.length).toEqual(3) // page + block + alias property
// 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 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 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)
// 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, "ü", ["ü", "ü", "Ü"])
})

View File

@ -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)

View File

@ -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?)
[]

View File

@ -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)))))

View File

@ -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"]