readCSS($pipeline->get_current_css_state()); /** * Create text box containing item number */ $css_state =& $pipeline->get_current_css_state(); $css_state->pushState(); // $css_state->set_property(CSS_COLOR, CSSColor::parse('transparent')); $list_style = $css_state->get_property(CSS_LIST_STYLE); $box->str_number_box = TextBox::create(CSSListStyleType::format_number($list_style->type, $css_state->get_property(CSS_HTML2PS_LIST_COUNTER)).". ", 'iso-8859-1', $pipeline); $box->str_number_box->readCSS($pipeline->get_current_css_state()); $box->str_number_box->baseline = $box->str_number_box->default_baseline; $css_state->popState(); /** * Create nested items */ $box->create_content($root, $pipeline); return $box; } function readCSS(&$state) { parent::readCSS($state); $this->_readCSS($state, array(CSS_LIST_STYLE)); // Pseudo-CSS properties // '-list-counter' // increase counter value $value = $state->get_property(CSS_HTML2PS_LIST_COUNTER) + 1; $state->set_property(CSS_HTML2PS_LIST_COUNTER, $value); $state->set_property_on_level(CSS_HTML2PS_LIST_COUNTER, CSS_PROPERTY_LEVEL_PARENT, $value); // open the marker image if specified $list_style = $this->get_css_property(CSS_LIST_STYLE); if (!$list_style->image->is_default()) { $this->marker_image = new ImgBox($list_style->image->_image); $state->pushDefaultState(); $this->marker_image->readCSS($state); $state->popState(); $this->marker_image->_setupSize(); } else { $this->marker_image = null; }; } function ListItemBox(&$root, &$pipeline) { // Call parent constructor $this->BlockBox($root); } function reflow(&$parent, &$context) { $list_style = $this->get_css_property(CSS_LIST_STYLE); // If list-style-position is inside, we'll need to move marker box inside the // list-item box and offset all content by its size; if ($list_style->position === LSP_INSIDE) { // Add marker box width to text-indent value $this->_additional_text_indent = $this->get_marker_box_width(); }; // Procees with normal block box flow algorithm BlockBox::reflow($parent, $context); } function reflow_text(&$driver) { if (is_null($this->str_number_box->reflow_text($driver))) { return null; }; return GenericContainerBox::reflow_text($driver); } function show(&$viewport) { // draw generic block box if (is_null(BlockBox::show($viewport))) { return null; }; // Draw marker /** * Determine the marker box base X coordinate * If possible, the marker box should be drawn immediately to the left of the first word in this * box; this means that marker should be tied to the first text box, not to the left * edge of the list block box */ $child = $this->get_first_data(); if (is_null($child)) { $x = $this->get_left(); $list_style = $this->get_css_property(CSS_LIST_STYLE); // If list-style-position is inside, we'll need to move marker box inside the // list-item box and offset all content by its size; if ($list_style->position === LSP_INSIDE) { $x += $this->get_marker_box_width(); }; } else { $x = $child->get_left(); }; // Determine the base Y coordinate of marker box $element = $this->get_first_data(); if ($element) { $y = $element->get_top() - $element->default_baseline; } else { $y = $this->get_top(); } if (!is_null($this->marker_image)) { $this->mb_image($viewport, $x, $y); } else { $list_style = $this->get_css_property(CSS_LIST_STYLE); switch ($list_style->type) { case LST_NONE: // No marker at all break; case LST_DISC: $this->mb_disc($viewport, $x, $y); break; case LST_CIRCLE: $this->mb_circle($viewport, $x, $y); break; case LST_SQUARE: $this->mb_square($viewport, $x, $y); break; default: $this->mb_string($viewport, $x, $y); break; } }; return true; } function get_marker_box_width() { $list_style = $this->get_css_property(CSS_LIST_STYLE); switch ($list_style->type) { case LST_NONE: // no marker box will be rendered at all return 0; case LST_DISC: case LST_CIRCLE: case LST_SQUARE: // simple graphic marker $font = $this->get_css_property(CSS_FONT); return $font->size->getPoints(); default: // string marker. Return the width of the marker text return $this->str_number_box->get_full_width(); }; } function mb_string(&$viewport, $x, $y) { $this->str_number_box->put_top($y + $this->str_number_box->default_baseline); $this->str_number_box->put_left($x - $this->str_number_box->get_full_width()); $this->str_number_box->show($viewport); } function mb_disc(&$viewport, $x, $y) { $color = $this->get_css_property(CSS_COLOR); $color->apply($viewport); $font = $this->get_css_property(CSS_FONT); $viewport->circle( $x - $font->size->getPoints()*0.5, $y + $font->size->getPoints()*0.4*HEIGHT_KOEFF, $font->size->getPoints() * BULLET_SIZE_KOEFF); $viewport->fill(); } function mb_circle(&$viewport, $x, $y) { $color = $this->get_css_property(CSS_COLOR); $color->apply($viewport); $viewport->setlinewidth(0.1); $font = $this->get_css_property(CSS_FONT); $viewport->circle( $x - $font->size->getPoints()*0.5, $y + $font->size->getPoints()*0.4*HEIGHT_KOEFF, $font->size->getPoints() * BULLET_SIZE_KOEFF); $viewport->stroke(); } function mb_square(&$viewport, $x, $y) { $color = $this->get_css_property(CSS_COLOR); $color->apply($viewport); $font = $this->get_css_property(CSS_FONT); $viewport->rect($x - $font->size->getPoints()*0.512, $y + $font->size->getPoints()*0.3*HEIGHT_KOEFF, $font->size->getPoints() * 0.25, $font->size->getPoints() * 0.25); $viewport->fill(); } function mb_image(&$viewport, $x, $y) { $font = $this->get_css_property(CSS_FONT); $imagebox =& $this->marker_image; $imagebox->moveto($x - $font->size->getPoints()*0.5 - $imagebox->get_width()/2, $y + $font->size->getPoints()*0.4*HEIGHT_KOEFF + $imagebox->get_height()/2); $imagebox->show($viewport); } function isBlockLevel() { return true; } } ?>