You are here

class ExternalLinkExtension in Markdown 8.2

Plugin annotation


@MarkdownAllowedHtml(
  id = "commonmark-external-links",
)
@MarkdownExtension(
  id = "commonmark-external-links",
  label = @Translation("External Links"),
  description = @Translation("Automatically detect links to external sites and adjust the markup accordingly."),
  libraries = {
    @ComposerPackage(
      id = "league/commonmark",
      object = "\League\CommonMark\Extension\ExternalLink\ExternalLinkExtension",
      customLabel = "commonmark-external-links",
      url = "https://commonmark.thephpleague.com/extensions/external-links/",
      requirements = {
         @InstallableRequirement(
            id = "parser:commonmark",
            callback = "::getVersion",
            constraints = {"Version" = "^1.3 || ^2.0"},
         ),
      },
    ),
    @ComposerPackage(
      id = "league/commonmark-ext-external-link",
      deprecated = @Translation("Support for this library was deprecated in markdown:8.x-2.0 and will be removed from markdown:3.0.0."),
      object = "\League\CommonMark\Ext\ExternalLink\ExternalLinkExtension",
      url = "https://github.com/thephpleague/commonmark-ext-external-link",
      requirements = {
         @InstallableRequirement(
            id = "parser:commonmark",
            callback = "::getVersion",
            constraints = {"Version" = ">=0.19.2 <1.0.0 || ^1.0"},
         ),
      },
    ),
  },
)

Hierarchy

Expanded class hierarchy of ExternalLinkExtension

File

src/Plugin/Markdown/CommonMark/Extension/ExternalLinkExtension.php, line 57

Namespace

Drupal\markdown\Plugin\Markdown\CommonMark\Extension
View source
class ExternalLinkExtension extends BaseExtension implements AllowedHtmlInterface, SettingsInterface, PluginFormInterface {
  use SettingsTrait {
    getSettings as getSettingsTrait;
  }

  /**
   * {@inheritdoc}
   */
  public static function defaultSettings($pluginDefinition) {

    /* @var \Drupal\markdown\Annotation\InstallablePlugin $pluginDefinition */
    return [
      'html_class' => '',
      'internal_hosts' => [
        '[current-request:host]',
      ],
      'nofollow' => '',
      'noopener' => 'external',
      'noreferrer' => 'external',
      'open_in_new_window' => TRUE,
    ];
  }

  /**
   * {@inheritdoc}
   */
  public function allowedHtmlTags(ParserInterface $parser, ActiveTheme $activeTheme = NULL) {
    return [
      'a' => [
        'href' => TRUE,
        'hreflang' => TRUE,
        'rel' => [
          'nofollow' => TRUE,
          'noopener' => TRUE,
          'noreferrer' => TRUE,
        ],
        'target' => [
          '_blank' => TRUE,
        ],
      ],
    ];
  }

  /**
   * {@inheritdoc}
   */
  public function buildConfigurationForm(array $element, FormStateInterface $form_state) {

    /** @var \Drupal\markdown\Form\SubformStateInterface $form_state */
    $element += $this
      ->createSettingElement('internal_hosts', [
      '#type' => 'textarea',
      '#title' => $this
        ->t('Internal Hosts'),
      '#description' => $this
        ->t('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 <code>example.com</code>, which must match exactly. Wildcard matching is also supported using regular expression like <code>/(^|\\.)example\\.com$/</code>. Note that you must use <code>/</code> characters to delimit your regex. By default, if no internal hosts are provided, all links will be considered external. One host per line.'),
    ], $form_state, '\\Drupal\\markdown\\Util\\KeyValuePipeConverter::denormalizeNoKeys');
    $element['token'] = FormTrait::createTokenBrowser();
    $element += $this
      ->createSettingElement('html_class', [
      '#type' => 'textfield',
      '#title' => $this
        ->t('HTML Class'),
      '#description' => $this
        ->t('An HTML class that should be added to external link <code>&lt;a&gt;</code> tags.'),
    ], $form_state);
    $element += $this
      ->createSettingElement('open_in_new_window', [
      '#type' => 'checkbox',
      '#title' => $this
        ->t('Open in a New Window'),
      '#description' => $this
        ->t('Adds <code>target="_blank"</code> to external link <code>&lt;a&gt;</code> tags.'),
    ], $form_state);
    $relOptions = [
      '' => $this
        ->t('No links'),
      'all' => $this
        ->t('All links'),
      'external' => $this
        ->t('External links only'),
      'internal' => $this
        ->t('Internal links only'),
    ];
    $element += $this
      ->createSettingElement('nofollow', [
      '#type' => 'select',
      '#title' => $this
        ->t('No Follow'),
      '#description' => $this
        ->t('Sets the "nofollow" value in the <code>rel</code> attribute. This value instructs search engines to not influence the ranking of the link\'s target in the search engine\'s index. Using this can negatively impact your site\'s SEO ranking if done improperly.'),
      '#options' => $relOptions,
    ], $form_state);
    $element += $this
      ->createSettingElement('noopener', [
      '#type' => 'select',
      '#title' => $this
        ->t('No Opener'),
      '#description' => $this
        ->t('Sets the "noopener" value in the <code>rel</code> attribute. This value instructs the browser to prevent the new page from being able to access the the window that opened the link and forces it run in a separate process.'),
      '#options' => $relOptions,
    ], $form_state);
    $element += $this
      ->createSettingElement('noreferrer', [
      '#type' => 'select',
      '#title' => $this
        ->t('No Referrer'),
      '#description' => $this
        ->t('Sets the "noreferrer" value in the <code>rel</code> attribute. This value instructs the browser from sending an HTTP referrer header to ensure that no referrer information will be leaked.'),
      '#options' => $relOptions,
    ], $form_state);
    return $element;
  }

  /**
   * {@inheritdoc}
   */
  public function getConfiguration() {
    $configuration = parent::getConfiguration();

    // Normalize settings from a key|value string into an associative array.
    foreach ([
      'internal_hosts',
    ] as $name) {
      if (isset($configuration['settings'][$name])) {
        $configuration['settings'][$name] = KeyValuePipeConverter::normalize($configuration['settings'][$name]);
      }
    }
    return $configuration;
  }

  /**
   * {@inheritdoc}
   */
  public function getSettings($runtime = FALSE, $sorted = TRUE) {
    $settings = $this
      ->getSettingsTrait($runtime, $sorted);
    if (!$runtime) {
      return $settings;
    }
    $token = \Drupal::token();
    foreach ($settings['internal_hosts'] as &$host) {
      $host = $token
        ->replace($host);
    }
    $settings['internal_hosts'] = array_unique($settings['internal_hosts']);
    return $settings;
  }

  /**
   * {@inheritdoc}
   */
  public function register($environment) {
    parent::register($environment);

    // For older versions of this extension, certain features didn't exist.
    // Add an inline rendered to take care of those features.
    if (Semver::satisfies($this
      ->getParser()
      ->getVersion(), '>=0.19.2 <1.5.0')) {
      $environment
        ->addInlineRenderer('\\League\\CommonMark\\Inline\\Element\\Link', new ExternalLinkRenderer($environment));
    }
  }

  /**
   * {@inheritdoc}
   */
  public function setConfiguration(array $configuration) {

    // Normalize settings from a key|value string into an associative array.
    foreach ([
      'internal_hosts',
    ] as $name) {
      if (isset($configuration['settings'][$name])) {
        $configuration['settings'][$name] = KeyValuePipeConverter::normalize($configuration['settings'][$name]);
      }
    }
    return parent::setConfiguration($configuration);
  }

  /**
   * {@inheritdoc}
   */
  public function settingsKey() {
    return 'external_link';
  }

}

Members

Namesort descending Modifiers Type Description Overrides
AnnotatedPluginBase::$originalPluginId protected property The original plugin_id that was called, not a fallback identifier.
AnnotatedPluginBase::create public static function Creates an instance of the plugin. Overrides ContainerFactoryPluginInterface::create
AnnotatedPluginBase::getConfigurationOverrides public function Retrieves the configuration overrides for the plugin. Overrides AnnotatedPluginInterface::getConfigurationOverrides
AnnotatedPluginBase::getDescription public function Retrieves the description of the plugin, if set. Overrides AnnotatedPluginInterface::getDescription
AnnotatedPluginBase::getOriginalPluginId public function Retrieves the original plugin identifier. Overrides AnnotatedPluginInterface::getOriginalPluginId
AnnotatedPluginBase::getProvider public function Returns the provider (extension name) of the plugin. Overrides AnnotatedPluginInterface::getProvider
AnnotatedPluginBase::getWeight public function Returns the weight of the plugin (used for sorting). Overrides AnnotatedPluginInterface::getWeight
AnnotatedPluginBase::__construct public function Constructs a \Drupal\Component\Plugin\PluginBase object. Overrides PluginBase::__construct
AnnotatedPluginBase::__toString public function
BaseExtension::enabledByDefault public function Indicates the default "enabled" state. Overrides EnabledPluginTrait::enabledByDefault
BaseExtension::isBundled public function Indicates whether the extension is automatically installed with the parser. Overrides ExtensionInterface::isBundled
BaseExtension::requiredBy public function Retrieves identifiers of extensions that are required by this extension. Overrides ExtensionInterface::requiredBy
BaseExtension::requires public function Retrieves identifiers of extensions that this extension requires. Overrides ExtensionInterface::requires
BaseExtension::validateSettings public static function Validates extension settings.
DependencySerializationTrait::$_entityStorages protected property An array of entity type IDs keyed by the property name of their storages.
DependencySerializationTrait::$_serviceIds protected property An array of service IDs keyed by property name used for serialization.
DependencySerializationTrait::__sleep public function 1
DependencySerializationTrait::__wakeup public function 2
DependencyTrait::$dependencies protected property The object's dependencies.
DependencyTrait::addDependencies protected function Adds multiple dependencies.
DependencyTrait::addDependency protected function Adds a dependency.
EnabledPluginTrait::isEnabled public function
ExternalLinkExtension::allowedHtmlTags public function Retrieves the allowed HTML tags. Overrides AllowedHtmlInterface::allowedHtmlTags
ExternalLinkExtension::buildConfigurationForm public function Form constructor. Overrides PluginFormInterface::buildConfigurationForm
ExternalLinkExtension::defaultSettings public static function Provides the default settings for the plugin. Overrides SettingsTrait::defaultSettings
ExternalLinkExtension::getConfiguration public function Gets this plugin's configuration. Overrides BaseExtension::getConfiguration
ExternalLinkExtension::getSettings public function Retrieves the current settings. Overrides SettingsInterface::getSettings
ExternalLinkExtension::register public function Allows the extension to register itself with the CommonMark Environment. Overrides BaseExtension::register
ExternalLinkExtension::setConfiguration public function Sets the configuration for this plugin instance. Overrides InstallablePluginBase::setConfiguration
ExternalLinkExtension::settingsKey public function The array key name to use when the settings are nested in another array. Overrides SettingsTrait::settingsKey
InstallablePluginBase::$config protected property The config for this plugin.
InstallablePluginBase::buildLibrary public function Builds a display for a library. Overrides InstallablePluginInterface::buildLibrary
InstallablePluginBase::buildStatus public function Builds a display status based on the current state of the plugin. Overrides InstallablePluginInterface::buildStatus
InstallablePluginBase::calculateDependencies public function Calculates dependencies for the configured plugin. Overrides DependentPluginInterface::calculateDependencies
InstallablePluginBase::config public function Retrieves the config instance for this plugin. Overrides InstallablePluginInterface::config
InstallablePluginBase::createConfig protected static function
InstallablePluginBase::defaultConfiguration public function Gets default configuration for this plugin. Overrides AnnotatedPluginBase::defaultConfiguration 1
InstallablePluginBase::getAvailableInstalls public function Retrieves available installs.
InstallablePluginBase::getConfigurationName protected function Returns the configuration name for the plugin.
InstallablePluginBase::getConfigurationSortOrder protected function Determines the configuration sort order by weight. 1
InstallablePluginBase::getContainer public function Retrieves the container.
InstallablePluginBase::getDeprecated public function Retrieves the deprecation message, if any. Overrides InstallablePluginInterface::getDeprecated
InstallablePluginBase::getExperimental public function Retrieves the experimental message. Overrides InstallablePluginInterface::getExperimental
InstallablePluginBase::getInstalledId public function Retrieves the composer package name of the installable library, if any. Overrides InstallablePluginInterface::getInstalledId
InstallablePluginBase::getInstalledLibrary public function Retrieves the installed library used by the plugin. Overrides InstallablePluginInterface::getInstalledLibrary
InstallablePluginBase::getLabel public function Displays the human-readable label of the plugin. Overrides AnnotatedPluginBase::getLabel
InstallablePluginBase::getLink public function Retrieves the plugin as a link using its label and URL. Overrides InstallablePluginInterface::getLink
InstallablePluginBase::getObject public function @TODO: Refactor to use variadic parameters. Overrides InstallablePluginInterface::getObject
InstallablePluginBase::getObjectClass public function Retrieves the class name of the object defined by the installed library. Overrides InstallablePluginInterface::getObjectClass
InstallablePluginBase::getPluginDependencies protected function 1
InstallablePluginBase::getPreferredLibrary public function Retrieves the preferred library of the plugin. Overrides InstallablePluginInterface::getPreferredLibrary
InstallablePluginBase::getSortedConfiguration public function Retrieves the configuration for the plugin, but sorted. Overrides InstallablePluginInterface::getSortedConfiguration
InstallablePluginBase::getUrl public function Retrieves the URL of the plugin, if set. Overrides InstallablePluginInterface::getUrl
InstallablePluginBase::getVersion public function The current version of the plugin. Overrides InstallablePluginInterface::getVersion
InstallablePluginBase::getVersionConstraint public function
InstallablePluginBase::hasMultipleLibraries public function Indicates whether plugin has multiple installs to check. Overrides InstallablePluginInterface::hasMultipleLibraries
InstallablePluginBase::isInstalled public function Indicates whether the plugin is installed. Overrides InstallablePluginInterface::isInstalled
InstallablePluginBase::isPreferred public function Indicates whether the plugin is using the preferred library. Overrides InstallablePluginInterface::isPreferred
InstallablePluginBase::isPreferredLibraryInstalled public function Indicates whether the preferred library is installed. Overrides InstallablePluginInterface::isPreferredLibraryInstalled
InstallablePluginBase::showInUi public function Indicates whether the plugin should be shown in the UI. Overrides InstallablePluginInterface::showInUi
MessengerTrait::$messenger protected property The messenger. 29
MessengerTrait::messenger public function Gets the messenger. 29
MessengerTrait::setMessenger public function Sets the messenger.
MoreInfoTrait::moreInfo protected function Appends existing content with a "More Info" link.
ParserAwareTrait::$parser protected property A Markdown Parser instance.
ParserAwareTrait::getParser public function 1
ParserAwareTrait::setParser public function
PluginBase::$configuration protected property Configuration information passed into the plugin. 1
PluginBase::$pluginDefinition protected property The plugin implementation definition. 1
PluginBase::$pluginId protected property The plugin_id.
PluginBase::DERIVATIVE_SEPARATOR constant A string which is used to separate base plugin IDs from the derivative ID.
PluginBase::getBaseId public function Gets the base_plugin_id of the plugin instance. Overrides DerivativeInspectionInterface::getBaseId
PluginBase::getDerivativeId public function Gets the derivative_id of the plugin instance. Overrides DerivativeInspectionInterface::getDerivativeId
PluginBase::getPluginDefinition public function Gets the definition of the plugin implementation. Overrides PluginInspectionInterface::getPluginDefinition 3
PluginBase::getPluginId public function Gets the plugin_id of the plugin instance. Overrides PluginInspectionInterface::getPluginId
PluginBase::isConfigurable public function Determines if the plugin is configurable.
PluginDependencyTrait::calculatePluginDependencies protected function Calculates and adds dependencies of a specific plugin instance.
PluginDependencyTrait::getPluginDependencies protected function Calculates and returns dependencies of a specific plugin instance. Aliased as: getPluginDependenciesTrait
PluginDependencyTrait::moduleHandler protected function Wraps the module handler.
PluginDependencyTrait::themeHandler protected function Wraps the theme handler.
RendererTrait::$renderer protected static property The Renderer service.
RendererTrait::renderer protected function Retrieves the Renderer service.
SettingsTrait::createSettingElement protected function Creates a setting element.
SettingsTrait::getDefaultSetting public function
SettingsTrait::getSetting public function
SettingsTrait::getSettingOverrides public function
SettingsTrait::getSettings public function Aliased as: getSettingsTrait
SettingsTrait::settingExists public function 2
SettingsTrait::submitConfigurationForm public function
SettingsTrait::validateConfigurationForm public function 2
StringTranslationTrait::$stringTranslation protected property The string translation service. 1
StringTranslationTrait::formatPlural protected function Formats a string containing a count of items.
StringTranslationTrait::getNumberOfPlurals protected function Returns the number of plurals supported by a given language.
StringTranslationTrait::getStringTranslation protected function Gets the string translation service.
StringTranslationTrait::setStringTranslation public function Sets the string translation service to use. 2
StringTranslationTrait::t protected function Translates a string to the current language or to a given language.