parent
8e467da979
commit
e1ae125916
@ -1,103 +0,0 @@
|
|||||||
from .latex_tools import format_for_latex
|
|
||||||
|
|
||||||
AUTOFILL_TPL = '\\autofill{FIELD}{INFO}'
|
|
||||||
|
|
||||||
|
|
||||||
def get_autofill_pattern(field):
|
|
||||||
return AUTOFILL_TPL.replace('FIELD', field)
|
|
||||||
|
|
||||||
|
|
||||||
def autofill(text, paper):
|
|
||||||
for field, info in get_autofill_info(paper):
|
|
||||||
text = replace_pattern(text,
|
|
||||||
get_autofill_pattern(field),
|
|
||||||
format_for_latex(info))
|
|
||||||
return text
|
|
||||||
|
|
||||||
|
|
||||||
def get_autofill_info(paper):
|
|
||||||
fields = paper.bibentry.fields
|
|
||||||
tags = paper.tags
|
|
||||||
info = []
|
|
||||||
if 'year' in fields:
|
|
||||||
info.append(('YEAR', fields['year']))
|
|
||||||
if 'title' in fields:
|
|
||||||
info.append(('TITLE', fields['title']))
|
|
||||||
if 'abstract' in fields:
|
|
||||||
info.append(('ABSTRACT', fields['abstract']))
|
|
||||||
info.append(('AUTHOR', get_author_as_str(paper)))
|
|
||||||
info.append(('TAG', ', '.join(tags)))
|
|
||||||
return info
|
|
||||||
|
|
||||||
|
|
||||||
def find_first_level_delimiter(text, opening='{', closing='}'):
|
|
||||||
if opening in text:
|
|
||||||
match = text.split(opening, 1)[1]
|
|
||||||
cnt = 1
|
|
||||||
for index in xrange(len(match)):
|
|
||||||
if match[index] in (opening + closing):
|
|
||||||
cnt = (cnt + 1) if match[index] == opening else (cnt - 1)
|
|
||||||
if not cnt:
|
|
||||||
return match[:index]
|
|
||||||
|
|
||||||
|
|
||||||
def fill_pattern(pattern, info):
|
|
||||||
return pattern.replace('INFO', info)
|
|
||||||
|
|
||||||
|
|
||||||
def find_pattern(text, pattern):
|
|
||||||
look_at = pattern.replace('INFO}', '')
|
|
||||||
found = []
|
|
||||||
start = -1
|
|
||||||
while True:
|
|
||||||
start = text.find(look_at, start + 1)
|
|
||||||
if start < 0:
|
|
||||||
break
|
|
||||||
delim_start = start + len(look_at) - 1
|
|
||||||
repl = find_first_level_delimiter(text[delim_start:])
|
|
||||||
found.append(pattern.replace('INFO', repl))
|
|
||||||
return found
|
|
||||||
|
|
||||||
|
|
||||||
def replace_pattern(text, pattern, info):
|
|
||||||
repl = fill_pattern(pattern, info)
|
|
||||||
for found in find_pattern(text, pattern):
|
|
||||||
text = text.replace(found, repl)
|
|
||||||
return text
|
|
||||||
|
|
||||||
|
|
||||||
##### ugly replace by proper #####
|
|
||||||
def get_author_as_str(paper):
|
|
||||||
persons = paper.bibentry.persons
|
|
||||||
authors = []
|
|
||||||
if 'author' in persons:
|
|
||||||
for author in persons['author']:
|
|
||||||
authors.append(format_author(author))
|
|
||||||
return concatenate_authors(authors)
|
|
||||||
|
|
||||||
|
|
||||||
def format_author(author):
|
|
||||||
first = author.first()
|
|
||||||
middle = author.middle()
|
|
||||||
last = author.last()
|
|
||||||
formatted = ''
|
|
||||||
if first:
|
|
||||||
formatted += first[0]
|
|
||||||
if middle:
|
|
||||||
formatted += ' ' + middle[0] + '.'
|
|
||||||
if last:
|
|
||||||
formatted += ' ' + last[0]
|
|
||||||
return formatted
|
|
||||||
|
|
||||||
|
|
||||||
def concatenate_authors(authors):
|
|
||||||
concatenated = ''
|
|
||||||
for a in range(len(authors)):
|
|
||||||
if len(authors) > 1 and a > 0:
|
|
||||||
if a == len(authors) - 1:
|
|
||||||
concatenated += ' and '
|
|
||||||
else:
|
|
||||||
concatenated += ', '
|
|
||||||
concatenated += authors[a]
|
|
||||||
return concatenated
|
|
||||||
#####
|
|
@ -1,42 +0,0 @@
|
|||||||
%DO_NOT_MODIFY{
|
|
||||||
%This file is the starting point for all notes
|
|
||||||
%You can edit the template of this file using: papers texnote edit_template -B
|
|
||||||
\documentclass{article}
|
|
||||||
%All texnote much share the same style so that we can compile them all together without problem
|
|
||||||
%You are free to edit the style file using: papers texnote edit_template -S
|
|
||||||
\usepackage{INFO} %The style location is automatically filled
|
|
||||||
\begin{document}
|
|
||||||
%}
|
|
||||||
%HEADER{
|
|
||||||
%This part is the header, you can modify it as you wish. It will be removed when compiling higher level notes
|
|
||||||
%TITLE, AUTHOR, YEAR, ABSTRACT will be automatically replaced with respect to the associated bibfile thanks to the \autofill{*FIELD*}{} marker.
|
|
||||||
\begin{center}
|
|
||||||
\Large{\textbf{\autofill{TITLE}{Title not found}}} \\ [0.2cm]
|
|
||||||
\small{\textsc{\autofill{AUTHOR}{Author(s) not found}}} \\ [0.2cm]
|
|
||||||
\normalsize{\textsc{\autofill{YEAR}{Year not found}}} \\ [1cm]
|
|
||||||
\end{center}
|
|
||||||
\textbf{Keywords:} \autofill{TAG}{Tags not found}
|
|
||||||
\begin{abstract}
|
|
||||||
\autofill{ABSTRACT}{Abstract not found}
|
|
||||||
\end{abstract}
|
|
||||||
%Write your notes below
|
|
||||||
%Do not use \section{} or \subsection{} as they may be source of problems when concatenating notes. Use \paragraph{} instead.
|
|
||||||
%}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
%DO_NOT_MODIFY{
|
|
||||||
%You can only cite papers added in you repo.
|
|
||||||
%To update the bib file with latest papers info: papers texnote generate_bib
|
|
||||||
\bibliographystyle{INFO} %The bibstyle is automatically filled (default is ieeetr)
|
|
||||||
%You can change the bibliography style in the config file : .papersrc
|
|
||||||
%[texnote]
|
|
||||||
%bib_style = plain
|
|
||||||
\bibliography{INFO} %The bibliography location is automatically filled
|
|
||||||
%The glossary style is default
|
|
||||||
\printglossary
|
|
||||||
%You can add a new glossary entry using \dictentry{'name'}{'description'} (see style file). This will automatically add a new reference and display it in the glossary even if never referenced (using \gls{'name'}).
|
|
||||||
\end{document}
|
|
||||||
%}
|
|
@ -1,11 +0,0 @@
|
|||||||
%DO_NOT_MODIFY{
|
|
||||||
%Dummy command used as marker for the autofill
|
|
||||||
\newcommand{\autofill}[2]{#2}
|
|
||||||
%command for easy glossary, requires to run: 'makeglossaries filename'
|
|
||||||
\usepackage[nonumberlist]{glossaries}
|
|
||||||
\newcommand{\dictentry}[2]{%
|
|
||||||
\newglossaryentry{#1}{name=#1,description={#2}}%
|
|
||||||
\glslink{#1}{}%
|
|
||||||
}
|
|
||||||
\makeglossaries
|
|
||||||
%}
|
|
@ -1,63 +0,0 @@
|
|||||||
import os
|
|
||||||
import subprocess
|
|
||||||
|
|
||||||
|
|
||||||
DO_NOT_MODIFY_PATTERN = '%DO_NOT_MODIFY{INFO}'
|
|
||||||
HEADER_PATTERN = '%HEADER{INFO}'
|
|
||||||
|
|
||||||
|
|
||||||
def format_for_latex(text):
|
|
||||||
text = text.replace('_', '\_')
|
|
||||||
return text
|
|
||||||
|
|
||||||
from .autofill_tools import replace_pattern
|
|
||||||
|
|
||||||
|
|
||||||
def extract_note(text):
|
|
||||||
text = replace_pattern(text, DO_NOT_MODIFY_PATTERN, 'INFO')
|
|
||||||
text = text.replace(DO_NOT_MODIFY_PATTERN, '')
|
|
||||||
text = replace_pattern(text, HEADER_PATTERN, 'INFO')
|
|
||||||
text = text.replace(HEADER_PATTERN, '')
|
|
||||||
return remove_empty_lines(text)
|
|
||||||
|
|
||||||
|
|
||||||
def remove_empty_lines(text):
|
|
||||||
cleaned_text = ''
|
|
||||||
for line in text.split('\n'):
|
|
||||||
if line.strip():
|
|
||||||
cleaned_text += line + '\n'
|
|
||||||
return cleaned_text[:-1]
|
|
||||||
|
|
||||||
|
|
||||||
def full_compile(full_path_to_file, verbose=False):
|
|
||||||
FNULL = None
|
|
||||||
if not verbose:
|
|
||||||
FNULL = open(os.devnull, 'w')
|
|
||||||
filename, extension = os.path.splitext(full_path_to_file)
|
|
||||||
run_pdflatex(filename, stdout=FNULL)
|
|
||||||
run_bibtex(filename, stdout=FNULL)
|
|
||||||
run_makeglossaries(filename, stdout=FNULL)
|
|
||||||
run_pdflatex(filename, stdout=FNULL, nb_time=3)
|
|
||||||
|
|
||||||
|
|
||||||
def run_command(command, full_path_to_file, stdout=None, nb_time=1):
|
|
||||||
origWD = os.getcwd() # remember our original working directory
|
|
||||||
folder, filename = os.path.split(full_path_to_file)
|
|
||||||
os.chdir(folder)
|
|
||||||
for _ in xrange(nb_time):
|
|
||||||
cmd = command.split()
|
|
||||||
cmd.append(filename)
|
|
||||||
subprocess.call(cmd, stdout=stdout)
|
|
||||||
os.chdir(origWD) # get back to our original working directory
|
|
||||||
|
|
||||||
|
|
||||||
def run_pdflatex(full_path_to_file, stdout=None, nb_time=1):
|
|
||||||
run_command('pdflatex', full_path_to_file, stdout, nb_time)
|
|
||||||
|
|
||||||
|
|
||||||
def run_bibtex(full_path_to_file, stdout=None, nb_time=1):
|
|
||||||
run_command('bibtex', full_path_to_file, stdout, nb_time)
|
|
||||||
|
|
||||||
|
|
||||||
def run_makeglossaries(full_path_to_file, stdout=None, nb_time=1):
|
|
||||||
run_command('makeglossaries', full_path_to_file, stdout, nb_time)
|
|
@ -1,268 +0,0 @@
|
|||||||
import os
|
|
||||||
import shutil
|
|
||||||
import subprocess
|
|
||||||
import collections
|
|
||||||
|
|
||||||
from ... import repo
|
|
||||||
from ... import files
|
|
||||||
|
|
||||||
from ...uis import get_ui
|
|
||||||
from ...configs import config
|
|
||||||
from ...plugins import PapersPlugin
|
|
||||||
from ...events import RemoveEvent, RenameEvent
|
|
||||||
from ...commands.helpers import add_references_argument, parse_reference
|
|
||||||
|
|
||||||
from . import latex_tools
|
|
||||||
from .autofill_tools import autofill, replace_pattern
|
|
||||||
|
|
||||||
|
|
||||||
SECTION = 'texnote'
|
|
||||||
DIR = os.path.join(config().papers_dir, 'texnote')
|
|
||||||
TPL_DIR = os.path.join(DIR, 'template')
|
|
||||||
TPL_BODY = os.path.join(TPL_DIR, 'body.tex')
|
|
||||||
TPL_STYLE = os.path.join(TPL_DIR, 'style.sty')
|
|
||||||
TPL_BIB = os.path.join(TPL_DIR, 'bib.bib')
|
|
||||||
|
|
||||||
DFT_BODY = os.path.join(os.path.dirname(__file__), 'default_body.tex')
|
|
||||||
DFT_STYLE = os.path.join(os.path.dirname(__file__), 'default_style.sty')
|
|
||||||
|
|
||||||
STYLE_PATTERN = '\\usepackage{INFO}'
|
|
||||||
STYLE_INFO = os.path.splitext(TPL_STYLE)[0].replace(DIR, '')[1:]
|
|
||||||
BIB_PATTERN = '\\bibliography{INFO}'
|
|
||||||
BIB_INFO = os.path.splitext(TPL_BIB)[0].replace(DIR, '')[1:]
|
|
||||||
BIBSTYLE_PATTERN = '\\bibliographystyle{INFO}'
|
|
||||||
DFT_BIBSTYLE_INFO = 'ieeetr'
|
|
||||||
|
|
||||||
|
|
||||||
class TexnotePlugin(PapersPlugin):
|
|
||||||
|
|
||||||
name = SECTION
|
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
self.texcmds = collections.OrderedDict([
|
|
||||||
('remove', self.remove),
|
|
||||||
('edit', self.edit),
|
|
||||||
('edit_template', self.edit_template),
|
|
||||||
('generate_bib', self.generate_bib),
|
|
||||||
('clean', self.clean),
|
|
||||||
('generate_pdf', self.generate_pdf),
|
|
||||||
('extract_note', self.extract_note),
|
|
||||||
])
|
|
||||||
|
|
||||||
def _ensure_init(self):
|
|
||||||
if not files.check_directory(DIR):
|
|
||||||
os.mkdir(DIR)
|
|
||||||
if not files.check_directory(TPL_DIR):
|
|
||||||
os.mkdir(TPL_DIR)
|
|
||||||
if not files.check_file(TPL_BODY):
|
|
||||||
shutil.copy(DFT_BODY, TPL_BODY)
|
|
||||||
if not files.check_file(TPL_STYLE):
|
|
||||||
shutil.copy(DFT_STYLE, TPL_STYLE)
|
|
||||||
if not files.check_file(TPL_BIB):
|
|
||||||
self.generate_bib()
|
|
||||||
|
|
||||||
def get_commands(self, subparsers):
|
|
||||||
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.add_argument('-f', '--force', action='store_true',
|
|
||||||
help='do not ask for confirmation', default=False)
|
|
||||||
# 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=False)
|
|
||||||
p.add_argument('-w', '--with', dest='with_command', default=None,
|
|
||||||
help='command to use to open the file, default is the main config one. You can set one in the texnote config section')
|
|
||||||
add_references_argument(p, single=True)
|
|
||||||
# edit_template
|
|
||||||
p = sub.add_parser('edit_template',
|
|
||||||
help='edit the latex template used by texnote')
|
|
||||||
p.add_argument('-w', '--with', dest='with_command', default=None,
|
|
||||||
help='command to use to open the file, default is the main config one. You can set one in the texnote config section')
|
|
||||||
p.add_argument('-B', '--body', action='store_true',
|
|
||||||
help='edit the main body', default=False)
|
|
||||||
p.add_argument('-S', '--style', action='store_true',
|
|
||||||
help='open the style', default=False)
|
|
||||||
# generate_bib
|
|
||||||
p = sub.add_parser('generate_bib',
|
|
||||||
help='generate the latex bib used by texnote')
|
|
||||||
# clean
|
|
||||||
p = sub.add_parser('clean',
|
|
||||||
help='delete all but tex files and pdf document in the texnote folder')
|
|
||||||
p.add_argument('-f', '--force', action='store_true',
|
|
||||||
help='do not ask for confirmation', default=False)
|
|
||||||
p.add_argument('-d', '--deep', action='store_true',
|
|
||||||
help='also delete tex file and pdf document that are not associated to a paper', default=False)
|
|
||||||
p.add_argument('-p', '--pdf', action='store_true',
|
|
||||||
help='also delete all pdf document', default=False)
|
|
||||||
# generate_pdf
|
|
||||||
p = sub.add_parser('generate_pdf',
|
|
||||||
help='compile a texnote from its reference')
|
|
||||||
add_references_argument(p, single=True)
|
|
||||||
p.add_argument('-o', '--open', action='store_true', dest='open_pdf',
|
|
||||||
default=False, help='open the resulting pdf')
|
|
||||||
p.add_argument('-w', '--with', dest='with_command', default=None,
|
|
||||||
help='command to use to open the pdf, default is the main config one')
|
|
||||||
p.add_argument('-C', '--noclean', action='store_false', dest='clean',
|
|
||||||
default=True, help="don't clean document afterwards")
|
|
||||||
p.add_argument('-v', '--verbose', action='store_true', dest='verbose',
|
|
||||||
default=False, help="display stdout")
|
|
||||||
# extract_note
|
|
||||||
p = sub.add_parser('extract_note',
|
|
||||||
help='extract core note from its reference')
|
|
||||||
add_references_argument(p, single=True)
|
|
||||||
return [(self.name, self.command)]
|
|
||||||
|
|
||||||
def command(self, args):
|
|
||||||
self._ensure_init()
|
|
||||||
|
|
||||||
texcmd = args.texcmd
|
|
||||||
del args.texcmd
|
|
||||||
del args.prog
|
|
||||||
self.texcmds[texcmd](**vars(args))
|
|
||||||
|
|
||||||
def _texfile(self, citekey):
|
|
||||||
return os.path.join(DIR, citekey + '.tex')
|
|
||||||
|
|
||||||
def _exist_texfile(self, citekey):
|
|
||||||
return files.check_file(self._texfile(citekey))
|
|
||||||
|
|
||||||
def _ensure_texfile(self, citekey):
|
|
||||||
if not self._exist_texfile(citekey):
|
|
||||||
shutil.copy(TPL_BODY, self._texfile(citekey))
|
|
||||||
|
|
||||||
def get_bib_style(self):
|
|
||||||
default = DFT_BIBSTYLE_INFO
|
|
||||||
return config(SECTION).get('bib_style', default)
|
|
||||||
|
|
||||||
def _autofill_texfile(self, citekey):
|
|
||||||
with open(self._texfile(citekey)) as f:
|
|
||||||
text = f.read()
|
|
||||||
rp = repo.Repository(config())
|
|
||||||
if citekey in rp:
|
|
||||||
paper = rp.get_paper(citekey)
|
|
||||||
text = autofill(text, paper)
|
|
||||||
text = replace_pattern(text, STYLE_PATTERN, STYLE_INFO)
|
|
||||||
text = replace_pattern(text, BIB_PATTERN, BIB_INFO)
|
|
||||||
text = replace_pattern(text, BIBSTYLE_PATTERN, self.get_bib_style())
|
|
||||||
with open(self._texfile(citekey), "w") as f:
|
|
||||||
f.write(text)
|
|
||||||
|
|
||||||
def get_texfile(self, citekey, autofill=False):
|
|
||||||
""" This function returns the name of the texfile and
|
|
||||||
ensure it exist and it is filled with info from the bibfile if possible"""
|
|
||||||
self._ensure_texfile(citekey)
|
|
||||||
if autofill:
|
|
||||||
self._autofill_texfile(citekey)
|
|
||||||
return self._texfile(citekey)
|
|
||||||
|
|
||||||
def get_edit_cmd(self):
|
|
||||||
default = config().edit_cmd
|
|
||||||
return config(SECTION).get('edit_cmd', default)
|
|
||||||
|
|
||||||
def edit(self, reference, view=False, with_command=None):
|
|
||||||
if view:
|
|
||||||
subprocess.Popen(['papers', 'open', reference])
|
|
||||||
if with_command is None:
|
|
||||||
with_command = self.get_edit_cmd()
|
|
||||||
|
|
||||||
rp = repo.Repository(config())
|
|
||||||
citekey = parse_reference(rp, reference)
|
|
||||||
files.edit_file(with_command,
|
|
||||||
self.get_texfile(citekey, autofill=True),
|
|
||||||
temporary=False)
|
|
||||||
|
|
||||||
def edit_template(self, body=False, style=False, with_command=None):
|
|
||||||
if with_command is None:
|
|
||||||
with_command = self.get_edit_cmd()
|
|
||||||
if body:
|
|
||||||
files.edit_file(with_command, TPL_BODY, temporary=False)
|
|
||||||
if style:
|
|
||||||
files.edit_file(with_command, TPL_STYLE, temporary=False)
|
|
||||||
|
|
||||||
def remove(self, reference, force=False):
|
|
||||||
rp = repo.Repository(config())
|
|
||||||
citekey = parse_reference(rp, reference)
|
|
||||||
if not force:
|
|
||||||
ui = get_ui()
|
|
||||||
are_you_sure = 'Are you sure you want to delete [{}]'.format(citekey)
|
|
||||||
sure = ui.input_yn(question=are_you_sure, default='n')
|
|
||||||
if force or sure:
|
|
||||||
os.remove(self.get_texfile(citekey))
|
|
||||||
|
|
||||||
def rename(self, old_citekey, new_citekey, overwrite=False):
|
|
||||||
if self._exist_texfile(old_citekey):
|
|
||||||
if not overwrite and self._exist_texfile(new_citekey):
|
|
||||||
ui = get_ui()
|
|
||||||
are_you_sure = 'Are you sure you want to delete [{}]'.format(old_citekey)
|
|
||||||
sure = ui.input_yn(question=are_you_sure, default='n')
|
|
||||||
if overwrite or sure:
|
|
||||||
shutil.move(self.get_texfile(old_citekey), self.get_texfile(new_citekey))
|
|
||||||
|
|
||||||
def generate_bib(self):
|
|
||||||
if files.check_file(TPL_BIB):
|
|
||||||
os.remove(TPL_BIB)
|
|
||||||
cmd = 'papers list -k |xargs papers export >> {}'.format(TPL_BIB)
|
|
||||||
os.system(cmd)
|
|
||||||
|
|
||||||
def clean(self, force=False, deep=False, pdf=False):
|
|
||||||
if deep:
|
|
||||||
rp = repo.Repository(config())
|
|
||||||
to_keep = ['.tex']
|
|
||||||
if not pdf:
|
|
||||||
to_keep.append('.pdf')
|
|
||||||
for f in os.listdir(DIR):
|
|
||||||
path = os.path.join(DIR, f)
|
|
||||||
if os.path.isfile(path):
|
|
||||||
name, extension = os.path.splitext(path)
|
|
||||||
if extension in to_keep:
|
|
||||||
if not deep:
|
|
||||||
continue
|
|
||||||
citekey, _ = os.path.splitext(f)
|
|
||||||
if citekey in rp:
|
|
||||||
continue
|
|
||||||
if not force:
|
|
||||||
ui = get_ui()
|
|
||||||
are_you_sure = 'Are you sure you want to delete file [{}]'.format(path)
|
|
||||||
sure = ui.input_yn(question=are_you_sure, default='n')
|
|
||||||
if force or sure:
|
|
||||||
os.remove(path)
|
|
||||||
|
|
||||||
def generate_pdf(self, reference, open_pdf=False,
|
|
||||||
with_command=None, clean=True, verbose=False):
|
|
||||||
rp = repo.Repository(config())
|
|
||||||
citekey = parse_reference(rp, reference)
|
|
||||||
path = self.get_texfile(citekey, autofill=True)
|
|
||||||
latex_tools.full_compile(path, verbose)
|
|
||||||
if clean:
|
|
||||||
self.clean(force=True)
|
|
||||||
if open_pdf:
|
|
||||||
if with_command is None:
|
|
||||||
with_command = config().open_cmd
|
|
||||||
cmd = with_command.split()
|
|
||||||
cmd.append(os.path.splitext(path)[0] + '.pdf')
|
|
||||||
subprocess.Popen(cmd)
|
|
||||||
|
|
||||||
def extract_note(self, reference):
|
|
||||||
rp = repo.Repository(config())
|
|
||||||
citekey = parse_reference(rp, reference)
|
|
||||||
path = self.get_texfile(citekey, autofill=True)
|
|
||||||
with open(path) as f:
|
|
||||||
text = f.read()
|
|
||||||
print latex_tools.extract_note(text)
|
|
||||||
|
|
||||||
|
|
||||||
@RemoveEvent.listen()
|
|
||||||
def remove(rmevent):
|
|
||||||
texplug = TexnotePlugin.get_instance()
|
|
||||||
texplug.remove(rmevent.citekey, force=True)
|
|
||||||
|
|
||||||
|
|
||||||
@RenameEvent.listen()
|
|
||||||
def rename(renamevent):
|
|
||||||
texplug = TexnotePlugin.get_instance()
|
|
||||||
texplug.rename(renamevent.old_citekey,
|
|
||||||
renamevent.paper.citekey,
|
|
||||||
overwrite=True)
|
|
Loading…
Reference in new issue