This package simply converts the JSON output from the Tiptap editor to HTML. It differs from other packages by allowing you to easily customise and extend the HTML output.
composer require freshleafmedia/tiptap-parser
use FreshleafMedia\TiptapParser\TiptapContent;
$tiptapArray = [
'type' => 'paragraph',
'content' => [
[
'type' => 'text',
'text' => 'Hello world',
],
],
];
TiptapContent::make($tiptapArray)->toHtml(); // <p>Hello world</p>
use FreshleafMedia\TiptapParser\Nodes\Paragraph;
readonly class CustomParagraph extends Paragraph
{
public function render(): string
{
return <<<HTML
<p class="paragraph">
{$this->renderInnerHtml()}
</p>
HTML;
}
}
$html = Parser::fromArray($tiptapArray)
->registerNode('paragraph', CustomParagraph::class)
->toHtml(); // <p class="paragraph">Hello world</p>
Nodes are instantiated via the fromArray
method, the method is passed all the data from the original array.
For example given this array:
[
'type' => 'paragraph',
'attrs' => [
'lang' => 'en',
]
]
We can easily add the lang
attribute to the p
element like this:
use FreshleafMedia\TiptapParser\Nodes\Paragraph;
readonly class LocalisedParagraph extends Paragraph
{
public function __construct(
public string $language,
public array $children = [],
)
{
}
public function render(): string
{
return <<<HTML
<p lang="{$this->language}">
{$this->renderInnerHtml()}
</p>
HTML;
}
public static function fromArray(array $array): self
{
return new self(
$array['attrs']['lang'] ?? 'en',
$array['children'] ?? [],
);
}
}
Plain text can be extracted available via the toText
method. This is useful for things like populating a search index.
use FreshleafMedia\TiptapParser\TiptapContent;
$tiptapArray = [
'type' => 'paragraph',
'content' => [
[
'type' => 'text',
'text' => 'Hello world',
'marks' => [
['type' => 'bold'],
],
],
],
];
TiptapContent::make($tiptapArray)->toHtml(); // <p><strong>Hello world</strong></p>
TiptapContent::make($tiptapArray)->toText(); // Hello world