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.

68 lines
2.3 KiB

from .. import pretty
from .. import repo
from .. import color
from . import helpers
def parser(subparsers, config):
parser = subparsers.add_parser('list', help="list papers")
parser.add_argument('-k', '--citekeys-only', action='store_true',
default=False, dest='citekeys',
help='Only returns citekeys of matching papers.')
parser.add_argument('query', nargs='*',
help='Paper query (e.g. "year: 2000" or "tags: math")')
return parser
def command(config, ui, citekeys, query):
rp = repo.Repository.from_directory(config)
papers = [(n, p) for n, p in enumerate(rp.all_papers())
if test_paper(query, p)]
# if citekeys:
# paper_strings = [p.citekey for n, p in papers]
# else:
# paper_strings = []
# print p.tags
# print color.dye(' '.join(p.tags), color.purple)
# for n, p in papers:
# bibdesc = pretty.bib_oneliner(p.bibentry)
# paper_strings.append((u'{num:d}: [{citekey}] {descr} {tags}'.format(
# num=int(n),
# citekey=color.dye(p.citekey, color.purple),
# descr=bibdesc,
# tags=color.dye(' '.join(p.tags),
# color.purple, bold=True),
# )).encode('utf-8'))
ui.print_('\n'.join(helpers.paper_oneliner(p, n = n, citekey_only = citekeys) for n, p in papers))
# TODO author is not implemented, should we do it by last name only or more
# complex
# TODO implement search by type of document
def test_paper(query_string, p):
for test in query_string:
tmp = test.split(':')
if len(tmp) != 2:
raise ValueError('command not valid')
field = tmp[0]
value = tmp[1]
if field in ['tags', 't']:
if value not in p.tags:
return False
elif field in ['author', 'authors', 'a']: # that is the very ugly
if not 'author' in p.bibentry.persons:
return False
a = False
for p in p.bibentry.persons['author']:
if value in p.last()[0]:
a = True
return a
elif field in p.bibentry.fields:
if value not in p.bibentry.fields[field]:
return False
else:
return False
return True