package main import ( "encoding/json" "flag" "fmt" "io/fs" "log" "os" "path/filepath" "strings" "code.sajari.com/docconv" ) var fileFormats = []string{".pdf", ".jpg", ".png", ".txt", ".docx", ".doc", ".tif", "tiff"} func buildIndex(dirs []string, old map[string]string) (map[string]string, error) { var index = old if index == nil { index = make(map[string]string) } for _, dir := range dirs { err := filepath.Walk(dir, func(path string, info fs.FileInfo, err error) error { if err != nil { return err } if info.IsDir() { return nil } supportedType := false for _, suffix := range fileFormats { if strings.HasSuffix(strings.ToLower(path), suffix) { supportedType = true break } } if !supportedType { return nil } _, exists := index[path] if exists { return nil } log.Println(path) str, err := docconv.ConvertPath(path) if err != nil { log.Println("Fail:", err) return nil } index[path] = str.Body return nil }) if err != nil { return nil, err } } return index, nil } func main() { force := flag.Bool("force", false, "Force generation of a full new index") flag.Parse() if len(flag.Args()) < 2 { fmt.Println("Usage:", os.Args[0], " [directories...]") os.Exit(1) } indexFile := flag.Arg(0) directories := flag.Args()[1:] var oldIndex = make(map[string]string) if !*force { oldBytes, err := os.ReadFile(indexFile) if err != nil { if !os.IsNotExist(err) { log.Panicln(err) } } if len(oldBytes) > 0 { err = json.Unmarshal(oldBytes, &oldIndex) if err != nil { log.Panicln(err) } } } index, err := buildIndex(directories, oldIndex) if err != nil { log.Panicln(err) } json, err := json.MarshalIndent(index, "", "\t") if err != nil { log.Panicln(json) } err = os.WriteFile(indexFile, json, 0o664) if err != nil { log.Panicln(err) } }