Subversion-Projekte lars-tiefland.php_share

Revision

Details | Letzte Änderung | Log anzeigen | RSS feed

Revision Autor Zeilennr. Zeile
1 lars 1
<?php
2
// $Header: /cvsroot/html2ps/box.whitespace.php,v 1.33 2007/01/24 18:55:46 Konstantin Exp $
3
 
4
class WhitespaceBox extends TextBox {
5
  function &create(&$pipeline) {
6
    $box =& new WhitespaceBox();
7
    $box->readCSS($pipeline->get_current_css_state());
8
    $box->add_subword(" ", 'iso-8859-1', array());
9
    return $box;
10
  }
11
 
12
  function readCSS(&$state) {
13
    parent::readCSS($state);
14
 
15
    $this->_readCSSLengths($state,
16
                           array(CSS_WORD_SPACING));
17
  }
18
 
19
  function get_extra_bottom() {
20
    return 0;
21
  }
22
 
23
  // "Pure" Text boxes never have margins/border/padding
24
  function get_extra_left() {
25
    return 0;
26
  }
27
 
28
  // "Pure" Text boxes never have margins/border/padding
29
  function get_extra_right() {
30
    return 0;
31
  }
32
 
33
  function get_extra_top() {
34
    return 0;
35
  }
36
 
37
  function get_full_width() {
38
    return $this->width;
39
  }
40
 
41
  function get_margin_top() {
42
    return 0;
43
  }
44
 
45
  function get_min_width(&$context) {
46
    return $this->width;
47
  }
48
 
49
  function get_max_width(&$context) {
50
    return $this->width;
51
  }
52
 
53
  function WhitespaceBox() {
54
    // Call parent constructor
55
    $this->TextBox();
56
  }
57
 
58
  // (!) SIDE EFFECT: current whitespace box can be replaced by a null box during reflow.
59
  // callers of reflow should take this into account and possilby check for this
60
  // after reflow returns. This can be detected by UID change.
61
  //
62
  function reflow(&$parent, &$context) {
63
    // Check if there are any boxes in parent's line box
64
    if ($parent->line_box_empty()) {
65
      // The very first whitespace in the line box should not affect neither height nor baseline of the line box;
66
      // because following boxes can be smaller that assumed whitespace height
67
      // Example: <br>[whitespace]<img height="2" width="2"><br>; whitespace can overextend this line
68
 
69
      $this->width = 0;
70
      $this->height = 0;
71
    } elseif (is_a($parent->last_in_line(),"WhitespaceBox")) {
72
      // Duplicate whitespace boxes should not offset further content and affect the line box length
73
 
74
      $this->width = 0;
75
      $this->height = 0;
76
    } elseif ($this->maybe_line_break($parent, $context)) {
77
      $this->width = 0;
78
      $this->height = 0;
79
    };
80
 
81
    parent::reflow($parent, $context);
82
  }
83
 
84
  function reflow_text(&$driver) {
85
    if (is_null(parent::reflow_text($driver))) {
86
      return null;
87
    };
88
 
89
    // Override widths
90
    $letter_spacing = $this->get_css_property(CSS_LETTER_SPACING);
91
    $word_spacing   = $this->get_css_property(CSS_WORD_SPACING);
92
 
93
    $this->width =
94
      $this->height * WHITESPACE_FONT_SIZE_FRACTION +
95
      $letter_spacing->getPoints() +
96
      $word_spacing->getPoints();
97
 
98
    return true;
99
  }
100
 
101
  function reflow_whitespace(&$linebox_started, &$previous_whitespace) {
102
    if (!$linebox_started ||
103
        ($linebox_started && $previous_whitespace)) {
104
 
105
      $link_destination = $this->get_css_property(CSS_HTML2PS_LINK_DESTINATION);
106
      if (is_null($link_destination)) {
107
        $this->parent->remove($this);
108
        return;
109
      };
110
 
111
      $this->font_height = 0.001;
112
      $this->height = 0;
113
      $this->width = 0;
114
    };
115
 
116
    $previous_whitespace = true;
117
 
118
    // Note that there can (in theory) several whitespaces in a row, so
119
    // we could not modify a flag until we met a real text box
120
  }
121
}
122
?>