class AtAutolinker in Markdown 3.0.x
Plugin annotation
@MarkdownExtension(
id = "at_autolinker",
label = @Translation("@ Autolinker"),
installed = TRUE,
description = @Translation("Automatically link commonly used references that come after an at character (@) without having to use the link syntax."),
parsers = {"thephpleague/commonmark", "thephpleague/commonmark-gfm"},
)
Hierarchy
- class \Drupal\Component\Plugin\PluginBase implements DerivativeInspectionInterface, PluginInspectionInterface
- class \Drupal\Core\Plugin\PluginBase uses DependencySerializationTrait, MessengerTrait, StringTranslationTrait
- class \Drupal\markdown\Plugin\Markdown\Extension\BaseExtension implements MarkdownExtensionInterface uses MarkdownStatesTrait
- class \Drupal\markdown\Plugin\Markdown\Extension\CommonMarkExtension implements CommonMarkExtensionInterface
- class \Drupal\markdown\Plugin\Markdown\Extension\AtAutolinker implements \League\CommonMark\Inline\Parser\InlineParserInterface, MarkdownGuidelinesAlterInterface
- class \Drupal\markdown\Plugin\Markdown\Extension\CommonMarkExtension implements CommonMarkExtensionInterface
- class \Drupal\markdown\Plugin\Markdown\Extension\BaseExtension implements MarkdownExtensionInterface uses MarkdownStatesTrait
- class \Drupal\Core\Plugin\PluginBase uses DependencySerializationTrait, MessengerTrait, StringTranslationTrait
Expanded class hierarchy of AtAutolinker
File
- src/
Plugin/ Markdown/ Extension/ AtAutolinker.php, line 22
Namespace
Drupal\markdown\Plugin\Markdown\ExtensionView source
class AtAutolinker extends CommonMarkExtension implements InlineParserInterface, MarkdownGuidelinesAlterInterface {
/**
* {@inheritdoc}
*/
public function alterGuidelines(array &$guides = []) {
$user = \Drupal::currentUser();
if ($user
->isAnonymous()) {
$user = User::load(1);
}
if ($this
->getSetting('type') === 'user') {
$description = [
$this
->t('Text that starts with an at symbol (@) followed by any character other than a space will be automatically linked to users on this site.'),
];
if ($this
->getSetting('format_username')) {
$description[] = $this
->t('The formatted user name will be used in place of the text.');
}
$description[] = $this
->t('If the user does not exist, it will not automatically link.');
$guides['links']['items'][] = [
'title' => $this
->t('@ Autolinker'),
'description' => $description,
'tags' => [
'a' => '@' . $user
->getAccountName(),
],
];
}
elseif ($this
->getSetting('type') === 'url') {
$guides['links']['items'][] = [
'title' => $this
->t('@ Autolinker'),
'description' => $this
->t('Text that starts with an at symbol (@) followed by any character other than a space will automatically be linked to the following URL: <code>@url</code>', [
'@url' => $this
->getSetting('url'),
]),
'tags' => [
'a' => [
'@dries',
],
],
];
}
}
/**
* {@inheritdoc}
*/
public function defaultSettings() {
return [
'type' => 'user',
'format_username' => TRUE,
'url' => 'https://www.drupal.org/u/[text]',
];
}
/**
* {@inheritdoc}
*/
public function getCharacters() : array {
return [
'@',
];
}
/**
* {@inheritdoc}
*/
public function parse(InlineParserContext $inline_context) : bool {
$cursor = $inline_context
->getCursor();
// The @ symbol must not have any other characters immediately prior.
$previous_char = $cursor
->peek(-1);
if ($previous_char !== NULL && $previous_char !== ' ') {
// peek() doesn't modify the cursor, so no need to restore state first.
return FALSE;
}
// Save the cursor state in case we need to rewind and bail.
$previous_state = $cursor
->saveState();
// Advance past the @ symbol to keep parsing simpler.
$cursor
->advance();
// Parse the handle.
$text = $cursor
->match('/^[^\\s]+/');
$url = '';
$title = '';
$type = $this
->getSetting('type');
if ($type === 'user') {
$users = \Drupal::entityTypeManager()
->getStorage('user');
/** @var \Drupal\user\UserInterface $user */
$user = is_numeric($text) ? $users
->load($text) : $users
->loadByProperties([
'name' => $text,
]);
if ($user && $user
->id()) {
$url = $user
->toUrl('canonical', [
'absolute' => TRUE,
])
->toString();
$title = $this
->t('View user profile.');
$text = $this
->getSetting('format_username') ? $user
->getDisplayName() : $user
->getAccountName();
}
else {
$text = FALSE;
}
}
elseif ($type === 'url' && ($url = $this
->getSetting('url')) && strpos($url, '[text]') !== FALSE) {
$url = str_replace('[text]', $text, $url);
}
else {
$text = FALSE;
}
// Regex failed to match; this isn't a valid @ handle.
if (empty($text) || empty($url)) {
$cursor
->restoreState($previous_state);
return FALSE;
}
$inline_context
->getContainer()
->appendChild(new Link($url, '@' . $text, $title));
return TRUE;
}
/**
* {@inheritdoc}
*/
public function settingsForm(array $element, FormStateInterface $formState, MarkdownFilterInterface $filter) {
$element = parent::settingsForm($element, $formState, $filter);
$selector = $this
->getSatesSelector($this
->getElementParents($element, [
$this
->getPluginId(),
]), 'type');
$element['type'] = [
'#type' => 'select',
'#title' => $this
->t('Map text to'),
'#default_value' => $this
->getSetting('type'),
'#options' => [
'user' => $this
->t('User'),
'url' => $this
->t('URL'),
],
];
$element['format_username'] = [
'#type' => 'checkbox',
'#title' => $this
->t('Replace username with formatted display name'),
'#description' => $this
->t('If enabled, it will replace the matched text with the formatted username.'),
'#default_value' => $this
->getSetting('format_username'),
'#states' => [
'visible' => [
$selector => [
'value' => 'user',
],
],
],
];
$element['url'] = [
'#type' => 'textfield',
'#title' => $this
->t('URL'),
'#description' => $this
->t('A URL to format text with. Use the token "[text]" where it is needed. If you need to include the @, use the URL encoded equivalent: <code>%40</code>. Example: <code>https://twitter.com/search?q=%40[text]</code>.'),
'#default_value' => $this
->getSetting('url'),
'#states' => [
'visible' => [
$selector => [
'value' => 'url',
],
],
],
];
return $element;
}
}
Members
Name | Modifiers | Type | Description | Overrides |
---|---|---|---|---|
AtAutolinker:: |
public | function |
Alters existing guides on how to use the Markdown Parser. Overrides MarkdownGuidelinesAlterInterface:: |
|
AtAutolinker:: |
public | function |
Retrieves the default settings. Overrides BaseExtension:: |
|
AtAutolinker:: |
public | function | ||
AtAutolinker:: |
public | function | ||
AtAutolinker:: |
public | function |
Returns the configuration form elements specific to this plugin. Overrides BaseExtension:: |
|
BaseExtension:: |
protected | function | Returns generic default configuration for markdown extension plugins. | |
BaseExtension:: |
public | function | ||
BaseExtension:: |
public | function | ||
BaseExtension:: |
public | function | ||
BaseExtension:: |
public | function |
Retrieves the description of the plugin, if set. Overrides MarkdownInstallablePluginInterface:: |
|
BaseExtension:: |
public | function |
Displays the human-readable label of the plugin. Overrides MarkdownInstallablePluginInterface:: |
|
BaseExtension:: |
public | function |
Retrieves a setting. Overrides MarkdownExtensionInterface:: |
|
BaseExtension:: |
public | function |
Retrieves the current settings. Overrides MarkdownExtensionInterface:: |
|
BaseExtension:: |
public | function |
Retrieves the URL of the plugin, if set. Overrides MarkdownInstallablePluginInterface:: |
|
BaseExtension:: |
public | function |
The current version of the parser. Overrides MarkdownInstallablePluginInterface:: |
|
BaseExtension:: |
public static | function |
Indicates whether the parser is installed. Overrides MarkdownInstallablePluginInterface:: |
|
BaseExtension:: |
public | function |
Indicates whether the extension is being used. Overrides MarkdownExtensionInterface:: |
|
BaseExtension:: |
public | function |
Indicates whether the parser is installed. Overrides MarkdownInstallablePluginInterface:: |
|
BaseExtension:: |
public | function | ||
BaseExtension:: |
public | function | ||
BaseExtension:: |
public | function |
Sets a specific setting. Overrides MarkdownExtensionInterface:: |
|
BaseExtension:: |
public | function |
Provides settings to an extension. Overrides MarkdownExtensionInterface:: |
|
BaseExtension:: |
public static | function |
Retrieves the version of the installed parser. Overrides MarkdownInstallablePluginInterface:: |
|
BaseExtension:: |
public | function |
Constructs a \Drupal\Component\Plugin\PluginBase object. Overrides PluginBase:: |
|
CommonMarkExtension:: |
public | function |
Retrieves the name of the extension. Overrides CommonMarkExtensionInterface:: |
|
DependencySerializationTrait:: |
protected | property | ||
DependencySerializationTrait:: |
protected | property | ||
DependencySerializationTrait:: |
public | function | 2 | |
DependencySerializationTrait:: |
public | function | 2 | |
MarkdownStatesTrait:: |
protected static | function | Retrieves the ancestry of the extension in a form/render array. | |
MarkdownStatesTrait:: |
protected static | function | Retrieves a states selector to use based on the form/render array parents. | |
MessengerTrait:: |
protected | property | The messenger. | 27 |
MessengerTrait:: |
public | function | Gets the messenger. | 27 |
MessengerTrait:: |
public | function | Sets the messenger. | |
PluginBase:: |
protected | property | Configuration information passed into the plugin. | 1 |
PluginBase:: |
protected | property | The plugin implementation definition. | 1 |
PluginBase:: |
protected | property | The plugin_id. | |
PluginBase:: |
constant | A string which is used to separate base plugin IDs from the derivative ID. | ||
PluginBase:: |
public | function |
Gets the base_plugin_id of the plugin instance. Overrides DerivativeInspectionInterface:: |
|
PluginBase:: |
public | function |
Gets the derivative_id of the plugin instance. Overrides DerivativeInspectionInterface:: |
|
PluginBase:: |
public | function |
Gets the definition of the plugin implementation. Overrides PluginInspectionInterface:: |
2 |
PluginBase:: |
public | function |
Gets the plugin_id of the plugin instance. Overrides PluginInspectionInterface:: |
|
PluginBase:: |
public | function | Determines if the plugin is configurable. | |
StringTranslationTrait:: |
protected | property | The string translation service. | 4 |
StringTranslationTrait:: |
protected | function | Formats a string containing a count of items. | |
StringTranslationTrait:: |
protected | function | Returns the number of plurals supported by a given language. | |
StringTranslationTrait:: |
protected | function | Gets the string translation service. | |
StringTranslationTrait:: |
public | function | Sets the string translation service to use. | 2 |
StringTranslationTrait:: |
protected | function | Translates a string to the current language or to a given language. |