]> rtime.felk.cvut.cz Git - opencv.git/blob - opencv/doc/latex2sphinx/latexparser.py
1bf8ae040a5dfdd6ec1e0c8cf691a38495157099
[opencv.git] / opencv / doc / latex2sphinx / latexparser.py
1 from pyparsing import Word, CharsNotIn, Optional, OneOrMore, ZeroOrMore, Group, Forward, ParseException, Literal, Suppress, replaceWith, StringEnd, lineno, QuotedString, White, NotAny, ParserElement, MatchFirst
2 import sys
3
4 class Argument:
5     def __init__(self, s, loc, toks):
6         self.str = toks[1]
7     def __repr__(self):
8         return "[%s]" % self.str
9     def __str__(self):
10         return self.str
11 def argfun(s, loc, toks):
12     return Argument(s, loc, toks)
13
14 class Parameter:
15     def __init__(self, s, loc, toks):
16         self.str = toks[0].asList()
17     def __repr__(self):
18         return '{' + "".join([str(s) for s in self.str]) + '}'
19         return "{%s}" % self.str
20     def __str__(self):
21         return "".join([str(s) for s in self.str])
22 def paramfun(s, loc, toks):
23     return Parameter(s, loc, toks)
24
25 class TexCmd:
26     def __init__(self, s, loc, toks):
27         self.cmd = str(toks[0])[1:]
28         #print 'cmd', self.cmd
29         self.args = toks[1].asList()
30         self.params = toks[2].asList()
31         self.lineno = lineno(loc, s)
32         self.filename = None
33     def __repr__(self):
34         return '\\' + self.cmd + "".join([repr(a) for a in self.args]) + "".join([repr(p) for p in self.params])
35
36 class ZeroOrMoreAsList(ZeroOrMore):
37     def __init__(self, *args):
38         ZeroOrMore.__init__(self, *args)
39         def listify(s, loc, toks):
40             return [toks]
41         self.setParseAction(listify)
42
43 ParserElement.setDefaultWhitespaceChars("\n\t")
44 backslash = chr(92)
45
46 texcmd = Forward()
47 filler = CharsNotIn(backslash + '$')
48 filler2 = CharsNotIn(backslash + '$' + '{}')
49
50 arg = '[' + CharsNotIn("]") + ']'
51 arg.setParseAction(argfun)
52
53 dollarmath = QuotedString('$',  multiline=True, unquoteResults=False)
54 param = Suppress(Literal('{')) + ZeroOrMoreAsList(dollarmath | filler2 | QuotedString('{', endQuoteChar='}', unquoteResults=False) | texcmd) + Suppress(Literal('}'))
55 param.setParseAction(paramfun)
56 def bs(c): return Literal("\\" + c)
57 singles = bs("[") | bs("]") | bs("{") | bs("}") | bs("\\") | bs("&") | bs("_") | bs(",") | bs("#") | bs("\n") | bs(";") | bs("|") | bs("%") | bs("*")
58 texcmd << (singles | Word("\\", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", min = 2)) + ZeroOrMoreAsList(arg) + ZeroOrMoreAsList(param)
59 def texcmdfun(s, loc, toks):
60     if str(toks[0])[1:] == 'input':
61         filename = "../" + toks[2].asList()[0].str[0] + ".tex"
62         print 'Now parsing', filename, loc
63         return latexparser(filename, lineno(loc, s))
64     else:
65         return TexCmd(s, loc, toks)
66 texcmd.setParseAction(texcmdfun)
67
68 #legal = "".join([chr(x) for x in set(range(32, 127)) - set(backslash)])
69 #filler = Word(legal)
70 document = ZeroOrMore(dollarmath | texcmd | filler) + StringEnd().suppress()
71
72 if 0:
73     s = "This is \\\\ test"
74     print s
75     for t in document.parseString(s):
76         if isinstance(t, TexCmd):
77             print '====> cmd=[%s]' % t.cmd, t
78         else:
79             print '====>', t
80     sys.exit(-1)
81
82 def latexparser(filename, startline):
83     f = open(filename, "rt")
84
85     lines = list(f)
86     def uncomment(s):
87         if '%' in s and not '\\%' in s:
88             return s[:s.index('%')] + '\n'
89         else:
90             return s
91
92     lines = [uncomment(l) for l in lines]
93     print len(lines), "lines"
94
95     docstr = "".join(lines)
96     # document.setFailAction(None)
97     try:
98         r = document.parseString(docstr)
99         for x in r:
100             if isinstance(x, TexCmd) and not x.filename:
101                 x.filename = filename
102         return r
103     except ParseException, pe:
104         print 'Fatal problem at %s line %d col %d' % (filename, pe.lineno, pe.col)
105         print pe.line
106         sys.exit(1)
107
108