Skip to content

Commit 5851989

Browse files
committed
In XML mode, tags are case sensitive
Fixes #114
1 parent 9da7ec0 commit 5851989

File tree

3 files changed

+29
-7
lines changed

3 files changed

+29
-7
lines changed

src/HTML5.php

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -166,9 +166,10 @@ public function hasErrors()
166166
public function parse(\Masterminds\HTML5\Parser\InputStream $input, array $options = array())
167167
{
168168
$this->errors = array();
169-
$events = new DOMTreeBuilder(false, array_merge($this->getOptions(), $options));
169+
$options = array_merge($this->getOptions(), $options);
170+
$events = new DOMTreeBuilder(false, $options);
170171
$scanner = new Scanner($input);
171-
$parser = new Tokenizer($scanner, $events);
172+
$parser = new Tokenizer($scanner, $events, !empty($options['xmlNamespaces']) ? Tokenizer::CONFORMANT_XML: Tokenizer::CONFORMANT_HTML);
172173

173174
$parser->parse();
174175
$this->errors = $events->getErrors();
@@ -184,9 +185,10 @@ public function parse(\Masterminds\HTML5\Parser\InputStream $input, array $optio
184185
*/
185186
public function parseFragment(\Masterminds\HTML5\Parser\InputStream $input, array $options = array())
186187
{
187-
$events = new DOMTreeBuilder(true, array_merge($this->getOptions(), $options));
188+
$options = array_merge($this->getOptions(), $options);
189+
$events = new DOMTreeBuilder(true, $options);
188190
$scanner = new Scanner($input);
189-
$parser = new Tokenizer($scanner, $events);
191+
$parser = new Tokenizer($scanner, $events, !empty($options['xmlNamespaces']) ? Tokenizer::CONFORMANT_XML: Tokenizer::CONFORMANT_HTML);
190192

191193
$parser->parse();
192194
$this->errors = $events->getErrors();

src/HTML5/Parser/Tokenizer.php

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@ class Tokenizer
4343
protected $textMode = 0; // TEXTMODE_NORMAL;
4444
protected $untilTag = null;
4545

46+
const CONFORMANT_XML = 'xml';
47+
const CONFORMANT_HTML = 'html';
48+
protected $mode = self::CONFORMANT_HTML;
49+
4650
const WHITE = "\t\n\f ";
4751

4852
/**
@@ -57,11 +61,13 @@ class Tokenizer
5761
* @param \Masterminds\HTML5\Parser\EventHandler $eventHandler
5862
* An event handler, initialized and ready to receive
5963
* events.
64+
* @param string $mode
6065
*/
61-
public function __construct($scanner, $eventHandler)
66+
public function __construct($scanner, $eventHandler, $mode = self::CONFORMANT_HTML)
6267
{
6368
$this->scanner = $scanner;
6469
$this->events = $eventHandler;
70+
$this->mode = $mode;
6571
}
6672

6773
/**
@@ -335,7 +341,8 @@ protected function endTag()
335341
return $this->bogusComment('</');
336342
}
337343

338-
$name = strtolower($this->scanner->charsUntil("\n\f \t>"));
344+
$name = $this->scanner->charsUntil("\n\f \t>");
345+
$name = $this->mode === self::CONFORMANT_XML ? $name: strtolower($name);
339346
// Trash whitespace.
340347
$this->scanner->whitespace();
341348

@@ -362,7 +369,8 @@ protected function tagName()
362369
}
363370

364371
// We know this is at least one char.
365-
$name = strtolower($this->scanner->charsWhile(":_-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
372+
$name = $this->scanner->charsWhile(":_-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz");
373+
$name = $this->mode === self::CONFORMANT_XML ? $name : strtolower($name);
366374
$attributes = array();
367375
$selfClose = false;
368376

test/HTML5/Html5Test.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -399,6 +399,18 @@ public function testEntities()
399399
$this->assertRegExp('|R&amp;D|', $res);
400400
}
401401

402+
public function testCaseSensitiveTags()
403+
{
404+
$dom = $this->html5->loadHTML(
405+
'<html><body><Button color="red">Error</Button></body></html>',
406+
array(
407+
"xmlNamespaces" => true
408+
)
409+
);
410+
$out = $this->html5->saveHTML($dom);
411+
$this->assertRegExp('|<html><body><Button color="red">Error</Button></body></html>|', $out);
412+
}
413+
402414
public function testComment()
403415
{
404416
$res = $this->cycle('a<!-- This is a test. -->b');

0 commit comments

Comments
 (0)