Home

ugit @main - refs - log -
-
https://git.jolheiser.com/ugit.git
The code powering this h*ckin' site
ugit / internal / html / repo_search.go
- 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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
package html

import (
	_ "embed"
	"fmt"

	"go.jolheiser.com/ugit/internal/git"
	. "maragu.dev/gomponents"
	. "maragu.dev/gomponents/html"
)

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

func (s SearchContext) DedupeResults() [][]git.GrepResult {
	var (
		results     [][]git.GrepResult
		currentFile string
	)
	var idx int
	for _, result := range s.Results {
		if result.File == currentFile {
			results[idx-1] = append(results[idx-1], result)
			continue
		}
		results = append(results, []git.GrepResult{result})
		currentFile = result.File
		idx++
	}

	return results
}

//go:embed repo_search.js
var repoSearchJS string

func repoSearchResult(repo, ref string, results []git.GrepResult) Node {
	return Group([]Node{
		Div(Class("text-text mt-5"),
			A(Class("underline decoration-text/50 decoration-dashed hover:decoration-solid"), Href(fmt.Sprintf("/%s/tree/%s/%s#L%d", repo, ref, results[0].File, results[0].Line)), Text(results[0].File)),
		),
		Div(Class("code"),
			Raw(results[0].Content),
		),
		If(len(results) > 1,
			Details(Class("text-text cursor-pointer"),
				Summary(Textf("%d more", len(results[1:]))),
				Map(results[1:], func(result git.GrepResult) Node {
					return Group([]Node{
						Div(Class("text-text mt-5 ml-5"),
							A(Class("underline decoration-text/50 decoration-dashed hover:decoration-solid"), Href(fmt.Sprintf("/%s/tree/%s/%s#L%d", repo, ref, result.File, result.Line)), Text(results[0].File)),
						),
						Div(Class("code ml-5"),
							Raw(result.Content),
						),
					})
				}),
			),
		),
	})
}

func RepoSearchTemplate(sc SearchContext) Node {
	dedupeResults := sc.DedupeResults()
	return base(sc.BaseContext, []Node{
		repoHeaderComponent(sc.RepoHeaderComponentContext),
		Map(dedupeResults, func(results []git.GrepResult) Node {
			return repoSearchResult(sc.RepoHeaderComponentContext.Name, sc.RepoHeaderComponentContext.Ref, results)
		}),
		If(len(dedupeResults) == 0,
			P(Class("text-text mt-5 text-lg"), Text("No results")),
		),
		Script(Text(repoSearchJS)),
	}...)
}