1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
|
import re
import parser
# Detect examples blocks
class Parser(parser.Parser):
def __init__(self, pctxt):
parser.Parser.__init__(self, pctxt)
template = pctxt.templates.get_template("parser/example/comment.tpl")
self.comment = template.render(pctxt=pctxt).strip()
def parse(self, line):
pctxt = self.pctxt
result = re.search(r'^ *(Examples? *:)(.*)', line)
if result:
label = result.group(1)
desc_indent = False
desc = result.group(2).strip()
# Some examples have a description
if desc:
desc_indent = len(line) - len(desc)
indent = parser.get_indent(line)
if desc:
# And some description are on multiple lines
while pctxt.get_line(1) and parser.get_indent(pctxt.get_line(1)) == desc_indent:
desc += " " + pctxt.get_line(1).strip()
pctxt.next()
pctxt.next()
add_empty_line = pctxt.eat_empty_lines()
content = []
if parser.get_indent(pctxt.get_line()) > indent:
if desc:
desc = desc[0].upper() + desc[1:]
add_empty_line = 0
while pctxt.has_more_lines() and ((not pctxt.get_line()) or (parser.get_indent(pctxt.get_line()) > indent)):
if pctxt.get_line():
for j in xrange(0, add_empty_line):
content.append("")
content.append(re.sub(r'(#.*)$', self.comment, pctxt.get_line()))
add_empty_line = 0
else:
add_empty_line += 1
pctxt.next()
elif parser.get_indent(pctxt.get_line()) == indent:
# Simple example that can't have empty lines
if add_empty_line and desc:
# This means that the example was on the same line as the 'Example' tag
# and was not a description
content.append(" " * indent + desc)
desc = False
else:
while pctxt.has_more_lines() and (parser.get_indent(pctxt.get_line()) >= indent):
content.append(pctxt.get_line())
pctxt.next()
pctxt.eat_empty_lines() # Skip empty remaining lines
pctxt.stop = True
parser.remove_indent(content)
template = pctxt.templates.get_template("parser/example.tpl")
return template.render(
pctxt=pctxt,
label=label,
desc=desc,
content=content
)
return line
|