diff options
Diffstat (limited to 'fatcat_scholar/schema.py')
-rw-r--r-- | fatcat_scholar/schema.py | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/fatcat_scholar/schema.py b/fatcat_scholar/schema.py index 4c6afe7..131cf74 100644 --- a/fatcat_scholar/schema.py +++ b/fatcat_scholar/schema.py @@ -104,6 +104,55 @@ class ScholarBiblio(BaseModel): contrib_names: List[str] affiliations: List[str] + def citation_str(self, style: str) -> Optional[str]: + """ + Tries to format this biblio metadata as a citation string. If it fails, + returns None. + + Urgently, will probably refactor to use a proper citeproc library. Will + need to do something different about author names at the same time. + """ + if style == "bibtex": + type_map = { + 'article-journal': 'article', + 'conference-paper': 'proceedings', + 'thesis': 'phdthesis', + 'book': 'book', + None: 'unpublished', + } + val = f"@{type_map.get(self.release_type, 'unpublished')}{{{self.release_ident},\n" + val += f" title = {{{self.title}}}\n" + for name in self.contrib_names: + val += f" author = {{{name}}}\n" + if self.pages: + val += f" pages = {{{self.pages}}}\n" + if self.volume: + val += f" volume = {{{self.volume}}}\n" + if self.issue: + val += f" number = {{{self.issue}}}\n" + if self.release_year: + val += f" year = {self.release_year}\n" + if self.container_name: + val += f" journal = {{{self.container_name}}}\n" + if self.publisher: + val += f" publisher = {{{self.publisher}}}\n" + val += "}" + return val + elif style == "default": + val = ", ".join(self.contrib_names) + if val: + val += ". " + val += f" \"self.title.\" " + if self.container_name: + val += self.container_name + if self.volume and self.issue: + val += f"{self.volume}.{self.issue} " + if self.release_year: + val += f" ({self.release_year})" + if self.pages: + val += f": {self.pages}" + return val + class ScholarFulltext(BaseModel): lang_code: Optional[str] |