Span attribute extension for Python-Markdown
Project description
markdown-span-attr
Sometimes you really need a span
A Python-Markdown extension that enables inline <span> elements with attribute lists:
[content]{#id .class key="value"}
Features
- Wraps inline content in
<span>elements with appended attributes - Fully compatible with Python-Markdown base and extended syntax, including:
- Inline links
- Reference links
- Wikilinks
- Supports nested spans, links, and nesting inside links
- Renders correctly HTML elements inside attributes (e.g., for MkDocs Material tooltips)
- No parsing overhead — delegates attribute handling to the
attr_listextension
Installation
$ pip install markdown-span-attr
Usage
Enable alongside attr_list in Python:
import markdown
md = markdown.Markdown(extensions=['attr_list', 'span_attr'])
Or in mkdocs.yml:
markdown_extensions:
- attr_list
- span_attr
Syntax
[content]{#id .class key="value"}
Renders as:
<span class="class" id="id" key="value">content</span>
See the official extension for attribute lists syntax.
Examples
Nested content
[horace]: #
[[Horace][horace]{.p} is [daring](#quint1){.cit}]{#s1} # nested reference/inline links
[[audax]{.foreign} [daring]]{#s2} # nested spans and unescaped brackets
[[[Poets]] daring in [[words]]{title="Words"}]{#s3} # wikilinks
Renders as:
<span id="s1"><a class="p" href="#">Horace</a> is <a class="cit" href="#quint1">daring</a></span>
<span id="s2"><span class="foreign">audax</span> [daring]</span>
<span id="s3"><a class="wikilink" href="/Poets/">Poets</a> daring in <a class="wikilink" href="/words/" title="Words">words</a></span>
HTML in attributes
[transilire lineas impune]{: .q title="Varro, <em>De Lingua Latina</em> IX 5" }
Renders as:
<span class="q" title="Varro, <em>De Lingua Latina</em> IX 5">transilire lineas impune</span>
Why?
Many would say that supporting arbitrary <span> elements in Markdown syntax goes against Markdown philosophy, and perhaps it is true. But sometimes you really need a readable span in Markdown, and decadence is inescapable, anyway. So at least be safe with span_attr not to break compatibility with other extensions.
Technical Details
Regular Expression
The extension uses a greedy-safe regular expression to match [content]{: attr-list} spans, supporting nesting while avoiding premature matches:
\[([^\[\]]*|(?:[^\[\]]*\[[^\[\]]*\](?!\{)[^\[\]]*)*)\](?=\{\:?[ ]*([^\}\n ][^\n]*)[ ]*\})
What it does:
- Matches the innermost span first to support nesting (no other attribute span is allowed inside).
- Allows only content with none or balanced square brackets.
- Uses a lookahead to ensure a valid
{}attribute list follows.
It matches only [content], while attribute parsing is delegated to attr_list.
Processing Priority
The processor is registered with priority 72. This is chosen to:
- Run after
wikilinks(75), so links are parsed before wrapping them in spans. - Run before
attr_list(8), so<span>elements are inserted beforeattr_listdecorates them.
This placement ensures the extension is compatible with link handling and HTML escaping.
Inline Processors Priority Table (source)
| Priority | Pattern Name | Description |
|---|---|---|
| 190 | backtick |
Code spans |
| 180 | escape |
Backslash escapes |
| 175 | footnotes* |
Footnote references |
| 170 | reference |
Reference-style links |
| 160 | link |
Inline links |
| 150 | image_link |
Inline images |
| 140 | image_reference |
Reference-style images |
| 130 | short_reference |
Shortcut reference-style links |
| 125 | short_image_ref |
Shortcut reference-style images |
| 120 | autolink |
Automatic links |
| 110 | automail |
Automatic email links |
| 100 | linebreak |
Hard line breaks |
| 91 | html |
Inline HTML |
| 80 | entity |
HTML entities |
| 75 | wikilinks* |
Wiki-style links |
| 72 | span_attr* |
(this extension) |
| 70 | not_strong |
Prevent misparsed emphasis |
| 60 | em_strong |
*-style emphasis |
| 50 | em_strong2 |
_-style emphasis |
| 8 | attr_list* |
Attribute lists |
| 7 | abbr* |
Abbreviations |
*: Extension
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file markdown_span_attr-0.3.0.tar.gz.
File metadata
- Download URL: markdown_span_attr-0.3.0.tar.gz
- Upload date:
- Size: 7.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
da885e27cb1f715fc02c7ad567dabe88af8f7c36f911776e64f2d2c386017acf
|
|
| MD5 |
99d94494702785a592179a33e325587d
|
|
| BLAKE2b-256 |
663bfaa511ffa1ceea945d663c6a1a1debf9771b69c24ccee70599a0fc82462d
|
Provenance
The following attestation bundles were made for markdown_span_attr-0.3.0.tar.gz:
Publisher:
build.yml on frammenti/markdown-span-attr
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
markdown_span_attr-0.3.0.tar.gz -
Subject digest:
da885e27cb1f715fc02c7ad567dabe88af8f7c36f911776e64f2d2c386017acf - Sigstore transparency entry: 263279243
- Sigstore integration time:
-
Permalink:
frammenti/markdown-span-attr@4f456e95a81e4ed6cad0513238299b784f372cb4 -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/frammenti
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
build.yml@4f456e95a81e4ed6cad0513238299b784f372cb4 -
Trigger Event:
release
-
Statement type:
File details
Details for the file markdown_span_attr-0.3.0-py3-none-any.whl.
File metadata
- Download URL: markdown_span_attr-0.3.0-py3-none-any.whl
- Upload date:
- Size: 6.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
186d05edb2b8e9bccf1757bae987720612212237e8ce895759c08ba381d6ffa5
|
|
| MD5 |
6e16a2849d6293b580284987b5de7a0a
|
|
| BLAKE2b-256 |
ef5fbb93192292cc7c26f114d36a4da65328f9dd51cd126dd24c0f88098e0f91
|
Provenance
The following attestation bundles were made for markdown_span_attr-0.3.0-py3-none-any.whl:
Publisher:
build.yml on frammenti/markdown-span-attr
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
markdown_span_attr-0.3.0-py3-none-any.whl -
Subject digest:
186d05edb2b8e9bccf1757bae987720612212237e8ce895759c08ba381d6ffa5 - Sigstore transparency entry: 263279245
- Sigstore integration time:
-
Permalink:
frammenti/markdown-span-attr@4f456e95a81e4ed6cad0513238299b784f372cb4 -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/frammenti
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
build.yml@4f456e95a81e4ed6cad0513238299b784f372cb4 -
Trigger Event:
release
-
Statement type: