diff --git a/packtools/sps/formats/pubmed.py b/packtools/sps/formats/pubmed.py index f99b2651d..89f26ddb3 100644 --- a/packtools/sps/formats/pubmed.py +++ b/packtools/sps/formats/pubmed.py @@ -290,7 +290,12 @@ def get_authors(xml_tree): def add_first_name(author_reg, author_tag): - author_first_name = author_reg.get("contrib_name", {}).get("given-names") + contrib_name = author_reg.get("contrib_name", {}) + # A DTD do PubMed exige FirstName e LastName juntos (nenhum dos dois é + # opcional isoladamente). Quando o XML fonte só tem um dos dois campos + # (autores sem , por exemplo), duplicamos o valor disponível + # em ambos para gerar um Author válido em vez de descartar o autor. + author_first_name = contrib_name.get("given-names") or contrib_name.get("surname") if author_first_name: first = ET.Element("FirstName") first.text = author_first_name @@ -298,17 +303,34 @@ def add_first_name(author_reg, author_tag): def add_last_name(author_reg, author_tag): - author_last_name = author_reg.get("contrib_name", {}).get("surname") + contrib_name = author_reg.get("contrib_name", {}) + author_last_name = contrib_name.get("surname") or contrib_name.get("given-names") if author_last_name: last = ET.Element("LastName") last.text = author_last_name author_tag.append(last) +def add_suffix(author_reg, author_tag): + author_suffix = author_reg.get("contrib_name", {}).get("suffix") + if author_suffix: + suffix = ET.Element("Suffix") + suffix.text = author_suffix + author_tag.append(suffix) + + +def add_collective_name(author_reg, author_tag): + collab = author_reg.get("collab") + if collab: + collective_name = ET.Element("CollectiveName") + collective_name.text = collab + author_tag.append(collective_name) + + def get_affiliations(author_reg, xml_tree): affiliations = aff.AffiliationExtractor(xml_tree).get_affiliation_dict(subtag=False) affiliation_list = [] - for item in author_reg.get("affs"): + for item in author_reg.get("affs") or []: affiliation_list.append( affiliations.get(item.get("id"), {}).get("institution", {})[0].get("original") ) @@ -342,33 +364,23 @@ def xml_pubmed_author_list(xml_pubmed, xml_tree): author_list_tag = ET.Element("AuthorList") for author_reg in authors: author_tag = ET.Element("Author") - add_first_name(author_reg, author_tag) - - # TODO - # add_middle_name(author_reg, author_tag) - # The Author’s full middle name, or initial if the full name is not available. - # Multiple names are allowed in this tag. - # There is no example of using this value in the files. - add_last_name(author_reg, author_tag) - - # TODO - # add_suffix(author_reg, author_tag) - # The Author's suffix, if any, e.g. "Jr", "Sr", "II", "IV". Do not include honorific titles, - # e.g. "M.D.", "Ph.D.". - # There is no example of using this value in the files - - # TODO - # add_collective_name(author_reg, author_tag) - # The name of the authoring committee or organization. The CollectiveName tag should be placed within - # an Author tag. Omit extraneous text like, “on behalf of.” - # Please see the following example: - # - # - # Plastic Surgery Educational Foundation DATA Committee - # - # - # There is no example of using this value in the files + # A DTD do PubMed exige que Author tenha nome pessoal + # (FirstName/MiddleName/LastName/Suffix) OU CollectiveName, + # nunca os dois ao mesmo tempo. + if author_reg.get("collab"): + add_collective_name(author_reg, author_tag) + else: + add_first_name(author_reg, author_tag) + + # TODO + # add_middle_name(author_reg, author_tag) + # The Author’s full middle name, or initial if the full name is not available. + # Multiple names are allowed in this tag. + # There is no example of using this value in the files. + + add_last_name(author_reg, author_tag) + add_suffix(author_reg, author_tag) affiliations = get_affiliations(author_reg, xml_tree) add_affiliations(affiliations, author_tag) diff --git a/tests/sps/formats/test_pubmed.py b/tests/sps/formats/test_pubmed.py index a8afad598..98d70328a 100644 --- a/tests/sps/formats/test_pubmed.py +++ b/tests/sps/formats/test_pubmed.py @@ -1012,6 +1012,129 @@ def test_xml_pubmed_author_list_without_author(self): self.assertEqual(obtained, expected) + def test_xml_pubmed_author_list_with_suffix(self): + expected = ( + '
' + '' + '' + 'Rogerio' + 'Meneghini' + 'Junior' + 'Some University' + '' + '' + '
' + ) + xml_pubmed = ET.fromstring( + '
' + ) + xml_tree = ET.fromstring( + '
' + '' + '' + '' + '' + '' + 'Meneghini' + 'Rogerio' + 'Junior' + '' + '1' + '' + '' + '' + 'Some University' + '' + '' + '' + '
' + ) + + xml_pubmed_author_list(xml_pubmed, xml_tree) + + obtained = ET.tostring(xml_pubmed, encoding="utf-8").decode("utf-8") + + self.assertEqual(obtained, expected) + + def test_xml_pubmed_author_list_without_surname_duplicates_given_names(self): + # A DTD do PubMed exige FirstName e LastName juntos; quando o XML + # fonte só tem (sem ), duplicamos o valor + # em ambos os campos em vez de gerar um Author inválido. + expected = ( + '
' + '' + '' + 'Viviana Alder' + 'Viviana Alder' + '' + '' + '
' + ) + xml_pubmed = ET.fromstring( + '
' + ) + xml_tree = ET.fromstring( + '
' + '' + '' + '' + '' + '' + 'Viviana Alder' + '' + '' + '' + '' + '' + '
' + ) + + xml_pubmed_author_list(xml_pubmed, xml_tree) + + obtained = ET.tostring(xml_pubmed, encoding="utf-8").decode("utf-8") + + self.assertEqual(obtained, expected) + + def test_xml_pubmed_author_list_with_collective_name(self): + expected = ( + '
' + '' + '' + 'The SciELO Group' + '' + '' + '
' + ) + xml_pubmed = ET.fromstring( + '
' + ) + xml_tree = ET.fromstring( + '
' + '' + '' + '' + '' + 'The SciELO Group' + '1' + '' + '' + '' + '' + '
' + ) + + xml_pubmed_author_list(xml_pubmed, xml_tree) + + obtained = ET.tostring(xml_pubmed, encoding="utf-8").decode("utf-8") + + self.assertEqual(obtained, expected) + def test_xml_pubmed_publication_type(self): # TODO # Originalmente, espera-se que o valor da tag seja Journal Article