476 lines
19 KiB
PHP
Executable File
476 lines
19 KiB
PHP
Executable File
<?php
|
|
|
|
/**
|
|
* @abstract
|
|
*/
|
|
class BoxPageMargin extends GenericContainerBox {
|
|
/**
|
|
* @param $at_rule CSSAtRuleMarginBox At-rule object describing margin box to be created
|
|
* @return Object Object of concrete BoxPageMargin descendant type
|
|
*/
|
|
function &create(&$pipeline, $at_rule) {
|
|
switch ($at_rule->getSelector()) {
|
|
case CSS_MARGIN_BOX_SELECTOR_TOP:
|
|
$box =& new BoxPageMarginTop($pipeline, $at_rule);
|
|
break;
|
|
case CSS_MARGIN_BOX_SELECTOR_TOP_LEFT_CORNER:
|
|
$box =& new BoxPageMarginTopLeftCorner($pipeline, $at_rule);
|
|
break;
|
|
case CSS_MARGIN_BOX_SELECTOR_TOP_LEFT:
|
|
$box =& new BoxPageMarginTopLeft($pipeline, $at_rule);
|
|
break;
|
|
case CSS_MARGIN_BOX_SELECTOR_TOP_CENTER:
|
|
$box =& new BoxPageMarginTopCenter($pipeline, $at_rule);
|
|
break;
|
|
case CSS_MARGIN_BOX_SELECTOR_TOP_RIGHT:
|
|
$box =& new BoxPageMarginTopRight($pipeline, $at_rule);
|
|
break;
|
|
case CSS_MARGIN_BOX_SELECTOR_TOP_RIGHT_CORNER:
|
|
$box =& new BoxPageMarginTopRightCorner($pipeline, $at_rule);
|
|
break;
|
|
case CSS_MARGIN_BOX_SELECTOR_BOTTOM:
|
|
$box =& new BoxPageMarginBottom($pipeline, $at_rule);
|
|
break;
|
|
case CSS_MARGIN_BOX_SELECTOR_BOTTOM_LEFT_CORNER:
|
|
$box =& new BoxPageMarginBottomLeftCorner($pipeline, $at_rule);
|
|
break;
|
|
case CSS_MARGIN_BOX_SELECTOR_BOTTOM_LEFT:
|
|
$box =& new BoxPageMarginBottomLeft($pipeline, $at_rule);
|
|
break;
|
|
case CSS_MARGIN_BOX_SELECTOR_BOTTOM_CENTER:
|
|
$box =& new BoxPageMarginBottomCenter($pipeline, $at_rule);
|
|
break;
|
|
case CSS_MARGIN_BOX_SELECTOR_BOTTOM_RIGHT:
|
|
$box =& new BoxPageMarginBottomRight($pipeline, $at_rule);
|
|
break;
|
|
case CSS_MARGIN_BOX_SELECTOR_BOTTOM_RIGHT_CORNER:
|
|
$box =& new BoxPageMarginBottomRightCorner($pipeline, $at_rule);
|
|
break;
|
|
case CSS_MARGIN_BOX_SELECTOR_LEFT_TOP:
|
|
$box =& new BoxPageMarginLeftTop($pipeline, $at_rule);
|
|
break;
|
|
case CSS_MARGIN_BOX_SELECTOR_LEFT_MIDDLE:
|
|
$box =& new BoxPageMarginLeftMiddle($pipeline, $at_rule);
|
|
break;
|
|
case CSS_MARGIN_BOX_SELECTOR_LEFT_BOTTOM:
|
|
$box =& new BoxPageMarginLeftBottom($pipeline, $at_rule);
|
|
break;
|
|
case CSS_MARGIN_BOX_SELECTOR_RIGHT_TOP:
|
|
$box =& new BoxPageMarginRightTop($pipeline, $at_rule);
|
|
break;
|
|
case CSS_MARGIN_BOX_SELECTOR_RIGHT_MIDDLE:
|
|
$box =& new BoxPageMarginRightMiddle($pipeline, $at_rule);
|
|
break;
|
|
case CSS_MARGIN_BOX_SELECTOR_RIGHT_BOTTOM:
|
|
$box =& new BoxPageMarginRightBottom($pipeline, $at_rule);
|
|
break;
|
|
default:
|
|
trigger_error("Unknown selector type", E_USER_ERROR);
|
|
};
|
|
|
|
return $box;
|
|
}
|
|
|
|
function BoxPageMargin(&$pipeline, $at_rule) {
|
|
$state =& $pipeline->getCurrentCSSState();
|
|
$state->pushDefaultState();
|
|
|
|
$root = null;
|
|
$at_rule->css->apply($root, $state, $pipeline);
|
|
|
|
$this->GenericContainerBox();
|
|
$this->readCSS($state);
|
|
|
|
$state->pushDefaultstate();
|
|
|
|
/**
|
|
* Check whether 'content' or '-html2ps-html-content' properties had been defined
|
|
* (if both properties are defined, -html2ps-html-content takes precedence)
|
|
*/
|
|
$raw_html_content =& $at_rule->getCSSProperty(CSS_HTML2PS_HTML_CONTENT);
|
|
$html_content = $raw_html_content->render($pipeline->get_counters());
|
|
|
|
if ($html_content !== '') {
|
|
// We should wrap html_content in DIV tag,
|
|
// as we treat only the very first box of the resulting DOM tree as margin box content
|
|
|
|
$html_content = html2xhtml("<div>".$html_content."</div>");
|
|
$tree = TreeBuilder::build($html_content);
|
|
$tree_root = traverse_dom_tree_pdf($tree);
|
|
$body_box =& create_pdf_box($tree_root, $pipeline);
|
|
$box =& $body_box->content[0];
|
|
} else {
|
|
$raw_content =& $at_rule->getCSSProperty(CSS_CONTENT);
|
|
$content = $raw_content->render($pipeline->get_counters());
|
|
|
|
$box =& InlineBox::create_from_text($content,
|
|
WHITESPACE_NORMAL,
|
|
$pipeline);
|
|
}
|
|
$this->add_child($box);
|
|
|
|
$state->popState();
|
|
$state->popState();
|
|
}
|
|
|
|
function get_cell_baseline() {
|
|
return 0;
|
|
}
|
|
|
|
function reflow(&$driver, &$media, $boxes) {
|
|
$context = new FlowContext;
|
|
$this->_position($media, $boxes, $context);
|
|
|
|
$this->setCSSProperty(CSS_WIDTH, new WCConstant($this->get_width()));
|
|
$this->put_height_constraint(new HCConstraint(array($this->height, false),
|
|
null,
|
|
null));
|
|
|
|
$this->reflow_content($context);
|
|
|
|
/**
|
|
* Apply vertical-align (behave like table cell)
|
|
*/
|
|
$va = CSSVerticalAlign::value2pdf($this->getCSSProperty(CSS_VERTICAL_ALIGN));
|
|
|
|
$va->apply_cell($this,$this->get_full_height(),0);
|
|
}
|
|
|
|
function show(&$driver) {
|
|
$this->offset(0, $driver->offset);
|
|
$this->show_fixed($driver);
|
|
}
|
|
|
|
function _calc_sizes($full_width, $left, $center, $right) {
|
|
$context = new FlowContext;
|
|
|
|
$left_width = $left->get_max_width($context);
|
|
$center_width = $center->get_max_width($context);
|
|
$right_width = $right->get_max_width($context);
|
|
|
|
$calculated_left_width = 0;
|
|
$calculated_center_width = 0;
|
|
$calculated_right_width = 0;
|
|
|
|
if ($center_width > 0) {
|
|
$calculated_center_width = $full_width * $center_width / ($center_width + 2*max($left_width, $right_width));
|
|
$calculated_left_width = ($full_width - $calculated_center_width) / 2;
|
|
$calculated_right_width = $calculated_left_width;
|
|
} elseif ($left_width == 0 && $right_width == 0) {
|
|
$calculated_center_width = 0;
|
|
$calculated_left_width = 0;
|
|
$calculated_right_width = 0;
|
|
} elseif ($left_width == 0) {
|
|
$calculated_center_width = 0;
|
|
$calculated_left_width = 0;
|
|
$calculated_right_width = $full_width;
|
|
} elseif ($right_width == 0) {
|
|
$calculated_center_width = 0;
|
|
$calculated_left_width = $full_width;
|
|
$calculated_right_width = 0;
|
|
} else {
|
|
$calculated_center_width = 0;
|
|
$calculated_left_width = $full_width * $left_width / ($left_width + $right_width);
|
|
$calculated_right_width = $full_width - $calculated_left_width;
|
|
};
|
|
|
|
return array($calculated_left_width,
|
|
$calculated_center_width,
|
|
$calculated_right_width);
|
|
}
|
|
}
|
|
|
|
class BoxPageMarginTop extends BoxPageMargin {
|
|
function _position($media, $boxes, $context) {
|
|
$this->put_left($this->get_extra_left() + 0);
|
|
$this->put_top(-$this->get_extra_top() +mm2pt($media->height()));
|
|
|
|
$this->put_full_width(mm2pt($media->width()));
|
|
$this->put_full_height(mm2pt($media->margins['top']));
|
|
|
|
$this->_current_x = $this->get_left();
|
|
$this->_current_y = $this->get_top();
|
|
}
|
|
}
|
|
|
|
class BoxPageMarginTopLeftCorner extends BoxPageMargin {
|
|
function _position($media, $boxes, $context) {
|
|
$this->put_left($this->get_extra_left() + 0);
|
|
$this->put_top(-$this->get_extra_top() +mm2pt($media->height()));
|
|
|
|
$this->put_full_width(mm2pt($media->margins['left']));
|
|
$this->put_full_height(mm2pt($media->margins['top']));
|
|
|
|
$this->_current_x = $this->get_left();
|
|
$this->_current_y = $this->get_top();
|
|
}
|
|
}
|
|
|
|
class BoxPageMarginTopLeft extends BoxPageMargin {
|
|
function _position($media, $boxes, $context) {
|
|
list($left, $center, $right) = $this->_calc_sizes(mm2pt($media->real_width()),
|
|
$boxes[CSS_MARGIN_BOX_SELECTOR_TOP_LEFT],
|
|
$boxes[CSS_MARGIN_BOX_SELECTOR_TOP_CENTER],
|
|
$boxes[CSS_MARGIN_BOX_SELECTOR_TOP_RIGHT]);
|
|
|
|
$this->put_left($this->get_extra_left() + mm2pt($media->margins['left']));
|
|
$this->put_top(-$this->get_extra_top() +mm2pt($media->height()));
|
|
|
|
$this->put_full_width($left);
|
|
$this->put_full_height(mm2pt($media->margins['top']));
|
|
|
|
$this->_current_x = $this->get_left();
|
|
$this->_current_y = $this->get_top();
|
|
}
|
|
}
|
|
|
|
class BoxPageMarginTopCenter extends BoxPageMargin {
|
|
function _position($media, $boxes, $context) {
|
|
list($left, $center, $right) = $this->_calc_sizes(mm2pt($media->real_width()),
|
|
$boxes[CSS_MARGIN_BOX_SELECTOR_TOP_LEFT],
|
|
$boxes[CSS_MARGIN_BOX_SELECTOR_TOP_CENTER],
|
|
$boxes[CSS_MARGIN_BOX_SELECTOR_TOP_RIGHT]);
|
|
|
|
$this->put_left($this->get_extra_left() + mm2pt($media->margins['left']) + $left);
|
|
$this->put_top(-$this->get_extra_top() +mm2pt($media->height()));
|
|
|
|
$this->put_full_width($center);
|
|
$this->put_full_height(mm2pt($media->margins['top']));
|
|
|
|
$this->_current_x = $this->get_left();
|
|
$this->_current_y = $this->get_top();
|
|
}
|
|
}
|
|
|
|
class BoxPageMarginTopRight extends BoxPageMargin {
|
|
function _position($media, $boxes, $context) {
|
|
list($left, $center, $right) = $this->_calc_sizes(mm2pt($media->real_width()),
|
|
$boxes[CSS_MARGIN_BOX_SELECTOR_TOP_LEFT],
|
|
$boxes[CSS_MARGIN_BOX_SELECTOR_TOP_CENTER],
|
|
$boxes[CSS_MARGIN_BOX_SELECTOR_TOP_RIGHT]);
|
|
|
|
$this->put_left($this->get_extra_left() + mm2pt($media->margins['left']) + $left + $center);
|
|
$this->put_top(-$this->get_extra_top() +mm2pt($media->height()));
|
|
|
|
$this->put_full_width($right);
|
|
$this->put_full_height(mm2pt($media->margins['top']));
|
|
|
|
$this->_current_x = $this->get_left();
|
|
$this->_current_y = $this->get_top();
|
|
}
|
|
}
|
|
|
|
class BoxPageMarginTopRightCorner extends BoxPageMargin {
|
|
function _position($media, $boxes, $context) {
|
|
$this->put_left($this->get_extra_left() + mm2pt($media->width() - $media->margins['right']));
|
|
$this->put_top(-$this->get_extra_top() +mm2pt($media->height()));
|
|
|
|
$this->put_full_width(mm2pt($media->margins['right']));
|
|
$this->put_full_height(mm2pt($media->margins['top']));
|
|
|
|
$this->_current_x = $this->get_left();
|
|
$this->_current_y = $this->get_top();
|
|
}
|
|
}
|
|
|
|
class BoxPageMarginBottomLeftCorner extends BoxPageMargin {
|
|
function _position($media, $boxes, $context) {
|
|
$this->put_left($this->get_extra_left() + 0);
|
|
$this->put_top(-$this->get_extra_top() +mm2pt($media->margins['bottom']));
|
|
|
|
$this->put_full_width(mm2pt($media->margins['left']));
|
|
$this->put_full_height(mm2pt($media->margins['bottom']));
|
|
|
|
$this->_current_x = $this->get_left();
|
|
$this->_current_y = $this->get_top();
|
|
}
|
|
}
|
|
|
|
class BoxPageMarginBottomLeft extends BoxPageMargin {
|
|
function _position($media, $boxes, $context) {
|
|
list($left, $center, $right) = $this->_calc_sizes(mm2pt($media->real_width()),
|
|
$boxes[CSS_MARGIN_BOX_SELECTOR_BOTTOM_LEFT],
|
|
$boxes[CSS_MARGIN_BOX_SELECTOR_BOTTOM_CENTER],
|
|
$boxes[CSS_MARGIN_BOX_SELECTOR_BOTTOM_RIGHT]);
|
|
|
|
$this->put_left($this->get_extra_left() + mm2pt($media->margins['left']));
|
|
$this->put_top(-$this->get_extra_top() +mm2pt($media->margins['bottom']));
|
|
|
|
$this->put_full_width($left);
|
|
$this->put_full_height(mm2pt($media->margins['bottom']));
|
|
|
|
$this->_current_x = $this->get_left();
|
|
$this->_current_y = $this->get_top();
|
|
}
|
|
}
|
|
|
|
class BoxPageMarginBottomCenter extends BoxPageMargin {
|
|
function _position($media, $boxes, $context) {
|
|
list($left, $center, $right) = $this->_calc_sizes(mm2pt($media->real_width()),
|
|
$boxes[CSS_MARGIN_BOX_SELECTOR_BOTTOM_LEFT],
|
|
$boxes[CSS_MARGIN_BOX_SELECTOR_BOTTOM_CENTER],
|
|
$boxes[CSS_MARGIN_BOX_SELECTOR_BOTTOM_RIGHT]);
|
|
|
|
$this->put_left($this->get_extra_left() + mm2pt($media->margins['left']) + $left);
|
|
$this->put_top(-$this->get_extra_top() +mm2pt($media->margins['bottom']));
|
|
|
|
$this->put_full_width($center);
|
|
$this->put_full_height(mm2pt($media->margins['bottom']));
|
|
|
|
$this->_current_x = $this->get_left();
|
|
$this->_current_y = $this->get_top();
|
|
}
|
|
}
|
|
|
|
class BoxPageMarginBottomRight extends BoxPageMargin {
|
|
function _position($media, $boxes, $context) {
|
|
list($left, $center, $right) = $this->_calc_sizes(mm2pt($media->real_width()),
|
|
$boxes[CSS_MARGIN_BOX_SELECTOR_BOTTOM_LEFT],
|
|
$boxes[CSS_MARGIN_BOX_SELECTOR_BOTTOM_CENTER],
|
|
$boxes[CSS_MARGIN_BOX_SELECTOR_BOTTOM_RIGHT]);
|
|
|
|
$this->put_left($this->get_extra_left() + mm2pt($media->margins['left']) + $left + $center);
|
|
$this->put_top(-$this->get_extra_top() +mm2pt($media->margins['bottom']));
|
|
|
|
$this->put_full_width($right);
|
|
$this->put_full_height(mm2pt($media->margins['bottom']));
|
|
|
|
$this->_current_x = $this->get_left();
|
|
$this->_current_y = $this->get_top();
|
|
}
|
|
}
|
|
|
|
class BoxPageMarginBottomRightCorner extends BoxPageMargin {
|
|
function _position($media, $boxes, $context) {
|
|
$this->put_left($this->get_extra_left() + mm2pt($media->width() - $media->margins['right']));
|
|
$this->put_top(-$this->get_extra_top() +mm2pt($media->margins['bottom']));
|
|
|
|
$this->put_full_width(mm2pt($media->margins['right']));
|
|
$this->put_full_height(mm2pt($media->margins['top']));
|
|
|
|
$this->_current_x = $this->get_left();
|
|
$this->_current_y = $this->get_top();
|
|
}
|
|
}
|
|
|
|
class BoxPageMarginBottom extends BoxPageMargin {
|
|
function _position($media, $boxes, $context) {
|
|
$this->put_left($this->get_extra_left() + 0);
|
|
$this->put_top(-$this->get_extra_top() +mm2pt($media->margins['bottom']));
|
|
|
|
$this->put_full_width(mm2pt($media->width()));
|
|
$this->put_full_height(mm2pt($media->margins['bottom']));
|
|
|
|
$this->_current_x = $this->get_left();
|
|
$this->_current_y = $this->get_top();
|
|
}
|
|
}
|
|
|
|
class BoxPageMarginLeftTop extends BoxPageMargin {
|
|
function _position($media, $boxes, $context) {
|
|
list($left, $center, $right) = $this->_calc_sizes(mm2pt($media->real_height()),
|
|
$boxes[CSS_MARGIN_BOX_SELECTOR_LEFT_TOP],
|
|
$boxes[CSS_MARGIN_BOX_SELECTOR_LEFT_MIDDLE],
|
|
$boxes[CSS_MARGIN_BOX_SELECTOR_LEFT_BOTTOM]);
|
|
|
|
$this->put_left($this->get_extra_left() + 0);
|
|
$this->put_top(-$this->get_extra_top() +mm2pt($media->height() - $media->margins['top']));
|
|
|
|
$this->put_full_height($left);
|
|
$this->put_full_width(mm2pt($media->margins['left']));
|
|
|
|
$this->_current_x = $this->get_left();
|
|
$this->_current_y = $this->get_top();
|
|
}
|
|
}
|
|
|
|
class BoxPageMarginLeftMiddle extends BoxPageMargin {
|
|
function _position($media, $boxes, $context) {
|
|
list($left, $center, $right) = $this->_calc_sizes(mm2pt($media->real_height()),
|
|
$boxes[CSS_MARGIN_BOX_SELECTOR_LEFT_TOP],
|
|
$boxes[CSS_MARGIN_BOX_SELECTOR_LEFT_MIDDLE],
|
|
$boxes[CSS_MARGIN_BOX_SELECTOR_LEFT_BOTTOM]);
|
|
$this->put_left($this->get_extra_left() + 0);
|
|
$this->put_top(-$this->get_extra_top() +mm2pt($media->height() - $media->margins['top']) - $left);
|
|
|
|
$this->put_full_height($center);
|
|
$this->put_full_width(mm2pt($media->margins['left']));
|
|
|
|
$this->_current_x = $this->get_left();
|
|
$this->_current_y = $this->get_top();
|
|
}
|
|
}
|
|
|
|
class BoxPageMarginLeftBottom extends BoxPageMargin {
|
|
function _position($media, $boxes, $context) {
|
|
list($left, $center, $right) = $this->_calc_sizes(mm2pt($media->real_height()),
|
|
$boxes[CSS_MARGIN_BOX_SELECTOR_LEFT_TOP],
|
|
$boxes[CSS_MARGIN_BOX_SELECTOR_LEFT_MIDDLE],
|
|
$boxes[CSS_MARGIN_BOX_SELECTOR_LEFT_BOTTOM]);
|
|
|
|
$this->put_left($this->get_extra_left() + 0);
|
|
$this->put_top(-$this->get_extra_top() +mm2pt($media->height() - $media->margins['top']) - $left - $center);
|
|
|
|
$this->put_full_height($right);
|
|
$this->put_full_width(mm2pt($media->margins['left']));
|
|
|
|
$this->_current_x = $this->get_left();
|
|
$this->_current_y = $this->get_top();
|
|
}
|
|
}
|
|
|
|
class BoxPageMarginRightTop extends BoxPageMargin {
|
|
function _position($media, $boxes, $context) {
|
|
list($left, $center, $right) = $this->_calc_sizes(mm2pt($media->real_height()),
|
|
$boxes[CSS_MARGIN_BOX_SELECTOR_RIGHT_TOP],
|
|
$boxes[CSS_MARGIN_BOX_SELECTOR_RIGHT_MIDDLE],
|
|
$boxes[CSS_MARGIN_BOX_SELECTOR_RIGHT_BOTTOM]);
|
|
|
|
$this->put_left($this->get_extra_left() + mm2pt($media->width() - $media->margins['right']));
|
|
$this->put_top(-$this->get_extra_top() +mm2pt($media->height() - $media->margins['top']));
|
|
|
|
$this->put_full_height($left);
|
|
$this->put_full_width(mm2pt($media->margins['right']));
|
|
|
|
$this->_current_x = $this->get_left();
|
|
$this->_current_y = $this->get_top();
|
|
}
|
|
}
|
|
|
|
class BoxPageMarginRightMiddle extends BoxPageMargin {
|
|
function _position($media, $boxes, $context) {
|
|
list($left, $center, $right) = $this->_calc_sizes(mm2pt($media->real_height()),
|
|
$boxes[CSS_MARGIN_BOX_SELECTOR_LEFT_TOP],
|
|
$boxes[CSS_MARGIN_BOX_SELECTOR_LEFT_MIDDLE],
|
|
$boxes[CSS_MARGIN_BOX_SELECTOR_LEFT_BOTTOM]);
|
|
|
|
$this->put_left($this->get_extra_left() + mm2pt($media->width() - $media->margins['right']));
|
|
$this->put_top(-$this->get_extra_top() +mm2pt($media->height() - $media->margins['top']) - $left);
|
|
|
|
$this->put_full_height($center);
|
|
$this->put_full_width(mm2pt($media->margins['right']));
|
|
|
|
$this->_current_x = $this->get_left();
|
|
$this->_current_y = $this->get_top();
|
|
}
|
|
}
|
|
|
|
class BoxPageMarginRightBottom extends BoxPageMargin {
|
|
function _position($media, $boxes, $context) {
|
|
list($left, $center, $right) = $this->_calc_sizes(mm2pt($media->real_height()),
|
|
$boxes[CSS_MARGIN_BOX_SELECTOR_LEFT_TOP],
|
|
$boxes[CSS_MARGIN_BOX_SELECTOR_LEFT_MIDDLE],
|
|
$boxes[CSS_MARGIN_BOX_SELECTOR_LEFT_BOTTOM]);
|
|
|
|
$this->put_left($this->get_extra_left() + mm2pt($media->width() - $media->margins['right']));
|
|
$this->put_top(-$this->get_extra_top() + mm2pt($media->height() - $media->margins['top']) - $left - $center);
|
|
|
|
$this->put_full_height($right);
|
|
$this->put_full_width(mm2pt($media->margins['right']));
|
|
|
|
$this->_current_x = $this->get_left();
|
|
$this->_current_y = $this->get_top();
|
|
}
|
|
}
|
|
|
|
?>
|