123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209 |
- <?php
- /**
- * DOMPDF - PHP5 HTML to PDF renderer
- *
- * File: $RCSfile: frame_factory.cls.php,v $
- * Created on: 2004-06-17
- *
- * 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: frame_factory.cls.php 216 2010-03-11 22:49:18Z ryan.masten $ */
- /**
- * Contains frame decorating logic
- *
- * This class is responsible for assigning the correct {@link Frame_Decorator},
- * {@link Positioner}, and {@link Frame_Reflower} objects to {@link Frame}
- * objects. This is determined primarily by the Frame's display type, but
- * also by the Frame's node's type (e.g. DomElement vs. #text)
- *
- * @access private
- * @package dompdf
- */
- class Frame_Factory {
- static function decorate_root(Frame $root, DOMPDF $dompdf) {
- $frame = new Page_Frame_Decorator($root, $dompdf);
- $frame->set_reflower( new Page_Frame_Reflower($frame) );
- $root->set_decorator($frame);
- return $frame;
- }
- // FIXME: this is admittedly a little smelly...
- static function decorate_frame(Frame $frame, $dompdf) {
- if ( is_null($dompdf) )
- throw new Exception("foo");
- switch ($frame->get_style()->display) {
-
- case "block":
- $positioner = "Block";
- $decorator = "Block";
- $reflower = "Block";
- break;
-
- case "inline-block":
- $positioner = "Inline";
- $decorator = "Block";
- $reflower = "Block";
- break;
- case "inline":
- $positioner = "Inline";
- if ( $frame->get_node()->nodeName === "#text" ) {
- $decorator = "Text";
- $reflower = "Text";
- } else {
- $decorator = "Inline";
- $reflower = "Inline";
- }
- break;
- case "table":
- $positioner = "Block";
- $decorator = "Table";
- $reflower = "Table";
- break;
-
- case "inline-table":
- $positioner = "Inline";
- $decorator = "Table";
- $reflower = "Table";
- break;
- case "table-row-group":
- case "table-header-group":
- case "table-footer-group":
- $positioner = "Null";
- $decorator = "Table_Row_Group";
- $reflower = "Table_Row_Group";
- break;
-
- case "table-row":
- $positioner = "Null";
- $decorator = "Table_Row";
- $reflower = "Table_Row";
- break;
- case "table-cell":
- $positioner = "Table_Cell";
- $decorator = "Table_Cell";
- $reflower = "Table_Cell";
- break;
-
- case "list-item":
- $positioner = "Block";
- $decorator = "Block";
- $reflower = "Block";
- break;
- case "-dompdf-list-bullet":
- if ( $frame->get_style()->list_style_position === "inside" )
- $positioner = "Inline";
- else
- $positioner = "List_Bullet";
- if ( $frame->get_style()->list_style_image !== "none" )
- $decorator = "List_Bullet_Image";
- else
- $decorator = "List_Bullet";
-
- $reflower = "List_Bullet";
- break;
- case "-dompdf-image":
- $positioner = "Inline";
- $decorator = "Image";
- $reflower = "Image";
- break;
-
- case "-dompdf-br":
- $positioner = "Inline";
- $decorator = "Inline";
- $reflower = "Inline";
- break;
- default:
- // FIXME: should throw some sort of warning or something?
- case "none":
- $positioner = "Null";
- $decorator = "Null";
- $reflower = "Null";
- break;
- }
- if ( $frame->get_style()->position === "absolute" ||
- $frame->get_style()->position === "fixed" )
- $positioner = "Absolute";
-
- $positioner .= "_Positioner";
- $decorator .= "_Frame_Decorator";
- $reflower .= "_Frame_Reflower";
- $deco = new $decorator($frame, $dompdf);
- $deco->set_positioner( new $positioner($deco) );
- $reflow = new $reflower($deco);
-
- // Generated content is a special case
- if ( $frame->get_node()->nodeName === "_dompdf_generated" ) {
- // Decorate the reflower
- $gen = new Generated_Frame_Reflower( $deco );
- $gen->set_reflower( $reflow );
- $reflow = $gen;
- }
-
- $deco->set_reflower( $reflow );
- // Images are a special case
- // if ( $frame->get_node()->nodeName === "img" ) {
- // // FIXME: This is a hack
- // $node =$frame->get_node()->ownerDocument->createElement("img_sub");
- // $node->setAttribute("src", $frame->get_node()->getAttribute("src"));
-
- // $img_frame = new Frame( $node );
- // $style = $frame->get_style()->get_stylesheet()->create_style();
- // $style->inherit($frame->get_style());
- // $img_frame->set_style( $style );
- // $img_deco = new Image_Frame_Decorator($img_frame, $dompdf);
- // $img_deco->set_reflower( new Image_Frame_Reflower($img_deco) );
- // $deco->append_child($img_deco);
- // }
-
- return $deco;
- }
-
- }
|