argv0 = sys.argv[0]
-def textToNroff(s):
+def textToNroff(s, font=r'\fR'):
def escape(match):
c = match.group(0)
+ if c == '-':
+ if font == r'\fB':
+ return r'\-'
+ else:
+ return '-'
if c == '\\':
return r'\e'
elif c == '"':
else:
raise Error("bad escape")
- s = re.sub('([\\\\"\'])', escape, s)
+ # Escape - \ " ' as needed by nroff.
+ s = re.sub('([-"\'\\\\])', escape, s)
if s.startswith('.'):
s = '\\' + s
return s
def escapeNroffLiteral(s):
- return r'\fB%s\fR' % textToNroff(s)
+ return r'\fB%s\fR' % textToNroff(s, r'\fB')
def inlineXmlToNroff(node, font):
if node.nodeType == node.TEXT_NODE:
- return textToNroff(node.data)
+ return textToNroff(node.data, font)
elif node.nodeType == node.ELEMENT_NODE:
if node.tagName == 'code' or node.tagName == 'em':
s = r'\fB'
s += body
return s
-def docsToNroff(schemaFile, xmlFile, title=None):
+def docsToNroff(schemaFile, xmlFile, erFile, title=None):
schema = DbSchema.fromJson(json.load(open(schemaFile, "r")))
doc = xml.dom.minidom.parse(xmlFile).documentElement
-
+
schemaDate = os.stat(schemaFile).st_mtime
xmlDate = os.stat(xmlFile).st_mtime
d = date.fromtimestamp(max(schemaDate, xmlDate))
if title == None:
title = schema.name
- s = r'''.TH %s 5 "%s" "Open vSwitch" "Open vSwitch Manual"
+ # Putting '\" pt as the first line tells "man" that the manpage
+ # needs to be preprocessed by "pic" and "tbl".
+ s = r''''\" pt
+.TH %s 5 "%s" "Open vSwitch" "Open vSwitch Manual"
.\" -*- nroff -*-
.de TQ
. br
tableSummary += "%s\t%s\n" % (name, textToNroff(title))
tableSummary += '.TE\n'
s += tableSummary
+
+ if erFile:
+ s += """
+.sp 1
+.SH "TABLE RELATIONSHIPS"
+.PP
+The following diagram shows the relationship among tables in the
+database. Each node represents a table. Each edge leads from the
+table that contains it and points to the table that its value
+represents. Edges are labeled with their column names.
+.RS -1in
+"""
+ erStream = open(erFile, "r")
+ for line in erStream:
+ s += line + '\n'
+ erStream.close()
+ s += ".RE\n"
+
for node in tableNodes:
s += tableToNroff(schema, node) + "\n"
return s
and XML is OVSDB documentation in XML format.
The following options are also available:
+ --er-diagram=DIAGRAM.PIC include E-R diagram from DIAGRAM.PIC
--title=TITLE use TITLE as title instead of schema name
-h, --help display this help message
-V, --version display version information\
try:
try:
options, args = getopt.gnu_getopt(sys.argv[1:], 'hV',
- ['title=', 'help', 'version'])
+ ['er-diagram=', 'title=',
+ 'help', 'version'])
except getopt.GetoptError, geo:
sys.stderr.write("%s: %s\n" % (argv0, geo.msg))
sys.exit(1)
+ er_diagram = None
title = None
for key, value in options:
- if key == '--title':
+ if key == '--er-diagram':
+ er_diagram = value
+ elif key == '--title':
title = value
elif key in ['-h', '--help']:
usage()
sys.exit(1)
# XXX we should warn about undocumented tables or columns
- s = docsToNroff(args[0], args[1])
+ s = docsToNroff(args[0], args[1], er_diagram)
for line in s.split("\n"):
line = line.strip()
if len(line):