Subversion-Projekte lars-tiefland.php_share

Revision

Details | Letzte Änderung | Log anzeigen | RSS feed

Revision Autor Zeilennr. Zeile
1 lars 1
<?php
2
 
3
class CSSState {
4
  var $_state;
5
  var $_stateDefaultFlags;
6
  var $_handlerSet;
7
  var $_baseFontSize;
8
 
9
  function CSSState(&$handlerSet) {
10
    $this->_handlerSet        =& $handlerSet;
11
    $this->_state             =  array($this->_getDefaultState());
12
    $this->_stateDefaultFlags =  array($this->_getDefaultStateFlags());
13
 
14
    /**
15
     * Note that default state should contain font size in absolute units (e.g. 11pt),
16
     * so we may pass any value as a base font size parameter of 'toPt' method call
17
     */
18
    $this->_baseFontSize      =  array($this->_state[0][CSS_FONT]->size->toPt(0));
19
  }
20
 
21
  function _getDefaultState() {
22
    return $this->_handlerSet->_getDefaultState();
23
  }
24
 
25
  function _getDefaultStateFlags() {
26
    return $this->_handlerSet->_getDefaultStateFlags();
27
  }
28
 
29
  function replaceParsed($property_data, $property_list) {
30
    foreach ($property_list as $property) {
31
      $this->set_property($property, $property_data->get_css_property($property));
32
    };
33
  }
34
 
35
  function popState() {
36
    array_shift($this->_state);
37
    array_shift($this->_stateDefaultFlags);
38
    array_shift($this->_baseFontSize);
39
  }
40
 
41
  function getStoredState(&$base_font_size, &$state, &$state_default_flags) {
42
    $base_font_size      = array_shift($this->_baseFontSize);
43
    $state               = array_shift($this->_state);
44
    $state_default_flags = array_shift($this->_stateDefaultFlags);
45
  }
46
 
47
  function pushStoredState($base_font_size, $state, $state_default_flags) {
48
    array_unshift($this->_baseFontSize,      $base_font_size);
49
    array_unshift($this->_state,             $state);
50
    array_unshift($this->_stateDefaultFlags, $state_default_flags);
51
  }
52
 
53
  function pushState() {
54
    $base_size = $this->getBaseFontSize();
55
    /**
56
     * Only computed font-size values are inherited; this means that
57
     * base font size value should not be recalculated if font-size was not set explicitly
58
     */
59
    if ($this->get_propertyDefaultFlag(CSS_FONT_SIZE)) {
60
      array_unshift($this->_baseFontSize, $base_size);
61
    } else {
62
      $size = $this->getInheritedProperty(CSS_FONT_SIZE);
63
      array_unshift($this->_baseFontSize, $size->toPt($base_size));
64
    };
65
 
66
    array_unshift($this->_state, $this->getState());
67
    array_unshift($this->_stateDefaultFlags, $this->_getDefaultStateFlags());
68
  }
69
 
70
  function pushDefaultState() {
71
    $this->pushState();
72
    $this->_state[0] = $this->_getDefaultState();
73
 
74
    $handlers = $this->_handlerSet->getInheritableHandlers();
75
 
76
    foreach ($handlers as $property => $handler) {
77
      $handler->inherit($this->_state[1], $this->_state[0]);
78
    };
79
  }
80
 
81
  function pushDefaultTextState() {
82
    $state = $this->getState();
83
 
84
    $this->pushState();
85
    $this->_state[0] = $this->_getDefaultState();
86
    $new_state =& $this->getState();
87
 
88
    $handlers = $this->_handlerSet->getInheritableTextHandlers();
89
    foreach ($handlers as $property => $handler) {
90
      $handler->inherit_text($state, $new_state);
91
    }
92
  }
93
 
94
  function &getStateDefaultFlags() {
95
    return $this->_stateDefaultFlags[0];
96
  }
97
 
98
  function &getState() {
99
    return $this->_state[0];
100
  }
101
 
102
  function &getInheritedProperty($code) {
103
    $handler =& CSS::get_handler($code);
104
 
105
    $size = count($this->_state);
106
    for ($i=0; $i<$size; $i++) {
107
      $value =& $handler->get($this->_state[$i]);
108
      if ($value != CSS_PROPERTY_INHERIT) {
109
        return $value;
110
      };
111
 
112
      // Prevent taking  the font-size property; as,  according to CSS
113
      // standard,  'inherit'  should mean  calculated  value, we  use
114
      // '1em' instead,  forcing the script to  take parent calculated
115
      // value later
116
      if ($code == CSS_FONT_SIZE) {
117
        $value =& Value::fromData(1, UNIT_EM);
118
        return $value;
119
      };
120
    };
121
 
122
    $null = null;
123
    return $null;
124
  }
125
 
126
  function get_propertyOnLevel($code, $level) {
127
    return $this->_state[$level][$code];
128
  }
129
 
130
  /**
131
   * Optimization notice: this function is called very often,
132
   * so even a slight overhead for the 'getState() and CSS::get_handler
133
   * accumulates in a significiant processing delay.
134
   *
135
   * getState was replaced with direct $this->_state[0] access,
136
   * get_handler call results are cached in static var
137
   */
138
  function &get_property($code) {
139
    static $cache = array();
140
    if (!isset($cache[$code])) {
141
      $cache[$code] =& CSS::get_handler($code);
142
    };
143
    $value =& $cache[$code]->get($this->_state[0]);
144
    return $value;
145
  }
146
 
147
  function get_propertyDefaultFlag($code) {
148
    return $this->_stateDefaultFlags[0][$code];
149
  }
150
 
151
  function set_property_on_level($code, $level, $value) {
152
    $this->_state[$level][$code] = $value;
153
  }
154
 
155
  function set_propertyDefault($code, $value) {
156
    $state =& $this->getState();
157
    $state[$code] = $value;
158
  }
159
 
160
  /**
161
   * see get_property for optimization description
162
   */
163
  function set_property($code, $value) {
164
    $this->set_propertyDefault($code, $value);
165
 
166
    static $cache = array();
167
    if (!isset($cache[$code])) {
168
      $cache[$code] =& CSS::get_handler($code);
169
    };
170
 
171
    $cache[$code]->clearDefaultFlags($this);
172
  }
173
 
174
  function set_propertyDefaultFlag($code, $value) {
175
    $state_flags =& $this->getStateDefaultFlags();
176
    $state_flags[$code] = $value;
177
  }
178
 
179
  function getBaseFontSize() {
180
    return $this->_baseFontSize[0];
181
  }
182
}
183
 
184
?>