Show page titles in wiki search results (#6048)

Replace wiki page filenames with page titles in the search results,
fixing the problem with them showing unreadable URI-encoded names.

(cherry picked from commit fc31fa0eeb)
This commit is contained in:
Oto Šťáva 2024-11-23 14:37:16 +01:00 committed by forgejo-backport-action
parent c089228bfa
commit 2374f8f47d
4 changed files with 41 additions and 6 deletions

View file

@ -408,18 +408,42 @@ func DeleteWiki(ctx context.Context, repo *repo_model.Repository) error {
return nil
}
func SearchWikiContents(ctx context.Context, repo *repo_model.Repository, keyword string) ([]*git.GrepResult, error) {
type SearchContentsResult struct {
*git.GrepResult
Title string
}
func SearchWikiContents(ctx context.Context, repo *repo_model.Repository, keyword string) ([]SearchContentsResult, error) {
gitRepo, err := git.OpenRepository(ctx, repo.WikiPath())
if err != nil {
return nil, err
}
defer gitRepo.Close()
return git.GrepSearch(ctx, gitRepo, keyword, git.GrepOptions{
grepRes, err := git.GrepSearch(ctx, gitRepo, keyword, git.GrepOptions{
ContextLineNumber: 0,
IsFuzzy: true,
RefName: repo.GetWikiBranchName(),
MaxResultLimit: 10,
MatchesPerFile: 3,
})
if err != nil {
return nil, err
}
res := make([]SearchContentsResult, 0, len(grepRes))
for _, entry := range grepRes {
wp, err := GitPathToWebPath(entry.Filename)
if err != nil {
return nil, err
}
_, title := WebPathToUserTitle(wp)
res = append(res, SearchContentsResult{
GrepResult: entry,
Title: title,
})
}
return res, nil
}

View file

@ -1,7 +1,7 @@
{{if .Results}}
{{range .Results}}
<a class="item tw-max-w-[80vw]" href="{{$.RepoLink}}/wiki/{{.Filename}}">
<b class="tw-block tw-mb-2 tw-whitespace-break-spaces">{{.Filename}}</b>
<b class="tw-block tw-mb-2 tw-whitespace-break-spaces">{{.Title}}</b>
{{range .LineCodes}}
<p class="tw-my-0 tw-whitespace-break-spaces">{{.}}</p>
{{end}}

View file

@ -14,3 +14,14 @@ test(`Search for long titles and test for no overflow`, async ({page}, workerInf
// timeout is necessary because HTMX search could be slow
await expect(page.locator('#wiki-search a[href]')).toBeInViewport({ratio: 1});
});
test(`Search results show titles (and not file names)`, async ({page}, workerInfo) => {
test.skip(workerInfo.project.name === 'Mobile Safari', 'Fails as always, see https://codeberg.org/forgejo/forgejo/pulls/5326#issuecomment-2313275');
await page.goto('/user2/repo1/wiki');
await page.getByPlaceholder('Search wiki').fill('spaces');
await page.getByPlaceholder('Search wiki').click();
// workaround: HTMX listens on keyup events, playwright's fill only triggers the input event
// so we manually "type" the last letter
await page.getByPlaceholder('Search wiki').dispatchEvent('keyup');
await expect(page.locator('#wiki-search a[href] b')).toHaveText('Page With Spaced Name');
});

View file

@ -29,9 +29,9 @@ func TestWikiSearchContent(t *testing.T) {
return el.Text()
})
assert.Equal(t, []string{
"Home.md",
"Page-With-Spaced-Name.md",
"Unescaped File.md",
"Home",
"Page With Spaced Name",
"Unescaped File",
}, res)
}