]> rtime.felk.cvut.cz Git - opencv.git/blob - opencv/doc/latex2sphinx/latex.py
Start at new latex2sphinx flow
[opencv.git] / opencv / doc / latex2sphinx / latex.py
1 import sys
2 from pyparsing import Word, CharsNotIn, Optional, OneOrMore, ZeroOrMore, Group, ParseException, Literal, replaceWith, StringEnd, lineno, QuotedString
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 argfun(s, loc, toks):
10     return Argument(s, loc, toks)
11
12 class Parameter:
13     def __init__(self, s, loc, toks):
14         self.str = toks[0]
15     def __repr__(self):
16         return "{%s}" % self.str
17 def paramfun(s, loc, toks):
18     return Parameter(s, loc, toks)
19
20 class TexCmd:
21     def __init__(self, s, loc, toks):
22         self.cmd = str(toks[0])[1:]
23         #print 'cmd', self.cmd
24         self.args = toks[1].asList()
25         self.params = toks[2].asList()
26     def __repr__(self):
27         return self.cmd + "".join([repr(a) for a in self.args]) + "".join([repr(p) for p in self.params])
28
29 class ZeroOrMoreAsList(ZeroOrMore):
30     def __init__(self, *args):
31         ZeroOrMore.__init__(self, *args)
32         def listify(s, loc, toks):
33             return [toks]
34         self.setParseAction(listify)
35
36 arg = '[' + CharsNotIn("]") + ']'
37 arg.setParseAction(argfun)
38 # param = '{' + Optional(CharsNotIn("}")) + '}'
39 param = QuotedString('{', endQuoteChar = '}', multiline = True)
40 param.setParseAction(paramfun)
41 texcmd = Word("\\", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789") + ZeroOrMoreAsList(arg) + ZeroOrMoreAsList(param)
42 def texcmdfun(s, loc, toks):
43     if str(toks[0])[1:] == 'input':
44         filename = "../" + toks[2].asList()[0].str + ".tex"
45         print 'Now parsing', filename, loc
46         return parsefile(filename, lineno(loc, s))
47     else:
48         return TexCmd(s, loc, toks)
49 texcmd.setParseAction(texcmdfun)
50
51 backslash = chr(92)
52 legal = "".join([chr(x) for x in set(range(32, 127)) - set(backslash)])
53 filler = CharsNotIn(backslash)
54 filler = Word(legal)
55 document = ZeroOrMore(texcmd | filler) + StringEnd().suppress()
56
57 if 0:
58     print document.parseString('\\hello{foo}')
59     sys.exit(0)
60
61 def parsefile(filename, startline):
62     f = open(filename, "rt")
63
64     lines = list(f)
65     def uncomment(s):
66         if '%' in s:
67             return s[:s.index('%')] + '\n'
68         else:
69             return s
70
71     lines = [uncomment(l) for l in lines]
72     print len(lines), "lines"
73
74     docstr = "".join(lines)
75     # document.setFailAction(None)
76     try:
77         return document.parseString(docstr)
78     except ParseException, pe:
79         print 'Fatal problem at %s line %d col %d' % (filename, pe.lineno, pe.col)
80         print pe.line
81         sys.exit(1)
82
83 doc = parsefile(sys.argv[1], 0)
84
85 raw = open('raw', 'w')
86 for x in doc:
87     print >>raw, repr(x)
88 raw.close()
89
90 for x in doc:
91     if isinstance(x, TexCmd):
92         if x.cmd == 'chapter':
93             print repr(x)
94         if x.cmd == 'section':
95             print ' ' * 4, repr(x)