#!/www/server/bin/php -qC <?php it::getopt(""); #handle possible --debug parameter # Tests for html.class # Traditional html generation ini_set('default_charset', "utf-8"); new it_html(array('htmltype' => "html")); is( a(array('href' => "&foo", 'true' => true, 'false' => false, 'null' => null, 'empty' => ""), "bar"), '<a href="&foo" true empty="">bar</a>', "tag with attributes" ); is( div(), "<div></div>\n", "empty div tag" ); is( img(array('src' => "foo.png", 'alt' => "ALT")), '<img src="foo.png" alt="ALT">', "img tag with attributes" ); is( tag('link'), "<link>\n", "empty link tag" ); is( tag('link', "foo"), "<link>foo</link>\n", "link tag with data" ); is( it::replace(array('\n+\s*' => ""), select(array('name' => "gna", 'multiple' => true), '1:foo,2:bar', '1,2')), '<select name="gna" multiple><option value="1" selected>foo</option><option value="2" selected>bar</option></select>', "select tag with multiselect" ); is( it::replace(array('\n+\s*' => ""), select(array('name' => "gna"), array("1" => "foo", "2" => 'bar', '1,2' => "qux"), '1,2')), '<select name="gna"><option value="1">foo</option><option value="2">bar</option><option value="1,2" selected>qux</option></select>', "select tag without multiselect" ); is( div(array('arg' => "val: \x03, \x0e, \x0f, \x0c, \xc2\x80, \xc2\x9f, \t, \n, \r", "\x02, \x0e, \x0f, \x0c, \xc2\x80, \xc2\x9f, \t, \n, \r")), "<div arg=\"val: , , , , , , 	, , \">\x02, \x0e, \x0f, \x0c, \xc2\x80, \xc2\x9f, \t, \n, \r</div>\n", "blank unprintable characters and illegal utf8 in attributes but not in normal text" ); is( div(array("arg\x03\x0e\x0f\xc2\x80\xc2\x9fendarg" => "value", "content")), "<div arg\x03\x0e\x0f\xc2\x80\xc2\x9fendarg=\"value\">content</div>\n", "don't blank unprintable characters and illegal utf8 in attribute names" ); is( div(array('arg' => "abc äüö éá© œàè îôÇ xyz", "abc äüö éá© œàè îôÇ xyz")), "<div arg=\"abc äüö éá© œàè îôÇ xyz\">abc äüö éá© œàè îôÇ xyz</div>\n", "leave legal utf8 intact" ); unset($GLOBALS['debug_utf8check']); is( div(array('arg' => "value \xc2", "content")), "<div arg=\"value \xc2\">content</div>\n", "handle single \\xc2 at end of attribute value" ); is( div(array("arg\x00end" => "value \x00 end", "content \x00 content end")), "<div arg\x00end=\"value end\">content \x00 content end</div>\n", "handle 0-bytes" ); is( div(array('arg' => "& \" < > \n '", "& \" < > \n '")), "<div arg=\"& " < > '\">& \" < > \n '</div>\n", "use html entities in attributes but not in normal text" ); # Test different html types foreach (array('html5' => "<br flag>", 'html' => "<br flag>", 'xhtml' => "<br flag=\"flag\" />", 'xhtml-mobile' => "<br flag=\"flag\" />") as $type => $value) { unset($GLOBALS['it_html']); new it_html(array('htmltype' => $type)); is (trim(br(array('flag' => true))), $value, "Check empty tag and attribute for $type"); } # XML generation unset($GLOBALS['it_html']); new it_html(array('htmltype' => "xhtml", 'tags' => "xmltest")); is( xmltest(), "<xmltest />\n", "empty xmltest tag" ); is( xmltest("foo"), "<xmltest>foo</xmltest>\n", "empty xmltest tag" ); is( xmltest(array('href' => "&foo", 'true' => true, 'false' => false, 'null' => null, 'empty' => "")), '<xmltest href="&foo" true="true" empty="" />' . "\n", "xmltest tag with attributes" ); # Inheriting and extending it_html class myhtml extends it_html { function myhtml($p = array()) { parent::it_html($p + array('nonewlinetags' => 'a,b,em,img,input,span,div')); } function myimg($args) { array_unshift($args, array('alt' => "ALT", 'bar' => "BAR")); return parent::img(array_filter(it_parse_args($args))); } } unset($GLOBALS['it_html']); new myhtml(array('htmltype' => "html")); is( myimg(array('src' => "foo.gif", 'alt' => "foo")), '<img alt="foo" bar="BAR" src="foo.gif">', "it_html inheritance" ); is( div(array('attr' => 'value'), 'content'), '<div attr="value">content</div>', "different nonewlinetags respected" ); is( it_html::sanitize(" \r \n " . ' <p><a href="http://www.flickr.com/people/swisspics%/">swisspics</a> posted < < ä & yesterday <b>a <i>photo</i></b> <b><i>tag missmatch</b></i>:</p><br><BR /> <P><a href="javascript:window.close()" title="Wolken"><img src="http://farm1.static.flickr.com/177/377214376_bcba167a7d_m.jpg" width="240" height="180" alt="Wolken" style="border: 1px solid #ddd;" /></a></p> '), ' <a href="http://www.flickr.com/people/swisspics%25/">swisspics</a> posted < < ä & yesterday a <i>photo</i> <i>tag missmatch</i>:<br /><br /> <p><img src="http://farm1.static.flickr.com/177/377214376_bcba167a7d_m.jpg" alt="" /></p> ', 'it_html::sanitize tag soup' ); is( it_html::sanitize('q←x'), "q←x", 'it_html::sanitize preserve numeric entities' ); is( it_html::sanitize('qüx'), "q\xc3\xbcx", 'it_html::sanitize with utf-8' ); is( it_html::sanitize('<b>a<br>b</b>'), "<b>a<br />b</b>", 'it_html::sanitize with b and br (tag prefix of other tag bug)' ); is( it_html::sanitize('<div></div>'), '', 'empty tags removal' ); foreach (json_decode(file_get_contents(dirname($argv[0]) . '/U_tests.json'), true) as $test) { is(U(...$test['args']), $test['exp'], $test['name']); } is(it_html::entity_decode("ä"), "ä"); is(it_html::entity_decode("J"), "J"); is(it_html::entity_decode("J"), "J"); is(it_html::entity_decode("A"), "A"); # tests for itools extension is(table(null), "<table></table>\n", "table() null argument"); list($data, $attr) = it_parse_args(array(null)); ok($data === "", "it_parse_args compatiblity: treat null like empty string"); # # check transliterations in iso-8859-1 # it_html::configure(array('charset' => "iso-8859-1")); ini_set('default_charset', "iso-8859-1"); is( it_html::sanitize('qüx'), "q\xfcx", 'it_html::sanitize with latin1' ); is( it_html::sanitize('q←x'), "q←x", 'it_html::sanitize preserve non-decodable numeric entities' ); is(it_html::entity_decode("’"), "'", "it_html::entity_decode numeric decimal entity"); is(it_html::entity_decode("࿿"), " ", "it_html::entity_decode invalid numeric hex entity"); is(it_html::entity_decode("ϧ"), " ", "it_html::entity_decode invalid numeric decimal entity"); is(it_html::entity_decode("‹"), " ", "it_html::entity_decode entity von 0x80-0x9f"); ?>