You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
103 lines
3.2 KiB
103 lines
3.2 KiB
from ..uis import get_ui
|
|
from ..configs import config
|
|
from .. import bibstruct
|
|
from .. import content
|
|
from .. import repo
|
|
from .. import paper
|
|
|
|
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('-k', '--citekey', help='citekey associated with the paper;\nif not provided, one will be generated automatically.',
|
|
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(args):
|
|
"""
|
|
:param bibfile: bibtex file (in .bib, .bibml or .yaml format.
|
|
:param docfile: path (no url yet) to a pdf or ps file
|
|
"""
|
|
|
|
ui = get_ui()
|
|
bibfile = args.bibfile
|
|
docfile = args.docfile
|
|
tags = args.tags
|
|
citekey = args.copy
|
|
|
|
rp = repo.Repository(config())
|
|
|
|
# get bibfile
|
|
|
|
if bibfile is None:
|
|
cont = True
|
|
bibstr = ''
|
|
while cont:
|
|
try:
|
|
bibstr = content.editor_input(config().edit_cmd, bibstr, suffix='.yaml')
|
|
bibdata = rp.databroker.verify(bibstr)
|
|
bibstruct.verify_bibdata(bibdata)
|
|
# REFACTOR Generate citykey
|
|
cont = False
|
|
except ValueError:
|
|
cont = ui.input_yn(
|
|
question='Invalid bibfile. Edit again ?',
|
|
default='y')
|
|
if not cont:
|
|
ui.exit(0)
|
|
else:
|
|
bibdata_raw = content.get_content(bibfile)
|
|
bibdata = rp.databroker.verify(bibdata_raw)
|
|
if bibdata is None:
|
|
ui.error('invalid bibfile {}.'.format(bibfile))
|
|
|
|
print bibdata
|
|
# citekey
|
|
|
|
citekey = args.citekey
|
|
if citekey is None:
|
|
base_key = bibstruct.extract_citekey(bibdata)
|
|
citekey = rp.unique_citekey(base_key)
|
|
else:
|
|
rp.databroker.exists(citekey, both=False)
|
|
|
|
# tags
|
|
|
|
if tags is not None:
|
|
p.tags = set(tags.split(','))
|
|
|
|
p = paper.Paper(citekey=citekey, bibdata=bibdata)
|
|
|
|
# document file
|
|
|
|
bib_docfile = bibstruct.extract_docfile(bibdata)
|
|
if docfile is None:
|
|
docfile = bib_docfile
|
|
elif bib_docfile is not None:
|
|
ui.warning(('Skipping document file from bib file '
|
|
'{}, using {} instead.').format(bib_docfile, docfile))
|
|
|
|
if docfile is not None:
|
|
copy_doc = args.copy
|
|
if copy_doc is None:
|
|
copy_doc = config().import_copy
|
|
if copy_doc:
|
|
docfile = rp.databroker.copy_doc(citekey, docfile)
|
|
|
|
# create the paper
|
|
|
|
try:
|
|
p.docpath = docfile
|
|
rp.push_paper(p)
|
|
except ValueError, v:
|
|
ui.error(v.message)
|
|
ui.exit(1)
|