about summary refs log tree commit diff
diff options
context:
space:
mode:
authorDomen Kožar <domen@dev.si>2023-01-08 11:14:57 +0000
committerGitHub <noreply@github.com>2023-01-08 11:14:57 +0000
commitdce3b02d44b081f4648261ff79be5c32e1356509 (patch)
tree4da7eb190a86fd6cea37e93103d6a471e0272b78
parent2a19c135fc3a023b2bbf795f839b3c650ad2ee22 (diff)
parent18df33f5bc99d32e1312439cf670f0f4c580290b (diff)
Merge pull request #209501 from sandydoo/improve/fix-commonmark-doc-isues
nixos/make-options-doc: skip re-escaping literal expressions
-rw-r--r--nixos/lib/make-options-doc/generateDoc.py32
1 files changed, 18 insertions, 14 deletions
diff --git a/nixos/lib/make-options-doc/generateDoc.py b/nixos/lib/make-options-doc/generateDoc.py
index 1fe4eb0253add..07884ed657e49 100644
--- a/nixos/lib/make-options-doc/generateDoc.py
+++ b/nixos/lib/make-options-doc/generateDoc.py
@@ -21,18 +21,22 @@ parser.add_argument(
 
 args = parser.parse_args()
 
-# Pretty-print certain Nix types, like literal expressions.
-def render_types(obj):
-    if '_type' not in obj: return obj
+class OptionsEncoder(json.JSONEncoder):
+    def encode(self, obj):
+        # Unpack literal expressions and other Nix types.
+        # Don't escape the strings: they were escaped when initially serialized to JSON.
+        if isinstance(obj, dict):
+            _type = obj.get('_type')
+            if _type is not None:
+                if _type == 'literalExpression' or _type == 'literalDocBook':
+                    return obj['text']
 
-    _type = obj['_type']
-    if _type == 'literalExpression' or _type == 'literalDocBook':
-        return obj['text']
+                if _type == 'derivation':
+                    return obj['name']
 
-    if _type == 'derivation':
-        return obj['name']
+                raise Exception(f'Unexpected type `{_type}` in {json.dumps(obj)}')
 
-    raise Exception(f'Unexpected type `{_type}` in {json.dumps(obj)}')
+        return super().encode(obj)
 
 def generate_commonmark(options):
     for (name, value) in options.items():
@@ -49,14 +53,14 @@ def generate_commonmark(options):
         if 'default' in value:
             print('*_Default_*')
             print('```')
-            print(json.dumps(value['default'], ensure_ascii=False, separators=(',', ':')))
+            print(json.dumps(value['default'], cls=OptionsEncoder, ensure_ascii=False, separators=(',', ':')))
             print('```')
         print()
         print()
         if 'example' in value:
             print('*_Example_*')
             print('```')
-            print(json.dumps(value['example'], ensure_ascii=False, separators=(',', ':')))
+            print(json.dumps(value['example'], cls=OptionsEncoder, ensure_ascii=False, separators=(',', ':')))
             print('```')
         print()
         print()
@@ -76,7 +80,7 @@ def generate_asciidoc(options):
             print('Default::')
             print('+')
             print('----')
-            print(json.dumps(value['default'], ensure_ascii=False, separators=(',', ':')))
+            print(json.dumps(value['default'], cls=OptionsEncoder, ensure_ascii=False, separators=(',', ':')))
             print('----')
             print()
         else:
@@ -89,7 +93,7 @@ def generate_asciidoc(options):
             print('Example::')
             print('+')
             print('----')
-            print(json.dumps(value['example'], ensure_ascii=False, separators=(',', ':')))
+            print(json.dumps(value['example'], cls=OptionsEncoder, ensure_ascii=False, separators=(',', ':')))
             print('----')
             print()
         else:
@@ -97,7 +101,7 @@ def generate_asciidoc(options):
         print()
 
 with open(args.nix_options_path) as nix_options_json:
-    options = json.load(nix_options_json, object_hook=render_types)
+    options = json.load(nix_options_json)
 
     if args.format == 'commonmark':
         generate_commonmark(options)