package main import ( "bytes" "fmt" "html/template" "log" "os" "strings" "github.com/Thibauth/bibtex" ) func printfne(format string, a ...interface{}) string { if fmt.Sprint(a...) == "" { return "" } else { return fmt.Sprintf(format, a...) } } func dashify(s string) string { return strings.Replace(s, "-", "–", -1) } func main() { fname := os.Args[1] f, err := os.Open(fname) if err != nil { log.Fatal(err) } db, err := bibtex.Parse(f, false) db.Flatten() db.Resolve() db.SplitNames() db.UnTex() tmpl := template.New("test.tmpl").Funcs(template.FuncMap{ "untex": bibtex.UnTex, "add": func(a, b int) int { return a + b }, "ne": printfne, "dashify": dashify, "contains": strings.ContainsAny, }) tmpl, err = tmpl.ParseFiles("test.tmpl") if err != nil { log.Fatal(err) } err = tmpl.Execute(os.Stdout, db) if err != nil { log.Fatal(err) } } func Marshal(db *bibtex.Database) string { var buf bytes.Buffer for _, id := range db.SNames { buf.WriteString("@string{" + id + " = " + db.Strings[id].Marshal() + "}\n\n") } if db.Preamble != nil { buf.WriteString("@preamble{" + db.Preamble.Marshal() + "}\n\n") } res := make([]string, len(db.EKeys)) for i, key := range db.EKeys { res[i] = db.Entries[key].Marshal() } buf.WriteString(strings.Join(res, "\n\n")) return buf.String() }