#! /usr/bin/python
-# Copyright (c) 2010, 2011, 2012, 2013, 2014, 2015 Nicira, Inc.
+# Copyright (c) 2010, 2011, 2012, 2013, 2014, 2015, 2016 Nicira, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# See the License for the specific language governing permissions and
# limitations under the License.
-from datetime import date
import getopt
-import os
import sys
import xml.dom.minidom
-from build.nroff import *
+import build.nroff
argv0 = sys.argv[0]
+
def usage():
print """\
%(argv0)s: XML to nroff converter
corresponding VALUE, with characters &<>"' in VALUE escaped.
The following options are also available:
+ -I, --include=DIR search DIR for include files (default: .)
--version=VERSION use VERSION to display on document footer
-h, --help display this help message\
""" % {'argv0': argv0}
sys.exit(0)
-def manpage_to_nroff(xml_file, subst, version=None):
- f = open(xml_file)
- input = []
- for line in f:
+
+def manpage_to_nroff(xml_file, subst, include_path, version=None):
+ with open(xml_file) as f:
+ content = f.read()
+ for k, v in subst.iteritems():
+ content = content.replace(k, v)
+ doc = xml.dom.minidom.parseString(content).documentElement
+
+ xi_nodes = doc.getElementsByTagName("xi:include")
+ for node in xi_nodes:
+ fn = node.getAttribute("href")
+ content = None
+ for dir in include_path:
+ try:
+ with open("%s/%s" % (dir, fn)) as xi_f:
+ content = xi_f.read()
+ except IOError:
+ pass
+ if not content:
+ sys.stderr.write("%s: could not open include file %s\n"
+ % (argv0, fn))
+ sys.exit(1)
for k, v in subst.iteritems():
- line = line.replace(k, v)
- input += [line]
- doc = xml.dom.minidom.parseString(''.join(input)).documentElement
- d = date.fromtimestamp(os.stat(xml_file).st_mtime)
+ content = content.replace(k, v)
+ xi_doc = xml.dom.minidom.parseString(content).documentElement
+ doc.replaceChild(xi_doc, node)
- if version == None:
+ if version is None:
version = "UNKNOWN"
program = doc.attributes['program'].nodeValue
title = doc.attributes['title'].nodeValue
. I "\\$1"
. RE
..
-''' % (textToNroff(program), textToNroff(section), textToNroff(title), textToNroff(version))
+''' % (build.nroff.text_to_nroff(program), build.nroff.text_to_nroff(section),
+ build.nroff.text_to_nroff(title), build.nroff.text_to_nroff(version))
- s += blockXmlToNroff(doc.childNodes) + "\n"
+ s += build.nroff.block_xml_to_nroff(doc.childNodes) + "\n"
return s
-def usage():
- print """\
-%(argv0)s: converts XML in a somewhat HTML-like format to nroff
-usage: %(argv0)s [OPTIONS] XML
-where XML is documentation in a somewhat HTML-like XML format.
-The manpage, in nroff "man" format, is output on stdout.
-
-The following options are also available:
- --version=VERSION use VERSION to display on document footer
- -h, --help display this help message\
-""" % {'argv0': argv0}
- sys.exit(0)
if __name__ == "__main__":
try:
- options, args = getopt.gnu_getopt(sys.argv[1:], 'hV',
- ['version=', 'help'])
+ options, args = getopt.gnu_getopt(sys.argv[1:], 'hVI:',
+ ['version=', 'help', 'include='])
except getopt.GetoptError, geo:
sys.stderr.write("%s: %s\n" % (argv0, geo.msg))
sys.exit(1)
er_diagram = None
title = None
version = None
+ include_path = []
for key, value in options:
if key == '--version':
version = value
elif key in ['-h', '--help']:
usage()
+ elif key in ['-I', '--include']:
+ include_path.append(value)
else:
sys.exit(0)
+ if not include_path:
+ include_path = ['.']
if len(args) < 1:
sys.stderr.write("%s: exactly 1 non-option arguments required "
subst['@%s@' % var] = value
try:
- s = manpage_to_nroff(args[0], subst, version)
- except error.Error, e:
+ s = manpage_to_nroff(args[0], subst, include_path, version)
+ except build.nroff.error.Error, e:
sys.stderr.write("%s: %s\n" % (argv0, e.msg))
sys.exit(1)
for line in s.splitlines():