From: <gr...@us...> - 2008-05-14 13:48:18
|
Author: grubert Date: 2008-05-14 15:48:03 +0200 (Wed, 14 May 2008) New Revision: 5548 Modified: trunk/sandbox/manpage-writer/README.txt trunk/sandbox/manpage-writer/expected/compact_lists.man trunk/sandbox/manpage-writer/expected/test.man trunk/sandbox/manpage-writer/writers/manpage.py Log: patch from htgoebel for nested intendation. Modified: trunk/sandbox/manpage-writer/README.txt =================================================================== --- trunk/sandbox/manpage-writer/README.txt 2008-05-07 12:55:24 UTC (rev 5547) +++ trunk/sandbox/manpage-writer/README.txt 2008-05-14 13:48:03 UTC (rev 5548) @@ -111,6 +111,7 @@ * writers/manpage.py: + - 2008-05-15: patch from htgoebel for nested intendation. - 2008-03-05: patch from htgoebel * Support formats for literal Modified: trunk/sandbox/manpage-writer/expected/compact_lists.man =================================================================== --- trunk/sandbox/manpage-writer/expected/compact_lists.man 2008-05-07 12:55:24 UTC (rev 5547) +++ trunk/sandbox/manpage-writer/expected/compact_lists.man 2008-05-14 13:48:03 UTC (rev 5548) @@ -2,6 +2,7 @@ .SH NAME \- .\" Man page generated from reStructeredText. +.INDENT 0.0 .TP 2 \(bu @@ -12,15 +13,15 @@ \(bu It should be made compact (<p> & </p> tags omitted). +.UNINDENT -.RE - .sp .ce ---- .ce 0 .sp +.INDENT 0.0 .TP 2 \(bu @@ -38,15 +39,15 @@ \(bu Even though some items may have only one paragraph. +.UNINDENT -.RE - .sp .ce ---- .ce 0 .sp +.INDENT 0.0 .TP 2 \(bu @@ -57,15 +58,15 @@ \(bu It should not be made compact. +.UNINDENT -.RE - .sp .ce ---- .ce 0 .sp +.INDENT 0.0 .TP 2 \(bu @@ -97,8 +98,7 @@ \(bu The effect is interesting. +.UNINDENT -.RE - -.\" Generated by docutils manpage writer on 2008-03-05 14:09. +.\" Generated by docutils manpage writer on 2008-05-14 15:39. .\" Modified: trunk/sandbox/manpage-writer/expected/test.man =================================================================== --- trunk/sandbox/manpage-writer/expected/test.man 2008-05-07 12:55:24 UTC (rev 5547) +++ trunk/sandbox/manpage-writer/expected/test.man 2008-05-14 13:48:03 UTC (rev 5548) @@ -3,6 +3,33 @@ .SH NAME rst2man \- generate unix manpages from reStructured text +.nr rst2man-indent-level 0 +. +.de1 rstReportMargin +\\$1 \\n[an-margin] +level \\n[rst2man-indent-level] +level magin: \\n[rst2man-indent\\n[rst2man-indent-level]] +- +\\n[rst2man-indent0] +\\n[rst2man-indent1] +\\n[rst2man-indent2] +.. +.de1 INDENT +.\" .rstReportMargin pre: +. RS \\$1 +. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin] +. nr rst2man-indent-level +1 +.\" .rstReportMargin post: +.. +.de UNINDENT +. RE +.\" indent \\n[an-margin] +.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]] +.nr rst2man-indent-level -1 +.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] +.in \\n[rst2man-indent\\n[rst2man-indent-level]]u +.. + .\" TODO: authors and author with name <email> .SH SYNOPSIS @@ -16,6 +43,7 @@ .SH OPTIONS +.INDENT 0.0 .TP .BI \-o\ x @@ -26,28 +54,25 @@ .B \-b another -.TP 0 +.UNINDENT For all other options see \fB\-\-help\fP. .SH EXAMPLES +.INDENT 0.0 -.\" visit_field_list - .TP .B rst2man.py xml\-schema\-catalog.rst xml\-schema\-catalog.man create a manpage from xml\-schema\-catalog.rst +.UNINDENT -.\" depart_field_body - -.\" depart_field_list - .SS Character formatting \fIBUG\fP The section title should be separated from the title above. .SS Lists +.INDENT 0.0 .TP 2 \(bu @@ -59,8 +84,8 @@ and a longer entry, and a longer entry, and a longer entry, and a longer entry, and a longer entry, and a longer entry, and a longer entry, and a longer entry, +.INDENT 2.0 -.RS 2 .TP 3 1. and a nested @@ -70,8 +95,8 @@ 2. enumeration +.INDENT 2.0 -.RS 3 .TP 2 \(bu some line @@ -81,9 +106,8 @@ \(bu bullets +.UNINDENT -.RE - .TP 3 3. a third @@ -98,8 +122,8 @@ 5. a third +.INDENT 2.0 -.RS 3 .TP 2 a. alphabetically BUG not recognized as list start @@ -114,9 +138,8 @@ c. grammar +.UNINDENT -.RE - .TP 3 6. a third @@ -142,56 +165,49 @@ a BUG indentation must be 3 if there are more than nine enumerated items (or there are larger numbers) +.UNINDENT +.UNINDENT +.INDENT 0.0 -.RE - -.RE - .TP 3 1. dont start with 1 +.UNINDENT +.INDENT 0.0 -.RE - .TP 3 1. dont increment by 1 +.UNINDENT +.INDENT 0.0 -.RE - .TP 3 1. does not work. - -.RE +.UNINDENT This paragraph must not be indented with the text the last list\-item, but start at the left margin of the numbers. .SS Field lists +.INDENT 0.0 -.\" visit_field_list - .TP .B first a short label and a short text -.\" depart_field_body - .TP .B secondly a longer label and some more text and some more text and some more text and some more text +.UNINDENT +.INDENT 0.0 -.\" depart_field_body - -.\" depart_field_list - .TP .B definition lists are also a valuable option and simple nonintrusive formatting @@ -201,7 +217,7 @@ .B definition too : with the colon. -.TP 0 +.UNINDENT .SS Tables .TS @@ -242,20 +258,21 @@ More information can be found about +.INDENT 0.0 .TP 2 \(bu xml\-schema\-catalog at \fI\%http://xml\-schema\-catalog.origo.ethz.ch/\fP - -.RE +.UNINDENT And see the stars at the sky! .SH BUGS Numerous mapping problems. +.INDENT 0.0 .TP 3 1. @@ -277,9 +294,8 @@ list items. bullets and enumerators. +.UNINDENT -.RE - .SH AUTHOR gr...@us... @@ -287,5 +303,5 @@ public domain Behave responsible. -.\" Generated by docutils manpage writer on 2008-03-05 14:09. +.\" Generated by docutils manpage writer on 2008-05-14 15:39. .\" Modified: trunk/sandbox/manpage-writer/writers/manpage.py =================================================================== --- trunk/sandbox/manpage-writer/writers/manpage.py 2008-05-07 12:55:24 UTC (rev 5547) +++ trunk/sandbox/manpage-writer/writers/manpage.py 2008-05-14 13:48:03 UTC (rev 5548) @@ -55,7 +55,41 @@ import docutils from docutils import nodes, utils, writers, languages +FIELD_LIST_INDENT = 7 +DEFINITION_LIST_INDENT = 7 +OPTION_LIST_INDENT = 7 +# Define two macros so man/roff can calculate the +# indent/unindent margins by itself +MACRO_DEF = (r""" +.nr rst2man-indent-level 0 +. +.de1 rstReportMargin +\\$1 \\n[an-margin] +level \\n[rst2man-indent-level] +level magin: \\n[rst2man-indent\\n[rst2man-indent-level]] +- +\\n[rst2man-indent0] +\\n[rst2man-indent1] +\\n[rst2man-indent2] +.. +.de1 INDENT +.\" .rstReportMargin pre: +. RS \\$1 +. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin] +. nr rst2man-indent-level +1 +.\" .rstReportMargin post: +.. +.de UNINDENT +. RE +.\" indent \\n[an-margin] +.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]] +.nr rst2man-indent-level -1 +.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] +.in \\n[rst2man-indent\\n[rst2man-indent-level]]u +.. +""") + class Writer(writers.Writer): supported = ('manpage') @@ -148,18 +182,26 @@ self.header_written = 0 self.authors = [] self.section_level = 0 + self._indent = [0] # central definition of simple processing rules # what to output on : visit, depart self.defs = { + 'indent' : ('.INDENT %.1f\n', '.UNINDENT\n'), 'definition' : ('', ''), 'definition_list' : ('', '.TP 0\n'), 'definition_list_item' : ('\n.TP', ''), - 'description' : ('\n', ''), + #field_list + #field 'field_name' : ('\n.TP\n.B ', '\n'), + 'field_body' : ('', '.RE\n', ), 'literal' : ('\\fB', '\\fP'), 'literal_block' : ('\n.nf\n', '\n.fi\n'), - 'option_list' : ('', '.TP 0\n'), + + #option_list 'option_list_item' : ('\n.TP', ''), + #option_group, option + 'description' : ('\n', ''), + 'reference' : (r'\fI\%', r'\fP'), #'target' : (r'\fI\%', r'\fP'), 'emphasis': ('\\fI', '\\fP'), @@ -220,6 +262,8 @@ return "%c." % (ord(self._style[1])+self._cnt) def get_width(self): return self._style[0] + def __repr__(self): + return 'enum_style%r' % list(self._style) if node.has_key('enumtype'): self._list_char.append(enum_char(node['enumtype'])) @@ -228,14 +272,15 @@ if len(self._list_char) > 1: # indent nested lists # BUG indentation depends on indentation of parent list. - self.body.append('\n.RS %d' % self._list_char[-2].get_width()) + self.indent(self._list_char[-2].get_width()) + else: + self.indent(self._list_char[-1].get_width()) + #self.indent() def list_end(self): - if len(self._list_char) > 0: - self.body.append('\n.RE\n') + self.dedent() self._list_char.pop() - def header(self): tmpl = (".TH %(title)s %(manual_section)s" " \"%(date)s\" \"%(version)s\" \"%(manual_group)s\"\n" @@ -250,6 +295,7 @@ if self.header_written: return self.body.append(self.header()) + self.body.append(MACRO_DEF) self.header_written = 1 def visit_address(self, node): @@ -399,10 +445,10 @@ self.body.append(self.defs['definition'][1]) def visit_definition_list(self, node): - self.body.append(self.defs['definition_list'][0]) + self.indent(DEFINITION_LIST_INDENT) def depart_definition_list(self, node): - self.body.append(self.defs['definition_list'][1]) + self.dedent() def visit_definition_list_item(self, node): self.body.append(self.defs['definition_list_item'][0]) @@ -412,9 +458,11 @@ def visit_description(self, node): self.body.append(self.defs['description'][0]) + #self.indent(OPTION_LIST_INDENT) def depart_description(self, node): self.body.append(self.defs['description'][1]) + #self.dedent() def visit_docinfo(self, node): self._in_docinfo = 1 @@ -491,27 +539,35 @@ self.depart_admonition() def visit_field(self, node): + #self.body.append(self.comment('visit_field')) pass def depart_field(self, node): + #self.body.append(self.comment('depart_field')) pass def visit_field_body(self, node): + #self.body.append(self.comment('visit_field_body')) if self._in_docinfo: self._docinfo[ self._field_name.lower().replace(" ","_")] = node.astext() raise nodes.SkipNode def depart_field_body(self, node): - self.body.append(self.comment('depart_field_body')) + #self.body.append(self.comment('depart_field_body')) + pass def visit_field_list(self, node): - self.body.append(self.comment('visit_field_list')) + #self.body.append(self.comment('visit_field_list')) + self.indent(FIELD_LIST_INDENT) def depart_field_list(self, node): - self.body.append(self.comment('depart_field_list')) + #self.body.append(self.comment('depart_field_list %r' % self._indent)) + self.dedent('depart_field_list') + def visit_field_name(self, node): + #self.body.append(self.comment('visit_field_name')) if self._in_docinfo: self._field_name = node.astext() raise nodes.SkipNode @@ -519,6 +575,7 @@ self.body.append(self.defs['field_name'][0]) def depart_field_name(self, node): + #self.body.append(self.comment('depart_field_name')) self.body.append(self.defs['field_name'][1]) def visit_figure(self, node): @@ -708,11 +765,24 @@ def depart_note(self, node): self.depart_admonition() + def indent(self, by=0.5): + # if we are in a section ".SH" there already is a .RS + #self.body.append('\n[[debug: listchar: %r]]\n' % map(repr, self._list_char)) + #self.body.append('\n[[debug: indent %r]]\n' % self._indent) + step = self._indent[-1] + self._indent.append(by) + self.body.append(self.defs['indent'][0] % step) + + def dedent(self, name=''): + #self.body.append('\n[[debug: dedent %s %r]]\n' % (name, self._indent)) + self._indent.pop() + self.body.append(self.defs['indent'][1]) + def visit_option_list(self, node): - self.body.append(self.defs['option_list'][0]) + self.indent(OPTION_LIST_INDENT) def depart_option_list(self, node): - self.body.append(self.defs['option_list'][1]) + self.dedent() def visit_option_list_item(self, node): # one item of the list |