summaryrefslogtreecommitdiffstats
path: root/names.go
diff options
context:
space:
mode:
authorThibaut Horel <thibaut.horel@gmail.com>2016-03-15 22:12:44 -0400
committerThibaut Horel <thibaut.horel@gmail.com>2016-03-15 22:12:44 -0400
commit58011496071a49e8f5f916a0416c36806ee94614 (patch)
treec32bb04676b54ae0718fb68f97b984b970456628 /names.go
parent9a5261e37badd5422b8c16d93a5b1663c4be602f (diff)
downloadbibtex-58011496071a49e8f5f916a0416c36806ee94614.tar.gz
Add crossref resolution, minor api changes, first template inspired by plain.bst
Diffstat (limited to 'names.go')
-rw-r--r--names.go75
1 files changed, 74 insertions, 1 deletions
diff --git a/names.go b/names.go
index ddd7b17..37e8484 100644
--- a/names.go
+++ b/names.go
@@ -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 {