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 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()) gitRepo, err := git.OpenRepository(ctx, repo.WikiPath())
if err != nil { if err != nil {
return nil, err return nil, err
} }
defer gitRepo.Close() defer gitRepo.Close()
return git.GrepSearch(ctx, gitRepo, keyword, git.GrepOptions{ grepRes, err := git.GrepSearch(ctx, gitRepo, keyword, git.GrepOptions{
ContextLineNumber: 0, ContextLineNumber: 0,
IsFuzzy: true, IsFuzzy: true,
RefName: repo.GetWikiBranchName(), RefName: repo.GetWikiBranchName(),
MaxResultLimit: 10, MaxResultLimit: 10,
MatchesPerFile: 3, 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}} {{if .Results}}
{{range .Results}} {{range .Results}}
<a class="item tw-max-w-[80vw]" href="{{$.RepoLink}}/wiki/{{.Filename}}"> <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}} {{range .LineCodes}}
<p class="tw-my-0 tw-whitespace-break-spaces">{{.}}</p> <p class="tw-my-0 tw-whitespace-break-spaces">{{.}}</p>
{{end}} {{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 // timeout is necessary because HTMX search could be slow
await expect(page.locator('#wiki-search a[href]')).toBeInViewport({ratio: 1}); 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() return el.Text()
}) })
assert.Equal(t, []string{ assert.Equal(t, []string{
"Home.md", "Home",
"Page-With-Spaced-Name.md", "Page With Spaced Name",
"Unescaped File.md", "Unescaped File",
}, res) }, res)
} }