Changelog
0.2.0a7 - 2026-09-04
Added
Backslash Escaping for Inline Formatting Delimiters (Feature #113, follow-up):
A backslash preceding a constrained formatting delimiter (e.g.
\*bold*,\_italic_, ``code``,\#marked#,\^super^,\~sub~) now suppresses span creation and emits the delimiter characters as plain text with the escape backslash consumed.Unconstrained formatting delimiters (e.g.
\**bold**,\__italic__, ```code```,\##marked##) are likewise escapable with a single leading backslash.
Asciidoctor-compatible double-backslash escaping for unconstrained delimiters (e.g.
\\__func__) is also supported, consuming both backslashes.Double-backslash before a constrained delimiter (e.g.
\\*bold*) continues to resolve to a literal\followed by active bold formatting.Nested formatting inside an escaped span (e.g.
\*bold and _italic_*) is preserved and processed normally.
Fixed
Indented Continuation Lines in List Item Principal Text (Issue #125, reopened):
Spec-correct fix: contiguous indented lines immediately following a list item marker (with no blank line) are now folded into the item’s
principaltext field, not stored asLiteralnodes inblocks.The previous
0.2.0a6fix was structurally correct (preserved list continuity) but placed continuation content in the wrong location per the AsciiDoc specification’s “Multiline principal text” rule.Blank-line separation still correctly terminates the list and produces a standalone literal block.
0.2.0a6 - 2026-09-03
Added
Human-Readable Syntax Error Diagnostics (Feature #78 Phase 1):
Added internal terminal translation dictionary (
_TERMINAL_NAMES) inlark_parser.pyconverting cryptic Lark tokens (e.g._NEWLINE,DLIST_MARKER_2,SECTION_TITLE_LEAD,ATTR_LIST_CONTENT,EQUALS) into user-friendly names in compiler diagnostics while suppressing internal anonymous rules.Graceful Cross-Reference Resolution (Feature #78 Phase 1):
Improved
ASGResolver.visit_ref()to record structured warnings inresolver.warningsand marknode.resolved_strategy = "unresolved"instead of crashing with an unhandled PythonKeyErroron missing catalog targets.Added warning accumulation to
WorkspaceBuilder.warnings.
Fixed
Block Title Whitespace Ambiguity with Dot-Ordered Lists (Issue #122):
Fixed
block_titlegrammar rule matching. textwith a leading space, which previously caused dot-ordered list items to be consumed as block titles attached to subsequent items. IntroducedBLOCK_TITLE_PREFIX.10enforcing non-whitespace immediately following the dot while preserving title content.WORDTokenizer URI Scheme Suffix Fragmentation (Issue #123):Added
(?<![a-zA-Z0-9])negative lookbehind to single-colon URI scheme alternatives (mailto:,data:,tel:,sms:) in theWORDlexer terminal, preventing premature token truncation on words whose suffixes match URI schemes (e.g.Metadata:,Subdata:).
Backslash Inline Macro Escaping (Issue 124, Feature 113):
Escaping inline macros with a leading backslash (e.g.
\xref:...,\link:...) now suppresses activeRefAST node creation and emits literal text with the escaping backslash stripped.Supported inside monospace spans (e.g.
xref:...[]) without registering active cross-references.Indented Literal Structural Attachment in List Items (Issue #125):
Fixed indented literal lines immediately following a list item without a blank line being ejected as top-level blocks outside the list. Extended list item grammar rules and AST transformation to attach them into
ListItem.blocksandCalloutListItem.blocks, preserving list continuity.
0.2.0a5 - 2026-08-30
Added
AsciiDoc Table
colsDSL Parser & ASG Resolution (Issue #118):Added native AsciiDoc
colsattribute DSL parser (src/asciidoctrine/columns.py) resolving column multipliers (N*), horizontal alignments (<,^,>), vertical alignments (.<,.^,.>), styles (d,e,s,l,m,h,a), and widths.
Normalizes integer column ratios into proportional percentage strings (e.g.,
1,3,1->20%,60%,20%) and passes through explicit percentage strings.Emits structured
columnsdictionary collection on the resolvedTableASG node while preserving rawattributes['cols']for round-tripping.
Fixed
Block Title Attachment Preceded by Another Block (Issue #119):
Fixed
.Titleblock title lines being incorrectly parsed as standaloneparagraphnodes instead of being attached to subsequent blocks (listings, admonitions, tables, examples, sidebars) when preceded by another block.
Elevated grammar priority on
block_titleto ensure correct attachment across consecutive blocks.Inline Macros Attached to Words and Punctuation (Issue #120):
Fixed inline macros (such as
footnote:[...],footnoteref:[...], ``,kbd:[...],btn:[...], `...`, and URI schemes) degrading to raw text when attached directly to preceding words or punctuation without whitespace (e.g.,statement.footnote:[Note text]).Added lookaheads to the
WORDlexer terminal to prevent eager consumption of attached inline macro prefixes, while preserving block macro syntax (image::, etc.).Added diagnostic detection for unclosed inline footnotes in strict and permissive parsing modes.
0.2.0a4 - 2026-08-25
Fixed
Verbatim Block Delimiter Protection Against Table Cells (Issue #116):
Fixed verbatim blocks (
Listing,Literal,Passthrough,Comment) containing table delimiters (|===) and cell pipes (| A | B) being prematurely broken by Lark’s lexer into separate paragraphs and tables while leaking internal preprocessor markers (--ASCIIDOCTRINE_OUTER_LISTING_START_N--).
Elevated terminal priorities for
OUTER_*verbatim content and delimiters to.50to strictly outrankTABLE_CELL.20andTABLE_DELIM.30, and guarded inner table cells in the preprocessor.Constrained Inline Monospace Boundary Terminals (Issue #117):
Fixed Earley parser ambiguity where 4 or more backtick-enclosed inline code spans on a line separated by commas (e.g. ``(
hook_0,hook_1,hook_2,hook_3)``) inverted span grouping and wrapped interstitial commas in<code>tags.Enforced AsciiDoc constrained formatting boundary rules at the lexer level with
OPEN_BACKTICK.2andCLOSE_BACKTICK.2lookarounds.
0.2.0a3 - 2026-08-24
Performance
Parser Engine Memoization & Fast Re-parsing:
Implemented memoized caching for compiled
Larkparser instances acrossparse_to_astandparse_inlines.Avoids redundant compilation and file I/O on repeated parses, achieving a ~33x speedup on repeated and batch document parsing.
Exposed
get_document_parser,get_inline_parser, andclear_parser_cachein the top-level package API.
Fixed
Verbatim Listing Bracket Preprocessor Warning (Issue #98):
Fixed preprocessor emitting a false-positive “Same-length nesting”
PreprocessorWarningwhen verbatim content lines ended with bracketed text (such as Python REPL output[2, 4, 6]) before the closing delimiter (----).Content lines inside active verbatim blocks are now recorded directly without being flagged as pending metadata.
Constrained Inline Emphasis Mid-Identifier Underscore Matching (Issue #97):
Fixed mid-identifier underscores (e.g.
some_function_nameorvar_name_2) incorrectly matching as constrained inline emphasis (_italic_), which fragmented identifiers into separate text and emphasis AST nodes.Introduced boundary lookarounds (
OPEN_UNDERSCORE.2/CLOSE_UNDERSCORE.2) andWORD_WITH_UNDERSCORE.3terminal tokenization with elevatedATTR_NAME.5andFN_ID.5priorities.
0.2.0a2 - 2026-08-21
Fixed
Consecutive List Merging with Distinct Attributes or Titles (Issue #96):
Fixed consecutive description lists and standard lists with distinct block attributes (e.g.
[parameters]and[returns]) or titles silently merging into a single list node and dropping subsequent metadata.Updated
BlockTransformer._merge_consecutive_listsandresolve_list_continuationsto break list affinity and retain separate list nodes whenever a list declares its own attributes or title.Table Parsing with Delimited Blocks in AsciiDoc Cells (Issue #95):
Fixed an Earley rule priority conflict where tables containing AsciiDoc-style cells (
a|) with delimited blocks (such as code listings[source,python]) failed to parse asTableAST nodes, incorrectly falling back to fragmented top-level paragraphs and listings.
Assigned explicit
table_cell.20000rule priority ingrammar.larkto ensure cell matching reliably outweighs top-level block splitting.Malformed Bullet-Prefixed Description List Terms (Issue #94):
- - Strict parsing now rejects malformed terms such as
* Term:: definitionand ` Term* definition` with a precise
AsciiDocSyntaxErrorinstead of silently retaining a stray asterisk in rendered output.Permissive parsing preserves its recovered description-list AST while emitting a
SyntaxWarningthat identifies the malformed term and source line.
0.2.0a1 - 2026-08-16
Added
Resource Loader Abstraction (
FileProvider,FsLoader,MemoryLoader):Introduced the
FileProviderabstract interface inasciidoctrine.loaderto decouple document parsing and preprocessing from physical disk I/O.Added
MemoryLoadervirtual filesystem for 100% hermetic in-memory parsing, multi-file workspace test fixtures, and Pyodide/browser execution.Updated
Preprocessor,parse_to_ast(),ASGResolver, andWorkspaceBuilderto accept anyFileProviderimplementation.Hermetic In-Memory Multi-File Workspace Testing:
Added
tests/test_loader.pyandtests/test_hermetic_workspace.pyasserting multi-document workspace discovery, cross-file xref resolution, nested in-memory includes, and in-memory docinfo head/footer resolution without touching disk.
Enhanced Developer Experience (DX) & AsciiDoc Docstrings:
Upgraded public API docstrings across
parse_to_ast(),parse_inlines(),WorkspaceBuilder,FileProvider,FsLoader, andMemoryLoaderto standardized AsciiDoc markup.Enhanced error diagnostics on
AsciiDocSyntaxErrorandCircularIncludeError.Collect Footnote References & Catalog in ASGResolver (Issue #93):
Resolve Inline Callouts in Listing Blocks (Issue #92):
Extracted inline callout markers (e.g.
<1>,<2>,// <1>,<!-- <.> -->,<!--1-->) in verbatimListingandLiteralblocks into structuredCalloutAST/ASG inline nodes with auto-numbering and comment-stripping support.
Fixed
Page Break Grammar Precedence (Issue #89):
Ensured page break tokens (
<<<) correctly parse toPageBreakAST nodes instead of being swallowed as literal paragraph text by definingPAGE_BREAK_MARKER.20terminal and increasingpage_break.20rule precedence.
Quote & Verse Attribution and CiteTitle Parsing (Issue #90):
Added support for extracting
attributionandcitetitleproperties from positional and named block attributes onQuoteandVerseAST/ASG nodes and serializing them into_dict().
List Item Continuation (
+) Support for Description Lists (Issue #91):Extended list continuation resolution to handle
DescriptionListandDescriptionListItemnodes, correctly attaching subsequent continuation paragraphs and blocks to the active item’sblockslist instead of leaving literal+tokens in paragraph text.
Testing
*Unit Test Coverage & Tier Classification: Added 155 new direct-call unit tests across three new files (
test_inline_transformer_unit.py,test_transformers_unit.py,test_serializer_unit.py). Classified all 32 test files withpytestmark(unit/integration/functional) and registered thefunctionalmark inpyproject.toml, establishing a clean-m unitbaseline at 54%* unit-only coverage.Test Suite Cleanup: Reclassified mistiered tests, resolved cross-file name collisions, collapsed two files of near-identical test functions into
@pytest.mark.parametrizetables, and removed leftover debug artifacts.Coverage Pipeline Optimisation: Removed
dynamic_contextplugin from the coverage configuration, cutting full-suite coverage run time from 326 s to 46 s.*Expanded Unit Test Coverage (572 tests, 76% unit-only on Py 3.12): Added 215 new unit tests across
test_serializer_unit.py,test_preprocessor.py,test_transformers_unit.py,test_resolver.py, andtest_package_api.py, targeting previously uncovered branches in the serializer, preprocessor conditional-stack, resolver xref/footnote paths, inline-transformer angle-bracket stripping, and block-transformer list-merge location logic. Cross-Python comparison (3.12 vs 3.14) confirmed that the 3.14 instrumentation countsdef/classdefinition lines as uncovered, accounting for 15 percentage-point inflation in the miss count; actual logic coverage on 3.12 reaches 76% unit-only and 96% full-suite*.
0.1.0a12 - 2026-08-06
Added
Span Roles & Unconstrained Marked Text (
[.role]#text#,##text##):Added support for unconstrained marked text (
##text##) and custom span roles ([.role]#text#), mapping role attributes to ASGSpan.attributes["role"]and Docutils HTML CSS classes.Docinfo & Document Metadata (
:docinfo:,:docinfodir:,:docinfofiles:):Implemented
:docinfo:header and footer discovery inASGResolverwithsafe_modepath-traversal boundaries, attribute substitution, and Docutils HTML head/footer injection.
Attribute Comparison Directive (
ifeval::[]):Added
ifeval::[expression]conditional preprocessor directive with string/numeric/boolean comparison evaluation and attribute substitution.
Cross-Document References & Multi-File Workspace Resolution:
Added global
WorkspaceCatalogsymbol table, 3-passWorkspaceBuilderorchestrator, and multi-file cross-reference resolution.
AST Node & Transformer Test Coverage:
Expanded unit test coverage for 18 AST node classes, multi-character block delimiters, legacy
--open block warnings, and table cell alignment.Documentation & Styling Updates:
Dogfooded span roles, docinfo stylesheets, and cross-references across all project documentation.
Changed
Preprocessor Architecture: Refactored expression tokenization (
_split_ifeval_expression) and introducedConditionalStackfor robust nested directive validation.Repository Cleanup: Consolidated architecture records and feature matrix into
docs/, reorganized utility scripts intobin/, and removed obsolete planning documentation.
0.1.0a11 - 2026-07-23
Added
Configurable Custom URI Schemes (
extra_authority_schemes,extra_opaque_schemes):Implemented parser options
extra_authority_schemesandextra_opaque_schemesinparse_to_astwith dynamic URI regex regeneration.Implemented scheme name validation and reserved scheme blacklist (
link,image,xref,note,tip,warning,to,cc,bcc,date,time,ssn,id, etc.) to prevent syntax collisions with core AsciiDoc macros and attributes.Native Python Local TCK Test Harness:
Integrated local TCK test suite (
tests/tck_harness/) into standardpytestruns viatests/test_local_tck.py.
3-Tiered Testing Strategy & Efficiency Guidelines:
Established a 3-tiered testing workflow (
Tier 1: Dev Loop,Tier 2: Pre-Commit,Tier 3: Pre-Release) with quiet reporting (-q) inAGENTS.mdanddocs/contributing.adoc.
Bare URL & Email Autolinks (Issue #76):
Full support for parsing bare URLs and email addresses (
user@domain.com) intoRefnodes withrole: "bare"andtarget="mailto:...".
Implemented trailing punctuation stripping (
.,;:!?)>]}), angle-bracket delineation (<https://...>), backslash escaping (https://...,user@domain.com), and round-trip serialization back to raw string forms.Standardized Verbatim Properties on
LiteralBlocks:Added property accessors (
id,style, andliteral_title) toLiteralblock nodes to ensure interface parity withListingblocks.
Section Nesting TCK Test (Draft):
Added a local TCK test (
tests/tck_harness/tests/block/section/nesting-*) demonstrating section nesting and level transitions: child nesting (level 1 → 2 → 3) and returning to a sibling section at a lower numerical level.
Fixed
Block Style Attribute Preservation in
ASGResolver:Updated
ASGResolverandlark_parserto preserve blockstyleattributes on resolved ASG block nodes for structural equivalence with reference ASG outputs.
Recursive Formatted Paragraph Text Reconstruction in
ASTSyntaxAuditor:Fixed
ASTSyntaxAuditor.visit_paragraphto recursively traverse nested formatted inline spans (bold, italic, monospace, etc.) viachild.walk(), ensuring syntax auditing properly inspects text inside formatted inline structures.Non-Destructive
ASGResolver:Updated
ASGResolver.resolve()to deep-copy the input AST prior to resolution, eliminating in-place AST mutation side-effects and preserving caller AST nodes.Graceful Permissive Include Directives (Issue #87):
Updated
Preprocessorandparse_to_astto handle missing include files gracefully under permissive parsing (strict=False), emitting aPreprocessorWarningand returning an unresolved directive placeholder string (Unresolved directive in ...).Inline Macro Prefix vs. URI Terminal Priority Conflict:
Fixed
link:,image:,icon:,xref:, andanchor:inline macros with URL targets (e.g. `text`) by introducing dedicated high-priority prefix terminals (LINK_PREFIX.5, etc.) that preventURI.3from stealing the URL before the macro rule can match.Bare URLs Swallowing Trailing Formatting Delimiters:
Fixed
URI.3regex to use a negative lookbehind so trailing formatting characters (*,_, `++``++) and punctuation are not consumed as part of the URL token. This allows constructs like*https://example.com*to parse correctly as bold-formatted bare links.
Nested Link Elements in Link Labels:
Added unwrapping logic in
inline_linktransformer to flatten nestedRefnodes that arise when a link label is itself a URL string (e.g. `https://example.com`), preventing invalid nested anchor elements.
Changed
Configurable & Streamlined URI Scheme Architecture:
Refactored
URI.3terminal to a streamlined, safe default set (http/https,ftp/ftps,file,irc/ircs,ws/wss,git,ssh,mailto,data,tel,sms).
Added support for passing custom authority and opaque schemes via
parse_to_ast(..., extra_authority_schemes=[...], extra_opaque_schemes=[...]).Implemented strict scheme validation (
validate_custom_scheme) enforcing length bounds (2–10 chars), character rules ([a-z0-9\-]+), and a comprehensive blacklist preventing collisions with inline macros (link,image,xref), block labels (note,tip,warning), headers, and common colon-followed terms (to,cc,bcc,date,time,ssn,id).
0.1.0a10 - 2026-07-20
Added
Bare URL Links Support:
Added robust support for parsing, serializing, and rendering bare URL and mailto references (e.g.,
https://google.comormailto:zopemaven@gmail.com) inside paragraphs and inlines.
Handled proper Docutils rendering fallback and lossless AST round-trip serialization for bare URLs without trailing brackets
[].Multi-Block List Continuations (
+):Implemented complete, native parsing and structural resolution for list continuation delimiters (
+), enabling subsequent paragraphs, admonitions, and nested lists to attach seamlessly to parent list items.
Architectural & Design Documentation:
Formally documented *Recursive Include Coordinate Mapping and Permissive Parsing & Error Recovery* pipelines in
docs/architecture.adoc.AsciiDoc Language Specification & Feature Matrix:
Expanded
FEATURE_MATRIX.adocwith 10 newly tracked language features and linked them directly to Peggy prototyping grammars in the AsciiDoc Parsing Lab.Promoted several feature rows (such as Collapsible Blocks, STEM Blocks, Index Terms, Inline Anchors, Conditional Directives, Comment Blocks, Checklists, and List Continuations) to Fully Supported.
API Documentation:
Generated complete API reference stubs for all core system modules.
Changed
Stricter Parsing & Post-AST Syntax Auditor:
Implemented an advanced
ASTSyntaxAuditornode visitor that acts as a post-parsing syntax validation engine.Transitioned from an ad-hoc hybrid preprocessor validation layer to a structured, post-AST semantic checker, guaranteeing much stricter and faster compliance checks.
Enabled precise, coordinate-correct syntax error tracking (mapping errors directly back to the physical source file and line) across multi-level include files.
Fixed
Strict Type Safety:
Resolved dynamic attribute typing error on
Nodeobjects to achieve 100% type safety compliance under Mypy’s strict configuration.
Technical Debt Pruning:
Marked resolved parser issues and documentation stubs as complete in
TECHNICAL-DEBT.adoc.
0.1.0a9 - 2026-07-19
Added
Full Eclipse AsciiDoc SDR-1 Open Block Support:
Implemented the new standard variable-length tilde-based open block delimiter form (
~~~~,~~~~~,~~~~~~, and long~{7,}).Supported recursive multi-level open block nesting by varying delimiter lengths.
Maintained 100% backward compatibility for the legacy two-hyphen (
--) open block delimiter form.Restructured and updated the draft TCK open block test suite (organizing into
containing-paragraphandlegacy-delimitertests) intests/tck_harness/in alignment with MR feedback.Developed a comprehensive unit test suite in
tests/test_inline_transformer_unit.pytesting 100% of all logical bodies, branching conditions, error fallbacks, and attribute substitutions inInlineTransformer(including math stems, keyboard macros, and split target-window link parsers).Boosted
inline_transformer.pycoverage from 53% to 69%.High-Fidelity Cyclic Include Loop Diagnostics:
Implemented stateful
include_stacktracking of inclusion paths (including file paths, relative base directories, line numbers, and line text) during preprocessing (Issue #82).
Developed a static cycle scanner that detects mutual inclusion loops and prints elegant compiler-grade diagnostic reports with visual caret highlights and source strings.
Component-Aware Path Traversal Protections:
Implemented safe commonpath-based boundary checks under
safe_modeinpreprocessor.pyto prevent directory traversal and secure sibling folders (Issue #83).Enhanced Docutils/Sphinx Rendering:
Integrated native
%hiddenandoptions="hidden"attribute-mapping ontoctreeblock open macros, converting them directly to Sphinxaddnodes.toctree(hidden=True)to prevent redundant/duplicated visual index lists.
Implemented missing AST node visitor methods in
DocutilsRenderer, supportingHeader,Author,Revision,PageBreak,AttributeEntry,Attributes, andIncludeto ensure smooth rendering and zero compilation crashes.Upgraded Page Breaks Support:
Upgraded Page Breaks status to Fully Supported in the Feature Matrix, natively translating
PageBreakAST nodes into explicit<!-- page break -->raw HTML markers in the Docutils renderer backend.
Comprehensive AST and ASG Nodes Unit Tests:
Developed a comprehensive unit test suite in
tests/test_nodes_unit.pysystematically instantiating, verifying, and serializing allNodesubclasses, coordinate tracking, custom appends, and properties.Verified verbatim-block properties (
code,stripped_code,callouts) matching automated, manual, and bare HTML callout regex styles under Unix and Windows line endings.Boosted
nodes.pycoverage from 62% to 68%, elevating overall codebase test coverage to 70%.
93%+ Docutils Backend Test Coverage:
Expanded
tests/test_docutils_backend.pywith comprehensive integration tests targeting section layouts, inline stems/math, block stems, audio/video raw embeds, image alternate text, table cell specifier alignments, and styles.Boosted
docutils_backend.pystatement coverage to 93%.
Fixed
Non-Destructive Lookahead-Based Description List Grammar:
Refactored description list markers (
DLIST_MARKER_2throughDLIST_MARKER_5) ingrammar.larkusing regex positive lookaheads ((?=[ \t\n]|$)) to prevent greedily matching inline double-colons (::) inside standard paragraph text (Issue #72 sibling).Simplified the
COLONterminal to a literal":"to allow multiple consecutive colons to cleanly parse as individual colon text nodes.
PyPI Dependency Upgrades and Workaround Reversion:
Migrated to stable PyPI releases of
sphinx-asciidoctrine==0.1.0a1andasciidocstring==0.1.0a5(which natively handles blank lines between definition list items).
Reverted the temporary preprocessor single-line docstring workaround back to a standard multi-line description list.
Inline Stem Parsing Priorities:
Added explicit
.10priority suffixes toinline_stem,inline_asciimath, andinline_latexmathrules ingrammar.larkto prevent Earley parser ambiguity where preceding text caused them to be incorrectly evaluated as nested plain text sequences.
Block Macro Attribute Parsers:
Fixed attributes parsing for block macros (such as
image::,audio::, andvideo::) inlark_parser.py’sblock_macroby dynamically scanning children for any transformedattribute_contenttoken, ensuring alternate text (alt) and custom properties are correctly parsed and populated on AST block nodes.100% Preprocessor Test Coverage:
Reached 100% statement and branch coverage in
preprocessor.pyby pruning unused/redundant legacy paths and adding extensive unit testing of defensive edge-case pathways.Robust Multi-Level Open Block Nesting:
Added full test coverage for mixed standard (tilde-based) and legacy (hyphen-based) open block structures to ensure compatibility and robustness under extreme nested conditions.
Visual Identity & Theme Overhaul:
Re-themed the documentation to a premium forest-green dark color scheme and customized the RTD sidebar with multi-level sub-navigation line legibility, hover styles, and link color states.
Redesigned ASCII compiler pipeline flowcharts in
docs/index.adocanddocs/architecture.adocto cleanly illustrate the bidirectional AST-to-source serialization capability of the compiler.Standardized all documentation formatting on spec-compliant single-asterisk bold spans (
*text*), resolving visual discrepancies and anomalies caused by unconstrained double-asterisks (**text**).
0.1.0a8 - 2026-07-16
Added
Parser Error Handling (Issue #78):
Replaced raw Lark parsing exceptions with a structured user-facing
AsciiDocSyntaxErrorcompiler error, detailing line and column numbers alongside highlighted caret indicators.Programmatic TCK JSON Runner:
Replaced fragile log-regex parsing in
tests/test_tck.pywith a lightweight Node.js event-driven runner (bin/run-tck-json.mjs) that consumes the native TCK stream, boosting test speed and reliability.
Parameterized Includes in Preprocessor (Issue #79):
Procedural Stream Preprocessor: Updated the Preprocessor in
src/asciidoctrine/preprocessor.pyto support parameterized includes (leveloffset,lines,tag,tags) using an immutable, procedural top-to-bottom stream-filtering state machine.
C-Level Substring Short-Circuit Optimization: Implemented optimized short-circuiting (
":" not in line) running in compiled C to bypass dynamic interpreter loop overhead for over 95% of standard document lines, increasing performance.Stateful Include Filtering:
leveloffsetShifting: Shifts relative (e.g.+1,-1) and absolute (e.g.2) section heading levels inside includes.linesSlicing: Slices single (1..5), multiple (1..2;4..5or"1..2,4..5"), and open-ended (5..) line ranges.
tag/tagsFiltering: Extracts marked regions of code blocks while stripping tag boundary comment lines (e.g.,// tag::name[]) from the output stream.Comprehensive Test Harness: Authored unit tests verifying individual and combined preprocessor attributes under a strict Red/Green TDD framework, resulting in 100% test suite and TCK compliance.
High-Fidelity Cyclic Include Loop Diagnostics (Issue #82):
Implemented metadata-enriched
include_stackto track inclusion paths including line numbers and line text.Implemented an on-loop static cycle scanner that reads on-disk files and builds an elegant compiler-grade diagnostic report listing all mutual includes in a loop simultaneously, complete with raw source strings and caret highlights.
Fixed
Dynamic Sphinx Versioning (Issue #3.C):
Replaced hardcoded version strings in
docs/conf.pywith dynamic metadata-driven package version lookup usingimportlib.metadata.Unified Python Target Versions (Issue #3.C):
Aligned and unified Python target constraints across
pyproject.toml(requires-python>=3.10), Ruff (py310), and Mypy (3.12) configurations.O(N) Table Cell Parsing Regex (Issue #6):
Replaced nested table cell lookaheads in
grammar.larkwith a sequential, flat non-backtracking lookahead pattern to eliminate exponential backtracking risks.Experimental Inline Macros Parsing Bug (Issue #80):
EBNF Grammar Priority Adjustment: Assigned explicit priority of
.10toinline_kbd,inline_button, andinline_menugrammar rules ingrammar.lark. This resolves the greedy priority conflicts in Lark’s Earley parsing engine when experimental macros are embedded inside standard prose sentences, preventing them from being flattened into generic standard text nodes.TCK & Integration Tests: Added comprehensive test cases ensuring standalone and paragraph-embedded experimental macro syntax parses cleanly with 100% compliance across both local unit tests and the Technology Compatibility Kit (TCK) suite.
Secure Directory Traversal Guard (Issue #83):
Replaced prefix-based boundary checking with component-aware
os.path.commonpathchecks undersafe_modeto secure sibling directories from path traversal vulnerabilities.
Pytest Recursion Exclusions (Issue #84):
Configured
norecursedirsinsidepyproject.tomlto excludetests/include_fixtures, preventing pytest andasciidoctestfrom scanning test inclusion files.
0.1.0a7 - 2026-07-13
Added
Footnotes and Named Footnoterefs Support:
EBNF Grammar & AST Transformation: Added complete, prioritized EBNF grammar rules in
grammar.larkfor standard auto-numberedfootnote:[text], named definitions `[2]`, and subsequent references `[2]`. Implemented strict coordinate tracking and resolved bracket/comma lexer conflicts.Docutils/Sphinx Rendering: Developed dynamic footnote rendering inside
DocutilsRendererto collect definitions, auto-number them, render them as aligned label/body pairs, and position footnote tables elegantly at the bottom of the output document.Lossless AST Serialization: Added full round-trip formatting inside
AsciiDocSerializerVisitorto preserve footnotes and definitions with exact character accuracy.TCK Conformance Tests: Authored and integrated two complete local TCK specification tests inside
vendor/asciidoc-tck/andtests/tck_harness/for auto-numbered and named footnote macros.Expanded Feature Matrix Audit:
Cross-referenced
FEATURE_MATRIX.adocwith the 1,748-line official specificationoutline.adocto add 10 new feature rows tracking specification progress, Peggy prototyping, TCK status, and explicit support levels (including checklists, block/inline passthroughs, TOC macro, and autolinks).Developer Experience (DX) Error Handling Roadmap:
Created a detailed architectural feature design (Issue #78) for strict diagnostics (visual carets), forgiving puppet-driven error recovery, and a formatting linter.
0.1.0a6 - 2026-07-12
Added
Pre-Release Verification Checklist: Added a comprehensive step-by-step developer and automation release checklist inside
AGENTS.mdto prevent formatting, type-safety, and wheel-matching regressions in future releases.
Fixed
Strict Type Safety compliance: Fully resolved all strict static analysis and typing errors under Mypy, specifically adding proper generic type annotations on
LocationDictand initializing properties dynamically assigned onDocument.Standardized Import Sorting and Formatting: Cleaned up internal imports and resolved layout lints to achieve 100% style compliance with Ruff formatters and linters.
0.1.0a5 - 2026-07-12
Fixed
Earley Parser Description List Term Grouping: Corrected parsing priorities of nested lists to natively prefer grouping multiple consecutive terms under a single description list item (resolving TCK compliance failures on multi-term definitions).
Block ASG Conformance: Implemented recursive block-level attribute cleaning inside the ASG Resolver to filter out syntactic positional/style keys (like
'1','positional', and'style') from resolved block-level metadata, achieving 100% compliant and clean ASG output for all blocks includingStemandVerse.Pyodide Sandbox Wheel Parsing: Added standard dynamic wheel version mapping inside functional tests via
tomllibto prevent version mismatch crashes in local/CI sandbox executions.
0.1.0a4 - 2026-07-12
Added
Native macOS Browser Automation Support: Established global and project-scoped developer instructions (
AGENTS.md) and customized skills to natively execute high-fidelity Playwright/Selenium browser previews and layout audits on macOS.Refructured Sphinx Documentation Landing Page: Redesigned
docs/index.adocas a clean, polished onboarding guide, removing internal-only engineering blueprints to provide a professional, user-focused documentation site.
Fixed
Delimiter Token-Splitting and Block Swallowing (Issue #76): Integrated strict lookahead/lookbehind boundaries on
OPEN_BLOCK_DELIMto prevent Lark’s dynamic lexer from splitting thematic breaks (---) or listing delimiters (----) under Earley parser predictions, guaranteeing sections are never swallowed inside open blocks.High-Performance Thematic Break Matching: Optimized
THEMATIC_BREAK_MARKERby removing slow, backtracking regex lookbehinds ((?<!...)) in favor of lookahead-only patterns, resulting in massive performance gains across large files.Unified Newline LF Normalization and Detection: Implemented robust pre-parsing LF normalization that automatically detects and stores the document’s original line ending type (CRLF vs LF) and the presence of a trailing newline.
Trailing Newline and Round-Trip Accuracy: Updated the native serializer to automatically restore original newline styles and trailing newlines, fixing the trailing newline stripping bug and guaranteeing 100% exact, character-for-character round-trip accuracy.
Sphinx Title Promotion and Heading Nesting: Corrected Docutils node hierarchy rendering where document titles were ignored and sections were flattened into flat root
h1headings, wrapping them under a single root section.Fixed Table Cell Pipe Delimiter Splitting (
ARCHITECTURE.adoc): Manually escaped internal vertical pipes (\|) within table cells to prevent row-splitting and cell corruption under the lexer.
0.1.0a3 - 2026-07-11
Added
Native AsciiDoc Serializer (Issue #74): Created
AsciiDocSerializerVisitorand the publicserialize_to_asciidoc()function to serialize any unresolved AST back into standard, clean, valid AsciiDoc source.NodeTransformer Class (Issue #73): Introduced
NodeTransformerto facilitate programmatic AST/ASG modification, replacement, pruning, and expansion.Native Inline Link Parsing (Issue #75): Standardized native parsing of inline links/URIs as
Refnodes instead of simple text elements.Expanded Functional & Unit Tests: Added regression tests for
NodeTransformer,serialize_to_asciidocunder unit suites and Pyodide functional test setups.
Fixed
Consecutive Block Attributes Merging (Issue #72): Resolved a structural Lark Earley ambiguity by lowering the priority of attribute and anchor rules, allowing consecutive metadata lines (e.g.
[.role]\n[source,python]) to merge correctly.Positional Attributes Parsing (Issue #71): Corrected parsing of mixed shorthand, named, and positional attributes without early return collisions.
0.1.0a2 - 2026-07-07
Added
Nested & Mixed Description Lists: Complete parsing and ASG structure mapping of recursive definition/description lists.
Advanced Table Cell Formatting: Full support for inline cell options, colspans, rowspans, text alignment patterns, and cell style operators.
Listing Block Metadata & ASG Resolution: Direct properties mapping (
id,language,style,listing_title) on Listing nodes with compliant resolved attributes propagation.Callout Stripping and Matching: Implemented robust matching/stripping of callout annotations (
<1>) from verbatim listing blocks.Location Accuracy & Consolidation: Consolidated node coordinates with precise line/column inclusive tracking.
0.1.0a1 - 2026-07-07
Added
Initial Release: Published and packaged the baseline AsciiDoc parser.
Structured AST: Migration from dictionary-based AST to class-based node objects in
nodes.py.Nested List Support: Improved handling of multi-level unordered and ordered lists.
Modern Grammar: Standardized bold and italic markers and refined word parsing.
Example Suite: Data-driven tests for
.adocexamples.Packaging: Added
pyproject.tomland professional documentation.Admonition Blocks: Full support for
[NOTE],[TIP],[IMPORTANT],[WARNING], and[CAUTION].Sidebar Blocks: Implementation of
****delimited sidebar blocks with full block nesting.Attribute Parsing: Added generic
[...]attribute list parsing for blocks.Source/Code Blocks: Foundation for source blocks via
[source,lang]attributes on literal blocks.Example Blocks: Support for
====delimited example blocks.
Fixed
Resolved
astmodule naming conflict.Fixed list marker ambiguity in recursive grammar rules.