var a = "";
*
*
*
* Change "< " to "< "
*
* Does Not:
* Change poorly formatted html attributes
* Fix self closing tags
* Handle use of inline regular expressions in javascript
*
* To Do
* Parse Error Handling
* What to do with content after last tag?
*
*/
class HTML extends \gp\tool\Editing\HTMLParse{
public $result = '';
public $empty_attributes = array('checked'=>1,
'compact'=>1,
'declare'=>1,
'defer'=>1,
'disabled'=>1,
'ismap'=>1,
'multiple'=>1,
'nohref'=>1,
'noresize'=>1,
'noshade'=>1,
'nowrap'=>1,
'readonly'=>1,
'selected'=>1);
public $self_closing_tags = array('img'=>1,
'input'=>1,
'area'=>1,
'br'=>1,
'hr'=>1,
'link'=>1
);
public $required_attr = array(
'area'=> array('alt'=>''),
'bdo'=> array('dir'=>''),
'form'=> array('action'=>''),
'img'=> array('src'=>'','alt'=>''),
'map'=> array('name'=>''),
'meta'=> array('content'=>''),
'optgroup'=> array('label'=>''),
'param'=> array('name'=>''),
'script'=> array(),
'style'=> array('type'=>''),
'textarea'=> array('cols'=>'','rows'=>'')
);
public function __construct($text){
parent::__construct($text);
$this->dom_array = \gp\tool\Plugins::Filter('Html_Output',array($this->dom_array));
$this->Clean();
$this->Rebuild();
}
/*
* Make sure certain cms elements aren't copied into the html of pages
*
* a.find('.editable_area').removeAttr('class').removeAttr('id');
a.find('.ExtraEditLink').removeAttr('class').removeAttr('id');
a.find('.ExtraEditLnks').removeAttr('class').removeAttr('id');
a.find('.gp_nosave').remove();
*
*/
public function Clean(){
$no_save_level = 0;
$no_save_levels = array();
foreach($this->dom_array as $key => $dom_element){
if( $no_save_level > 0 ){
if( is_array($dom_element) && isset($dom_element['tag']) ){
$tag = $dom_element['tag'];
if( $tag{0} == '/' ){
$tag_check = substr($tag,1);
if( $no_save_levels[$no_save_level] == $tag_check ){
array_pop($no_save_levels);
$no_save_level--;
}else{
//error?
//msg('end tag not in no_save_levels');
}
}elseif( !isset($this->self_closing_tags[$tag]) ){
$no_save_level++;
$no_save_levels[$no_save_level] = $tag;
}
}
$this->dom_array[$key] = false;
continue;
}
if( !is_array($dom_element) ){
continue;
}
if( isset($dom_element['attributes']) && is_array($dom_element['attributes']) ){
//remove classes used by cms
if( isset($dom_element['attributes']['class']) ){
$class = ' '.$dom_element['attributes']['class'].' ';
$cms_element = false;
if( strpos($class,' editable_area ') !== false ){
$cms_element = true;
}elseif( strpos($class,' ExtraEditLink ') !== false ){
$cms_element = true;
}elseif( strpos($class,' ExtraEditLnks ') !== false ){
$cms_element = true;
}
if( $cms_element ){
unset($this->dom_array[$key]['attributes']['class']);
unset($this->dom_array[$key]['attributes']['id']);
}
if( strpos($class,' gp_nosave ') !== false ){
$no_save_level = 1;
$no_save_levels[1] = $dom_element['tag'];
$this->dom_array[$key] = false;
}
}
//remove javascript from links
if( isset($dom_element['attributes']['href']) ){
$href = $dom_element['attributes']['href'];
if( stripos(ltrim($href),'javascript') === 0 ){
$this->dom_array[$key]['attributes']['href'] = '';
}
if( stripos(ltrim($href),'vbscript') === 0 ){
$this->dom_array[$key]['attributes']['href'] = '';
}
}
}
}
}
/**
* Rebuild the html content from the $dom_array
*
*/
public function Rebuild(){
$this->result = '';
$open_tags = array();
foreach($this->dom_array as $dom_element){
if( $dom_element === false ){
continue;
}
if( !is_array($dom_element) ){
$this->result .= $dom_element;
continue;
}
if( isset($dom_element['comment']) ){
$this->result .= '';
continue;
}
if( isset($dom_element['tag']) ){
$this->result .= $this->BuildTag($dom_element);
}
}
}
/**
* Rebuild an html tag
*
*/
public function BuildTag($dom_element){
$tag = strtolower($dom_element['tag']);
$result = '<'.$tag;
if( isset($dom_element['attributes']) && is_array($dom_element['attributes']) ){
$result .= $this->BuildAttributes($tag, $dom_element);
}
if( isset($this->self_closing_tags[$tag]) ){
$result .= ' />';
}elseif( isset($dom_element['self_closing']) && $dom_element['self_closing'] ){
$result .= ' />';
}else{
$result .= '>';
}
return $result;
}
/**
* Rebuild a list of attributes
*
*/
public function BuildAttributes($tag, $dom_element){
$result = '';
if( isset($this->required_attr[$tag]) && is_array($this->required_attr[$tag]) ){
$dom_element['attributes'] += $this->required_attr[$tag];
}
foreach($dom_element['attributes'] as $attr_name => $attr_value){
if( is_null($attr_value) || isset($this->empty_attributes[$attr_name]) ){
$result .= ' '.$attr_name;
continue;
}
$result .= ' '.strtolower($attr_name).'="'.$this->htmlspecialchars($attr_value).'"';
}
return $result;
}
public function htmlspecialchars($text){
return htmlspecialchars($text,ENT_COMPAT,'UTF-8',false);
}
}