[PATCH] minirst: improved support for option lists

Erik Zielke ez at aragost.com
Tue Nov 16 06:54:04 CST 2010


# HG changeset patch
# User Erik Zielke <ez at aragost.com>
# Date 1288716259 -3600
# Node ID b561ec7fec442f266712012b2c96c9407f2830a2
# Parent  6af02ac1ddf38f0e28e3fd3fb9c832150623ca2a
minirst: improved support for option lists.

This enables minirst to parse and print option lists, which both have
long and short options.

diff -r 6af02ac1ddf3 -r b561ec7fec44 mercurial/minirst.py
--- a/mercurial/minirst.py	Tue Nov 16 13:49:02 2010 +0100
+++ b/mercurial/minirst.py	Tue Nov 02 17:44:19 2010 +0100
@@ -99,7 +99,8 @@
     return blocks
 
 _bulletre = re.compile(r'(-|[0-9A-Za-z]+\.|\(?[0-9A-Za-z]+\)|\|) ')
-_optionre = re.compile(r'^(--[a-z-]+)((?:[ =][a-zA-Z][\w-]*)?  +)(.*)$')
+_optionre = re.compile(r'^(-([a-zA-Z0-9]), )?(--[a-z0-9-]+)'
+                       r'((.*)  +)(.*)$')
 _fieldre = re.compile(r':(?![: ])([^:]*)(?<! ):[ ]+(.*)')
 _definitionre = re.compile(r'[^ ]')
 
@@ -173,6 +174,42 @@
     return blocks
 
 
+def updateoptionlists(blocks):
+    i = 0
+    while i < len(blocks):
+        if blocks[i]['type'] != 'option':
+            i += 1
+            continue
+
+        optstrwidth = 0
+        j = i
+        while j < len(blocks) and blocks[j]['type'] == 'option':
+            m = _optionre.match(blocks[j]['lines'][0])
+
+            shortoption = m.group(2)
+            group3 = m.group(3)
+            longoption = group3[2:].strip()
+            desc = m.group(6).strip()
+            longoptionarg = m.group(5).strip()
+            blocks[j]['lines'][0] = desc
+
+            noshortop = ''
+            if not shortoption:
+                noshortop = '   '
+
+            opt = "%s%s" %   (shortoption and "-%s " % shortoption or '',
+                            ("%s--%s %s") % (noshortop, longoption,
+                                             longoptionarg))
+            opt = opt.rstrip()
+            blocks[j]['optstr'] = opt
+            optstrwidth = max(optstrwidth, encoding.colwidth(opt))
+            j += 1
+
+        for block in blocks[i:j]:
+            block['optstrwidth'] = optstrwidth
+        i = j + 1
+    return blocks
+
 def prunecontainers(blocks, keep):
     """Prune unwanted containers.
 
@@ -322,6 +359,17 @@
                      'tip': _('Tip:'),
                      'warning': _('Warning!')}
 
+def formatoption(block, width):
+    desc = ' '.join(map(str.strip, block['lines']))
+    colwidth = encoding.colwidth(block['optstr'])
+    usablewidth = width - 1
+    hanging = block['optstrwidth']
+    initindent = '%s%s  ' % (block['optstr'], ' ' * ((hanging - colwidth)))
+    hangindent = ' ' * (encoding.colwidth(initindent) + 1)
+    return ' %s' % (util.wrap(desc, usablewidth,
+                                           initindent=initindent,
+                                           hangindent=hangindent))
+
 def formatblock(block, width):
     """Format a block according to width."""
     if width <= 0:
@@ -378,9 +426,7 @@
             key = key.ljust(_fieldwidth)
         block['lines'][0] = key + block['lines'][0]
     elif block['type'] == 'option':
-        m = _optionre.match(block['lines'][0])
-        option, arg, rest = m.groups()
-        subindent = indent + (len(option) + len(arg)) * ' '
+        return formatoption(block, width)
 
     text = ' '.join(map(str.strip, block['lines']))
     return util.wrap(text, width=width,
@@ -400,6 +446,7 @@
     blocks = hgrole(blocks)
     blocks = splitparagraphs(blocks)
     blocks = updatefieldlists(blocks)
+    blocks = updateoptionlists(blocks)
     blocks = addmargins(blocks)
     blocks = prunecomments(blocks)
     blocks = findadmonitions(blocks)
@@ -427,6 +474,8 @@
     blocks = debug(inlineliterals, blocks)
     blocks = debug(splitparagraphs, blocks)
     blocks = debug(updatefieldlists, blocks)
+    blocks = debug(updateoptionlists, blocks)
+    blocks = debug(updateoptionlists, blocks)
     blocks = debug(findsections, blocks)
     blocks = debug(addmargins, blocks)
     blocks = debug(prunecomments, blocks)
diff -r 6af02ac1ddf3 -r b561ec7fec44 tests/test-convert.t
--- a/tests/test-convert.t	Tue Nov 16 13:49:02 2010 +0100
+++ b/tests/test-convert.t	Tue Nov 02 17:44:19 2010 +0100
@@ -40,8 +40,8 @@
       have the following effects:
   
       --branchsort  convert from parent to child revision when possible, which
-                    means branches are usually converted one after the other. It
-                    generates more compact repositories.
+                    means branches are usually converted one after the other.
+                    It generates more compact repositories.
       --datesort    sort revisions by date. Converted repositories have good-
                     looking changelogs but are often an order of magnitude
                     larger than the same ones generated by --branchsort.
diff -r 6af02ac1ddf3 -r b561ec7fec44 tests/test-minirst.py
--- a/tests/test-minirst.py	Tue Nov 16 13:49:02 2010 +0100
+++ b/tests/test-minirst.py	Tue Nov 02 17:44:19 2010 +0100
@@ -120,16 +120,19 @@
 There is support for simple option lists,
 but only with long options:
 
---all      Output all.
---both     Output both (this description is
-           quite long).
---long     Output all day long.
+-X, --exclude  filter  an option with a short and long option with an argument
+-I, --include          an option with both a short option and a long option
+--all                  Output all.
+--both                 Output both (this description is
+                       quite long).
+--long                 Output all day long.
 
---par      This option has two paragraphs in its description.
-           This is the first.
+--par                 This option has two paragraphs in its description.
+                      This is the first.
 
-           This is the second.  Blank lines may be omitted between
-           options (as above) or left in (as here).
+                      This is the second.  Blank lines may be omitted between
+                      options (as above) or left in (as here).
+
 
 The next paragraph looks like an option list, but lacks the two-space
 marker after the option. It is treated as a normal paragraph:
diff -r 6af02ac1ddf3 -r b561ec7fec44 tests/test-minirst.py.out
--- a/tests/test-minirst.py.out	Tue Nov 16 13:49:02 2010 +0100
+++ b/tests/test-minirst.py.out	Tue Nov 02 17:44:19 2010 +0100
@@ -180,14 +180,20 @@
 There is support for simple option lists, but only with long
 options:
 
---all      Output all.
---both     Output both (this description is quite long).
---long     Output all day long.
---par      This option has two paragraphs in its
-           description. This is the first.
+ -X --exclude filter  an option with a short and long option
+                      with an argument
+ -I --include         an option with both a short option and
+                      a long option
+    --all             Output all.
+    --both            Output both (this description is quite
+                      long).
+    --long            Output all day long.
+    --par             This option has two paragraphs in its
+                      description. This is the first.
 
-           This is the second.  Blank lines may be omitted
-           between options (as above) or left in (as here).
+                      This is the second.  Blank lines may
+                      be omitted between options (as above)
+                      or left in (as here).
 
 The next paragraph looks like an option list, but lacks the
 two-space marker after the option. It is treated as a normal
@@ -202,23 +208,62 @@
 option lists, but only with
 long options:
 
---all      Output all.
---both     Output both (this
-           description is
-           quite long).
---long     Output all day
-           long.
---par      This option has two
-           paragraphs in its
-           description. This
-           is the first.
+ -X --exclude filter  an
+                      option
+                      with a
+                      short
+                      and
+                      long
+                      option
+                      with an
+                      argumen
+                      t
+ -I --include         an
+                      option
+                      with
+                      both a
+                      short
+                      option
+                      and a
+                      long
+                      option
+    --all             Output
+                      all.
+    --both            Output
+                      both
+                      (this d
+                      escript
+                      ion is
+                      quite
+                      long).
+    --long            Output
+                      all day
+                      long.
+    --par             This
+                      option
+                      has two
+                      paragra
+                      phs in
+                      its des
+                      criptio
+                      n. This
+                      is the
+                      first.
 
-           This is the second.
-           Blank lines may be
-           omitted between
-           options (as above)
-           or left in (as
-           here).
+                      This is
+                      the
+                      second.
+                      Blank
+                      lines
+                      may be
+                      omitted
+                      between
+                      options
+                      (as
+                      above)
+                      or left
+                      in (as
+                      here).
 
 The next paragraph looks like
 an option list, but lacks the


More information about the Mercurial-devel mailing list