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; }
$htmltoparse = $cms->transform_html($htmltoparse); } //Compression CSS if ($opac_compress_css == 1 && !$cms_active) { $compressed_file_exist = file_exists("./temp/full.css"); require_once $class_path . "/curl.class.php"; $dom = new DOMDocument(); $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); }
/** * Compression d'un fichier CSS */ function compresscss($content, $file, $relocate = true) { if (preg_match_all("!@import\\s+url\\(['\"]([^'^\"]*)['\"]\\);!", $content, $matches)) { $css_filepath = dirname($file); for ($i = 0; $i < count($matches[0]); $i++) { $content = str_replace($matches[0][$i], loadandcompresscss($css_filepath . "/" . $matches[1][$i]), $content); } } if ($relocate && preg_match_all("!url\\(['\"]?([^'^\")]+)['\"]?\\)!", $content, $matches)) { for ($i = 0; $i < count($matches[0]); $i++) { $target = $matches[1][$i]; $target = "." . dirname($file) . "/" . str_replace("." . dirname($file) . "/", "", $target); $content = str_replace($matches[0][$i], "url('" . $target . "')", $content); } } $content = preg_replace('!/\\*[^*]*\\*+([^/][^*]*\\*+)*/!', '', $content); // Remove space after colons $content = preg_replace('!\\s?:\\s?!', ':', $content); // Remove whitespace $content = str_replace(array("\r", "\n\n", "\t"), '', $content); return $content; }