Browse Source

[trac1012] Adadpted the program to output DocBook XML

Stephen Morris 14 years ago
parent
commit
c1ebc31d07
3 changed files with 130 additions and 46 deletions
  1. 12 4
      doc/guide/Makefile.am
  2. 1 1
      doc/guide/bind10-guide.xml
  3. 117 41
      tools/system_messages.py

+ 12 - 4
doc/guide/Makefile.am

@@ -1,11 +1,11 @@
 EXTRA_DIST = bind10-guide.css
-EXTRA_DIST += bind10-guide.html bind10-messages.html
-EXTRA_DIST += bind10-guide.xml
+EXTRA_DIST += bind10-guide.xml bind10-guide.html
+EXTRA_DIST += bind10-messages.xml bind10-messages.html
 
 # This is not a "man" manual, but reuse this for now for docbook.
 if ENABLE_MAN
 
-.PHONY: bind10-messages.html
+.PHONY: bind10-messages.xml
 
 bind10-guide.html: bind10-guide.xml
 	xsltproc --novalid --xinclude --nonet \
@@ -15,8 +15,16 @@ bind10-guide.html: bind10-guide.xml
 		http://docbook.sourceforge.net/release/xsl/current/html/docbook.xsl \
 		$(srcdir)/bind10-guide.xml
 
+bind10-messages.html: bind10-messages.xml
+	xsltproc --novalid --xinclude --nonet \
+		--path $(top_builddir)/doc \
+		-o $@ \
+		--stringparam html.stylesheet $(srcdir)/bind10-guide.css \
+		http://docbook.sourceforge.net/release/xsl/current/html/docbook.xsl \
+		$(srcdir)/bind10-messages.xml
+
 # So many dependencies that it's easiest just to regenerate it every time
-bind10-messages.html:
+bind10-messages.xml:
 	$(PYTHON) $(top_srcdir)/tools/system_messages.py -o $@ $(top_srcdir)
 
 endif

+ 1 - 1
doc/guide/bind10-guide.xml

@@ -1480,7 +1480,7 @@ then change those defaults with config set Resolver/forward_addresses[0]/address
         <listitem><para>
             The message identification.  Every message in BIND-10 has a unique
             identification, which can be used as an index into the
-            <ulink url="bind10-messages.html">BIND10 Messages Manual</ulink>
+            BIND10 Messages Manual
             from which more information can be obtained.
         </para></listitem>
         </varlistentry>

+ 117 - 41
tools/system_messages.py

@@ -51,33 +51,91 @@ dictionary = {}
 # illustration to make the structure clearer.)  The text of these section is:
 
 # Header - this is output before anything else.
-SEC_HEADER = """<html>
-<head>
-<title>BIND 10 System Messages</title>
-<link rel="stylesheet" href="./bind10-guide.css" type="text/css">
-</head>
-<body>
-<h1>BIND 10 System Messages</h1>
-<p/>
+SEC_HEADER="""<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
+"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY mdash  "&#x2014;" >
+<!ENTITY % version SYSTEM "version.ent">
+%version;
+]>
+<book>
+  <?xml-stylesheet href="bind10-guide.css" type="text/css"?>
+
+  <bookinfo>
+    <title>BIND 10 Messages Manual</title>
+
+    <copyright>
+      <year>2011</year><holder>Internet Systems Consortium, Inc.</holder>
+    </copyright>
+
+    <abstract>
+      <para>BIND 10 is a Domain Name System (DNS) suite managed by
+	  Internet Systems Consortium (ISC). It includes DNS libraries
+	  and modular components for controlling authoritative and
+	  recursive DNS servers.
+      </para>
+      <para>
+        This is the messages manual for BIND 10 version &__VERSION__;.
+	    The most up-to-date version of this document, along with
+	    other documents for BIND 10, can be found at
+        <ulink url="http://bind10.isc.org/docs"/>.
+      </para>
+    </abstract>
+
+    <releaseinfo>This is the messages manual for BIND 10 version
+        &__VERSION__;.</releaseinfo>
+  </bookinfo>
+
+  <chapter id="intro">
+    <title>Introduction</title>
+    <para>
+      This document lists each messages that can be logged by the
+      programs in the BIND 10 package.  Each entry in this manual
+      is of the form:
+      <screen>IDENTIFICATION, message-text</screen>
+      ... where "IDENTIFICATION" is the message identification included
+      in each message logged and "message-text" is the accompanying
+      message text.  "message-text" may include placeholders of the
+      form "%1", "%2" etc.; these parameters are replaced by relevant
+      values when the message is logged.
+    </para>
+    <para>
+      Each entry is also accompanied by a description giving more
+      information about the circumstances that result in the message
+      being logged.
+    </para>
+  </chapter>
+
+  <chapter id="messages">
+    <title>BIND 10 Messages</title>
+    <para>
+      <variablelist>
 """
 
 # This is output once for each message.  The string contains substitution
 # tokens: $I is replaced by the message identification, $T by the message text,
 # and $D by the message description.
-SEC_MESSAGE = """<b><a name="$I">$I</a></b>, $T<br/>
-$D"""
+SEC_MESSAGE = """<varlistentry>
+<term>$I, $T</term>
+<listitem><para>
+$D
+</para></listitem>
+</varlistentry>"""
 
 # A description may contain blank lines intended to separate paragraphs.  If so,
 # each blank line is replaced by the following.
-SEC_BLANK = "<p/>"
+SEC_BLANK = "</para><para>"
 
 # The separator is copied to the output verbatim after each message except
 # the last.
-SEC_SEPARATOR = "<p/>"
+SEC_SEPARATOR = ""
 
 # The trailier is copied to the output verbatim after the last message.
-SEC_TRAILER = """</body>
-</html>"""
+SEC_TRAILER = """      </variablelist>
+    </para>
+  </chapter>
+</book>
+"""
 
 
 def reportError(filename, what):
@@ -89,21 +147,14 @@ def reportError(filename, what):
 
 
 
-# Printing functions
-def printHeader():
-    print(SEC_HEADER)
-
-def printSeparator():
-    print(SEC_SEPARATOR)
-
-def printMessage(msgid):
-    m1 = SEC_MESSAGE.replace("$I", msgid)
-    m2 = m1.replace("$T", dictionary[msgid]['text'])
-    m3 = m2.replace("$D", dictionary[msgid]['description'])
-    print(m3)
-
-def printTrailer():
-    print(SEC_TRAILER)
+def replaceTag(string):
+    """Replaces the '<' and '>' in text about to be inserted into the template
+       sections above with &lt; and &gt; to avoid problems with message text
+       being interpreted as XML text.
+    """
+    string1 = string.replace("<", "&lt;")
+    string2 = string1.replace(">", "&gt;")
+    return string2
 
 
 
@@ -122,6 +173,38 @@ def replaceBlankLines(lines):
 
 
 
+# Printing functions
+def printHeader():
+    print(SEC_HEADER)
+
+def printSeparator():
+    print(SEC_SEPARATOR)
+
+def printMessage(msgid):
+    # In the message ID, replace "<" and ">" with XML-safe versions and
+    # substitute into the data.
+    m1 = SEC_MESSAGE.replace("$I", replaceTag(msgid))
+
+    # Do the same for the message text.
+    m2 = m1.replace("$T", replaceTag(dictionary[msgid]['text']))
+
+    # Do the same for the description then replace blank lines with the
+    # specified separator.  (We do this in that order to avoid replacing
+    # the "<" and ">" in the XML tags in the separator.)
+    desc1 = [replaceTag(l) for l in dictionary[msgid]['description']]
+    desc2 = replaceBlankLines(desc1)
+
+    # Join the lines together to form a single string and insert into
+    # current text.
+    m3 = m2.replace("$D", "\n".join(desc2))
+
+    print(m3)
+
+def printTrailer():
+    print(SEC_TRAILER)
+
+
+
 def removeEmptyLeadingTrailing(lines):
     """Removes leading and trailing empty lines.
 
@@ -190,17 +273,12 @@ def addToDictionary(msgid, msgtext, desc, filename):
             i = i + 1
         msgid = msgid + " (" + str(i) + ")"
 
-    # Remove leading and trailing blank lines, and replace embedded blanks
-    # with the blank section element.
-    modified_desc = replaceBlankLines(removeEmptyLeadingTrailing(desc))
-
-    # Put everything in a sub-dictionary that is added to the main one.  At
-    # this point, for ease of subsequent processing the description lines are
-    # concatenated together to form a single string, the lines being separated
-    # by a newline.
+    # Remove leading and trailing blank lines in the description, then
+    # add everything into a subdictionary which is then added to the main
+    # one.
     details = {}
     details['text'] = msgtext
-    details['description'] = "\n".join(modified_desc)
+    details['description'] = removeEmptyLeadingTrailing(desc)
     details['filename'] = filename
     dictionary[msgid] = details
 
@@ -261,8 +339,6 @@ def processFileContent(filename, lines):
         addToDictionary(msgid, msgtext, description, filename)
 
 
-#
-# \param file Name of the file to process
 
 def processFile(filename):
     """Processes a file by reading it in and stripping out all comments and
@@ -323,7 +399,7 @@ if __name__ == "__main__":
     # Read the files and load the data
     processAllFiles(args[0])
 
-    # Now just list the message IDs and text in the global dictionary
+    # Now just print out everything we've read (in alphabetical order).
     count = 1
     printHeader()
     for msgid in sorted(dictionary):