first rough version of searching notes on the commandline
This commit is contained in:
parent
c6f8c21f38
commit
348f4ab085
|
@ -0,0 +1,71 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"fmt"
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"strconv"
|
||||||
|
|
||||||
|
"git.sr.ht/~ewintr/shitty-ssg/cmd/note-cli/note"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
notesPath := os.Getenv("NOTES_PATH")
|
||||||
|
if notesPath == "" {
|
||||||
|
log.Fatal("no notes directory to parse")
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(os.Args) != 2 {
|
||||||
|
log.Fatal("exactly one search term is required as parameter")
|
||||||
|
}
|
||||||
|
searchTerm := os.Args[1]
|
||||||
|
|
||||||
|
var notes note.Notes
|
||||||
|
if err := filepath.Walk(notesPath, func(path string, info os.FileInfo, err error) error {
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if !info.IsDir() && filepath.Ext(path) == ".adoc" {
|
||||||
|
if err := notes.AddFileNote(path); err != nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}); err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
notes = notes.FilterByTerm(searchTerm)
|
||||||
|
if len(notes) == 0 {
|
||||||
|
fmt.Println("Found nothing.")
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
for i, n := range notes {
|
||||||
|
fmt.Printf("%d) %s\n", i, n.Title)
|
||||||
|
}
|
||||||
|
reader := bufio.NewReader(os.Stdin)
|
||||||
|
r, _, err := reader.ReadRune()
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
c := string(r)
|
||||||
|
switch c {
|
||||||
|
case "q":
|
||||||
|
return
|
||||||
|
default:
|
||||||
|
i, err := strconv.Atoi(c)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
if i < 0 || i >= len(notes) {
|
||||||
|
fmt.Println("number out of range")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
fmt.Printf("\n\n%s\n\n%s\n\n", notes[i].Title, notes[i].Content)
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,76 @@
|
||||||
|
package note
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"git.sr.ht/~ewintr/shitty-ssg/pkg/adoc"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Kind string
|
||||||
|
|
||||||
|
type Tag string
|
||||||
|
|
||||||
|
const (
|
||||||
|
KIND_NOTE = Kind("note")
|
||||||
|
KIND_PRIVATE_NOTE = Kind("private_note")
|
||||||
|
KIND_WORK_NOTE = Kind("work_note")
|
||||||
|
KIND_INVALID = Kind("")
|
||||||
|
)
|
||||||
|
|
||||||
|
func mapKind(akind adoc.Kind) Kind {
|
||||||
|
nkind, ok := map[adoc.Kind]Kind{
|
||||||
|
adoc.KIND_NOTE: KIND_NOTE,
|
||||||
|
adoc.KIND_PRIVATE_NOTE: KIND_PRIVATE_NOTE,
|
||||||
|
adoc.KIND_WORK_NOTE: KIND_WORK_NOTE,
|
||||||
|
}[akind]
|
||||||
|
if !ok {
|
||||||
|
return KIND_INVALID
|
||||||
|
}
|
||||||
|
|
||||||
|
return nkind
|
||||||
|
}
|
||||||
|
|
||||||
|
type Note struct {
|
||||||
|
doc *adoc.ADoc
|
||||||
|
Title string
|
||||||
|
Kind Kind
|
||||||
|
Tags []Tag
|
||||||
|
Content string
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewNote(doc *adoc.ADoc) *Note {
|
||||||
|
var paragraphs []string
|
||||||
|
for _, be := range doc.Content {
|
||||||
|
paragraphs = append(paragraphs, be.Text())
|
||||||
|
}
|
||||||
|
content := strings.Join(paragraphs, "\n\n")
|
||||||
|
|
||||||
|
var tags []Tag
|
||||||
|
for _, t := range doc.Tags {
|
||||||
|
tags = append(tags, Tag(t))
|
||||||
|
}
|
||||||
|
|
||||||
|
return &Note{
|
||||||
|
doc: doc,
|
||||||
|
Kind: mapKind(doc.Kind),
|
||||||
|
Title: doc.Title,
|
||||||
|
Tags: tags,
|
||||||
|
Content: content,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n *Note) Contains(term string) bool {
|
||||||
|
for _, t := range n.Tags {
|
||||||
|
if strings.ToLower(string(t)) == strings.ToLower(term) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, w := range strings.Split(n.Content, " ") {
|
||||||
|
if strings.ToLower(w) == strings.ToLower(term) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
|
@ -0,0 +1,33 @@
|
||||||
|
package note
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io/ioutil"
|
||||||
|
|
||||||
|
"git.sr.ht/~ewintr/shitty-ssg/pkg/adoc"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Notes []*Note
|
||||||
|
|
||||||
|
func (n *Notes) AddFileNote(fPath string) error {
|
||||||
|
content, err := ioutil.ReadFile(fPath)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
note := NewNote(adoc.New(string(content)))
|
||||||
|
if note.Kind != KIND_INVALID {
|
||||||
|
*n = append(*n, note)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n *Notes) FilterByTerm(term string) Notes {
|
||||||
|
found := Notes{}
|
||||||
|
for _, note := range *n {
|
||||||
|
if note.Contains(term) {
|
||||||
|
found = append(found, note)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return found
|
||||||
|
}
|
|
@ -7,11 +7,12 @@ import (
|
||||||
|
|
||||||
const (
|
const (
|
||||||
KIND_NOTE = Kind("note")
|
KIND_NOTE = Kind("note")
|
||||||
|
KIND_PRIVATE_NOTE = Kind("private_note")
|
||||||
|
KIND_WORK_NOTE = Kind("work_note")
|
||||||
KIND_VKV = Kind("vkv")
|
KIND_VKV = Kind("vkv")
|
||||||
KIND_STORY = Kind("story")
|
KIND_STORY = Kind("story")
|
||||||
KIND_SNIPPET = Kind("snippet")
|
KIND_SNIPPET = Kind("snippet")
|
||||||
KIND_ESSAY = Kind("essay")
|
KIND_ESSAY = Kind("essay")
|
||||||
KIND_WORK = Kind("work")
|
|
||||||
KIND_ARTICLE = Kind("article")
|
KIND_ARTICLE = Kind("article")
|
||||||
KIND_TUTORIAL = Kind("tutorial")
|
KIND_TUTORIAL = Kind("tutorial")
|
||||||
KIND_UNKNOWN = Kind("unknown")
|
KIND_UNKNOWN = Kind("unknown")
|
||||||
|
@ -28,7 +29,8 @@ func NewKind(text string) Kind {
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, k := range []string{
|
for _, k := range []string{
|
||||||
"note", "vkv", "story", "snippet",
|
"note", "private_note", "work_note", "vkv",
|
||||||
|
"story", "snippet",
|
||||||
"essay", "tutorial", "work", "article",
|
"essay", "tutorial", "work", "article",
|
||||||
} {
|
} {
|
||||||
if k == text {
|
if k == text {
|
||||||
|
|
Loading…
Reference in New Issue