Commit 505ce884 authored by David Monllaó's avatar David Monllaó
Browse files

MDL-54627 search: Ensure that all format_string strings are text.

All user input that is usually displayed through format_strings with
filters like mulitlang applied should be converted to text as well.
parent 33892edf
......@@ -70,7 +70,7 @@ class mycourse extends \core_search\area\base {
}
// Prepare associative array with data from DB.
$doc = \core_search\document_factory::instance($record->id, $this->componentname, $this->areaname);
$doc->set('title', $record->fullname);
$doc->set('title', content_to_text($record->fullname, false));
$doc->set('content', content_to_text($record->summary, $record->summaryformat));
$doc->set('contextid', $context->id);
$doc->set('courseid', $record->id);
......
......@@ -123,7 +123,7 @@ class course_search_testcase extends advanced_testcase {
$this->assertEquals($course->fullname, $doc->get('title'));
// Not nice. Applying \core_search\document::set line breaks clean up.
$summary = preg_replace("/\s+/", ' ', trim(content_to_text($course->summary, $course->summaryformat), "\r\n"));
$summary = preg_replace("/\s+/", " ", content_to_text($course->summary, $course->summaryformat));
$this->assertEquals($summary, $doc->get('content'));
$this->assertEquals($course->shortname, $doc->get('description1'));
}
......
......@@ -600,4 +600,41 @@ EXPECTED;
}
/**
* Tests for content_to_text.
*
* @param string $content The content
* @param int|false $format The content format
* @param string $expected Expected value
* @dataProvider provider_content_to_text
*/
public function test_content_to_text($content, $format, $expected) {
$content = content_to_text($content, $format);
$this->assertEquals($expected, $content);
}
/**
* Data provider for test_content_to_text.
*/
public static function provider_content_to_text() {
return array(
array('asd', false, 'asd'),
// Trim '\r\n '.
array("Note that:\n\n3 > 1 ", FORMAT_PLAIN, "Note that:\n\n3 > 1"),
array("Note that:\n\n3 > 1\r\n", FORMAT_PLAIN, "Note that:\n\n3 > 1"),
// Multiple spaces to one.
array('<span class="eheh">京都</span> -> hehe', FORMAT_HTML, '京都 -> hehe'),
array('<span class="eheh">京都</span> -> hehe', false, '京都 -> hehe'),
array('asd asd', false, 'asd asd'),
// From markdown to html and html to text.
array('asd __lera__ con la', FORMAT_MARKDOWN, 'asd LERA con la'),
// HTML to text.
array('<p class="frogs">This is a <strong class=\'fishes\'>test</strong></p>', FORMAT_HTML, 'This is a TEST'),
array("<span lang='en' class='multilang'>english</span>
<span lang='ca' class='multilang'>català</span>
<span lang='es' class='multilang'>español</span>
<span lang='fr' class='multilang'>français</span>", FORMAT_HTML, "english català español français")
);
}
}
......@@ -1918,24 +1918,35 @@ function html_to_text($html, $width = 75, $dolinks = true) {
}
/**
* Converts content introduced in an editor to plain text.
* Converts texts or strings to plain text.
*
* - When used to convert user input introduced in an editor the text format needs to be passed in $contentformat like we usually
* do in format_text.
* - When this function is used for strings that are usually passed through format_string before displaying them
* we need to set $contentformat to false. This will execute html_to_text as these strings can contain multilang tags if
* multilang filter is applied to headings.
*
* @param string $content The text as entered by the user
* @param int $contentformat The text format: FORMAT_MOODLE, FORMAT_HTML, FORMAT_PLAIN or FORMAT_MARKDOWN
* @param int|false $contentformat False for strings or the text format: FORMAT_MOODLE/FORMAT_HTML/FORMAT_PLAIN/FORMAT_MARKDOWN
* @return string Plain text.
*/
function content_to_text($content, $contentformat) {
switch ($contentformat) {
case FORMAT_PLAIN:
return $content;
// Nothing here.
break;
case FORMAT_MARKDOWN:
$html = markdown_to_html($content);
return html_to_text($html, 75, false);
$content = markdown_to_html($content);
$content = html_to_text($content, 75, false);
break;
default:
// FORMAT_HTML and FORMAT_MOODLE.
return html_to_text($content, 75, false);
// FORMAT_HTML, FORMAT_MOODLE and $contentformat = false, the later one are strings usually formatted through
// format_string, we need to convert them from html because they can contain HTML (multilang filter).
$content = html_to_text($content, 75, false);
}
return trim($content, "\r\n ");
}
/**
......
......@@ -79,7 +79,7 @@ class chapter extends \core_search\area\base_mod {
// Prepare associative array with data from DB.
$doc = \core_search\document_factory::instance($record->id, $this->componentname, $this->areaname);
$doc->set('title', $record->title);
$doc->set('title', content_to_text($record->title, false));
$doc->set('content', content_to_text($record->content, $record->contentformat));
$doc->set('contextid', $context->id);
$doc->set('courseid', $record->courseid);
......
......@@ -94,7 +94,7 @@ class post extends \core_search\area\base_mod {
// Prepare associative array with data from DB.
$doc = \core_search\document_factory::instance($record->id, $this->componentname, $this->areaname);
$doc->set('title', $record->subject);
$doc->set('title', content_to_text($record->subject, false));
$doc->set('content', content_to_text($record->message, $record->messageformat));
$doc->set('contextid', $context->id);
$doc->set('courseid', $record->courseid);
......
......@@ -90,7 +90,7 @@ class entry extends \core_search\area\base_mod {
// Prepare associative array with data from DB.
$doc = \core_search\document_factory::instance($entry->id, $this->componentname, $this->areaname);
$doc->set('title', $entry->concept);
$doc->set('title', content_to_text($entry->concept, false));
$doc->set('content', content_to_text($entry->definition, $entry->definitionformat));
$doc->set('contextid', $context->id);
$doc->set('courseid', $entry->course);
......@@ -106,6 +106,7 @@ class entry extends \core_search\area\base_mod {
// Adding keywords as extra info.
if ($keywords) {
// No need to pass through content_to_text here as this is just a list of keywords.
$doc->set('description1', implode(' ' , $keywords));
}
......
......@@ -64,7 +64,7 @@ class activity extends \core_search\area\base_activity {
// Prepare associative array with data from DB.
$doc = \core_search\document_factory::instance($record->id, $this->componentname, $this->areaname);
$doc->set('title', $record->name);
$doc->set('title', content_to_text($record->name, false));
$doc->set('content', content_to_text($record->content, $record->contentformat));
$doc->set('contextid', $context->id);
$doc->set('courseid', $record->course);
......
......@@ -98,7 +98,7 @@ class collaborative_page extends \core_search\area\base_mod {
// Prepare associative array with data from DB.
$doc = \core_search\document_factory::instance($record->id, $this->componentname, $this->areaname);
$doc->set('title', $record->title);
$doc->set('title', content_to_text($record->title, false));
$doc->set('content', $content);
$doc->set('contextid', $context->id);
$doc->set('courseid', $record->courseid);
......
......@@ -94,7 +94,7 @@ abstract class base_activity extends base_mod {
// Prepare associative array with data from DB.
$doc = \core_search\document_factory::instance($record->id, $this->componentname, $this->areaname);
$doc->set('title', $record->name);
$doc->set('title', content_to_text($record->name, false));
$doc->set('content', content_to_text($record->intro, $record->introformat));
$doc->set('contextid', $context->id);
$doc->set('courseid', $record->course);
......
......@@ -276,8 +276,8 @@ class document implements \renderable, \templatable {
if ($fielddata['type'] === 'int' || $fielddata['type'] === 'tdate') {
$this->data[$fieldname] = intval($value);
} else {
// Clean up line breaks and extra spaces.
$this->data[$fieldname] = preg_replace("/\s+/", ' ', trim($value, "\r\n"));
// Replace all groups of line breaks and spaces by single spaces.
$this->data[$fieldname] = preg_replace("/\s+/", " ", $value);
}
return $this->data[$fieldname];
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment