Podlite 2.0 released

Podlite — one markup, many possibilities

Podlite 2.0 is tagged. The specification is at podlite.org/specification. The full changelog sits inside the spec under =head2 v2.0.

The Coming in Podlite 2.0 article from the review window covered what is new in depth. This post focuses on what to do now: how to migrate existing documents and where to find the rest. For most documents the answer is short — a well-formed v1.0 document renders unchanged under v2.0.

From v1.0 to v2.0

Breaking changes

Two changes parse differently than before. Neither touches a well-formed document — if anything needs updating, it is a parser, not your text.

Legacy attribute syntax removed

A few outdated string attribute formats are gone. The bracket form (:key<value>) and the parenthesized form (:key('value')) remain.

If a document uses the current syntax, nothing changes.

=include is now a directive

=include always behaved like a directive, but the spec previously listed it under block types. Tokenization rules differ between directives and blocks. Parsers built against the v1.0 spec must move =include into the directive dispatch path alongside =config and =alias.

For document authors: no change. =include still takes the same syntax and produces the same output. The reclassification matters only for tools that build ASTs.

New features at a glance

Eight additions ship in v2.0. Existing documents render unchanged.

All eight at a glance

  • =boundary: a typed section divider. Renders as a horizontal rule, exposes structure to tools.

  • =set: pre-configure attributes for the next block. Multiline values, inline markup, lexical scope.

=set — multiline caption flows to the next block

  • G<> + :masked: content masking. Inline mark or whole-block attribute; hidden by default, revealed by render condition.

G<> + :masked — inline and block content masking

  • =data-table block: renders CSV or TSV as a table. Three source forms (inline body, external :src<file:X>, =data reference). :columns selects projection, :rename{} overrides display names.

=begin data-table :caption('Quarterly sales') :mime-type<'text/csv; header=present'>
quarter,product,revenue
Q1,Widget,12000
Q1,Gadget,18000
Q2,Widget,15400
Q2,Gadget,21200
=end data-table

=data-table — CSV body rendered as a table

  • Extended :mime-type syntax: accepts MIME parameters per RFC 6838, with header=present|absent for CSV/TSV header indication per RFC 4180 §3.

  • Markdown fenced code block attributes: the string after the language tag is now parsed as Podlite attributes.

  • Per-link configuration attributes for L<>: settings stay with the link rather than scattering through prose.

  • =table error recovery: explicit warnings for malformed rows (cell count mismatch, mixed separators), graceful fallback instead of silent corruption.

For full examples and rationale, the Coming in Podlite 2.0 article is still accurate.

Where to go from here