Skip to main content

Microformats2 (mf2) parser and renderer powered by JustHTML.

Project description

mf2dom

Microformats2 (mf2) parser and deterministic renderer powered by JustHTML.

mf2dom focuses on:

  • Correct mf2 parsing (validated against the official microformats-tests suite)
  • Deterministic HTML rendering and stable round-trips (HTML -> mf2 -> HTML)
  • A small runtime surface area (no network I/O, no BeautifulSoup)

Installation

pip install mf2dom

Requires Python 3.11+.

Quickstart

Parse mf2 JSON from HTML:

import mf2dom

html = '<a class="h-card u-url p-name" href="/me">Alice</a>'
doc = mf2dom.parse(html, base_url="https://example.com/")
print(doc["items"])

The parsed document is a dict with items, rels, and rel-urls keys (mf2 JSON shape).

Render mf2 JSON back into canonical HTML:

html2 = mf2dom.render(doc)

Async parsing (offloads to a thread):

doc = await mf2dom.parse_async(html, base_url="https://example.com/")

API

  • mf2dom.parse(html, *, base_url=None, url=None) -> dict
    • html can be a string/bytes, a justhtml.JustHTML instance, or a JustHTML root node.
    • base_url controls resolution of relative URLs (preferred). url is a deprecated alias.
  • mf2dom.parse_async(...) is parse(...) via asyncio.to_thread(...).
  • mf2dom.render(doc) -> str renders a deterministic HTML representation of an mf2 document.

JavaScript/TypeScript Renderer

A TypeScript implementation of the renderer is available in src/mf2dom-ts/ for client-side rendering (e.g., with sql-wasm.js).

Installation

cd src/mf2dom-ts
npm install
npm run build

Usage

ES Module:

import { render, renderItemElement, renderItems } from './dist/mf2dom.esm.js';

// Render full document to HTML string
const html = render(mf2Document);

// Render to DOM element (most efficient for client-side)
const main = render(mf2Document, { asElement: true });
document.body.appendChild(main);

// Render single item
const card = renderItemElement(hCard);

// Batch render with DocumentFragment (efficient for lists)
const fragment = renderItems(entries);
container.appendChild(fragment);

Browser script tag:

<script src="dist/mf2dom.min.js"></script>
<script>
  const html = mf2dom.render(doc);
  // or
  const el = mf2dom.render(doc, { asElement: true });
</script>

Build Output

File Size Use Case
dist/mf2dom.esm.js 5.2kb ES modules (bundlers, modern browsers)
dist/mf2dom.cjs 5.7kb CommonJS (Node.js)
dist/mf2dom.min.js 5.7kb Browser <script> tag

Why mf2dom vs mf2py?

Both libraries parse microformats, but they optimize for different use cases:

  • Choose mf2dom if you need deterministic rendering, stable round-trips, and a smaller/no-network runtime surface (useful for normalization, caching, and “canonical mf2 HTML” fixtures).
  • Choose mf2py if you need URL fetching, microformats1 compatibility, metaformats support, or wider Python version support.

Testing & correctness

  • Official parsing fixtures: tests/test_official_microformats_suite.py runs the upstream microformats-tests JSON fixtures.
  • Coverage gate: pyproject.toml enforces 100% branch coverage.

To run the official fixture suite locally, check out microformats-tests as a sibling directory:

git clone https://github.com/microformats/microformats-tests ../microformats-tests

Development (uv)

uv sync --group dev
uv run pytest
uv run coverage run -m pytest && uv run coverage report
uv run pre-commit install

License

AGPL 3

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

mf2dom-0.2.0.tar.gz (15.0 MB view details)

Uploaded Source

Built Distribution

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

mf2dom-0.2.0-py3-none-any.whl (36.2 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: mf2dom-0.2.0.tar.gz
  • Upload date:
  • Size: 15.0 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.9

File hashes

Hashes for mf2dom-0.2.0.tar.gz
Algorithm Hash digest
SHA256 b9adf0678114b6568eed5d13185df7ab21f33714206e287d378d41d829ed5d25
MD5 638f1ac07c6ee8102aca5351288ef0c7
BLAKE2b-256 6b8f882bfbfafd3ee05fad21cbfa4264b0586a7f0afa7e6686706002605ee5b7

See more details on using hashes here.

File details

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

File metadata

  • Download URL: mf2dom-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 36.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.9

File hashes

Hashes for mf2dom-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 7236dfa2e7e31509c09d2a93e8a9c3c2c59db08aa534482fd11718e51a381d12
MD5 162a61e8b459a36819c4474f8ad6977d
BLAKE2b-256 448e9a7b8030d4e6ab1f6941af24721ea2b3bb224b95070888ce208347f9ee74

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