Commit c1ebc31d authored by Stephen Morris's avatar Stephen Morris
Browse files

[trac1012] Adadpted the program to output DocBook XML

parent ad3f4a5e
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.
.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 \
bind10-messages.html: bind10-messages.xml
xsltproc --novalid --xinclude --nonet \
--path $(top_builddir)/doc \
-o $@ \
--stringparam html.stylesheet $(srcdir)/bind10-guide.css \ \
# So many dependencies that it's easiest just to regenerate it every time
$(PYTHON) $(top_srcdir)/tools/ -o $@ $(top_srcdir)
......@@ -1480,7 +1480,7 @@ then change those defaults with config set Resolver/forward_addresses[0]/address
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.
......@@ -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>
<title>BIND 10 System Messages</title>
<link rel="stylesheet" href="./bind10-guide.css" type="text/css">
<h1>BIND 10 System Messages</h1>
SEC_HEADER="""<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
"" [
<!ENTITY mdash "&#x2014;" >
<!ENTITY % version SYSTEM "version.ent">
<?xml-stylesheet href="bind10-guide.css" type="text/css"?>
<title>BIND 10 Messages Manual</title>
<year>2011</year><holder>Internet Systems Consortium, Inc.</holder>
<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.
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=""/>.
<releaseinfo>This is the messages manual for BIND 10 version
<chapter id="intro">
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.
Each entry is also accompanied by a description giving more
information about the circumstances that result in the message
being logged.
<chapter id="messages">
<title>BIND 10 Messages</title>
# 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/>
SEC_MESSAGE = """<varlistentry>
<term>$I, $T</term>
# 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.
# The trailier is copied to the output verbatim after the last message.
SEC_TRAILER = """</body>
SEC_TRAILER = """ </variablelist>
def reportError(filename, what):
......@@ -89,21 +147,14 @@ def reportError(filename, what):
# Printing functions
def printHeader():
def printSeparator():
def printMessage(msgid):
m1 = SEC_MESSAGE.replace("$I", msgid)
m2 = m1.replace("$T", dictionary[msgid]['text'])
m3 = m2.replace("$D", dictionary[msgid]['description'])
def printTrailer():
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():
def printSeparator():
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))
def printTrailer():
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
# 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
for msgid in sorted(dictionary):
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment