Improved RST parser; fixed small typos found by new parser
authorAndrey Kamaev <no@email>
Thu, 7 Jul 2011 11:23:51 +0000 (11:23 +0000)
committerAndrey Kamaev <no@email>
Thu, 7 Jul 2011 11:23:51 +0000 (11:23 +0000)
14 files changed:
modules/calib3d/doc/camera_calibration_and_3d_reconstruction.rst
modules/core/doc/dynamic_structures.rst
modules/core/doc/operations_on_arrays.rst
modules/gpu/doc/image_filtering.rst
modules/gpu/doc/initalization_and_information.rst
modules/gpu/doc/matrix_reductions.rst
modules/imgproc/doc/filtering.rst
modules/imgproc/doc/geometric_transformations.rst
modules/imgproc/doc/histograms.rst
modules/imgproc/doc/miscellaneous_transformations.rst
modules/imgproc/doc/motion_analysis_and_object_tracking.rst
modules/imgproc/doc/object_detection.rst
modules/java/rst_parser.py
modules/video/doc/motion_analysis_and_object_tracking.rst

index 68523ce..7f569b1 100644 (file)
@@ -180,7 +180,7 @@ The function returns the final re-projection error.
 
 .. note::
 
-    If you use a non-square (=non-NxN) grid and        :ocv:func:`findChessboardCorners` for calibration, and ``calibrateCamera`` returns bad values (zero distortion coefficients, an image center very far from ``(w/2-0.5,h/2-0.5)``, and/or large differences between :math:`f_x` and :math:`f_y` (ratios of 10:1 or more)), then you have probably used ``patternSize=cvSize(rows,cols)`` instead of using ``patternSize=cvSize(cols,rows)`` in :ocv:func:`findChessboardCorners` .
+    If you use a non-square (=non-NxN) grid and    :ocv:func:`findChessboardCorners` for calibration, and ``calibrateCamera`` returns bad values (zero distortion coefficients, an image center very far from ``(w/2-0.5,h/2-0.5)``, and/or large differences between :math:`f_x` and :math:`f_y` (ratios of 10:1 or more)), then you have probably used ``patternSize=cvSize(rows,cols)`` instead of using ``patternSize=cvSize(cols,rows)`` in :ocv:func:`findChessboardCorners` .
 
 .. seealso::
 
index a92f95e..de4f19b 100644 (file)
@@ -176,6 +176,8 @@ The structure ``CvGraphScanner`` is used for depth-first graph traversal. See di
 CvTreeNodeIterator
 ------------------
 
+.. ocv:struct:: CvTreeNodeIterator
+
 The structure ``CvTreeNodeIterator`` is used to traverse trees of sequences.
 
 ClearGraph
index b29ae60..7289da1 100644 (file)
@@ -2398,7 +2398,7 @@ For some values of ``p`` , such as integer values, 0.5 and -0.5, specialized fas
 RNG
 ---
 
-.. ocv:class: RNG
+.. ocv:class:: RNG
 
 Random number generator. It encapsulates the state (currently, a 64-bit integer) and has methods to return scalar random values and to fill arrays with random values. Currently it supports uniform and Gaussian (normal) distributions. The generator uses Multiply-With-Carry algorithm, introduced by G. Marsaglia (
 http://en.wikipedia.org/wiki/Multiply-with-carry
index 04c70b3..9b5521d 100644 (file)
@@ -240,7 +240,7 @@ gpu::boxFilter
 
     :param anchor: Anchor point. The default value ``Point(-1, -1)`` means that the anchor is at the kernel center.
 
- .. note::     This filter does not check out-of-border accesses, so only a proper sub-matrix of a bigger matrix has to be passed to it.
+ .. note::    This filter does not check out-of-border accesses, so only a proper sub-matrix of a bigger matrix has to be passed to it.
 
 .. seealso:: :ocv:func:`boxFilter`
 
@@ -365,7 +365,7 @@ gpu::morphologyEx
 
     :param iterations: Number of times erosion and dilation to be applied.
 
-.. note::      This filter does not check out-of-border accesses, so only a proper sub-matrix of a bigger matrix has to be passed to it.
+.. note::    This filter does not check out-of-border accesses, so only a proper sub-matrix of a bigger matrix has to be passed to it.
 
 .. seealso:: :ocv:func:`morphologyEx` 
 
@@ -433,7 +433,7 @@ gpu::Laplacian
 
     :param scale: Optional scale factor for the computed Laplacian values. By default, no scaling is applied (see  :ocv:func:`getDerivKernels` ).
 
-.. note::      This filter does not check out-of-border accesses, so only a proper sub-matrix of a bigger matrix has to be passed to it.
+.. note::    This filter does not check out-of-border accesses, so only a proper sub-matrix of a bigger matrix has to be passed to it.
 
 .. seealso:: :ocv:func:`Laplacian`,:ocv:func:`gpu::filter2D` .
 
index cc1e0dc..1308cec 100644 (file)
@@ -166,9 +166,9 @@ Class providing a set of static methods to check what NVIDIA* card architecture
 
 The following method checks whether the module was built with the support of the given feature:
 
-       .. ocv:function:: static bool gpu::TargetArchs::builtWith(GpuFeature feature)
+    .. ocv:function:: static bool gpu::TargetArchs::builtWith(GpuFeature feature)
 
-               :param feature: Feature to be checked. See :ocv:class:`gpu::GpuFeature`.
+        :param feature: Feature to be checked. See :ocv:class:`gpu::GpuFeature`.
 
 There is a set of methods to check whether the module contains intermediate (PTX) or binary GPU code for the given architecture(s):
 
index 764e6a4..8a42cd0 100644 (file)
@@ -7,7 +7,7 @@ Matrix Reductions
 
 gpu::meanStdDev
 -------------------
-.. cpp:function:: void gpu::meanStdDev(const GpuMat\& mtx, Scalar\& mean, Scalar\& stddev)
+.. ocv:function:: void gpu::meanStdDev(const GpuMat\& mtx, Scalar\& mean, Scalar\& stddev)
 
     Computes a mean value and a standard deviation of matrix elements.
 
index e23b527..3320b79 100644 (file)
@@ -579,7 +579,7 @@ The function supports the mode when ``src`` is already in the middle of ``dst``
 
 .. seealso::
 
-       :ocv:func:`borderInterpolate`
+    :ocv:func:`borderInterpolate`
 
 
 createBoxFilter
index 10c46b3..ad92359 100644 (file)
@@ -486,7 +486,7 @@ Applies a perspective transformation to an image.
 
     :param dst: Destination image that has the size  ``dsize``  and the same type as  ``src`` .
     
-       :param M: :math:`3\times 3`  transformation matrix.
+    :param M: :math:`3\times 3`  transformation matrix.
 
     :param dsize: Size of the destination image.
 
@@ -697,4 +697,4 @@ where ``undistort()`` is an approximate iterative algorithm that estimates the n
 
 The function can be used for both a stereo camera head or a monocular camera (when R is empty).
 
\ No newline at end of file
index 63b1dd6..98fb76f 100644 (file)
@@ -124,9 +124,9 @@ Calculates the back projection of a histogram.
     :param hist: Input histogram that can be dense or sparse.
 
     :param backProject: Destination back projection aray that is a single-channel array of the same size and depth as  ``arrays[0]`` .
-       
+    
     :param ranges: Array of arrays of the histogram bin boundaries in each dimension. See  :ocv:func:`calcHist` .
-       
+    
     :param scale: Optional scale factor for the output back projection.
 
     :param uniform: Flag indicating whether the histogram is uniform or not (see above).
@@ -164,16 +164,16 @@ Compares two histograms.
     :param H1: First compared histogram.
 
     :param H2: Second compared histogram of the same size as  ``H1`` .
-       
+    
     :param method: Comparison method that could be one of the following:
 
-            * **CV_COMP_CORREL**       Correlation
+            * **CV_COMP_CORREL**     Correlation
 
-            * **CV_COMP_CHISQR**       Chi-Square
+            * **CV_COMP_CHISQR**     Chi-Square
 
-            * **CV_COMP_INTERSECT**    Intersection
+            * **CV_COMP_INTERSECT**     Intersection
 
-            * **CV_COMP_BHATTACHARYYA**        Bhattacharyya distance
+            * **CV_COMP_BHATTACHARYYA**     Bhattacharyya distance
 
 The functions ``compareHist`` compare two dense or two sparse histograms using the specified method:
 
@@ -588,4 +588,4 @@ between the calculated minimum and maximum distances are incremented
 
 .. [RubnerSept98] Y. Rubner. C. Tomasi, L.J. Guibas. *The Earth Mover’s Distance as a Metric for Image Retrieval*. Technical Report STAN-CS-TN-98-86, Department of Computer Science, Stanford University, September 1998.
 
-.. [Iivarinen97] Jukka Iivarinen, Markus Peura, Jaakko Srel, and Ari Visa. *Comparison of Combined Shape Descriptors for Irregular Objects*, 8th British Machine Vision Conference, BMVC'97. http://www.cis.hut.fi/research/IA/paper/publications/bmvc97/bmvc97.html
\ No newline at end of file
+.. [Iivarinen97] Jukka Iivarinen, Markus Peura, Jaakko Srel, and Ari Visa. *Comparison of Combined Shape Descriptors for Irregular Objects*, 8th British Machine Vision Conference, BMVC'97. http://www.cis.hut.fi/research/IA/paper/publications/bmvc97/bmvc97.html
index 7bfb148..b72c132 100644 (file)
@@ -24,7 +24,7 @@ Applies an adaptive threshold to an array.
     :param adaptiveMethod: Adaptive thresholding algorithm to use, ``ADAPTIVE_THRESH_MEAN_C``  or  ``ADAPTIVE_THRESH_GAUSSIAN_C`` . See the details below.
 
     :param thresholdType: Thresholding type that must be either  ``THRESH_BINARY``  or  ``THRESH_BINARY_INV`` .
-       
+    
     :param blockSize: Size of a pixel neighborhood that is used to calculate a threshold value for the pixel: 3, 5, 7, and so on.
 
     :param C: Constant subtracted from the mean or weighted mean (see the details below). Normally, it is positive but may be zero or negative as well.
@@ -497,10 +497,10 @@ Fills a connected component with the given color.
     :param image: Input/output 1- or 3-channel, 8-bit, or floating-point image. It is modified by the function unless the  ``FLOODFILL_MASK_ONLY``  flag is set in the second variant of the function. See the details below.
 
     :param mask: (For the second function only) Operation mask that should be a single-channel 8-bit image, 2 pixels wider and 2 pixels taller. The function uses and updates the mask, so you take responsibility of initializing the  ``mask``  content. Flood-filling cannot go across non-zero pixels in the mask. For example, an edge detector output can be used as a mask to stop filling at edges. It is possible to use the same mask in multiple calls to the function to make sure the filled area does not overlap.  
-       
-       .. note::
-       Since the mask is larger than the filled image, a pixel  :math:`(x, y)`  in  ``image``  corresponds to the pixel  :math:`(x+1, y+1)`  in the  ``mask`` .
-       
+    
+    .. note::
+    Since the mask is larger than the filled image, a pixel  :math:`(x, y)`  in  ``image``  corresponds to the pixel  :math:`(x+1, y+1)`  in the  ``mask`` .
+    
     :param seed: Starting point.
 
     :param newVal: New value of the repainted domain pixels.
@@ -608,9 +608,9 @@ Restores the selected region in an image using the region neighborhood.
 
     :param flags: Inpainting method that could be one of the following:
 
-            * **INPAINT_NS**   Navier-Stokes based method.
+            * **INPAINT_NS**     Navier-Stokes based method.
 
-            * **INPAINT_TELEA**        Method by Alexandru Telea  [Telea04]_.
+            * **INPAINT_TELEA**     Method by Alexandru Telea  [Telea04]_.
 
 The function reconstructs the selected image area from the pixel near the area boundary. The function may be used to remove dust and scratches from a scanned photo, or to remove undesirable objects from still images or video. See
 http://en.wikipedia.org/wiki/Inpainting
@@ -821,11 +821,11 @@ Runs the GrabCut algorithm.
     
     :param mode: Operation mode that could be one of the following:
 
-        * **GC_INIT_WITH_RECT**        The function initializes the state and the mask using the provided rectangle. After that it runs  ``iterCount``  iterations of the algorithm.
+        * **GC_INIT_WITH_RECT**     The function initializes the state and the mask using the provided rectangle. After that it runs  ``iterCount``  iterations of the algorithm.
 
-        * **GC_INIT_WITH_MASK**        The function initializes the state using the provided mask. Note that  ``GC_INIT_WITH_RECT``  and  ``GC_INIT_WITH_MASK``  can be combined. Then, all the pixels outside of the ROI are automatically initialized with  ``GC_BGD`` .
+        * **GC_INIT_WITH_MASK**     The function initializes the state using the provided mask. Note that  ``GC_INIT_WITH_RECT``  and  ``GC_INIT_WITH_MASK``  can be combined. Then, all the pixels outside of the ROI are automatically initialized with  ``GC_BGD`` .
 
-        * **GC_EVAL**  The value means that the algorithm should just resume.
+        * **GC_EVAL**     The value means that the algorithm should just resume.
 
 The function implements the `GrabCut image segmentation algorithm <http://en.wikipedia.org/wiki/GrabCut>`_.
 See the sample ``grabcut.cpp`` to learn how to use the function.
index 4c84e1c..330328d 100644 (file)
@@ -85,7 +85,7 @@ Adds the per-element product of two input images to the accumulator.
     :param src1: First input image, 1- or 3-channel, 8-bit or 32-bit floating point.
 
     :param src2: Second input image of the same type and the same size as  ``src1`` .
-       
+    
     :param dst: Accumulator with the same number of channels as input images, 32-bit or 64-bit floating-point.
 
     :param mask: Optional operation mask.
index 4faec8c..3ee6bf3 100644 (file)
@@ -19,7 +19,7 @@ Compares a template against overlapped image regions.
     :param templ: Searched template. It must be not greater than the source image and have the same data type.
 
     :param result: Map of comparison results. It must be single-channel 32-bit floating-point. If  ``image``  is  :math:`W \times H`  and ``templ``  is  :math:`w \times h` , then  ``result``  is  :math:`(W-w+1) \times (H-h+1)` .
-       
+    
     :param method: Parameter specifying the comparison method (see below).
 
 The function slides through ``image`` , compares the
index aabede4..b90145c 100644 (file)
@@ -48,7 +48,7 @@ class ParamParser(object):
         offset = line.find(":param")
         assert offset > 0
         self.prefix = line[:offset]
-        assert self.prefix==" "*len(self.prefix)
+        assert self.prefix==" "*len(self.prefix), ":param definition should be prefixed with spaces"
         line = line[offset + 6:].lstrip()
         name_end = line.find(":")
         assert name_end > 0
@@ -72,25 +72,46 @@ class RstParser(object):
     def __init__(self, cpp_parser):
         self.cpp_parser = cpp_parser
         self.definitions = {}
+        self.sections_parsed = 0
+        self.sections_total = 0
+        self.sections_skipped = 0
 
-    def parse(self, module_path):
+    def parse(self, module_name, module_path=None):
+        if module_path is None:
+            module_path = "../" + module_name
         doclist = glob.glob(os.path.join(module_path,"doc/*.rst"))
         for doc in doclist:
-            self.parse_rst_file(doc)
+            self.parse_rst_file(module_name, doc)
+            
+    def parse_section_safe(self, module_name, section_name, file_name, lineno, lines):
+        try:
+            self.parse_section(module_name, section_name, file_name, lineno, lines)
+        except AssertionError, args:
+            print "RST parser error: assertion in \"%s\"  File: %s (line %s)" % (section_name, file_name, lineno)
+            print "    Details: %s" % args
+
+    def parse_section(self, module_name, section_name, file_name, lineno, lines):
+        self.sections_total += 1
+        # skip sections having whitespace in name
+        if section_name.find(" ") >= 0 and section_name.find("::operator") < 0:
+            print "SKIPPED: \"%s\" File: %s (line %s)" % (section_name, file_name, lineno)
+            self.sections_skipped += 1
+            return
 
-    def parse_section(self, section_name, file_name, lineno, lines):
         func = {}
         func["name"] = section_name
         func["file"] = file_name
         func["line"] = lineno
+        func["module"] = module_name
 
         # parse section name
-        class_separator_idx = func["name"].find("::")
+        section_name = self.parse_namespace(func, section_name)
+        class_separator_idx = section_name.find("::")
         if class_separator_idx > 0:
-            func["class"] = func["name"][:class_separator_idx]
-            func["method"] = func["name"][class_separator_idx+2:]
+            func["class"] = section_name[:class_separator_idx]
+            func["method"] = section_name[class_separator_idx+2:]
         else:
-            func["method"] = func["name"]
+            func["method"] = section_name
 
         skip_code_lines = False
         expected_brief = True
@@ -107,7 +128,7 @@ class RstParser(object):
 
             # skip lines if line-skipping mode is activated
             if skip_code_lines:
-                if not l or l.startswith(" ") or l.startswith("\t"):
+                if not l or l.startswith(" "):
                     continue
                 else:
                     skip_code_lines = False
@@ -132,7 +153,7 @@ class RstParser(object):
                     continue
                 else:
                     self.add_new_pdecl(func, pdecl)
-                    #do not continue - current line can contain next parameter definition
+                    # do not continue - current line can contain next parameter definition
 
             # todo: parse structure members; skip them for now
             if ll.startswith(".. ocv:member::"):
@@ -185,6 +206,9 @@ class RstParser(object):
             # record other lines as long description
             func["long"] = func.get("long", "") + "\n" + ll
         # endfor l in lines
+        
+        if fdecl.balance != 0:
+            print "RST parser error: invalid parentheses balance in \"%s\" File: %s (line %s)" % (section_name, file_name, lineno)
 
         # save last parameter if needed
         if pdecl.active:
@@ -194,13 +218,17 @@ class RstParser(object):
         func = self.normalize(func)
         if self.validate(func):
             self.definitions[func["name"]] = func
+            self.sections_parsed += 1
             #self.print_info(func)
         elif func:
             self.print_info(func, True)
+            pass
 
-    def parse_rst_file(self, doc):
+    def parse_rst_file(self, module_name, doc):
         doc = os.path.abspath(doc)
         lineno = 0
+        whitespace_warnings = 0
+        max_whitespace_warnings = 10
       
         lines = []
         flineno = 0
@@ -210,14 +238,23 @@ class RstParser(object):
         df = open(doc, "rt")
         for l in df.readlines():
             lineno += 1
+            # handle tabs
+            if l.find("\t") >= 0:
+                whitespace_warnings += 1
+                if whitespace_warnings <= max_whitespace_warnings:
+                    print "RST parser warning: tab symbol instead of space is used at file %s (line %s)" % (doc, lineno)
+                l = l.replace("\t", "    ")
+                
+            # handle first line
             if prev_line == None:
                 prev_line = l.rstrip()
                 continue
+
             ll = l.rstrip()
             if len(prev_line) > 0 and len(ll) >= len(prev_line) and ll == "-" * len(ll):
-                #new function candidate
+                # new function candidate
                 if len(lines) > 1:
-                    self.parse_section(fname, doc, flineno, lines[:len(lines)-1])
+                    self.parse_section_safe(module_name, fname, doc, flineno, lines[:len(lines)-1])
                 lines = []
                 flineno = lineno-1
                 fname = prev_line.strip()
@@ -226,9 +263,18 @@ class RstParser(object):
             prev_line = ll
         df.close()
 
-        #don't forget about the last function section in file!!!
+        # don't forget about the last function section in file!!!
         if len(lines) > 1:
-            self.parse_section(fname, doc, flineno, lines[:len(lines)])
+            self.parse_section_safe(module_name, fname, doc, flineno, lines[:len(lines)])
+
+    def parse_namespace(self, func, section_name):
+        known_namespaces = ["cv", "gpu", "flann"]
+        l = section_name.strip()
+        for namespace in known_namespaces:
+            if l.startswith(namespace + "::"):
+                func["namespace"] = namespace
+                return l[len(namespace)+2:]
+        return section_name
 
     def add_new_fdecl(self, func, decl):
         decls =  func.get("decls",[])
@@ -242,40 +288,43 @@ class RstParser(object):
     def add_new_pdecl(self, func, decl):
         params =  func.get("params",{})
         if decl.name in params:
-            print "Parser error: parameter \"%s\" for %s is defined multiple times. See %s line %s" \
+            print "RST parser error: redefinition of parameter \"%s\" in \"%s\" File: %s (line %s)" \
                  % (decl.name, func["name"], func["file"], func["line"])
         else:
             params[decl.name] = decl.comment
             func["params"] = params
 
     def print_info(self, func, skipped=False):
-        print ""
+        print
         if skipped:
             print "SKIPPED DEFINITION:"
         print "name:      %s" % (func.get("name","~empty~"))
         print "file:      %s (line %s)" % (func.get("file","~empty~"), func.get("line","~empty~"))
         print "is class:  %s" % func.get("isclass",False)
         print "is struct: %s" % func.get("isstruct",False)
+        print "module:    %s" % func.get("module","~unknown~")
+        print "namespace: %s" % func.get("namespace", "~empty~")
         print "class:     %s" % (func.get("class","~empty~"))
         print "method:    %s" % (func.get("method","~empty~"))
         print "brief:     %s" % (func.get("brief","~empty~"))
         if "decls" in func:
             print "declarations:"
             for d in func["decls"]:
-               print "     %7s: %s" % (d[0], re.sub(r"[ \t]+", " ", d[1]))
+               print "     %7s: %s" % (d[0], re.sub(r"[ ]+", " ", d[1]))
         if "params" in func:
             print "parameters:"
             for name, comment in func["params"].items():
                 print "%23s:   %s" % (name, comment)
         if not skipped:
             print "long:      %s" % (func.get("long","~empty~"))
+        print
 
     def validate(self, func):
         if func.get("decls",None) is None:
-             if not func.get("isclass",False):
+             if not func.get("isclass",False) and not func.get("isstruct",False):
                  return False
         if func["name"] in self.definitions:
-             print "Parser error: function/class/struct \"%s\" in %s line %s is already documented in %s line %s" \
+             print "RST parser error: \"%s\" from file: %s (line %s) is already documented in file: %s (line %s)" \
                  % (func["name"], func["file"], func["line"], self.definitions[func["name"]]["file"], self.definitions[func["name"]]["line"])
              return False
         #todo: validate parameter names
@@ -306,8 +355,32 @@ class RstParser(object):
                 if cmt:
                     params[name] = cmt
             func["params"] = params
+
+        # special case for old C functions - section name should omit "cv" prefix
+        if not func.get("isclass",False) and not func.get("isstruct",False):
+            self.fixOldCFunctionName(func)
         return func
 
+    def fixOldCFunctionName(self, func):
+        if not "decls" in func: 
+            return
+        fname = None
+        for decl in func["decls"]:
+            if decl[0] != "C" and decl[0] != "Python1":
+                return
+            if decl[0] == "C":
+                fname = decl[2][0]
+        if fname is None:
+            return
+
+        fname = fname.replace(".", "::")
+        if fname == "cv::cv" + func.get("name", ""):
+            func["name"] = fname[2:]
+            func["method"] = fname[2:]
+        else:
+           print "RST parser warning: invalid definition of old C function \"%s\" - section name is \"%s\" instead of \"%s\". File: %s (line %s)" % (fname, func["name"], fname[6:], func["file"], func["line"])
+#           self.print_info(func)
+
     def normalizeText(self, s):
         if s is None:
             return s
@@ -316,7 +389,7 @@ class RstParser(object):
         # remove tailing ::
         s = re.sub(r"::$", "\n", s)
         # remove extra line breaks before/after _ or ,
-        s = re.sub(r"\n[ \t]*([_,])\n", r"\1", s)
+        s = re.sub(r"\n[ ]*([_,])\n", r"\1", s)
         # remove extra line breaks after `
         #s = re.sub(r"`\n", "` ", s)
         # remove extra line breaks before *
@@ -326,17 +399,17 @@ class RstParser(object):
         # remove extra line breaks after #.
         s = re.sub(r"\n#\.\n", "\n#. ", s)
         # remove extra line breaks before `
-        s = re.sub(r"\n[ \t]*`", " `", s)
+        s = re.sub(r"\n[ ]*`", " `", s)
         # remove trailing whitespaces
-        s = re.sub(r"[ \t]+$", "", s)
+        s = re.sub(r"[ ]+$", "", s)
         # remove whitespace before .
-        s = re.sub(r"[ \t]+\.", "\.", s)
+        s = re.sub(r"[ ]+\.", "\.", s)
         # remove .. for references
         s = re.sub(r"\.\. \[", "[", s)
         # unescape
         s = re.sub(r"\\(.)", "\\1", s)
         # compress whitespace
-        s = re.sub(r"[ \t]+", " ", s)
+        s = re.sub(r"[ ]+", " ", s)
 
         s = s.replace("**", "")
         s = s.replace("``", "\"")
@@ -363,10 +436,43 @@ if __name__ == "__main__":
 
     module = sys.argv[1]
 
-    if not os.path.isdir(os.path.join(rst_parser_dir, "../" + module)):
+    if module != "all" and not os.path.isdir(os.path.join(rst_parser_dir, "../" + module)):
         print "Module \"" + module + "\" could not be found."
         exit(1)
 
     parser = RstParser(hdr_parser.CppHeaderParser())
-    parser.parse(os.path.join(rst_parser_dir, "../" + module))
+    
+    if module == "all":
+        for m in ["androidcamera", "calib3d", "contrib", "core", "features2d", "flann", "gpu", "haartraining", "highgui", "imgproc", "java", "legacy", "ml", "objdetect", "ocl", "python", "stitching", "traincascade", "ts", "video"]:
+            parser.parse(m, os.path.join(rst_parser_dir, "../" + m))
+    else:
+        parser.parse(module, os.path.join(rst_parser_dir, "../" + module))
+
+    # summary
+    print
+    print "RST Parser Summary:"
+    print "  Total sections:   %s" % parser.sections_total
+    print "  Skipped sections: %s" % parser.sections_skipped
+    print "  Parsed  sections: %s" % parser.sections_parsed
+    print "  Invalid sections: %s" % (parser.sections_total - parser.sections_parsed - parser.sections_skipped)
+
+    # statistic by language
+    stat = {}
+    classes = 0
+    structs = 0
+    for name, d in parser.definitions.items():
+       if d.get("isclass", False):
+           classes += 1
+       elif d.get("isstruct", False):
+           structs += 1
+       else:
+           for decl in d.get("decls",[]):
+               stat[decl[0]] = stat.get(decl[0],0) + 1
+
+    print
+    print "  classes documented:           %s" % classes
+    print "  structs documented:           %s" % structs
+    for lang in sorted(stat.items()):
+        print "  %7s functions documented: %s" % lang
+
 
index cf02490..d27c20b 100644 (file)
@@ -480,7 +480,7 @@ Updates the predicted state from the measurement.
 BackgroundSubtractor
 --------------------
 
-.. ocv:class: BackgroundSubtractor
+.. ocv:class:: BackgroundSubtractor
 
 Base class for background/foreground segmentation. ::
 
@@ -522,7 +522,7 @@ Computes a background image.
 BackgroundSubtractorMOG
 -----------------------
 
-.. ocv:class: BackgroundSubtractorMOG : public BackgroundSubtractor
+.. ocv:class:: BackgroundSubtractorMOG : public BackgroundSubtractor
 
 Gaussian Mixture-based Backbround/Foreground Segmentation Algorithm.
 
@@ -567,7 +567,7 @@ BackgroundSubtractorMOG2
 ------------------------
 Gaussian Mixture-based Backbround/Foreground Segmentation Algorithm.
 
-.. ocv:class: BackgroundSubtractorMOG2 : public BackgroundSubtractor
+.. ocv:class:: BackgroundSubtractorMOG2 : public BackgroundSubtractor
 
     Here are important members of the class that control the algorithm, which you can set after constructing the class instance: