mirror of
https://github.com/wassname/jupyter_contrib_nbextensions.git
synced 2026-06-27 16:10:24 +08:00
also remove latex_envs nbconvert stuff
This commit is contained in:
+1
-3
@@ -60,9 +60,7 @@ exclude_patterns = [
|
||||
'example.ipynb',
|
||||
'README.md',
|
||||
'src/jupyter_contrib_nbextensions/nbextensions/exercise/history.md',
|
||||
'src/jupyter_contrib_nbextensions/nbextensions/latex_envs/doc/README.md',
|
||||
('src/jupyter_contrib_nbextensions/nbextensions/' +
|
||||
'slidemode/slidemode2/README.md'),
|
||||
'src/jupyter_contrib_nbextensions/nbextensions/slidemode/slidemode2/README.md', # noqa
|
||||
'venv',
|
||||
]
|
||||
|
||||
|
||||
@@ -2,7 +2,8 @@
|
||||
|
||||
import os
|
||||
|
||||
from .latex_envs import LenvsHTMLExporter, LenvsLatexExporter
|
||||
from latex_envs.latex_envs import LenvsHTMLExporter, LenvsLatexExporter
|
||||
|
||||
from .pp_highlighter import HighlighterPostProcessor, HighlighterPreprocessor
|
||||
from .pre_codefolding import CodeFoldingPreprocessor
|
||||
from .pre_collapsible_headings import CollapsibleHeadingsPreprocessor
|
||||
|
||||
@@ -1,461 +0,0 @@
|
||||
"""Classes providing nbconvert support for the latex_envs nbextension."""
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# Copyright (c) 2016, the IPython IPython-Contrib Development Team.
|
||||
#
|
||||
# Distributed under the terms of the Modified BSD License.
|
||||
#
|
||||
# -----------------------------------------------------------------------------
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# Imports
|
||||
# -----------------------------------------------------------------------------
|
||||
|
||||
# Stdlib imports
|
||||
# import os
|
||||
import re
|
||||
|
||||
# A small utilitary function
|
||||
from IPython.display import HTML, display
|
||||
from nbconvert.exporters.exporter import Exporter
|
||||
from nbconvert.exporters.html import HTMLExporter
|
||||
from nbconvert.exporters.latex import LatexExporter
|
||||
# from nbconvert.postprocessors.base import PostProcessorBase
|
||||
from nbconvert.filters.highlight import Highlight2HTML, Highlight2Latex
|
||||
from nbconvert.preprocessors import Preprocessor
|
||||
from traitlets import Bool, Dict
|
||||
from traitlets.config import Config
|
||||
|
||||
|
||||
# IPython imports
|
||||
|
||||
|
||||
def figcaption(text, label=" "):
|
||||
display(HTML("<div class=caption><b> Caption: </b> %s</div>"
|
||||
% text.replace('\n', '<br>')))
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# Preprocessors, Exporters, PostProcessors
|
||||
# -----------------------------------------------------------------------------
|
||||
|
||||
|
||||
class LenvsLatexPreprocessor(Preprocessor):
|
||||
"""
|
||||
:mod:`nbconvert` Preprocessor for the ``latex_envs`` nbextension.
|
||||
|
||||
For use for LaTeX output.
|
||||
"""
|
||||
|
||||
environmentMap = ['thm', 'lem', 'cor', 'prop', 'defn', 'rem',
|
||||
'prob', 'excs', 'examp', 'theorem', 'lemma',
|
||||
'corollary', 'proposition', 'definition', 'remark',
|
||||
'problem', 'exercise', 'example', 'proof', 'property',
|
||||
'itemize', 'enumerate', 'theo', 'enum']
|
||||
# this map should match the map defined in thmsInNb4.js
|
||||
# do not include figure
|
||||
|
||||
def __call__(self, nb, resources):
|
||||
if self.enabled:
|
||||
self.log.debug("Applying preprocessor: %s",
|
||||
self.__class__.__name__)
|
||||
return self.preprocess(nb, resources)
|
||||
else:
|
||||
return nb, resources
|
||||
|
||||
def preprocess(self, nb, resources):
|
||||
"""
|
||||
Preprocessing to apply on each notebook.
|
||||
|
||||
Must return modified nb, resources.
|
||||
|
||||
If you wish to apply your preprocessing to each cell, you might want
|
||||
to override preprocess_cell method instead.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
nb : NotebookNode
|
||||
Notebook being converted
|
||||
resources : dictionary
|
||||
Additional resources used in the conversion process. Allows
|
||||
preprocessors to pass variables into the Jinja engine.
|
||||
"""
|
||||
for index, cell in enumerate(nb.cells):
|
||||
nb.cells[index], resources = self.preprocess_cell(cell,
|
||||
resources, index)
|
||||
return nb, resources
|
||||
|
||||
def replacement(self, match):
|
||||
theenv = match.group(1)
|
||||
tobetranslated = match.group(2)
|
||||
out = "!sl!begin!op!" + theenv + '!cl!' + tobetranslated + "!sl!end!op!" + theenv + '!cl!' # noqa
|
||||
out = out.replace('\n', '!nl!')
|
||||
if theenv in self.environmentMap:
|
||||
return out
|
||||
else:
|
||||
tobetranslated = tobetranslated.replace('\\begin', '/begin')
|
||||
tobetranslated = tobetranslated.replace('\\end', '/end')
|
||||
return out
|
||||
|
||||
def preprocess_cell(self, cell, resources, index):
|
||||
"""
|
||||
Preprocess cell
|
||||
|
||||
Parameters
|
||||
----------
|
||||
cell : NotebookNode cell
|
||||
Notebook cell being processed
|
||||
resources : dictionary
|
||||
Additional resources used in the conversion process. Allows
|
||||
preprocessors to pass variables into the Jinja engine.
|
||||
cell_index : int
|
||||
Index of the cell being processed (see base.py)
|
||||
"""
|
||||
if cell.cell_type == "markdown":
|
||||
data = cell.source
|
||||
code = re.search(r'\\begin{(\w+)}([\s\S]*?)\\end{\1}', data)
|
||||
# data=data.replace(r"{enumerate}",r"{enum}")
|
||||
while (code is not None):
|
||||
data = re.sub(r'\\begin{(\w+)}([\s\S]*?)\\end{\1}',
|
||||
self.replacement, data)
|
||||
data = data.replace(r"{enum}", r"{enumerate}")
|
||||
data = data.replace(r'\item', r'/item')
|
||||
code = re.search(r'\\begin{(\w+)}([\s\S]*?)\\end{\1}', data)
|
||||
# cell.source = cell.source.replace('\n','!nl!')
|
||||
data = data.replace("/begin", "\\begin")
|
||||
data = data.replace("/end", "\\end")
|
||||
cell.source = data
|
||||
return cell, resources
|
||||
|
||||
|
||||
class LenvsHTMLPreprocessor(Preprocessor):
|
||||
"""
|
||||
:mod:`nbconvert` PostProcessor for the ``highlighter`` nbextension.
|
||||
|
||||
For use with html output.
|
||||
"""
|
||||
|
||||
environmentMap = ['thm', 'lem', 'cor', 'prop', 'defn', 'rem',
|
||||
'prob', 'excs', 'examp', 'theorem', 'lemma',
|
||||
'corollary', 'proposition', 'definition', 'remark',
|
||||
'problem', 'exercise', 'example', 'proof', 'property',
|
||||
'itemize', 'enumerate', 'theo', 'enum']
|
||||
# this map should match the map defined in thmsInNb4.js
|
||||
# do not include figure
|
||||
|
||||
def replacement(self, match):
|
||||
return "\n" + match.group(0)
|
||||
|
||||
def preprocess_cell(self, cell, resources, index):
|
||||
"""
|
||||
Preprocess cell
|
||||
|
||||
Parameters
|
||||
----------
|
||||
cell : NotebookNode cell
|
||||
Notebook cell being processed
|
||||
resources : dictionary
|
||||
Additional resources used in the conversion process. Allows
|
||||
preprocessors to pass variables into the Jinja engine.
|
||||
cell_index : int
|
||||
Index of the cell being processed (see base.py)
|
||||
"""
|
||||
# Add a newline before each environment: this is a workaround
|
||||
# for a bug in mistune where
|
||||
# the environment contents will be converted from markdown
|
||||
# this has unwanted consequences for equations
|
||||
# ref: https://github.com/jupyter/nbconvert/issues/160
|
||||
if cell.cell_type == "markdown":
|
||||
cell.source = re.sub(r'\\begin{(\w+)}([\s\S]*?)\\end{\1}',
|
||||
self.replacement, cell.source)
|
||||
return cell, resources
|
||||
|
||||
|
||||
class LenvsHTMLExporter(HTMLExporter):
|
||||
"""
|
||||
Exports to an html document, embedding latex_envs nbextension features.
|
||||
|
||||
Example usage::
|
||||
|
||||
jupyter nbconvert --to html_lenvs FILE.ipynb
|
||||
"""
|
||||
|
||||
def __init__(self, config=None, **kw):
|
||||
"""
|
||||
Public constructor
|
||||
|
||||
Parameters
|
||||
----------
|
||||
config : :class:`~traitlets.config.Config`
|
||||
User configuration instance.
|
||||
`**kw`
|
||||
Additional keyword arguments passed to parent __init__
|
||||
|
||||
"""
|
||||
with_default_config = self.default_config
|
||||
if config:
|
||||
with_default_config.merge(config)
|
||||
|
||||
super(HTMLExporter, self).__init__(
|
||||
config=with_default_config, **kw)
|
||||
self.register_preprocessor(LenvsHTMLPreprocessor(), enabled=True)
|
||||
|
||||
self._init_preprocessors()
|
||||
|
||||
def _file_extension_default(self):
|
||||
return '.html'
|
||||
|
||||
def _template_file_default(self):
|
||||
return 'latex_envs'
|
||||
|
||||
output_mimetype = 'text/html'
|
||||
|
||||
def _raw_mimetypes_default(self):
|
||||
return ['text/markdown', 'text/html', '']
|
||||
|
||||
@property
|
||||
def default_config(self):
|
||||
# import jupyter_core.paths
|
||||
# import os
|
||||
c = Config({
|
||||
'NbConvertBase': {
|
||||
'display_data_priority': ['application/javascript',
|
||||
'text/html',
|
||||
'text/markdown',
|
||||
'image/svg+xml',
|
||||
'text/latex',
|
||||
'image/png',
|
||||
'image/jpeg',
|
||||
'text/plain'
|
||||
]
|
||||
},
|
||||
'CSSHTMLHeaderPreprocessor': {
|
||||
'enabled': True
|
||||
},
|
||||
'HighlightMagicsPreprocessor': {
|
||||
'enabled': True
|
||||
},
|
||||
'ExtractOutputPreprocessor': {'enabled': True},
|
||||
'latex_envs.LenvsHTMLPreprocessor': {'enabled': True}}
|
||||
)
|
||||
from jupyter_contrib_nbextensions.nbconvert_support import (
|
||||
templates_directory)
|
||||
c.merge(super(LenvsHTMLExporter, self).default_config)
|
||||
|
||||
# user_templates = os.path.join(jupyter_core.paths.jupyter_data_dir(),
|
||||
# 'templates')
|
||||
c.TemplateExporter.template_path = ['.', templates_directory()]
|
||||
# c.Exporter.preprocessors = ['tmp.LenvsLatexPreprocessor' ]
|
||||
# c.NbConvertApp.postprocessor_class = 'tmp.TocPostProcessor'
|
||||
return c
|
||||
|
||||
def from_notebook_node(self, nb, resources=None, **kw):
|
||||
langinfo = nb.metadata.get('language_info', {})
|
||||
lexer = langinfo.get('pygments_lexer', langinfo.get('name', None))
|
||||
self.register_filter('highlight_code',
|
||||
Highlight2HTML(pygments_lexer=lexer,
|
||||
parent=self))
|
||||
lenvshtmlpreprocessor = LenvsHTMLPreprocessor()
|
||||
|
||||
self.register_preprocessor(lenvshtmlpreprocessor, enabled=True)
|
||||
self._init_preprocessors()
|
||||
nb, resources = lenvshtmlpreprocessor(nb, resources)
|
||||
output, resources = super(LenvsHTMLExporter,
|
||||
self).from_notebook_node(
|
||||
nb, resources, **kw)
|
||||
# postout = postprocess(output)
|
||||
# print(postout[0:200]) #WORKS
|
||||
return output, resources
|
||||
|
||||
###################
|
||||
|
||||
|
||||
class LenvsTocHTMLExporter(LenvsHTMLExporter):
|
||||
"""Exports to an html document, embedding latex_env and toc extensions."""
|
||||
|
||||
def _template_file_default(self):
|
||||
return 'latex_envs_toc'
|
||||
|
||||
|
||||
################
|
||||
|
||||
class LenvsLatexExporter(LatexExporter):
|
||||
"""
|
||||
Exports to a LaTeX document, embedding latex_envs nbextension features.
|
||||
|
||||
To export notebooks to plain and html while keeping all the features of
|
||||
the latex_envs notebook extension in the converted version.
|
||||
The LaTeX converter also exposes several conversion options (read the
|
||||
docs).
|
||||
|
||||
Example usage::
|
||||
|
||||
jupyter nbconvert --to latex_lenvs FILE.ipynb
|
||||
"""
|
||||
|
||||
removeHeaders = Bool(False, shortname="rh",
|
||||
help="Remove headers and footers").tag(config=True)
|
||||
figcaptionProcess = Bool(True, shortname="fc",
|
||||
help="Process figcaptions").tag(config=True)
|
||||
tocrefRemove = Bool(True, shortname="fc",
|
||||
help="Remove tocs and ref sections, + some cleaning").tag(config=True) # noqa
|
||||
flags = Dict(dict(enable=({'Bar': {'enabled': True}}, "Enable Bar")))
|
||||
|
||||
def __init__(self, config=None, **kw):
|
||||
"""
|
||||
Public constructor
|
||||
|
||||
Parameters
|
||||
----------
|
||||
config : :class:`~traitlets.config.Config`
|
||||
User configuration instance.
|
||||
`**kw`
|
||||
Additional keyword arguments passed to parent __init__
|
||||
|
||||
"""
|
||||
with_default_config = self.default_config
|
||||
if config:
|
||||
with_default_config.merge(config)
|
||||
|
||||
super(Exporter, self).__init__(config=with_default_config, **kw)
|
||||
self.register_preprocessor(LenvsLatexPreprocessor(), enabled=True)
|
||||
|
||||
self._init_preprocessors()
|
||||
|
||||
def _file_extension_default(self):
|
||||
return '.tex'
|
||||
|
||||
def _template_file_default(self):
|
||||
return 'thmsInNb_article'
|
||||
|
||||
output_mimetype = 'text/tex'
|
||||
|
||||
def _raw_mimetypes_default(self):
|
||||
return ['text/tex', 'text/txt', '']
|
||||
|
||||
@property
|
||||
def default_config(self):
|
||||
# import jupyter_core.paths
|
||||
# import os
|
||||
c = Config({
|
||||
'NbConvertBase': {
|
||||
'display_data_priority': ['application/javascript',
|
||||
'text/html',
|
||||
'text/markdown',
|
||||
'image/svg+xml',
|
||||
'text/latex',
|
||||
'image/png',
|
||||
'image/jpeg',
|
||||
'text/plain'
|
||||
]
|
||||
},
|
||||
'CSSHTMLHeaderPreprocessor': {
|
||||
'enabled': True},
|
||||
'HighlightMagicsPreprocessor': {
|
||||
'enabled': True},
|
||||
'ExtractOutputPreprocessor': {
|
||||
'enabled': True},
|
||||
'latex_envs.LenvsLatexPreprocessor': {'enabled': True}
|
||||
}
|
||||
)
|
||||
from jupyter_contrib_nbextensions.nbconvert_support import (
|
||||
templates_directory)
|
||||
c.merge(super(LenvsLatexExporter, self).default_config)
|
||||
|
||||
# user_templates = os.path.join(jupyter_core.paths.jupyter_data_dir(),
|
||||
# 'templates')
|
||||
c.TemplateExporter.template_path = ['.', templates_directory()]
|
||||
|
||||
# c.Exporter.preprocessors = ['tmp.LenvsLatexPreprocessor' ]
|
||||
# c.NbConvertApp.postprocessor_class = 'tmp.TocPostProcessor'
|
||||
return c
|
||||
|
||||
def tocrefrm(self, text):
|
||||
# Remove Table of Contents section
|
||||
newtext = re.sub(r'\\section{Table of Contents}([\s\S]*?)(?=(?:\\[sub]?section|\\chapter))', '', text, flags=re.M) # noqa
|
||||
# Remove References section
|
||||
newtext = re.sub(r'\\section{References}[\S\s]*?(?=(?:\\[sub]*section|\\chapter|\\end{document}|\Z))', '', newtext, flags=re.M) # noqa
|
||||
# Cleaning
|
||||
newtext = re.sub('\\\\begin{verbatim}[\s]*?<matplotlib\.[\S ]*?>[\s]*?\\\\end{verbatim}', '', newtext, flags=re.M) # noqa
|
||||
newtext = re.sub('\\\\begin{verbatim}[\s]*?<IPython\.core\.display[\S ]*?>[\s]*?\\\\end{verbatim}', '', newtext, flags=re.M) # noqa
|
||||
# bottom page with links to Index/back/next (suppress this)
|
||||
# '----[\s]*?<div align=right> [Index](toc.ipynb)[\S ]*?.ipynb\)</div>'
|
||||
newtext = re.sub('\\\\begin{center}\\\\rule{3in}{0.4pt}\\\\end{center}[\s]*?\\\\href{toc.ipynb}{Index}[\S\s ]*?.ipynb}{Next}', '', newtext, flags=re.M) # noqa
|
||||
return newtext
|
||||
|
||||
def figcaption(self, nb_text):
|
||||
# Looks for figcaption in the text. Then for the included image
|
||||
# with \adjustimage...Then extracts caption and label from the
|
||||
# figcaption and redraws the figure using a figure environment
|
||||
# and an \includegraphics figcaption(text,label=)
|
||||
tofind = "figcaption\(([\s\S]*?)\)\n([\s\S]*?)\\\\begin{center}\s*\\\\adjustimage[\s\S]*?}}{([\S]*?)}\s*\\\\end{center}" # noqa
|
||||
|
||||
def replacement(text):
|
||||
cap = re.match("\"([\S\s]*?)\",[\S\s]*?label=\"([\S]*?)\"", text.group(1)) # noqa
|
||||
if cap is None:
|
||||
cap = re.match("\"([\S\s]*?)\"", text.group(1), re.M)
|
||||
if cap is not None:
|
||||
caption = cap.group(1)
|
||||
else:
|
||||
caption = '""'
|
||||
label = ""
|
||||
rep = "\n%s\n\\begin{figure}[H]\n\\centering\n\\includegraphics[width=0.6\\linewidth]{%s}\n\\caption{%s}\n\\end{figure}" % (text.group(2), text.group(3), caption) # noqa
|
||||
else:
|
||||
caption = cap.group(1)
|
||||
label = cap.group(2)
|
||||
rep = "\n%s\n\\begin{figure}[H]\n\\centering\n\\includegraphics[width=0.6\\linewidth]{%s}\n\\caption{%s}\n\\label{%s}\n\\end{figure}" % (text.group(2), text.group(3), caption, label) # noqa
|
||||
return rep
|
||||
|
||||
code = re.search(tofind, nb_text)
|
||||
while (code is not None):
|
||||
nb_text = re.sub(tofind, replacement, nb_text, flags=re.M)
|
||||
code = re.search(tofind, nb_text)
|
||||
return nb_text
|
||||
|
||||
def postprocess(self, nb_text):
|
||||
nb_text = nb_text.replace('!nl!', '\n')
|
||||
nb_text = nb_text.replace('!op!', '{')
|
||||
nb_text = nb_text.replace('!cl!', '}')
|
||||
nb_text = nb_text.replace('!sl!', '\\')
|
||||
nb_text = nb_text.replace(r'/item', r'\item')
|
||||
|
||||
# print('SELF--->',dir(self))
|
||||
if self.removeHeaders:
|
||||
tex_text = re.search('begin{document}([\s\S]*?)\\\\end{document}', nb_text, flags=re.M) # noqa
|
||||
newtext = tex_text.group(1)
|
||||
newtext = newtext.replace('\maketitle', '')
|
||||
newtext = newtext.replace('\\tableofcontents', '')
|
||||
nb_text = newtext
|
||||
if self.figcaptionProcess:
|
||||
nb_text = self.figcaption(nb_text)
|
||||
if self.tocrefRemove:
|
||||
nb_text = self.tocrefrm(nb_text)
|
||||
return nb_text
|
||||
|
||||
def from_notebook_node(self, nb, resources=None, **kw):
|
||||
langinfo = nb.metadata.get('language_info', {})
|
||||
lexer = langinfo.get('pygments_lexer', langinfo.get('name', None))
|
||||
self.register_filter('highlight_code',
|
||||
Highlight2Latex(pygments_lexer=lexer,
|
||||
parent=self))
|
||||
lenvslatexpreprocessor = LenvsLatexPreprocessor()
|
||||
|
||||
self.register_preprocessor(lenvslatexpreprocessor, enabled=True)
|
||||
self._init_preprocessors()
|
||||
nb, resources = lenvslatexpreprocessor(nb, resources)
|
||||
output, resources = super(LenvsLatexExporter, self).from_notebook_node(nb, resources, **kw) # noqa
|
||||
postout = self.postprocess(output)
|
||||
# postout = postout.replace('sklearn','Tonio')
|
||||
# print(postout[0:200]) #WORKS
|
||||
|
||||
return postout, resources
|
||||
|
||||
# jupyter nbconvert --to latex_envs.LenvsLatexExporter
|
||||
# --LenvsLatexExporter.removeHeaders=True
|
||||
# --LenvsLatexExporter.figcaptionProcess=True
|
||||
# --LenvsLatexExporter.tocrefRemove=True test_theo.ipynb
|
||||
|
||||
# once entry point are installed
|
||||
# jupyter nbconvert --to latex_lenvs --figcaptionProcess=true
|
||||
# --removeHeaders=false test_theo
|
||||
|
||||
# jupyter nbconvert --to latex_envs.LenvsHTMLExporter test_theo.ipynb
|
||||
Reference in New Issue
Block a user