Files
luos/thirdparty/html2ps_pdf/box.br.php
Paula Quispe 9eb7d6cac2 HOR-2689
2017-08-03 17:00:30 -04:00

201 lines
6.1 KiB
PHP

<?php
// $Header: /cvsroot/html2ps/box.br.php,v 1.31 2006/11/11 13:43:51 Konstantin Exp $
require_once(HTML2PS_DIR.'layout.vertical.php');
/**
* @package HTML2PS
* @subpackage Document
*
* Class defined in this file handles the layout of "BR" HTML elements
*/
/**
* @package HTML2PS
* @subpackage Document
*
* The BRBox class dessribed the behavior of the BR HTML elements
*
* @link http://www.w3.org/TR/html4/struct/text.html#edef-BR HTML 4.01 Forcing a line break: the BR element
*/
class BRBox extends GenericBox {
/**
* Create new BR element
*/
function BRBox() {
$this->GenericBox();
}
function apply_clear($y, &$context) {
return LayoutVertical::apply_clear($this, $y, $context);
}
function out_of_flow() {
return true;
}
function readCSS(&$state) {
parent::readCSS($state);
/**
* We treat BR as a block box; as default value of 'display' property is not 'block', we should
* set it up manually.
*/
$this->setCSSProperty(CSS_DISPLAY, 'block');
$this->_readCSS($state,
array(CSS_CLEAR));
$this->_readCSSLengths($state,
array(CSS_MARGIN,
CSS_LINE_HEIGHT));
}
/**
* Create new BR element
*
* @return BRBox new BR element object
*/
function &create(&$pipeline) {
$box =& new BRBox();
$box->readCSS($pipeline->getCurrentCSSState());
return $box;
}
/**
* BR tags do not take any horizontal space, so if minimal width is zero.
*
* @param FlowContext $context The object containing auxiliary flow data; not used here/
*
* @return int should always return constant zero.
*/
function get_min_width(&$context) {
return 0;
}
/**
* BR tags do not take any horizontal space, so if maximal width is zero.
*
* @param FlowContext $context The object containing auxiliary flow data; not used here.
*
* @return int should always return constant zero.
*/
function get_max_width(&$context) {
return 0;
}
/**
* Layout current BR element. The reflow routine is somewhat similar to the block box reflow routine.
* As most CSS properties do not apply to BR elements, and BR element always have parent element,
* the routine is much simpler.
*
* @param GenericContainerBox $parent The document element which should be treated as the parent of current element
* @param FlowContext $context The flow context containing the additional layout data
*
* @see FlowContext
* @see GenericContainerBox
*/
function reflow(&$parent, &$context) {
parent::reflow($parent, $context);
/**
* Apply 'clear' property; the current Y coordinate can be modified as a result of 'clear'.
*/
$y = $this->apply_clear($parent->_current_y, $context);
/**
* Move current "box" to parent current coordinates. It is REQUIRED, in spite of the generated
* box itself have no dimensions and will never be drawn, as several other routines uses box coordinates.
*/
$this->put_left($parent->_current_x);
$this->put_top($y);
/**
* If we met a sequence of BR tags (like <BR><BR>), we'll have an only one item in the parent's
* line box - whitespace; in this case we'll need to additionally offset current y coordinate by the font size,
* as whitespace alone does not affect the Y-coordinate.
*/
if ($parent->line_box_empty()) {
/**
* There's no elements in the parent line box at all (e.g in the following situation:
* <div><br/> .. some text here...</div>); thus, as we're initiating
* a new line, we need to offset current Y coordinate by the font-size value.
*/
// Note that _current_y should be modified before 'close_line' call, as it checks for
// left-floating boxes, causing an issues if line bottom will be placed below
// float while line top is above float bottom margin
$font = $this->getCSSProperty(CSS_FONT);
$fs = $font->size;
$parent->_current_y = min($this->get_bottom(),
$parent->_current_y - $font->line_height->apply($fs->getPoints()));
$parent->close_line($context, true);
} else {
/**
* There's at least 1 non-whitespace element in the parent line box, we do not need to use whitespace
* height; the bottom of the line box is defined by the non-whitespace elements. Top of the new line
* should be equal to that value.
*/
$parent->close_line($context, true);
};
/**
* We need to explicitly extend the parent's height, to make it contain the generated line,
* as we don't know if it have any children _after_ this BR box. If we will not do it,
* the following code will be rendred incorrectly:
* <div>...some text...<br/></div>
*/
$parent->extend_height($parent->_current_y);
}
/**
* Render the BR element; as BR element is non-visual, we do nothing here.
*
* @param OutputDriver $driver Current output device driver object.
*
* @return boolean true in case the box was successfully rendered
*/
function show(&$driver) {
return true;
}
/**
* As BR element generated a line break, it means that a new line box will be started
* (thus, any whitespaces immediately following the BR tag should not be rendered).
* To indicate this, we reset the linebox_started flag to 'false' value.
*
* @param boolean $linebox_started Flag indicating that a new line box have just started and it already contains
* some inline elements
* @param boolean $previous_whitespace Flag indicating that a previous inline element was an whitespace element.
*
* @see GenericFormattedBox::reflow_whitespace()
*/
function reflow_whitespace(&$linebox_started, &$previous_whitespace) {
$linebox_started = false;
}
function get_height() {
return 0;
}
function get_width() {
return 0;
}
/**
* BRBox may be placed inside InlineBox (white-space: pre)
*/
function get_ascender() {
return 0;
}
function get_descender() {
return 0;
}
function isLineBreak() {
return true;
}
}
?>