/**
  * CSS 2.1 p.16.6
  * white-space: normal
  * This value directs user agents to collapse sequences of whitespace, and break lines as necessary to fill line boxes.
  */
 function build(&$box, $text, &$pipeline)
 {
     $text = $this->remove_leading_linefeeds($text);
     $text = $this->remove_trailing_linefeeds($text);
     $content = $this->collapse_whitespace($text);
     // Whitespace-only text nodes sill result on only one whitespace box
     if (trim($content) === '') {
         $whitespace =& WhitespaceBox::create($pipeline);
         $box->add_child($whitespace);
         return;
     }
     // Add leading whispace box, if content stars with a space
     if (preg_match('/ /u', substr($content, 0, 1))) {
         $whitespace =& WhitespaceBox::create($pipeline);
         $box->add_child($whitespace);
     }
     $words = $this->break_into_words($content);
     $size = count($words);
     $pos = 0;
     // Check if text content has trailing whitespace
     $last_whitespace = substr($content, strlen($content) - 1, 1) == ' ';
     foreach ($words as $word) {
         $box->process_word($word, $pipeline);
         $pos++;
         $is_last_word = $pos == $size;
         // Whitespace boxes should be added
         // 1) between words
         // 2) after the last word IF there was a space at the content end
         if (!$is_last_word || $last_whitespace) {
             $whitespace =& WhitespaceBox::create($pipeline);
             $box->add_child($whitespace);
         }
     }
 }
 /**
  * CSS 2.1 p.16.6
  * white-space: normal
  * This value directs user agents to collapse sequences of whitespace, and break lines as necessary to fill line boxes.
  */
 function build(&$box, $text, &$pipeline)
 {
     $text = $this->remove_leading_linefeeds($text);
     $text = $this->remove_trailing_linefeeds($text);
     $lines = $this->break_into_lines($text);
     foreach ($lines as $line) {
         $words = $this->break_into_words($this->collapse_whitespace($line));
         foreach ($words as $word) {
             $box->process_word($word, $pipeline);
             $whitespace =& WhitespaceBox::create($pipeline);
             $box->add_child($whitespace);
         }
         $this->add_line_break($box, $pipeline);
     }
 }
 /**
  * CSS 2.1 16.6 Whitespace: the 'white-space' property
  *
  * pre-wrap:
  *
  * This  value prevents  user  agents from  collapsing sequences  of
  * whitespace.   Lines are  broken  at newlines  in  the source,  at
  * occurrences  of "\A" in  generated content,  and as  necessary to
  * fill line boxes.
  */
 function build(&$box, $text, &$pipeline)
 {
     $text = $this->remove_trailing_linefeeds($text);
     $parent =& $box->get_parent_node();
     $lines = $this->break_into_lines($text);
     for ($i = 0, $size = count($lines); $i < $size; $i++) {
         $line = $lines[$i];
         $words = $this->break_into_words($line);
         foreach ($words as $word) {
             $word .= ' ';
             $box->process_word($word, $pipeline);
             $whitespace =& WhitespaceBox::create($pipeline);
             $box->add_child($whitespace);
         }
         if ((!$parent || $parent->isBlockLevel()) && $i < $size - 1) {
             $this->add_line_break($box, $pipeline);
         }
     }
 }
 function &create(&$root, &$pipeline)
 {
     // Create contents of this inline box
     if ($root->node_type() == XML_TEXT_NODE) {
         $css_state =& $pipeline->getCurrentCSSState();
         return InlineBox::create_from_text($root->content, $css_state->getProperty(CSS_WHITE_SPACE), $pipeline);
     } else {
         $box =& new InlineBox();
         $css_state =& $pipeline->getCurrentCSSState();
         $box->readCSS($css_state);
         // Initialize content
         $child = $root->first_child();
         while ($child) {
             $child_box =& create_pdf_box($child, $pipeline);
             $box->add_child($child_box);
             $child = $child->next_sibling();
         }
         // Add fake whitespace box with zero size for the anchor spans
         // We need this, as "reflow" functions will automatically remove empty inline boxes from the
         // document tree
         //
         if ($box->is_null()) {
             $css_state->pushState();
             $css_state->setProperty(CSS_FONT_SIZE, Value::fromData(0.01, UNIT_PT));
             $whitespace = WhitespaceBox::create($pipeline);
             $whitespace->readCSS($css_state);
             $box->add_child($whitespace);
             $css_state->popState();
         }
     }
     return $box;
 }
 function init_white_space_normal($raw_content)
 {
     $content = preg_replace("/[\r\n\t ]/", ' ', $raw_content);
     // Whitespace-only text nodes sill result on only one whitespace box
     if (trim($content) === "") {
         $this->add_child(WhitespaceBox::create());
         return;
     }
     if (preg_match("# #", substr($content, 0, 1))) {
         $this->add_child(WhitespaceBox::create());
     }
     $words = preg_split("/ /", $content);
     $prefix = "";
     for ($i = 0; $i < count($words); $i++) {
         $word = $prefix . $words[$i];
         // Skip zero-length words
         if (strlen($word) == 0) {
             continue;
         }
         // Check if this word is terminated by a partially-completed
         // unicode symbol; in this case we've made a break here incorrectly on
         // the non-breaking space
         //
         // So, we'll concatenate whis with with the next word
         // dropping partially parsed unicode symbol and replacing it by a space
         //
         if ($word[strlen($word) - 1] == chr(0xc2)) {
             $prefix = substr($word, 0, strlen($word) - 1) . " ";
             continue;
         }
         $prefix = "";
         if ($word !== "") {
             $this->process_word($word);
             // we need to make space between words in 2 cases:
             // 1. if there will be another words in the same text node
             // 2. if it is the last words AND there's space(s) at the end of the text content.
             //    e.g.: text<b>xxx </font>some more text
             if ($i < count($words) - 1 || preg_match("#\\s#", substr($content, strlen($content) - 1, 1))) {
                 $this->add_child(WhitespaceBox::create());
             }
         }
     }
 }