One renderer exposes HTML, plain-text, and Markdown targets. Named profiles restrict the same source consistently across every target.
$carve->render($source);
$carve->renderText($source);
$carve->renderMarkdown($source);
$comments = new CarveRenderer(profile: 'comment');
# Release notes
Carve /renders/ to *HTML*, plain text, and Markdown from one source.

Carve renders to HTML, plain text, and Markdown from one source.
<section id="Release-notes">
<h1>Release notes</h1>
<p>Carve <em>renders</em> to <strong>HTML</strong>, plain text, and Markdown from one source.</p>
<img src="/diagram.svg" alt="A diagram">
</section>
Release notes
Carve renders to HTML, plain text, and Markdown from one source.
A diagram
# Release notes
Carve *renders* to **HTML**, plain text, and Markdown from one source.

The comment profile rejects document-level headings and images.
# Release notes
Carve renders to HTML, plain text, and Markdown from one source.
[img: A diagram]
<p># Release notes</p>
<p>Carve <em>renders</em> to <strong>HTML</strong>, plain text, and Markdown from one source.</p>
<p>[img: A diagram]</p>
The same non-HTML targets are available as normally escaped Twig filters.
{{ source|carve_text }}
{{ source|carve_markdown }}
Release notes
Carve renders to HTML, plain text, and Markdown from one source.
A diagram
# Release notes
Carve *renders* to **HTML**, plain text, and Markdown from one source.
