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.

53 lines
1.8 KiB

from ..files import editor_input
from .. import repo
from ..paper import get_bibentry_from_string, get_safe_metadata_from_content
from .helpers import add_references_argument, parse_reference
def parser(subparsers, config):
parser = subparsers.add_parser('edit',
help='open the paper bibliographic file in an editor')
parser.add_argument('-m', '--meta', action='store_true', default=False,
help='edit metadata')
add_references_argument(parser, single=True)
return parser
def command(config, ui, meta, reference):
rp = repo.Repository.from_directory(config)
key = parse_reference(ui, rp, reference)
paper = rp.paper_from_citekey(key)
to_edit = 'bib'
if meta:
to_edit = 'meta'
filepath = rp.path_to_paper_file(key, to_edit)
with open(filepath) as f:
content = f.read()
while True:
# Get new content from user
content = editor_input(config, content)
new_key = key
bib = None
metadata = None
# Parse new content
if meta:
metadata = get_safe_metadata_from_content(content)
else:
new_key, bib = get_bibentry_from_string(content)
paper.update(key=new_key, bib=bib, meta=metadata)
try:
rp.update(paper, old_citekey=key)
break
except repo.CiteKeyAlreadyExists:
options = ['overwrite', 'edit again', 'abort']
choice = options[ui.input_choice(
options,
['o', 'e', 'a'],
question='A paper already exist with this citekey.'
)]
if choice == 'abort':
break
elif choice == 'overwrite':
rp.update(paper, old_citekey=key, overwrite=True)
# else edit again