#!/www/server/bin/php -qC "html5", 'prettyprint' => false, 'error_on_redefine' => false]); is( a(['href' => "&foo", 'true' => true, 'false' => false, 'null' => null, 'empty' => ""], "bar"), 'bar', "tag with attributes" ); is( div(), "
\n", "empty div tag" ); is( h1(), "

\n", "empty h1 tag" ); is( input(), "", "no closing tag for void elements" ); is( img(['src' => "foo.png", 'alt' => "ALT"]), 'ALT', "img tag with attributes" ); is( tag('link'), "\n", "empty link tag" ); is( tag('link', "foo"), "foo\n", "link tag with data" ); is( it::replace(['\n+\s*' => ""], select(['name' => "gna", 'multiple' => true], '1:foo,2:bar', '1,2')), '', "select tag with multiselect" ); is( it::replace(['\n+\s*' => ""], select(['name' => "gna"], ["1" => "foo", "2" => 'bar', '1,2' => "qux"], '1,2')), '', "select tag without multiselect" ); is( div(['arg' => "val: \x03, \x0e, \x0f, \x0c, \xc2\x80, \xc2\x9f, \t, \n, \r", "\x02, \x0e, \x0f, \x0c, \xc2\x80, \xc2\x9f, \t, \n, \r"]), "
\x02, \x0e, \x0f, \x0c, \xc2\x80, \xc2\x9f, \t, \n, \r
\n", "blank unprintable characters and illegal utf8 in attributes but not in normal text" ); is( div(["arg\x03\x0e\x0f\xc2\x80\xc2\x9fendarg" => "value", "content"]), "
content
\n", "don't blank unprintable characters and illegal utf8 in attribute names" ); is( div(['arg' => "abc äüö éá© œàè îôÇ xyz", "abc äüö éá© œàè îôÇ xyz"]), "
abc äüö éá© œàè îôÇ xyz
\n", "leave legal utf8 intact" ); unset($GLOBALS['debug_utf8check']); is( div(['arg' => "value \xc2", "content"]), "
content
\n", "handle single \\xc2 at end of attribute value" ); is( div(["arg\x00end" => "value \x00 end", "content \x00 content end"]), "
content \x00 content end
\n", "handle 0-bytes" ); is( div(['arg' => "& \" < > \n '", "& \" < > \n '"]), "
& \" < > \n '
\n", "use html entities in attributes but not in normal text" ); is( html(), "\n\n\n", "html5 doctype" ); # Test different html types foreach (['html5' => "
", 'html' => "
", 'xhtml' => "
", 'xhtml-mobile' => "
"] as $type => $value) { unset($GLOBALS['it_html']); new it_html(['htmltype' => $type, 'error_on_redefine' => false]); is (trim(br(['flag' => true])), $value, "Check empty tag and attribute for $type"); } # XHTML generation unset($GLOBALS['it_html']); new it_html(['htmltype' => "xhtml", 'tags' => "script", 'error_on_redefine' => false]); is( script(), "\n", "script may not be shortened (see xhtml spec)" ); is( h1(), "

\n", "empty h1 tag in xhtml context" ); is( html(), "\n\n\n", "xhtml doctype" ); # XML generation unset($GLOBALS['it_html']); new it_html(['htmltype' => "xml", 'name' => 'it_html', 'tags' => "xmltest", 'error_on_redefine' => false]); is( xmltest(), "\n", "empty xmltest tag" ); is( xmltest("foo"), "foo\n", "non-empty xmltest tag" ); is( xmltest(['href' => "&foo", 'true' => true, 'false' => false, 'null' => null, 'empty' => ""]), '' . "\n", "xmltest tag with attributes" ); is( h1(), "

\n", "empty h1 tag in xml context" ); is( input(), "", "empty input tag in xml context" ); # Inheriting and extending it_html class myhtml extends it_html { function __construct($p = []) { parent::__construct($p + ['moretags' => 'overriddentag,defaulttag', 'nonewlinetags' => 'a,b,defaulttag,em,img,input,overriddentag,span,div']); } function myimg($args) { array_unshift($args, ['alt' => "ALT", 'bar' => "BAR"]); return parent::img(array_filter(it_parse_args($args))); } function overriddentag($args) { return parent::overriddentag($args); } } unset($GLOBALS['it_html']); new myhtml(['htmltype' => "html", 'error_on_redefine' => false]); is( myimg(['src' => "foo.gif", 'alt' => "foo"]), 'foo', "it_html inheritance" ); is( div(['attr' => 'value'], 'content'), '
content
', "different nonewlinetags respected" ); is( overriddentag("one ", ['src' => "evil", 'alt' => ""], "two ", ['foo' => "bar"], "three"), 'one two three', "moretags override" ); is( defaulttag("one ", ['src' => "evil", 'alt' => ""], "two ", ['foo' => "bar"], "three"), 'one two three', "moretags default" ); is( it_html::sanitize(" \r \n " . '

swisspics posted < < ä & yesterday a photo tag missmatch:



Wolken

'), '

swisspics posted < < ä & yesterday a photo tag missmatch:



', '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('a
b
'), "a
b
", 'it_html::sanitize with b and br (tag prefix of other tag bug)' ); is( it_html::sanitize('
'), '', 'empty tags removal' ); is( it_html::sanitize('foo'), 'foo', 'it_html::sanitize handle anchors with spaces between attribute name and value' ); is( it_html::sanitize("foo"), 'foo', 'TODO it_html::sanitize handle anchors with single quotes at attribute value' ); is( it_html::sanitize("foo"), 'foo', 'TODO it_html::sanitize handle anchors with unquoted attribute value' ); foreach (json_decode(it::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), "
\n", "table() null argument"); list($data, $attr) = it_parse_args([null]); ok($data === "", "it_parse_args compatiblity: treat null like empty string"); # # check transliterations in iso-8859-1 # it_html::configure(['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"); is(js('