%PDF- %PDF-
| Direktori : /home/lightco1/public_html/plugins/content/sigplus/ |
| Current File : /home/lightco1/public_html/plugins/content/sigplus/script.php |
<?php
/**
* @file
* @brief sigplus Image Gallery Plus installer script
* @author Levente Hunyadi
* @version 1.5.0
* @remarks Copyright (C) 2009-2017 Levente Hunyadi
* @remarks Licensed under GNU/GPLv3, see http://www.gnu.org/licenses/gpl-3.0.html
* @see http://hunyadi.info.hu/projects/sigplus
*/
/*
* sigplus Image Gallery Plus plug-in for Joomla
* Copyright 2009-2014 Levente Hunyadi
*
* sigplus 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 3 of the License, or
* (at your option) any later version.
*
* sigplus 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, see <http://www.gnu.org/licenses/>.
*/
// no direct access
defined( '_JEXEC' ) or die( 'Restricted access' );
require_once dirname(__FILE__).DIRECTORY_SEPARATOR.'fields'.DIRECTORY_SEPARATOR.'constants.php';
require_once dirname(__FILE__).DIRECTORY_SEPARATOR.'core'.DIRECTORY_SEPARATOR.'setup.php';
define('SIGPLUS_PLUGIN_PATH', JPATH_ROOT.DIRECTORY_SEPARATOR.'plugins'.DIRECTORY_SEPARATOR.'content'.DIRECTORY_SEPARATOR.SIGPLUS_PLUGIN_FOLDER);
define('SIGPLUS_VERSION_FILE', SIGPLUS_PLUGIN_PATH.DIRECTORY_SEPARATOR.'core'.DIRECTORY_SEPARATOR.'version.php');
define('SIGPLUS_MANIFEST_FILE', SIGPLUS_PLUGIN_PATH.DIRECTORY_SEPARATOR.'sigplus.xml');
class plgContentSigPlusNovoInstallerScript {
function __construct($parent) { }
function install($parent) { }
function uninstall($parent) {
self::removeCacheFolder();
}
function update($parent) { }
function preflight($type, $parent) {
switch ($type) {
case 'install':
case 'discover_install':
case 'update':
if (defined('SIGPLUS_VERSION')) {
$current = SIGPLUS_VERSION;
} elseif (file_exists(SIGPLUS_VERSION_FILE)) { // available since 1.5.0
include_once SIGPLUS_VERSION_FILE;
$current = SIGPLUS_VERSION; // version number of installed plug-in
} elseif (file_exists(SIGPLUS_MANIFEST_FILE)) { // available since 1.4.x
if (function_exists('simplexml_load_file')) {
$xml = simplexml_load_file(SIGPLUS_MANIFEST_FILE);
$current = (string) $xml->version;
} else {
$current = false;
}
} else { // not yet installed
$current = false;
}
$required = '1.5.0'; // minimum version required for silent upgrade installation to succeed
$supported = $current === false || $current === '$__'.'VERSION'.'__$' || version_compare($current, $required) >= 0; // allow upgrading experimental versions
// raise a warning unless upgrading one Novo version to another Novo version
if (!$supported) {
$message = str_replace(array('{$current}','{$required}'), array($current, $required), JText::_('SIGPLUS_INSTALLER_MIGRATE_SETTINGS'));
$app = JFactory::getApplication();
$app->enqueueMessage($message, 'warning');
}
SigPlusNovoDatabaseSetup::update();
break;
}
}
function postflight($type, $parent) {
switch ($type) {
case 'update':
self::migrateConfiguration();
self::removeCacheFolder(false);
case 'install': // runs after installation is complete
self::checkDependencies();
self::minifyAllStylesheets();
SigPlusNovoDatabaseSetup::populate();
break;
}
}
private static function checkDependencies() {
require_once dirname(__FILE__).DIRECTORY_SEPARATOR.'core'.DIRECTORY_SEPARATOR.'librarian.php';
$app = JFactory::getApplication();
if (!is_gd_supported() && !is_imagick_supported()) {
$app->enqueueMessage(JText::_('SIGPLUS_INSTALLER_LIBRARY_IMAGE'), 'warning');
}
if (!function_exists('exif_read_data')) {
$app->enqueueMessage(JText::_('SIGPLUS_INSTALLER_LIBRARY_EXIF'), 'warning');
}
if (!extension_loaded('openssl')) {
$app->enqueueMessage(JText::_('SIGPLUS_INSTALLER_LIBRARY_OPENSSL'), 'warning');
}
if (!ini_get('allow_url_fopen')) {
$app->enqueueMessage(JText::_('SIGPLUS_INSTALLER_PHP_URL_FOPEN'), 'warning');
}
if (!in_array('http', stream_get_wrappers(), true)) {
$app->enqueueMessage(JText::_('SIGPLUS_INSTALLER_PHP_HTTP_WRAPPER'), 'warning');
}
}
/**
* Minifies a group of stylesheets in the specified folder.
* To be used as a callback function to walkdir.
*/
public static function minifyStylesheets($path, $files, $folders) {
foreach ($files as $file) {
if (preg_match('/(?<!\.min)\.css$/', $file)) {
$original_file_full_path = $path.DIRECTORY_SEPARATOR.$file;
$minified_file_full_path = $path.DIRECTORY_SEPARATOR.basename($file,'.css').'.min.css';
$original_file_last_modified = filemtime($original_file_full_path);
$minified_file_last_modified = filemtime($minified_file_full_path);
// make sure there is no corresponding minified file or the original file has been modified since the minified file was created
if ($original_file_last_modified !== false && $minified_file_last_modified !== false && $original_file_last_modified <= $minified_file_last_modified) {
continue;
}
// minify stylesheet files
$stylesheet = Minify_CSS_Compressor::process(file_get_contents($original_file_full_path));
// substitute image URLs with data URIs
$stylesheet = SigPlusNovoUriSubstitution::replace($stylesheet, $path.DIRECTORY_SEPARATOR.dirname($file), $count);
// write file
file_put_contents($minified_file_full_path, $stylesheet);
}
}
}
/**
* Minifies stylesheets.
*/
private static function minifyAllStylesheets() {
require_once dirname(__FILE__).DIRECTORY_SEPARATOR.'core'.DIRECTORY_SEPARATOR.'filesystem.php';
walkdir(JPATH_ROOT.DIRECTORY_SEPARATOR.'media'.DIRECTORY_SEPARATOR.SIGPLUS_MEDIA_FOLDER, array(), -1, array(__CLASS__, 'minifyStylesheets'));
}
/**
* Cleans a cache folder.
* @param {string} $folder The name of the folder whose contents to remove from the cache.
*/
private static function removeCacheFolder($complete = true) {
$folder = JPATH_ROOT.DIRECTORY_SEPARATOR.'cache'.DIRECTORY_SEPARATOR.'sigplus'; // use site cache folder, not administrator cache folder
if (file_exists($folder)) {
$files = scandir($folder);
if ($files !== false) {
foreach ($files as $file) {
if ($file[0] != '.') { // skip parent directory entries and hidden files
unlink($folder.DIRECTORY_SEPARATOR.$file);
}
}
if ($complete) {
rmdir($folder);
}
}
}
}
private static function migrateConfiguration() {
$db = JFactory::getDbo();
// read existing plug-in configuration settings
$db->setQuery('SELECT params FROM #__extensions WHERE type = '.$db->quote('plugin').' AND folder = '.$db->quote('content').' AND element = '.$db->quote('sigplus'));
$oldparams = json_decode($db->loadResult(), true);
// make sure we are migrating a 1.4.x installation to a 1.5.x installation
if ( !empty($oldparams)
&& !isset($oldparams['preview_width'])
&& !isset($oldparams['preview_height'])
&& !isset($oldparams['library_image'])
&& !isset($oldparams['tag_gallery'])
) {
$newparams = SigPlusNovoDatabaseSetup::migrateExtensionConfiguration($oldparams);
// store the combined new and existing plug-in settings back as a JSON string
$paramstring = json_encode($newparams);
$db->setQuery('UPDATE #__extensions SET params = ' . $db->quote($paramstring) . ' WHERE type = '.$db->quote('plugin').' AND folder = '.$db->quote('content').' AND element = '.$db->quote('sigplus'));
$db->execute();
}
}
}
/**
* Compatibility layer for installing sigplus Novo as a next version of sigplus.
*/
class plgContentSIGPlusInstallerScript extends plgContentSigPlusNovoInstallerScript {
}
class SigPlusNovoUriSubstitution {
/**
* The root path w.r.t. relative URLs are to be interpreted.
*/
private $root;
private function __construct($root) {
$this->root = $root;
}
public static function replace($contents, $path, &$count) {
return preg_replace_callback(
'#url\(("(?!\w+:)[^"]+"|\'(?!\w+:)[^\']+\'|(?!\w+:)[^()]+)\)#', // (?!\w+:) is a negative lookahead assertion to skip absolute URLs
array(new self($path), 'preg_replace'),
$contents, -1, $count
);
}
/**
* Replaces an image URL reference with a data URI.
* @param {array} $match A CSS url() function match.
* This function is to be passed to preg_replace_callback.
*/
public function preg_replace($match) {
$url = $match[1];
if ($url[0] == '"' || $url == "'") { // unquote quoted strings
$url = trim($url, $url[0]);
}
$path = $this->root.DIRECTORY_SEPARATOR.str_replace('/', DIRECTORY_SEPARATOR, $url);
if (file_exists($path) && ($imagedata = getimagesize($path)) !== false) {
return 'url("'.self::datauri($imagedata['mime'], file_get_contents($path)).'")';
} else {
return $match[0];
}
}
/**
* Converts raw data to a data URI.
* @param {string} $mime Content MIME type.
* @param {string} $data Content raw data.
*/
private static function datauri($mime, $data) {
return 'data:' . $mime . ';base64,' . base64_encode($data);
}
}
/**
* Class Minify_CSS_Compressor
* @package Minify
*/
/**
* Compress CSS
*
* This is a heavy regex-based removal of whitespace, unnecessary
* comments and tokens, and some CSS value minimization, where practical.
* Many steps have been taken to avoid breaking comment-based hacks,
* including the ie5/mac filter (and its inversion), but expect tricky
* hacks involving comment tokens in 'content' value strings to break
* minimization badly. A test suite is available.
*
* @package Minify
* @author Stephen Clay <steve@mrclay.org>
* @author http://code.google.com/u/1stvamp/ (Issue 64 patch)
* @see https://code.google.com/p/minify/downloads/detail?name=minify-2.1.5.zip
*/
class Minify_CSS_Compressor {
/**
* Minify a CSS string
*
* @param string $css
*
* @param array $options (currently ignored)
*
* @return string
*/
public static function process($css, $options = array())
{
$obj = new Minify_CSS_Compressor($options);
return $obj->_process($css);
}
/**
* @var array
*/
protected $_options = null;
/**
* Are we "in" a hack? I.e. are some browsers targetted until the next comment?
*
* @var bool
*/
protected $_inHack = false;
/**
* Constructor
*
* @param array $options (currently ignored)
*/
private function __construct($options) {
$this->_options = $options;
}
/**
* Minify a CSS string
*
* @param string $css
*
* @return string
*/
protected function _process($css)
{
$css = str_replace("\r\n", "\n", $css);
// preserve empty comment after '>'
// http://www.webdevout.net/css-hacks#in_css-selectors
$css = preg_replace('@>/\\*\\s*\\*/@', '>/*keep*/', $css);
// preserve empty comment between property and value
// http://css-discuss.incutio.com/?page=BoxModelHack
$css = preg_replace('@/\\*\\s*\\*/\\s*:@', '/*keep*/:', $css);
$css = preg_replace('@:\\s*/\\*\\s*\\*/@', ':/*keep*/', $css);
// apply callback to all valid comments (and strip out surrounding ws
$css = preg_replace_callback('@\\s*/\\*([\\s\\S]*?)\\*/\\s*@'
,array($this, '_commentCB'), $css);
// remove ws around { } and last semicolon in declaration block
$css = preg_replace('/\\s*{\\s*/', '{', $css);
$css = preg_replace('/;?\\s*}\\s*/', '}', $css);
// remove ws surrounding semicolons
$css = preg_replace('/\\s*;\\s*/', ';', $css);
// remove ws around urls
$css = preg_replace('/
url\\( # url(
\\s*
([^\\)]+?) # 1 = the URL (really just a bunch of non right parenthesis)
\\s*
\\) # )
/x', 'url($1)', $css);
// remove ws between rules and colons
$css = preg_replace('/
\\s*
([{;]) # 1 = beginning of block or rule separator
\\s*
([\\*_]?[\\w\\-]+) # 2 = property (and maybe IE filter)
\\s*
:
\\s*
(\\b|[#\'"-]) # 3 = first character of a value
/x', '$1$2:$3', $css);
// remove ws in selectors
$css = preg_replace_callback('/
(?: # non-capture
\\s*
[^~>+,\\s]+ # selector part
\\s*
[,>+~] # combinators
)+
\\s*
[^~>+,\\s]+ # selector part
{ # open declaration block
/x'
,array($this, '_selectorsCB'), $css);
// minimize hex colors
$css = preg_replace('/([^=])#([a-f\\d])\\2([a-f\\d])\\3([a-f\\d])\\4([\\s;\\}])/i'
, '$1#$2$3$4$5', $css);
// remove spaces between font families
$css = preg_replace_callback('/font-family:([^;}]+)([;}])/'
,array($this, '_fontFamilyCB'), $css);
$css = preg_replace('/@import\\s+url/', '@import url', $css);
// replace any ws involving newlines with a single newline
$css = preg_replace('/[ \\t]*\\n+\\s*/', "\n", $css);
// separate common descendent selectors w/ newlines (to limit line lengths)
$css = preg_replace('/([\\w#\\.\\*]+)\\s+([\\w#\\.\\*]+){/', "$1\n$2{", $css);
// Use newline after 1st numeric value (to limit line lengths).
$css = preg_replace('/
((?:padding|margin|border|outline):\\d+(?:px|em)?) # 1 = prop : 1st numeric value
\\s+
/x'
,"$1\n", $css);
// prevent triggering IE6 bug: http://www.crankygeek.com/ie6pebug/
$css = preg_replace('/:first-l(etter|ine)\\{/', ':first-l$1 {', $css);
return trim($css);
}
/**
* Replace what looks like a set of selectors
*
* @param array $m regex matches
*
* @return string
*/
protected function _selectorsCB($m)
{
// remove ws around the combinators
return preg_replace('/\\s*([,>+~])\\s*/', '$1', $m[0]);
}
/**
* Process a comment and return a replacement
*
* @param array $m regex matches
*
* @return string
*/
protected function _commentCB($m)
{
$hasSurroundingWs = (trim($m[0]) !== $m[1]);
$m = $m[1];
// $m is the comment content w/o the surrounding tokens,
// but the return value will replace the entire comment.
if ($m === 'keep') {
return '/**/';
}
if ($m === '" "') {
// component of http://tantek.com/CSS/Examples/midpass.html
return '/*" "*/';
}
if (preg_match('@";\\}\\s*\\}/\\*\\s+@', $m)) {
// component of http://tantek.com/CSS/Examples/midpass.html
return '/*";}}/* */';
}
if ($this->_inHack) {
// inversion: feeding only to one browser
if (preg_match('@
^/ # comment started like /*/
\\s*
(\\S[\\s\\S]+?) # has at least some non-ws content
\\s*
/\\* # ends like /*/ or /**/
@x', $m, $n)) {
// end hack mode after this comment, but preserve the hack and comment content
$this->_inHack = false;
return "/*/{$n[1]}/**/";
}
}
if (substr($m, -1) === '\\') { // comment ends like \*/
// begin hack mode and preserve hack
$this->_inHack = true;
return '/*\\*/';
}
if ($m !== '' && $m[0] === '/') { // comment looks like /*/ foo */
// begin hack mode and preserve hack
$this->_inHack = true;
return '/*/*/';
}
if ($this->_inHack) {
// a regular comment ends hack mode but should be preserved
$this->_inHack = false;
return '/**/';
}
// Issue 107: if there's any surrounding whitespace, it may be important, so
// replace the comment with a single space
return $hasSurroundingWs // remove all other comments
? ' '
: '';
}
/**
* Process a font-family listing and return a replacement
*
* @param array $m regex matches
*
* @return string
*/
protected function _fontFamilyCB($m)
{
// Issue 210: must not eliminate WS between words in unquoted families
$pieces = preg_split('/(\'[^\']+\'|"[^"]+")/', $m[1], null, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
$out = 'font-family:';
while (null !== ($piece = array_shift($pieces))) {
if ($piece[0] !== '"' && $piece[0] !== "'") {
$piece = preg_replace('/\\s+/', ' ', $piece);
$piece = preg_replace('/\\s?,\\s?/', ',', $piece);
}
$out .= $piece;
}
return $out . $m[2];
}
}