123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236 |
- <?php
- /**
- * DOMPDF - PHP5 HTML to PDF renderer
- *
- * File: $RCSfile: renderer.cls.php,v $
- * Created on: 2004-06-03
- *
- * Copyright (c) 2004 - Benj Carson <benjcarson@digitaljunkies.ca>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this library in the file LICENSE.LGPL; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- * 02111-1307 USA
- *
- * Alternatively, you may distribute this software under the terms of the
- * PHP License, version 3.0 or later. A copy of this license should have
- * been distributed with this file in the file LICENSE.PHP . If this is not
- * the case, you can obtain a copy at http://www.php.net/license/3_0.txt.
- *
- * The latest version of DOMPDF might be available at:
- * http://www.dompdf.com/
- *
- * @link http://www.dompdf.com/
- * @copyright 2004 Benj Carson
- * @author Benj Carson <benjcarson@digitaljunkies.ca>
- * @package dompdf
- */
- /* $Id: renderer.cls.php 217 2010-03-11 23:03:57Z ryan.masten $ */
- /**
- * Concrete renderer
- *
- * Instantiates several specific renderers in order to render any given
- * frame.
- *
- * @access private
- * @package dompdf
- */
- class Renderer extends Abstract_Renderer {
- /**
- * Array of renderers for specific frame types
- *
- * @var array
- */
- protected $_renderers;
-
- /**
- * Cache of the callbacks array
- *
- * @var array
- */
- private $_callbacks;
-
- /**
- * Advance the canvas to the next page
- */
- function new_page() {
- $this->_canvas->new_page();
- }
- /**
- * Render frames recursively
- *
- * @param Frame $frame the frame to render
- */
- function render(Frame $frame) {
- global $_dompdf_debug;
- if ( $_dompdf_debug ) {
- echo $frame;
- flush();
- }
- $display = $frame->get_style()->display;
-
- switch ($display) {
-
- case "block":
- case "list-item":
- case "inline-block":
- case "table":
- case "table-row-group":
- case "table-header-group":
- case "table-footer-group":
- case "inline-table":
- $this->_render_frame("block", $frame);
- break;
- case "inline":
- if ( $frame->get_node()->nodeName === "#text" )
- $this->_render_frame("text", $frame);
- else
- $this->_render_frame("inline", $frame);
- break;
- case "table-cell":
- $this->_render_frame("table-cell", $frame);
- break;
- case "-dompdf-list-bullet":
- $this->_render_frame("list-bullet", $frame);
- break;
- case "-dompdf-image":
- $this->_render_frame("image", $frame);
- break;
-
- case "none":
- $node = $frame->get_node();
-
- if ( $node->nodeName === "script" ) {
- if ( $node->getAttribute("type") === "text/php" ||
- $node->getAttribute("language") === "php" ) {
- // Evaluate embedded php scripts
- $this->_render_frame("php", $frame);
- }
-
- elseif ( $node->getAttribute("type") === "text/javascript" ||
- $node->getAttribute("language") === "javascript" ) {
- // Insert JavaScript
- $this->_render_frame("javascript", $frame);
- }
- }
- // Don't render children, so skip to next iter
- return;
-
- default:
- break;
- }
- // Check for begin frame callback
- $this->_check_callbacks("begin_frame", $frame);
-
- foreach ($frame->get_children() as $child)
- $this->render($child);
- // Check for end frame callback
- $this->_check_callbacks("end_frame", $frame);
-
- }
-
- /**
- * Check for callbacks that need to be performed when a given event
- * gets triggered on a frame
- *
- * @param string $event the type of event
- * @param Frame $frame the frame that event is triggered on
- */
- protected function _check_callbacks($event, $frame) {
- if (!isset($this->_callbacks)) {
- $this->_callbacks = $this->_dompdf->get_callbacks();
- }
-
- if (is_array($this->_callbacks) && isset($this->_callbacks[$event])) {
- $info = array(0 => $this->_canvas, "canvas" => $this->_canvas,
- 1 => $frame, "frame" => $frame);
- $fs = $this->_callbacks[$event];
- foreach ($fs as $f) {
- if (is_callable($f)) {
- if (is_array($f)) {
- $f[0]->$f[1]($info);
- } else {
- $f($info);
- }
- }
- }
- }
- }
- /**
- * Render a single frame
- *
- * Creates Renderer objects on demand
- *
- * @param string $type type of renderer to use
- * @param Frame $frame the frame to render
- */
- protected function _render_frame($type, $frame) {
- if ( !isset($this->_renderers[$type]) ) {
-
- switch ($type) {
- case "block":
- $this->_renderers["block"] = new Block_Renderer($this->_dompdf);
- break;
- case "inline":
- $this->_renderers["inline"] = new Inline_Renderer($this->_dompdf);
- break;
- case "text":
- $this->_renderers["text"] = new Text_Renderer($this->_dompdf);
- break;
- case "image":
- $this->_renderers["image"] = new Image_Renderer($this->_dompdf);
- break;
-
- case "table-cell":
- $this->_renderers["table-cell"] = new Table_Cell_Renderer($this->_dompdf);
- break;
- case "list-bullet":
- $this->_renderers["list-bullet"] = new List_Bullet_Renderer($this->_dompdf);
- break;
- case "php":
- $this->_renderers["php"] = new PHP_Evaluator($this->_canvas);
- break;
- case "javascript":
- $this->_renderers["javascript"] = new Javascript_Embedder($this->_dompdf);
- break;
-
- }
- }
-
- $this->_renderers[$type]->render($frame);
- }
- }
|