Basic tag handling.

main
Olivier Mangin 12 years ago
parent bea8c99187
commit 7c3ce78f70

@ -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
if meta:
metadata = get_safe_metadata_from_content(content)
else:
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
paper.update(key=key, bib=bib, meta=metadata)
try:
rp.update(paper, old_citekey=key)
break

@ -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')

@ -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

@ -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,

@ -24,6 +24,7 @@ entries:
META = """
external-document: null
notes: []
labels: []
"""

Loading…
Cancel
Save