blob: c271fa8cff432443fde9a168a523fd56a7c5d174 [file] [log] [blame]
# Copyright 2015-2017 ARM Limited
# Copyright 2016 Google Inc. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
"""Preprocessor to remove Marked Lines from IPython Output Cells"""
from nbconvert.exporters.html import HTMLExporter
from nbconvert.preprocessors import Preprocessor
import os
import re
REMOVE_START = '/* TRAPPY_PUBLISH_REMOVE_START */'
REMOVE_STOP = '/* TRAPPY_PUBLISH_REMOVE_STOP */'
REMOVE_LINE = '/* TRAPPY_PUBLISH_REMOVE_LINE */'
IMPORT_SCRIPT = r'/\* TRAPPY_PUBLISH_IMPORT = "([^"]+)" \*/'
SOURCE_LIB = r'<!-- TRAPPY_PUBLISH_SOURCE_LIB = "([^"]+)" -->'
class HTML(HTMLExporter):
"""HTML Exporter class for TRAPpy notebooks"""
def __init__(self, **kwargs):
super(HTML, self).__init__(**kwargs)
self.register_preprocessor(TrappyPlotterPreprocessor, enabled=True)
class TrappyPlotterPreprocessor(Preprocessor):
"""Preprocessor to remove Marked Lines from IPython Output Cells"""
def __init__(self, *args, **kwargs):
super(Preprocessor, self).__init__(*args, **kwargs)
self.inlined_files = []
self.sourced_libs = []
def preprocess_cell(self, cell, resources, cell_index):
"""Check if cell has text/html output and filter it"""
if cell.cell_type == 'code' and hasattr(cell, "outputs"):
for output in cell.outputs:
if output.output_type == "display_data" and \
hasattr( output.data, "text/html"):
filtered = self.filter_output(output.data["text/html"])
output.data["text/html"] = filtered
return cell, resources
def filter_output(self, output):
"""Function to remove marked lines"""
lines = output.split('\n')
final_lines = []
multi_line_remove = False
for line in lines:
if REMOVE_START in line:
multi_line_remove = True
continue
if REMOVE_STOP in line:
multi_line_remove = False
continue
if multi_line_remove or REMOVE_LINE in line:
continue
import_match = re.search(IMPORT_SCRIPT, line)
if import_match:
trappy_base = os.path.dirname(os.path.dirname(__file__))
import_file = os.path.join(trappy_base, import_match.group(1))
if import_file in self.inlined_files:
continue
with open(import_file) as fin:
final_lines.extend([l[:-1] for l in fin.readlines()])
self.inlined_files.append(import_file)
continue
source_match = re.search(SOURCE_LIB, line)
if source_match:
lib_url = source_match.group(1)
if lib_url in self.sourced_libs:
continue
scl = '<script src="{}" type="text/javascript" charset="utf-8"></script>'.\
format(lib_url)
final_lines.append(scl)
self.sourced_libs.append(lib_url)
continue
final_lines.append(line)
return '\n'.join(final_lines)