File "AlterHtmlHelper.php"
Full Path: /home/amervokv/ecomlive.net/wp-content/plugins/webp-express/lib/classes/AlterHtmlHelper.php
File size: 12.62 KB
MIME-type: text/x-php
Charset: utf-8
<?php
namespace WebPExpress;
//use AlterHtmlInit;
use \WebPExpress\Config;
use \WebPExpress\Paths;
use \WebPExpress\PathHelper;
use \WebPExpress\Multisite;
use \WebPExpress\Option;
class AlterHtmlHelper
{
public static $options;
/*
public static function hasWebP($src)
{
return true;
}
public static function inUploadDir($src)
{
$upload_dir = wp_upload_dir();
$src_url = parse_url($upload_dir['baseurl']);
$upload_path = $src_url['path'];
return (strpos($src, $upload_path) !== false );
}
public static function checkSrc($src)
{
self::$options = \WebPExpress\AlterHtmlInit::self::$options();
if (self::$options['destination-folder'] == 'mingled') {
}
}
*/
public static function getOptions() {
if (!isset(self::$options)) {
self::$options = json_decode(Option::getOption('webp-express-alter-html-options', null), true);
if (!isset(self::$options['prevent-using-webps-larger-than-original'])) {
self::$options['prevent-using-webps-larger-than-original'] = true;
}
// Set scope if it isn't there (it wasn't cached until 0.17.5)
if (!isset(self::$options['scope'])) {
$config = Config::loadConfig();
if ($config) {
$config = Config::fix($config, false);
self::$options['scope'] = $config['scope'];
Option::updateOption(
'webp-express-alter-html-options',
json_encode(self::$options, JSON_UNESCAPED_SLASHES | JSON_NUMERIC_CHECK),
true
);
}
}
}
}
/**
* Gets relative path between a base url and another.
* Returns false if the url isn't a subpath
*
* @param $imageUrl (ie "http://example.com/wp-content/image.jpg")
* @param $baseUrl (ie "http://example.com/wp-content")
* @return path or false (ie "/image.jpg")
*/
public static function getRelUrlPath($imageUrl, $baseUrl)
{
$baseUrlComponents = parse_url($baseUrl);
/* ie:
(
[scheme] => http
[host] => we0
[path] => /wordpress/uploads-moved
)*/
$imageUrlComponents = parse_url($imageUrl);
/* ie:
(
[scheme] => http
[host] => we0
[path] => /wordpress/uploads-moved/logo.jpg
)*/
if ($baseUrlComponents['host'] != $imageUrlComponents['host']) {
return false;
}
// Check if path begins with base path
if (strpos($imageUrlComponents['path'], $baseUrlComponents['path']) !== 0) {
return false;
}
// Remove base path from path (we know it begins with basepath, from previous check)
return substr($imageUrlComponents['path'], strlen($baseUrlComponents['path']));
}
/**
* Looks if $imageUrl is rooted in $baseUrl and if the file is there
* PS: NOT USED ANYMORE!
*
* @param $imageUrl (ie http://example.com/wp-content/image.jpg)
* @param $baseUrl (ie http://example.com/wp-content)
* @param $baseDir (ie /var/www/example.com/wp-content)
*/
public static function isImageUrlHere($imageUrl, $baseUrl, $baseDir)
{
$srcPathRel = self::getRelUrlPath($imageUrl, $baseUrl);
if ($srcPathRel === false) {
return false;
}
// Calculate file path to src
$srcPathAbs = $baseDir . $srcPathRel;
//return 'dyt:' . $srcPathAbs;
// Check that src file exists
if (!@file_exists($srcPathAbs)) {
return false;
}
return true;
}
// NOT USED ANYMORE
public static function isSourceInUpload($src)
{
/* $src is ie http://we0/wp-content-moved/themes/twentyseventeen/assets/images/header.jpg */
$uploadDir = wp_upload_dir();
/* ie:
[path] => /var/www/webp-express-tests/we0/wordpress/uploads-moved
[url] => http://we0/wordpress/uploads-moved
[subdir] =>
[basedir] => /var/www/webp-express-tests/we0/wordpress/uploads-moved
[baseurl] => http://we0/wordpress/uploads-moved
[error] =>
*/
return self::isImageUrlHere($src, $uploadDir['baseurl'], $uploadDir['basedir']);
}
/**
* Get url for webp from source url, (if ), given a certain baseUrl / baseDir.
* Base can for example be uploads or wp-content.
*
* returns false:
* - if no source file found in that base
* - if source file is found but webp file isn't there and the `only-for-webps-that-exists` option is set
* - if webp is marked as bigger than source
*
* @param string $sourceUrl Url of source image (ie http://example.com/wp-content/image.jpg)
* @param string $rootId Id (created in Config::updateAutoloadedOptions). Ie "uploads", "content" or any image root id
* @param string $baseUrl Base url of source image (ie http://example.com/wp-content)
* @param string $baseDir Base dir of source image (ie /var/www/example.com/wp-content)
*/
public static function getWebPUrlInImageRoot($sourceUrl, $rootId, $baseUrl, $baseDir)
{
$srcPathRel = self::getRelUrlPath($sourceUrl, $baseUrl);
if ($srcPathRel === false) {
return false;
}
// Calculate file path to source
$srcPathAbs = $baseDir . $srcPathRel;
// Check that source file exists
if (!@file_exists($srcPathAbs)) {
return false;
}
if (file_exists($srcPathAbs . '.do-not-convert')) {
return false;
}
if (file_exists($srcPathAbs . '.dontreplace')) {
return false;
}
// Calculate destination of webp (both path and url)
// ----------------------------------------
// We are calculating: $destPathAbs and $destUrl.
// Make sure the options are loaded (and fixed)
self::getOptions();
$destinationOptions = new DestinationOptions(
self::$options['destination-folder'] == 'mingled',
self::$options['destination-structure'] == 'doc-root',
self::$options['destination-extension'] == 'set',
self::$options['scope']
);
if (!isset(self::$options['scope']) || !in_array($rootId, self::$options['scope'])) {
return false;
}
$destinationRoot = Paths::destinationRoot($rootId, $destinationOptions);
$relPathFromImageRootToSource = PathHelper::getRelDir(
realpath(Paths::getAbsDirById($rootId)), // note: In multisite (subfolders), it contains ie "/site/2/"
realpath($srcPathAbs)
);
$relPathFromImageRootToDest = ConvertHelperIndependent::appendOrSetExtension(
$relPathFromImageRootToSource,
self::$options['destination-folder'],
self::$options['destination-extension'],
($rootId == 'uploads')
);
$destPathAbs = $destinationRoot['abs-path'] . '/' . $relPathFromImageRootToDest;
$webpMustExist = self::$options['only-for-webps-that-exists'];
if ($webpMustExist && (!@file_exists($destPathAbs))) {
return false;
}
// check if webp is marked as bigger than source
/*
$biggerThanSourcePath = Paths::getBiggerThanSourceDirAbs() . '/' . $rootId . '/' . $relPathFromImageRootToDest;
if (@file_exists($biggerThanSourcePath)) {
return false;
}*/
// check if webp is larger than original
if (self::$options['prevent-using-webps-larger-than-original']) {
if (BiggerThanSource::bigger($srcPathAbs, $destPathAbs)) {
return false;
}
}
$destUrl = $destinationRoot['url'] . '/' . $relPathFromImageRootToDest;
// Fix scheme (use same as source)
$sourceUrlComponents = parse_url($sourceUrl);
$destUrlComponents = parse_url($destUrl);
$port = isset($sourceUrlComponents['port']) ? ":" . $sourceUrlComponents['port'] : "";
$result = $sourceUrlComponents['scheme'] . '://' . $sourceUrlComponents['host'] . $port . $destUrlComponents['path'];
/*
error_log(
"getWebPUrlInImageRoot:\n" .
"- url: " . $sourceUrl . "\n" .
"- baseUrl: " . $baseUrl . "\n" .
"- baseDir: " . $baseDir . "\n" .
"- root id: " . $rootId . "\n" .
"- root abs: " . Paths::getAbsDirById($rootId) . "\n" .
"- destination root (abs): " . $destinationRoot['abs-path'] . "\n" .
"- destination root (url): " . $destinationRoot['url'] . "\n" .
"- rel: " . $srcPathRel . "\n" .
"- srcPathAbs: " . $srcPathAbs . "\n" .
'- relPathFromImageRootToSource: ' . $relPathFromImageRootToSource . "\n" .
'- get_blog_details()->path: ' . get_blog_details()->path . "\n" .
"- result: " . $result . "\n"
);*/
return $result;
}
/**
* Get url for webp
* returns second argument if no webp
*
* @param $sourceUrl
* @param $returnValueOnFail
*/
public static function getWebPUrl($sourceUrl, $returnValueOnFail)
{
// Get the options
self::getOptions();
// Fail for webp-disabled browsers (when "only-for-webp-enabled-browsers" is set)
if (self::$options['only-for-webp-enabled-browsers']) {
if (!isset($_SERVER['HTTP_ACCEPT']) || (strpos($_SERVER['HTTP_ACCEPT'], 'image/webp') === false)) {
return $returnValueOnFail;
}
}
// Fail for relative urls. Wordpress doesn't use such very much anyway
if (!preg_match('#^https?://#', $sourceUrl)) {
return $returnValueOnFail;
}
// Fail if the image type isn't enabled
switch (self::$options['image-types']) {
case 0:
return $returnValueOnFail;
case 1:
if (!preg_match('#(jpe?g)$#', $sourceUrl)) {
return $returnValueOnFail;
}
break;
case 2:
if (!preg_match('#(png)$#', $sourceUrl)) {
return $returnValueOnFail;
}
break;
case 3:
if (!preg_match('#(jpe?g|png)$#', $sourceUrl)) {
return $returnValueOnFail;
}
break;
}
//error_log('source url:' . $sourceUrl);
// Try all image roots
foreach (self::$options['scope'] as $rootId) {
$baseDir = Paths::getAbsDirById($rootId);
$baseUrl = Paths::getUrlById($rootId);
if (Multisite::isMultisite() && ($rootId == 'uploads')) {
$baseUrl = Paths::getUploadUrl();
$baseDir = Paths::getUploadDirAbs();
}
$result = self::getWebPUrlInImageRoot($sourceUrl, $rootId, $baseUrl, $baseDir);
if ($result !== false) {
return $result;
}
// Try the hostname aliases.
if (!isset(self::$options['hostname-aliases'])) {
continue;
}
$hostnameAliases = self::$options['hostname-aliases'];
$hostname = Paths::getHostNameOfUrl($baseUrl);
$baseUrlComponents = parse_url($baseUrl);
$sourceUrlComponents = parse_url($sourceUrl);
// ie: [scheme] => http, [host] => we0, [path] => /wordpress/uploads-moved
if ((!isset($baseUrlComponents['host'])) || (!isset($sourceUrlComponents['host']))) {
continue;
}
foreach ($hostnameAliases as $hostnameAlias) {
if ($sourceUrlComponents['host'] != $hostnameAlias) {
continue;
}
//error_log('hostname alias:' . $hostnameAlias);
$baseUrlOnAlias = $baseUrlComponents['scheme'] . '://' . $hostnameAlias . $baseUrlComponents['path'];
//error_log('baseurl (alias):' . $baseUrlOnAlias);
$result = self::getWebPUrlInImageRoot($sourceUrl, $rootId, $baseUrlOnAlias, $baseDir);
if ($result !== false) {
$resultUrlComponents = parse_url($result);
return $sourceUrlComponents['scheme'] . '://' . $hostnameAlias . $resultUrlComponents['path'];
}
}
}
return $returnValueOnFail;
}
/*
public static function getWebPUrlOrSame($sourceUrl, $returnValueOnFail)
{
return self::getWebPUrl($sourceUrl, $sourceUrl);
}*/
}