[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