Skip to main content

MarkupPy

This is MarkupPy - a Python module that attempts to make it easier to generate HTML/XML from a Python program in an intuitive, lightweight, customizable and pythonic way. It works with both python 2 and 3.

Installation:

pip install MarkupPy

Documentation and further info is at https://tylerbakke.github.io/MarkupPy/

Please send bug reports, feature requests, enhancement ideas or questions to tylerbakke@gmail.com.

The Python Package can be found at https://pypi.python.org/pypi/MarkupPy.

The code is in the public domain. Version: 1.17 as of March 12 2024.

Usage Examples

Basic Example

from MarkupPy import markup

# Create an HTML page
page = markup.page()
page.init(title="My Title")
page.p("Hello, World!")
page.p.close()

# Print the HTML
print(page)

Inline Styles and Scripts (v1.16+)

You can now add inline CSS and JavaScript directly in the init method:

page = markup.page()
page.init(
    title="My Styled Page",
    style_content="body { background-color: #f0f0f0; } h1 { color: blue; }",
    script_content="function greet() { alert('Hello!'); }"
)

You can also pass multiple styles/scripts as a list:

page.init(
    title="My Styled Page",
    style_content=[
        "body { background-color: #f0f0f0; }",
        "h1 { color: blue; }"
    ],
    script_content=[
        "function greet() { alert('Hello!'); }",
        "function goodbye() { alert('Goodbye!'); }"
    ]
)

Avoiding Extra Newlines in Pre Tags (v1.17+)

When adding content to <pre> elements, you might want to avoid extra newlines. The add_raw method helps with this:

page = markup.page()
page.init()
page.pre.open()

# Standard add method (inserts extra newlines between each addition)
page.add("Line 1")
page.add("Line 2")  # This will create extra space between lines

# Better approach with add_raw (no extra newlines)
page.add_raw("Line 3\n")
page.add_raw("Line 4\n")  # Only the explicit newlines are included

page.pre.close()

For pre-formatted text with tables or code samples, add_raw preserves the exact formatting you specify.

Running Tests

The package includes tests for all features. To run the tests:

# Navigate to the MarkupPy directory
cd MarkupPy

# Run all tests
python tests/run_tests.py

# Run specific test modules
python tests/test_inline_features.py
python tests/test_add_raw.py

The tests verify that:

  1. Inline styles and scripts work correctly in the init method
  2. The add_raw method properly handles pre-formatted content without adding unwanted newlines

For Maintainers

Release Process

When publishing a new release to PyPI, follow these steps:

  1. Update the version number in both:

    • MarkupPy/markup.py (update __version__ and __date__)
    • pyproject.toml (update version under [project])
  2. Add a Git tag for the release:

    git tag -a v1.XX -m "Version 1.XX - Brief description of changes"
    git push origin v1.XX
    
  3. Build and upload to PyPI:

    python -m build
    python -m twine upload dist/markuppy-1.XX*
    

Tagging each PyPI release in the Git repository makes it easier to track releases and find specific versions of code.

Automated Release Process

The project uses GitHub Actions for automated releases. There are two ways to trigger a release:

Automatic Release on Version Bump

  1. Update the version number in both:

    • MarkupPy/markup.py (update __version__ and __date__)
    • pyproject.toml (update version under [project])
  2. Commit and push the changes to GitHub:

    git add MarkupPy/markup.py pyproject.toml
    git commit -m "Bump version to X.XX"
    git push origin main
    

The workflow will automatically:

  • Detect the version change
  • Verify that the version numbers match
  • Create a Git tag
  • Build the package
  • Publish to PyPI using trusted publishing

Manual Release

If you need to run the release process manually:

  1. Go to the GitHub repository, click on "Actions" tab
  2. Select the "Build and Publish" workflow
  3. Click "Run workflow"
    • Enter the version number (e.g., 1.18)
    • Enable the "Create git tag" option if you want to automatically tag the release
    • Click "Run workflow"

The workflow will perform the same steps as the automatic release process.

This automated process helps ensure consistency and reduces manual steps in the release process.

Release files for MarkupPy 1.18

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for MarkupPy 1.18
File Size Uploaded
markuppy-1.18.tar.gz 11.6 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for MarkupPy 1.18
File Interpreter ABI Platform
markuppy-1.18-py3-none-any.whl Python 3 none any Details

Total release size: 21.9 kB

Release files / markuppy-1.18.tar.gz

Download URL markuppy-1.18.tar.gz
Size 11.6 kB
Tags Source
SHA-256 checksum
How to use checksums
540f31b835076260339368890ac4f44eb3971d75fdbd97b49fa1f8b6685513d3
BLAKE2b-256 checksum
How to use checksums
46122f2426faf45655dceacccf04a927a3d9f24e74fbccabbb39784034139dcc
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.12.9

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Mar 19, 2025.

Transparency log

Release files / markuppy-1.18-py3-none-any.whl

Download URL markuppy-1.18-py3-none-any.whl
Size 10.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
788115ef3d529c2f8a298da4799f0838f57805a5e47068bcb9903092391466b3
BLAKE2b-256 checksum
How to use checksums
3a0615436a52f281ff43a9a54d1587b602536716645c8534fbb76c58b266f32b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.12.9

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Mar 19, 2025.

Transparency log

Release history Release notifications | RSS feed

This release

1.18 This release

2 release files

1.17

2 release files

1.16

2 release files

1.15

2 release files

1.14

2 release files

1.12

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page