Skip to main content

Span attribute extension for Python-Markdown

Project description

markdown-span-attr

Sometimes you really need a span

PyPI Version MIT License Python Versions Build Status

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_list extension

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 before attr_list decorates 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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

markdown_span_attr-0.2.0.tar.gz (7.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

markdown_span_attr-0.2.0-py3-none-any.whl (6.5 kB view details)

Uploaded Python 3

File details

Details for the file markdown_span_attr-0.2.0.tar.gz.

File metadata

  • Download URL: markdown_span_attr-0.2.0.tar.gz
  • Upload date:
  • Size: 7.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.3

File hashes

Hashes for markdown_span_attr-0.2.0.tar.gz
Algorithm Hash digest
SHA256 1fb4a8840f046efcbff8bb6e574e22d4bfdb0b806d13ac59e75974f997de9fe4
MD5 c0e6492950c4a175455dd6d009009231
BLAKE2b-256 61db18a58b04af681233dac819d3605a8593d5d7e2e891c22e82f139a0ddca78

See more details on using hashes here.

File details

Details for the file markdown_span_attr-0.2.0-py3-none-any.whl.

File metadata

File hashes

Hashes for markdown_span_attr-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 3ac52b710b384d57bf51cf9a71cdae8d48ad6f16ee30a0a7c39b8696f3de5865
MD5 e2d0390fa1b04a24994c30ec6f53dfc9
BLAKE2b-256 742be274ff57e1ed9a6d33d34ab0e45a243f2092256ab5a7e88e4c89bb4e3f97

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page