about summary refs log tree commit diff
path: root/nixos/lib
diff options
context:
space:
mode:
authorpennae <github@quasiparticle.net>2023-01-18 02:14:24 +0100
committerpennae <82953136+pennae@users.noreply.github.com>2023-01-22 17:50:09 +0100
commit3a5f1ae029318b72d4bdbf8ad2c4cf7d04ce7d02 (patch)
treea53be0c20628e7265a4d835ddb8fd4eff335054e /nixos/lib
parent2bd8129a4776f560516ad3e57825b5ca56d24e71 (diff)
downloadnixlib-3a5f1ae029318b72d4bdbf8ad2c4cf7d04ce7d02.tar
nixlib-3a5f1ae029318b72d4bdbf8ad2c4cf7d04ce7d02.tar.gz
nixlib-3a5f1ae029318b72d4bdbf8ad2c4cf7d04ce7d02.tar.bz2
nixlib-3a5f1ae029318b72d4bdbf8ad2c4cf7d04ce7d02.tar.lz
nixlib-3a5f1ae029318b72d4bdbf8ad2c4cf7d04ce7d02.tar.xz
nixlib-3a5f1ae029318b72d4bdbf8ad2c4cf7d04ce7d02.tar.zst
nixlib-3a5f1ae029318b72d4bdbf8ad2c4cf7d04ce7d02.zip
nixos/make-options-doc: render default/example contents through MD
removes some trailing whitespaces from the html output, no other changes.
Diffstat (limited to 'nixos/lib')
-rw-r--r--nixos/lib/make-options-doc/mergeJSON.py32
-rw-r--r--nixos/lib/make-options-doc/options-to-docbook.xsl33
2 files changed, 32 insertions, 33 deletions
diff --git a/nixos/lib/make-options-doc/mergeJSON.py b/nixos/lib/make-options-doc/mergeJSON.py
index 1f30e4315cf8..cdbf7cc21f0d 100644
--- a/nixos/lib/make-options-doc/mergeJSON.py
+++ b/nixos/lib/make-options-doc/mergeJSON.py
@@ -203,6 +203,30 @@ def convertMD(options: Dict[str, Any]) -> str:
         if '_type' not in option[key]: return False
         return option[key]['_type'] == typ
 
+    def convertCode(name: str, option: Dict[str, Any], key: str):
+        rendered = f"{key}-db"
+        if optionIs(option, key, 'literalMD'):
+            docbook = convertString(name, f"*{key.capitalize()}:*\n{option[key]['text']}")
+            option[rendered] = f"<para>{docbook}</para>"
+        elif optionIs(option, key, 'literalExpression'):
+            code = option[key]['text']
+            # for multi-line code blocks we only have to count ` runs at the beginning
+            # of a line, but this is much easier.
+            multiline = '\n' in code
+            longest, current = (0, 0)
+            for c in code:
+                current = current + 1 if c == '`' else 0
+                longest = max(current, longest)
+            # inline literals need a space to separate ticks from content, code blocks
+            # need newlines. inline literals need one extra tick, code blocks need three.
+            ticks, sep = ('`' * (longest + (3 if multiline else 1)), '\n' if multiline else ' ')
+            docbook = convertString(name, f"*{key.capitalize()}:*\n{ticks}{sep}{code}{sep}{ticks}")
+            option[rendered] = f"<para>{docbook}</para>"
+        elif optionIs(option, key, 'literalDocBook'):
+            option[rendered] = f"<para><emphasis>{key.capitalize()}:</emphasis> {option[key]['text']}</para>"
+        elif key in option:
+            raise Exception(f"{name} {key} has unrecognized type", option[key])
+
     for (name, option) in options.items():
         try:
             if optionIs(option, 'description', 'mdDoc'):
@@ -210,12 +234,8 @@ def convertMD(options: Dict[str, Any]) -> str:
             elif markdownByDefault:
                 option['description'] = convertString(name, option['description'])
 
-            if optionIs(option, 'example', 'literalMD'):
-                docbook = convertString(name, option['example']['text'])
-                option['example'] = { '_type': 'literalDocBook', 'text': docbook }
-            if optionIs(option, 'default', 'literalMD'):
-                docbook = convertString(name, option['default']['text'])
-                option['default'] = { '_type': 'literalDocBook', 'text': docbook }
+            convertCode(name, option, 'example')
+            convertCode(name, option, 'default')
         except Exception as e:
             raise Exception(f"Failed to render option {name}: {str(e)}")
 
diff --git a/nixos/lib/make-options-doc/options-to-docbook.xsl b/nixos/lib/make-options-doc/options-to-docbook.xsl
index 39d34fb8633c..7a80931df0de 100644
--- a/nixos/lib/make-options-doc/options-to-docbook.xsl
+++ b/nixos/lib/make-options-doc/options-to-docbook.xsl
@@ -72,22 +72,14 @@
                 </para>
               </xsl:if>
 
-              <xsl:if test="attr[@name = 'default']">
-                <para>
-                  <emphasis>Default:</emphasis>
-                  <xsl:text>
-</xsl:text>
-                  <xsl:apply-templates select="attr[@name = 'default']/*" mode="top" />
-                </para>
+              <xsl:if test="attr[@name = 'default-db']">
+                <xsl:value-of disable-output-escaping="yes"
+                              select="attr[@name = 'default-db']/string/@value" />
               </xsl:if>
 
-              <xsl:if test="attr[@name = 'example']">
-                <para>
-                  <emphasis>Example:</emphasis>
-                  <xsl:text>
-</xsl:text>
-                  <xsl:apply-templates select="attr[@name = 'example']/*" mode="top" />
-                </para>
+              <xsl:if test="attr[@name = 'example-db']">
+                <xsl:value-of disable-output-escaping="yes"
+                              select="attr[@name = 'example-db']/string/@value" />
               </xsl:if>
 
               <xsl:if test="attr[@name = 'relatedPackages']">
@@ -123,19 +115,6 @@
   </xsl:template>
 
 
-  <xsl:template match="attrs[attr[@name = '_type' and string[@value = 'literalExpression']]]" mode = "top">
-    <xsl:choose>
-      <xsl:when test="contains(attr[@name = 'text']/string/@value, '&#010;')">
-        <programlisting><xsl:value-of select="attr[@name = 'text']/string/@value" /><xsl:text>
-</xsl:text></programlisting>
-      </xsl:when>
-      <xsl:otherwise>
-        <literal><xsl:value-of select="attr[@name = 'text']/string/@value" /></literal>
-      </xsl:otherwise>
-    </xsl:choose>
-  </xsl:template>
-
-
   <xsl:template match="attrs[attr[@name = '_type' and string[@value = 'literalDocBook']]]" mode = "top">
     <xsl:value-of disable-output-escaping="yes" select="attr[@name = 'text']/string/@value" />
   </xsl:template>