aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--markdown/preprocessors.py78
-rw-r--r--tests/misc/div.html3
-rw-r--r--tests/misc/multi-line-tags.html3
-rw-r--r--tests/misc/multiline-comments.html5
4 files changed, 68 insertions, 21 deletions
diff --git a/markdown/preprocessors.py b/markdown/preprocessors.py
index 072784b..cbf40e3 100644
--- a/markdown/preprocessors.py
+++ b/markdown/preprocessors.py
@@ -78,13 +78,16 @@ class HtmlBlockPreprocessor(Preprocessor):
right_tag_patterns = ["</%s>", "%s>"]
attrs_pattern = r"""
- \s+(?P<attr> [^>"'/ ]+)=(?P<q>['"])(?P<value>.*?)(?P=q) # attr="value"
+ \s+(?P<attr>[^>"'/= ]+)=(?P<q>['"])(?P<value>.*?)(?P=q) # attr="value"
| # OR
- \s+(?P<sattr> [^>"'/ ]+) # attr
+ \s+(?P<attr1>[^>"'/= ]+)=(?P<value1>[^> ]+) # attr=value
+ | # OR
+ \s+(?P<attr2>[^>"'/= ]+) # attr
"""
left_tag_pattern = r'^\<(?P<tag>[^> ]+)(?P<attrs>(%s)*)\s*\/?\>?' % attrs_pattern
attrs_re = re.compile(attrs_pattern, re.VERBOSE)
left_tag_re = re.compile(left_tag_pattern, re.VERBOSE)
+ markdown_in_raw = False
def _get_left_tag(self, block):
m = self.left_tag_re.match(block)
@@ -94,17 +97,23 @@ class HtmlBlockPreprocessor(Preprocessor):
attrs = {}
if raw_attrs:
for ma in self.attrs_re.finditer(raw_attrs):
- if ma.group('value'):
- attrs[ma.group('attr').strip()] = ma.group('value')
- elif ma.group('attr'):
- attrs[ma.group('attr').strip()] = ""
+ if ma.group('attr'):
+ if ma.group('value'):
+ attrs[ma.group('attr').strip()] = ma.group('value')
+ else:
+ attrs[ma.group('attr').strip()] = ""
+ elif ma.group('attr1'):
+ if ma.group('value1'):
+ attrs[ma.group('attr1').strip()] = ma.group('value1')
+ else:
+ attrs[ma.group('attr1').strip()] = ""
+ elif ma.group('attr2'):
+ attrs[ma.group('attr2').strip()] = ""
return tag, len(m.group(0)), attrs
else:
tag = block[1:].replace(">", " ", 1).split()[0].lower()
return tag, len(tag+2), {}
- #return block[1:].replace(">", " ", 1).split()[0].lower()
-
def _get_right_tag(self, left_tag, left_index, block):
for p in self.right_tag_patterns:
tag = p % left_tag
@@ -114,7 +123,7 @@ class HtmlBlockPreprocessor(Preprocessor):
return block.rstrip()[-left_index:-1].lower(), len(block)
def _equal_tags(self, left_tag, right_tag):
- if left_tag == 'div' or left_tag[0] in ['?', '@', '%']: # handle PHP, etc.
+ if left_tag[0] in ['?', '@', '%']: # handle PHP, etc.
return True
if ("/" + left_tag) == right_tag:
return True
@@ -137,7 +146,7 @@ class HtmlBlockPreprocessor(Preprocessor):
left_tag = ''
right_tag = ''
in_tag = False # flag
- #import pdb; pdb.set_trace()
+
while text:
block = text[0]
if block.startswith("\n"):
@@ -175,13 +184,24 @@ class HtmlBlockPreprocessor(Preprocessor):
if self._is_oneliner(left_tag):
new_blocks.append(block.strip())
continue
-
+
if block.rstrip().endswith(">") \
and self._equal_tags(left_tag, right_tag):
- new_blocks.append(
- self.markdown.htmlStash.store(block.strip()))
+ if self.markdown_in_raw and 'markdown' in attrs.keys():
+ start = re.sub(r'\smarkdown(=[\'"]?[^> ]*[\'"]?)?',
+ '', block[:left_index])
+ end = block[-len(right_tag)-2:]
+ block = block[left_index:-len(right_tag)-2]
+ new_blocks.append(
+ self.markdown.htmlStash.store(start))
+ new_blocks.append(block)
+ new_blocks.append(
+ self.markdown.htmlStash.store(end))
+ else:
+ new_blocks.append(
+ self.markdown.htmlStash.store(block.strip()))
continue
- else: #if not block[1] == "!":
+ else:
# if is block level tag and is not complete
if markdown.isBlockLevel(left_tag) or left_tag == "--" \
@@ -206,12 +226,36 @@ class HtmlBlockPreprocessor(Preprocessor):
if self._equal_tags(left_tag, right_tag):
# if find closing tag
in_tag = False
- new_blocks.append(
- self.markdown.htmlStash.store('\n\n'.join(items)))
+ if self.markdown_in_raw and 'markdown' in attrs.keys():
+ start = items[0][:left_index]
+ items[0] = items[0][left_index:]
+ end = items[-1][-len(right_tag)-2:]
+ items[-1] = items[-1][:-len(right_tag)-2]
+ new_blocks.append(
+ self.markdown.htmlStash.store(start))
+ new_blocks.extend(items)
+ new_blocks.append(
+ self.markdown.htmlStash.store(end))
+ else:
+ new_blocks.append(
+ self.markdown.htmlStash.store('\n\n'.join(items)))
items = []
if items:
- new_blocks.append(self.markdown.htmlStash.store('\n\n'.join(items)))
+ if self.markdown_in_raw and 'markdown' in attrs.keys():
+ start = items[0][:left_index]
+ items[0] = items[0][left_index:]
+ end = items[-1][-len(right_tag)-2:]
+ items[-1] = items[-1][:-len(right_tag)-2]
+ new_blocks.append(
+ self.markdown.htmlStash.store(start))
+ new_blocks.extend(items)
+ new_blocks.append(
+ self.markdown.htmlStash.store(end))
+ else:
+ new_blocks.append(
+ self.markdown.htmlStash.store('\n\n'.join(items)))
+ #new_blocks.append(self.markdown.htmlStash.store('\n\n'.join(items)))
new_blocks.append('\n')
new_text = "\n\n".join(new_blocks)
diff --git a/tests/misc/div.html b/tests/misc/div.html
index 7cd0d6d..7b68854 100644
--- a/tests/misc/div.html
+++ b/tests/misc/div.html
@@ -1,4 +1,5 @@
<div id="sidebar">
-<p><em>foo</em></p>
+ _foo_
+
</div> \ No newline at end of file
diff --git a/tests/misc/multi-line-tags.html b/tests/misc/multi-line-tags.html
index 763a050..784c1dd 100644
--- a/tests/misc/multi-line-tags.html
+++ b/tests/misc/multi-line-tags.html
@@ -1,4 +1,5 @@
<div>
-<p>asdf asdfasd</p>
+asdf asdfasd
+
</div> \ No newline at end of file
diff --git a/tests/misc/multiline-comments.html b/tests/misc/multiline-comments.html
index 547ba0b..12f8cb5 100644
--- a/tests/misc/multiline-comments.html
+++ b/tests/misc/multiline-comments.html
@@ -2,7 +2,7 @@
foo
--->
+-->
<p>
@@ -12,5 +12,6 @@ foo
<div>
-<p>foo</p>
+foo
+
</div> \ No newline at end of file