pQuery\HtmlFormatter::format_html PHP Метод

format_html() публичный Метод

Formats HTML
public format_html ( DomNode &$root, boolean $recursive = null )
$root DomNode
$recursive boolean
    function format_html(&$root, $recursive = null)
    {
        if ($recursive === null) {
            $recursive = true;
            self::minify_html($root);
        } elseif (is_int($recursive)) {
            $recursive = $recursive > 1 ? $recursive - 1 : false;
        }
        $root_tag = strtolower($root->tag);
        $in_block = isset($this->block_elements[$root_tag]) && $this->block_elements[$root_tag]['as_block'];
        $child_count = count($root->children);
        if (isset($this->options['attributes_case']) && $this->options['attributes_case']) {
            $root->attributes = array_change_key_case($root->attributes, $this->options['attributes_case']);
            $root->attributes_ns = null;
        }
        if (isset($this->options['sort_attributes']) && $this->options['sort_attributes']) {
            if ($this->options['sort_attributes'] === 'reverse') {
                krsort($root->attributes);
            } else {
                ksort($root->attributes);
            }
        }
        if ($root->select(':element', true, false, true)) {
            $root->setTag(strtolower($root->tag), true);
            if ($this->options['img_alt'] !== null && $root_tag === 'img' && !isset($root->alt)) {
                $root->setAttribute('alt', $this->options['img_alt']);
            }
        }
        if ($this->options['self_close_str'] !== null) {
            $root->self_close_str = $this->options['self_close_str'];
        }
        if ($this->options['attribute_shorttag'] !== null) {
            $root->attribute_shorttag = $this->options['attribute_shorttag'];
        }
        $prev = null;
        $n_tag = '';
        //		$prev_tag = '';
        $as_block = false;
        $prev_asblock = false;
        for ($i = 0; $i < $child_count; $i++) {
            $n =& $root->children[$i];
            $indent = $n->indent();
            if (!$n->isText()) {
                $n_tag = strtolower($n->tag);
                $new_line = isset($this->block_elements[$n_tag]) && $this->block_elements[$n_tag]['new_line'];
                $as_block = isset($this->block_elements[$n_tag]) && $this->block_elements[$n_tag]['as_block'];
                $format_inside = !isset($this->block_elements[$n_tag]) || $this->block_elements[$n_tag]['format_inside'];
                if ($prev && $prev->isText() && $prev->text && ($char = $prev->text[strlen($prev->text) - 1]) && isset($this->whitespace[$char])) {
                    if ($this->whitespace[$char]) {
                        $prev->text .= str_repeat($this->indent_string, $indent);
                    } else {
                        $prev->text = substr_replace($prev->text, $this->linebreak_string . str_repeat($this->indent_string, $indent), -1, 1);
                    }
                } elseif ($new_line || $prev_asblock || $in_block && $i === 0) {
                    if ($prev && $prev->isText()) {
                        $prev->text .= $this->linebreak_string . str_repeat($this->indent_string, $indent);
                    } else {
                        $root->addText($this->linebreak_string . str_repeat($this->indent_string, $indent), $i);
                        ++$child_count;
                    }
                }
                if ($format_inside && count($n->children)) {
                    //$last = end($n->children);
                    $last = $n->children[count($n->children) - 1];
                    $last_tag = $last ? strtolower($last->tag) : '';
                    $last_asblock = $last_tag && isset($this->block_elements[$last_tag]) && $this->block_elements[$last_tag]['as_block'];
                    if ($n->childCount(true) > 0 || trim($n->getPlainText())) {
                        if ($last && $last->isText() && $last->text && ($char = $last->text[strlen($last->text) - 1]) && isset($this->whitespace[$char])) {
                            if ($as_block || $last->index() > 0 || isset($this->whitespace[$last->text[0]])) {
                                if ($this->whitespace[$char]) {
                                    $last->text .= str_repeat($this->indent_string, $indent);
                                } else {
                                    $last->text = substr_replace($last->text, $this->linebreak_string . str_repeat($this->indent_string, $indent), -1, 1);
                                }
                            }
                        } elseif (($as_block || $last_asblock || $in_block && $i === 0) && $last) {
                            if ($last && $last->isText()) {
                                $last->text .= $this->linebreak_string . str_repeat($this->indent_string, $indent);
                            } else {
                                $n->addText($this->linebreak_string . str_repeat($this->indent_string, $indent));
                            }
                        }
                    } elseif (!trim($n->getInnerText())) {
                        $n->clear();
                    }
                    if ($recursive) {
                        $this->format_html($n, $recursive);
                    }
                }
            } elseif (trim($n->text) && ($i - 1 < $child_count && ($char = $n->text[0]) && isset($this->whitespace[$char]) || $in_block && $i === 0)) {
                if (isset($this->whitespace[$char])) {
                    if ($this->whitespace[$char]) {
                        $n->text = str_repeat($this->indent_string, $indent) . $n->text;
                    } else {
                        $n->text = substr_replace($n->text, $this->linebreak_string . str_repeat($this->indent_string, $indent), 0, 1);
                    }
                } else {
                    $n->text = $this->linebreak_string . str_repeat($this->indent_string, $indent) . $n->text;
                }
            }
            $prev = $n;
            //			$prev_tag = $n_tag;
            $prev_asblock = $as_block;
        }
        return true;
    }