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/css.utils.inc.php,v 1.30 2007/04/07 11:16:34 Konstantin Exp $
3
 
4
// TODO: make an OO-style selectors interface instead of switches
5
 
6
// Searches the CSS rule selector for pseudoelement selectors
7
// (assuming that there can be only one) and returns its value
8
//
9
// note that there's not sence in applying pseudoelement to any chained selector except the last
10
// (the deepest descendant)
11
//
12
function css_find_pseudoelement($selector) {
13
  $selector_type = selector_get_type($selector);
14
  switch ($selector_type) {
15
  case SELECTOR_PSEUDOELEMENT_BEFORE:
16
  case SELECTOR_PSEUDOELEMENT_AFTER:
17
    return $selector_type;
18
  case SELECTOR_SEQUENCE:
19
    foreach ($selector[1] as $subselector) {
20
      $pe = css_find_pseudoelement($subselector);
21
      if (!is_null($pe)) {
22
        return $pe;
23
      };
24
    }
25
    return null;
26
  default:
27
    return null;
28
  }
29
}
30
 
31
function _fix_tag_display($default_display, &$state, &$pipeline) {
32
  // In some cases 'display' CSS property should be ignored for element-generated boxes
33
  // Here we will use the $default_display stored above
34
  // Note that "display: none" should _never_ be changed
35
  //
36
  $handler =& CSS::get_handler(CSS_DISPLAY);
37
  if ($handler->get($state->getState()) === "none") {
38
    return;
39
  };
40
 
41
  switch ($default_display) {
42
  case 'table-cell':
43
    // TD will always have 'display: table-cell'
44
    $handler->css('table-cell', $pipeline);
45
    break;
46
 
47
  case '-button':
48
    // INPUT buttons will always have 'display: -button' (in latter case if display = 'block', we'll use a wrapper box)
49
    $css_state =& $pipeline->get_current_css_state();
50
    if ($handler->get($css_state->getState()) === 'block') {
51
      $need_block_wrapper = true;
52
    };
53
    $handler->css('-button', $pipeline);
54
    break;
55
  };
56
}
57
 
58
function is_percentage($value) {
59
  return $value{strlen($value)-1} == "%";
60
}
61
 
62
/**
63
 * Handle escape sequences in CSS string values
64
 *
65
 * 4.3.7 Strings
66
 *
67
 * Strings can  either be  written with double  quotes or  with single
68
 * quotes.  Double quotes  cannot occur  inside double  quotes, unless
69
 * escaped (e.g., as '\"' or  as '\22'). Analogously for single quotes
70
 * (e.g., "\'" or "\27")...
71
 *
72
 * A string cannot directly contain a newline. To include a newline in
73
 * a string,  use an  escape representing the  line feed  character in
74
 * Unicode  (U+000A),  such  as  "\A"  or  "\00000a"...
75
 *
76
 * It is possible to break strings over several lines, for esthetic or
77
 * other reasons,  but in  such a  case the newline  itself has  to be
78
 * escaped  with a  backslash  (\).
79
 *
80
 * 4.1.3 Characters and case
81
 *
82
 * In  CSS 2.1,  a backslash  (\) character  indicates three  types of
83
 * character escapes.
84
 *
85
 * First,  inside a  string,  a  backslash followed  by  a newline  is
86
 * ignored  (i.e., the  string is  deemed  not to  contain either  the
87
 * backslash or the newline).
88
 *
89
 * Second,  it cancels  the  meaning of  special  CSS characters.  Any
90
 * character  (except  a hexadecimal  digit)  can  be  escaped with  a
91
 * backslash to  remove its  special meaning. For  example, "\""  is a
92
 * string consisting  of one  double quote. Style  sheet preprocessors
93
 * must not  remove these  backslashes from a  style sheet  since that
94
 * would change the style sheet's meaning.
95
 *
96
 * Third, backslash escapes allow  authors to refer to characters they
97
 * can't  easily put in  a document.  In this  case, the  backslash is
98
 * followed by at most  six hexadecimal digits (0..9A..F), which stand
99
 * for the  ISO 10646 ([ISO10646])  character with that  number, which
100
 * must not be  zero. If a character in  the range [0-9a-fA-F] follows
101
 * the  hexadecimal number, the  end of  the number  needs to  be made
102
 * clear. There are two ways to do that:
103
 *
104
 * 1. with a space (or other whitespace character): "\26 B" ("&B"). In
105
 *    this   case,   user  agents   should   treat   a  "CR/LF"   pair
106
 *    (U+000D/U+000A) as a single whitespace character.
107
 * 2. by providing exactly 6 hexadecimal digits: "\000026B" ("&B")
108
 *
109
 * In fact,  these two  methods may be  combined. Only  one whitespace
110
 * character  is ignored after  a hexadecimal  escape. Note  that this
111
 * means that  a "real"  space after the  escape sequence  must itself
112
 * either be escaped or doubled.
113
 */
114
function css_process_escapes($value) {
115
  $value = preg_replace_callback('/\\\\([\da-f]{1,6})( |[^][\da-f])/i',
116
                                 'css_process_escapes_callback',
117
                                 $value);
118
 
119
  $value = preg_replace_callback('/\\\\([\da-f]{6})( ?)/i',
120
                                 'css_process_escapes_callback',
121
                                 $value);
122
  return $value;
123
}
124
 
125
function css_process_escapes_callback($matches) {
126
  if ($matches[2] == ' ') {
127
    return hex_to_utf8($matches[1]);
128
  } else {
129
    return hex_to_utf8($matches[1]).$matches[2];
130
  };
131
}
132
 
133
function css_remove_value_quotes($value) {
134
  if (strlen($value) == 0) { return $value; };
135
 
136
  if ($value{0} === "'" || $value{0} === "\"") {
137
    $value = substr($value, 1, strlen($value)-2);
138
  };
139
  return $value;
140
}
141
 
142
?>