search

search, extensive searchbar functionality, can grep out strings in files and their filename

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

app.rc

1	fn 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

1	package main
2	
3	import (
4		"bufio"
5		"fmt"
6		"html"
7		"os"
8		"os/exec"
9		"strings"
10	)
11	
12	const (
13		maxLength = 35
14		baseDir   = "/var/www/werc/sites/c.bauherren.ovh"
15	)
16	
17	func 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