]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Pretty-print grammar for zones
authorPetr Špaček <pspacek@isc.org>
Fri, 24 Jun 2022 13:05:02 +0000 (15:05 +0200)
committerPetr Špaček <pspacek@isc.org>
Fri, 1 Jul 2022 06:59:23 +0000 (08:59 +0200)
It turns out the tree of dictionaries is not the best structure to
represent our grammar, unfortunatelly. The problem is that "zone" has
several context-dependent variants which change meaning of "zone" based
on inner field "type".

Redesigning the whole structure does not seem to be worth, so I settled
on this terrible hack.

doc/arm/_ext/iscconf.py
doc/arm/_ext/mergegrammar.py
doc/misc/checkgrammar.py

index 022d303de06e2400355f4e6e79ae69119915d723..99f6b533aaa9e45b270ce594c7296538e2c2a7aa 100644 (file)
@@ -173,8 +173,9 @@ def domain_factory(domainname, domainlabel, todolist, grammar):
                 else:
                     separator = ""
                     paths = ""
+                subgrammar = grammar_grp[0].subgrammar
                 grammar_txt = (
-                    self.isc_name
+                    subgrammar.get("_pprint_name", self.isc_name)
                     + " "
                     + checkgrammar.pformat_grammar(grammar_grp[0].subgrammar, level=1)
                 )
index 75146f7dc4b6b77d6b7d481c698feebb207c2097..966d1c3bc9547d7f45fb95f94f391817db717201 100644 (file)
@@ -29,8 +29,9 @@ def read_zone():
             assert len(zonegrammar) == 1
             assert "zone" in zonegrammar
             zone_grammars[zone_type] = zonegrammar["zone"]
+            zone_grammars[zone_type]["_pprint_name"] = "zone"
 
-    return {"zone": {"_mapbody": zone_grammars}}
+    return {"zone": {"_mapbody": zone_grammars, "_ignore_this_level": True}}
 
 
 def read_main():
index 57f4c8ede5f8f24018411bda97dd9ba492eca4cb..8483b2edaf8844fee132b7c9fef027c4f2e1cc90 100644 (file)
@@ -113,19 +113,25 @@ def pformat_grammar(node, level=1):
     # a nested map
     out = ""
     indent = level * "\t"
-    if "_id" in node:
-        out += node["_id"] + " "
-    out += "{\n"
-
-    for key in node["_mapbody"]:
-        out += f"{indent}{key}"
-        inner_grammar = pformat_grammar(node["_mapbody"][key], level=level + 1)
+    if not node.get("_ignore_this_level"):
+        if "_id" in node:
+            out += node["_id"] + " "
+        out += "{\n"
+
+    for key, subnode in node["_mapbody"].items():
+        if not subnode.get("_ignore_this_level"):
+            out += f"{indent}{subnode.get('_pprint_name', key)}"
+            inner_grammar = pformat_grammar(node["_mapbody"][key], level=level + 1)
+        else:  # act as if we were not in a map
+            inner_grammar = pformat_grammar(node["_mapbody"][key], level=level)
         if inner_grammar[0] != ";":  # we _did_ find some arguments
             out += " "
         out += inner_grammar
-    out += indent[:-1] + "};"  # unindent the closing bracket
-    if "_flags" in node:
-        out += " // " + ", ".join(node["_flags"])
+
+    if not node.get("_ignore_this_level"):
+        out += indent[:-1] + "};"  # unindent the closing bracket
+        if "_flags" in node:
+            out += " // " + ", ".join(node["_flags"])
     return out + "\n"