Exemplo n.º 1
0
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"
Exemplo n.º 2
0
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)
Exemplo n.º 3
0
    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)
Exemplo n.º 4
0
    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)
Exemplo n.º 5
0
    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)
Exemplo n.º 6
0
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)
Exemplo n.º 7
0
 def render(self, document):
     """ Load templates and render the document """
     BaseRenderer.render(self, document)
Exemplo n.º 8
0
 def render(self, document):
     """ Load templates and render the document """
     self.loadTemplates(document)
     BaseRenderer.render(self, document)
Exemplo n.º 9
0
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
Exemplo n.º 10
0
 def render(self, document):
     """ Load templates and render the document """
     self.loadTemplates(document)
     BaseRenderer.render(self, document)
Exemplo n.º 11
0
    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)
Exemplo n.º 12
0
    def textDefault(self, node):
        """ Rendering method for all text nodes """
        return node.replace('&','&amp;').replace('<','&lt;').replace('>','&gt;')        


# 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