diff options
Diffstat (limited to 'python/fatcat_tools/transforms/csl.py')
-rw-r--r-- | python/fatcat_tools/transforms/csl.py | 185 |
1 files changed, 102 insertions, 83 deletions
diff --git a/python/fatcat_tools/transforms/csl.py b/python/fatcat_tools/transforms/csl.py index f8b26bce..2b39068a 100644 --- a/python/fatcat_tools/transforms/csl.py +++ b/python/fatcat_tools/transforms/csl.py @@ -1,4 +1,3 @@ - import json from citeproc import ( @@ -13,10 +12,10 @@ from citeproc_styles import get_style_filepath def contribs_by_role(contribs, role): - ret = [c.copy() for c in contribs if c['role'] == role] - [c.pop('role') for c in ret] + ret = [c.copy() for c in contribs if c["role"] == role] + [c.pop("role") for c in ret] # TODO: some note to self here - [c.pop('literal') for c in ret if 'literal' in c] + [c.pop("literal") for c in ret if "literal" in c] if not ret: return None else: @@ -33,26 +32,30 @@ def release_to_csl(entity): Follows, but not enforced by: https://github.com/citation-style-language/schema/blob/master/csl-data.json """ contribs = [] - for contrib in (entity.contribs or []): + for contrib in entity.contribs or []: if contrib.creator: # Default to "local" (publication-specific) metadata; fall back to # creator-level - family = contrib.creator.surname or contrib.surname or (contrib.raw_name and contrib.raw_name.split()[-1]) + family = ( + contrib.creator.surname + or contrib.surname + or (contrib.raw_name and contrib.raw_name.split()[-1]) + ) if not family: # CSL requires some surname (family name) continue c = dict( family=family, given=contrib.creator.given_name or contrib.given_name, - #dropping-particle - #non-dropping-particle - #suffix - #comma-suffix - #static-ordering + # dropping-particle + # non-dropping-particle + # suffix + # comma-suffix + # static-ordering literal=contrib.creator.display_name or contrib.raw_name, - #parse-names, + # parse-names, # role must be defined; default to author - role=contrib.role or 'author', + role=contrib.role or "author", ) else: family = contrib.surname or (contrib.raw_name and contrib.raw_name.split()[-1]) @@ -64,7 +67,7 @@ def release_to_csl(entity): given=contrib.given_name, literal=contrib.raw_name, # role must be defined; default to author - role=contrib.role or 'author', + role=contrib.role or "author", ) for k in list(c.keys()): if not c[k]: @@ -78,93 +81,108 @@ def release_to_csl(entity): issued_date = None if entity.release_date: - issued_date = {"date-parts": [[ - entity.release_date.year, - entity.release_date.month, - entity.release_date.day, - ]]} + issued_date = { + "date-parts": [ + [ + entity.release_date.year, + entity.release_date.month, + entity.release_date.day, + ] + ] + } elif entity.release_year: issued_date = {"date-parts": [[entity.release_year]]} csl = dict( - #id, - #categories - type=entity.release_type or "article", # can't be blank + # id, + # categories + type=entity.release_type or "article", # can't be blank language=entity.language, - #journalAbbreviation - #shortTitle + # journalAbbreviation + # shortTitle ## see below for all contrib roles - #accessed - #container - #event-date + # accessed + # container + # event-date issued=issued_date, - #original-date - #submitted + # original-date + # submitted abstract=abstract, - #annote - #archive - #archive_location - #archive-place - #authority - #call-number - #chapter-number - #citation-number - #citation-label - #collection-number - #collection-title + # annote + # archive + # archive_location + # archive-place + # authority + # call-number + # chapter-number + # citation-number + # citation-label + # collection-number + # collection-title container_title=entity.container and entity.container.name, - #container-title-short - #dimensions + # container-title-short + # dimensions DOI=entity.ext_ids.doi, - #edition - #event - #event-place - #first-reference-note-number - #genre + # edition + # event + # event-place + # first-reference-note-number + # genre ISBN=entity.ext_ids.isbn13, ISSN=entity.container and entity.container.issnl, issue=entity.issue, - #jurisdiction - #keyword - #locator - #medium - #note - #number - #number-of-pages - #number-of-volumes - #original-publisher - #original-publisher-place - #original-title + # jurisdiction + # keyword + # locator + # medium + # note + # number + # number-of-pages + # number-of-volumes + # original-publisher + # original-publisher-place + # original-title # TODO: page=entity.pages, - page_first=entity.pages and entity.pages.split('-')[0], + page_first=entity.pages and entity.pages.split("-")[0], PMCID=entity.ext_ids.pmcid, PMID=entity.ext_ids.pmid, publisher=(entity.container and entity.container.publisher) or entity.publisher, - #publisher-place - #references - #reviewed-title - #scale - #section - #source - #status + # publisher-place + # references + # reviewed-title + # scale + # section + # source + # status title=entity.title, - #title-short - #URL - #version + # title-short + # URL + # version volume=entity.volume, - #year-suffix + # year-suffix ) - for role in ['author', 'collection-editor', 'composer', 'container-author', - 'director', 'editor', 'editorial-director', 'interviewer', - 'illustrator', 'original-author', 'recipient', 'reviewed-author', - 'translator']: + for role in [ + "author", + "collection-editor", + "composer", + "container-author", + "director", + "editor", + "editorial-director", + "interviewer", + "illustrator", + "original-author", + "recipient", + "reviewed-author", + "translator", + ]: cbr = contribs_by_role(contribs, role) if cbr: csl[role] = cbr # underline-to-dash - csl['container-title'] = csl.pop('container_title') - csl['page-first'] = csl.pop('page_first') - empty_keys = [k for k,v in csl.items() if not v] + csl["container-title"] = csl.pop("container_title") + csl["page-first"] = csl.pop("page_first") + empty_keys = [k for k, v in csl.items() if not v] for k in empty_keys: csl.pop(k) return csl @@ -184,10 +202,11 @@ def refs_to_csl(entity): title=ref.title, issued=issued_date, ) - csl['id'] = ref.key or ref.index, # zero- or one-indexed? + csl["id"] = (ref.key or ref.index,) # zero- or one-indexed? ret.append(csl) return ret + def citeproc_csl(csl_json, style, html=False): """ Renders a release entity to a styled citation. @@ -200,8 +219,8 @@ def citeproc_csl(csl_json, style, html=False): Returns a string; if the html flag is set, and the style isn't 'csl-json' or 'bibtex', it will be HTML. Otherwise plain text. """ - if not csl_json.get('id'): - csl_json['id'] = "unknown" + if not csl_json.get("id"): + csl_json["id"] = "unknown" if style == "csl-json": return json.dumps(csl_json) bib_src = CiteProcJSON([csl_json]) @@ -211,7 +230,7 @@ def citeproc_csl(csl_json, style, html=False): style_path = get_style_filepath(style) bib_style = CitationStylesStyle(style_path, validate=False) bib = CitationStylesBibliography(bib_style, bib_src, form) - bib.register(Citation([CitationItem(csl_json['id'])])) + bib.register(Citation([CitationItem(csl_json["id"])])) lines = bib.bibliography()[0] if style == "bibtex": out = "" @@ -222,6 +241,6 @@ def citeproc_csl(csl_json, style, html=False): out += "\n " + line else: out += line - return ''.join(out) + return "".join(out) else: - return ''.join(lines) + return "".join(lines) |