league / commonmark-ext-external-link
Extension for league/commonmark which adds extra classes and HTML attributes to external links
Fund package maintenance!
colinodell
Patreon
Installs: 8 426
Dependents: 0
Suggesters: 0
Security: 0
Stars: 4
Watchers: 3
Forks: 2
Open Issues: 0
Type:commonmark-extension
Requires
- php: ^7.1
- league/commonmark: ^1.3
Requires (Dev)
- phpunit/phpunit: ^7.5
This package is auto-updated.
Last update: 2020-04-04 14:22:14 UTC
README
DEPRECATED
This extension has been deprecated. All of its functionality now exists in league/commonmark
1.3+ under the League\CommonMark\Extension\ExternalLink
namespace, so you should upgrade to that version and use that bundled extension instead of this one.
Overview
This extension to the league/commonmark
PHP Markdown parser can detect links to external sites and adjust the markup accordingly:
- Adds a
rel="noopener noreferrer"
attribute - Optionally adds any custom HTML classes
Install
Via Composer
$ composer require league/commonmark-ext-external-link
Usage
Configure your Environment
as usual and simply add the ExternalLinkExtension
provided by this package:
use League\CommonMark\CommonMarkConverter; use League\CommonMark\Environment; use League\CommonMark\Ext\ExternalLink\ExternalLinkExtension; // Obtain a pre-configured Environment with all the CommonMark parsers/renderers ready-to-go $environment = Environment::createCommonMarkEnvironment(); // Add this extension $environment->addExtension(new ExternalLinkExtension()); // Set your configuration $config = [ 'external_link' => [ 'internal_hosts' => 'www.example.com', 'open_in_new_window' => true, 'html_class' => 'external-link', ], ]; // Instantiate the converter engine and start converting some Markdown! $converter = new CommonMarkConverter($config, $environment); echo $converter->convertToHtml('I successfully installed the https://github.com/thephpleague/commonmark-ext-external-link extension!');
Configuration
This extension supports three configuration options under the external_link
configuration:
internal_hosts
This option defines a whitelist of hosts which are considered non-external and should not receive the external link treatment.
This can be a single host name, like 'example.com'
, which must match exactly.
If you need to match subdomains, use a regular expression like '/(^|\.)example\.com$/'
. Note that you must use /
characters to delimit your regex.
This configuration option also accepts an array of multiple strings and/or regexes:
$config = [ 'external_link' => [ 'internal_hosts' => ['foo.example.com', 'bar.example.com', '/(^|\.)google\.com$/], ], ];
By default, if this option is not provided, all links will be considered external.
open_in_new_window
This option (which defaults to false
) determines whether any external links should open in a new tab/window.
html_class
This option allows you to provide a string
containing one or more HTML classes that should be added to the external link <a>
tags: No classes are added by default.
Advanced Rendering
When an external link is detected, the ExternalLinkProcessor
will set the external
data option on the Link
node to either true
or false
. You can therefore create a custom link renderer which checks this value and behaves accordingly:
class MyCustomLinkRenderer implements InlineRendererInterface { /** * @param Link $inline * @param ElementRendererInterface $htmlRenderer * * @return HtmlElement */ public function render(AbstractInline $inline, ElementRendererInterface $htmlRenderer) { if (!($inline instanceof Link)) { throw new \InvalidArgumentException('Incompatible inline type: ' . \get_class($inline)); } if ($inline->getData('external')) { // This is an external link - render it accordingly } else { // This is an internal link } // ... } }
Changelog
Please see CHANGELOG for more information what has changed recently.
Testing
$ composer test
Security
If you discover any security related issues, please email colinodell@gmail.com instead of using the issue tracker.
Credits
License
This library is licensed under the BSD-3 license. See the License File for more information.