1.1 --- a/moinformat/__init__.py Sun Apr 30 01:43:33 2017 +0200
1.2 +++ b/moinformat/__init__.py Sun Apr 30 17:59:52 2017 +0200
1.3 @@ -19,7 +19,7 @@
1.4 this program. If not, see <http://www.gnu.org/licenses/>.
1.5 """
1.6
1.7 -from moinformat.tree import Block, Heading, ListItem, Region, Rule, Text
1.8 +from moinformat.tree import Block, Break, Heading, ListItem, Region, Rule, Text
1.9 import re
1.10
1.11 # Regular expressions.
1.12 @@ -36,11 +36,15 @@
1.13 "break" : r"^(\s*?)\n",
1.14 # [ws...] =... ws... expecting headingend
1.15 "heading" : r"^(\s*)(?P<x>=+)(\s+)(?=.*?\s+(?P=x)\s*\n)",
1.16 - # indent (list-item or number-item or alpha-item or roman-item or dot-item)
1.17 + # indent list-item [ws...]
1.18 "listitem" : r"^(\s+)(\*)(\s*)",
1.19 + # indent number-item ws...
1.20 "listitem_num" : r"^(\s+)(\d+\.)(\s+)",
1.21 + # indent alpha-item ws...
1.22 "listitem_alpha": r"^(\s+)([aA]\.)(\s+)",
1.23 + # indent roman-item ws...
1.24 "listitem_roman": r"^(\s+)([iI]\.)(\s+)",
1.25 + # indent dot-item [ws...]
1.26 "listitem_dot" : r"^(\s+)(\.)(\s*)",
1.27
1.28 # Region contents:
1.29 @@ -226,11 +230,7 @@
1.30
1.31 "Handle a paragraph break within 'region'."
1.32
1.33 - # Mark any previous block as not being the final one in a sequence.
1.34 -
1.35 - block = region.last()
1.36 - if isinstance(block, Block):
1.37 - block.final = False
1.38 + region.add(Break())
1.39 new_block(region)
1.40
1.41 def parse_heading(items, region):
1.42 @@ -326,7 +326,7 @@
1.43 "Start a new block in 'region'."
1.44
1.45 block = Block([])
1.46 - region.append(block)
1.47 + region.add(block)
1.48
1.49
1.50
2.1 --- a/moinformat/serialisers.py Sun Apr 30 01:43:33 2017 +0200
2.2 +++ b/moinformat/serialisers.py Sun Apr 30 17:59:52 2017 +0200
2.3 @@ -44,12 +44,11 @@
2.4 if level:
2.5 out("}" * level)
2.6
2.7 - def start_block(self, final):
2.8 + def start_block(self):
2.9 pass
2.10
2.11 - def end_block(self, final):
2.12 - if not final:
2.13 - self.out("\n")
2.14 + def end_block(self):
2.15 + pass
2.16
2.17 def start_heading(self, level, extra, pad):
2.18 self.out(extra + "=" * level + pad)
2.19 @@ -63,6 +62,9 @@
2.20 def end_listitem(self, indent, marker):
2.21 pass
2.22
2.23 + def break_(self):
2.24 + self.out("\n")
2.25 +
2.26 def rule(self, length):
2.27 self.out("-" * length)
2.28
2.29 @@ -92,10 +94,10 @@
2.30 def end_region(self, level, indent, type):
2.31 self.out("</span>")
2.32
2.33 - def start_block(self, final):
2.34 + def start_block(self):
2.35 self.out("<p>")
2.36
2.37 - def end_block(self, final):
2.38 + def end_block(self):
2.39 self.out("</p>")
2.40
2.41 def start_heading(self, level, extra, pad):
2.42 @@ -110,6 +112,9 @@
2.43 def end_listitem(self, indent, marker):
2.44 self.out("</li>")
2.45
2.46 + def break_(self):
2.47 + pass
2.48 +
2.49 def rule(self, length):
2.50 self.out("<hr style='height: %dpt' />" % min(length, 10))
2.51
3.1 --- a/moinformat/tree.py Sun Apr 30 01:43:33 2017 +0200
3.2 +++ b/moinformat/tree.py Sun Apr 30 17:59:52 2017 +0200
3.3 @@ -29,13 +29,18 @@
3.4 def append(self, node):
3.5 self.nodes.append(node)
3.6
3.7 + add = append
3.8 +
3.9 append_text = append
3.10
3.11 def empty(self):
3.12 return not self.nodes
3.13
3.14 - def last(self):
3.15 - return self.nodes and self.nodes[-1] or None
3.16 + def node(self, index):
3.17 + try:
3.18 + return self.nodes[index]
3.19 + except IndexError:
3.20 + return None
3.21
3.22 def normalise(self):
3.23
3.24 @@ -86,8 +91,8 @@
3.25 self.indent = indent
3.26 self.type = type
3.27
3.28 - def append(self, node):
3.29 - last = self.last()
3.30 + def add(self, node):
3.31 + last = self.node(-1)
3.32 if last and last.empty():
3.33 self.nodes[-1] = node
3.34 else:
3.35 @@ -124,24 +129,20 @@
3.36
3.37 "A block in the page."
3.38
3.39 - def __init__(self, nodes, final=True):
3.40 - Container.__init__(self, nodes)
3.41 - self.final = final
3.42 -
3.43 def __repr__(self):
3.44 return "Block(%r)" % self.nodes
3.45
3.46 def prettyprint(self, indent=""):
3.47 - l = ["%sBlock: final=%s" % (indent, self.final)]
3.48 + l = ["%sBlock" % indent]
3.49 for node in self.nodes:
3.50 l.append(node.prettyprint(indent + " "))
3.51 return "\n".join(l)
3.52
3.53 def to_string(self, out):
3.54 - out.start_block(self.final)
3.55 + out.start_block()
3.56 for node in self.nodes:
3.57 node.to_string(out)
3.58 - out.end_block(self.final)
3.59 + out.end_block()
3.60
3.61 class Heading(Container):
3.62
3.63 @@ -206,6 +207,19 @@
3.64 def empty(self):
3.65 return False
3.66
3.67 +class Break(Node):
3.68 +
3.69 + "A paragraph break."
3.70 +
3.71 + def __repr__(self):
3.72 + return "Break()"
3.73 +
3.74 + def prettyprint(self, indent=""):
3.75 + return "%sBreak" % indent
3.76 +
3.77 + def to_string(self, out):
3.78 + out.break_()
3.79 +
3.80 class Rule(Node):
3.81
3.82 "A horizontal rule."