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->get_current_css_state()); 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

), 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: *

.. some text here...
); 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->get_css_property(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: *
...some text...
*/ $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; } } ?>