]> rtime.felk.cvut.cz Git - opencv.git/blobdiff - opencv/doc/latex2sphinx/latex.py
cleanup names of doconly parameters
[opencv.git] / opencv / doc / latex2sphinx / latex.py
index 702a88ca7b5975ba0103fe5c7982d670f5c5e1e8..4ef85c54203fbbfea9b769dbf61ec92cb5677764 100644 (file)
@@ -30,10 +30,13 @@ python_api = pythonapi.reader("../../interfaces/python/api")
 
 
 class SphinxWriter:
-    def __init__(self, filename, language):
+    def __init__(self, filename, language, abspath):
         assert language in ['py', 'c', 'cpp']
         self.language = language
 
+        self.abspath = abspath
+        os.path.abspath(os.path.dirname(filename))
+
         self.f_index = QOpen(os.path.join(self.language, filename), 'wt')
         self.f = self.f_index
         self.f_chapter = None
@@ -42,7 +45,7 @@ class SphinxWriter:
         self.state = None
         self.envstack = []
         self.tags = {}
-        self.errors = open('errors', 'wt')
+        self.errors = open('errors.%s' % language, 'wt')
         self.unhandled_commands = set()
         self.freshline = True
         self.function_props = {}
@@ -69,8 +72,6 @@ class SphinxWriter:
             self.description += s
         else:
             self.write(s)
-        if 'lstlisting' in self.ee():
-            self.listing += s
 
     def docmd(self, c):
         if self.state == 'math':
@@ -132,17 +133,19 @@ class SphinxWriter:
 
     def cmd_subsection(self, c):
         print >>self
-        print >>self, str(c.params[0])
-        print >>self, '-' * len(str(c.params[0]))
+        nm = str(c.params[0])
+        print >>self, nm
+        print >>self, '-' * len(nm)
         print >>self
         self.function_props = {}
+        self.covered.add(nm)
 
     def cmd_includegraphics(self, c):
         filename = os.path.join('..', '..', str(c.params[0]))
         print >>self, "\n\n.. image:: %s\n\n" % filename
 
     def cmd_cvCppCross(self, c):
-        self.write(":ref:`%s`" % str(c.params[0]))
+        self.write(":func:`%s`" % str(c.params[0]))
 
     def cmd_cvCPyCross(self, c):
         self.write(":ref:`%s`" % str(c.params[0]))
@@ -168,6 +171,7 @@ class SphinxWriter:
             print >>self, ".. ctype:: " + nm + "\n"
         print >>self
         self.addtag(nm, c)
+        self.state = 'class'
 
     def addtag(self, nm, c):
         if nm == "":
@@ -198,9 +202,11 @@ class SphinxWriter:
         self.indent = 0
         nm = self.render(c.params[0].str)
         print >>self, "\n.. index:: %s\n" % nm
-        print >>self, ".. _%s:\n" % nm
-        print >>self, nm
-        print >>self, '-' * len(nm)
+        if 0:
+            print >>self, "\n.. _%s:\n" % nm
+        print >>self
+        print >>self, 'cv::%s' % nm
+        print >>self, '-' * (4+len(nm))
         print >>self
         self.state = 'fpreamble'
         if self.description != "":
@@ -293,7 +299,7 @@ class SphinxWriter:
                     else:
                         doc_outs = l[2]
                     if len(outs) != len(doc_outs):
-                        self.report_error(c, "function %s output documented tuple %d, code %d" % (l[0], len(outs), len(doc_outs)))
+                        self.report_error(c, "function %s output code tuple %d, documented %d" % (l[0], len(outs), len(doc_outs)))
             else:
                 # self.report_error(c, "function %s documented but not found in code" % l[0])
                 pass
@@ -317,10 +323,11 @@ class SphinxWriter:
                 self.report_error(c, "No cvdefPy for function %s" % self.function_props['name'])
             self.indent += 1
         elif s == 'lstlisting':
-            print >>self, "\n::\n"
-            self.indent += 1
-            print >>self
-            self.listing = ""
+            # Set indent to zero while collecting code; so later write will not double-indent
+            self.saved_f = self.f
+            self.saved_indent = self.indent
+            self.f = StringIO.StringIO()
+            self.indent = 0
         elif s in ['itemize', 'enumerate']:
             self.indent += 1
         elif s == 'tabular':
@@ -366,12 +373,27 @@ class SphinxWriter:
             self.f = self.f_section
             self.f.write(self.handle_table(tabletxt))
         elif s == 'lstlisting':
+            listing = self.f.getvalue()
+
+            self.f = self.saved_f
+            self.indent = self.saved_indent
             print >>self
+            if self.language == 'py':
+                ckeys = ['#define', 'void', '#include', ';\n']
+                found = [repr(k) for k in ckeys if k in listing]
+                if len(found) > 0:
+                    self.report_error(c, 'listing is probably C, found %s' % ",".join(found))
+            if (self.language == 'py') and ('>>>' in listing):
+                print >>self, "\n.. doctest::\n"
+            else:
+                print >>self, "\n::\n"
+            self.indent += 1
+            print >>self
+            self.write(listing)
             self.indent -= 1
             print >>self
+            print >>self
             print >>self, ".."      # otherwise a following :param: gets treated as more listing
-            if '\\_' in self.listing:
-                self.report_error(c, "backslash _ in listing")
         elif s == 'document':
             pass
         else:
@@ -382,7 +404,7 @@ class SphinxWriter:
 
     def cmd_lstinputlisting(self, c):
         s = str(c.params[0])
-        print >>self.f, ".. include:: %s" % os.path.join('..', s)
+        print >>self.f, ".. include:: %s" % os.path.normpath(os.path.join(self.abspath, s))
         print >>self.f, "    :literal:"
         print >>self.f
 
@@ -416,7 +438,20 @@ class SphinxWriter:
         if len(c.params) != 2:
             self.report_error(c, "Malformed cvarg")
             return
-        is_func_arg = self.ee() == ['description'] and not 'done' in self.function_props
+        e = self.ee()
+        if self.state == 'class':
+            nm = self.render(c.params[0].str)
+            if '->' in nm:
+                print >>self, "\n\n.. method:: %s\n\n" % nm
+            else:
+                print >>self, "\n\n.. attribute:: %s\n\n" % nm
+            self.indent += 1
+            print >>self
+            self.doL(c.params[1].str, False)
+            self.indent -= 1
+            print >>self
+            return
+        is_func_arg = (e == ['description']) and (not 'done' in self.function_props)
         if is_func_arg:
             nm = self.render(c.params[0].str)
             print >>self, '\n:param %s: ' % nm,
@@ -441,12 +476,10 @@ class SphinxWriter:
                         type = arg.ty
                     else:
                         self.report_error(c, 'cannot find arg %s in code' % nm)
-        elif self.ee() == ['description']:
-            print >>self, '\n* **%s** ' % self.render(c.params[0].str),
-        elif self.ee() == ['description', 'description']:
+        elif len(e) > 0 and e[-1] == 'description':
             print >>self, '\n* **%s** ' % self.render(c.params[0].str),
         else:
-            print 'strange env', self.envstack
+            self.report_error(c, "unexpected env (%s) for cvarg" % ",".join(e))
         self.indent += 1
         self.doL(c.params[1].str, False)
         self.indent -= 1
@@ -464,6 +497,12 @@ class SphinxWriter:
                 "cvarrseq" : ":class:`CvArr` or :class:`CvSeq`",
                 "CvPoint2D32fs" : "sequence of (float, float)",
                 "pts_npts_contours" : "list of lists of (x,y) pairs",
+                "CvSeqOfCvSURFPoint" : ":class:`CvSeq` of :class:`CvSURFPoint`",
+                "CvSeqOfCvSURFDescriptor" : ":class:`CvSeq` of list of float",
+                "cvpoint2d32f_count" : "int",
+                "ranges" : "list of tuples of ints",
+                "PyObject" : "object",
+                "edgeorpoint" : ":class:`CvSubdiv2DEdge`, :class:`CvSubdiv2DPoint`",
             }
             print >>self, "\n:type %s: %s" % (nm, translate.get(type, ':class:`%s`' % type))
 
@@ -490,7 +529,7 @@ class SphinxWriter:
 
     def cmd_href(self, c):
         if len(c.params) == 2:
-            self.write("`%s <%s>`_" % (str(c.params[1]), str(c.params[0])))
+            self.write("`%s <%s>`_" % (str(c.params[1]), self.render(c.params[0].str)))
         else:
             self.report_error(c, "href should have two params")
 
@@ -514,9 +553,13 @@ class SphinxWriter:
             self.write(repr(c))
 
     def unrecognized_cmd(self, c):
+        # if writing the index or chapter heading, anything goes
         if not self.f in [self.f_index, self.f_chapter]:
             self.write(c.cmd)
-            self.unhandled_commands.add(c.cmd)
+            if (not 'lstlisting' in self.ee()) and (not c.cmd in "#{}%&*\\_"):
+                if not c.cmd in self.unhandled_commands:
+                    self.report_error(c, 'unhandled command %s' % c.cmd)
+                    self.unhandled_commands.add(c.cmd)
 
     def doL(self, L, newlines = True):
         for x in L:
@@ -576,12 +619,14 @@ class SphinxWriter:
 
         if self.envstack != []:
             print >>self.errors, "Error envstack not empty at end of doc: " + repr(self.envstack)
-        print >>self.errors, "unrecognized commands:"
-        print >>self.errors, "\n    ".join(sorted(self.unhandled_commands))
+        print >>self.errors, "Unrecognized commands:"
+        for c in sorted(self.unhandled_commands):
+            print >>self.errors, "\n    " + c
         print >>self.errors
-        print >>self.errors, "The following functions are undocumented"
-        for f in sorted(set(python_api) - self.covered):
-            print >>self.errors, '    ', f
+        if self.language == 'py':
+            print >>self.errors, "The following functions are undocumented"
+            for f in sorted(set(python_api) - self.covered):
+                print >>self.errors, '    ', f
 
         print >>self.f_index, "    bibliography"
         print >>self.f_index, """
@@ -604,7 +649,7 @@ def parseBib(filename, language):
         sl('}'))
     r = (pp.ZeroOrMore(entry) | pp.Suppress('#' + pp.ZeroOrMore(pp.CharsNotIn('\n'))) + pp.StringEnd()).parseFile(filename)
 
-    bibliography = open(os.path.join(language, "bibliography.rst"), 'wt')
+    bibliography = QOpen(os.path.join(language, "bibliography.rst"), 'wt')
     print >>bibliography, "Bibliography"
     print >>bibliography, "============"
     print >>bibliography
@@ -613,9 +658,10 @@ def parseBib(filename, language):
         (etype, tag, attrs) = str(e[0][1:]), str(e[1]), dict([(str(a), str(b)) for (a,b) in e[2]])
         
         representations = {
-            'article' :         '$author, "$title". $journal $volume $number, $pages ($year)',
+            'article' :         '$author, "$title". $journal $volume $number, pp $pages ($year)',
             'inproceedings' :   '$author "$title", $booktitle, $year',
             'misc' :            '$author "$title", $year',
+            'techreport' :      '$author "$title", $edition, $edition ($year)',
         }
         if etype in representations:
             if 0:
@@ -625,18 +671,17 @@ def parseBib(filename, language):
 
             print >>bibliography, ".. [%s] %s" % (tag, Template(representations[etype]).safe_substitute(attrs))
             print >>bibliography
+    bibliography.close()
 
 if 1:
-    sources = ['../' + f for f in os.listdir('..') if f.endswith('.tex')]
-    if distutils.dep_util.newer_group(["latexparser.py"] + sources, "pickled"):
-        fulldoc = latexparser(sys.argv[1], 0)
-        pickle.dump(fulldoc, open("pickled", 'wb'))
-        raw = open('raw.full', 'w')
-        for x in fulldoc:
-            print >>raw, repr(x)
-        raw.close()
-    else:
-        fulldoc = pickle.load(open("pickled", "rb"))
+    fulldoc = latexparser(sys.argv[1])
+
+    abspath = os.path.abspath(os.path.dirname(sys.argv[1]))
+
+    raw = open('raw.full', 'w')
+    for x in fulldoc:
+        print >>raw, repr(x)
+    raw.close()
 
     # Filter on target language
     def preprocess_conditionals(fd, conditionals):
@@ -665,7 +710,7 @@ if 1:
         return r
 
     tags = {}
-    for language in ['c', 'cpp', 'py']:
+    for language in sys.argv[2:]:
         doc = preprocess_conditionals(fulldoc, {
                                               'C' : language=='c',
                                               'Python' : language=='py',
@@ -678,7 +723,7 @@ if 1:
         for x in doc:
             print >>raw, repr(x)
         raw.close()
-        sr = SphinxWriter('index.rst', language)
+        sr = SphinxWriter('index.rst', language, abspath)
         print >>sr, """
 OpenCV |version| %s Reference
 =================================