diff --git a/CHANGELOG.md b/CHANGELOG.md index 483bc21..a5ae766 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +xxxx.xx.xx +- require Dotclear 2.26 +- use PHP namespace +- use new plugin structure +- use new Form class +- add icon url on blog pref + 2022.12.23 - use anonymlous functions - code review (phpstan, php-cs-fixer) diff --git a/_define.php b/_define.php index d9327b6..9dbdda3 100644 --- a/_define.php +++ b/_define.php @@ -18,17 +18,17 @@ $this->registerModule( 'Simply favicon', 'Multi-agents favicon', 'Jean-Christian Denis', - '2022.12.23', + '2023.03.06', [ - 'requires' => [['core', '2.24']], + 'requires' => [['core', '2.26-dev']], 'permissions' => dcCore::app()->auth->makePermissions([ dcAuth::PERMISSION_ADMIN, ]), - 'type' => 'plugin', - 'support' => 'https://github.com/JcDenis/' . basename(__DIR__), - 'details' => 'http://plugins.dotaddict.org/dc2/details/' . basename(__DIR__), - 'repository' => 'https://raw.githubusercontent.com/JcDenis/' . basename(__DIR__) . '/master/dcstore.xml', - 'settings' => [ + 'type' => 'plugin', + 'support' => 'https://github.com/JcDenis/' . basename(__DIR__), + 'details' => 'http://plugins.dotaddict.org/dc2/details/' . basename(__DIR__), + 'repository' => 'https://raw.githubusercontent.com/JcDenis/' . basename(__DIR__) . '/master/dcstore.xml', + 'settings' => [ 'blog' => '#params.simply_favicon_params', ], ] diff --git a/locales/fr/main.lang.php b/locales/fr/main.lang.php index 118cdcb..7884222 100644 --- a/locales/fr/main.lang.php +++ b/locales/fr/main.lang.php @@ -9,8 +9,9 @@ # DOT NOT MODIFY THIS FILE ! # -l10n::$locales['Enable "%s" extension'] = 'Activer l\'extension "%s"'; +l10n::$locales['Enable favorite icon'] = 'Activer l\'icône de favori'; l10n::$locales['You must place an image called favicon.png or .jpg or .ico into your blog\'s public directory.'] = 'Vous devez placer une image nommée favicon.png, .jpg ou .ico dans le répertoire publique du blog.'; l10n::$locales['There are no favicon in blog public directory'] = 'Il n\'y a pas de Favicon dans le répertoire public du blog.'; l10n::$locales['Current favicons:'] = 'Favicons actuels :'; l10n::$locales['Multi-agents favicon'] = 'Favicon multi-agents'; +l10n::$locales['Simply favicon'] = 'Simple favicon'; diff --git a/locales/fr/main.po b/locales/fr/main.po index c4dbf4a..96713ed 100644 --- a/locales/fr/main.po +++ b/locales/fr/main.po @@ -1,17 +1,17 @@ msgid "" msgstr "" "Content-Type: text/plain; charset=UTF-8\n" -"Project-Id-Version: simplyFavicon 2021.09.02.1\n" +"Project-Id-Version: simplyFavicon 2023.03.06\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-11-06T09:13:24+00:00\n" +"PO-Revision-Date: 2023-03-06T22:03:39+00:00\n" "Last-Translator: Jean-Christian Denis\n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -msgid "Enable \"%s\" extension" -msgstr "Activer l'extension \"Simply favicon\"" +msgid "Enable favorite icon" +msgstr "Activer l'icône de favori" msgid "You must place an image called favicon.png or .jpg or .ico into your blog's public directory." msgstr "Vous devez placer une image nommée favicon.png, .jpg ou .ico dans le répertoire publique du blog." @@ -24,3 +24,7 @@ msgstr "Favicons actuels :" msgid "Multi-agents favicon" msgstr "Favicon multi-agents" + +msgid "Simply favicon" +msgstr "Simple favicon" + diff --git a/src/Backend.php b/src/Backend.php index 88638c9..7ab9df8 100644 --- a/src/Backend.php +++ b/src/Backend.php @@ -10,37 +10,71 @@ * @copyright Jean-Christian Denis * @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html */ -if (!defined('DC_CONTEXT_ADMIN')) { - return; -} +declare(strict_types=1); -dcCore::app()->addBehaviors([ - 'adminBlogPreferencesFormV2' => function ($blog_settings) { - $exists = []; - $path = path::fullFromRoot((string) $blog_settings->get('system')->get('public_path'), DC_ROOT); - foreach (['ico', 'png', 'bmp', 'gif', 'jpg', 'mng'] as $ext) { - if (file_exists($path . '/favicon.' . $ext)) { - $exists[] = sprintf('
  • %s
  • ', $path . '/favicon.' . $ext, 'favicon.' . $ext); - } +namespace Dotclear\Plugin\simplyFavicon; + +use dcCore; +use dcNsProcess; +use path; + +use Dotclear\Helper\Html\Form\{ + Checkbox, + Div, + Label, + Note, + Para +}; + +class Backend extends dcNsProcess +{ + public static function init(): bool + { + self::$init = defined('DC_CONTEXT_ADMIN'); + + return self::$init; + } + + public static function process(): bool + { + if (!self::$init) { + return false; } - echo - '

    ' . __('Favicon') . '

    ' . - '
    ' . - '

    ' . - '

    ' . - __("You must place an image called favicon.png or .jpg or .ico into your blog's public directory.") . - '

    ' . - ( - empty($exists) ? - '

    ' . __('There are no favicon in blog public directory') . '

    ' : - '

    ' . __('Current favicons:') . '

      ' . implode($exists) . '
    ' - ) . - '

    '; - }, - 'adminBeforeBlogSettingsUpdate' => function ($blog_settings) { - $blog_settings->get('system')->put('simply_favicon', !empty($_POST['simply_favicon'])); - }, -]); + dcCore::app()->addBehaviors([ + 'adminBlogPreferencesFormV2' => function ($blog_settings) { + $exists = []; + $path = path::fullFromRoot((string) $blog_settings->get('system')->get('public_path'), DC_ROOT); + foreach (['ico', 'png', 'bmp', 'gif', 'jpg', 'mng'] as $ext) { + if (file_exists($path . '/favicon.' . $ext)) { + $url = dcCore::app()->blog->url . dcCore::app()->url->getURLFor('simplyFavicon', $ext); + $exists[] = '
  • ' . $url . '
  • '; + } + } + + echo + '

    ' . __('Favicon') . '

    ' . + '
    ' . + (new Div())->class('box')->items([ + (new Para())->items([ + (new Checkbox('simply_favicon', (bool) $blog_settings->get('system')->get('simply_favicon')))->value('1'), + (new Label(__('Enable favorite icon')))->for('simply_favicon')->class('classic'), + ]), + (new Note())->text(__("You must place an image called favicon.png or .jpg or .ico into your blog's public directory."))->class('form-note'), + ])->render() . + '

    ' . + ( + empty($exists) ? + '

    ' . __('There are no favicon in blog public directory') . '

    ' : + '

    ' . __('Current favicons:') . '

      ' . implode($exists) . '
    ' + ) . + '

    '; + }, + 'adminBeforeBlogSettingsUpdate' => function ($blog_settings) { + $blog_settings->get('system')->put('simply_favicon', !empty($_POST['simply_favicon'])); + }, + ]); + + return true; + } +} diff --git a/src/Frontend.php b/src/Frontend.php index b8ed319..1de7af3 100644 --- a/src/Frontend.php +++ b/src/Frontend.php @@ -10,74 +10,63 @@ * @copyright Jean-Christian Denis * @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html */ -if (!defined('DC_RC_PATH')) { - return; -} +declare(strict_types=1); -dcCore::app()->addBehavior('publicHeadContent', ['publicSimplyFavicon', 'publicHeadContent']); +namespace Dotclear\Plugin\simplyFavicon; -class publicSimplyFavicon extends dcUrlHandlers +use dcCore; +use dcNsProcess; +use path; + +class Frontend extends dcNsProcess { - public static $mimetypes = [ - 'ico' => 'image/x-icon', - 'png' => 'image/png', - 'bmp' => 'image/bmp', - 'gif' => 'image/gif', - 'jpg' => 'image/jpeg', - 'mng' => 'video/x-mng', - ]; - - public static function simplyFaviconUrl($arg) + public static function init(): bool { - $public_path = path::fullFromRoot(dcCore::app()->blog->settings->get('system')->get('public_path'), DC_ROOT); + self::$init = defined('DC_RC_PATH'); - if (dcCore::app()->blog->settings->get('system')->get('simply_favicon') - && !empty($arg) - && array_key_exists($arg, self::$mimetypes) - && file_exists($public_path . '/favicon.' . $arg) - ) { - header('Content-Type: ' . self::$mimetypes[$arg] . ';'); - readfile($public_path . '/favicon.' . $arg); - exit; - } - - self::p404(); - - return null; + return self::$init; } - public static function publicHeadContent() + public static function process(): bool { - if (!dcCore::app()->blog->settings->get('system')->get('simply_favicon')) { - return null; + if (!self::$init) { + return false; } - $public_path = path::fullFromRoot(dcCore::app()->blog->settings->get('system')->get('public_path'), DC_ROOT) . '/favicon.'; - $public_url = dcCore::app()->blog->url . dcCore::app()->url->getBase('simplyFavicon') . '.'; + dcCore::app()->addBehavior('publicHeadContent', function () { + if (!dcCore::app()->blog->settings->get('system')->get('simply_favicon')) { + return null; + } - // ico : IE6 - if (file_exists($public_path . 'ico') && '?' != substr(dcCore::app()->blog->url, -1)) { - echo - '' . "\n"; - } - // png: apple and others - if (file_exists($public_path . 'png')) { - echo - '' . "\n" . - '' . "\n"; - // all others - } else { - foreach (self::$mimetypes as $ext => $mime) { - if (in_array($ext, ['ico', 'png'])) { - continue; - } - if (file_exists($public_path . $ext)) { - echo - '' . "\n"; + $public_path = path::fullFromRoot(dcCore::app()->blog->settings->get('system')->get('public_path'), DC_ROOT) . '/favicon.'; + $public_url = dcCore::app()->blog->url . dcCore::app()->url->getBase('simplyFavicon') . '.'; - break; + // ico : IE6 + if (file_exists($public_path . 'ico') && '?' != substr(dcCore::app()->blog->url, -1)) { + echo + '' . "\n"; + } + // png: apple and others + if (file_exists($public_path . 'png')) { + echo + '' . "\n" . + '' . "\n"; + // all others + } else { + foreach (Urlhandler::$mimetypes as $ext => $mime) { + if (in_array($ext, ['ico', 'png'])) { + continue; + } + if (file_exists($public_path . $ext)) { + echo + '' . "\n"; + + break; + } } } - } + }); + + return true; } } diff --git a/src/Prepend.php b/src/Prepend.php index 5a1f922..1d8277b 100644 --- a/src/Prepend.php +++ b/src/Prepend.php @@ -10,10 +10,35 @@ * @copyright Jean-Christian Denis * @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html */ -if (!defined('DC_RC_PATH')) { - return; +declare(strict_types=1); + +namespace Dotclear\Plugin\simplyFavicon; + +use dcCore; +use dcNsProcess; + +class Prepend extends dcNsProcess +{ + public static function init(): bool + { + self::$init = true; + + return self::$init; + } + + public static function process(): bool + { + if (!self::$init) { + return false; + } + + dcCore::app()->url->register( + 'simplyFavicon', + 'favicon', + '^favicon.(.*?)$', + [UrlHandler::class, 'simplyFaviconUrl'] + ); + + return true; + } } - -Clearbricks::lib()->autoload(['publicSimplyFavicon' => __DIR__ . '/_public.php']); - -dcCore::app()->url->register('simplyFavicon', 'favicon', '^favicon.(.*?)$', ['publicSimplyFavicon', 'simplyFaviconUrl']); diff --git a/src/UrlHandler.php b/src/UrlHandler.php new file mode 100644 index 0000000..51b517a --- /dev/null +++ b/src/UrlHandler.php @@ -0,0 +1,48 @@ + 'image/x-icon', + 'png' => 'image/png', + 'bmp' => 'image/bmp', + 'gif' => 'image/gif', + 'jpg' => 'image/jpeg', + 'mng' => 'video/x-mng', + ]; + + public static function simplyFaviconUrl($arg) + { + $public_path = path::fullFromRoot(dcCore::app()->blog->settings->get('system')->get('public_path'), DC_ROOT); + + if (dcCore::app()->blog->settings->get('system')->get('simply_favicon') + && !empty($arg) + && array_key_exists($arg, self::$mimetypes) + && file_exists($public_path . '/favicon.' . $arg) + ) { + header('Content-Type: ' . self::$mimetypes[$arg] . ';'); + readfile($public_path . '/favicon.' . $arg); + exit; + } + + self::p404(); + } +}