This repository has been archived on 2025-09-28. You can view files and clone it, but you cannot make any changes to it's state, such as pushing and creating new issues, pull requests or comments.
plaintext-encyclopedia/database.go

62 lines
1.6 KiB
Go
Raw Normal View History

package main
import (
"io/fs"
"log"
"os"
2024-08-28 19:49:23 +02:00
"slices"
"strings"
2024-08-28 19:49:23 +02:00
"golang.org/x/text/search"
)
type Database struct {
Keys []string
Entries map[string]string
2024-08-28 19:49:23 +02:00
matcher *search.Matcher
}
func (db *Database) search(query string) []string { // returns keys (entry names)
results := []string{}
// compile patterns
queryPatterns := []*search.Pattern{}
for _, q := range strings.Split(query, " ") { // per word
queryPatterns = append(queryPatterns, db.matcher.CompileString(q))
}
// search
for _, k := range db.Keys {
patternsFound := 0
for _, p := range queryPatterns {
if s, _ := p.IndexString(db.Entries[k]); s != -1 {
patternsFound++ // this pattern was found
}
}
if patternsFound == len(queryPatterns) && !slices.Contains(results, k) {
// if all patterns were found, add the key (entry name) to the list
results = append(results, k)
}
}
return results
}
func BuildDB(directory string) Database {
logger := log.Default()
logger.Println("Building database")
// keys, entries
var keys []string
entries := map[string]string{}
// get files in directory and read them
2024-08-28 19:49:23 +02:00
directory = strings.TrimRight(directory, "/") // we don't need that last /, don't use the root directory /
entriesDirFs := os.DirFS(directory)
keys, err := fs.Glob(entriesDirFs, "*")
if err != nil { logger.Panicln(err) }
for _, k := range keys {
contentB, err := os.ReadFile(directory + "/" + k)
if err != nil { logger.Panicln(err) }
2024-08-28 19:49:23 +02:00
content := string(contentB)
entries[k] = content
}
2024-08-28 19:49:23 +02:00
matcher := search.New(ContentLanguage, search.IgnoreCase, search.IgnoreDiacritics)
return Database{Keys: keys, Entries: entries, matcher: matcher}
}