def textToNroff(s, font=r'\fR'):
def escape(match):
c = match.group(0)
- if c == '-':
- if font == r'\fB':
- return r'\-'
+ if c.startswith('-'):
+ if c != '-' or font == r'\fB':
+ return '\\' + c
else:
return '-'
if c == '\\':
raise error.Error("bad escape")
# Escape - \ " ' as needed by nroff.
- s = re.sub('([-"\'\\\\])', escape, s)
+ s = re.sub('(-[0-9]|[-"\'\\\\])', escape, s)
if s.startswith('.'):
s = '\\' + s
return s
def typeAndConstraintsToNroff(column):
type = column.type.toEnglish(escapeNroffLiteral)
- constraints = column.type.constraintsToEnglish(escapeNroffLiteral)
+ constraints = column.type.constraintsToEnglish(escapeNroffLiteral,
+ textToNroff)
if constraints:
type += ", " + constraints
if column.unique:
column = table.columns[name]
if node.hasAttribute('key'):
key = node.attributes['key'].nodeValue
+ if node.hasAttribute('type'):
+ type_string = node.attributes['type'].nodeValue
+ type_json = ovs.json.from_string(str(type_string))
+ if type(type_json) in (str, unicode):
+ raise error.Error("%s %s:%s has invalid 'type': %s"
+ % (table.name, name, key, type_json))
+ type_ = ovs.db.types.BaseType.from_json(type_json)
+ else:
+ type_ = column.type.value
+
nameNroff = "%s : %s" % (name, key)
- typeNroff = "optional %s" % column.type.value.toEnglish()
+
+ if column.type.value:
+ typeNroff = "optional %s" % column.type.value.toEnglish(
+ escapeNroffLiteral)
+ if (column.type.value.type == ovs.db.types.StringType and
+ type_.type == ovs.db.types.BooleanType):
+ # This is a little more explicit and helpful than
+ # "containing a boolean"
+ typeNroff += r", either \fBtrue\fR or \fBfalse\fR"
+ else:
+ if type_.type != column.type.value.type:
+ type_english = type_.toEnglish()
+ if type_english[0] in 'aeiou':
+ typeNroff += ", containing an %s" % type_english
+ else:
+ typeNroff += ", containing a %s" % type_english
+ constraints = (
+ type_.constraintsToEnglish(escapeNroffLiteral,
+ textToNroff))
+ if constraints:
+ typeNroff += ", %s" % constraints
+ else:
+ typeNroff = "none"
else:
nameNroff = name
typeNroff = typeAndConstraintsToNroff(column)
# Putting '\" p as the first line tells "man" that the manpage
# needs to be preprocessed by "pic".
s = r''''\" p
-.TH %s 5 "%s" "Open vSwitch" "Open vSwitch Manual"
+.TH @VERSION@ 5 "%s" "Open vSwitch" "Open vSwitch Manual"
.\" -*- nroff -*-
.de TQ
. br
. I "\\$1"
. RE
..
-''' % (title, d.strftime("%B %Y"))
-
- s += '.SH "%s DATABASE"\n' % schema.name
+.SH NAME
+%s \- %s database schema
+.PP
+''' % (title, textToNroff(title), schema.name)
tables = ""
introNodes = []
if erFile:
s += """
-.if !'\*[.T]'ascii' \{
+.\\" check if in troff mode (TTY)
+.if t \{
.bp
.SH "TABLE RELATIONSHIPS"
.PP