cindermark 0.2.0

High-performance incremental Markdown parser with UTF-16 offsets, built for native text editors on Apple platforms
Documentation
# Changelog

All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [0.2.0] - 2026-07-22

### Added
- **CommonMark-style nested lists.** Bullet, ordered-list, and checkbox
  markers can now be indented for nesting — up to 32 tab-expanded columns
  (tab = next multiple-of-4 column). Previously such lines degraded into
  indented code blocks (editable mode) or were flattened into the previous
  item's text (grouped mode). Nesting depth is the leading-column count;
  parsing at 0–3 space indents is byte-identical to 0.1.0.
- **WebAssembly build (`wasm` feature).** A `wasm-bindgen` surface
  (`WasmParser`: `parseJson`, `keystroke`, `resetState`) that powers the live
  browser playground at <https://embernotes.app/cindermark>. Payloads use a
  hand-rolled JSON encoder, so `serde` never enters the `.wasm`.
- **Cargo feature flags with a pure-Rust default.** `cargo add cindermark`
  now pulls only three crates — `memchr`, `rustc-hash`,
  `unicode-segmentation`. The UniFFI Swift bindings are behind the opt-in
  `ffi` feature (enabled automatically by `build-apple.sh` and the release
  workflow), the `uniffi-bindgen` CLI is behind `bindgen`, and the browser
  surface is behind `wasm`.
- 35 new nested-list tests (2/4/6-space nesting, ordered-under-ordered,
  mixed marker kinds, nested checkboxes, tab and space+tab indents, 7-level
  chains, the 32-column cap, indented-code non-regression, grouped-mode
  non-flattening, and incremental/full-parse parity). The suite is now 457
  tests.

### Changed
- Documentation overhaul for the public launch: the README leads with
  crates.io and Swift Package Manager, and the git-submodule +
  `build-apple.sh` path is reframed as an advanced "build from source"
  option. Added crates.io / docs.rs badges and a Feature flags reference.
- CI now lints and tests both the default (pure-Rust) and `ffi` / `bindgen`
  configurations on every change, so neither path can regress.

### Fixed
- Incremental parse: `shift_block` / `shift_suffix_block` never adjusted
  `ListMarkerMeta` offsets, leaving stale marker UTF-16 / byte ranges on
  re-parsed and suffix blocks after an edit. Incremental parity checks now
  compare list-marker metadata for every case.
- README Rust usage example: `CindermarkParser::new` takes an
  `Option<String>`; the previous zero-argument call did not compile.

## [0.1.0] - 2026-07-01

### Added
- Initial public release of Cindermark, extracted from the Ember Notes
  editor engine: single-pass block + inline Markdown parser with UTF-16
  offsets, incremental dirty-block re-parsing, and UniFFI Swift bindings.
- `build-apple.sh` for building Apple static libraries + Swift bindings.
- Swift Package (`Package.swift`) with a binary XCFramework target.
- Configurable image-marker URI scheme (off by default; host apps opt in,
  e.g. Ember Notes passes `"ember:"`).

### Changed
- Eliminated redundant full block-list clones from the incremental parse
  FFI paths (up to 3 extra full passes per keystroke removed).