<?php
/**
* PHPTAL templating engine
*
* PHP Version 5
*
* @category HTML
* @package PHPTAL
* @author Laurent Bedubourg <hide@address.com>
* @author Kornel LesiÅski <hide@address.com>
* @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License
* @version SVN: $Id: HTML5ModeTest.php 974 2010-06-30 12:52:12Z kornel $
* @link http://phptal.org/
*/
class HTML5ModeTest extends PHPTAL_TestCase
{
function testCDATAScript()
{
$tpl = $this->newPHPTAL();
$tpl->setOutputMode(PHPTAL::HTML5);
$tpl->setSource('<!DOCTYPE html><script><![CDATA[
if (2 < 5) {
alert("</foo>");
}
]]></script>');
$this->assertEquals(normalize_html('<!DOCTYPE html><script> if (2 < 5) { alert("<\/foo>"); } </script>'), normalize_html($tpl->execute()));
}
function testCDATAContent()
{
$tpl = $this->newPHPTAL();
$tpl->setOutputMode(PHPTAL::HTML5);
$tpl->setSource('<!DOCTYPE html><p><![CDATA[<hello>]]></p>');
$this->assertEquals(normalize_html('<!DOCTYPE html><p><hello></p>'), normalize_html($tpl->execute()));
}
function testRemovesXHTMLNS()
{
$tpl = $this->newPHPTAL()->setOutputMode(PHPTAL::HTML5)->setSource('
<html xmlns="http://www.w3.org/1999/xhtml">
<x:head xmlns:x="http://www.w3.org/1999/xhtml"/></html>
');
$this->assertEquals(normalize_html('<html><head></head></html>'), normalize_html($tpl->execute()));
}
function testDoctype()
{
$tpl = $this->newPHPTAL();
$tpl->setOutputMode(PHPTAL::HTML5);
$tpl->setSource('<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><p><![CDATA[<hello>]]></p>');
$this->assertEquals(normalize_html('<!DOCTYPE html><p><hello></p>'), normalize_html($tpl->execute()));
}
function testProlog()
{
$tpl = $this->newPHPTAL();
$tpl->setOutputMode(PHPTAL::HTML5);
$tpl->setSource('<?xml version="1.0"?><!DOCTYPE html><p><![CDATA[<hello>]]></p>');
$this->assertEquals(normalize_html('<!DOCTYPE html><p><hello></p>'), normalize_html($tpl->execute()));
}
function testAttr()
{
$this->assertEquals('<html url=http://example.com/?test#test foo=" foo" bar=/bar quz="quz/"></html>',
$this->newPHPTAL()->setOutputMode(PHPTAL::HTML5)->setSource('<html url="http://example.com/?test#test" foo=" foo" bar="/bar" quz="quz/"></html>')->execute());
}
function testEmpty()
{
$tpl = $this->newPHPTAL();
$tpl->setOutputMode(PHPTAL::HTML5);
$tpl->setSource('<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title tal:content="nonexistant | nothing" />
<base href="http://example.com/"></base>
<basefont face="Helvetica" />
<meta name="test" content=""></meta>
<link rel="test"></link>
</head>
<body>
<br/>
<br />
<br></br>
<hr/>
<img src="test"></img>
<form>
<textarea />
<textarea tal:content="\'\'" />
<textarea tal:content="nonexistant | nothing" />
</form>
</body>
</html>');
$res = $tpl->execute();
$res = normalize_html($res);
$exp = normalize_html('<!DOCTYPE html><html>
<head>
<title></title>
<base href="http://example.com/">
<basefont face=Helvetica>
<meta name=test content="">
<link rel=test>
</head>
<body>
<br>
<br>
<br>
<hr>
<img src=test>
<form>
<textarea></textarea>
<textarea></textarea>
<textarea></textarea>
</form>
</body>
</html>');
$this->assertEquals($exp, $res);
}
function testBoolean()
{
$tpl = $this->newPHPTAL();
$tpl->setOutputMode(PHPTAL::HTML5);
$tpl->setSource('
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<input type="checkbox" checked="checked"></input>
<input type="text" tal:attributes="readonly \'readonly\'"/>
<input type="radio" tal:attributes="checked php:true; readonly \'readonly\'"/>
<input type="radio" tal:attributes="checked php:false; readonly bogus | nothing"/>
<select>
<option selected="unexpected value"/>
<option tal:repeat="n php:range(0,5)" tal:attributes="selected repeat/n/odd"/>
</select>
<script defer="defer"></script>
<script tal:attributes="defer number:1"></script>
</body>
</html>');
$res = $tpl->execute();
$res = normalize_html($res);
$exp = normalize_html('<html>
<body>
<input type=checkbox checked>
<input type=text readonly>
<input type=radio checked readonly>
<input type=radio>
<select>
<option selected></option>
<option></option><option selected></option><option></option><option selected></option><option></option><option selected></option>
</select>
<script defer></script>
<script defer></script>
</body>
</html>');
$this->assertEquals($exp, $res);
}
function testMixedModes()
{
$tpl = $this->newPHPTAL();
$tpl->setOutputMode(PHPTAL::HTML5);
$tpl->setSource('<input checked="checked"/>');
$this->assertEquals('<input checked>',$tpl->execute());
$tpl->setOutputMode(PHPTAL::XHTML);
$this->assertEquals('<input checked="checked"/>',$tpl->execute());
}
private function decodeNumericEntities($str)
{
return normalize_html(preg_replace('/&#x?[a-f0-9]+;/ie','htmlspecialchars(html_entity_decode("\\0"))', $str));
}
function testAttributeQuotes()
{
$res = $this->newPHPTAL()->setSource('<a test=\'${php:chr(34)}\' tal:attributes="foo php:chr(34)"
class=\'email
href="mailto:me"
\'
href
= \'
 mailto: %70orne%6c%40p%6f%72ne%6c%2enet?
\'>contact me</a>')->execute();
$this->assertEquals($this->decodeNumericEntities('<a test="""
class="email
href="mailto:me"
"
href="
mailto: %70orne%6c%40p%6f%72ne%6c%2enet?
" foo=""">contact me</a>'),$this->decodeNumericEntities($res));
}
}