diff --git a/papers/commands/edit_cmd.py b/papers/commands/edit_cmd.py index bb54014..8239a16 100644 --- a/papers/commands/edit_cmd.py +++ b/papers/commands/edit_cmd.py @@ -1,6 +1,6 @@ from ..files import editor_input from .. import repo -from ..paper import get_bibentry_from_string +from ..paper import get_bibentry_from_string, get_safe_metadata_from_content def parser(subparsers, config): @@ -8,26 +8,34 @@ def parser(subparsers, config): help='open the paper bibliographic file in an editor') parser.add_argument('reference', help='reference to the paper (citekey or number)') + parser.add_argument('-m', '--meta', action='store_true', default=False, + help='edit metadata') return parser -def command(config, ui, reference): +def command(config, ui, reference, meta): rp = repo.Repository.from_directory() key = rp.citekey_from_ref(reference, fatal=True) paper = rp.paper_from_citekey(key) - filepath = rp.path_to_paper_file(key, 'bib') + to_edit = 'bib' + if meta: + to_edit = 'meta' + filepath = rp.path_to_paper_file(key, to_edit) editor = config.get('papers', 'edit-cmd') with open(filepath) as f: content = f.read() while True: # Get new content from user content = editor_input(editor, content) + new_key = key + bib = None + metadata = None # Parse new content - new_key, bib = get_bibentry_from_string(content) - paper.update(key=key, bib=bib) - # TODO merge into an update method - paper.citekey = new_key - paper.bibentry = bib + if meta: + metadata = get_safe_metadata_from_content(content) + else: + new_key, bib = get_bibentry_from_string(content) + paper.update(key=key, bib=bib, meta=metadata) try: rp.update(paper, old_citekey=key) break diff --git a/papers/commands/import_cmd.py b/papers/commands/import_cmd.py index 2a21f0b..4fa6d0e 100644 --- a/papers/commands/import_cmd.py +++ b/papers/commands/import_cmd.py @@ -17,8 +17,7 @@ def parser(subparsers, config): def command(config, ui, bibpath, copy): """ - :param pdffilepath path (no url yet) to a pdf or ps file - :param bibtex bibtex file (in .bib, .bibml or .yaml format. + :param bibpath: path (no url yet) to a bibliography file """ if copy is None: copy = config.get('papers', 'import-copy') diff --git a/papers/paper.py b/papers/paper.py index 941faec..affadb1 100644 --- a/papers/paper.py +++ b/papers/paper.py @@ -3,6 +3,7 @@ import os import unicodedata import re from cStringIO import StringIO +import yaml from pybtex.database import Entry, BibliographyData, FieldDict, Person @@ -19,7 +20,8 @@ CITEKEY_EXCLUDE_RE = re.compile('[%s]' BASE_META = { 'external-document': None, - 'notes': [] + 'labels': [], + 'notes': [], } @@ -63,11 +65,21 @@ def copy_bibentry(entry): return Entry(entry.type, fields=fd, persons=persons) -def get_safe_metadata(metapath): - if metapath is None: - return None - else: - return files.read_yamlfile(metapath) +def get_safe_metadata(meta): + base_meta = Paper.create_meta() + if meta is not None: + base_meta.update(meta) + return base_meta + + +def get_safe_metadata_from_content(content): + return get_safe_metadata(yaml.load(content)) + + +def get_safe_metadata_from_path(metapath): + if metapath is not None: + content = files.read_yamlfile(metapath) + return get_safe_metadata(content) def check_citekey(citekey): @@ -89,10 +101,10 @@ class Paper(object): """ def __init__(self, bibentry=None, metadata=None, citekey=None): - if not bibentry: + if bibentry is None: bibentry = Entry(DEFAULT_TYPE) self.bibentry = bibentry - if not metadata: + if metadata is None: metadata = Paper.create_meta() self.metadata = metadata check_citekey(citekey) @@ -203,7 +215,7 @@ class Paper(object): @classmethod def load(cls, bibpath, metapath=None): key, entry = get_bibentry_from_file(bibpath) - metadata = get_safe_metadata(metapath) + metadata = get_safe_metadata_from_path(metapath) p = Paper(bibentry=entry, metadata=metadata, citekey=key) return p @@ -262,7 +274,7 @@ class PaperInRepo(Paper): @classmethod def load(cls, repo, bibpath, metapath=None): key, entry = get_bibentry_from_file(bibpath) - metadata = get_safe_metadata(metapath) + metadata = get_safe_metadata_from_path(metapath) p = PaperInRepo(repo, bibentry=entry, metadata=metadata, citekey=key) return p diff --git a/papers/pretty.py b/papers/pretty.py index ccfeb93..9775980 100644 --- a/papers/pretty.py +++ b/papers/pretty.py @@ -36,7 +36,7 @@ def bib_oneliner(bibentry): field = 'booktitle' journal = bibtex_purify(bibentry.fields.get(field, '')) return u'{authors} \"{title}\" {journal} ({year})'.format( - authors=colored(authors, 'green'), + authors=colored(authors, 'cyan'), title=title, journal=colored(journal, 'yellow'), year=year, diff --git a/tests/test_paper.py b/tests/test_paper.py index 416be15..be99a90 100644 --- a/tests/test_paper.py +++ b/tests/test_paper.py @@ -24,6 +24,7 @@ entries: META = """ external-document: null notes: [] +labels: [] """