Browse Source

makerst: Add an option to filter which XML classes to output

Usage:
```
# Output `VisualScript` classes only (found in `modules/visual_script`)
python doc/tools/makerst.py "doc/classes" "modules" --filter "visual_script"

# Output CSG classes only (found in `modules/csg`)
python doc/tools/makerst.py "doc/classes" "modules" --filter "csg"
```

(cherry picked from commit 7fcdd15f0cab34f23db9088176867afca6fefc5f)
Andrii Doroshenko (Xrayez) 4 years ago
parent
commit
34eea26c67
1 changed files with 12 additions and 3 deletions
  1. 12 3
      doc/tools/makerst.py

+ 12 - 3
doc/tools/makerst.py

@@ -110,6 +110,9 @@ class ClassDef:
         self.theme_items = None  # type: Optional[OrderedDict[str, List[ThemeItemDef]]]
         self.theme_items = None  # type: Optional[OrderedDict[str, List[ThemeItemDef]]]
         self.tutorials = []  # type: List[str]
         self.tutorials = []  # type: List[str]
 
 
+        # Used to match the class with XML source for output filtering purposes.
+        self.filepath = ""  # type: str
+
 
 
 class State:
 class State:
     def __init__(self):  # type: () -> None
     def __init__(self):  # type: () -> None
@@ -118,11 +121,12 @@ class State:
         self.classes = OrderedDict()  # type: OrderedDict[str, ClassDef]
         self.classes = OrderedDict()  # type: OrderedDict[str, ClassDef]
         self.current_class = ""  # type: str
         self.current_class = ""  # type: str
 
 
-    def parse_class(self, class_root):  # type: (ET.Element) -> None
+    def parse_class(self, class_root, filepath):  # type: (ET.Element, str) -> None
         class_name = class_root.attrib["name"]
         class_name = class_root.attrib["name"]
 
 
         class_def = ClassDef(class_name)
         class_def = ClassDef(class_name)
         self.classes[class_name] = class_def
         self.classes[class_name] = class_def
+        class_def.filepath = filepath
 
 
         inherits = class_root.get("inherits")
         inherits = class_root.get("inherits")
         if inherits is not None:
         if inherits is not None:
@@ -278,6 +282,7 @@ def parse_arguments(root):  # type: (ET.Element) -> List[ParameterDef]
 def main():  # type: () -> None
 def main():  # type: () -> None
     parser = argparse.ArgumentParser()
     parser = argparse.ArgumentParser()
     parser.add_argument("path", nargs="+", help="A path to an XML file or a directory containing XML files to parse.")
     parser.add_argument("path", nargs="+", help="A path to an XML file or a directory containing XML files to parse.")
+    parser.add_argument("--filter", default="", help="The filepath pattern for XML files to filter.")
     group = parser.add_mutually_exclusive_group()
     group = parser.add_mutually_exclusive_group()
     group.add_argument("--output", "-o", default=".", help="The directory to save output .rst files in.")
     group.add_argument("--output", "-o", default=".", help="The directory to save output .rst files in.")
     group.add_argument(
     group.add_argument(
@@ -333,17 +338,21 @@ def main():  # type: () -> None
             print_error("Duplicate class '{}'".format(name), state)
             print_error("Duplicate class '{}'".format(name), state)
             continue
             continue
 
 
-        classes[name] = doc
+        classes[name] = (doc, cur_file)
 
 
     for name, data in classes.items():
     for name, data in classes.items():
         try:
         try:
-            state.parse_class(data)
+            state.parse_class(data[0], data[1])
         except Exception as e:
         except Exception as e:
             print_error("Exception while parsing class '{}': {}".format(name, e), state)
             print_error("Exception while parsing class '{}': {}".format(name, e), state)
 
 
     state.sort_classes()
     state.sort_classes()
 
 
+    pattern = re.compile(args.filter)
+
     for class_name, class_def in state.classes.items():
     for class_name, class_def in state.classes.items():
+        if args.filter and not pattern.search(class_def.filepath):
+            continue
         state.current_class = class_name
         state.current_class = class_name
         make_rst_class(class_def, state, args.dry_run, args.output)
         make_rst_class(class_def, state, args.dry_run, args.output)