from .. import repo from .. import files from ..paper import Paper, NoDocumentFile, get_bibentry_from_string from ..configs import config from .helpers import add_paper_with_docfile, extract_doc_path_from_bibdata def parser(subparsers): parser = subparsers.add_parser('add', help='add a paper to the repository') parser.add_argument('-b', '--bibfile', help='bibtex, bibtexml or bibyaml file', default=None) parser.add_argument('-d', '--docfile', help='pdf or ps file', default=None) parser.add_argument('-t', '--tags', help='tags associated to the paper, separated by commas', default=None) parser.add_argument('-c', '--copy', action='store_true', default=None, help="copy document files into library directory (default)") parser.add_argument('-C', '--nocopy', action='store_false', dest='copy', help="don't copy document files (opposite of -c)") return parser def command(ui, bibfile, docfile, tags, copy): """ :param bibfile: bibtex file (in .bib, .bibml or .yaml format. :param docfile: path (no url yet) to a pdf or ps file """ if copy is None: copy = config().import_copy rp = repo.Repository(config()) if bibfile is None: cont = True bibstr = '' while cont: try: bibstr = files.editor_input(config, bibstr, suffix='.yaml') key, bib = get_bibentry_from_string(bibstr) cont = False except Exception: cont = ui.input_yn( question='Invalid bibfile. Edit again ?', default='y') if not cont: ui.exit() p = Paper(bibentry=bib, citekey=key) else: p = Paper.load(bibfile) if tags is not None: p.tags = set(tags.split(',')) # Check if another doc file is specified in bibtex docfile2 = extract_doc_path_from_bibdata(p, ui) if docfile is None: docfile = docfile2 elif docfile2 is not None: ui.warning( "Skipping document file from bib file: %s, using %s instead." % (docfile2, docfile)) try: add_paper_with_docfile(rp, p, docfile=docfile, copy=copy) except ValueError, v: ui.error(v.message) ui.exit(1) # TODO handle case where citekey exists