Home

ugit @1187c9eeb3b9f062ff90370ccd6c5e230067dd03 - refs - log -
-
https://git.jolheiser.com/ugit.git
The code powering this h*ckin' site
ugit / internal / html / repo_search.templ
- raw
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
package html

import "fmt"
import "go.jolheiser.com/ugit/internal/git"

type SearchContext struct {
  BaseContext
	RepoHeaderComponentContext
	Results []git.GrepResult
}

func (s SearchContext) DedupeResults() [][]git.GrepResult {
	var (
		results        [][]git.GrepResult
		currentFile    string
		currentResults []git.GrepResult
	)
	for _, result := range s.Results {
		if result.File == currentFile {
			currentResults = append(currentResults, result)
			continue
		}
		if currentFile != "" {
			results = append(results, currentResults)
		}
		currentFile = result.File
		currentResults = []git.GrepResult{result}
	}

	return results
}

templ RepoSearch(sc SearchContext) {
	@base(sc.BaseContext) {
		@repoHeaderComponent(sc.RepoHeaderComponentContext)
		<form method="get"><label class="text-text">Search <input class="rounded p-1 mt-2 bg-mantle focus:border-lavender focus:outline-none focus:ring-0" id="search" type="text" name="q" placeholder="search"/></label></form>
		for _, results := range sc.DedupeResults() {
			@repoSearchResult(sc.RepoHeaderComponentContext.Name, sc.RepoHeaderComponentContext.Ref, results)
		}
	}
	<script>
		const search = new URLSearchParams(window.location.search).get("q");
		if (search !== "") document.querySelector("#search").value = search;
	</script>
}

templ repoSearchResult(repo, ref string, results []git.GrepResult) {
	<div class="text-text mt-5"><a class="underline decoration-text/50 decoration-dashed hover:decoration-solid" href={ templ.SafeURL(fmt.Sprintf("/%s/tree/%s/%s#L%d", repo, ref, results[0].File, results[0].Line)) }>{ results[0].File }</a></div>
	<div class="code">@templ.Raw(results[0].Content)</div>
	if len(results) > 1 {
		<details class="text-text cursor-pointer">
			<summary>{ fmt.Sprintf("%d ", len(results[1:])) }more</summary>
			for _, result := range results[1:] {
				<div class="text-text mt-5"><a class="underline decoration-text/50 decoration-dashed hover:decoration-solid" href={ templ.SafeURL(fmt.Sprintf("/%s/tree/%s/%s#L%d", repo, ref, result.File, result.Line)) }>{ results[0].File }</a></div>
				<div class="code">@templ.Raw(result.Content)</div>
			}
		</details>
	}
}