CrossPHP
  • Namespace
  • Class
  • Download

Namespaces

  • Cross
    • Auth
    • Cache
      • Driver
      • Request
    • Core
    • DB
      • Connecter
      • Drivers
      • SQLAssembler
    • Exception
    • Http
    • I
    • Lib
      • Document
    • Module
    • MVC
    • Runtime
  • None

Classes

  • Cross\Auth\CookieAuth
  • Cross\Auth\SessionAuth
  • Cross\Cache\Driver\FileCacheDriver
  • Cross\Cache\Driver\MemcacheDriver
  • Cross\Cache\Driver\RedisDriver
  • Cross\Cache\Request\FileCache
  • Cross\Cache\Request\Memcache
  • Cross\Cache\Request\RedisCache
  • Cross\Cache\RequestCache
  • Cross\Core\Annotate
  • Cross\Core\Application
  • Cross\Core\ArrayMap
  • Cross\Core\Config
  • Cross\Core\CrossArray
  • Cross\Core\Delegate
  • Cross\Core\FrameBase
  • Cross\Core\Helper
  • Cross\Core\HttpAuth
  • Cross\Core\Loader
  • Cross\Core\Rest
  • Cross\Core\Router
  • Cross\DB\Connecter\BaseConnecter
  • Cross\DB\Connecter\MySQLConnecter
  • Cross\DB\Connecter\PgSQLConnecter
  • Cross\DB\Connecter\SQLiteConnecter
  • Cross\DB\DBFactory
  • Cross\DB\Drivers\CouchDriver
  • Cross\DB\Drivers\MongoDriver
  • Cross\DB\Drivers\PDOSqlDriver
  • Cross\DB\SQLAssembler\MySQLAssembler
  • Cross\DB\SQLAssembler\PgSQLAssembler
  • Cross\DB\SQLAssembler\SQLAssembler
  • Cross\DB\SQLAssembler\SQLiteAssembler
  • Cross\Http\Request
  • Cross\Http\Response
  • Cross\Lib\Array2XML
  • Cross\Lib\Document\CallTree
  • Cross\Lib\Document\CallTreeToHTML
  • Cross\Lib\Document\HTML
  • Cross\Lib\StringToPHPStream
  • Cross\Module\SQLModule
  • Cross\MVC\Controller
  • Cross\MVC\Module
  • Cross\MVC\View
  • Cross\Runtime\ClosureContainer

Interfaces

  • Cross\I\CacheInterface
  • Cross\I\HttpAuthInterface
  • Cross\I\PDOConnecter
  • Cross\I\RequestCacheInterface
  • Cross\I\RouterInterface
  • Cross\I\SqlInterface

Exceptions

  • Cross\Exception\CacheException
  • Cross\Exception\CoreException
  • Cross\Exception\CrossException
  • Cross\Exception\FrontException

Functions

  • ascLogo
  • line
  • tBody
  • th
  • tHead
  1 <?php
  2 /**
  3  * Cross - a micro PHP 5 framework
  4  *
  5  * @link        http://www.crossphp.com
  6  * @license     MIT License
  7  */
  8 
  9 namespace Cross\Lib\Document;
 10 
 11 use Closure;
 12 use DOMDocument;
 13 use DOMElement;
 14 use DOMNode;
 15 
 16 /**
 17  * 把CallTree转换为HTML
 18  *
 19  * @author wonli <wonli@live.com>
 20  * Class NodeToHTML
 21  * @package Cross\Lib\Document
 22  */
 23 class CallTreeToHTML
 24 {
 25     /**
 26      * @var DOMDocument
 27      */
 28     private $dom;
 29 
 30     /**
 31      * @var DOMNode
 32      */
 33     private $element;
 34 
 35     private function __construct()
 36     {
 37         $this->dom = new DOMDocument();
 38     }
 39 
 40     static function getInstance()
 41     {
 42         return new CallTreeToHTML();
 43     }
 44 
 45     /**
 46      * 返回DOM
 47      *
 48      * @param $node
 49      * @return DOMDocument
 50      */
 51     function getDom($node)
 52     {
 53         $this->makeNode($node);
 54         $this->dom->appendChild($this->element);
 55         return $this->dom;
 56     }
 57 
 58     /**
 59      * DOM转HTML
 60      *
 61      * @param $node
 62      * @param bool $html_decode
 63      * @return string
 64      */
 65     function getHTML($node, $html_decode = true)
 66     {
 67         $dom = $this->getDom($node);
 68         $dom->encoding = 'utf-8';
 69         $html = $dom->saveHTML($dom->firstChild);
 70         if ($html_decode) {
 71             $html = html_entity_decode($html);
 72         }
 73 
 74         return $html;
 75     }
 76 
 77     /**
 78      * 把node转换为dom
 79      *
 80      * @param $node
 81      * @param DOMNode $parentElement
 82      */
 83     function makeNode($node, DOMNode $parentElement = null)
 84     {
 85         $content = null;
 86         $attr_set = array();
 87 
 88         //构造根节点
 89         if (null === $parentElement) {
 90             $root_element_name = current(array_keys($node));
 91 
 92             $node = current($node);
 93             if (isset($node[0]) && !$node[0] instanceof CallTree) {
 94                 if (is_array($node[0])) {
 95                     if (isset($node[0]['@content'])) {
 96                         $content = $node[0]['@content'];
 97                         unset($node[0]['@content']);
 98                     }
 99                     $attr_set = $node[0];
100                 } else {
101                     $content = $node[0];
102                     unset($node[0]);
103                 }
104             }
105 
106             $this->element = $this->dom->createElement($root_element_name, htmlentities($content));
107             if (!empty($attr_set)) {
108                 foreach ($attr_set as $attr_set_name => $attr_set_value) {
109                     $this->element->setAttribute($attr_set_name, $attr_set_value);
110                 }
111             }
112         }
113 
114         //为parentElement设置属性
115         if ($parentElement && isset($node[0]) && !$node[0] instanceof CallTree) {
116             if (!empty($node[0])) {
117                 foreach ($node[0] as $attr_set_name => $attr_set_value) {
118                     if ($attr_set_value instanceof Closure) {
119                         $attr_set_value = call_user_func($attr_set_value);
120                     }
121                     $parentElement->setAttribute($attr_set_name, $attr_set_value);
122                 }
123             }
124         }
125 
126         foreach ($node as $n) {
127             if (!empty($n) && $n instanceof CallTree) {
128                 $node_detail = $n->getNode();
129                 foreach ($node_detail as $element_name => $child_node) {
130 
131                     //获取当前element中的文本内容
132                     if (isset($child_node[0]) && !$child_node[0] instanceof CallTree) {
133                         if (is_array($child_node[0])) {
134                             if (isset($child_node[0]['@content'])) {
135                                 $content = $child_node[0]['@content'];
136                                 unset($child_node[0]['@content']);
137                             }
138                         } else {
139                             $content = $child_node[0];
140                             unset($child_node[0]);
141                         }
142                     }
143 
144                     $element = $this->dom->createElement($element_name, htmlentities($content));
145                     if ($parentElement instanceof DOMElement) {
146                         $current_element = $parentElement->appendChild($element);
147                     } else {
148                         $current_element = $this->element->appendChild($element);
149                     }
150 
151                     if (!empty($child_node)) {
152                         $this->makeNode($child_node, $current_element);
153                     }
154                 }
155             }
156         }
157     }
158 }
159 
CrossPHP API documentation generated by ApiGen