From e9b03734568f5b43857eb8333afaf1782a62abab Mon Sep 17 00:00:00 2001 From: Jonathan Grizou Date: Thu, 4 Jul 2013 00:09:17 +0200 Subject: [PATCH 1/4] Some test on texnote --- papers/plugs/texnote/texnote.py | 54 ++++++++++++++++++++++----------- 1 file changed, 37 insertions(+), 17 deletions(-) diff --git a/papers/plugs/texnote/texnote.py b/papers/plugs/texnote/texnote.py index c2bdbbd..7dbef86 100644 --- a/papers/plugs/texnote/texnote.py +++ b/papers/plugs/texnote/texnote.py @@ -1,16 +1,17 @@ import os import shutil import subprocess +import collections from ... import repo -from ...configs import config from ... import files +from ...configs import config from ...plugins import PapersPlugin from ...commands.helpers import add_references_argument, parse_reference from ...events import RemoveEvent - +TEXNOTE_PARSER_NAME = 'texnote' TEXNOTE_SECTION = 'texnote' TEXNOTE_SAMPLE_FILE = os.path.join(os.path.dirname(__file__), 'note_sample.tex') TEXNOTE_DIR = 'texnote' @@ -18,6 +19,16 @@ TEXNOTE_DIR = 'texnote' class TexnotePlugin(PapersPlugin): + def __init__(self): + self.name = TEXNOTE_PARSER_NAME + + #self.rp = repo.Repository(config()) + + self.texcmds = collections.OrderedDict([ + ('remove', self.remove), + ('edit', self.edit), + ]) + def parser(self, subparsers): parser = subparsers.add_parser(self.name, help="edit advance note in latex") sub = parser.add_subparsers(title="valid texnote commands", dest="texcmd") @@ -26,21 +37,30 @@ class TexnotePlugin(PapersPlugin): p = sub.add_parser("edit", help="edit the reference texnote") add_references_argument(p, single=True) #add_references_argument(parser, single=True) - parser.add_argument('-v', '--view', action='store_true', help='open the paper in a pdf viewer', default=None) + p.add_argument('-v', '--view', action='store_true', help='open the paper in a pdf viewer', default=None) return parser def command(self, args): - ui = args.ui texcmd = args.texcmd + del args.texcmd + + self.texcmds[texcmd](args) + + def remove(self, args): reference = args.reference - view = args.view + print('Should remove {}'.format(reference)) + + def edit(self, args): + reference = args.reference + view = args.view + print('Should remove {}'.format(reference)) if view is not None: subprocess.Popen(['papers', 'open', reference]) - if texcmd == 'edit': - open_texnote(ui, reference) + + #open_texnote(ui, reference) def toto(self): print "toto" @@ -55,16 +75,16 @@ def remove(rmevent): texplug = TexnotePlugin.get_instance() texplug.toto() # HACK : transfer repo via RemoveEvent, do not recreate one - rp = repo.Repository(config()) - paper = rp.get_paper(parse_reference(rmevent.ui, rp, rmevent.citekey)) - if 'texnote' in paper.metadata: - try: - os.remove(paper.metadata['texnote']) - except OSError: - pass # For some reason, the texnote file didn't exist - paper.metadata.pop('texnote') - metapath = rp.path_to_paper_file(paper.citekey, 'meta') - files.save_meta(paper.metadata, metapath) + #rp = repo.Repository(config()) + #paper = rp.get_paper(parse_reference(rmevent.ui, rp, rmevent.citekey)) + #if 'texnote' in paper.metadata: + # try: + # os.remove(paper.metadata['texnote']) + # except OSError: + # pass # For some reason, the texnote file didn't exist + # paper.metadata.pop('texnote') + # metapath = rp.path_to_paper_file(paper.citekey, 'meta') + # files.save_meta(paper.metadata, metapath) def open_texnote(ui, ref): From 49bdd9301996248ab17d3ebae9c3dc40ab22f247 Mon Sep 17 00:00:00 2001 From: jgrizou Date: Thu, 4 Jul 2013 10:50:35 +0200 Subject: [PATCH 2/4] Enable edit command with option, e.g. "gvim -f" --- papers/files.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/papers/files.py b/papers/files.py index fa79d03..41ffc5d 100644 --- a/papers/files.py +++ b/papers/files.py @@ -151,7 +151,7 @@ def _parse_bibdata_formated_stream(stream, fmt): pass raise ValueError('content format is not recognized.') -def parse_bibdata(content, format_ = None): +def parse_bibdata(content, format_=None): """Parse bib data from string or stream. Raise ValueError if no bibdata is present. @@ -188,7 +188,9 @@ def editor_input(editor, initial="", suffix=None): tfile_name = temp_file.name temp_file.write(initial) temp_file.flush() - subprocess.call([editor, tfile_name]) + cmd = editor.split() # this enable editor command with option, e.g. gvim -f + cmd.append(tfile_name) + subprocess.call(cmd) with open(tfile_name) as temp_file: content = temp_file.read() os.remove(tfile_name) From 073d03e2fbe1959d24e5fe7339493eca0eb293fb Mon Sep 17 00:00:00 2001 From: jgrizou Date: Thu, 4 Jul 2013 10:55:49 +0200 Subject: [PATCH 3/4] Enable open command with option, e.g. "evince -f" --- papers/commands/open_cmd.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/papers/commands/open_cmd.py b/papers/commands/open_cmd.py index c00d4e9..647a16a 100644 --- a/papers/commands/open_cmd.py +++ b/papers/commands/open_cmd.py @@ -29,7 +29,9 @@ def command(args): with_command = config().open_cmd try: filepath = paper.get_document_path() - subprocess.Popen([with_command, filepath]) + cmd = with_command.split() + cmd.append(filepath) + subprocess.Popen(cmd) ui.print_('{} opened.'.format(color.dye(filepath, color.filepath))) except NoDocumentFile: ui.error('No document associated with the entry {}.'.format( From ebff1bb4e49b7287d7d53505252af2869c70bfef Mon Sep 17 00:00:00 2001 From: jgrizou Date: Thu, 4 Jul 2013 12:10:23 +0200 Subject: [PATCH 4/4] Updated texnote, not working yet Add a check_directory in files.py --- papers/files.py | 11 +++ papers/plugins.py | 6 -- .../texnote/{note_sample.tex => style.sty} | 0 papers/plugs/texnote/template.tex | 35 ++++++++++ papers/plugs/texnote/texnote.py | 68 ++++++++++++------- setup.py | 2 +- 6 files changed, 89 insertions(+), 33 deletions(-) rename papers/plugs/texnote/{note_sample.tex => style.sty} (100%) create mode 100644 papers/plugs/texnote/template.tex diff --git a/papers/files.py b/papers/files.py index 41ffc5d..89aaba9 100644 --- a/papers/files.py +++ b/papers/files.py @@ -63,6 +63,17 @@ def name_from_path(fullpdfpath, verbose=False): return name, ext +def check_directory(path, fail=False): + if fail: + if not os.path.exists(path): + raise IOError("File does not exist: {}.".format(path)) + if not os.path.isdir(path): + raise IOError("{} is not a directory.".format(path)) + return True + else: + return os.path.exists(path) and os.path.isdir(path) + + def check_file(path, fail=False): if fail: if not os.path.exists(path): diff --git a/papers/plugins.py b/papers/plugins.py index 062196e..6443600 100644 --- a/papers/plugins.py +++ b/papers/plugins.py @@ -1,5 +1,4 @@ import importlib -from .configs import config PLUGIN_NAMESPACE = 'plugs' @@ -36,7 +35,6 @@ class PapersPlugin(object): This is a basic example """ - ui = args.ui strings = args.strings for s in strings: @@ -58,7 +56,6 @@ def load_plugins(ui, names): """ for name in names: modname = '%s.%s.%s.%s' % ('papers', PLUGIN_NAMESPACE, name, name) - #try: try: namespace = importlib.import_module(modname) except ImportError as exc: @@ -74,9 +71,6 @@ def load_plugins(ui, names): _classes.append(obj) _instances[obj] = obj() - #except: - # ui.warning('error loading plugin {}'.format(name)) - def get_plugins(): return _instances diff --git a/papers/plugs/texnote/note_sample.tex b/papers/plugs/texnote/style.sty similarity index 100% rename from papers/plugs/texnote/note_sample.tex rename to papers/plugs/texnote/style.sty diff --git a/papers/plugs/texnote/template.tex b/papers/plugs/texnote/template.tex new file mode 100644 index 0000000..fc97042 --- /dev/null +++ b/papers/plugs/texnote/template.tex @@ -0,0 +1,35 @@ +\documentclass{article} + +\usepackage{amsmath} +\usepackage{amsfonts} +\usepackage{amssymb} + +\usepackage{algorithm} +\usepackage{algorithmic} + +\usepackage{graphics} +\usepackage{graphicx} + +\usepackage{hyperref} +\usepackage{verbatim} +\usepackage{url} + +\usepackage{caption} +\usepackage{subcaption} + +\begin{document} + +\begin{center} +\Large{\textbf{TITLE}} \\ [0.2cm] +\small{\textsc{AUTHOR}} \\ [0.2cm] +\normalsize{\textsc{YEAR}} \\ [1cm] +\end{center} + +\begin{abstract} + ABSTRACT +\end{abstract} + +\section{Notes} + Write your notes here. + +\end{document} diff --git a/papers/plugs/texnote/texnote.py b/papers/plugs/texnote/texnote.py index 7dbef86..161925f 100644 --- a/papers/plugs/texnote/texnote.py +++ b/papers/plugs/texnote/texnote.py @@ -11,57 +11,73 @@ from ...commands.helpers import add_references_argument, parse_reference from ...events import RemoveEvent -TEXNOTE_PARSER_NAME = 'texnote' TEXNOTE_SECTION = 'texnote' -TEXNOTE_SAMPLE_FILE = os.path.join(os.path.dirname(__file__), 'note_sample.tex') -TEXNOTE_DIR = 'texnote' +TEXNOTE_DIR = os.path.join(config().papers_dir, 'texnote') +TEXNOTE_TEMPLATE = os.path.join(TEXNOTE_DIR, 'template.tex') +TEXNOTE_STYLE = os.path.join(TEXNOTE_DIR, 'style.sty') + +TEXNOTE_DEFAULT_TEMPLATE = os.path.join(os.path.dirname(__file__), 'template.tex') +TEXNOTE_DEFAULT_STYLE = os.path.join(os.path.dirname(__file__), 'style.sty') class TexnotePlugin(PapersPlugin): def __init__(self): - self.name = TEXNOTE_PARSER_NAME - - #self.rp = repo.Repository(config()) + self.name = TEXNOTE_SECTION + if not files.check_directory(TEXNOTE_DIR): + os.mkdir(TEXNOTE_DIR) + if not files.check_file(TEXNOTE_TEMPLATE): + shutil.copy(TEXNOTE_DEFAULT_TEMPLATE, TEXNOTE_TEMPLATE) + if not files.check_file(TEXNOTE_STYLE): + shutil.copy(TEXNOTE_DEFAULT_STYLE, TEXNOTE_STYLE) self.texcmds = collections.OrderedDict([ ('remove', self.remove), ('edit', self.edit), + ('edit_style', self.edit_style), + ('edit_template', self.edit_template), ]) def parser(self, subparsers): - parser = subparsers.add_parser(self.name, help="edit advance note in latex") - sub = parser.add_subparsers(title="valid texnote commands", dest="texcmd") - p = sub.add_parser("remove", help="remove a reference") + parser = subparsers.add_parser(self.name, help='edit advance note in latex') + sub = parser.add_subparsers(title='valid texnote commands', dest='texcmd') + # remove + p = sub.add_parser('remove', help='remove a reference') add_references_argument(p, single=True) - p = sub.add_parser("edit", help="edit the reference texnote") + # edit + p = sub.add_parser('edit', help='edit the reference texnote') + p.add_argument('-v', '--view', action='store_true', + help='open the paper in a pdf viewer', default=None) add_references_argument(p, single=True) - #add_references_argument(parser, single=True) - p.add_argument('-v', '--view', action='store_true', help='open the paper in a pdf viewer', default=None) + # edit_style + p = sub.add_parser('edit_style', help='edit the latex style used by texnote') + #edit_template + p = sub.add_parser('edit_template', help='edit the latex template used by texnote') return parser def command(self, args): - texcmd = args.texcmd del args.texcmd + self.texcmds[texcmd](**vars(args)) - self.texcmds[texcmd](args) - - def remove(self, args): - reference = args.reference - print('Should remove {}'.format(reference)) + def remove(self, ui, reference): + rp = repo.Repository(config()) + key = parse_reference(ui, rp, reference) + print('Should remove {}'.format(key)) - - def edit(self, args): - reference = args.reference - view = args.view - - print('Should remove {}'.format(reference)) + def edit(self, ui, reference, view=None): + print('Should edit {}'.format(reference)) if view is not None: subprocess.Popen(['papers', 'open', reference]) #open_texnote(ui, reference) + def edit_style(self): + pass + + def edit_template(self): + pass + def toto(self): print "toto" @@ -73,7 +89,7 @@ class TexnotePlugin(PapersPlugin): @RemoveEvent.listen() def remove(rmevent): texplug = TexnotePlugin.get_instance() - texplug.toto() + texplug.remove(rmevent.ui, rmevent.citekey) # HACK : transfer repo via RemoveEvent, do not recreate one #rp = repo.Repository(config()) #paper = rp.get_paper(parse_reference(rmevent.ui, rp, rmevent.citekey)) @@ -112,7 +128,7 @@ def open_texnote(ui, ref): autofill_texnote(texnote_path, paper.bibentry) #open the file using the config editor - edit_cmd = config(TEXTNOTE_SECTION).get('edit_cmd', config().edit_cmd) + edit_cmd = config(TEXNOTE_SECTION).get('edit_cmd', config().edit_cmd) subprocess.Popen([edit_cmd, texnote_path]) diff --git a/setup.py b/setup.py index 2512683..952f549 100644 --- a/setup.py +++ b/setup.py @@ -10,7 +10,7 @@ setup(name='papers', description='research papers manager', requires=['pybtex'], packages=find_packages(), - package_data={'': ['*.tex']}, + package_data={'': ['*.tex', '*.sty']}, scripts=['papers/papers'] )