diff --git a/commonmeta/reader.go b/commonmeta/reader.go index b1362ec..90c90a4 100644 --- a/commonmeta/reader.go +++ b/commonmeta/reader.go @@ -147,13 +147,13 @@ type Container struct { // Contributor represents a contributor of a publication, defined in the commonmeta JSON Schema. type Contributor struct { - ID string `json:"id,omitempty"` - Type string `json:"type,omitempty"` - Name string `json:"name,omitempty"` - GivenName string `json:"givenName,omitempty"` - FamilyName string `json:"familyName,omitempty"` - Affiliations []Affiliation `json:"affiliations,omitempty"` - ContributorRoles []string `json:"contributorRoles,omitempty"` + ID string `json:"id,omitempty"` + Type string `json:"type,omitempty"` + Name string `json:"name,omitempty"` + GivenName string `json:"givenName,omitempty"` + FamilyName string `json:"familyName,omitempty"` + Affiliations []*Affiliation `json:"affiliations,omitempty"` + ContributorRoles []string `json:"contributorRoles,omitempty"` } // Date represents the date of a publication, defined in the commonmeta JSON Schema. diff --git a/crossref/reader.go b/crossref/reader.go index a718344..bc06fd2 100644 --- a/crossref/reader.go +++ b/crossref/reader.go @@ -540,7 +540,7 @@ func Read(content Content) (commonmeta.Data, error) { } else { Type = "Person" } - var affiliations []commonmeta.Affiliation + var affiliations []*commonmeta.Affiliation if len(v.Affiliation) > 0 { for _, a := range v.Affiliation { var ID string @@ -548,7 +548,7 @@ func Read(content Content) (commonmeta.Data, error) { ID = utils.NormalizeROR(a.ID[0].ID) } if a.Name != "" { - affiliations = append(affiliations, commonmeta.Affiliation{ + affiliations = append(affiliations, &commonmeta.Affiliation{ ID: ID, Name: a.Name, }) diff --git a/crossrefxml/reader.go b/crossrefxml/reader.go index 5de43c0..4226ebc 100644 --- a/crossrefxml/reader.go +++ b/crossrefxml/reader.go @@ -483,15 +483,15 @@ type PeerReview struct { // PersonName represents a person in Crossref XML metadata. type PersonName struct { - XMLName xml.Name `xml:"person_name"` - ContributorRole string `xml:"contributor_role,attr"` - Sequence string `xml:"sequence,attr"` - Text string `xml:",chardata"` - GivenName string `xml:"given_name"` - Surname string `xml:"surname"` - Affiliations Affiliations `xml:"affiliations,omitempty"` - Affiliation string `xml:"affiliation,omitempty"` - ORCID string `xml:"ORCID,omitempty"` + XMLName xml.Name `xml:"person_name"` + ContributorRole string `xml:"contributor_role,attr"` + Sequence string `xml:"sequence,attr"` + Text string `xml:",chardata"` + GivenName string `xml:"given_name"` + Surname string `xml:"surname"` + Affiliations *Affiliations `xml:"affiliations,omitempty"` + Affiliation string `xml:"affiliation,omitempty"` + ORCID string `xml:"ORCID,omitempty"` } // PostedContent represents posted content in Crossref XML metadata. @@ -1309,6 +1309,7 @@ func GetContributors(contrib Contributors) ([]commonmeta.Contributor, error) { if len(contrib.PersonName) > 0 { for _, v := range contrib.PersonName { + fmt.Print(v.Affiliations) var ID string if v.GivenName != "" || v.Surname != "" { if v.ORCID != "" { @@ -1316,42 +1317,48 @@ func GetContributors(contrib Contributors) ([]commonmeta.Contributor, error) { } } Type := "Person" - var affiliations []commonmeta.Affiliation - if len(v.Affiliations.Institution) > 0 { - for _, i := range v.Affiliations.Institution { - if i.InstitutionName != "" { - if i.InstitutionID != nil && i.InstitutionID.Text != "" { - ID = utils.NormalizeROR(i.InstitutionID.Text) - affiliations = append(affiliations, commonmeta.Affiliation{ - ID: ID, - Name: i.InstitutionName, - }) - } else { - affiliations = append(affiliations, commonmeta.Affiliation{ - Name: i.InstitutionName, - }) + if len(v.Affiliations.Institution) > 0 || v.Affiliation != "" { + var affiliations []*commonmeta.Affiliation + if len(v.Affiliations.Institution) > 0 { + for _, i := range v.Affiliations.Institution { + if i.InstitutionName != "" { + if i.InstitutionID != nil && i.InstitutionID.Text != "" { + ID = utils.NormalizeROR(i.InstitutionID.Text) + affiliations = append(affiliations, &commonmeta.Affiliation{ + ID: ID, + Name: i.InstitutionName, + }) + } else { + affiliations = append(affiliations, &commonmeta.Affiliation{ + Name: i.InstitutionName, + }) + } } } + } else if v.Affiliation != "" { + affiliations = append(affiliations, &commonmeta.Affiliation{ + Name: v.Affiliation, + }) + } + contributor := commonmeta.Contributor{ + ID: ID, + Type: Type, + GivenName: v.GivenName, + FamilyName: v.Surname, + Name: "", + ContributorRoles: []string{"Author"}, + Affiliations: affiliations, + } + contributors = append(contributors, contributor) + } else { + contributor := commonmeta.Contributor{ + ID: ID, + Type: Type, + GivenName: v.GivenName, + FamilyName: v.Surname, + Name: "", + ContributorRoles: []string{"Author"}, } - } else if v.Affiliation != "" { - affiliations = append(affiliations, commonmeta.Affiliation{ - Name: v.Affiliation, - }) - } - - contributor := commonmeta.Contributor{ - ID: ID, - Type: Type, - GivenName: v.GivenName, - FamilyName: v.Surname, - Name: "", - ContributorRoles: []string{"Author"}, - Affiliations: affiliations, - } - containsName := slices.ContainsFunc(contributors, func(e commonmeta.Contributor) bool { - return e.GivenName == contributor.GivenName && e.FamilyName != "" && e.FamilyName == contributor.FamilyName - }) - if !containsName { contributors = append(contributors, contributor) } } diff --git a/crossrefxml/writer.go b/crossrefxml/writer.go index cfa0089..8dfcbb4 100644 --- a/crossrefxml/writer.go +++ b/crossrefxml/writer.go @@ -132,7 +132,7 @@ func Convert(data commonmeta.Data) (Body, error) { ORCID: contributor.ID, GivenName: contributor.GivenName, Surname: contributor.FamilyName, - Affiliations: affiliations, + Affiliations: &affiliations, }) } else { personName = append(personName, PersonName{ diff --git a/datacite/reader.go b/datacite/reader.go index f586eb0..f9178ca 100644 --- a/datacite/reader.go +++ b/datacite/reader.go @@ -675,7 +675,7 @@ func GetContributor(v ContentContributor) commonmeta.Contributor { //parse Affiliation as either slice of string or slice of struct var affiliationStructs []Affiliation var affiliationNames []string - var affiliations []commonmeta.Affiliation + var affiliations []*commonmeta.Affiliation var err error err = json.Unmarshal(v.Affiliation, &affiliationNames) if err != nil { @@ -691,13 +691,13 @@ func GetContributor(v ContentContributor) commonmeta.Contributor { ID: id, Name: v.Name, } - affiliations = append(affiliations, af) + affiliations = append(affiliations, &af) } } else if len(affiliationNames) > 0 { af := commonmeta.Affiliation{ Name: affiliationNames[0], } - affiliations = append(affiliations, af) + affiliations = append(affiliations, &af) } var roles []string diff --git a/jsonfeed/reader.go b/jsonfeed/reader.go index e89102e..af573dc 100644 --- a/jsonfeed/reader.go +++ b/jsonfeed/reader.go @@ -384,11 +384,11 @@ func GetContributors(contrib Authors) ([]commonmeta.Contributor, error) { Type = "Organization" } - var affiliations []commonmeta.Affiliation + var affiliations []*commonmeta.Affiliation if len(v.Affiliation) > 0 { for _, a := range v.Affiliation { if a.Name != "" { - affiliations = append(affiliations, commonmeta.Affiliation{ + affiliations = append(affiliations, &commonmeta.Affiliation{ ID: a.ID, Name: a.Name, })