]> git.proxmox.com Git - mirror_ovs.git/blame - build-aux/xml2nroff
xml2nroff: Add support for variable substitutions.
[mirror_ovs.git] / build-aux / xml2nroff
CommitLineData
a4e3c495
BP
1#! /usr/bin/python
2
3# Copyright (c) 2010, 2011, 2012, 2013, 2014, 2015 Nicira, Inc.
4#
5# Licensed under the Apache License, Version 2.0 (the "License");
6# you may not use this file except in compliance with the License.
7# You may obtain a copy of the License at:
8#
9# http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS,
13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
16
17from datetime import date
18import getopt
19import os
20import sys
21import xml.dom.minidom
22
23from build.nroff import *
24
25argv0 = sys.argv[0]
26
27def usage():
28 print """\
29%(argv0)s: XML to nroff converter
30Converts the XML format supplied as input into an nroff-formatted manpage.
b59de254 31usage: %(argv0)s [OPTIONS] INPUT.XML [VAR=VALUE]...
a4e3c495
BP
32where INPUT.XML is a manpage in an OVS-specific XML format.
33
b59de254
BP
34Each VAR, when enclosed by "@"s in the input, is replaced by its
35corresponding VALUE, with characters &<>"' in VALUE escaped.
36
a4e3c495
BP
37The following options are also available:
38 --version=VERSION use VERSION to display on document footer
39 -h, --help display this help message\
40""" % {'argv0': argv0}
41 sys.exit(0)
42
b59de254
BP
43def manpage_to_nroff(xml_file, subst, version=None):
44 f = open(xml_file)
45 input = []
46 for line in f:
47 for k, v in subst.iteritems():
48 line = line.replace(k, v)
49 input += [line]
50 doc = xml.dom.minidom.parseString(''.join(input)).documentElement
a4e3c495
BP
51 d = date.fromtimestamp(os.stat(xml_file).st_mtime)
52
53 if version == None:
54 version = "UNKNOWN"
55 program = doc.attributes['program'].nodeValue
56 title = doc.attributes['title'].nodeValue
57 section = doc.attributes['section'].nodeValue
58
59 # Putting '\" p as the first line tells "man" that the manpage
60 # needs to be preprocessed by "pic".
61 s = r''''\" p
62.\" -*- nroff -*-
63.TH "%s" %s "%s" "Open vSwitch %s" "Open vSwitch Manual"
64.fp 5 L CR \\" Make fixed-width font available as \\fL.
65.de TQ
66. br
67. ns
68. TP "\\$1"
69..
70.de ST
71. PP
72. RS -0.15in
73. I "\\$1"
74. RE
75..
76''' % (textToNroff(program), textToNroff(section), textToNroff(title), textToNroff(version))
77
78 s += blockXmlToNroff(doc.childNodes) + "\n"
79
80 return s
81
82def usage():
83 print """\
84%(argv0)s: converts XML in a somewhat HTML-like format to nroff
85usage: %(argv0)s [OPTIONS] XML
86where XML is documentation in a somewhat HTML-like XML format.
87The manpage, in nroff "man" format, is output on stdout.
88
89The following options are also available:
90 --version=VERSION use VERSION to display on document footer
91 -h, --help display this help message\
92""" % {'argv0': argv0}
93 sys.exit(0)
94
95if __name__ == "__main__":
96 try:
97 options, args = getopt.gnu_getopt(sys.argv[1:], 'hV',
98 ['version=', 'help'])
99 except getopt.GetoptError, geo:
100 sys.stderr.write("%s: %s\n" % (argv0, geo.msg))
101 sys.exit(1)
102
103 er_diagram = None
104 title = None
105 version = None
106 for key, value in options:
107 if key == '--version':
108 version = value
109 elif key in ['-h', '--help']:
110 usage()
111 else:
112 sys.exit(0)
113
b59de254 114 if len(args) < 1:
a4e3c495
BP
115 sys.stderr.write("%s: exactly 1 non-option arguments required "
116 "(use --help for help)\n" % argv0)
117 sys.exit(1)
118
b59de254
BP
119 subst = {}
120 for s in args[1:]:
121 var, value = s.split('=', 1)
122 value = value.replace('&', '&amp;')
123 value = value.replace('<', '&lt;')
124 value = value.replace('>', '&gt;')
125 value = value.replace('"', '&quot;')
126 value = value.replace("'", '&apos;')
127 subst['@%s@' % var] = value
128
a4e3c495 129 try:
b59de254 130 s = manpage_to_nroff(args[0], subst, version)
a4e3c495
BP
131 except error.Error, e:
132 sys.stderr.write("%s: %s\n" % (argv0, e.msg))
133 sys.exit(1)
134 for line in s.splitlines():
135 line = line.strip()
136 if line:
137 print line
138
139
140# Local variables:
141# mode: python
142# End: