utilities: Remove ovs-monitor.
[openvswitch] / ovsdb / ovsdb-doc.in
index cb21c1f40d34b1c3433db22a251c4f9b951fff51..4950e47e4ce90a1f3b199f0d46677dc377df2f3f 100755 (executable)
@@ -14,9 +14,14 @@ from OVSDB import *
 
 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 == '"':
@@ -26,17 +31,18 @@ def textToNroff(s):
         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'
@@ -207,10 +213,10 @@ Column    Type
     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))
@@ -218,7 +224,10 @@ def docsToNroff(schemaFile, xmlFile, title=None):
     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
@@ -269,6 +278,24 @@ Table      Purpose
         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
@@ -282,6 +309,7 @@ where SCHEMA is an OVSDB schema in JSON format
   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\
@@ -292,14 +320,18 @@ if __name__ == "__main__":
     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()
@@ -314,7 +346,7 @@ if __name__ == "__main__":
             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):