Simplified color usage.

main
Olivier Mangin 12 years ago
parent 3af7590827
commit f734e2f172

@ -1,29 +1,55 @@
# display
bold = '\033[1m'
end = '\033[0m'
BOLD = '\033[1m'
END = '\033[0m'
black = '\033[0;30m'
red = '\033[0;31m'
green = '\033[0;32m'
yellow = '\033[0;33m'
blue = '\033[0;34m'
purple = '\033[0;35m'
cyan = '\033[0;36m'
grey = '\033[0;37m'
COLORS = {
'black' : '\033[0;30m',
'red' : '\033[0;31m',
'green' : '\033[0;32m',
'yellow': '\033[0;33m',
'blue' : '\033[0;34m',
'purple': '\033[0;35m',
'cyan' : '\033[0;36m',
'grey' : '\032[0;37m',
}
# Bold
bblack = '\033[1;30m'
bred = '\033[1;31m'
bgreen = '\033[1;32m'
byellow = '\033[1;33m'
bblue = '\033[1;34m'
bpurple = '\033[1;35m'
bcyan = '\033[1;36m'
bgrey = '\033[1;37m'
BCOLORS = {
'black' : '\033[1;30m',
'red' : '\033[1;31m',
'green' : '\033[1;32m',
'yellow': '\033[1;33m',
'blue' : '\033[1;34m',
'purple': '\033[1;35m',
'cyan' : '\033[1;36m',
'grey' : '\033[1;37m',
}
# application specific
error = red
normal = grey
citekey = purple
filepath = cyan
ALIASES = {
'error' : 'red',
'normal' : 'grey',
'citekey' : 'purple',
'filepath': 'cyan',
}
def colored(s, color=None, bold=False):
if color in ALIASES:
color = ALIASES[color]
try:
if bold:
color_code = BCOLORS[color]
else:
color_code = COLORS[color]
except KeyError:
if bold:
color_code = CODE
else:
color_code = ''
if color_code != '':
end_code = END
else:
end_code = ''
return color_code + s + end_code

@ -4,6 +4,7 @@ import shutil
from .. import repo
from ..paper import Paper, NoDocumentFile
from .. import files
def parser(subparsers, config):
@ -27,12 +28,12 @@ def command(config, bibpath, copy):
copy = config.get('papers', 'import-copy')
rp = repo.Repository.from_directory()
# Get directory for document
doc_path = rp.get_document_directory(config)
doc_path = files.clean_path(rp.get_document_directory(config))
if not (os.path.exists(doc_path) and os.path.isdir(doc_path)):
print "Document directory %s, does not exist." % doc_path
sys.exit(1)
# Extract papers from bib
papers = Paper.many_from_path(bibpath)
papers = Paper.many_from_path(bibpath, fatal=False)
for p in papers:
doc_file = None
try:

@ -3,7 +3,7 @@
import os
from ..repo import Repository
from .. import color
from ..color import colored
def parser(subparsers, config):
@ -16,12 +16,13 @@ def command(config):
"""Create a .papers directory"""
papersdir = os.getcwd() + '/.papers'
if not os.path.exists(papersdir):
print('{}initializing papers in {}{}{}'.format(
color.grey, color.cyan, papersdir, color.end))
print('Initializing papers in {}'.format(
colored(papersdir, 'filepath')))
repo = Repository()
repo.init(papersdir) # Creates directories
repo.save() # Saves empty repository description
else:
print('{}error {} : papers already present in {}{}{}'.format(
color.red, color.grey, color.cyan, papersdir, color.end))
print(colored('error', 'error') +
' : papers already present in {}.'.format(
colored(papersdir, 'filepath')))
exit(-1)

@ -2,7 +2,7 @@ import subprocess
import tempfile
from .. import pretty
from .. import color
from ..color import colored
from .. import repo
@ -17,7 +17,11 @@ def command(config):
for n in range(rp.size()):
paper = rp.paper_from_number(n, fatal=True)
bibdesc = pretty.bib_oneliner(paper.bibentry)
articles.append((u'{:3d} {}{}{}{} {}'.format(int(n), color.purple, rp.citekeys[n], color.end, (10 - len(paper.citekey))*' ', bibdesc)).encode('utf-8'))
articles.append((u'{num:d}: [{citekey}] {descr}'.format(
num=int(n),
citekey=colored(rp.citekeys[n], 'purple'),
descr=bibdesc,
)).encode('utf-8'))
with tempfile.NamedTemporaryFile(suffix=".tmp", delete=True) as tmpf:
tmpf.write('\n'.join(articles))

@ -1,13 +1,15 @@
import subprocess
from .. import color
from ..color import colored
from .. import repo
from ..paper import NoDocumentFile
def parser(subparsers, config):
parser = subparsers.add_parser('open', help='{}open the paper in a pdf viewer{}'.format(color.normal, color.end))
parser.add_argument('citekey', help='{}the paper associated citekey{}'.format(color.normal, color.end))
parser = subparsers.add_parser('open',
help=colored('open the paper in a pdf viewer', 'normal'))
parser.add_argument('citekey',
help=colored('the paper associated citekey', 'normal'))
return parser
@ -19,11 +21,10 @@ def command(config, citekey):
filepath = paper.get_file_path()
subprocess.Popen([config.get('papers', 'open-cmd'),
filepath])
print('{}{}{} opened.{}'.format(
color.filepath, filepath, color.normal, color.end))
print('{} opened.'.format(colored(filepath, 'filepath')))
else:
raise NoDocumentFile
except NoDocumentFile:
print('{}error{}: No document associated to this entry {}{}{}'.format(
color.error, color.normal, color.citekey, citekey, color.end))
print('{}: No document associated to this entry {}{}{}'.format(
colored('error', 'error'), colored('citekey', 'citekey')))
exit(-1)

@ -4,7 +4,7 @@ import tempfile
import yaml
import color
from .color import colored
try:
import pybtex
@ -19,8 +19,9 @@ try:
import pybtex.database.output.bibyaml
except ImportError:
print '{}error{}: you need to install Pybtex; try running \'pip install'
'pybtex\' or \'easy_install pybtex\''.format(color.red, color.end)
print(colored('error', 'error')
+ ': you need to install Pybtex; try running \'pip install'
'pybtex\' or \'easy_install pybtex\'')
_papersdir = None
@ -42,17 +43,20 @@ def find_papersdir():
if _papersdir is None:
curdir = os.path.abspath('')
while curdir != '':
if (os.path.exists(curdir + '/.papers')
and os.path.isdir(curdir + '/.papers')):
curdir_path = os.path.join(clean_path(curdir), '.papers')
if (os.path.exists(curdir_path) and os.path.isdir(curdir_path)):
_papersdir = curdir + '/.papers'
curdir = ''
if curdir == '/':
curdir = '~'
elif curdir == '~':
curdir = ''
else:
curdir = os.path.split(curdir)[0]
if _papersdir is None:
print '{}error{} : no papers repo found in this directory or in'
'any parent directory.{}'.format(color.red, color.grey, color.end)
print (colored('error', 'error')
+ ': no papers repo found in this directory or in '
'any parent directory.')
exit(-1)
return _papersdir
@ -61,22 +65,22 @@ def name_from_path(fullpdfpath, verbose=False):
name, ext = os.path.splitext(os.path.split(fullpdfpath)[1])
if verbose:
if ext != '.pdf' and ext != '.ps':
print('{}warning{}: extension {}{}{} not recognized{}'.format(
color.yellow, color.grey, color.cyan, ext, color.grey,
color.end))
print(colored('warning', 'yellow')
+ '{: extension {ext} not recognized'.format(
ext=colored(ext, 'cyan')))
return name, ext
def check_file(filepath):
if not os.path.exists(filepath):
print '{}error{}: {}{}{} does not exists{}'.format(
color.red, color.grey, color.cyan, filepath, color.grey,
color.end)
print(colored('error', 'error') +
': {} does not exists'.format(
colored(filepath, 'filepath')))
exit(-1)
if not os.path.isfile(filepath):
print '{}error{}: {}{}{} is not a file{}'.format(
color.red, color.grey, color.cyan, filepath, color.grey,
color.end)
print(colored('error', 'error')
+ ': {} is not a file'.format(
colored(filepath, 'filepath')))
exit(-1)
@ -87,8 +91,9 @@ def write_yamlfile(filepath, datamap):
with open(filepath, 'w') as f:
yaml.dump(datamap, f)
except IOError:
print '{}error{} : impossible to read file {}{:s}{}'.format(
color.red, color.grey, color.cyan, filepath, color.end)
print(colored('error', 'error')
+ ': impossible to read file {}'.format(
colored(filepath, 'filepath')))
exit(-1)
@ -98,8 +103,9 @@ def read_yamlfile(filepath):
with open(filepath, 'r') as f:
return yaml.load(f)
except IOError:
print '{}error{} : impossible to read file {}{:s}{}'.format(
color.red, color.grey, color.cyan, filepath, color.end)
print(colored('error', 'error')
+ ': impossible to read file {}'.format(
colored(filepath, 'filepath')))
exit(-1)
@ -137,8 +143,9 @@ def load_externalbibfile(fullbibpath):
parser = pybtex.database.input.bibyaml.Parser()
bib_data = parser.parse_file(fullbibpath)
else:
print '{}error{}: {}{}{} not recognized format for bibliography{}'.format(
color.red, color.grey, color.cyan, ext, color.grey, color.end)
print(colored('error', 'error')
+ ': {} not recognized format for bibliography'.format(
colored(ext, 'cyan')))
exit(-1)
return bib_data

@ -172,7 +172,7 @@ class Paper(object):
return BASE_META.copy()
@classmethod
def many_from_path(cls, bibpath):
def many_from_path(cls, bibpath, fatal=True):
"""Extract list of papers found in bibliographic files in path.
"""
bibpath = files.clean_path(bibpath)
@ -182,5 +182,15 @@ class Paper(object):
else:
all_files = [bibpath]
bib_data = [files.load_externalbibfile(f) for f in all_files]
return [Paper(bibentry=b.entries[k], citekey=k)
for b in bib_data for k in b.entries]
if fatal:
return [Paper(bibentry=b.entries[k], citekey=k)
for b in bib_data for k in b.entries]
else:
papers = []
for b in bib_data:
for k in b.entries:
try:
papers.append(Paper(bibentry=b.entries[k], citekey=k))
except ValueError, e:
print "Warning, skipping paper (%s)." % e
return papers

@ -1,16 +1,27 @@
# display formatting
import color
from color import colored
def person_repr(p):
return ' '.join(s for s in [' '.join(p.first(abbr = True)),
' '.join(p.middle(abbr = True)),
' '.join(p.prelast(abbr = False)),
' '.join(p.last(abbr = False)),
' '.join(p.lineage(abbr = True))] if s)
return ' '.join(s for s in [
' '.join(p.first(abbr=True)),
' '.join(p.middle(abbr=True)),
' '.join(p.prelast(abbr=False)),
' '.join(p.last(abbr=False)),
' '.join(p.lineage(abbr=True))] if s)
def short_authors(bibentry):
authors = [person_repr(p) for p in bibentry.persons['author']]
if len(authors) < 3:
return ', '.join(authors)
else:
return authors[0] + (' et al.' if len(authors) > 1 else '')
def bib_oneliner(bibentry):
authors = ', '.join(person_repr(p) for p in bibentry.persons['author'])
authors = short_authors(bibentry)
title = bibentry.fields['title']
year = bibentry.fields.get('year', '')
journal = ''
@ -18,14 +29,18 @@ def bib_oneliner(bibentry):
if bibentry.type == 'inproceedings':
field = 'booktitle'
journal = bibentry.fields.get(field, '')
return u'{}{}{} \"{}{}{}\" {}{}{} {}({}{}{}){}'.format(
color.green, authors, color.grey, color.bcyan, title, color.grey,
color.yellow, journal, color.end, color.grey, color.end, year,
color.grey, color.end)
return u'{authors} \"{title}\" {journal} ({year})'.format(
authors=colored(authors, 'green'),
title=title,
journal=colored(journal, 'yellow'),
year=year,
)
def bib_desc(bib_data):
article = bib_data.entries[list(bib_data.entries.keys())[0]]
s = '\n'.join('author: {}'.format(person_repr(p)) for p in article.persons['author'])
s = '\n'.join('author: {}'.format(person_repr(p))
for p in article.persons['author'])
s += '\n'
s += '\n'.join('{}: {}'.format(k, v) for k, v in article.fields.items())
return s

@ -1,4 +1,4 @@
import color
from .color import colored
import os
import files
@ -25,11 +25,11 @@ class Repository(object):
citekey = self.citekeys[int(number)]
paper = self.paper_from_citekey(citekey)
return paper
except KeyError:
except (IndexError, ValueError):
if fatal:
print('{}error{}: no paper with number {}{}{}'.format(
color.error, color.normal, color.citekey, citekey,
color.end))
print(colored('error', 'error')
+ ': no paper with number {}'.format(
colored(number, 'citekey')))
exit(-1)
raise(IOError('file not found'))
@ -40,9 +40,9 @@ class Repository(object):
metapath=self.path_to_paper_file(citekey, 'meta'))
else:
if fatal:
print('{}error{}: no paper with citekey {}{}{}'.format(
color.error, color.normal, color.citekey, citekey,
color.end))
print(colored('error', 'error')
+ ': no paper with citekey {}'.format(
colored(citekey, 'citekey')))
exit(-1)
raise(IOError('file not found'))
@ -54,8 +54,9 @@ class Repository(object):
return self.paper_from_number(key, fatal=False)
except IOError:
if fatal:
print('{}error{}: paper with citekey or number {}{}{} not found{}'.format(
color.error, color.normal, color.citekey, key, color.normal, color.end))
print(colored('error', 'error')
+ (': paper with citekey or number %s not found'
% colored(key, 'citekey')))
exit(-1)
raise(IOError('file not found'))
@ -141,7 +142,7 @@ class Repository(object):
repo = cls()
if papersdir is None:
papersdir = files.find_papersdir()
repo.papersdir = papersdir
repo.papersdir = files.clean_path(papersdir)
repo.load()
return repo

Loading…
Cancel
Save