An extension for league/commonmark to add a wire:navigate
attribute to links rendered in Markdown and enable SPA mode in Livewire.
We invest a lot of resources into creating best in class open source packages. You can support us by buying one of our paid products.
We highly appreciate you sending us a postcard from your hometown, mentioning which of our package(s) you are using. You'll find our address on our contact page. We publish all received postcards on our virtual postcard wall.
You can install the package via composer:
composer require spatie/commonmark-wire-navigate
Register CommonMarkWireNavigate
as a CommonMark extension.
use League\CommonMark\Environment\Environment;
use League\CommonMark\CommonMarkConverter;
use Spatie\CommonMarkWireNavigate\WireNavigateExtension;
$converter = new CommonMarkConverter($environment);
$converter->getEnvironment()->addExtension(new WireNavigateExtension());
echo $converter->convert('[About](/about)');
// <p><a href="/about" wire:navigate>About</a></p>
For more information on CommonMark extensions and environments, refer to the CommonMark documentation.
When using the Laravel-markdown package, you may register the extension in config/markdown.php
:
/*
* These extensions should be added to the markdown environment. A valid
* extension implements League\CommonMark\Extension\ExtensionInterface
*
* More info: https://commonmark.thephpleague.com/2.4/extensions/overview/
*/
'extensions' => [
Spatie\CommonMarkWireNavigate\WireNavigateExtension::class,
],
By default, the extension will add wire:navigate
to all internal links except fragments of the current page. To know which link is internal, you must specify your application's base URL.
$converter = new CommonMarkConverter($environment);
$converter->getEnvironment()->addExtension(new WireNavigateExtension(
baseUrl: 'https://example.app',
));
echo $converter->convert('[About](/about)');
// <p><a href="/about" wire:navigate>About</a>
echo $converter->convert('[About](https://example.app/about)');
// <p><a href="https://example.app/about" wire:navigate>About</a>
echo $converter->convert('[Twitter](https://twitter.com/spatie_be)');
// <a href="https://twitter.com/spatie_be">Twitter</a></p>
Additionally, you can configure whether the attribute will be added using an array of patterns or a callback.
Using an array to specify a root path in your application:
$converter = new CommonMarkConverter($environment);
$converter->getEnvironment()->addExtension(new WireNavigateExtension(
baseUrl: 'https://example.app',
enabled: ['docs', 'guide'],
));
echo $converter->convert('[Installation](/docs/installation)');
// <p><a href="/docs/installation" wire:navigate>Installation</a>
echo $converter->convert('[Guide](/guide)');
// <p><a href="/guide" wire:navigate>Guide</a>
echo $converter->convert('[About](/about)');
// <p><a href="/about">About</a>
Using a callback:
$converter = new CommonMarkConverter($environment);
$converter->getEnvironment()->addExtension(new WireNavigateExtension(
baseUrl: 'https://example.app',
enabled: fn (string $url) => preg_match('/\/docs\//', $url),
hover: true,
));
Enable on fragments of the current page:
$converter = new CommonMarkConverter($environment);
$converter->getEnvironment()->addExtension(new WireNavigateExtension(
fragment: true,
));
If you want to have Livewire prefetch pages when a link is hovered, enable the hover
option.
$converter = new CommonMarkConverter($environment);
$converter->getEnvironment()->addExtension(new WireNavigateExtension(
baseUrl: 'https://example.app',
hover: true,
));
Now the extension will add wire:navigate.hover
to links instead.
echo $converter->convert('[About](/about)');
// <p><a href="/about" wire:navigate.hover>About</a></p>
composer test
Please see CHANGELOG for more information on what has changed recently.
Please see CONTRIBUTING for details.
Please review our security policy on how to report security vulnerabilities.
The MIT License (MIT). Please see License File for more information.