|
@@ -3,7 +3,6 @@
|
|
|
namespace Drupal\url_replace_filter\Plugin\Filter;
|
|
|
|
|
|
use Drupal\Core\Form\FormStateInterface;
|
|
|
-use Drupal\Component\Utility\Html;
|
|
|
use Drupal\Core\Messenger\MessengerInterface;
|
|
|
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
|
|
|
use Drupal\Core\Routing\CurrentRouteMatch;
|
|
@@ -71,20 +70,8 @@ class UrlReplaceFilter extends FilterBase implements ContainerFactoryPluginInter
|
|
|
parent::__construct($configuration, $plugin_id, $plugin_definition);
|
|
|
$this->currentRouteMatch = $currentRouteMatch;
|
|
|
$this->messenger = $messenger;
|
|
|
- }
|
|
|
|
|
|
- /**
|
|
|
- * {@inheritdoc}
|
|
|
- */
|
|
|
- public static function create(
|
|
|
- ContainerInterface $container,
|
|
|
- array $configuration,
|
|
|
- $plugin_id,
|
|
|
- $plugin_definition
|
|
|
- ) {
|
|
|
- $messenger = $container->get('messenger');
|
|
|
- $currentRouteMatch = $container->get('current_route_match');
|
|
|
- return new static($configuration, $plugin_id, $plugin_definition, $currentRouteMatch, $messenger);
|
|
|
+ $this->base = base_path();
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -117,6 +104,20 @@ class UrlReplaceFilter extends FilterBase implements ContainerFactoryPluginInter
|
|
|
return $form;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * {@inheritdoc}
|
|
|
+ */
|
|
|
+ public static function create(
|
|
|
+ ContainerInterface $container,
|
|
|
+ array $configuration,
|
|
|
+ $plugin_id,
|
|
|
+ $plugin_definition
|
|
|
+ ) {
|
|
|
+ $messenger = $container->get('messenger');
|
|
|
+ $currentRouteMatch = $container->get('current_route_match');
|
|
|
+ return new static($configuration, $plugin_id, $plugin_definition, $currentRouteMatch, $messenger);
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* Return the list of input formats containing the active URL Replace filter.
|
|
|
*
|
|
@@ -247,10 +248,10 @@ class UrlReplaceFilter extends FilterBase implements ContainerFactoryPluginInter
|
|
|
*/
|
|
|
public function tips($long = FALSE) {
|
|
|
if ($long) {
|
|
|
- return $this->t('To post pieces of code, surround them with <code>...</code> tags. For PHP code, you can use <?php ... ?>, which will also colour it based on syntax.');
|
|
|
+ return $this->t('Selected URLs may be rewritten by url_rewrite_filter.');
|
|
|
}
|
|
|
else {
|
|
|
- return $this->t('You may post code using <code>...</code> (generic) or <?php ... ?> (highlighted PHP) tags.');
|
|
|
+ return NULL;
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -258,29 +259,9 @@ class UrlReplaceFilter extends FilterBase implements ContainerFactoryPluginInter
|
|
|
* {@inheritdoc}
|
|
|
*/
|
|
|
public function process($text, $langcode) {
|
|
|
- // Escape code tags to prevent other filters from acting on them.
|
|
|
- $text = preg_replace_callback('@<code>(.+?)</code>@s', [get_class($this), 'codeTagCallback'], $text);
|
|
|
- $text = preg_replace_callback('@[\[<](\?php)(.+?)(\?)[\]>]@s', [get_class($this), 'phpTagCallback'], $text);
|
|
|
-
|
|
|
- // Replace code.
|
|
|
- $text = preg_replace_callback('@\[codefilter_code\](.+?)\[/codefilter_code\]@s', [get_class($this), 'processCodeCallback'], $text);
|
|
|
- $text = preg_replace_callback('@\[codefilter_php\](.+?)\[/codefilter_php\]@s', [get_class($this), 'processPHPCallback'], $text);
|
|
|
-
|
|
|
- // A hack, so we can conditionally nowrap based on filter settings.
|
|
|
- // @todo Refactor how replacements are done so we can do this more cleanly.
|
|
|
- if ($this->settings['nowrap_expand']) {
|
|
|
- $text = str_replace('class="codeblock"', 'class="codeblock nowrap-expand"', $text);
|
|
|
- }
|
|
|
- return new FilterProcessResult($text);
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * Filter the given text.
|
|
|
- */
|
|
|
- public function doProcess($text, $format) {
|
|
|
- $settings = _url_replace_filter_get_settings($format);
|
|
|
+ $settings = unserialize($this->settings['replacements']);
|
|
|
foreach ($settings as $setting) {
|
|
|
- if ($setting['original']) {
|
|
|
+ if (!empty($setting['original'])) {
|
|
|
$pattern = '!((<a\s[^>]*href)|(<img\s[^>]*src))\s*=\s*"' . preg_quote($setting['original']) . '!iU';
|
|
|
if (preg_match_all($pattern, $text, $matches)) {
|
|
|
$replacement = str_replace('%baseurl', rtrim(base_path(), '/'), $setting['replacement']);
|
|
@@ -290,155 +271,8 @@ class UrlReplaceFilter extends FilterBase implements ContainerFactoryPluginInter
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- return $text;
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * Callback to replace content of the <code> elements.
|
|
|
- *
|
|
|
- * @param array $matches
|
|
|
- * An array of matches passed by preg_replace_callback().
|
|
|
- *
|
|
|
- * @return string
|
|
|
- * A formatted string.
|
|
|
- */
|
|
|
- public static function processCodeCallback(array $matches) {
|
|
|
- return self::processCode($matches[1]);
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * Callback to replace content of the <?php ?> elements.
|
|
|
- *
|
|
|
- * @param array $matches
|
|
|
- * An array of matches passed by preg_replace_callback().
|
|
|
- *
|
|
|
- * @return string
|
|
|
- * A formatted string.
|
|
|
- */
|
|
|
- public static function processPhpCallback(array $matches) {
|
|
|
- return self::processPhp($matches[1]);
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * Escape code blocks.
|
|
|
- *
|
|
|
- * @param string $text
|
|
|
- * The string to escape.
|
|
|
- * @param string $type
|
|
|
- * The type of code block, either 'code' or 'php'.
|
|
|
- *
|
|
|
- * @return string
|
|
|
- * The escaped string.
|
|
|
- */
|
|
|
- public static function escape($text, $type = 'code') {
|
|
|
- // Note, pay attention to odd preg_replace-with-/e behaviour on slashes.
|
|
|
- $text = Html::escape(str_replace('\"', '"', $text));
|
|
|
-
|
|
|
- // Protect newlines from line break converter.
|
|
|
- $text = str_replace(["\r", "\n"], ['', ' '], $text);
|
|
|
-
|
|
|
- // Add codefilter escape tags.
|
|
|
- $text = "[codefilter_$type]{$text}[/codefilter_$type]";
|
|
|
-
|
|
|
- return $text;
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * Processes chunks of escaped code into HTML.
|
|
|
- */
|
|
|
- public static function processCode($text) {
|
|
|
- // Undo linebreak escaping.
|
|
|
- $text = str_replace(' ', "\n", $text);
|
|
|
- // Inline or block level piece?
|
|
|
- $multiline = strpos($text, "\n") !== FALSE;
|
|
|
- // Note, pay attention to odd preg_replace-with-/e behaviour on slashes.
|
|
|
- $text = preg_replace("/^\n/", '', preg_replace('@</?(br|p)\s*/?>@', '', str_replace('\"', '"', $text)));
|
|
|
- // Trim leading and trailing linebreaks.
|
|
|
- $text = trim($text, "\n");
|
|
|
- // Escape newlines.
|
|
|
- $text = nl2br($text);
|
|
|
-
|
|
|
- // PHP code in regular code.
|
|
|
- $text = preg_replace_callback('/<\?php.+?\?>/s', [get_class(), 'processPHPInline'], $text);
|
|
|
-
|
|
|
- $text = '<code>' . self::fixSpaces(str_replace(' ', ' ', $text)) . '</code>';
|
|
|
- $text = $multiline ? '<div class="codeblock">' . $text . '</div>' : $text;
|
|
|
- // Remove newlines to avoid clashing with the linebreak filter.
|
|
|
- return str_replace("\n", '', $text);
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * Helper function for processCode().
|
|
|
- */
|
|
|
- public static function processPhpInline($matches) {
|
|
|
- // Undo nl2br.
|
|
|
- $text = str_replace('<br />', '', $matches[0]);
|
|
|
- // Decode entities (the highlighter re-entifies) and highlight text.
|
|
|
- $text = highlight_string(Html::decodeEntities($text), 1);
|
|
|
- // Remove PHPs own added code tags.
|
|
|
- $text = str_replace(['<code>', '</code>', "\n"], ['', '', ''], $text);
|
|
|
- return $text;
|
|
|
- }
|
|
|
|
|
|
- /**
|
|
|
- * Processes chunks of escaped PHP code into HTML.
|
|
|
- */
|
|
|
- public static function processPhp($text) {
|
|
|
- // Note, pay attention to odd preg_replace-with-/e behaviour on slashes.
|
|
|
- // Undo possible linebreak filter conversion.
|
|
|
- $text = preg_replace('@</?(br|p)\s*/?>@', '', str_replace('\"', '"', $text));
|
|
|
- // Undo the escaping in the prepare step.
|
|
|
- $text = Html::decodeEntities($text);
|
|
|
- // Trim leading and trailing linebreaks.
|
|
|
- $text = trim($text, "\r\n");
|
|
|
- // Highlight as PHP.
|
|
|
- $text = '<div class="codeblock">' . highlight_string("<?php\n$text\n?>", 1) . '</div>';
|
|
|
- // Remove newlines to avoid clashing with the linebreak filter.
|
|
|
- $text = str_replace("\n", '', $text);
|
|
|
- return self::fixSpaces($text);
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * Replace html space elements with literal space characters.
|
|
|
- *
|
|
|
- * @param string $text
|
|
|
- * A string to fix spaces for.
|
|
|
- *
|
|
|
- * @return string
|
|
|
- * A formatted string.
|
|
|
- */
|
|
|
- public static function fixSpaces($text) {
|
|
|
- $text = preg_replace('@ (?! )@', ' ', $text);
|
|
|
- // A single space before text is ignored by browsers. If a single space
|
|
|
- // follows a break tag, replace it with a non-breaking space.
|
|
|
- $text = preg_replace('@<br /> ([^ ])@', '<br /> $1', $text);
|
|
|
- return $text;
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * Callback to escape content of <code> tags.
|
|
|
- *
|
|
|
- * @param array $matches
|
|
|
- * An array of matches passed by preg_replace_callback().
|
|
|
- *
|
|
|
- * @return string
|
|
|
- * A formatted string.
|
|
|
- */
|
|
|
- public static function codeTagCallback(array $matches) {
|
|
|
- return self::escape($matches[1], 'code');
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * Callback to escape content of <?php ?>, [?php ?], <% %>, and [% %] tags.
|
|
|
- *
|
|
|
- * @param array $matches
|
|
|
- * An array of matches passed by preg_replace_callback().
|
|
|
- *
|
|
|
- * @return string
|
|
|
- * A formatted string.
|
|
|
- */
|
|
|
- public static function phpTagCallback(array $matches) {
|
|
|
- return self::escape($matches[2], 'php');
|
|
|
+ return new FilterProcessResult($text);
|
|
|
}
|
|
|
|
|
|
}
|