$dom->encoding = $charset; $dom->loadHTML($htmltoparse); $css_buffer = ""; $links = $dom->getElementsByTagName("link"); $dom_css = array(); for ($i = 0; $i < $links->length; $i++) { $dom_css[] = $links->item($i); if (!$compressed_file_exist && $links->item($i)->hasAttribute("type") && $links->item($i)->getAttribute("type") == "text/css") { $css_buffer .= loadandcompresscss(html_entity_decode($links->item($i)->getAttribute("href"))); } } $styles = $dom->getElementsByTagName("style"); for ($i = 0; $i < $styles->length; $i++) { $dom_css[] = $styles->item($i); if (!$compressed_file_exist) { $css_buffer .= compresscss($styles->item($i)->nodeValue, ""); } } foreach ($dom_css as $link) { $link->parentNode->removeChild($link); } if (!$compressed_file_exist) { file_put_contents("./temp/full.css", $css_buffer); } $link = $dom->createElement("link"); $link->setAttribute("href", "./temp/full.css"); $link->setAttribute("rel", "stylesheet"); $link->setAttribute("type", "text/css"); $dom->getElementsByTagName("head")->item(0)->appendChild($link); $htmltoparse = $dom->saveHTML(); } else {
function transform_html($html) { global $lvl, $pageid, $search_type_asked; global $charset, $is_opac_included; global $opac_compress_css; if ($charset == 'utf-8') { $html = preg_replace('/[\\x00-\\x08\\x10\\x0B\\x0C\\x0E-\\x19\\x7F]' . '|[\\x00-\\x7F][\\x80-\\xBF]+' . '|([\\xC0\\xC1]|[\\xF0-\\xFF])[\\x80-\\xBF]*' . '|[\\xC2-\\xDF]((?![\\x80-\\xBF])|[\\x80-\\xBF]{2,})' . '|[\\xE0-\\xEF](([\\x80-\\xBF](?![\\x80-\\xBF]))|(?![\\x80-\\xBF]{2})|[\\x80-\\xBF]{3,})/S', '?', $html); } $pageid += 0; @ini_set("zend.ze1_compatibility_mode", "0"); $this->cadre_portail_list = array(); $this->dom = new DomDocument(); $this->dom->encoding = $charset; // si pas d'entete on ajoute le charset if ($is_opac_included) { $html = '<meta http-equiv="content-type" content="text/html; charset=' . $charset . '" />' . $html; } if (!@$this->dom->loadHTML($html)) { return $html; } //bon, l'histoire se répète, c'est quand on pense que c'est simple que c'est vraiment complexe... // on commence par récupérer les zones... $this->id_version = $this->get_version_public(); if (!$this->id_version) { return $html; } //On vide ce qui est trop vieux dans la table de cache des cadres $this->manage_cache_cadres("clean"); $cache_cadre_object = array(); //Tableau qui sert à stocker les objets générés pour les cadres. $query_zones = "select distinct build_parent from cms_build where build_type='cadre' and build_version_num= '" . $this->id_version . "'"; $result_zones = pmb_mysql_query($query_zones); if (pmb_mysql_num_rows($result_zones)) { while ($row_zones = pmb_mysql_fetch_object($result_zones)) { //pour chaque zone, on récupère les cadres fixes... $query_cadres = "select cms_build.*,cadre_url from cms_build \n\t\t\t\tLEFT JOIN cms_cadres ON build_obj=CONCAT(cadre_object,'_',id_cadre) AND cadre_memo_url=1\n\t\t\t\twhere build_parent = '" . $row_zones->build_parent . "'\r\n\t\t\t\tand build_fixed = 1 and build_type='cadre' and build_version_num= '" . $this->id_version . "' "; $result_cadres = pmb_mysql_query($query_cadres); if (pmb_mysql_num_rows($result_cadres)) { $cadres = array(); //on place les cadres dans un tableau while ($row_cadres = pmb_mysql_fetch_object($result_cadres)) { //Si on a récupéré un cadre_url $cadreOk = true; if ($row_cadres->cadre_url) { $url = substr($row_cadres->cadre_url, strpos($row_cadres->cadre_url, '?') + 1); foreach (explode('&', $url) as $idParam => $param) { $tmp = array(); $tmp = explode('=', $param); if (sizeof($tmp) == 2) { if (${$tmp[0]} != $tmp[1] && ($tmp[0] == "lvl" || $tmp[0] == "search_type_asked" || $tmp[0] == "pageid")) { //si le cadre rentre dans le cas ou il n'appartient pas à la page courante. $cadreOk = false; } } } } if ($cadreOk) { $cadres[] = $row_cadres; } } $ordered_cadres = $this->order_cadres($cadres, $cache_cadre_object); $this->fixed_cadres[$row_zones->build_parent] = $ordered_cadres; foreach ($ordered_cadres as $cadre) { $this->apply_change($cadre, $cache_cadre_object); if ($cadre->build_div) { $this->add_div($cadre->build_obj); } } // print "pour chaque zone cadres fixes: "; // printr($cadres); } //on passe au cadre dynamiques $query_dynamics = "select cms_build.*,cadre_url from cms_build \n\t\t\t\tLEFT JOIN cms_cadres ON build_obj=CONCAT(cadre_object,'_',id_cadre) AND cadre_memo_url=1\n\t\t\t\twhere build_parent = '" . $row_zones->build_parent . "' \n\t\t\t\tand build_fixed = 0 and build_type='cadre' and build_version_num= '" . $this->id_version . "' \n\t\t\t\torder by id_build "; $result_dynamics = pmb_mysql_query($query_dynamics); if (pmb_mysql_num_rows($result_dynamics)) { $cadres = array(); while ($row_dynamics = pmb_mysql_fetch_object($result_dynamics)) { //Si on a récupéré un cadre_url $cadreOk = true; if ($row_dynamics->cadre_url) { $url = substr($row_dynamics->cadre_url, strpos($row_dynamics->cadre_url, '?') + 1); foreach (explode('&', $url) as $idParam => $param) { $tmp = array(); $tmp = explode('=', $param); if (sizeof($tmp) == 2) { if (${$tmp[0]} != $tmp[1] && ($tmp[0] == "lvl" || $tmp[0] == "search_type_asked" || $tmp[0] == "pageid")) { //si le cadre rentre dans le cas ou il n'appartient pas à la page courante. $cadreOk = false; } } } } if ($cadreOk) { $cadres[] = $row_dynamics; } } $ordered_cadres = $this->order_cadres($cadres, $cache_cadre_object); foreach ($ordered_cadres as $cadre) { $this->apply_change($cadre, $cache_cadre_object); if ($cadre->build_div) { $this->add_div($cadre->build_obj); } } } } } //on traite la css des Zones. A voir plus tard pour la gestion du placement $query_css_zones = "select * from cms_build where build_type='zone' and build_version_num= '" . $this->id_version . "' "; $res = pmb_mysql_query($query_css_zones); if (pmb_mysql_num_rows($res)) { while ($r = pmb_mysql_fetch_object($res)) { $node = $this->dom->getElementById($r->build_obj); if ($node) { if ($r->build_css) { $this->add_css($node, $r->build_css); } if ($r->build_div) { $this->add_div($r->build_obj); } } } } //gestion du placement des zones du contener $query_zones = "select * from cms_build where build_type='zone' and build_version_num= '" . $this->id_version . "' and build_parent='container' "; $res = pmb_mysql_query($query_zones); $contener = $this->dom->getElementById("container"); $zones = array(); if (pmb_mysql_num_rows($res)) { while ($r = pmb_mysql_fetch_object($res)) { $zones[] = $r; } $ordered_zones = $this->order_cadres($zones, $cache_cadre_object); foreach ($ordered_zones as $zone) { $this->apply_change($zone, $cache_cadre_object); if ($cadre->build_div) { // $this->add_div($cadre->build_obj); } } } //on insère les entêtes des modules dans le head $this->insert_headers(); //compression de la CSS si activé! if ($opac_compress_css == 1) { $compressed_file_exist = file_exists("./temp/full.css"); $links = $this->dom->getElementsByTagName("link"); $dom_css = array(); for ($i = 0; $i < $links->length; $i++) { $dom_css[] = $links->item($i); if (!$compressed_file_exist && $links->item($i)->hasAttribute("type") && $links->item($i)->getAttribute("type") == "text/css") { $css_buffer .= loadandcompresscss(html_entity_decode($links->item($i)->getAttribute("href"))); } } $styles = $this->dom->getElementsByTagName("style"); for ($i = 0; $i < $styles->length; $i++) { $dom_css[] = $styles->item($i); if (!$compressed_file_exist) { $css_buffer .= compresscss($styles->item($i)->nodeValue, ""); } } foreach ($dom_css as $link) { $link->parentNode->removeChild($link); } if (!$compressed_file_exist) { file_put_contents("./temp/full.css", $css_buffer); } $link = $this->dom->createElement("link"); $link->setAttribute("href", "./temp/full.css"); $link->setAttribute("rel", "stylesheet"); $link->setAttribute("type", "text/css"); $this->dom->getElementsByTagName("head")->item(0)->appendChild($link); } else { if (file_exists("./temp/full.css")) { unlink("./temp/full.css"); } } $html = $this->dom->saveHTML(); @ini_set("zend.ze1_compatibility_mode", "1"); return $html; }
function optimizecss($css_urls, $overwrite = false) { $content = ''; $files = ''; jimport('joomla.filesystem.file'); foreach ($css_urls as $url) { $files .= $url[1]; //join css files into one file $content .= "/* FILE: {$url[1]} */\n" . compresscss(@JFile::read($url[0]), $url[1]) . "\n\n"; } $file = md5($files) . '.css'; if (useGZip()) { $file = $file . '.php'; } //$url = store_file($content, $file, $overwrite); $expireHeader = (int) 30 * 24 * 60 * 60; if (useGZip()) { $headers = "<?php if(extension_loaded('zlib')){ob_start('ob_gzhandler');} header(\"Content-type: text/css\");"; $headers .= "header(\"Content-Encoding: gzip\");"; } $headers .= "header('Expires: " . gmdate('D, d M Y H:i:s', strtotime(date('D, d M Y H:i:s')) + $expireHeader) . " GMT');"; $headers .= "header('Last-Modified: " . gmdate('D, d M Y H:i:s', strtotime(date('D, d M Y H:i:s'))) . " GMT');"; $headers .= "header('Cache-Control: Public');"; $headers .= "header('Vary: Accept-Encoding');?>"; $content = $headers . $content; $url = store_file($content, $file, $overwrite); return $url; }
/** * Charge et lance la compression d'un fichier CSS */ function loadandcompresscss($file) { global $opac_default_style; $relocate = true; if (strpos($file, "?") && strpos($file, "./styles/" . $opac_default_style . "/") === false && strpos($file, "./styles/common/") === false) { $aCurl = new Curl(); $content = $aCurl->get($file); $content = $content->body; $relocate = false; } else { if (strpos($file, "?")) { $file = substr($file, 0, strpos($file, "?")); } $content = file_get_contents($file); } return compresscss($content, $file, $relocate); }