Browse Source

Merge pull request #14914 from fodinabor/fix13254

Enum members now also link to the corresponding class in the webdocs
Rémi Verschelde 7 years ago
parent
commit
913777b773
1 changed files with 43 additions and 2 deletions
  1. 43 2
      doc/tools/makerst.py

+ 43 - 2
doc/tools/makerst.py

@@ -276,6 +276,15 @@ def make_type(t):
         return ':ref:`' + t + '<class_' + t.lower() + '>`'
     return t
 
+def make_enum(t):
+    global class_names
+    p = t.find(".")
+    if p >= 0:
+        c = t[0:p]
+        e = t[p+1:]
+        if c in class_names:
+            return ':ref:`' + e + '<enum_' + c.lower() + '_' + e.lower() + '>`'
+    return t
 
 def make_method(
         f,
@@ -470,7 +479,10 @@ def make_rst_class(node):
             # Leading two spaces necessary to prevent breaking the <ul>
             f.write("  .. _class_" + name + "_" + c.attrib['name'] + ":\n\n")
             s = '- '
-            s += make_type(c.attrib['type']) + ' '
+            if 'enum' in c.attrib:
+                s += make_enum(c.attrib['enum']) + ' '
+            else:
+                s += make_type(c.attrib['type']) + ' '
             s += '**' + c.attrib['name'] + '**'
             if c.text.strip() != '':
                 s += ' - ' + rstize_text(c.text.strip(), name)
@@ -478,9 +490,20 @@ def make_rst_class(node):
         f.write('\n')
 
     constants = node.find('constants')
+    consts = []
+    enum_names = set()
+    enums = []
     if constants != None and len(list(constants)) > 0:
-        f.write(make_heading('Numeric Constants', '-'))
         for c in list(constants):
+            if 'enum' in c.attrib:
+                enum_names.add(c.attrib['enum'])
+                enums.append(c)
+            else:
+                consts.append(c)
+    
+    if len(consts) > 0:
+        f.write(make_heading('Numeric Constants', '-'))
+        for c in list(consts):
             s = '- '
             s += '**' + c.attrib['name'] + '**'
             if 'value' in c.attrib:
@@ -489,6 +512,24 @@ def make_rst_class(node):
                 s += ' --- ' + rstize_text(c.text.strip(), name)
             f.write(s + '\n')
         f.write('\n')
+    
+    if len(enum_names) > 0:
+        f.write(make_heading('Enums', '-'))
+        for e in enum_names:
+            f.write("  .. _enum_" + name + "_" + e + ":\n\n")
+            f.write("enum **" + e + "**\n\n")
+            for c in enums:
+                if c.attrib['enum'] != e:
+                    continue
+                s = '- '
+                s += '**' + c.attrib['name'] + '**'
+                if 'value' in c.attrib:
+                    s += ' = **' + c.attrib['value'] + '**'
+                if c.text.strip() != '':
+                    s += ' --- ' + rstize_text(c.text.strip(), name)
+                f.write(s + '\n')
+            f.write('\n')
+        f.write('\n')
 
     descr = node.find('description')
     if descr != None and descr.text.strip() != '':