mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 12:05:37 +00:00
5c9044a007
API Introduce HTMLFragment as casting helper for HTMLText with shortcodes disabled API Introduce DBField::CDATA for XML file value encoding API RSSFeed now casts from the underlying model rather than by override API Introduce CustomMethods::getExtraMethodConfig() to allow metadata to be queried BUG Remove _call hack from VirtualPage API Remove FormField::$dontEscape API Introduce HTMLReadonlyField for non-editable readonly HTML API FormField::Field() now returns string in many cases rather than DBField instance. API Remove redundant *_val methods from ViewableData API ViewableData::obj() no longer has a $forceReturnObject parameter as it always returns an object BUG Fix issue with ViewableData caching incorrect field values after being modified. API Remove deprecated DB class methods API Enforce plain text left/right formfield titles
325 lines
10 KiB
PHP
325 lines
10 KiB
PHP
<?php
|
|
|
|
|
|
|
|
use SilverStripe\ORM\FieldType\DBHTMLText;
|
|
use SilverStripe\ORM\FieldType\DBField;
|
|
|
|
|
|
/**
|
|
* @package framework
|
|
* @subpackage tests
|
|
*/
|
|
class DBHTMLTextTest extends SapphireTest {
|
|
|
|
/**
|
|
* Test {@link HTMLText->LimitCharacters()}
|
|
*/
|
|
public function testLimitCharacters() {
|
|
$cases = array(
|
|
'The little brown fox jumped over the lazy cow.' => 'The little brown fox...',
|
|
'<p>This is some text in a paragraph.</p>' => 'This is some text in...',
|
|
'This text contains & in it' => 'This text contains &...'
|
|
);
|
|
|
|
foreach($cases as $originalValue => $expectedValue) {
|
|
$textObj = new DBHTMLText('Test');
|
|
$textObj->setValue($originalValue);
|
|
$this->assertEquals($expectedValue, $textObj->LimitCharacters());
|
|
}
|
|
}
|
|
|
|
public function testSummaryBasics() {
|
|
$cases = array(
|
|
'<h1>Should not take header</h1><p>Should take paragraph</p>' => 'Should take paragraph',
|
|
'<p>Should strip <b>tags, but leave</b> text</p>' => 'Should strip tags, but leave text',
|
|
'<p>Unclosed tags <br>should not phase it</p>' => 'Unclosed tags should not phase it',
|
|
'<p>Second paragraph</p><p>should not cause errors or appear in output</p>' => 'Second paragraph',
|
|
'<img src="hello" /><p>Second paragraph</p><p>should not cause errors or appear in output</p>'
|
|
=> 'Second paragraph',
|
|
' <img src="hello" /><p>Second paragraph</p><p>should not cause errors or appear in output</p>'
|
|
=> 'Second paragraph',
|
|
'<p><img src="remove me">example <img src="include me">text words hello<img src="hello"></p>'
|
|
=> 'example text words hello',
|
|
);
|
|
|
|
foreach($cases as $originalValue => $expectedValue) {
|
|
$textObj = new DBHTMLText('Test');
|
|
$textObj->setValue($originalValue);
|
|
$this->assertEquals($expectedValue, $textObj->Summary());
|
|
}
|
|
}
|
|
|
|
public function testSummaryLimits() {
|
|
$cases = array(
|
|
'<p>A long paragraph should be cut off if limit is set</p>' => 'A long paragraph should be...',
|
|
'<p>No matter <i>how many <b>tags</b></i> are in it</p>' => 'No matter how many tags...',
|
|
'<p>A sentence is. nicer than hard limits</p>' => 'A sentence is.',
|
|
'<p>But not. If it\'s too short</p>' => 'But not. If it\'s too...'
|
|
);
|
|
|
|
foreach($cases as $originalValue => $expectedValue) {
|
|
$textObj = new DBHTMLText('Test');
|
|
$textObj->setValue($originalValue);
|
|
$this->assertEquals($expectedValue, $textObj->Summary(5, 3, '...'));
|
|
}
|
|
}
|
|
|
|
public function testSummaryEndings() {
|
|
$cases = array(
|
|
'...', ' -> more', ''
|
|
);
|
|
|
|
$orig = '<p>Cut it off, cut it off</p>';
|
|
$match = 'Cut it off, cut';
|
|
|
|
foreach($cases as $add) {
|
|
$textObj = new DBHTMLText();
|
|
$textObj->setValue($orig);
|
|
$this->assertEquals($match.$add, $textObj->Summary(4, 0, $add));
|
|
}
|
|
}
|
|
|
|
public function testSummaryFlexTooBigShouldNotCauseError() {
|
|
$orig = '<p>Cut it off, cut it off</p>';
|
|
$match = 'Cut it off, cut';
|
|
|
|
$textObj = new DBHTMLText();
|
|
$textObj->setValue($orig);
|
|
$this->assertEquals($match, $textObj->Summary(4, 10, ''));
|
|
}
|
|
|
|
public function testSummaryInvalidHTML() {
|
|
$cases = array(
|
|
'It\'s got a <p<> tag, but<p junk true>This doesn\'t <a id="boo">make</b class="wa"> < ><any< sense</p>'
|
|
=> 'This doesn\'t make any',
|
|
'This doesn\'t <a style="much horray= true>even</b> < ><have< a <i>p tag' => 'This doesn\'t even have'
|
|
);
|
|
|
|
foreach($cases as $orig => $match) {
|
|
$textObj = new DBHTMLText();
|
|
$textObj->setValue($orig);
|
|
$this->assertEquals($match, $textObj->Summary(4, 0, ''));
|
|
}
|
|
}
|
|
|
|
public function testFirstSentence() {
|
|
$many = str_repeat('many ', 100);
|
|
$cases = array(
|
|
'<h1>should ignore</h1><p>First sentence. Second sentence.</p>' => 'First sentence.',
|
|
'<h1>should ignore</h1><p>First Mr. sentence. Second sentence.</p>' => 'First Mr. sentence.',
|
|
"<h1>should ignore</h1><p>Sentence with {$many}words. Second sentence.</p>"
|
|
=> "Sentence with {$many}words.",
|
|
'<p>This classic picture book features a repetitive format that lends itself to audience interaction.'.
|
|
' Illustrator Eric Carle submitted new, bolder artwork for the 25th anniversary edition.</p>'
|
|
=> 'This classic picture book features a repetitive format that lends itself to audience interaction.'
|
|
);
|
|
|
|
foreach($cases as $orig => $match) {
|
|
$textObj = new DBHTMLText();
|
|
$textObj->setValue($orig);
|
|
$this->assertEquals($match, $textObj->FirstSentence());
|
|
}
|
|
}
|
|
|
|
public function testRAW() {
|
|
$data = DBField::create_field('HTMLText', 'This & This');
|
|
$this->assertEquals($data->RAW(), 'This & This');
|
|
|
|
$data = DBField::create_field('HTMLText', 'This & This');
|
|
$this->assertEquals($data->RAW(), 'This & This');
|
|
}
|
|
|
|
public function testXML() {
|
|
$data = DBField::create_field('HTMLText', 'This & This');
|
|
$this->assertEquals($data->XML(), 'This & This');
|
|
}
|
|
|
|
public function testHTML() {
|
|
$data = DBField::create_field('HTMLText', 'This & This');
|
|
$this->assertEquals($data->HTML(), 'This & This');
|
|
}
|
|
|
|
public function testJS() {
|
|
$data = DBField::create_field('HTMLText', '"this is a test"');
|
|
$this->assertEquals($data->JS(), '\"this is a test\"');
|
|
}
|
|
|
|
public function testATT() {
|
|
$data = DBField::create_field('HTMLText', '"this is a test"');
|
|
$this->assertEquals($data->ATT(), '"this is a test"');
|
|
}
|
|
|
|
function testExists() {
|
|
$h = new DBHTMLText();
|
|
$h->setValue("");
|
|
$this->assertFalse($h->exists());
|
|
$h->setValue("<p></p>");
|
|
$this->assertFalse($h->exists());
|
|
$h->setValue("<p> </p>");
|
|
$this->assertFalse($h->exists());
|
|
$h->setValue("<h2/>");
|
|
$this->assertFalse($h->exists());
|
|
$h->setValue("<h2></h2>");
|
|
$this->assertFalse($h->exists());
|
|
|
|
$h->setValue("something");
|
|
$this->assertTrue($h->exists());
|
|
$h->setValue("<img src=\"dummy.png\">");
|
|
$this->assertTrue($h->exists());
|
|
$h->setValue("<img src=\"dummy.png\"><img src=\"dummy.png\">");
|
|
$this->assertTrue($h->exists());
|
|
$h->setValue("<p><img src=\"dummy.png\"></p>");
|
|
$this->assertTrue($h->exists());
|
|
|
|
$h->setValue("<iframe src=\"http://www.google.com\"></iframe>");
|
|
$this->assertTrue($h->exists());
|
|
$h->setValue("<embed src=\"test.swf\">");
|
|
$this->assertTrue($h->exists());
|
|
$h->setValue("<object width=\"400\" height=\"400\" data=\"test.swf\"></object>");
|
|
$this->assertTrue($h->exists());
|
|
|
|
|
|
$h->setValue("<p>test</p>");
|
|
$this->assertTrue($h->exists());
|
|
}
|
|
|
|
function testWhitelist() {
|
|
$textObj = new DBHTMLText('Test', 'whitelist=meta,link');
|
|
$this->assertEquals(
|
|
'<meta content="Keep"><link href="Also Keep">',
|
|
$textObj->whitelistContent('<meta content="Keep"><p>Remove</p><link href="Also Keep" />Remove Text'),
|
|
'Removes any elements not in whitelist excluding text elements'
|
|
);
|
|
|
|
$textObj = new DBHTMLText('Test', 'whitelist=meta,link,text()');
|
|
$this->assertEquals(
|
|
'<meta content="Keep"><link href="Also Keep">Keep Text',
|
|
$textObj->whitelistContent('<meta content="Keep"><p>Remove</p><link href="Also Keep" />Keep Text'),
|
|
'Removes any elements not in whitelist including text elements'
|
|
);
|
|
}
|
|
|
|
public function testShortCodeParsedInRAW() {
|
|
$parser = ShortcodeParser::get('HTMLTextTest');
|
|
$parser->register('shortcode', function($arguments, $content, $parser, $tagName, $extra) {
|
|
return 'replaced';
|
|
});
|
|
ShortcodeParser::set_active('HTMLTextTest');
|
|
/** @var DBHTMLText $field */
|
|
$field = DBField::create_field('HTMLText', '<p>[shortcode]</p>');
|
|
$this->assertEquals('<p>replaced</p>', $field->RAW());
|
|
$this->assertEquals('<p>replaced</p>', (string)$field);
|
|
|
|
$field->setOptions(array(
|
|
'shortcodes' => false,
|
|
));
|
|
|
|
$this->assertEquals('<p>[shortcode]</p>', $field->RAW());
|
|
$this->assertEquals('<p>[shortcode]</p>', (string)$field);
|
|
|
|
|
|
ShortcodeParser::set_active('default');
|
|
}
|
|
|
|
public function testShortCodeParsedInTemplateHelpers() {
|
|
$parser = ShortcodeParser::get('HTMLTextTest');
|
|
$parser->register('shortcode', function($arguments, $content, $parser, $tagName, $extra) {
|
|
return 'Replaced short code with this. <a href="home">home</a>';
|
|
});
|
|
ShortcodeParser::set_active('HTMLTextTest');
|
|
/** @var DBHTMLText $field */
|
|
$field = DBField::create_field('HTMLText', '<p>[shortcode]</p>');
|
|
|
|
$this->assertEquals(
|
|
'<p>Replaced short code with this. <a href="home">home</a></p>',
|
|
$field->HTMLATT()
|
|
);
|
|
$this->assertEquals(
|
|
'%3Cp%3EReplaced+short+code+with+this.+%3Ca+href%3D%22home%22%3Ehome%3C%2Fa%3E%3C%2Fp%3E',
|
|
$field->URLATT()
|
|
);
|
|
$this->assertEquals(
|
|
'%3Cp%3EReplaced%20short%20code%20with%20this.%20%3Ca%20href%3D%22home%22%3Ehome%3C%2Fa%3E%3C%2Fp%3E',
|
|
$field->RAWURLATT()
|
|
);
|
|
$this->assertEquals(
|
|
'<p>Replaced short code with this. <a href="home">home</a></p>',
|
|
$field->ATT()
|
|
);
|
|
$this->assertEquals(
|
|
'<p>Replaced short code with this. <a href="home">home</a></p>',
|
|
$field->RAW()
|
|
);
|
|
$this->assertEquals(
|
|
'\x3cp\x3eReplaced short code with this. \x3ca href=\"home\"\x3ehome\x3c/a\x3e\x3c/p\x3e',
|
|
$field->JS()
|
|
);
|
|
$this->assertEquals(
|
|
'<p>Replaced short code with this. <a href="home">home</a></p>',
|
|
$field->HTML()
|
|
);
|
|
$this->assertEquals(
|
|
'<p>Replaced short code with this. <a href="home">home</a></p>',
|
|
$field->XML()
|
|
);
|
|
$this->assertEquals(
|
|
'Repl...',
|
|
$field->LimitCharacters(4, '...')
|
|
);
|
|
$this->assertEquals(
|
|
'Replaced...',
|
|
$field->LimitCharactersToClosestWord(10, '...')
|
|
);
|
|
$this->assertEquals(
|
|
'Replaced...',
|
|
$field->LimitWordCount(1, '...')
|
|
);
|
|
$this->assertEquals(
|
|
'<p>replaced short code with this. <a href="home">home</a></p>',
|
|
$field->LowerCase()
|
|
);
|
|
$this->assertEquals(
|
|
'<P>REPLACED SHORT CODE WITH THIS. <A HREF="HOME">HOME</A></P>',
|
|
$field->UpperCase()
|
|
);
|
|
$this->assertEquals(
|
|
'Replaced short code with this. home',
|
|
$field->NoHTML()
|
|
);
|
|
Config::nest();
|
|
Config::inst()->update('Director', 'alternate_base_url', 'http://example.com/');
|
|
$this->assertEquals(
|
|
'<p>Replaced short code with this. <a href="http://example.com/home">home</a></p>',
|
|
$field->AbsoluteLinks()
|
|
);
|
|
Config::unnest();
|
|
$this->assertEquals(
|
|
'Replaced short code with this.',
|
|
$field->LimitSentences(1)
|
|
);
|
|
$this->assertEquals(
|
|
'Replaced short code with this.',
|
|
$field->FirstSentence()
|
|
);
|
|
$this->assertEquals(
|
|
'Replaced short...',
|
|
$field->Summary(2)
|
|
);
|
|
$this->assertEquals(
|
|
'Replaced short code with...',
|
|
$field->BigSummary(4)
|
|
);
|
|
$this->assertEquals(
|
|
'Replaced short code with this. home[home]',
|
|
$field->FirstParagraph()
|
|
);
|
|
$this->assertEquals(
|
|
'Replaced <span class="highlight">short</span> <span class="highlight">code</span> with this. home',
|
|
$field->ContextSummary(500, 'short code')
|
|
);
|
|
|
|
ShortcodeParser::set_active('default');
|
|
}
|
|
}
|