00001 <?php
00002 define('ROBOTS_NOINDEX', 1);
00003 define('ROBOTS_NOFOLLOW', 2);
00004 define('ROBOTS_NOARCHIVE', 4);
00005 define('ROBOTS_NOINDEX_NOFOLLOW', 7);
00006 define('ROBOTS_NOINDEX_FOLLOW', 5);
00007 define('ROBOTS_INDEX_FOLLOW', 0);
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 class HeadData implements IRenderer {
00019
00020
00021
00022
00023
00024 public $title;
00025
00026
00027
00028
00029
00030 public $description = '';
00031
00032
00033
00034
00035
00036 public $keywords = '';
00037
00038
00039
00040
00041
00042 public $robots_index = ROBOTS_INDEX_FOLLOW;
00043
00044 public $js_files = array();
00045 public $js_snippets = array('before' => array(), 'after' => array());
00046 public $css_files = array();
00047 public $css_snippets = array('before' => array(), 'after' => array());
00048 public $conditional_css_files = array();
00049 public $meta = array();
00050 public $meta_http_equiv = array();
00051 public $links = array();
00052
00053 const META_INFORMATION = 256;
00054 const JAVASCRIPT_INCLUDES = 512;
00055 const CSS_INCLUDES = 1024;
00056 const ALL = 1792;
00057
00058 const IE50 = 'IE5';
00059 const IE55 = 'IE55';
00060 const IE6 = 'IE6';
00061 const IE7 = 'IE7';
00062
00063 public function __construct() {
00064 $this->title = Config::get_value(Config::TITLE);
00065 }
00066
00067
00068
00069
00070
00071
00072
00073 public function render($policy = self::META_INFORMATION) {
00074 $ret = '';
00075 if (Common::flag_is_set($policy, self::META_INFORMATION)) {
00076 $ret .= $this->render_title($this->title, $this->description, $this->keywords);
00077 $ret .= $this->render_robots($this->robots_index);
00078 $ret .= $this->render_meta($this->meta);
00079 $ret .= $this->render_links($this->links);
00080 $ret .= $this->render_meta_http_equiv($this->meta_http_equiv);
00081 }
00082 if (Common::flag_is_set($policy, self::CSS_INCLUDES)) {
00083 $ret .= $this->render_css_snippets($this->css_snippets['before']);
00084 $ret .= $this->render_css($this->css_files);
00085 $ret .= $this->render_conditional_css($this->conditional_css_files);
00086 $ret .= $this->render_css_snippets($this->css_snippets['after']);
00087 }
00088 if (Common::flag_is_set($policy, self::JAVASCRIPT_INCLUDES)) {
00089 $ret .= $this->render_js($this->js_files);
00090 }
00091 return $ret;
00092 }
00093
00094
00095
00096
00097
00098
00099
00100
00101 public function add_js_file($file, $to_front = false) {
00102 if (!empty($file)) {
00103 if ($to_front) {
00104 array_unshift($this->js_files, $file);
00105 } else {
00106 $this->js_files[] = $file;
00107 }
00108 }
00109 }
00110
00111
00112
00113
00114
00115
00116
00117
00118 public function add_js_snippet($snippet, $before_includes = false) {
00119 if (!empty($snippet)) {
00120 if ($before_includes) {
00121 $this->js_snippets['before'][] = $snippet;
00122 } else {
00123 $this->js_snippets['after'][] = $snippet;
00124 }
00125 }
00126 }
00127
00128 public function add_css_file($file, $to_front = false) {
00129 if (!empty($file)) {
00130 if ($to_front) {
00131 array_unshift($this->css_files, $file);
00132 } else {
00133 $this->css_files[] = $file;
00134 }
00135 }
00136 }
00137
00138 public function add_conditional_css_file($browser, $file, $to_front = false) {
00139 if (!empty($file)) {
00140 if (!isset($this->conditional_css_files[$browser])) {
00141 $this->conditional_css_files[$browser] = array();
00142 }
00143 if ($to_front) {
00144 array_unshift($this->conditional_css_files[$browser], $file);
00145 } else {
00146 $this->conditional_css_files[$browser][] = $file;
00147 }
00148 }
00149 }
00150
00151
00152
00153
00154
00155
00156
00157
00158 public function add_css_snippet($snippet, $before_includes = false) {
00159 if (!empty($snippet)) {
00160 if ($before_includes) {
00161 $this->css_snippets['before'][] = $snippet;
00162 } else {
00163 $this->css_snippets['after'][] = $snippet;
00164 }
00165 }
00166 }
00167
00168 public function add_meta($name, $content, $override = false) {
00169 if ($override || !isset($this->meta[$name]) ) {
00170 $this->meta[$name] = $content;
00171 }
00172 }
00173
00174 public function add_meta_http_equiv($name, $content) {
00175 $this->meta_http_equiv[$name] = $content;
00176 }
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186 public function add_link($href, $rel, $attrs = array()) {
00187 $attrs = Arr::force($attrs, false);
00188 $attrs['rel'] = $rel;
00189 $attrs['href'] = $href;
00190 $this->links[$rel . $href] = html::tag_selfclosing('link', $attrs);
00191 }
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201 protected function render_title($title, $description, $keywords) {
00202 $ret = '';
00203
00204 $ret .= html::tag('title', String::escape($title)) . "\n";
00205 if ($description) {
00206 $description = String::preg_replace('|\s\s+|s', ' ', $description);
00207 $ret .= html::meta('description', String::substr_word($description, 0, 200)) . "\n";
00208 }
00209 if ($keywords) {
00210 $ret .= html::meta('keywords', $keywords) . "\n";
00211 }
00212 return $ret;
00213 }
00214
00215
00216
00217
00218
00219
00220
00221 protected function render_robots($robot_policy) {
00222 $robots_policies = array();
00223 $robots_available_policies = array(
00224 'index' => ROBOTS_NOINDEX,
00225 'follow' => ROBOTS_NOFOLLOW,
00226 'archive' => ROBOTS_NOARCHIVE
00227 );
00228 foreach ($robots_available_policies as $name => $flag) {
00229 if (Common::flag_is_set($robot_policy, $flag)) {
00230 $robots_policies[] = 'no' . $name;
00231 }
00232 else {
00233 $robots_policies[] = $name;
00234 }
00235 }
00236
00237 return html::meta('robots', implode(', ', $robots_policies)) . "\n";
00238 }
00239
00240
00241
00242
00243
00244
00245
00246 protected function render_meta($arr_meta) {
00247 $ret = '';
00248 foreach ($arr_meta as $name => $content) {
00249 $ret .= html::meta($name, $content) . "\n";
00250 }
00251 return $ret;
00252 }
00253
00254
00255
00256
00257
00258
00259
00260 protected function render_meta_http_equiv($arr_meta) {
00261 $ret = '';
00262 foreach ($arr_meta as $name => $content) {
00263 $ret .= html::meta_http_equiv($name, $content) . "\n";
00264 }
00265 return $ret;
00266 }
00267
00268
00269
00270
00271
00272
00273
00274 protected function render_links($arr_links) {
00275 $ret = '';
00276 foreach ($arr_links as $name => $content) {
00277 $ret .= $content . "\n";
00278 }
00279 return $ret;
00280 }
00281
00282
00283
00284
00285
00286
00287
00288 protected function render_css($css_files) {
00289 $ret = '';
00290 $css_files = array_unique($css_files);
00291 foreach ($css_files as $file) {
00292 $file = String::escape($this->escape_file($file));
00293 $ret .= "<link rel=\"stylesheet\" type=\"text/css\" href=\"$file\" />\n";
00294 }
00295 return $ret;
00296 }
00297
00298 protected function escape_file($file) {
00299 if (strpos($file, '://') === false) {
00300 $file = Config::get_value(Config::URL_BASEDIR) . ltrim($file, '/');
00301 }
00302 return $file;
00303 }
00304
00305
00306
00307
00308
00309
00310
00311 protected function render_conditional_css($arr_browsers) {
00312 $ret = '';
00313 foreach($arr_browsers as $browser => $css_files) {
00314 $token = '';
00315 switch ($browser) {
00316 case self::IE50:
00317 $token = 'IE 5.0';
00318 break;
00319 case self::IE55:
00320 $token = 'IE 5.5';
00321 break;
00322 case self::IE6:
00323 $token = 'IE 6';
00324 break;
00325 case self::IE7:
00326 $token = 'IE 7';
00327 break;
00328 default:
00329 continue;
00330 break;
00331 }
00332 $ret .= "<!--[if $token]>\n" . $this->render_css($css_files) . "<![endif]-->\n";
00333 }
00334 return $ret;
00335 }
00336
00337
00338
00339
00340
00341
00342
00343 protected function render_js($js_files) {
00344 $js_files = array_unique($js_files);
00345 $ret = '';
00346 $ret .= $this->render_js_snippets($this->js_snippets['before']);
00347 foreach ($js_files as $file) {
00348 $file = $this->escape_file($file);
00349 $ret .= html::include_js($file) . "\n";
00350 }
00351 $ret .= $this->render_js_snippets($this->js_snippets['after']);
00352 return $ret;
00353 }
00354
00355 protected function render_js_snippets($arr_snippets) {
00356 $ret = '';
00357 foreach($arr_snippets as $snippet) {
00358 $ret .= html::script_js($snippet) . "\n";
00359 }
00360 return $ret;
00361 }
00362
00363 protected function render_css_snippets($arr_snippets) {
00364 $ret = '';
00365 foreach($arr_snippets as $snippet) {
00366 $ret .= html::style($snippet) . "\n";
00367 }
00368 return $ret;
00369 }
00370 }