Compare commits

..

No commits in common. "46b22e1e0c6271055de4f0f60aabcb0c3f789900" and "b0a1e09c9947c514d8ff8075c50c474db8acb7d6" have entirely different histories.

11 changed files with 116 additions and 272 deletions

View File

@ -1,21 +1,3 @@
2023.07.29
- require Dotclear 2.27
- require PHP 7.4+
- update to Dotclear 2.27-dev
2023.04.23
- require Dotclear 2.26
- use latest dotclear namespace
- remove magix
- fix nullsafe warnings
2023.03.21
- require Dotclear 2.26
- use PHP namespace
- use new plugin structure
- use new Form class
- add icon url on blog pref
2022.12.23 2022.12.23
- use anonymlous functions - use anonymlous functions
- code review (phpstan, php-cs-fixer) - code review (phpstan, php-cs-fixer)

View File

@ -3,7 +3,7 @@
[![Release](https://img.shields.io/github/v/release/JcDenis/simplyFavicon)](https://github.com/JcDenis/simplyFavicon/releases) [![Release](https://img.shields.io/github/v/release/JcDenis/simplyFavicon)](https://github.com/JcDenis/simplyFavicon/releases)
[![Date](https://img.shields.io/github/release-date/JcDenis/simplyFavicon)](https://github.com/JcDenis/simplyFavicon/releases) [![Date](https://img.shields.io/github/release-date/JcDenis/simplyFavicon)](https://github.com/JcDenis/simplyFavicon/releases)
[![Issues](https://img.shields.io/github/issues/JcDenis/simplyFavicon)](https://github.com/JcDenis/simplyFavicon/issues) [![Issues](https://img.shields.io/github/issues/JcDenis/simplyFavicon)](https://github.com/JcDenis/simplyFavicon/issues)
[![Dotclear](https://img.shields.io/badge/dotclear-v2.27-blue.svg)](https://fr.dotclear.org/download) [![Dotclear](https://img.shields.io/badge/dotclear-v2.24-blue.svg)](https://fr.dotclear.org/download)
[![Dotaddict](https://img.shields.io/badge/dotaddict-official-green.svg)](https://plugins.dotaddict.org/dc2/details/simplyFavicon) [![Dotaddict](https://img.shields.io/badge/dotaddict-official-green.svg)](https://plugins.dotaddict.org/dc2/details/simplyFavicon)
[![License](https://img.shields.io/github/license/JcDenis/simplyFavicon)](https://github.com/JcDenis/simplyFavicon/blob/master/LICENSE) [![License](https://img.shields.io/github/license/JcDenis/simplyFavicon)](https://github.com/JcDenis/simplyFavicon/blob/master/LICENSE)
@ -19,8 +19,7 @@ It adds a favicon to your blog.
_simplyFavicon_ requires: _simplyFavicon_ requires:
* Administrator permissions * Administrator permissions
* Dotclear 2.27 * Dotclear 2.24
* PHP 7.4+
* A readable public directory. * A readable public directory.
## USAGE ## USAGE

View File

@ -18,17 +18,17 @@ $this->registerModule(
'Simply favicon', 'Simply favicon',
'Multi-agents favicon', 'Multi-agents favicon',
'Jean-Christian Denis', 'Jean-Christian Denis',
'2023.07.29', '2022.12.23',
[ [
'requires' => [['core', '2.27']], 'requires' => [['core', '2.24']],
'permissions' => dcCore::app()->auth->makePermissions([ 'permissions' => dcCore::app()->auth->makePermissions([
dcCore::app()->auth::PERMISSION_ADMIN, dcAuth::PERMISSION_ADMIN,
]), ]),
'type' => 'plugin', 'type' => 'plugin',
'support' => 'https://github.com/JcDenis/' . basename(__DIR__), 'support' => 'https://github.com/JcDenis/' . basename(__DIR__),
'details' => 'http://plugins.dotaddict.org/dc2/details/' . basename(__DIR__), 'details' => 'http://plugins.dotaddict.org/dc2/details/' . basename(__DIR__),
'repository' => 'https://raw.githubusercontent.com/JcDenis/' . basename(__DIR__) . '/master/dcstore.xml', 'repository' => 'https://raw.githubusercontent.com/JcDenis/' . basename(__DIR__) . '/master/dcstore.xml',
'settings' => [ 'settings' => [
'blog' => '#params.simply_favicon_params', 'blog' => '#params.simply_favicon_params',
], ],
] ]

View File

@ -2,11 +2,11 @@
<modules xmlns:da="http://dotaddict.org/da/"> <modules xmlns:da="http://dotaddict.org/da/">
<module id="simplyFavicon"> <module id="simplyFavicon">
<name>Simply favicon</name> <name>Simply favicon</name>
<version>2023.07.29</version> <version>2022.12.23</version>
<author>Jean-Christian Denis</author> <author>Jean-Christian Denis</author>
<desc>Multi-agents favicon</desc> <desc>Multi-agents favicon</desc>
<file>https://github.com/JcDenis/simplyFavicon/releases/download/v2023.07.29/plugin-simplyFavicon.zip</file> <file>https://github.com/JcDenis/simplyFavicon/releases/download/v2022.12.23/plugin-simplyFavicon.zip</file>
<da:dcmin>2.27</da:dcmin> <da:dcmin>2.24</da:dcmin>
<da:details>http://plugins.dotaddict.org/dc2/details/simplyFavicon</da:details> <da:details>http://plugins.dotaddict.org/dc2/details/simplyFavicon</da:details>
<da:support>https://github.com/JcDenis/simplyFavicon</da:support> <da:support>https://github.com/JcDenis/simplyFavicon</da:support>
</module> </module>

View File

@ -9,11 +9,8 @@
# DOT NOT MODIFY THIS FILE ! # DOT NOT MODIFY THIS FILE !
# #
use Dotclear\Helper\L10n; l10n::$locales['Enable "%s" extension'] = 'Activer l\'extension "%s"';
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['Enable favorite icon'] = 'Activer l\'icône de favori'; 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['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['Current favicons:'] = 'Favicons actuels :';
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['Multi-agents favicon'] = 'Favicon multi-agents';
L10n::$locales['Current favicons:'] = 'Favicons actuels :';
L10n::$locales['Multi-agents favicon'] = 'Favicon multi-agents';
L10n::$locales['Simply favicon'] = 'Simple favicon';

View File

@ -1,17 +1,17 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Project-Id-Version: simplyFavicon 2023.03.06\n" "Project-Id-Version: simplyFavicon 2021.09.02.1\n"
"POT-Creation-Date: \n" "POT-Creation-Date: \n"
"PO-Revision-Date: 2023-03-06T22:03:39+00:00\n" "PO-Revision-Date: 2021-11-06T09:13:24+00:00\n"
"Last-Translator: Jean-Christian Denis\n" "Last-Translator: Jean-Christian Denis\n"
"Language-Team: \n" "Language-Team: \n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n"
msgid "Enable favorite icon" msgid "Enable \"%s\" extension"
msgstr "Activer l'icône de favori" msgstr "Activer l'extension \"Simply favicon\""
msgid "You must place an image called favicon.png or .jpg or .ico into your blog's public directory." 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." msgstr "Vous devez placer une image nommée favicon.png, .jpg ou .ico dans le répertoire publique du blog."
@ -24,7 +24,3 @@ msgstr "Favicons actuels :"
msgid "Multi-agents favicon" msgid "Multi-agents favicon"
msgstr "Favicon multi-agents" msgstr "Favicon multi-agents"
msgid "Simply favicon"
msgstr "Simple favicon"

View File

@ -10,83 +10,37 @@
* @copyright Jean-Christian Denis * @copyright Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html * @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/ */
declare(strict_types=1); if (!defined('DC_CONTEXT_ADMIN')) {
return;
}
namespace Dotclear\Plugin\simplyFavicon; dcCore::app()->addBehaviors([
'adminBlogPreferencesFormV2' => function ($blog_settings) {
use dcCore; $exists = [];
use dcSettings; $path = path::fullFromRoot((string) $blog_settings->get('system')->get('public_path'), DC_ROOT);
use Dotclear\Core\Process; foreach (['ico', 'png', 'bmp', 'gif', 'jpg', 'mng'] as $ext) {
use Dotclear\Helper\File\Path; if (file_exists($path . '/favicon.' . $ext)) {
use Dotclear\Helper\Html\Form\{ $exists[] = sprintf('<li title="%s">%s</li>', $path . '/favicon.' . $ext, 'favicon.' . $ext);
Checkbox, }
Div,
Label,
Note,
Para
};
class Backend extends Process
{
public static function init(): bool
{
return self::status(My::checkContext(My::BACKEND));
}
public static function process(): bool
{
if (!self::status()) {
return false;
} }
dcCore::app()->addBehaviors([ echo
'adminBlogPreferencesFormV2' => function (dcSettings $blog_settings): void { '<div class="fieldset clear"><h4 id="simply_favicon_params">' . __('Favicon') . '</h4>' .
// nullsafe '<div class="two-cols"><div class="col">' .
if (is_null(dcCore::app()->blog)) { '<p><label class="classic">' .
return; form::checkbox('simply_favicon', '1', (bool) $blog_settings->get('system')->get('simply_favicon')) .
} sprintf(__('Enable "%s" extension'), __('Simply favicon')) . '</label></p>' .
'<p class="form-note">' .
$exists = []; __("You must place an image called favicon.png or .jpg or .ico into your blog's public directory.") .
$path = Path::fullFromRoot((string) $blog_settings->get('system')->get('public_path'), DC_ROOT); '</p></div><div class="col">' .
foreach (['ico', 'png', 'bmp', 'gif', 'jpg', 'mng'] as $ext) { (
if (file_exists($path . '/favicon.' . $ext)) { empty($exists) ?
$url = dcCore::app()->blog->url . dcCore::app()->url->getURLFor('simplyFavicon', $ext); '<p>' . __('There are no favicon in blog public directory') . '</p>' :
$exists[] = '<li><a href="' . $url . '">' . $url . '</a></li>'; '<p>' . __('Current favicons:') . '</p><ul class="nice">' . implode($exists) . '</ul>'
} ) .
} '</div></div><br class="clear" /></div>';
},
echo 'adminBeforeBlogSettingsUpdate' => function ($blog_settings) {
'<div class="fieldset clear"><h4 id="simply_favicon_params">' . __('Favicon') . '</h4>' . $blog_settings->get('system')->put('simply_favicon', !empty($_POST['simply_favicon']));
'<div class="two-cols"><div class="col">' . },
(new Div()) ]);
->__call('class', ['box'])
->__call('items', [[
(new Para())
->__call('items', [[
(new Checkbox('simply_favicon', (bool) $blog_settings->get('system')->get('simply_favicon')))
->__call('value', ['1']),
(new Label(__('Enable favorite icon'), Label::OUTSIDE_LABEL_AFTER))
->__call('for', ['simply_favicon'])
->__call('class', ['classic']),
]]),
(new Note())
->__call('text', [__("You must place an image called favicon.png or .jpg or .ico into your blog's public directory.")])
->__call('class', ['form-note']),
]])
->render() .
'</p></div><div class="col">' .
(
empty($exists) ?
'<p>' . __('There are no favicon in blog public directory') . '</p>' :
'<p>' . __('Current favicons:') . '</p><ul class="nice">' . implode($exists) . '</ul>'
) .
'</div></div><br class="clear" /></div>';
},
'adminBeforeBlogSettingsUpdate' => function (dcSettings $blog_settings): void {
$blog_settings->get('system')->put('simply_favicon', !empty($_POST['simply_favicon']));
},
]);
return true;
}
}

View File

@ -10,61 +10,74 @@
* @copyright Jean-Christian Denis * @copyright Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html * @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/ */
declare(strict_types=1); if (!defined('DC_RC_PATH')) {
return;
}
namespace Dotclear\Plugin\simplyFavicon; dcCore::app()->addBehavior('publicHeadContent', ['publicSimplyFavicon', 'publicHeadContent']);
use dcCore; class publicSimplyFavicon extends dcUrlHandlers
use Dotclear\Core\Process;
use Dotclear\Helper\File\Path;
class Frontend extends Process
{ {
public static function init(): bool public static $mimetypes = [
{ 'ico' => 'image/x-icon',
return self::status(My::checkContext(My::FRONTEND)); 'png' => 'image/png',
} 'bmp' => 'image/bmp',
'gif' => 'image/gif',
'jpg' => 'image/jpeg',
'mng' => 'video/x-mng',
];
public static function process(): bool public static function simplyFaviconUrl($arg)
{ {
if (!self::status()) { $public_path = path::fullFromRoot(dcCore::app()->blog->settings->get('system')->get('public_path'), DC_ROOT);
return false;
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;
} }
dcCore::app()->addBehavior('publicHeadContent', function (): void { self::p404();
if (is_null(dcCore::app()->blog) || !dcCore::app()->blog->settings->get('system')->get('simply_favicon')) {
return;
}
$public_path = Path::fullFromRoot(dcCore::app()->blog->settings->get('system')->get('public_path'), DC_ROOT) . '/favicon.'; return null;
$public_url = dcCore::app()->blog->url . dcCore::app()->url->getBase('simplyFavicon') . '.'; }
// ico : IE6 public static function publicHeadContent()
if (file_exists($public_path . 'ico') && '?' != substr(dcCore::app()->blog->url, -1)) { {
echo if (!dcCore::app()->blog->settings->get('system')->get('simply_favicon')) {
'<link rel="SHORTCUT ICON" type="image/x-icon" href="' . $public_url . 'ico" />' . "\n"; return null;
} }
// png: apple and others
if (file_exists($public_path . 'png')) {
echo
'<link rel="apple-touch-icon" href="' . $public_url . 'png" />' . "\n" .
'<link rel="icon" type="image/png" href="' . $public_url . 'png" />' . "\n";
// all others
} else {
foreach (UrlHandler::$mimetypes as $ext => $mime) {
if (in_array($ext, ['ico', 'png'])) {
continue;
}
if (file_exists($public_path . $ext)) {
echo
'<link rel="icon" type="' . $mime . '" href="' . $public_url . $ext . '" />' . "\n";
break; $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') . '.';
// ico : IE6
if (file_exists($public_path . 'ico') && '?' != substr(dcCore::app()->blog->url, -1)) {
echo
'<link rel="SHORTCUT ICON" type="image/x-icon" href="' . $public_url . 'ico" />' . "\n";
}
// png: apple and others
if (file_exists($public_path . 'png')) {
echo
'<link rel="apple-touch-icon" href="' . $public_url . 'png" />' . "\n" .
'<link rel="icon" type="image/png" href="' . $public_url . 'png" />' . "\n";
// all others
} else {
foreach (self::$mimetypes as $ext => $mime) {
if (in_array($ext, ['ico', 'png'])) {
continue;
}
if (file_exists($public_path . $ext)) {
echo
'<link rel="icon" type="' . $mime . '" href="' . $public_url . $ext . '" />' . "\n";
break;
} }
} }
}); }
return true;
} }
} }

View File

@ -1,21 +0,0 @@
<?php
/**
* @brief simplyFavicon, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Jean-Christian Denis
*
* @copyright Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/
declare(strict_types=1);
namespace Dotclear\Plugin\simplyFavicon;
use Dotclear\Module\MyPlugin;
class My extends MyPlugin
{
}

View File

@ -10,33 +10,10 @@
* @copyright Jean-Christian Denis * @copyright Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html * @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/ */
declare(strict_types=1); if (!defined('DC_RC_PATH')) {
return;
namespace Dotclear\Plugin\simplyFavicon;
use dcCore;
use Dotclear\Core\Process;
class Prepend extends Process
{
public static function init(): bool
{
return self::status(My::checkContext(My::PREPEND));
}
public static function process(): bool
{
if (!self::status()) {
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']);

View File

@ -1,53 +0,0 @@
<?php
/**
* @brief simplyFavicon, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Jean-Christian Denis
*
* @copyright Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/
declare(strict_types=1);
namespace Dotclear\Plugin\simplyFavicon;
use dcCore;
use dcUrlHandlers;
use Dotclear\Helper\File\Path;
class UrlHandler extends dcUrlHandlers
{
public static array $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(string $arg): void
{
// nullsafe
if (is_null(dcCore::app()->blog)) {
return;
}
$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();
}
}