mirror of
https://github.com/Pathduck/gallery3.git
synced 2026-06-02 09:49:09 -04:00
1) CSS files are added to the combined version by use of $theme->css() or $theme->css_theme() methods 2) url references in the css are converted to full paths as opposed to relative 3) @import statements in the css are resolved as well. 4) need to move the [if IE] statements into the css files so the will be honored in the browser. currently the ie fix css are always included.
183 lines
6.1 KiB
PHP
183 lines
6.1 KiB
PHP
<?php defined("SYSPATH") or die("No direct script access.");
|
|
/**
|
|
* Gallery - a web based photo album viewer and editor
|
|
* Copyright (C) 2000-2009 Bharat Mediratta
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or (at
|
|
* your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful, but
|
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
|
|
*/
|
|
class Gallery_View_Core extends View {
|
|
protected $theme_name = null;
|
|
protected $scripts = array();
|
|
protected $css = array();
|
|
|
|
/**
|
|
* Add a script to the combined scripts list.
|
|
* @param $file the relative path to a script from the gallery3 directory
|
|
*/
|
|
public function script($file, $theme_relative=false) {
|
|
$this->scripts[$file] = 1;
|
|
}
|
|
|
|
/**
|
|
* Add a script to the combined scripts list.
|
|
* @param $file the relative path to a script from the base of the active theme
|
|
* @param
|
|
*/
|
|
public function theme_script($file) {
|
|
$file = "themes/{$this->theme_name}/$file";
|
|
$this->scripts[$file] = 1;
|
|
}
|
|
|
|
/**
|
|
* Provide a url to a resource within the current theme. This allows us to refer to theme
|
|
* resources without naming the theme itself which makes themes easier to copy.
|
|
*/
|
|
public function theme_url($path, $absolute_url=false) {
|
|
$arg = "themes/{$this->theme_name}/$path";
|
|
return $absolute_url ? url::abs_file($arg) : url::file($arg);
|
|
}
|
|
|
|
/**
|
|
* Combine a series of Javascript files into a single one and cache it in the database, then
|
|
* return a single <script> element to refer to it.
|
|
*/
|
|
protected function combine_script() {
|
|
$links = array();
|
|
$key = "";
|
|
foreach (array_keys($this->scripts) as $file) {
|
|
$path = DOCROOT . $file;
|
|
if (file_exists($path)) {
|
|
$stats = stat($path);
|
|
$links[] = $path;
|
|
// 7 == size, 9 == mtime, see http://php.net/stat
|
|
$key = "{$key}$file $stats[7] $stats[9],";
|
|
} else {
|
|
Kohana::log("alert", "Javascript file missing: " . $file);
|
|
}
|
|
}
|
|
|
|
$key = md5($key);
|
|
$cache = Cache::instance();
|
|
$contents = $cache->get($key);
|
|
if (empty($contents)) {
|
|
$contents = "";
|
|
foreach ($links as $link) {
|
|
$contents .= file_get_contents($link);
|
|
}
|
|
$cache->set($key, $contents, array("javascript"), 30 * 84600);
|
|
if (function_exists("gzencode")) {
|
|
$cache->set("{$key}_gz", gzencode($contents, 9, FORCE_GZIP),
|
|
array("javascript", "gzip"), 30 * 84600);
|
|
}
|
|
}
|
|
|
|
// Handcraft the script link because html::script will add a .js extenstion
|
|
return "<script type=\"text/javascript\" src=\"" . url::site("combined/javascript/$key") .
|
|
"\"></script>";
|
|
}
|
|
|
|
/**
|
|
* Add a css file to the combined css list.
|
|
* @param $file the relative path to a script from the gallery3 directory
|
|
*/
|
|
public function css($file, $theme_relative=false) {
|
|
$this->css[$file] = 1;
|
|
}
|
|
|
|
/**
|
|
* Add a css file to the combined css list.
|
|
* @param $file the relative path to a script from the base of the active theme
|
|
* @param
|
|
*/
|
|
public function theme_css($file) {
|
|
$file = "themes/{$this->theme_name}/$file";
|
|
$this->css[$file] = 1;
|
|
}
|
|
|
|
/**
|
|
* Combine a series of Javascript files into a single one and cache it in the database, then
|
|
* return a single <script> element to refer to it.
|
|
*/
|
|
protected function combine_css() {
|
|
$links = array();
|
|
$key = "";
|
|
|
|
foreach (array_keys($this->css) as $file) {
|
|
$path = DOCROOT . $file;
|
|
if (file_exists($path)) {
|
|
$stats = stat($path);
|
|
$links[] = $path;
|
|
// 7 == size, 9 == mtime, see http://php.net/stat
|
|
$key = "{$key}$file $stats[7] $stats[9],";
|
|
} else {
|
|
Kohana::log("alert", "CSS file missing: " . $file);
|
|
}
|
|
}
|
|
|
|
$key = md5($key);
|
|
$cache = Cache::instance();
|
|
$contents = $cache->get($key);
|
|
|
|
$contents = "";
|
|
if (empty($contents)) {
|
|
$contents = "";
|
|
foreach ($links as $link) {
|
|
$contents .= $this->process_css($link);
|
|
}
|
|
$cache->set($key, $contents, array("css"), 30 * 84600);
|
|
if (function_exists("gzencode")) {
|
|
$cache->set("{$key}_gz", gzencode($contents, 9, FORCE_GZIP),
|
|
array("css", "gzip"), 30 * 84600);
|
|
}
|
|
}
|
|
return "<link media=\"screen, projection\" rel=\"stylesheet\" type=\"text/css\" href=\"" .
|
|
url::site("combined/css/$key") . "\" />";
|
|
}
|
|
|
|
private function process_css($css_file) {
|
|
static $PATTERN = "#url\(\s*['|\"]{0,1}(.*?)['|\"]{0,1}\s*\)#";
|
|
$docroot_length = strlen(DOCROOT);
|
|
|
|
$css = file_get_contents($css_file);
|
|
if (preg_match_all($PATTERN, $css, $matches, PREG_SET_ORDER)) {
|
|
$search = $replace = array();
|
|
foreach ($matches as $match) {
|
|
$relative = substr(realpath(dirname($css_file) . "/$match[1]"), $docroot_length);
|
|
if (!empty($relative)) {
|
|
$search[] = $match[0];
|
|
$replace[] = "url('" . url::abs_file($relative) . "')";
|
|
} else {
|
|
Kohana::log("alert", sprintf("Missing URL reference '%s' in CSS file '%s' ",
|
|
$match[1], $css_file));
|
|
}
|
|
}
|
|
$css = str_replace($search, $replace, $css);
|
|
}
|
|
$imports = preg_match_all("#@import\s*['|\"]{0,1}(.*?)['|\"]{0,1};#",
|
|
$css, $matches, PREG_SET_ORDER);
|
|
|
|
if ($imports) {
|
|
$search = $replace = array();
|
|
foreach ($matches as $match) {
|
|
Kohana::log("error", dirname($css_file) . "/$match[1]");
|
|
$search[] = $match[0];
|
|
$replace[] = $this->process_css(dirname($css_file) . "/$match[1]");
|
|
}
|
|
$css = str_replace($search, $replace, $css);
|
|
}
|
|
|
|
return $css;
|
|
}
|
|
} |