Search by

markup-carve / carve-php

dereuromark

PHP parser for Carve, a human-centered lightweight markup language derived from Markdown and Djot.

Package info

github.com/markup-carve/carve-php

Homepage

pkg:composer/markup-carve/carve-php

Fund package maintenance!

dereuromark

Statistics

Installs: 6 781

Dependents: 9

Suggesters: 0

Stars: 5

Open Issues: 3

0.1.9 2026-09-19 09:41 UTC

This package is auto-updated.

Last update: 2026-09-26 01:41:34 UTC


README

CI Coverage Latest Stable Version Total Downloads PHPStan PHP Version Software License

PHP parser and renderer for Carve, a lightweight markup language for readable source and structured documents.

Implements Carve spec 0.1 (see Versioning & Changelog).

Installation

composer require markup-carve/carve-php

Usage

use MarkupCarve\Carve\CarveConverter;

$converter = new CarveConverter();
$html = $converter->convert('# Hello /Carve/');

The HTML, Markdown, Djot and BBCode importers return a versioned migration-fidelity report from each converter's convertWithFidelityReport() method. One preserved / normalized / degraded / dropped vocabulary spans all four, with format-specific diagnostic codes underneath. The report envelope and the --check-loss gate are in docs/cli.md; HTML also has a detailed import report, in docs/html-import.md.

Besides HTML the converter renders Markdown, plain text and ANSI. The Markdown writer's options are in docs/markdown-output.md, and every node can carry its source line - docs/source-lines.md.

A document can pull in other files with {{ chapter.crv }}. It is opt-in and off by default - the core parser performs no file I/O - and the resolver you supply is the security boundary: docs/includes.md.

Source-aware tools can prepare stale-safe structured formatting changes through CarveConverter::toCarvePatch(); see the source-preserving patch guide.

CLI

vendor/bin/carve README.crv > README.html   # render (HTML by default)
vendor/bin/carve --markdown README.crv      # or --plain, --ansi, --json
vendor/bin/carve lint README.crv            # report problems, change nothing
vendor/bin/carve migrate --from html p.html # convert into Carve

Every subcommand and flag is in docs/cli.md.

Sandbox

Try this implementation live in the Carve sandbox - explore syntax and extensions, inspect output, and share snippets via pastebin-style links. It also powers the wp-carve WordPress plugin.

ProseMirror / Tiptap

The AST converts to a ProseMirror document and back, so a Tiptap editor in the browser and PHP rendering on the server share one source of truth with no Node runtime. See docs/prosemirror.md.

Untrusted input

Rendering attacker-controlled Carve needs the safe path, which escapes raw HTML instead of emitting it and bounds nesting depth. The threat model, the defaults and the full checklist are in docs/security.md.

Linting

carve lint reports constructs that parse but render differently from what the author intended. The rules and options are in docs/lint.md.

Documentation

Development

Local setup, the test suites, the style and static-analysis gates, and the rules for a spec-affecting change are in CONTRIBUTING.md.