Python-Markdown / markdown

A Python implementation of John Gruber’s Markdown with Extension support.
https://python-markdown.github.io/
BSD 3-Clause "New" or "Revised" License
3.71k stars 856 forks source link

`abbr` extension breaks title attribute added using `attr_list` #1460

Closed nbanyan closed 4 months ago

nbanyan commented 4 months ago

Bug description

*[abbr]: Abbreviation Definition

![Image with abbr in title](abbr.png){title="Image with abbr in title"}

This renders the attribute code as plain text because the Abbreviation extension modifies the text in the attribute causing it to no longer be a valid attribute list.

Reproduction

9.5.18-abbr-attr_list-conflict.zip

Steps to reproduce

  1. Enable the abbr and attr_list extensions
  2. Include an abbreviation definition on a page
  3. Use the abbreviation in a title attribute for an object using the attr_list syntax
waylan commented 4 months ago

I can confirm this is an issue.

>>> import markdown
>>> src = '''
... *[abbr]: Abbreviation Definition
...
... ![Image with abbr in title](abbr.png){title="Image with abbr in title"}
... '''
>>> markdown.markdown(src, extensions=['abbr', 'attr_list'])
'<p><img alt="Image with abbr in title" src="abbr.png" />{title="Image with <abbr title="Abbreviation Definition">abbr</abbr> in title"}</p>'

The cause of the issue is that the abbr extension runs an inline processor while the attr_list extension runs a treeprocessor. If both extensions used the same type of processor we would just ensure they were ordered so that the attr_list processor ran first. But being different processor types, it is not so easy. Especially because we generally want inline processors to run before attr_list so that attribute lists can be applied to inline elements.

This may require use of a custom treeprocessor for the addr extension which runs later. I will have to think about that.