search

Mirrored from GitHub

git clone https://github.com/christc4/search.git

Jump to: README.md app.rc sbar.tpl tank.go


README.md

1# search
2
3## enabling in werc
4
5In your `/_werc/config` add the line `conf_enable_searching`
6
7## tank
8
9tank is a small Go program that uses ripgrep, to compile run
10
11`go build -o tank tank.go`
12
13Place in /lib/plan9/bin or your bin dir. that werc sources
14
15<hr>
16
17See, <https://github.com/risingThumb/search/> for a shell-only approach

app.rc

1fn conf_enable_searching {
2    enable_searching=yes
3    conf_enable_app search
4        ll_add handlers_bar_left tpl_handler apps/search/sbar.tpl
5}
6

sbar.tpl

1<div>
2	<form action="" method="POST" enctype="multipart/form-data">
3	<input type="search" name="searching_query" placeholder="Search..." required><br>
4	<input type="submit" name="searching_preview" value="Search" style="display:none">
5	<input type="checkbox" id="search_this_directory" name="search_app_search_directory" value="search_app_search_directory">
6	<label for="search_this_directory">Include filenames?</label>
7	</form>
8</div>
9
10% if(! ~ $#post_arg_search_app_search_directory 0){
11%	filenames=`{walk sites/$SERVER_NAME | grep -v -e '_werc' -e '.meta' | grep -i $post_arg_searching_query}
12	<p>Filenames:
13%		for(match in $filenames){
14%			href_path=`{echo $match | sed -e 's/.md//g' -e 's|sites/'$SERVER_NAME'||g'}
15			<a href="%($href_path%)">%($href_path%)</a>
16%		}
17%		if(~ $#filenames 0 || ){
18			<p>No filename matches for "<i>%($"post_arg_searching_query%)</i>"</p>
19%		}
20% }
21
22% if (! ~ $"post_arg_searching_preview) {
23%	tank $post_arg_searching_query 
24% }
25
26

tank.go

1package main
2
3import (
4	"bufio"
5	"fmt"
6	"html"
7	"os"
8	"os/exec"
9	"strings"
10)
11
12const (
13	maxLength = 35
14	baseDir   = "/var/www/werc/sites/c.bauherren.ovh"
15)
16
17func main() {
18	if len(os.Args) < 2 {
19		fmt.Println("Provide one search term")
20		os.Exit(1)
21	}
22
23	searchTerm := os.Args[1]
24	if len(searchTerm) > maxLength {
25		fmt.Printf("Search term is too long. Maximum allowed length is %d characters.\n", maxLength)
26		os.Exit(1)
27	}
28
29	fmt.Printf("<link rel=stylesheet href=/_werc/pub/search-results.css><div id=\"search-results\">\n")
30	fmt.Printf("<h3>Search results for: \"%s\"</h3>\n", html.EscapeString(searchTerm))
31
32	cmd := exec.Command("rg", "-i",  "--no-heading", "--with-filename", "--line-number", searchTerm, "--glob", "*.md", baseDir)
33	output, err := cmd.Output()
34	if err != nil {
35		fmt.Println("No results")
36		os.Exit(1)
37	}
38
39	scanner := bufio.NewScanner(strings.NewReader(string(output)))
40	for scanner.Scan() {
41		line := scanner.Text()
42		parts := strings.SplitN(line, ":", 3)
43		if len(parts) < 3 {
44			continue
45		}
46
47		file := strings.TrimPrefix(parts[0], baseDir)
48		file = strings.ReplaceAll(file, ".md", "")
49		lineNumber := parts[1]
50		content := parts[2]
51
52		escapedContent := html.EscapeString(content)
53		formattedContent := strings.ReplaceAll(escapedContent, searchTerm, "<b>"+searchTerm+"</b>")
54
55		fmt.Printf("<div class=\"search-item\">\n")
56		fmt.Printf("<a href=\"%s\">%s</a> (Line %s)<br>\n", file, file, lineNumber)
57		fmt.Printf("<p>\"%s\"</p>\n", formattedContent)
58		fmt.Printf("</div>\n")
59	}
60
61	fmt.Printf("</div>\n")
62
63	if err := scanner.Err(); err != nil {
64		fmt.Println("Error reading output:", err)
65		os.Exit(1)
66	}
67}
68