diff options
Diffstat (limited to 'names.go')
| -rw-r--r-- | names.go | 75 |
1 files changed, 74 insertions, 1 deletions
@@ -2,6 +2,7 @@ package bibtex import ( "bytes" + "encoding/json" "log" "strings" "unicode" @@ -25,6 +26,67 @@ type Token struct { type NamePart []Token +func (p NamePart) MarshalJSON() ([]byte, error) { + res := make([]string, len(p)) + for i, t := range p { + res[i] = t.Text + } + return json.Marshal(strings.Join(res, " ")) +} + +func (p NamePart) marshal() string { + var buf bytes.Buffer + for i, t := range p { + if i >= 1 { + buf.WriteRune(t.Sep) + } + buf.WriteString(t.Text) + } + return buf.String() +} + +func (n Name) marshal() string { + var buf bytes.Buffer + if len(n.Von) > 0 { + buf.WriteString(n.Von.marshal() + " ") + } + buf.WriteString(n.Last.marshal()) + if len(n.First) > 0 { + buf.WriteString(", " + n.First.marshal()) + } + if len(n.Von) > 0 { + buf.WriteString(", " + n.Von.marshal()) + } + return buf.String() +} + +type Names []Name + +func (l Names) String() string { + var res = make([]string, len(l)) + for i, name := range l { + res[i] = name.String() + } + return strings.Join(res, " and ") +} + +func (l Names) Marshal() string { + var res = make([]string, len(l)) + for i, name := range l { + res[i] = name.marshal() + } + return "{" + strings.Join(res, " and ") + "}" +} + +func (l Names) untex() { + for _, name := range l { + name.First.untex() + name.Von.untex() + name.Last.untex() + name.Jr.untex() + } +} + // a proto name before the parts have been separated in f,v,l,f type name []NamePart @@ -88,6 +150,13 @@ func (p NamePart) Format(abbrv bool, sep string, def bool) string { return buf.String() } +func (p NamePart) untex() { + for i, t := range p { + t.Text = UnTex(t.Text) + p[i] = t + } +} + func addNonEmptyToken(b *bytes.Buffer, t *Token, part *NamePart, c rune) { if b.Len() > 0 { t.Text = b.String() @@ -250,6 +319,10 @@ func (n Name) Format(s string) string { return buf.String() } +func (n Name) String() string { + return n.Format("{ff~}{vv~}{ll}{, jj}") +} + // the von part starts at the first non last lower-case taken func findVon(part NamePart) int { for i, t := range part { @@ -301,7 +374,7 @@ func splitFirstLast(part NamePart) (NamePart, NamePart) { } // SplitNames parses the string s and returns a list of names. -func SplitNames(s string) (res []Name) { +func SplitNames(s string) (res Names) { names := splitNames(s) var first, von, last, vonlast, jr NamePart for _, name := range names { |
