[PATCH 1 of 2] minirst: Support for admonitions

Erik Zielke ez at aragost.com
Wed Sep 22 10:22:50 CDT 2010


# HG changeset patch
# User Erik Zielke <erikzielke at hotmail.com>
# Date 1285163519 -7200
# Node ID ded8e44b92bda9f6cb6b12c49e3d36b19c47e37d
# Parent  8a5b6383ba02c053eac7a10a26502edd35355a90
minirst: Support for admonitions

diff -r 8a5b6383ba02 -r ded8e44b92bd mercurial/minirst.py
--- a/mercurial/minirst.py	Tue Sep 21 23:58:32 2010 +0200
+++ b/mercurial/minirst.py	Wed Sep 22 15:51:59 2010 +0200
@@ -24,6 +24,8 @@
 
 - definition lists
 
+- admonitions
+
 - bullet lists (items must start with '-')
 
 - enumerated lists (no autonumbering)
@@ -37,6 +39,8 @@
 
 import re, sys
 import util, encoding
+from i18n import _
+
 
 def replace(text, substs):
     utext = text.decode(encoding.encoding)
@@ -292,12 +296,66 @@
             i += 2
     return blocks
 
+def addadmonitions(blocks):
+    """    
+    Makes the type of the block an admonition block if 
+    the first line is an admonition directive 
+    """
+    
+    i = 0
+    
+    admonitiongroup1 = 'ADMONITION|ATTENTION|CAUTION|DANGER|ERROR|HINT|'
+    admonitiongroup2 = 'IMPORTANT|NOTE|TIP|WARNING|ADMONITION'
+    pattern = '\.\. ('+ admonitiongroup1 + admonitiongroup2 +')::'
+
+    prog = re.compile(pattern, flags=re.IGNORECASE)
+    while i < len(blocks):
+        if(prog.match(blocks[i]['lines'][0])):
+            endpos = blocks[i]['lines'][0].find('::')
+
+            blocks[i]['type'] = 'admonition'
+            admonitiontitle = blocks[i]['lines'][0][3:endpos].lower()
+            
+            if admonitiontitle == 'admonition':
+                line = blocks[i]['lines'][0]
+                admonitiontitle = line[endpos + 3:].lower()
+                
+            blocks[i]['admonitiontitle'] = admonitiontitle
+            del blocks[i]['lines'][0]
+        i = i + 1
+    return blocks
 
 def formatblock(block, width):
     """Format a block according to width."""
     if width <= 0:
         width = 78
     indent = ' ' * block['indent']
+    if block['type'] == 'admonition':
+        admonitionformats = {'attention': _('Attention:'), 
+                              'caution': _('Caution:'),
+                              'danger': _('!Danger!')  ,
+                              'error': _('Error:'),
+                              'hint': _('Hint:'),
+                              'important': _('Important:'),
+                              'note': _('Note'':'),
+                              'tip': _('Tip:'),
+                              'warning': _('Warning!')}
+         
+        format = '%s:'
+         
+        if block['admonitiontitle'] in admonitionformats.keys():
+            format = admonitionformats[(block['admonitiontitle'])]
+            admonition =  format
+        else:
+            admonition = (format % block['admonitiontitle']).title()
+
+             
+        hang = len(block['lines'][-1]) - len(block['lines'][-1].lstrip())
+        defindent = indent + hang * ' '
+        text = ' '.join(map(str.strip, block['lines']))
+        return '%s\n%s' % (indent + admonition, util.wrap(text, width=width,
+                                           initindent=defindent,
+                                           hangindent=defindent))
     if block['type'] == 'margin':
         return ''
     if block['type'] == 'literal':
@@ -363,6 +421,7 @@
     blocks = splitparagraphs(blocks)
     blocks = updatefieldlists(blocks)
     blocks = addmargins(blocks)
+    blocks = addadmonitions(blocks)
     text = '\n'.join(formatblock(b, width) for b in blocks)
     if keep is None:
         return text
@@ -389,4 +448,5 @@
     blocks = debug(updatefieldlists, blocks)
     blocks = debug(findsections, blocks)
     blocks = debug(addmargins, blocks)
+    blocks = debug(addadmonitions, blocks)
     print '\n'.join(formatblock(b, 30) for b in blocks)
diff -r 8a5b6383ba02 -r ded8e44b92bd tests/test-minirst.py
--- a/tests/test-minirst.py	Tue Sep 21 23:58:32 2010 +0200
+++ b/tests/test-minirst.py	Wed Sep 22 15:51:59 2010 +0200
@@ -197,3 +197,21 @@
 ------------------------------
 """
 debugformat('sections', sections, 20)
+
+
+admonitions = """
+.. NOTE::
+   This is a note
+
+   - Bullet 1
+   - Bullet 2
+   - BUllet 3
+
+   .. ADMONITION:: General note
+      Test general note
+
+.. DANGER::
+   This is danger
+"""
+
+debugformat('admonitions', admonitions, 30)
diff -r 8a5b6383ba02 -r ded8e44b92bd tests/test-minirst.py.out
--- a/tests/test-minirst.py.out	Tue Sep 21 23:58:32 2010 +0200
+++ b/tests/test-minirst.py.out	Wed Sep 22 15:51:59 2010 +0200
@@ -318,3 +318,19 @@
 ---------------------------
 ----------------------------------------------------------------------
 
+admonitions formatted to fit within 30 characters:
+----------------------------------------------------------------------
+Note:
+   This is a note
+
+   - Bullet 1
+   - Bullet 2
+   - BUllet 3
+
+   General Note:
+      Test general note
+
+!Danger!
+   This is danger
+----------------------------------------------------------------------
+


More information about the Mercurial-devel mailing list