Basic tag handling.

main
Olivier Mangin 12 years ago
parent bea8c99187
commit 7c3ce78f70

@ -1,6 +1,6 @@
from ..files import editor_input from ..files import editor_input
from .. import repo 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): def parser(subparsers, config):
@ -8,26 +8,34 @@ def parser(subparsers, config):
help='open the paper bibliographic file in an editor') help='open the paper bibliographic file in an editor')
parser.add_argument('reference', parser.add_argument('reference',
help='reference to the paper (citekey or number)') help='reference to the paper (citekey or number)')
parser.add_argument('-m', '--meta', action='store_true', default=False,
help='edit metadata')
return parser return parser
def command(config, ui, reference): def command(config, ui, reference, meta):
rp = repo.Repository.from_directory() rp = repo.Repository.from_directory()
key = rp.citekey_from_ref(reference, fatal=True) key = rp.citekey_from_ref(reference, fatal=True)
paper = rp.paper_from_citekey(key) 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') editor = config.get('papers', 'edit-cmd')
with open(filepath) as f: with open(filepath) as f:
content = f.read() content = f.read()
while True: while True:
# Get new content from user # Get new content from user
content = editor_input(editor, content) content = editor_input(editor, content)
new_key = key
bib = None
metadata = None
# Parse new content # Parse new content
if meta:
metadata = get_safe_metadata_from_content(content)
else:
new_key, bib = get_bibentry_from_string(content) new_key, bib = get_bibentry_from_string(content)
paper.update(key=key, bib=bib) paper.update(key=key, bib=bib, meta=metadata)
# TODO merge into an update method
paper.citekey = new_key
paper.bibentry = bib
try: try:
rp.update(paper, old_citekey=key) rp.update(paper, old_citekey=key)
break break

@ -17,8 +17,7 @@ def parser(subparsers, config):
def command(config, ui, bibpath, copy): def command(config, ui, bibpath, copy):
""" """
:param pdffilepath path (no url yet) to a pdf or ps file :param bibpath: path (no url yet) to a bibliography file
:param bibtex bibtex file (in .bib, .bibml or .yaml format.
""" """
if copy is None: if copy is None:
copy = config.get('papers', 'import-copy') copy = config.get('papers', 'import-copy')

@ -3,6 +3,7 @@ import os
import unicodedata import unicodedata
import re import re
from cStringIO import StringIO from cStringIO import StringIO
import yaml
from pybtex.database import Entry, BibliographyData, FieldDict, Person from pybtex.database import Entry, BibliographyData, FieldDict, Person
@ -19,7 +20,8 @@ CITEKEY_EXCLUDE_RE = re.compile('[%s]'
BASE_META = { BASE_META = {
'external-document': None, 'external-document': None,
'notes': [] 'labels': [],
'notes': [],
} }
@ -63,11 +65,21 @@ def copy_bibentry(entry):
return Entry(entry.type, fields=fd, persons=persons) return Entry(entry.type, fields=fd, persons=persons)
def get_safe_metadata(metapath): def get_safe_metadata(meta):
if metapath is None: base_meta = Paper.create_meta()
return None if meta is not None:
else: base_meta.update(meta)
return files.read_yamlfile(metapath) 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): def check_citekey(citekey):
@ -89,10 +101,10 @@ class Paper(object):
""" """
def __init__(self, bibentry=None, metadata=None, citekey=None): def __init__(self, bibentry=None, metadata=None, citekey=None):
if not bibentry: if bibentry is None:
bibentry = Entry(DEFAULT_TYPE) bibentry = Entry(DEFAULT_TYPE)
self.bibentry = bibentry self.bibentry = bibentry
if not metadata: if metadata is None:
metadata = Paper.create_meta() metadata = Paper.create_meta()
self.metadata = metadata self.metadata = metadata
check_citekey(citekey) check_citekey(citekey)
@ -203,7 +215,7 @@ class Paper(object):
@classmethod @classmethod
def load(cls, bibpath, metapath=None): def load(cls, bibpath, metapath=None):
key, entry = get_bibentry_from_file(bibpath) 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) p = Paper(bibentry=entry, metadata=metadata, citekey=key)
return p return p
@ -262,7 +274,7 @@ class PaperInRepo(Paper):
@classmethod @classmethod
def load(cls, repo, bibpath, metapath=None): def load(cls, repo, bibpath, metapath=None):
key, entry = get_bibentry_from_file(bibpath) 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, p = PaperInRepo(repo, bibentry=entry, metadata=metadata,
citekey=key) citekey=key)
return p return p

@ -36,7 +36,7 @@ def bib_oneliner(bibentry):
field = 'booktitle' field = 'booktitle'
journal = bibtex_purify(bibentry.fields.get(field, '')) journal = bibtex_purify(bibentry.fields.get(field, ''))
return u'{authors} \"{title}\" {journal} ({year})'.format( return u'{authors} \"{title}\" {journal} ({year})'.format(
authors=colored(authors, 'green'), authors=colored(authors, 'cyan'),
title=title, title=title,
journal=colored(journal, 'yellow'), journal=colored(journal, 'yellow'),
year=year, year=year,

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

Loading…
Cancel
Save