From 8a64c2970ca99f1586bc85a59898bfe7269c9128 Mon Sep 17 00:00:00 2001 From: Waylan Limberg Date: Wed, 15 Jun 2011 08:50:55 -0400 Subject: Fixed #21. A header and paragraph not seperated by a blank line inside a list item are now parsed correctly. One of those crazy wierd edge cases that no one would ever test for, but is obvious once you see it. --- markdown/blockprocessors.py | 31 +++++++++++++++++++++++++++---- tests/misc/header-in-lists.html | 20 ++++++++++++++++++++ tests/misc/header-in-lists.txt | 14 ++++++++++++++ 3 files changed, 61 insertions(+), 4 deletions(-) create mode 100644 tests/misc/header-in-lists.html create mode 100644 tests/misc/header-in-lists.txt diff --git a/markdown/blockprocessors.py b/markdown/blockprocessors.py index 6396b4a..2695932 100644 --- a/markdown/blockprocessors.py +++ b/markdown/blockprocessors.py @@ -328,6 +328,13 @@ class OListProcessor(BlockProcessor): p.text = lst[-1].text lst[-1].text = '' lst[-1].insert(0, p) + # if the last item has a tail, then the tail needs to be put in a p + # likely only when a header is not followed by a blank line + lch = self.lastChild(lst[-1]) + if lch is not None and lch.tail: + p = util.etree.SubElement(lst[-1], 'p') + p.text = lch.tail.lstrip() + lch.tail = '' # parse first block differently as it gets wrapped in a p. li = util.etree.SubElement(lst, 'li') @@ -518,11 +525,27 @@ class ParagraphProcessor(BlockProcessor): if block.strip(): # Not a blank block. Add to parent, otherwise throw it away. if self.parser.state.isstate('list'): - # The parent is a tight-list. Append to parent.text - if parent.text: - parent.text = '%s\n%s' % (parent.text, block) + # The parent is a tight-list. + # + # Check for any children. This will likely only happen in a + # tight-list when a header isn't followed by a blank line. + # For example: + # + # * # Header + # Line 2 of list item - not part of header. + sibling = self.lastChild(parent) + if sibling is not None: + # Insetrt after sibling. + if sibling.tail: + sibling.tail = '%s\n%s' % (sibling.tail, block) + else: + sibling.tail = '\n%s' % block else: - parent.text = block.lstrip() + # Append to parent.text + if parent.text: + parent.text = '%s\n%s' % (parent.text, block) + else: + parent.text = block.lstrip() else: # Create a regular paragraph p = util.etree.SubElement(parent, 'p') diff --git a/tests/misc/header-in-lists.html b/tests/misc/header-in-lists.html new file mode 100644 index 0000000..61a6d97 --- /dev/null +++ b/tests/misc/header-in-lists.html @@ -0,0 +1,20 @@ +

Tight List:

+ +

Loose List:

+ \ No newline at end of file diff --git a/tests/misc/header-in-lists.txt b/tests/misc/header-in-lists.txt new file mode 100644 index 0000000..b633d8a --- /dev/null +++ b/tests/misc/header-in-lists.txt @@ -0,0 +1,14 @@ +Tight List: + +* #Header1 +Line 1-2 - not a header or paragraph! +* #Header2 +Line 2-2 - not a header or paragraph! + +Loose List: + +* #Header1 +Line 1-2 - a paragraph + +* #Header2 +Line 2-2 - a paragraph -- cgit v1.2.3