static function extractAttributes(array $input, array $boolean, array $other, $withGlobal = true)
{
$string = '';
// add boolean attributes with predefined values or no value
unset($boolean['REQUIRED']); // TODO remove with HTML5
static $globalBoolean = array('CONTENTEDITABLE'=>'', 'DRAGGABLE'=>'true', 'SPELLCHECK'=>'', 'TRANSLATE'=>'yes');
if ($withGlobal)
$boolean = $globalBoolean + $boolean;
foreach (array_intersect_key($input, $boolean) as $k => $v)
if ($v === 'Y' || $v === true)
$string .= ' '.mb_strtolower($k).($boolean[$k] ? '="'.$boolean[$k].'"' : '');
// add event attributes with values
if ($withGlobal)
{
static $globalEvents = array(
'ONABORT'=>1, 'ONBLUR'=>1, 'ONCANPLAY'=>1, 'ONCANPLAYTHROUGH'=>1, 'ONCHANGE'=>1, 'ONCLICK'=>1,
'ONCONTEXTMENU'=>1, 'ONDBLCLICK'=>1, 'ONDRAG'=>1, 'ONDRAGEND'=>1, 'ONDRAGENTER'=>1, 'ONDRAGLEAVE'=>1,
'ONDRAGOVER'=>1, 'ONDRAGSTART'=>1, 'ONDROP'=>1, 'ONDURATIONCHANGE'=>1, 'ONEMPTIED'=>1, 'ONENDED'=>1,
'ONERROR'=>1, 'ONFOCUS'=>1, 'ONINPUT'=>1, 'ONINVALID'=>1, 'ONKEYDOWN'=>1, 'ONKEYPRESS'=>1, 'ONKEYUP'=>1,
'ONLOAD'=>1, 'ONLOADEDDATA'=>1, 'ONLOADEDMETADATA'=>1, 'ONLOADSTART'=>1, 'ONMOUSEDOWN'=>1, 'ONMOUSEMOVE'=>1,
'ONMOUSEOUT'=>1, 'ONMOUSEOVER'=>1, 'ONMOUSEUP'=>1, 'ONMOUSEWHEEL'=>1, 'ONPAUSE'=>1, 'ONPLAY'=>1,
'ONPLAYING'=>1, 'ONPROGRESS'=>1, 'ONRATECHANGE'=>1, 'ONREADYSTATECHANGE'=>1, 'ONRESET'=>1, 'ONSCROLL'=>1,
'ONSEEKED'=>1, 'ONSEEKING'=>1, 'ONSELECT'=>1, 'ONSHOW'=>1, 'ONSTALLED'=>1, 'ONSUBMIT'=>1, 'ONSUSPEND'=>1,
'ONTIMEUPDATE'=>1, 'ONVOLUMECHANGE'=>1, 'ONWAITING'=>1,
);
$events = array_intersect_key($input, $globalEvents);
$other = array_diff_key($other, $events);
foreach ($events as $k => $v)
if ($v)
$string .= ' '.mb_strtolower($k).'="'.$v.'"';
}
// add other attributes with values
static $globalOther = array(
'ACCESSKEY'=>1, 'CLASS'=>1, 'CONTEXTMENU'=>1, 'DIR'=>1, 'DROPZONE'=>1, 'LANG'=>1, 'STYLE'=>1, 'TABINDEX'=>1,
'TITLE'=>1, 'ID' => 1,
'XML:LANG'=>1, 'XML:SPACE'=>1, 'XML:BASE'=>1
);
if ($withGlobal)
$other += $globalOther;
foreach (array_intersect_key($input, $other) as $k => $v)
if ($v)
$string .= ' '.mb_strtolower($k).'="'.htmlspecialcharsbx($v).'"';
// add data attributes
if ($withGlobal && isset($input['DATA']) && is_array($input['DATA']))
{
foreach ($input['DATA'] as $k => $v)
{
$string .= ' data-'.htmlspecialcharsbx($k).'="'.htmlspecialcharsbx($v).'"';
}
}
return $string;
}