diff --git a/lib/filterlib.php b/lib/filterlib.php
index 9b991c97c2e..aa554203f75 100644
--- a/lib/filterlib.php
+++ b/lib/filterlib.php
@@ -461,42 +461,51 @@ abstract class moodle_text_filter {
/**
* This is just a little object to define a phrase and some instructions
* for how to process it. Filters can create an array of these to pass
- * to the filter_phrases function below.
+ * to the @{link filter_phrases()} function below.
+ *
+ * Note that although the fields here are public, you almost certainly should
+ * never use that. All that is supported is contructing new instances of this
+ * class, and then passing an array of them to filter_phrases.
*
* @copyright 1999 onwards Martin Dougiamas {@link http://moodle.com}
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class filterobject {
- /** @var string */
+ /** @var string this is the phrase that should be matched. */
public $phrase;
- /** @var bool whether to only recognise full word matches. */
+
+ /** @var bool whether to match complete words. If true, 'T' won't be matched in 'Tim'. */
public $fullmatch;
- public $hreftagbegin;
- public $hreftagend;
- /** @var bool */
+ /** @var bool whether the match needs to be case sensitive. */
public $casesensitive;
+ /** @var string HTML to insert before any match. */
+ public $hreftagbegin;
+ /** @var string HTML to insert after any match. */
+ public $hreftagend;
+
+ /** @var null|string replacement text to go inside begin and end. If not set,
+ * the body of the replacement will be the original phrase.
+ */
+ public $replacementphrase;
+
/** @var null|string once initialised, holds the regexp for matching this phrase. */
public $workregexp = null;
- /** @var mixed */
- public $replacementphrase;
- public $work_hreftagbegin;
- public $work_hreftagend;
- public $work_replacementphrase;
- /** @var bool */
- public $work_calculated;
+ /** @var null|string once initialised, holds the mangled HTML to replace the regexp with. */
+ public $workreplacementphrase = null;
/**
* Constructor.
*
- * @param string $phrase
- * @param string $hreftagbegin
- * @param string $hreftagend
- * @param bool $casesensitive
- * @param bool $fullmatch
- * @param mixed $replacementphrase
+ * @param string $phrase this is the phrase that should be matched.
+ * @param string $hreftagbegin HTML to insert before any match. Default ''.
+ * @param string $hreftagend HTML to insert after any match. Default ''.
+ * @param bool $casesensitive whether the match needs to be case sensitive
+ * @param bool $fullmatch whether to match complete words. If true, 'T' won't be matched in 'Tim'.
+ * @param mixed $replacementphrase replacement text to go inside begin and end. If not set,
+ * the body of the replacement will be the original phrase.
*/
public function __construct($phrase, $hreftagbegin = '',
$hreftagend = '',
@@ -510,8 +519,6 @@ class filterobject {
$this->casesensitive = !empty($casesensitive);
$this->fullmatch = !empty($fullmatch);
$this->replacementphrase = $replacementphrase;
- $this->work_calculated = false;
-
}
}
@@ -1321,37 +1328,14 @@ function filter_phrases($text, $linkarray, $ignoretagsopen = null, $ignoretagscl
continue;
}
- // All this work has to be done ONLY it it hasn't been done before.
- if (!$linkobject->work_calculated) {
- if (!isset($linkobject->hreftagbegin) or !isset($linkobject->hreftagend)) {
- $linkobject->work_hreftagbegin = 'work_hreftagend = '';
- } else {
- $linkobject->work_hreftagbegin = $linkobject->hreftagbegin;
- $linkobject->work_hreftagend = $linkobject->hreftagend;
- }
-
- // Double up chars to protect true duplicates
- // be cleared up before returning to the user.
- $linkobject->work_hreftagbegin = preg_replace('/([#*%])/', '\1\1', $linkobject->work_hreftagbegin);
-
- // Set the replacement phrase properly.
- if ($linkobject->replacementphrase) { // We have specified a replacement phrase.
- // Strip tags.
- $linkobject->work_replacementphrase = strip_tags($linkobject->replacementphrase);
- } else { // The replacement is the original phrase as matched below.
- $linkobject->work_replacementphrase = '$1';
- }
-
- // Work calculated.
- $linkobject->work_calculated = true;
+ // This only has to be done it it hasn't been done before.
+ if ($linkobject->workreplacementphrase === null) {
+ filter_prepare_phrase_for_replacement($linkobject);
}
// Finally we do our highlighting.
$resulttext = preg_replace($linkobject->workregexp,
- $linkobject->work_hreftagbegin.
- $linkobject->work_replacementphrase.
- $linkobject->work_hreftagend, $text, $pregreplacelimit);
+ $linkobject->workreplacementphrase, $text, $pregreplacelimit);
// If the text has changed we have to look for links again.
if ($resulttext != $text) {
@@ -1438,6 +1422,32 @@ function filter_prepare_phrases_for_filtering(array $linkarray) {
return $linkarray;
}
+/**
+ * Fill in the remaining ->work... fields, that would be needed to replace the phrase.
+ *
+ * @param filterobject $linkobject the link object on which to set additional fields.
+ */
+function filter_prepare_phrase_for_replacement(filterobject $linkobject) {
+ if (!isset($linkobject->hreftagbegin) or !isset($linkobject->hreftagend)) {
+ $linkobject->hreftagbegin = 'hreftagend = '';
+ }
+
+ // Double up chars to protect true duplicates
+ // be cleared up before returning to the user.
+ $hreftagbeginmangled = preg_replace('/([#*%])/', '\1\1', $linkobject->hreftagbegin);
+
+ // Set the replacement phrase properly.
+ if ($linkobject->replacementphrase) { // We have specified a replacement phrase.
+ $linkobject->workreplacementphrase = strip_tags($linkobject->replacementphrase);
+ } else { // The replacement is the original phrase as matched below.
+ $linkobject->workreplacementphrase = '$1';
+ }
+
+ $linkobject->workreplacementphrase = $hreftagbeginmangled .
+ $linkobject->workreplacementphrase . $linkobject->hreftagend;
+}
+
/**
* Remove duplicate from a list of {@link filterobject}.
*