Skip to content

Commit 86b3d13

Browse files
committed
fix a regression with extended block code blocks.
1 parent d89ca04 commit 86b3d13

4 files changed

Lines changed: 34 additions & 7 deletions

File tree

tests/test_block.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,3 +47,10 @@ def test_block_tags_false():
4747
result = t.parse('test')
4848
expect = 'test'
4949
assert result == expect
50+
51+
def test_blockcode_extended():
52+
input = 'bc.. text\nmoretext\n\nevenmoretext\n\nmoremoretext'
53+
expect = '<pre><code>text\nmoretext\n\nevenmoretext\n\nmoremoretext</code></pre>'
54+
t = Textile()
55+
result = t.parse(input)
56+
assert result == expect

tests/test_values.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@
150150

151151
('<script>alert("hello");</script>', '\t<p><script>alert(&#8220;hello&#8221;);</script></p>'),
152152

153-
('pre.. Hello\n\nHello Again\n\np. normal text', '<pre>Hello\n\nHello Again\n</pre>\n\n\t<p>normal text</p>'),
153+
('pre.. Hello\n\nHello Again\n\np. normal text', '<pre>Hello\n\nHello Again</pre>\n\n\t<p>normal text</p>'),
154154

155155
('<pre>this is in a pre tag</pre>', '<pre>this is in a pre tag</pre>'),
156156

@@ -180,7 +180,7 @@
180180

181181
('h2. A header\n\n\n\n\n\nsome text', '\t<h2>A header</h2>\n\n\t<p>some text</p>'),
182182

183-
('pre.. foo bar baz\nquux', '<pre>foo bar baz\nquux\n</pre>'),
183+
('pre.. foo bar baz\nquux', '<pre>foo bar baz\nquux</pre>'),
184184

185185
('line of text\n\n leading spaces',
186186
'\t<p>line of text</p>\n\n leading spaces'),
@@ -286,7 +286,7 @@
286286
# issue 2 escaping
287287
('"foo ==(bar)==":#foobar', '\t<p><a href="#foobar">foo (bar)</a></p>'),
288288
# issue 14 newlines in extended pre blocks
289-
("pre.. Hello\n\nAgain\n\np. normal text", '<pre>Hello\n\nAgain\n</pre>\n\n\t<p>normal text</p>'),
289+
("pre.. Hello\n\nAgain\n\np. normal text", '<pre>Hello\n\nAgain</pre>\n\n\t<p>normal text</p>'),
290290
# url with parentheses
291291
('"python":http://en.wikipedia.org/wiki/Python_(programming_language)', '\t<p><a href="http://en.wikipedia.org/wiki/Python_%28programming_language%29">python</a></p>'),
292292
# table with hyphen styles

textile/core.py

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -421,6 +421,7 @@ def block(self, text):
421421
tag = 'p'
422422
atts = cite = graf = ext = ''
423423

424+
last_item_is_a_shelf = False
424425
out = []
425426

426427
for line in text:
@@ -430,6 +431,17 @@ def block(self, text):
430431
match = re.search(pattern, line, flags=re.S | re.U)
431432
# tag specified on this line.
432433
if match:
434+
# if we had a previous extended tag but not this time, close up
435+
# the tag
436+
if out:
437+
last_item_is_a_shelf = out[-1] in self.shelf
438+
if ext and match.group('tag') and last_item_is_a_shelf:
439+
content = out.pop()
440+
if block.inner_tag:
441+
content = generate_tag(block.inner_tag, content,
442+
block.inner_atts)
443+
out.append(generate_tag(block.outer_tag, content,
444+
block.outer_atts))
433445
tag, atts, ext, cite, content = match.groups()
434446
block = Block(self, **match.groupdict())
435447
inner_block = generate_tag(block.inner_tag, block.content,
@@ -450,7 +462,7 @@ def block(self, text):
450462
# if we're inside an extended block, add the text from the
451463
# previous extension to the front
452464
if ext:
453-
line = '{0}\n{1}'.format(out.pop(), line)
465+
line = '{0}\n\n{1}'.format(out.pop(), line)
454466
whitespace = ' \t\n\r\f\v'
455467
if ext or not line[0] in whitespace:
456468
block = Block(self, tag, atts, ext, cite, line)
@@ -459,6 +471,8 @@ def block(self, text):
459471
else:
460472
line = generate_tag(block.outer_tag, block.content,
461473
block.outer_atts)
474+
if block.inner_tag == 'code':
475+
line = block.content
462476
if block.outer_tag != 'pre' and not has_raw_text(line):
463477
line = "\t{0}".format(line)
464478
else:
@@ -477,7 +491,11 @@ def block(self, text):
477491
graf = ''
478492

479493
if ext:
480-
out.append(generate_tag(block.outer_tag, out.pop(),
494+
content = out.pop()
495+
if block.inner_tag:
496+
content = generate_tag(block.inner_tag, content,
497+
block.inner_atts)
498+
out.append(generate_tag(block.outer_tag, content,
481499
block.outer_atts))
482500
return '\n\n'.join(out)
483501

textile/objects/block.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,8 +99,10 @@ def process(self):
9999
i_tag = ''
100100
if self.tag == 'bc':
101101
i_tag = 'code'
102-
self.content = self.textile.shelve(encode_html('{0}\n'.format(
103-
self.content.rstrip("\n"))))
102+
content = encode_html(self.content)
103+
if not self.ext:
104+
content = '{0}\n'.format(content)
105+
self.content = self.textile.shelve(content)
104106
self.outer_tag = 'pre'
105107
self.outer_atts = self.attributes
106108
self.inner_tag = i_tag

0 commit comments

Comments
 (0)