Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

BUG Fixing regression in 26d70d6 with formatted output in SS_HTMLValue

If formatOutput is set to TRUE, then the regexes in getContent()
will not match the newlines, and the output will include html, body
and meta tags. Introduce a few new tests to ensure the output is
correct, and fix the regex.
  • Loading branch information...
commit a171c7e4b00d29516e43948022b96d1a44cb9e2d 1 parent 574c53d
@halkyon halkyon authored
Showing with 52 additions and 16 deletions.
  1. +33 −11 model/HTMLValue.php
  2. +19 −5 tests/integration/HTMLValueTest.php
View
44 model/HTMLValue.php
@@ -17,14 +17,30 @@ class SS_HTMLValue extends ViewableData {
* @param string $content
*/
public function __construct($content = null) {
- $this->document = new DOMDocument('1.0', 'UTF-8');
- $this->document->scrictErrorChecking = false;
-
+ $this->setDocument(new DOMDocument('1.0', 'UTF-8'));
+ $this->setScrictErrorChecking(false);
+ $this->setOutputFormatting(false);
$this->setContent($content);
-
+
parent::__construct();
}
-
+
+ /**
+ * Should strict error checking be used?
+ * @param boolean $bool
+ */
+ public function setScrictErrorChecking($bool) {
+ $this->getDocument()->scrictErrorChecking = $bool;
+ }
+
+ /**
+ * Should the output be formatted?
+ * @param boolean $bool
+ */
+ public function setOutputFormatting($bool) {
+ $this->getDocument()->formatOutput = $bool;
+ }
+
/**
* @return string
*/
@@ -35,16 +51,15 @@ public function getContent() {
return trim(
preg_replace(
array(
- '/^<!DOCTYPE.+?>/i',
- '/(.*)<body>/i',
- '/<\/body>(.*)/i',
+ '/(.*)<body>/is',
+ '/<\/body>(.*)/is',
),
'',
urldecode($this->getDocument()->saveHTML())
)
);
}
-
+
/**
* @param string $content
* @return bool
@@ -59,14 +74,21 @@ public function setContent($content) {
"<body>$content</body></html>"
);
}
-
+
/**
* @return DOMDocument
*/
public function getDocument() {
return $this->document;
}
-
+
+ /**
+ * @param DOMDocument $document
+ */
+ public function setDocument($document) {
+ $this->document = $document;
+ }
+
/**
* A simple convenience wrapper around DOMDocument::getElementsByTagName().
*
View
24 tests/integration/HTMLValueTest.php
@@ -6,9 +6,10 @@
class SS_HTMLValueTest extends SapphireTest {
public function testInvalidHTMLSaving() {
- $value = new SS_HTMLValue();
+ $value = new SS_HTMLValue();
$invalid = array (
'<p>Enclosed Value</p></p>' => '<p>Enclosed Value</p>',
+ '<meta content="text/html"></meta>' => '<meta content="text/html">',
'<p><div class="example"></div></p>' => '<p></p><div class="example"></div>',
'<html><html><body><falsetag "attribute=""attribute""">' => '<falsetag></falsetag>',
'<body<body<body>/bodu>/body>' => '/bodu&gt;/body&gt;'
@@ -19,9 +20,22 @@ public function testInvalidHTMLSaving() {
$this->assertEquals($expected, $value->getContent(), 'Invalid HTML can be saved');
}
}
-
+
+ public function testUtf8Saving() {
+ $value = new SS_HTMLValue();
+ $value->setContent('<p>ö ß ā い 家</p>');
+ $this->assertEquals('<p>ö ß ā い 家</p>', $value->getContent());
+ }
+
+ public function testOutputFormatting() {
+ $value = new SS_HTMLValue();
+ $value->setOutputFormatting(true);
+ $value->setContent('<meta content="text/html">');
+ $this->assertEquals('<meta content="text/html">', $value->getContent(), 'Formatted output works');
+ }
+
public function testInvalidHTMLTagNames() {
- $value = new SS_HTMLValue();
+ $value = new SS_HTMLValue();
$invalid = array(
'<p><div><a href="test-link"></p></div>',
'<html><div><a href="test-link"></a></a></html_>',
@@ -30,7 +44,7 @@ public function testInvalidHTMLTagNames() {
foreach($invalid as $input) {
$value->setContent($input);
- $this->assertEquals (
+ $this->assertEquals(
'test-link',
$value->getElementsByTagName('a')->item(0)->getAttribute('href'),
'Link data can be extraced from malformed HTML'
@@ -47,5 +61,5 @@ public function testMixedNewlines() {
'Newlines get converted'
);
}
-
+
}
Please sign in to comment.
Something went wrong with that request. Please try again.