Skip to main content

Python-Markdown extension for better list handling

Project description

mdx_better_lists

A Python-Markdown extension for better list handling, providing more intuitive list behavior and formatting with fine-grained control over list rendering. Created with Test-Driven Development (TDD) principles to ensure reliability and maintainability.

Features

  • Configurable nested indentation - Control how many spaces are required for nested lists (default: 2)
  • Marker-based list separation - Automatically separate lists when marker types change (-, *, +)
  • Blank line list separation - Separate unordered lists when blank lines appear between items
  • Loose list control - Control paragraph wrapping in ordered lists with blank lines
  • Number preservation - Optionally preserve exact list numbers from markdown source
  • Always start at one - Force ordered lists to always start at 1

Installation

pip install mdx_better_lists

Usage

Basic Usage

from markdown import markdown

text = """
- Item 1
- Item 2

- Item 3
"""

html = markdown(text, extensions=['mdx_better_lists'])

With Configuration

from markdown import markdown

text = """
1. First
2. Second
2. Another second
"""

html = markdown(text, extensions=['mdx_better_lists'],
                extension_configs={'mdx_better_lists': {
                    'preserve_numbers': True
                }})

Configuration Options

Option Type Default Description
nested_indent int 2 Number of spaces required for nested list indentation
marker_separation bool True Separate lists when marker types (-, *, +) differ
unordered_list_separation bool True Separate unordered lists when blank lines appear between items
ordered_list_loose bool True Wrap ordered list items in <p> tags when blank lines separate them
preserve_numbers bool False Preserve exact list numbers from markdown (use value attribute)
always_start_at_one bool False Force all ordered lists to start at 1

Configuration Details

nested_indent (default: 2)

Controls how many spaces are required for a list item to be considered nested.

# With nested_indent=2 (default)
- Parent
  - Nested  # 2 spaces = nested

# With nested_indent=4
- Parent
    - Nested  # 4 spaces = nested
  - Not nested  # 2 spaces = not nested

marker_separation (default: True)

When enabled, lists with different markers (-, *, +) are separated into different <ul> elements.

# With marker_separation=True (default)
- Item with dash
+ Item with plus  # Creates a new <ul>

# Output: Two separate <ul> elements

# With marker_separation=False
- Item with dash
+ Item with plus  # Same <ul>

# Output: Single <ul> element

unordered_list_separation (default: True)

When enabled, unordered lists are separated into different <ul> elements when blank lines appear.

# With unordered_list_separation=True (default)
- First

- Second  # Creates a new <ul>

# Output: Two separate <ul> elements

# With unordered_list_separation=False
- First

- Second  # Same <ul>

# Output: Single <ul> element

ordered_list_loose (default: True)

When enabled, ordered list items are wrapped in <p> tags when blank lines separate them.

# With ordered_list_loose=True (default)
1. First

2. Second

# Output:
<ol>
  <li><p>First</p></li>
  <li><p>Second</p></li>
</ol>

# With ordered_list_loose=False
1. First

2. Second

# Output:
<ol>
  <li>First</li>
  <li>Second</li>
</ol>

preserve_numbers (default: False)

When enabled, preserves exact list numbers from the markdown source using the value attribute.

# With preserve_numbers=True
1. First
2. Second
2. Another second
3. Third

# Output:
<ol>
  <li value="1">First</li>
  <li value="2">Second</li>
  <li value="2">Another second</li>
  <li value="3">Third</li>
</ol>

always_start_at_one (default: False)

When enabled, forces all ordered lists to start at 1, ignoring the starting number in markdown.

# With always_start_at_one=True
5. Fifth
6. Sixth

# Output:
<ol>
  <li>Fifth</li>
  <li>Sixth</li>
</ol>
# (renders as 1, 2 instead of 5, 6)

# With always_start_at_one=False (default)
5. Fifth
6. Sixth

# Output:
<ol start="5">
  <li>Fifth</li>
  <li>Sixth</li>
</ol>

Examples

Example 1: Marker Separation

from markdown import markdown

text = """
- Item with dash
- Another dash

+ Item with plus
+ Another plus
"""

html = markdown(text, extensions=['mdx_better_lists'])

# Output: Three separate <ul> elements (blank line + marker change)

Example 2: Nested Lists with Custom Indentation

from markdown import markdown

text = """
- Parent
    - Nested (4 spaces)
        - Deeply nested (8 spaces)
"""

html = markdown(text, extensions=['mdx_better_lists'],
                extension_configs={'mdx_better_lists': {
                    'nested_indent': 4
                }})

Example 3: Preserving List Numbers

from markdown import markdown

text = """
1. Introduction
1. Background
1. Methods
"""

html = markdown(text, extensions=['mdx_better_lists'],
                extension_configs={'mdx_better_lists': {
                    'preserve_numbers': True
                }})

# Each item gets value="1"

Migration from mdx_truly_sane_lists

# mdx_truly_sane_lists
markdown(text, extensions=['mdx_truly_sane_lists'],
         extension_configs={'mdx_truly_sane_lists': {
             'truly_sane': True  # Default
             'nested_indent': 2  # Default
         }})

# Equivalent in mdx_better_lists (this is the default)
markdown(text, extensions=['mdx_better_lists'],
         extension_configs={'mdx_better_lists': {
             'marker_separation': True, # Default
             'unordered_list_separation': True, # Default
             'ordered_list_loose': True # Default
             'nested_indent': 2  # Default
         }})

Note: mdx_better_lists does not support loose list behavior (paragraph wrapping) for unordered lists. Unordered lists always remain tight, even when both marker_separation and unordered_list_separation are set to False.

Development

This project follows Test-Driven Development (TDD) principles.

Running Tests

pytest tests/

License

This project is licensed under the MIT License - see the LICENSE file for details.

Acknowledgments

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

mdx_better_lists-0.1.0.tar.gz (15.5 kB view details)

Uploaded Source

Built Distribution

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

mdx_better_lists-0.1.0-py3-none-any.whl (8.0 kB view details)

Uploaded Python 3

File details

Details for the file mdx_better_lists-0.1.0.tar.gz.

File metadata

  • Download URL: mdx_better_lists-0.1.0.tar.gz
  • Upload date:
  • Size: 15.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.9

File hashes

Hashes for mdx_better_lists-0.1.0.tar.gz
Algorithm Hash digest
SHA256 a0d484b4de1ba39f6987dd018b3d277fc1d923407b875682231300c57708d5e3
MD5 cff28f55b34fe6185b9f3dc28018a0ab
BLAKE2b-256 88b4e56a38d3ca8b763a8198e34a2f5455e4f3d78e9c16680ab5870cd691c25c

See more details on using hashes here.

File details

Details for the file mdx_better_lists-0.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for mdx_better_lists-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 2602f6befb687509a81f9878e204cb5794f8d08b00a53bb2f13541d0f8f69264
MD5 152d2580fb91685c05bd737784180339
BLAKE2b-256 b8c28d21c1c8e6723deb9ddb8b914f69fa863f3b219629d007ec93b5d475dff3

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