PluginProbe
MBE eShip / trunk
MBE eShip vtrunk
2.8.1 trunk 1.0.0 1.1.0 1.1.3 1.2.1 1.2.2 1.3.0 1.4.0 1.4.1 1.5.0 1.5.1 1.5.2 1.6.0 1.7.0 1.7.1 2.0.0 2.0.1 2.0.2 2.0.3 2.0.4 2.1.0 2.1.1 2.1.2 2.2.1 All 37 releases
mail-boxes-etc / lib / dompdf / src / Frame / Factory.php

Factory.php in MBE eShip trunk, at lib/dompdf/src/Frame/Factory.php

264 lines 8.0 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * @package dompdf
4 * @link https://github.com/dompdf/dompdf
5 * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
6 */
7 namespace Dompdf\Frame;
8
9 use Dompdf\Dompdf;
10 use Dompdf\Exception;
11 use Dompdf\Frame;
12 use Dompdf\FrameDecorator\AbstractFrameDecorator;
13 use DOMXPath;
14 use Dompdf\FrameDecorator\Page as PageFrameDecorator;
15 use Dompdf\FrameReflower\Page as PageFrameReflower;
16 use Dompdf\Positioner\AbstractPositioner;
17
18 /**
19 * Contains frame decorating logic
20 *
21 * This class is responsible for assigning the correct {@link AbstractFrameDecorator},
22 * {@link AbstractPositioner}, and {@link AbstractFrameReflower} objects to {@link Frame}
23 * objects. This is determined primarily by the Frame's display type, but
24 * also by the Frame's node's type (e.g. DomElement vs. #text)
25 *
26 * @package dompdf
27 */
28 class Factory
29 {
30
31 /**
32 * Array of positioners for specific frame types
33 *
34 * @var AbstractPositioner[]
35 */
36 protected static $_positioners;
37
38 /**
39 * Decorate the root Frame
40 *
41 * @param $root Frame The frame to decorate
42 * @param $dompdf Dompdf The dompdf instance
43 *
44 * @return PageFrameDecorator
45 */
46 static function decorate_root(Frame $root, Dompdf $dompdf)
47 {
48 $frame = new PageFrameDecorator($root, $dompdf);
49 $frame->set_reflower(new PageFrameReflower($frame));
50 $root->set_decorator($frame);
51
52 return $frame;
53 }
54
55 /**
56 * Decorate a Frame
57 *
58 * @param Frame $frame The frame to decorate
59 * @param Dompdf $dompdf The dompdf instance
60 * @param Frame $root The root of the frame
61 *
62 * @throws Exception
63 * @return AbstractFrameDecorator
64 * FIXME: this is admittedly a little smelly...
65 */
66 static function decorate_frame(Frame $frame, Dompdf $dompdf, Frame $root = null)
67 {
68 $style = $frame->get_style();
69 $display = $style->display;
70
71 switch ($display) {
72
73 case "block":
74 $positioner = "Block";
75 $decorator = "Block";
76 $reflower = "Block";
77 break;
78
79 case "inline-block":
80 $positioner = "Inline";
81 $decorator = "Block";
82 $reflower = "Block";
83 break;
84
85 case "inline":
86 $positioner = "Inline";
87 if ($frame->is_text_node()) {
88 $decorator = "Text";
89 $reflower = "Text";
90 } else {
91 $decorator = "Inline";
92 $reflower = "Inline";
93 }
94 break;
95
96 case "table":
97 $positioner = "Block";
98 $decorator = "Table";
99 $reflower = "Table";
100 break;
101
102 case "inline-table":
103 $positioner = "Inline";
104 $decorator = "Table";
105 $reflower = "Table";
106 break;
107
108 case "table-row-group":
109 case "table-header-group":
110 case "table-footer-group":
111 $positioner = "NullPositioner";
112 $decorator = "TableRowGroup";
113 $reflower = "TableRowGroup";
114 break;
115
116 case "table-row":
117 $positioner = "NullPositioner";
118 $decorator = "TableRow";
119 $reflower = "TableRow";
120 break;
121
122 case "table-cell":
123 $positioner = "TableCell";
124 $decorator = "TableCell";
125 $reflower = "TableCell";
126 break;
127
128 case "list-item":
129 $positioner = "Block";
130 $decorator = "Block";
131 $reflower = "Block";
132 break;
133
134 case "-dompdf-list-bullet":
135 if ($style->list_style_position === "inside") {
136 $positioner = "Inline";
137 } else {
138 $positioner = "ListBullet";
139 }
140
141 if ($style->list_style_image !== "none") {
142 $decorator = "ListBulletImage";
143 } else {
144 $decorator = "ListBullet";
145 }
146
147 $reflower = "ListBullet";
148 break;
149
150 case "-dompdf-image":
151 $positioner = "Inline";
152 $decorator = "Image";
153 $reflower = "Image";
154 break;
155
156 case "-dompdf-br":
157 $positioner = "Inline";
158 $decorator = "Inline";
159 $reflower = "Inline";
160 break;
161
162 default:
163 case "none":
164 if ($style->_dompdf_keep !== "yes") {
165 // Remove the node and the frame
166 $frame->get_parent()->remove_child($frame);
167 return;
168 }
169
170 $positioner = "NullPositioner";
171 $decorator = "NullFrameDecorator";
172 $reflower = "NullFrameReflower";
173 break;
174 }
175
176 // Handle CSS position
177 $position = $style->position;
178
179 if ($position === "absolute") {
180 $positioner = "Absolute";
181 } else {
182 if ($position === "fixed") {
183 $positioner = "Fixed";
184 }
185 }
186
187 $node = $frame->get_node();
188
189 // Handle nodeName
190 if ($node->nodeName === "img") {
191 $style->set_prop("display", "-dompdf-image");
192 $decorator = "Image";
193 $reflower = "Image";
194 }
195
196 $decorator = "Dompdf\\FrameDecorator\\$decorator";
197 $reflower = "Dompdf\\FrameReflower\\$reflower";
198
199 /** @var AbstractFrameDecorator $deco */
200 $deco = new $decorator($frame, $dompdf);
201
202 $deco->set_positioner(self::getPositionerInstance($positioner));
203 $deco->set_reflower(new $reflower($deco, $dompdf->getFontMetrics()));
204
205 if ($root) {
206 $deco->set_root($root);
207 }
208
209 if ($display === "list-item") {
210 // Insert a list-bullet frame
211 $xml = $dompdf->getDom();
212 $bullet_node = $xml->createElement("bullet"); // arbitrary choice
213 $b_f = new Frame($bullet_node);
214
215 $node = $frame->get_node();
216 $parent_node = $node->parentNode;
217 if ($parent_node && $parent_node instanceof \DOMElement) {
218 if (!$parent_node->hasAttribute("dompdf-children-count")) {
219 $xpath = new DOMXPath($xml);
220 $count = $xpath->query("li", $parent_node)->length;
221 $parent_node->setAttribute("dompdf-children-count", $count);
222 }
223
224 if (is_numeric($node->getAttribute("value"))) {
225 $index = intval($node->getAttribute("value"));
226 } else {
227 if (!$parent_node->hasAttribute("dompdf-counter")) {
228 $index = ($parent_node->hasAttribute("start") ? $parent_node->getAttribute("start") : 1);
229 } else {
230 $index = (int)$parent_node->getAttribute("dompdf-counter") + 1;
231 }
232 }
233
234 $parent_node->setAttribute("dompdf-counter", $index);
235 $bullet_node->setAttribute("dompdf-counter", $index);
236 }
237
238 $new_style = $dompdf->getCss()->create_style();
239 $new_style->set_prop("display", "-dompdf-list-bullet");
240 $new_style->inherit($style);
241 $b_f->set_style($new_style);
242
243 $deco->prepend_child(Factory::decorate_frame($b_f, $dompdf, $root));
244 }
245
246 return $deco;
247 }
248
249 /**
250 * Creates Positioners
251 *
252 * @param string $type type of positioner to use
253 * @return AbstractPositioner
254 */
255 protected static function getPositionerInstance($type)
256 {
257 if (!isset(self::$_positioners[$type])) {
258 $class = '\\Dompdf\\Positioner\\'.$type;
259 self::$_positioners[$type] = new $class();
260 }
261 return self::$_positioners[$type];
262 }
263 }
264