def test_todo_disable(tmpdir): renderer = Renderer() def render_todo(obj): if obj.ownerDocument.todoNotesDisable: return "disabled" else: return str(obj.attributes["todo"]) renderer["todo"] = render_todo enabled = r''' \documentclass{article} \usepackage{todonotes} \begin{document} \todo{foo} \end{document} ''' disabled = r''' \documentclass{article} \usepackage[disable]{todonotes} \begin{document} \todo{foo} \end{document} ''' with tmpdir.as_cwd(): renderer.render(TeX().input(enabled).parse()) assert Path("index").read_text().strip() == "foo" renderer.render(TeX().input(disabled).parse()) assert Path("index").read_text().strip() == "disabled"
def test_imager(imager_tuple, tmpdir): imager, ext, compiler = imager_tuple if ext == ".svg": kind = "vector-imager" else: kind = "imager" tmpdir = Path(str(tmpdir)) # for old pythons tex = TeX() tex.ownerDocument.config['images'][kind] = imager if compiler is not None: tex.ownerDocument.config['images'][kind.replace("imager", "compiler")] = compiler tex.input(r''' \documentclass{article} \AtBeginDocument{You should not be seeing this in the imager output. This is injected into the document with \textbackslash AtBeginDocument. The actual image is on the second page and the imager should get the images from there.} \begin{document} $a + b = x$ \end{document} ''') renderer = Renderer() if kind == "imager": renderer['math'] = lambda node: node.image.url else: renderer['math'] = lambda node: node.vectorImage.url directory = os.getcwd() os.chdir(str(tmpdir)) renderer.render(tex.parse()) os.chdir(directory) outfile = tmpdir/'images'/('img-0001' + ext) root = Path(__file__).parent benchfile = root/'benchmarks'/"{}-{}{}".format(imager, compiler, ext) if not benchfile.exists(): (root/'new').mkdir(parents=True, exist_ok=True) shutil.copyfile(str(outfile), str(root/'new'/benchfile.name)) raise OSError('No benchmark file: %s' % benchfile) diff = cmp_img(str(benchfile.absolute()), str(outfile.absolute())) if (ext == '.svg' and diff > 0.0001) or diff > 0.01: (root/'new').mkdir(parents=True, exist_ok=True) shutil.copyfile(str(outfile), str(root/'new'/benchfile.name)) if ext == '.svg': bench = benchfile.read_text().split('\n') output = outfile.read_text() print('SVG differences:\n','\n'.join(difflib.unified_diff( bench, output.split('\n'), fromfile='benchmark', tofile='output')).strip()) print('Full svg:\n\n', output) assert False, 'Differences were found:\n' + str(diff)
def render(self, document): """ Load and compile page templates """ themename = document.config['general']['theme'] # Load templates from renderer directory and parent # renderer directories sup = list(type(self).__mro__) sup.reverse() themes = [] for cls in sup: if cls is BaseRenderer or cls is object or cls is dict: continue cwd = os.path.dirname(sys.modules[cls.__module__].__file__) log.info('Importing templates from %s' % cwd) self.importDirectory(cwd) # Store theme location themes.append(os.path.join(cwd, 'Themes', themename)) # Load templates configured by the environment variable templates = os.environ.get('%sTEMPLATES' % cls.__name__, '') for path in [ x.strip() for x in templates.split(os.pathsep) if x.strip() ]: log.info('Importing templates from %s' % path) self.importDirectory(path) themes.append(os.path.join(path, 'Themes', themename)) # Load only one theme for theme in reversed(themes): if os.path.isdir(theme): log.info('Importing templates from %s' % theme) self.importDirectory(theme) extensions = ['.zpts', '.pts'] for e in self.engines.values(): extensions += e.ext if document.config['general']['copy-theme-extras']: # Copy all theme extras cwd = os.getcwd() os.chdir(theme) for item in os.listdir('.'): if os.path.isdir(item): if not os.path.isdir(os.path.join(cwd, item)): os.makedirs(os.path.join(cwd, item)) copytree(item, cwd, True) elif os.path.splitext( item)[-1].lower() not in extensions: shutil.copy(item, os.path.join(cwd, item)) os.chdir(cwd) break BaseRenderer.render(self, document)
def render(self, document): """ Load and compile page templates """ themename = document.config['general']['theme'] # Load templates from renderer directory and parent # renderer directories sup = list(type(self).__mro__) sup.reverse() themes = [] for cls in sup: if cls is BaseRenderer or cls is object or cls is dict: continue cwd = os.path.dirname(sys.modules[cls.__module__].__file__) log.info('Importing templates from %s' % cwd) self.importDirectory(cwd) # Store theme location themes.append(os.path.join(cwd, 'Themes', themename)) # Load templates configured by the environment variable templates = os.environ.get('%sTEMPLATES' % cls.__name__,'') for path in [x.strip() for x in templates.split(os.pathsep) if x.strip()]: log.info('Importing templates from %s' % path) self.importDirectory(path) themes.append(os.path.join(path, 'Themes', themename)) # Load only one theme for theme in reversed(themes): if os.path.isdir(theme): log.info('Importing templates from %s' % theme) self.importDirectory(theme) extensions = ['.zpts','.pts'] for e in self.engines.values(): extensions += e.ext if document.config['general']['copy-theme-extras']: # Copy all theme extras cwd = os.getcwd() os.chdir(theme) for item in os.listdir('.'): if os.path.isdir(item): if not os.path.isdir(os.path.join(cwd,item)): os.makedirs(os.path.join(cwd,item)) copytree(item, cwd, True) elif os.path.splitext(item)[-1].lower() not in extensions: shutil.copy(item, os.path.join(cwd,item)) os.chdir(cwd) break BaseRenderer.render(self, document)
def render(self, document): """ Load templates and render the document """ self.loadTemplates(document) # Better support oversized images, if sidewaysfigure is used for item in document: if isinstance(item, documentclass): if item.argSource[0] == '[': item.argSource = '[fullpage,' + item.argSource[1:] else: item.argSource = '[fullpage]' + item.argSource BaseRenderer.render(self, document)
def test_imager(enable_bitmap, tmpdir): with tmpdir.as_cwd(): tex = TeX() tex.ownerDocument.config['images']["imager"] = "none" tex.ownerDocument.config['images']["vector-imager"] = "pdf2svg" tex.input(r''' \documentclass{article} \begin{document} $a + b = x$ \end{document} ''') doc = tex.parse() renderer = Renderer() renderer.imager = NullImager(doc) renderer.vectorBitmap = enable_bitmap renderer['math'] = lambda node: node.vectorImage.url if enable_bitmap: with pytest.raises(ValueError): renderer.render(doc) else: renderer.render(doc)
def render(self, document): """ Load templates and render the document """ BaseRenderer.render(self, document)
def render(self, document): """ Load templates and render the document """ self.loadTemplates(document) BaseRenderer.render(self, document)
def test_tikz(tmpdir): try: tmpdir = Path(tmpdir) except TypeError: # Fallback for older python tmpdir = Path(str(tmpdir)) root = Path(__file__).parent test_id = "tikz-pdf2svg-gspdfpng" benchdir = root / "benchmarks" / test_id newdir = root / "new" / test_id images = ["images/img-0001.svg", "images/img-0002.svg", "images/img-0001.png", "images/img-0002.png"] config = base_config.copy() config['images']['vector-imager'] = 'pdf2svg' config['images']['imager'] = 'gspdfpng' doc = TeXDocument(config=config) tex = TeX(doc) tex.input(r''' \documentclass{article} \usepackage{tikz} \usepackage{tikz-cd} \begin{document} \begin{tikzpicture} \draw (0, 0) -- (0, 2) -- (2, 0) -- (0, 0); \end{tikzpicture} \begin{tikzcd} A \ar[r, "i"] & B \ar[d, "p"] \\ & C \end{tikzcd} \end{document} ''') renderer = Renderer() def render_image(obj): return "{}\n{}\n".format(obj.vectorImage.url, obj.image.url) renderer["tikzpicture"] = render_image renderer["tikzcd"] = render_image cwd = os.getcwd() os.chdir(str(tmpdir)) renderer.render(tex.parse()) os.chdir(cwd) def new_file(base: str): newfile = newdir / base newfile.parent.mkdir(parents=True, exist_ok=True) shutil.copy(str(tmpdir / base), str(newfile)) # Compare image output error = False try: if not filecmp.cmp(str(tmpdir / "index"), str(benchdir / "index"), shallow=False): print('Differences were found: index', file=sys.stderr) error = True new_file("index") except FileNotFoundError as e: error = True if e.filename == str(tmpdir / "index"): print("Missing output file: index", file=sys.stderr) else: print("Missing benchmark file: index", file=sys.stderr) new_file("index") for f in images: if not (tmpdir / f).exists(): error = True print('Missing output file: %s' % f, file=sys.stderr) elif not (benchdir / f).exists(): error = True print('Missing benchmark file: %s' % f, file=sys.stderr) new_file(f) diff = cmp_img(str(tmpdir / f), str(benchdir / f)) if diff > 0.0001: error = True print('Differences were found: {} ({})'.format(f, diff), file=sys.stderr) new_file(f) if error: assert False
document = tex.parse() # Render the document renderer = Renderer() renderer['chapter'] = renderer.section renderer['section'] = renderer.section renderer['subsection'] = renderer.section renderer['subsubsection'] = renderer.section renderer['par'] = renderer.par renderer['itemize'] = renderer.itemize renderer['keyconcepts'] = renderer.keyconcepts renderer['newwords'] = renderer.newwords renderer['bgroup'] = renderer.bgroup renderer['textbf'] = renderer.textbf renderer['textit'] = renderer.textit renderer['displaymath'] = renderer.displaymath renderer['textrm'] = renderer.textrm renderer['active::_'] = renderer.sub renderer['center'] = renderer.center renderer['hrule'] = renderer.hrule renderer['hline'] = renderer.hline renderer['tabularnewline'] = renderer.tabularnewline renderer['longtable'] = renderer.longtable renderer['ArrayCell'] = renderer.ArrayCell renderer['ArrayRow'] = renderer.ArrayRow renderer['includegraphics'] = renderer.includegraphics renderer['visit'] = renderer.visit renderer['activity'] = renderer.activity renderer['document'] = renderer.document renderer.render(document)
def textDefault(self, node): """ Rendering method for all text nodes """ return node.replace('&','&').replace('<','<').replace('>','>') # Instantiate a TeX processor and parse the input text fn = sys.argv[1] print "fn=",fn tex = TeX() tex.ownerDocument.config['files']['split-level'] = -100 tex.ownerDocument.config['files']['filename'] = fn+'.wiki' tex.ownerDocument.context.importMacros({1:BOX}) tex.ownerDocument.context.importMacros({2:inlinepsfig}) tex.ownerDocument.context.importMacros({3:matrix}) tex.ownerDocument.context.importMacros({4:wikitext}) ifn = fn + '.tex' tex.input(open(ifn).read()) document = tex.parse() # Render the document renderer = Renderer() renderer.render(document) #print document