package main import ( "bytes" "encoding/json" "fmt" "log" "os" "strings" "github.com/Thibauth/bibtex" ) func main() { fname := os.Args[1] f, err := os.Open(fname) if err != nil { log.Fatal(err) } db, err := bibtex.Parse(f, false) res, _ := json.MarshalIndent(db, "", " ") fmt.Println(string(res)) } func MarshalEntry(e bibtex.Entry) string { var buf bytes.Buffer temp := make([]string, len(e.FNames)) open, close := "{", "}" if strings.Contains(e.Key, "}") { open, close = "(", ")" } buf.WriteString("@" + e.Type + open + e.Key + ",") if len(e.FNames) == 0 { buf.WriteString(close) return buf.String() } else { buf.WriteString("\n\t") } for i, field := range e.FNames { temp[i] = field + " = " + e.Fields[field].Marshal() } buf.WriteString(strings.Join(temp, ",\n\t")) buf.WriteString("\n" + close) return buf.String() } 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] = MarshalEntry(db.Entries[key]) } buf.WriteString(strings.Join(res, "\n\n")) return buf.String() }