diff options
Diffstat (limited to 'python/fatcat_export.py')
-rwxr-xr-x | python/fatcat_export.py | 61 |
1 files changed, 60 insertions, 1 deletions
diff --git a/python/fatcat_export.py b/python/fatcat_export.py index 33e23202..a9d46142 100755 --- a/python/fatcat_export.py +++ b/python/fatcat_export.py @@ -10,12 +10,19 @@ without permission by an third party. import sys import json import argparse + +from citeproc import CitationStylesStyle, CitationStylesBibliography +from citeproc import Citation, CitationItem +from citeproc import formatter +from citeproc.source.json import CiteProcJSON +from citeproc_styles import get_style_filepath + import fatcat_client from fatcat_client.rest import ApiException from fatcat_client import ReleaseEntity, ContainerEntity, ChangelogEntry from fatcat_tools import uuid2fcid, entity_from_json, entity_to_dict, \ release_to_elasticsearch, container_to_elasticsearch, \ - changelog_to_elasticsearch, public_api + changelog_to_elasticsearch, public_api, release_to_csl def run_export_releases(args): @@ -52,6 +59,43 @@ def run_transform_changelogs(args): args.json_output.write( json.dumps(changelog_to_elasticsearch(entity)) + '\n') +def run_citeproc_releases(args): + for line in args.json_input: + line = line.strip() + if not line: + continue + entity = entity_from_json(line, ReleaseEntity, api_client=args.api.api_client) + csl_json = release_to_csl(entity) + # XXX: + csl_json['id'] = "release:" + (entity.ident or "unknown") + if args.style == "csl-json": + args.json_output.write(json.dumps(csl_json) + "\n") + continue + bib_src = CiteProcJSON([csl_json]) + form = formatter.plain + if args.html: + form = formatter.html + style_path = get_style_filepath(args.style) + bib_style = CitationStylesStyle(style_path, validate=False) + bib = CitationStylesBibliography(bib_style, bib_src, form) + bib.register(Citation([CitationItem(csl_json['id'])])) + # XXX: + #args.json_output.write( + # json.dumps(release_to_csl(entity)) + '\n') + lines = bib.bibliography()[0] + if args.style == "bibtex": + for l in lines: + if l.startswith(" @"): + args.json_output.write("\n@") + elif l.startswith(" "): + #print("line: START|{}|END".format(l)) + args.json_output.write("\n " + l) + else: + args.json_output.write(l) + else: + args.json_output.write(''.join(lines) + "\n") + print() + def run_export_changelog(args): end = args.end if end is None: @@ -109,6 +153,21 @@ def main(): help="where to send output", default=sys.stdout, type=argparse.FileType('w')) + sub_citeproc_releases = subparsers.add_parser('citeproc-releases') + sub_citeproc_releases.set_defaults(func=run_citeproc_releases) + sub_citeproc_releases.add_argument('json_input', + help="JSON-per-line of release entities", + default=sys.stdin, type=argparse.FileType('r')) + sub_citeproc_releases.add_argument('json_output', + help="where to send output", + default=sys.stdout, type=argparse.FileType('w')) + sub_citeproc_releases.add_argument('--style', + help="citation style to output", + default='csl-json') + sub_citeproc_releases.add_argument('--html', + action='store_true', + help="output HTML, not plain text") + sub_changelog = subparsers.add_parser('changelog') sub_changelog.set_defaults(func=run_export_changelog) sub_changelog.add_argument('--start', |