Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 8 additions & 5 deletions src/mistune/plugins/footnotes.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,10 @@
_PARAGRAPH_SPLIT = re.compile(r"\n{2,}")
# https://michelf.ca/projects/php-markdown/extra/#footnotes
REF_FOOTNOTE = (
r"^(?P<footnote_lead> {0,3})"
r"\[\^(?P<footnote_key>" + LINK_LABEL + r")]:[ \t]"
r"^(?P<footnote_lead> {0,4})"
r"\[\^(?P<footnote_key>" + LINK_LABEL + r")]:[ \t\n]"
r"(?P<footnote_text>[^\n]*(?:\n+|$)"
r"(?:(?P=footnote_lead) {1,3}(?! )[^\n]*\n+)*"
r"(?:(?P=footnote_lead) {1,4}(?! )[^\n]*\n+)*"
r")"
)

Expand Down Expand Up @@ -70,8 +70,11 @@ def parse_footnote_item(block: "BlockParser", key: str, index: int, state: Block
spaces = len(second_line) - len(second_line.lstrip())
pattern = re.compile(r"^ {" + str(spaces) + r",}", flags=re.M)
text = pattern.sub("", text).strip()
items = _PARAGRAPH_SPLIT.split(text)
children = [{"type": "paragraph", "text": s} for s in items]

footer_state = BlockState()
footer_state.process(text)
block.parse(footer_state)
children = footer_state.tokens
else:
text = text.strip()
children = [{"type": "paragraph", "text": text}]
Expand Down
56 changes: 54 additions & 2 deletions tests/fixtures/footnotes.txt
Original file line number Diff line number Diff line change
Expand Up @@ -31,15 +31,67 @@ multiple lines [^1]
three

four

five
.
<p>multiple lines <sup class="footnote-ref" id="fnref-1"><a href="#fn-1">1</a></sup></p>
<pre><code>four</code></pre>
<pre><code> five</code></pre>
<section class="footnotes">
<ol>
<li id="fn-1"><p>foo</p>
<p>one</p>
<p>two</p>
<p>three<a href="#fnref-1" class="footnote">&#8617;</a></p></li>
<p>three</p>
<p>four<a href="#fnref-1" class="footnote">&#8617;</a></p></li>
</ol>
</section>
````````````````````````````````

```````````````````````````````` example
multi-line footnote[^1]

[^1]:
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat
non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
.
<p>multi-line footnote<sup class="footnote-ref" id="fnref-1"><a href="#fn-1">1</a></sup></p>
<section class="footnotes">
<ol>
<li id="fn-1"><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat
non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<a href="#fnref-1" class="footnote">&#8617;</a></p></li>
</ol>
</section>
````````````````````````````````

```````````````````````````````` example
fenced code block in footnote[^1]

[^1]:
first

```sh
second
third
```

fourth
.
<p>fenced code block in footnote<sup class="footnote-ref" id="fnref-1"><a href="#fn-1">1</a></sup></p>
<section class="footnotes">
<ol>
<li id="fn-1"><p>first</p>
<pre><code class="language-sh">second
third
</code></pre>
<p>fourth<a href="#fnref-1" class="footnote">&#8617;</a></p></li>
</ol>
</section>
````````````````````````````````