From 97ae39ccadb036d1365cb9f4f646105f983261cf Mon Sep 17 00:00:00 2001 From: optipic Date: Mon, 14 Jun 2021 03:21:12 +0300 Subject: [PATCH] v1.18.0 --- app/addons/optipic/ImgUrlConverter.php | 84 +++++++++++++++++++++++--- app/addons/optipic/Optipic.php | 1 + app/addons/optipic/addon.xml | 7 ++- app/addons/optipic/func.php | 2 + var/langs/en/addons/optipic.po | 8 +++ var/langs/ru/addons/optipic.po | 8 +++ 6 files changed, 100 insertions(+), 10 deletions(-) diff --git a/app/addons/optipic/ImgUrlConverter.php b/app/addons/optipic/ImgUrlConverter.php index a87b72d..888a2c5 100644 --- a/app/addons/optipic/ImgUrlConverter.php +++ b/app/addons/optipic/ImgUrlConverter.php @@ -16,7 +16,7 @@ class ImgUrlConverter { /** * Library version number */ - const VERSION = '1.15'; + const VERSION = '1.18'; /** * ID of your site on CDN OptiPic.io service @@ -48,6 +48,8 @@ class ImgUrlConverter { public static $enableLog = false; + public static $cdnDomain = 'cdn.optipic.io'; + /** * Constructor */ @@ -180,9 +182,23 @@ public static function convertHtml($content) { array('\'', '\''), // '' array('\(', '\)'), // () ); + + $cdnDomains = array( + 'cdn.optipic.io', + ); + + $cdnDomains[] = self::$cdnDomain; + $cdnDomains = array_unique($cdnDomains); + + $cdnDomainsForRegexp = array(); + foreach($cdnDomains as $cdnDomain) { + $cdnDomainsForRegexp[] = '\/\/'.preg_quote($cdnDomain, '#'); + } + $cdnDomainsForRegexp = implode("|", $cdnDomainsForRegexp); + $regexp = array(); foreach($urlBorders as $border) { - $regexp[] = '#('.$border[0].')'.$host.'('.$firstPartOfUrl.'(?!\/\/cdn\.optipic\.io)[^'.$border[1].']+\.(png|jpg|jpeg){1}(\?[^"\'\s]*?)?)('.$border[1].')#siS'; + $regexp[] = '#('.$border[0].')'.$host.'('.$firstPartOfUrl.'(?!'.$cdnDomainsForRegexp.')[^'.$border[1].']+\.(png|jpg|jpeg){1}(\?[^"\'\s]*?)?)('.$border[1].')#siS'; } //var_dump($regexp);exit; @@ -198,6 +214,8 @@ public static function convertHtml($content) { self::$baseUrl = false; + $content = str_replace('', '' . PHP_EOL . self::getPreloadTags(), $content); + if($gziped) { $content = gzencode($content); @@ -214,6 +232,15 @@ public static function convertHtml($content) { return $content; } + + + public static function getPreloadTags() { + return '' . PHP_EOL + . ''; + } + + + public static function trimList($list) { $trimmed = array(); foreach ($list as $ind => $item) { @@ -272,6 +299,10 @@ public static function loadConfig($source=false) { self::$enableLog = true; } } + + if(!empty($source['cdn_domain'])) { + self::$cdnDomain = $source['cdn_domain']; + } } elseif(file_exists($source)) { $config = require($source); @@ -326,7 +357,7 @@ public static function callbackForPregReplace($matches) { } } - $ext = pathinfo($parseUrl['path'], PATHINFO_EXTENSION); + $ext = strtolower(pathinfo($parseUrl['path'], PATHINFO_EXTENSION)); if(!in_array($ext, array('png', 'jpg', 'jpeg'))) { return $replaceWithoutOptiPic; } @@ -338,7 +369,7 @@ public static function callbackForPregReplace($matches) { $urlOriginal = self::getUrlFromRelative($urlOriginal, self::$baseUrl); - $replaceWithOptiPic = $matches[1].'//cdn.optipic.io/site-'.self::$siteId.$urlOriginal.$matches[5]; + $replaceWithOptiPic = $matches[1].'//'.self::$cdnDomain.'/site-'.self::$siteId.$urlOriginal.$matches[5]; self::log($urlOriginal, 'callbackForPregReplace -> url original:'); self::log($replaceWithOptiPic, 'callbackForPregReplace -> url with optipic:'); @@ -423,6 +454,10 @@ public static function isGz($str) { } public static function getUrlFromRelative($relativeUrl, $baseUrl=false) { + if(stripos($relativeUrl, '../')!==false) { + $relativeUrl = self::resolveFilename($relativeUrl); + } + if(substr($relativeUrl, 0, 1)=='/') { return $relativeUrl; } @@ -434,13 +469,31 @@ public static function getUrlFromRelative($relativeUrl, $baseUrl=false) { //$baseUrl = pathinfo($_SERVER['REQUEST_URI'], PATHINFO_DIRNAME); $baseUrl = self::getBaseDirOfUrl($_SERVER['REQUEST_URI']); } - $baseUrl .= '/'; + //$baseUrl .= '/'; + $url = str_replace('//', '/', $baseUrl.$relativeUrl); return $url; } + public static function resolveFilename($filename) { + $filename = str_replace('//', '/', $filename); + $parts = explode('/', $filename); + $out = array(); + foreach ($parts as $part){ + if ($part == '.') continue; + if ($part == '..') { + array_pop($out); + continue; + } + $out[] = $part; + } + return implode('/', $out); + } + + + /** * Get main base path (dir) from full URL * @@ -452,11 +505,24 @@ public static function getBaseDirOfUrl($url) { return '/'; } $urlPath = $urlParsed['path']; + $baseUrl = $urlPath; $pathinfo = pathinfo($urlPath); if(!empty($pathinfo['extension'])) { - return $pathinfo['dirname']; + $baseUrl = $pathinfo['dirname']; } - return $urlPath; + + if(stripos($url, $baseUrl.'/')!==false) { + $baseUrl .= '/'; + } + + if(substr($baseUrl, -1)!='/') { + $pathinfo = pathinfo($baseUrl); + if(!empty($pathinfo['dirname'])) { + $baseUrl = $pathinfo['dirname']; + } + } + + return $baseUrl; } public static function getBaseUrlFromHtml($html) { @@ -467,9 +533,9 @@ public static function getBaseUrlFromHtml($html) { $baseUrl = trim($matches['base_url'], '"/'); $baseUrl = trim($baseUrl, "'"); $baseUrl = self::getBaseDirOfUrl($baseUrl); - if(strlen($baseUrl)>0 && substr($baseUrl, -1, 1)!='/') { + /*if(strlen($baseUrl)>0 && substr($baseUrl, -1, 1)!='/') { $baseUrl .= '/'; - } + }*/ } return $baseUrl; } diff --git a/app/addons/optipic/Optipic.php b/app/addons/optipic/Optipic.php index c14a5c4..1d6a2ae 100644 --- a/app/addons/optipic/Optipic.php +++ b/app/addons/optipic/Optipic.php @@ -13,6 +13,7 @@ public function getSettings() 'exclusions_url' => Registry::get('addons.optipic.exclusions_url')!='' ? explode("\n", Registry::get('addons.optipic.exclusions_url')) : array(), 'whitelist_img_urls' => Registry::get('addons.optipic.whitelist_img_urls')!='' ? explode("\n", Registry::get('addons.optipic.whitelist_img_urls')) : array(), 'srcset_attrs' => Registry::get('addons.optipic.srcset_attrs')!='' ? explode("\n", Registry::get('addons.optipic.srcset_attrs')) : array(), + 'cdn_domain' => Registry::get('addons.optipic.cdn_domain'), ); } diff --git a/app/addons/optipic/addon.xml b/app/addons/optipic/addon.xml index 4cc58b3..a9cfba3 100644 --- a/app/addons/optipic/addon.xml +++ b/app/addons/optipic/addon.xml @@ -12,7 +12,7 @@ OptiPic.io - image optimization via smart CDN. The module automates the process of optimizing and compressing all images on the site according to the recommendations of Google PageSpeed Insights. -1.15.0 +1.18.0 en @@ -78,6 +78,11 @@ textarea + + input + + cdn.optipic.io + info fn_optipic_settings_field_info diff --git a/app/addons/optipic/func.php b/app/addons/optipic/func.php index 0262c46..65c71f7 100644 --- a/app/addons/optipic/func.php +++ b/app/addons/optipic/func.php @@ -35,6 +35,8 @@ function fn_optipic_settings_field_info() { $html = ''; + $html .= '
'.__('optipic.cdn_domain_description').'
'; + //$html .= var_export(\optipic\cdn\ImgUrlConverter::getDefaultSettings(), true); $defaultSettings = \optipic\cdn\ImgUrlConverter::getDefaultSettings(); $defaultDomains = implode("\\n", $defaultSettings['domains']); diff --git a/var/langs/en/addons/optipic.po b/var/langs/en/addons/optipic.po index a229d1a..d258219 100644 --- a/var/langs/en/addons/optipic.po +++ b/var/langs/en/addons/optipic.po @@ -39,3 +39,11 @@ msgstr "Replace only URLs of images starting with a mask" msgctxt "SettingsOptions::optipic::srcset_attrs" msgid "List of 'srcset' attributes" msgstr "List of 'srcset' attributes" + +msgctxt "SettingsOptions::optipic::cdn_domain" +msgid "CDNdomain" +msgstr "CDN domain" + +msgctxt "Languages::optipic.cdn_domain_description" +msgid "cdn_domain_description" +msgstr "CDN domain: Domain through which CDN OptiPic will work. You can use your subdomain (img.yourdomain.com, optipic.yourdomain.com, etc.) instead of the standard cdn.optipic.io. To connect your subdomain, contact OptiPic technical support." \ No newline at end of file diff --git a/var/langs/ru/addons/optipic.po b/var/langs/ru/addons/optipic.po index 355620d..579076a 100644 --- a/var/langs/ru/addons/optipic.po +++ b/var/langs/ru/addons/optipic.po @@ -39,3 +39,11 @@ msgstr "Подменять только URL изображений, начина msgctxt "SettingsOptions::optipic::srcset_attrs" msgid "List of 'srcset' attributes" msgstr "Список 'srcset' атрибутов" + +msgctxt "SettingsOptions::optipic::cdn_domain" +msgid "CDNdomain" +msgstr "CDN домен" + +msgctxt "Languages::optipic.cdn_domain_description" +msgid "cdn_domain_description" +msgstr "CDN домен: Домен через который будет работать CDN OptiPic. Вы можете использовать поддомен вашего домена (img.yourdomain.com, optipic.yourdomain.com и т.п.) вместо стандартного cdn.optipic.io. Для подключению своего поддомена обратитесь в техподдержку OptiPic." \ No newline at end of file