Exemple #1
0
 def test_combined_0(self):
     lw = latexwalker.LatexWalker(r'\cmd{ab}c*')
     s = MacroStandardArgsParser('{*[{*')
     parsing_state = lw.make_parsing_state()
     (argd, p, l) = s.parse_args(lw,
                                 len(r'\cmd'),
                                 parsing_state=parsing_state)
     self.assertPMAEqual(
         argd,
         ParsedMacroArgs(argspec='{*[{*',
                         argnlist=[
                             LatexGroupNode(
                                 parsing_state=parsing_state,
                                 delimiters=('{', '}'),
                                 nodelist=[
                                     LatexCharsNode(
                                         parsing_state=parsing_state,
                                         chars='ab',
                                         pos=5,
                                         len=2)
                                 ],
                                 pos=4,
                                 len=4), None, None,
                             LatexCharsNode(parsing_state=parsing_state,
                                            chars='c',
                                            pos=8,
                                            len=1),
                             LatexCharsNode(parsing_state=parsing_state,
                                            chars='*',
                                            pos=9,
                                            len=1)
                         ]))
Exemple #2
0
 def test_star_0(self):
     lw = latexwalker.LatexWalker(r'\cmd xyz')
     s = MacroStandardArgsParser('*')
     (argd, p, l) = s.parse_args(lw, len(r'\cmd'))
     self.assertPMAEqual(
         argd,
         ParsedMacroArgs(argspec='*', argnlist=[ None ])
     )
Exemple #3
0
 def test_marg_1(self):
     lw = latexwalker.LatexWalker(r'\cmd ab')
     s = MacroStandardArgsParser('{')
     parsing_state = lw.make_parsing_state()
     (argd, p, l) = s.parse_args(lw, len(r'\cmd'), parsing_state=parsing_state)
     self.assertPMAEqual(
         argd,
         ParsedMacroArgs(argspec='{', argnlist=[
             LatexCharsNode(parsing_state=parsing_state,
                            chars='a',
                            pos=len(r'\cmd')+1,len=1)
         ])
     )
Exemple #4
0
 def test_oarg_0(self):
     lw = latexwalker.LatexWalker(r'\cmd[ab] xyz')
     s = MacroStandardArgsParser('[')
     parsing_state = lw.make_parsing_state()
     (argd, p, l) = s.parse_args(lw, len(r'\cmd'), parsing_state=parsing_state)
     self.assertPMAEqual(
         argd,
         ParsedMacroArgs(argspec='[', argnlist=[
             LatexGroupNode(
                 parsing_state=parsing_state,
                 delimiters=('[', ']'),
                 nodelist=[
                     LatexCharsNode(parsing_state=parsing_state,
                                    chars='ab',
                                    pos=5,len=2)
                 ],
                 pos=4,len=4)
         ])
     )
Exemple #5
0
 def test_marg_0(self):
     lw = latexwalker.LatexWalker(r'{ab}')
     s = MacroStandardArgsParser('{')
     parsing_state = lw.make_parsing_state()
     (argd, p, l) = s.parse_args(lw, 0, parsing_state=parsing_state)
     self.assertPMAEqual(
         argd,
         ParsedMacroArgs(
             argspec='{',
             argnlist=[ LatexGroupNode(
                 parsing_state=parsing_state,
                 delimiters=('{','}'),
                 nodelist=[
                     LatexCharsNode(parsing_state=parsing_state,
                                    chars='ab',
                                    pos=1,len=2)
                 ],
                 pos=0,len=4)
             ])
     )
Exemple #6
0
    def nc_parse_args(self, nc_what, ncargspec, w, pos, parsing_state=None):

        if parsing_state is None:
            parsing_state = w.make_parsing_state()

        # prepare a parsing state where no macros are known, they are all to be
        # kept as single tokens.  The argument placeholder # is recognized as
        # "special".
        toks_latex_context = LatexContextDb()  # completely empty context.
        #empty_latex_context.set_unknown_macro_spec(MacroSpec(''))
        #empty_latex_context.set_unknown_environment_spec(EnvironmentSpec(''))
        #empty_latex_context.set_unknown_specials_spec(SpecialsSpec(''))
        toks_latex_context.add_context_category(
            'arg_placeholder',
            specials=[
                # single argument, will be 1...9|#
                SpecialsSpec('#', args_parser=MacroStandardArgsParser('{'))
            ])
        toks_parsing_state = parsing_state.sub_context(
            latex_context=toks_latex_context)

        argnlist = []

        p = pos

        for argt in ncargspec:

            if argt in ('{', '[', '*'):

                (stdpa, np, nl) = \
                    MacroStandardArgsParser(argt).parse_args(w, p, parsing_state=parsing_state)
                assert len(stdpa.argnlist) == 1
                p = np + nl
                argnlist.append(stdpa.argnlist[0])

            elif argt is NCArgMacroName:

                (node, nodepos, nodelen) = \
                    w.get_latex_expression(p, parsing_state=toks_parsing_state)

                if node.isNodeType(latexwalker.LatexMacroNode):
                    node._ncarg_the_macro_name = node.macroname
                elif node.isNodeType(latexwalker.LatexGroupNode):
                    if len(node.nodelist) != 1 or \
                       not node.nodelist[0].isNodeType(latexwalker.LatexMacroNode):
                        raise latexwalker.LatexWalkerParseError(
                            "Expected single LaTeX command name as argument, got ‘{}’"
                            .format(node.to_latex()))
                    node._ncarg_the_macro_name = node.nodelist[0].macroname
                else:
                    raise latexwalker.LatexWalkerParseError(
                        "Unexpected argument ‘{}’, was expecting a single LaTeX command"
                        .format(node.to_latex()))

                p = nodepos + nodelen
                argnlist.append(node)

            elif argt is NCArgBracedTokens:

                tok = w.get_token(p,
                                  environments=False,
                                  parsing_state=toks_parsing_state)
                if tok.tok != 'brace_open':
                    raise latexwalker.LatexWalkerError(
                        "Expected open brace ‘{’ for LaTeX definition body, got ‘%s’"
                        % (tok.tok), )

                # ok, we indeed have an open brace s

                (node, nodepos, nodelen) = \
                    w.get_latex_braced_group(tok.pos, brace_type='{',
                                             parsing_state=toks_parsing_state)

                p = nodepos + nodelen
                argnlist.append(node)

            # elif argt is NCDefArgsSignature:

            #     def_args_sig_pos = p

            #     def_toks = []

            #     while True:
            #         tok = w.get_token(p, environments=False, parsing_state=toks_parsing_state)

            #         if tok.tok == 'brace_open':
            #             break

            #         if tok.tok == 'comment':
            #             # still skip comments
            #             continue

            #         p = tok.pos + tok.len
            #         def_toks.append(tok)

            #     # keep the definition string as a chars node-- but that's really
            #     # just a plain placeholder that will only be used when we need
            #     # to convert the argument back to LaTeX code.
            #     node = w.make_node(latexwalker.LatexCharsNode,
            #                        parsing_state=toks_parsing_state,
            #                        chars=w.s[def_args_sig_pos:p],
            #                        pos=def_args_sig_pos, len=p - def_args_sig_pos)
            #     # the real, useful information however is stored in a custom
            #     # attribute that we set on the node
            #     node._ncarg_def_toks = def_toks

            #     argnlist.append( node )

            else:
                raise latexwalker.LatexWalkerError(
                    "Unknown macro argument kind for macro: {!r}".format(argt))

        new_def = NCNewMacroDefinition(
            nc_what=nc_what,
            ncmacrotype=self.ncmacrotype,
            ncargspec=ncargspec,
            argnlist=argnlist,
        )

        return (new_def, pos, p - pos)
Exemple #7
0
from console import *
from pylatexenc.latexwalker import *
from pylatexenc.macrospec import MacroSpec, MacroStandardArgsParser, LatexContextDb
import re

# Der LatexWalker muss wissen, dass `\subject` genau ein Argument bekommt.
latex_context = get_default_latex_context_db()
macros = [
    MacroSpec('subject', args_parser=MacroStandardArgsParser(argspec='{'))
]
# macros += [MacroSpec('author', args_parser=MacroStandardArgsParser(argspec='{'))]
macros += [
    MacroSpec('href', args_parser=MacroStandardArgsParser(argspec='{{'))
]
latex_context.add_context_category('foo', macros=macros)


def parse_href(node):
    """Extrahiert (href, name) aus einem `\href`-Makro."""
    argnlist = node.nodeargd.argnlist
    assert len(argnlist[0].nodelist) == 1

    href_node = argnlist[0].nodelist[0]
    assert href_node.isNodeType(LatexCharsNode)
    name_node = argnlist[1].nodelist[0]
    assert name_node.isNodeType(LatexCharsNode)

    return href_node.chars, name_node.chars


def is_node_interesting(node):
Exemple #8
0
import subprocess

logger = logging.getLogger(__name__)

from pylatexenc.macrospec import MacroSpec, MacroStandardArgsParser
from pylatexenc import latexwalker

from latexpp.fix import BaseFix

from .usepackage import node_get_usepackage  # for detecting \usepackage{cleveref}

_REFCMDS = {
    'ref': {
        'ref': {
            'macro': MacroSpec('ref',
                               args_parser=MacroStandardArgsParser('*{')),
            'label_args': [1]
        },
        'pageref': {
            'macro':
            MacroSpec('pageref', args_parser=MacroStandardArgsParser('*{')),
            'label_args': [1]
        },
    },
    'ams-eqref': {
        'eqref': {
            'macro': MacroSpec('eqref',
                               args_parser=MacroStandardArgsParser('*{')),
            'label_args': [1]
        },
    },