diff --git a/src/Backend.php b/src/Backend.php
index 374f392..99cfa1a 100644
--- a/src/Backend.php
+++ b/src/Backend.php
@@ -58,7 +58,7 @@ class Backend extends dcNsProcess
dcCore::app()->addBehaviors([
# Dashboard favorites
- 'adminDashboardFavoritesV2' => function (dcFavorites $favs): void {
+ 'adminDashboardFavoritesV2' => function (dcFavorites $favs): void {
$favs->register(My::id(), [
'title' => My::name(),
'url' => dcCore::app()->adminurl->get('admin.plugin.' . My::id()),
@@ -68,7 +68,7 @@ class Backend extends dcNsProcess
]);
},
# Preference form
- 'adminBlogPreferencesFormV2' => function (dcSettings $blog_settings):void {
+ 'adminBlogPreferencesFormV2' => function (dcSettings $blog_settings): void {
$active = (bool) $blog_settings->get(My::id())->get('active');
$allowedtplvalues = Epc::blogAllowedTplValues();
$allowedpubpages = Epc::blogAllowedPubPages();
@@ -119,7 +119,7 @@ class Backend extends dcNsProcess
$blog_settings->get(My::id())->put('allowedpubpages', json_encode($allowedpubpages));
},
# List filter
- 'adminFiltersListsV2' => function (ArrayObject $sorts): void {
+ 'adminFiltersListsV2' => function (ArrayObject $sorts): void {
$sorts['epc'] = [
My::name(),
[
@@ -134,7 +134,7 @@ class Backend extends dcNsProcess
];
},
# Widgets
- 'initWidgets' => [Widgets::class, 'initWidgets'],
+ 'initWidgets' => [Widgets::class, 'initWidgets'],
]);
return true;
diff --git a/src/BackendList.php b/src/BackendList.php
index 2456493..cd2670d 100644
--- a/src/BackendList.php
+++ b/src/BackendList.php
@@ -14,8 +14,8 @@ declare(strict_types=1);
namespace Dotclear\Plugin\enhancePostContent;
+use adminGenericFilterV2;
use adminGenericListV2;
-use dcCore;
use dcPager;
use Dotclear\Helper\Html\Form\Checkbox;
use Dotclear\Helper\Html\Html;
@@ -29,12 +29,12 @@ use dt;
*/
class BackendList extends adminGenericListV2
{
- public function display($filter, $pager_url, $enclose_block = '')
+ public function display(adminGenericFilterV2 $filter, string $pager_url, string $enclose_block): void
{
if ($this->rs->isEmpty()) {
echo '
' . ($filter->show() ? __('No record matches the filter') : __('No record')) . '
';
} else {
- $pager = new dcPager($filter->page, $this->rs_count, $filter->nb, 10);
+ $pager = new dcPager($filter->value('page'), $this->rs_count, $filter->value('nb'), 10);
$pager->base_url = $pager_url;
$epc_id = [];
diff --git a/src/Epc.php b/src/Epc.php
index 8158b7c..4e54191 100644
--- a/src/Epc.php
+++ b/src/Epc.php
@@ -33,8 +33,8 @@ __('RSS feeds');
class Epc
{
- protected static $default_filters = null;
- public static $epcFilterLimit = [];
+ protected static array $default_filters = [];
+ public static array $epcFilterLimit = [];
#
# Default definition
@@ -48,6 +48,7 @@ class Epc
'comment content' => 'CommentContent',
]);
+ # --BEHAVIOR-- enhancePostContentAllowedTplValues : ArrayObject
dcCore::app()->callBehavior('enhancePostContentAllowedTplValues', $rs);
return iterator_to_array($rs, true);
@@ -55,7 +56,7 @@ class Epc
public static function blogAllowedTplValues(): array
{
- $rs = json_decode(dcCore::app()->blog->settings->get(basename(dirname('../' . __DIR__)))->get('allowedtplvalues'));
+ $rs = json_decode(dcCore::app()->blog->settings->get(My::id())->get('allowedtplvalues'));
return is_array($rs) ? $rs : self::defaultAllowedTplValues();
}
@@ -63,20 +64,21 @@ class Epc
public static function defaultAllowedWidgetValues(): array
{
$rs = new ArrayObject([
- 'entry excerpt' => [
+ 'entry excerpt' => [
'id' => 'entryexcerpt',
- 'cb' => [self::class,'widgetContentEntryExcerpt'],
+ 'cb' => [self::class, 'widgetContentEntryExcerpt'],
],
- 'entry content' => [
+ 'entry content' => [
'id' => 'entrycontent',
- 'cb' => [self::class,'widgetContentEntryContent'],
+ 'cb' => [self::class, 'widgetContentEntryContent'],
],
'comment content' => [
'id' => 'commentcontent',
- 'cb' => [self::class,'widgetContentCommentContent'],
+ 'cb' => [self::class, 'widgetContentCommentContent'],
],
]);
+ # --BEHAVIOR-- enhancePostContentAllowedWidgetValues : ArrayObject
dcCore::app()->callBehavior('enhancePostContentAllowedWidgetValues', $rs);
return iterator_to_array($rs, true);
@@ -93,6 +95,7 @@ class Epc
'RSS feeds' => 'rss2.xml',
]);
+ # --BEHAVIOR-- enhancePostContentAllowedPubPages : ArrayObject
dcCore::app()->callBehavior('enhancePostContentAllowedPubPages', $rs);
return iterator_to_array($rs, true);
@@ -107,15 +110,17 @@ class Epc
public static function getFilters(): ?array
{
- if (self::$default_filters === null) {
- $final = $sort = [];
+ if (empty(self::$default_filters)) {
+ $final = $sort = [];
+ /** @var ArrayObject $filters The filters stack */
$filters = new ArrayObject();
try {
+ # --BEHAVIOR-- enhancePostContentFilters : ArrayObject
dcCore::app()->callBehavior('enhancePostContentFilters', $filters);
foreach ($filters as $filter) {
- if ($filter instanceof epcFilter && !isset($final[$filter->id()])) {
+ if (!isset($final[$filter->id()]) && ($filter instanceof EpcFilter)) {
$sort[$filter->id()] = $filter->priority;
$final[$filter->id()] = $filter;
}
@@ -132,9 +137,7 @@ class Epc
public static function testContext(string $tag, array $args, EpcFilter $filter): bool
{
- return is_array($filter->pubPages)
- && in_array(dcCore::app()->ctx->current_tpl, $filter->pubPages)
- && is_array($filter->tplValues)
+ return in_array(dcCore::app()->ctx->current_tpl, $filter->pubPages)
&& in_array($tag, $filter->tplValues)
&& $args[0] != '' //content
&& empty($args['encode_xml'])
@@ -184,7 +187,7 @@ class Epc
return $s = preg_replace('#ççççç(.*?)ççççç#s', '$1', $s);
}
- public static function matchString(string $p, string $r, string $s, EcpFilter $filter, string $before = '\b', string $after = '\b'): array
+ public static function matchString(string $p, string $r, string $s, EpcFilter $filter, string $before = '\b', string $after = '\b'): array
{
# Case sensitive
$i = $filter->nocase ? 'i' : '';
@@ -231,7 +234,7 @@ class Epc
return $a;
}
if (!is_array($a)) {
- return [];
+ return '';
}
$r = '';
@@ -248,7 +251,7 @@ class Epc
return $s;
}
if (!is_string($s)) {
- return '';
+ return [];
}
$r = [];
@@ -284,7 +287,7 @@ class Epc
public static function widgetContentEntryExcerpt(?WidgetsElement $w = null): string
{
if (!dcCore::app()->ctx->exists('posts')) {
- return null;
+ return '';
}
$res = '';
@@ -298,7 +301,7 @@ class Epc
public static function widgetContentEntryContent(): string
{
if (!dcCore::app()->ctx->exists('posts')) {
- return null;
+ return '';
}
$res = '';
@@ -312,7 +315,7 @@ class Epc
public static function widgetContentCommentContent(): string
{
if (!dcCore::app()->ctx->exists('posts')) {
- return null;
+ return '';
}
$res = '';
diff --git a/src/EpcFilter.php b/src/EpcFilter.php
index c5c35db..fa6a113 100644
--- a/src/EpcFilter.php
+++ b/src/EpcFilter.php
@@ -18,133 +18,98 @@ use ArrayObject;
use dcCore;
use dcRecord;
use Dotclear\Plugin\widgets\WidgetsElement;
+use Exception;
abstract class EpcFilter
{
- private $id = 'undefined';
- private $records = null;
+ protected string $id = 'undefined';
- private $properties = [
- 'priority' => 500,
- 'name' => 'undefined',
- 'help' => 'undefined',
- 'has_list' => false,
- 'htmltag' => '',
- 'class' => [],
- 'replace' => '',
- 'widget' => '',
- ];
- private $settings = [
- 'nocase' => false,
- 'plural' => false,
- 'limit' => 0,
- 'style' => [],
- 'notag' => '',
- 'tplValues' => [],
- 'pubPages' => [],
- ];
+ private ?dcRecord $records = null;
+
+ // properties
+ public readonly int $priority;
+ public readonly string $name;
+ public readonly string $help;
+ public readonly bool $has_list;
+ public readonly string $htmltag;
+ public readonly array $class;
+ public readonly string $replace;
+ public readonly string $widget;
+
+ // settings
+ public readonly bool $nocase;
+ public readonly bool $plural;
+ public readonly int $limit;
+ public readonly array $style;
+ public readonly string $notag;
+ public readonly array $tplValues;
+ public readonly array $pubPages;
final public function __construct()
{
- $this->id = $this->init();
+ if ($this->id == 'undefined') {
+ throw new Exception('Undefined Filter id');
+ }
- $this->blogSettings();
+ // get blog settings
+ $s = json_decode((string) dcCore::app()->blog->settings->get(My::id())->get($this->id), true);
+ if (empty($s)) {
+ $s = [];
+ }
+
+ $properties = $this->initProperties();
+ $settings = $this->initSettings();
+
+ // from filter defautl properties
+ $this->priority = isset($properties['priority']) ? abs((int) $properties['priority']) : 500;
+ $this->name = isset($properties['name']) ? (string) $properties['name'] : 'undefined';
+ $this->help = isset($properties['help']) ? (string) $properties['help'] : 'undefined';
+ $this->has_list = isset($properties['has_list']) ? (bool) $properties['has_list'] : false;
+ $this->htmltag = isset($properties['htmltag']) ? (string) $properties['htmltag'] : '';
+ $this->class = isset($properties['class']) && is_array($properties['class']) ? $properties['class'] : [];
+ $this->replace = isset($properties['replace']) ? (string) $properties['replace'] : '';
+ $this->widget = isset($properties['widget']) ? (string) $properties['widget'] : '';
+
+ // from filter defautl settings
+ $nocase = isset($settings['nocase']) ? (bool) $settings['nocase'] : false;
+ $plural = isset($settings['plural']) ? (bool) $settings['plural'] : false;
+ $limit = isset($settings['limit']) ? abs((int) $settings['limit']) : 0;
+ $style = isset($settings['style']) && is_array($settings['style']) ? $settings['style'] : [];
+ $notag = isset($settings['notag']) ? (string) $settings['notag'] : '';
+ $tplValues = isset($settings['tplValues']) && is_array($settings['tplValues']) ? $settings['tplValues'] : [];
+ $pubPages = isset($settings['pubPages']) && is_array($settings['pubPages']) ? $settings['pubPages'] : [];
+
+ // from blog settings
+ $this->nocase = isset($s['nocase']) ? (bool) $s['nocase'] : $nocase;
+ $this->plural = isset($s['plural']) ? (bool) $s['plural'] : $plural;
+ $this->limit = isset($s['limit']) ? abs((int) $s['limit']) : $limit;
+ $this->style = isset($s['style']) && is_array($s['style']) ? $s['style'] : $style;
+ $this->notag = isset($s['notag']) ? (string) $s['notag'] : $notag;
+ $this->tplValues = isset($s['tplValues']) && is_array($s['tplValues']) ? $s['tplValues'] : $tplValues;
+ $this->pubPages = isset($s['pubPages']) && is_array($s['pubPages']) ? $s['pubPages'] : $pubPages;
+ }
+
+ protected function initProperties(): array
+ {
+ return [];
+ }
+
+ protected function initSettings(): array
+ {
+ return [];
}
public static function create(ArrayObject $o): void
{
- $c = get_called_class();
+ $c = static::class;
$o->append(new $c());
}
- final public function id()
+ final public function id(): string
{
return $this->id;
}
- final public function __get(string $k): mixed
- {
- if (isset($this->properties[$k])) {
- return $this->properties[$k];
- }
- if (isset($this->settings[$k])) {
- return $this->settings[$k];
- }
-
- return null;
- }
-
- final public function __set(string $k, mixed $v): void
- {
- if (isset($this->settings[$k])) {
- $this->settings[$k] = $v;
- }
- }
-
- final public function property(string $k): mixed
- {
- return $this->properties[$k] ?? null;
- }
-
- final protected function setProperties(array|string $property, mixed $value = null): bool
- {
- $properties = is_array($property) ? $property : [$property => $value];
- foreach ($properties as $k => $v) {
- if (isset($this->properties[$k])) {
- $this->properties[$k] = $v;
- }
- }
-
- return true;
- }
-
- final public function setting(string $k): mixed
- {
- return $this->settings[$k] ?? null;
- }
-
- final protected function setSettings(array|string $setting, mixed $value = null): bool
- {
- $settings = is_array($setting) ? $setting : [$setting => $value];
- foreach ($settings as $k => $v) {
- if (isset($this->settings[$k])) {
- $this->settings[$k] = $v;
- }
- }
-
- return true;
- }
-
- private function blogSettings(): void
- {
- $opt = json_decode((string) dcCore::app()->blog->settings->get(My::id())->get($this->id));
-
- if (empty($opt)) {
- $opt = [];
- }
- if (isset($opt->nocase)) {
- $this->settings['nocase'] = (bool) $opt->nocase;
- }
- if (isset($opt->plural)) {
- $this->settings['plural'] = (bool) $opt->plural;
- }
- if (isset($opt->limit)) {
- $this->settings['limit'] = abs((int) $opt->limit);
- }
- if (isset($opt->style) && is_array($opt->style)) {
- $this->settings['style'] = (array) $opt->style;
- }
- if (isset($opt->notag)) {
- $this->settings['notag'] = (string) $opt->notag;
- }
- if (isset($opt->tplValues)) {
- $this->settings['tplValues'] = (array) $opt->tplValues;
- }
- if (isset($opt->pubPages)) {
- $this->settings['pubPages'] = (array) $opt->pubPages;
- }
- }
-
final public function records(): ?dcRecord
{
if ($this->records === null && $this->has_list) {
@@ -154,15 +119,11 @@ abstract class EpcFilter
return $this->records;
}
- abstract protected function init(): string;
-
public function publicContent(string $tag, array $args): void
{
- return;
}
- public function widgetList(string $content, WidgetsElement $w, array &$list): void
+ public function widgetList(string $content, WidgetsElement $w, ArrayObject $list): void
{
- return;
}
}
diff --git a/src/EpcRecord.php b/src/EpcRecord.php
index 28242af..fe6ae33 100644
--- a/src/EpcRecord.php
+++ b/src/EpcRecord.php
@@ -17,6 +17,7 @@ namespace Dotclear\Plugin\enhancePostContent;
use cursor;
use dcCore;
use dcRecord;
+use Exception;
class EpcRecord
{
@@ -118,7 +119,7 @@ class EpcRecord
}
self::trigger();
- # --BEHAVIOR-- enhancePostContentAfterAddRecord
+ # --BEHAVIOR-- enhancePostContentAfterAddRecord : cursor
dcCore::app()->callBehavior('enhancePostContentAfterAddRecord', $cur);
return (int) $cur->getField('epc_id');
@@ -135,11 +136,11 @@ class EpcRecord
$cur->update('WHERE epc_id = ' . $id . " AND blog_id = '" . dcCore::app()->con->escapeStr((string) dcCore::app()->blog->id) . "' ");
self::trigger();
- # --BEHAVIOR-- enhancePostContentAfterUpdRecord
+ # --BEHAVIOR-- enhancePostContentAfterUpdRecord : cursor, int
dcCore::app()->callBehavior('enhancePostContentAfterUpdRecord', $cur, $id);
}
- public static function isRecord(string $filter, string $key, int $not_id = null): bool
+ public static function isRecord(?string $filter, ?string $key, ?int $not_id = null): bool
{
return 0 < self::getRecords([
'epc_filter' => $filter,
@@ -154,7 +155,7 @@ class EpcRecord
throw new Exception(__('No such record ID'));
}
- # --BEHAVIOR-- enhancePostContentBeforeDelRecord
+ # --BEHAVIOR-- enhancePostContentBeforeDelRecord, int
dcCore::app()->callBehavior('enhancePostContentbeforeDelRecord', $id);
dcCore::app()->con->execute(
diff --git a/src/Filter/EpcFilterAbbreviation.php b/src/Filter/EpcFilterAbbreviation.php
index 264cd69..09e85c4 100644
--- a/src/Filter/EpcFilterAbbreviation.php
+++ b/src/Filter/EpcFilterAbbreviation.php
@@ -14,15 +14,18 @@ declare(strict_types=1);
namespace Dotclear\Plugin\enhancePostContent\Filter;
+use ArrayObject;
use Dotclear\Plugin\enhancePostContent\Epc;
use Dotclear\Plugin\enhancePostContent\EpcFilter;
use Dotclear\Plugin\widgets\WidgetsElement;
class EpcFilterAbbreviation extends EpcFilter
{
- protected function init(): string
+ protected string $id = 'abbreviation';
+
+ protected function initProperties(): array
{
- $this->setProperties([
+ return [
'priority' => 400,
'name' => __('Abbreviation'),
'help' => __('Explain some abbreviation. First term of the list is the abbreviation and second term the explanation.'),
@@ -31,36 +34,37 @@ class EpcFilterAbbreviation extends EpcFilter
'class' => ['abbr.epc-abbr'],
'replace' => '%s',
'widget' => '%s',
- ]);
+ ];
+ }
- $this->setSettings([
+ protected function initSettings(): array
+ {
+ return [
'style' => ['font-weight: bold;'],
'notag' => 'a,acronym,abbr,dfn,h1,h2,h3',
'tplValues' => ['EntryContent'],
'pubPages' => ['post.html'],
- ]);
-
- return 'abbreviation';
+ ];
}
public function publicContent(string $tag, array $args): void
{
while ($this->records()->fetch()) {
$args[0] = Epc::replaceString(
- $this->records()->epc_key,
- sprintf($this->replace, __($this->records()->epc_value), '\\1'),
+ $this->records()->f('epc_key'),
+ sprintf($this->replace, __($this->records()->f('epc_value')), '\\1'),
$args[0],
$this
);
}
}
- public function widgetList(string $content, WidgetsElement $w, array &$list): void
+ public function widgetList(string $content, WidgetsElement $w, ArrayObject $list): void
{
while ($this->records()->fetch()) {
$list[] = Epc::matchString(
- $this->records()->epc_key,
- sprintf($this->widget, __($this->records()->epc_value), '\\1'),
+ $this->records()->f('epc_key'),
+ sprintf($this->widget, __($this->records()->f('epc_value')), '\\1'),
$content,
$this
);
diff --git a/src/Filter/EpcFilterAcronym.php b/src/Filter/EpcFilterAcronym.php
index 5aa1ba8..0183269 100644
--- a/src/Filter/EpcFilterAcronym.php
+++ b/src/Filter/EpcFilterAcronym.php
@@ -14,15 +14,18 @@ declare(strict_types=1);
namespace Dotclear\Plugin\enhancePostContent\Filter;
+use ArrayObject;
use Dotclear\Plugin\enhancePostContent\Epc;
use Dotclear\Plugin\enhancePostContent\EpcFilter;
use Dotclear\Plugin\widgets\WidgetsElement;
class EpcFilterAcronym extends EpcFilter
{
- protected function init(): string
+ protected string $id = 'acronym';
+
+ protected function initProperties(): array
{
- $this->setProperties([
+ return [
'priority' => 700,
'name' => __('Acronym'),
'help' => __('Explain some acronyms. First term of the list is the acornym and second term the explanation.'),
@@ -31,36 +34,37 @@ class EpcFilterAcronym extends EpcFilter
'class' => ['acronym.epc-acronym'],
'replace' => '%s',
'widget' => '%s',
- ]);
+ ];
+ }
- $this->setSettings([
+ protected function initSettings(): array
+ {
+ return [
'style' => ['font-weight: bold;'],
'notag' => 'a,acronym,abbr,dfn,h1,h2,h3',
'tplValues' => ['EntryContent'],
'pubPages' => ['post.html'],
- ]);
-
- return 'acronym';
+ ];
}
public function publicContent(string $tag, array $args): void
{
while ($this->records()->fetch()) {
$args[0] = Epc::replaceString(
- $this->records()->epc_key,
- sprintf($this->replace, __($this->records()->epc_value), '\\1'),
+ $this->records()->f('epc_key'),
+ sprintf($this->replace, __($this->records()->f('epc_value')), '\\1'),
$args[0],
$this
);
}
}
- public function widgetList(string $content, WidgetsElement $w, array &$list): void
+ public function widgetList(string $content, WidgetsElement $w, ArrayObject $list): void
{
while ($this->records()->fetch()) {
$list[] = Epc::matchString(
- $this->records()->epc_key,
- sprintf($this->widget, __($this->records()->epc_value), '\\1'),
+ $this->records()->f('epc_key'),
+ sprintf($this->widget, __($this->records()->f('epc_value')), '\\1'),
$content,
$this
);
diff --git a/src/Filter/EpcFilterCitation.php b/src/Filter/EpcFilterCitation.php
index 43a8494..26ee271 100644
--- a/src/Filter/EpcFilterCitation.php
+++ b/src/Filter/EpcFilterCitation.php
@@ -14,15 +14,18 @@ declare(strict_types=1);
namespace Dotclear\Plugin\enhancePostContent\Filter;
+use ArrayObject;
use Dotclear\Plugin\enhancePostContent\Epc;
use Dotclear\Plugin\enhancePostContent\EpcFilter;
use Dotclear\Plugin\widgets\WidgetsElement;
class EpcFilterCitation extends EpcFilter
{
- protected function init(): string
+ protected string $id = 'citation';
+
+ protected function initProperties(): array
{
- $this->setProperties([
+ return [
'priority' => 600,
'name' => __('Citation'),
'help' => __('Highlight citation of people. First term of the list is the citation and second term the author.'),
@@ -31,37 +34,38 @@ class EpcFilterCitation extends EpcFilter
'class' => ['cite.epc-cite'],
'replace' => '%s',
'widget' => '%s',
- ]);
+ ];
+ }
- $this->setSettings([
+ protected function initSettings(): array
+ {
+ return [
'nocase' => true,
'style' => ['font-style: italic;'],
'notag' => 'a,h1,h2,h3',
'tplValues' => ['EntryContent'],
'pubPages' => ['post.html'],
- ]);
-
- return 'citation';
+ ];
}
public function publicContent(string $tag, array $args): void
{
while ($this->records()->fetch()) {
$args[0] = Epc::replaceString(
- $this->records()->epc_key,
- sprintf($this->replace, __($this->records()->epc_value), '\\1'),
+ $this->records()->f('epc_key'),
+ sprintf($this->replace, __($this->records()->f('epc_value')), '\\1'),
$args[0],
$this
);
}
}
- public function widgetList(string $content, WidgetsElement $w, array &$list): void
+ public function widgetList(string $content, WidgetsElement $w, ArrayObject $list): void
{
while ($this->records()->fetch()) {
$list[] = Epc::matchString(
- $this->records()->epc_key,
- sprintf($this->widget, __($this->records()->epc_value), '\\1'),
+ $this->records()->f('epc_key'),
+ sprintf($this->widget, __($this->records()->f('epc_value')), '\\1'),
$content,
$this
);
diff --git a/src/Filter/EpcFilterDefinition.php b/src/Filter/EpcFilterDefinition.php
index 387c15d..53aa7b8 100644
--- a/src/Filter/EpcFilterDefinition.php
+++ b/src/Filter/EpcFilterDefinition.php
@@ -14,15 +14,18 @@ declare(strict_types=1);
namespace Dotclear\Plugin\enhancePostContent\Filter;
+use ArrayObject;
use Dotclear\Plugin\enhancePostContent\Epc;
use Dotclear\Plugin\enhancePostContent\EpcFilter;
use Dotclear\Plugin\widgets\WidgetsElement;
class EpcFilterDefinition extends EpcFilter
{
- protected function init(): string
+ protected string $id = 'definition';
+
+ protected function initProperties(): array
{
- $this->setProperties([
+ return [
'priority' => 800,
'name' => __('Definition'),
'help' => __('Explain some definition. First term of the list is the sample to define and second term the explanation.'),
@@ -31,36 +34,37 @@ class EpcFilterDefinition extends EpcFilter
'class' => ['dfn.epc-dfn'],
'replace' => '%s',
'widget' => '%s',
- ]);
+ ];
+ }
- $this->setSettings([
+ protected function initSettings(): array
+ {
+ return [
'style' => ['font-weight: bold;'],
'notag' => 'a,acronym,abbr,dfn,h1,h2,h3',
'tplValues' => ['EntryContent'],
'pubPages' => ['post.html'],
- ]);
-
- return 'definition';
+ ];
}
public function publicContent(string $tag, array $args): void
{
while ($this->records()->fetch()) {
$args[0] = Epc::replaceString(
- $this->records()->epc_key,
- sprintf($this->replace, __($this->records()->epc_value), '\\1'),
+ $this->records()->f('epc_key'),
+ sprintf($this->replace, __($this->records()->f('epc_value')), '\\1'),
$args[0],
$this
);
}
}
- public function widgetList(string $content, WidgetsElement $w, array &$list): void
+ public function widgetList(string $content, WidgetsElement $w, ArrayObject $list): void
{
while ($this->records()->fetch()) {
$list[] = Epc::matchString(
- $this->records()->epc_key,
- sprintf($this->widget, __($this->records()->epc_value), '\\1'),
+ $this->records()->f('epc_key'),
+ sprintf($this->widget, __($this->records()->f('epc_value')), '\\1'),
$content,
$this
);
diff --git a/src/Filter/EpcFilterLink.php b/src/Filter/EpcFilterLink.php
index c145e58..9e65607 100644
--- a/src/Filter/EpcFilterLink.php
+++ b/src/Filter/EpcFilterLink.php
@@ -14,15 +14,18 @@ declare(strict_types=1);
namespace Dotclear\Plugin\enhancePostContent\Filter;
+use ArrayObject;
use Dotclear\Plugin\enhancePostContent\Epc;
use Dotclear\Plugin\enhancePostContent\EpcFilter;
use Dotclear\Plugin\widgets\WidgetsElement;
class EpcFilterLink extends EpcFilter
{
- protected function init(): string
+ protected string $id = 'link';
+
+ protected function initProperties(): array
{
- $this->setProperties([
+ return [
'priority' => 500,
'name' => __('Link'),
'help' => __('Link some words. First term of the list is the term to link and second term the link.'),
@@ -31,36 +34,37 @@ class EpcFilterLink extends EpcFilter
'class' => ['a.epc-link'],
'replace' => '%s',
'widget' => '%s',
- ]);
+ ];
+ }
- $this->setSettings([
+ protected function initSettings(): array
+ {
+ return [
'style' => ['text-decoration: none; font-style: italic; color: #0000FF;'],
'notag' => 'a,h1,h2,h3',
'tplValues' => ['EntryContent'],
'pubPages' => ['post.html'],
- ]);
-
- return 'link';
+ ];
}
public function publicContent(string $tag, array $args): void
{
while ($this->records()->fetch()) {
$args[0] = Epc::replaceString(
- $this->records()->epc_key,
- sprintf($this->replace, '\\1', $this->records()->epc_value, '\\1'),
+ $this->records()->f('epc_key'),
+ sprintf($this->replace, '\\1', $this->records()->f('epc_value'), '\\1'),
$args[0],
$this
);
}
}
- public function widgetList(string $content, WidgetsElement $w, array &$list): void
+ public function widgetList(string $content, WidgetsElement $w, ArrayObject $list): void
{
while ($this->records()->fetch()) {
$list[] = Epc::matchString(
- $this->records()->epc_key,
- sprintf($this->widget, $this->records()->epc_value, $this->records()->epc_value, '\\1'),
+ $this->records()->f('epc_key'),
+ sprintf($this->widget, $this->records()->f('epc_value'), $this->records()->f('epc_value'), '\\1'),
$content,
$this
);
diff --git a/src/Filter/EpcFilterReplace.php b/src/Filter/EpcFilterReplace.php
index 1d7c228..4ef6fc8 100644
--- a/src/Filter/EpcFilterReplace.php
+++ b/src/Filter/EpcFilterReplace.php
@@ -16,13 +16,14 @@ namespace Dotclear\Plugin\enhancePostContent\Filter;
use Dotclear\Plugin\enhancePostContent\Epc;
use Dotclear\Plugin\enhancePostContent\EpcFilter;
-use Dotclear\Plugin\widgets\WidgetsElement;
class EpcFilterReplace extends EpcFilter
{
- protected function init(): string
+ protected string $id = 'replace';
+
+ protected function initProperties(): array
{
- $this->setProperties([
+ return [
'priority' => 200,
'name' => __('Replace'),
'help' => __('Replace some text. First term of the list is the text to replace and second term the replacement.'),
@@ -30,26 +31,27 @@ class EpcFilterReplace extends EpcFilter
'htmltag' => '',
'class' => ['span.epc-replace'],
'replace' => '%s',
- ]);
+ ];
+ }
- $this->setSettings([
+ protected function initSettings(): array
+ {
+ return [
'nocase' => true,
'plural' => true,
'style' => ['font-style: italic;'],
'notag' => 'h1,h2,h3',
'tplValues' => ['EntryContent'],
'pubPages' => ['post.html'],
- ]);
-
- return 'replace';
+ ];
}
public function publicContent(string $tag, array $args): void
{
while ($this->records()->fetch()) {
$args[0] = Epc::replaceString(
- $this->records()->epc_key,
- sprintf($this->replace, $this->records()->epc_value, '\\2'),
+ $this->records()->f('epc_key'),
+ sprintf($this->replace, $this->records()->f('epc_value'), '\\2'),
$args[0],
$this
);
diff --git a/src/Filter/EpcFilterSearch.php b/src/Filter/EpcFilterSearch.php
index b362d58..3d629ea 100644
--- a/src/Filter/EpcFilterSearch.php
+++ b/src/Filter/EpcFilterSearch.php
@@ -17,31 +17,33 @@ namespace Dotclear\Plugin\enhancePostContent\Filter;
use dcCore;
use Dotclear\Plugin\enhancePostContent\Epc;
use Dotclear\Plugin\enhancePostContent\EpcFilter;
-use Dotclear\Plugin\widgets\WidgetsElement;
class EpcFilterSearch extends EpcFilter
{
- protected function init(): string
+ protected string $id = 'search';
+
+ protected function initProperties(): array
{
- $this->setProperties([
+ return [
'priority' => 100,
'name' => __('Search'),
'help' => __('Highlight searched words.'),
'htmltag' => '',
'class' => ['span.epc-search'],
'replace' => '%s',
- ]);
+ ];
+ }
- $this->setSettings([
+ protected function initSettings(): array
+ {
+ return [
'nocase' => true,
'plural' => true,
'style' => ['color: #FFCC66;'],
'notag' => 'h1,h2,h3',
'tplValues' => ['EntryContent'],
'pubPages' => ['search.html'],
- ]);
-
- return 'search';
+ ];
}
public function publicContent(string $tag, array $args): void
diff --git a/src/Filter/EpcFilterTag.php b/src/Filter/EpcFilterTag.php
index e81fe78..d6930b5 100644
--- a/src/Filter/EpcFilterTag.php
+++ b/src/Filter/EpcFilterTag.php
@@ -14,6 +14,7 @@ declare(strict_types=1);
namespace Dotclear\Plugin\enhancePostContent\Filter;
+use ArrayObject;
use dcCore;
use Dotclear\Plugin\enhancePostContent\Epc;
use Dotclear\Plugin\enhancePostContent\EpcFilter;
@@ -21,9 +22,11 @@ use Dotclear\Plugin\widgets\WidgetsElement;
class EpcFilterTag extends EpcFilter
{
- protected function init(): string
+ protected string $id = 'tag';
+
+ protected function initProperties(): array
{
- $this->setProperties([
+ return [
'priority' => 900,
'name' => __('Tag'),
'help' => __('Highlight tags of your blog.'),
@@ -31,16 +34,17 @@ class EpcFilterTag extends EpcFilter
'class' => ['a.epc-tag'],
'replace' => '%s',
'widget' => '%s',
- ]);
+ ];
+ }
- $this->setSettings([
+ protected function initSettings(): array
+ {
+ return [
'style' => ['text-decoration: none; border-bottom: 3px double #CCCCCC;'],
'notag' => 'a,h1,h2,h3',
'tplValues' => ['EntryContent'],
'pubPages' => ['post.html'],
- ]);
-
- return 'tag';
+ ];
}
public function publicContent(string $tag, array $args): void
@@ -53,15 +57,15 @@ class EpcFilterTag extends EpcFilter
while ($metas->fetch()) {
$args[0] = Epc::replaceString(
- $metas->meta_id,
- sprintf($this->replace, dcCore::app()->blog->url . dcCore::app()->url->getBase('tag') . '/' . $metas->meta_id, '\\1'),
+ $metas->f('meta_id'),
+ sprintf($this->replace, dcCore::app()->blog->url . dcCore::app()->url->getBase('tag') . '/' . $metas->f('meta_id'), '\\1'),
$args[0],
$this
);
}
}
- public function widgetList(string $content, WidgetsElement $w, array &$list): void
+ public function widgetList(string $content, WidgetsElement $w, ArrayObject $list): void
{
if (!dcCore::app()->plugins->moduleExists('tags')) {
return;
@@ -71,8 +75,8 @@ class EpcFilterTag extends EpcFilter
while ($metas->fetch()) {
$list[] = Epc::matchString(
- $metas->meta_id,
- sprintf($this->widget, dcCore::app()->blog->url . dcCore::app()->url->getBase('tag') . '/' . $metas->meta_id, '\\1'),
+ $metas->f('meta_id'),
+ sprintf($this->widget, dcCore::app()->blog->url . dcCore::app()->url->getBase('tag') . '/' . $metas->f('meta_id'), '\\1'),
$content,
$this
);
diff --git a/src/Filter/EpcFilterTwitter.php b/src/Filter/EpcFilterTwitter.php
index 030b284..9e74e68 100644
--- a/src/Filter/EpcFilterTwitter.php
+++ b/src/Filter/EpcFilterTwitter.php
@@ -16,29 +16,31 @@ namespace Dotclear\Plugin\enhancePostContent\Filter;
use Dotclear\Plugin\enhancePostContent\Epc;
use Dotclear\Plugin\enhancePostContent\EpcFilter;
-use Dotclear\Plugin\widgets\WidgetsElement;
class EpcFilterTwitter extends EpcFilter
{
- protected function init(): string
+ protected string $id = 'twitter';
+
+ protected function initProperties(): array
{
- $this->setProperties([
+ return [
'priority' => 1000,
'name' => __('Twitter'),
'help' => __('Add link to twitter user page. Every word started with "@" will be considered as twitter user.'),
'htmltag' => 'a',
'class' => ['a.epc-twitter'],
'replace' => '',
- ]);
+ ];
+ }
- $this->setSettings([
+ protected function initSettings(): array
+ {
+ return [
'style' => ['text-decoration: none; font-weight: bold; font-style: italic; color: #0000FF;'],
'notag' => 'a,h1,h2,h3',
'tplValues' => ['EntryContent'],
'pubPages' => ['post.html'],
- ]);
-
- return 'twitter';
+ ];
}
public function publicContent(string $tag, array $args): void
diff --git a/src/Filter/EpcFilterUpdate.php b/src/Filter/EpcFilterUpdate.php
index 3092f0a..9c95273 100644
--- a/src/Filter/EpcFilterUpdate.php
+++ b/src/Filter/EpcFilterUpdate.php
@@ -16,13 +16,14 @@ namespace Dotclear\Plugin\enhancePostContent\Filter;
use Dotclear\Plugin\enhancePostContent\Epc;
use Dotclear\Plugin\enhancePostContent\EpcFilter;
-use Dotclear\Plugin\widgets\WidgetsElement;
class EpcFilterUpdate extends EpcFilter
{
- protected function init(): string
+ protected string $id = 'update';
+
+ protected function initProperties(): array
{
- $this->setProperties([
+ return [
'priority' => 300,
'name' => __('Update'),
'help' => __('Update and show terms. First term of the list is the term to update and second term the new term.'),
@@ -30,26 +31,27 @@ class EpcFilterUpdate extends EpcFilter
'htmltag' => 'del,ins',
'class' => ['del.epc-update', 'ins.epc-update'],
'replace' => '%s %s',
- ]);
+ ];
+ }
- $this->setSettings([
+ protected function initSettings(): array
+ {
+ return [
'nocase' => true,
'plural' => true,
'style' => ['text-decoration: line-through;', 'font-style: italic;'],
'notag' => 'h1,h2,h3',
'tplValues' => ['EntryContent'],
'pubPages' => ['post.html'],
- ]);
-
- return 'update';
+ ];
}
public function publicContent(string $tag, array $args): void
{
while ($this->records()->fetch()) {
$args[0] = Epc::replaceString(
- $this->records()->epc_key,
- sprintf($this->replace, '\\1', $this->records()->epc_value),
+ $this->records()->f('epc_key'),
+ sprintf($this->replace, '\\1', $this->records()->f('epc_value')),
$args[0],
$this
);
diff --git a/src/Frontend.php b/src/Frontend.php
index e951d21..8d10bcb 100644
--- a/src/Frontend.php
+++ b/src/Frontend.php
@@ -34,12 +34,12 @@ class Frontend extends dcNsProcess
}
if (!dcCore::app()->blog->settings->get(My::id())->get('active')) {
- return null;
+ return false;
}
dcCore::app()->addBehaviors([
// add CSS URL to header
- 'publicHeadContent' => function (): void {
+ 'publicHeadContent' => function (): void {
echo dcUtils::cssLoad(dcCore::app()->blog->url . dcCore::app()->url->getURLFor('epccss'));
},
// Filter template blocks content
@@ -54,7 +54,7 @@ class Frontend extends dcNsProcess
}
},
// Widgets
- 'initWidgets' => [Widgets::class, 'initWidgets'],
+ 'initWidgets' => [Widgets::class, 'initWidgets'],
]);
return true;
diff --git a/src/Install.php b/src/Install.php
index 370f243..c1ec36f 100644
--- a/src/Install.php
+++ b/src/Install.php
@@ -38,7 +38,6 @@ class Install extends dcNsProcess
}
try {
-
// Database
$s = new dbStruct(dcCore::app()->con, dcCore::app()->prefix);
$s->{My::TABLE_NAME}
@@ -98,7 +97,7 @@ class Install extends dcNsProcess
/**
* Check upgrade to apply
*/
- public static function growUp()
+ public static function growUp(): void
{
$current = dcCore::app()->getVersion(My::id());
@@ -120,7 +119,7 @@ class Install extends dcNsProcess
*
* - filters move from settings to dedicated table
*/
- private static function upTo00060607()
+ private static function upTo00060607(): void
{
# Move old filters lists from settings to database
$record = dcCore::app()->con->select('SELECT * FROM ' . dcCore::app()->prefix . dcNamespace::NS_TABLE_NAME . " WHERE setting_ns='enhancePostContent' AND blog_id IS NOT NULL ");
@@ -153,7 +152,7 @@ class Install extends dcNsProcess
*
* - filters change name to id
*/
- private static function upTo20211006()
+ private static function upTo20211006(): void
{
# Move old filter name to filter id
$record = dcCore::app()->con->select('SELECT epc_id, epc_filter FROM ' . dcCore::app()->prefix . My::TABLE_NAME);
@@ -174,7 +173,7 @@ class Install extends dcNsProcess
* - setting ns changes to abstract one (no real changes),
* - setting value change from serialize to json_encode (if it's array)
*/
- private static function upTo20221120()
+ private static function upTo20221120(): void
{
// list of settings using serialize values to move to json
$ids = [
@@ -202,7 +201,7 @@ class Install extends dcNsProcess
$cur->setfield('setting_value', json_encode(unserialize($record->f('setting_value'))));
}
- $cur->update("WHERE setting_id = '" . $record->setting_id . "' and setting_ns = 'enhancePostContent' ");
+ $cur->update("WHERE setting_id = '" . $record->f('setting_id') . "' and setting_ns = 'enhancePostContent' ");
}
}
}
diff --git a/src/Manage.php b/src/Manage.php
index 765e9d0..f635fce 100644
--- a/src/Manage.php
+++ b/src/Manage.php
@@ -25,7 +25,7 @@ use Dotclear\Helper\Html\Form\{
Form,
Hidden,
Input,
- label,
+ Label,
Note,
Number,
Para,
@@ -125,9 +125,9 @@ class Manage extends dcNsProcess
}
# Update filter records
- if ($current->action == 'deleterecords'
+ if ($current->action == 'deleterecords'
&& $current->filter->has_list
- && !empty($_POST['epc_id'])
+ && !empty($_POST['epc_id'])
&& is_array($_POST['epc_id'])
) {
foreach ($_POST['epc_id'] as $id) {
@@ -198,7 +198,7 @@ class Manage extends dcNsProcess
);
# Page title
- echo
+ echo
dcPage::breadcrumb([
__('Plugins') => '',
My::name() => '',
@@ -217,7 +217,7 @@ class Manage extends dcNsProcess
])->render();
# Filter title and description
- echo
+ echo
'' . $current->filter->name . '
' .
'' . $current->filter->help . '
';
@@ -225,7 +225,7 @@ class Manage extends dcNsProcess
$form_pages = [(new Text('h4', __('Pages to be filtered')))];
foreach (Epc::blogAllowedPubPages() as $k => $v) {
$form_pages[] = (new Para())->items([
- (new Checkbox(['filter_pubPages[]', 'filter_pubPages' . $v], in_array($v, $current->filter->pubPages)))->value(1),
+ (new Checkbox(['filter_pubPages[]', 'filter_pubPages' . $v], in_array($v, $current->filter->pubPages)))->value($v),
(new Label(__($k), Label::OUTSIDE_LABEL_AFTER))->for('filter_pubPages' . $v)->class('classic'),
]);
}
@@ -233,7 +233,7 @@ class Manage extends dcNsProcess
$form_values = [(new Text('h4', __('Contents to be filtered')))];
foreach (Epc::blogAllowedTplValues() as $k => $v) {
$form_values[] = (new Para())->items([
- (new Checkbox(['filter_tplValues[]', 'filter_tplValues' . $v], in_array($v, $current->filter->tplValues)))->value(1),
+ (new Checkbox(['filter_tplValues[]', 'filter_tplValues' . $v], in_array($v, $current->filter->tplValues)))->value($v),
(new Label(__($k), Label::OUTSIDE_LABEL_AFTER))->for('filter_tplValues' . $v)->class('classic'),
]);
}
@@ -246,7 +246,7 @@ class Manage extends dcNsProcess
]);
}
- echo
+ echo
(new Div('setting'))->class('multi-part')->title(__('Settings'))->items([
(new Form('setting_form'))->method('post')->action(dcCore::app()->adminurl->get('admin.plugin.' . My::id()) . '#setting')->separator('')->fields([
(new Div())->class('two-boxes even')->items($form_pages),
@@ -286,7 +286,7 @@ class Manage extends dcNsProcess
])->render();
# Filter records list
- if ($current->filter->has_list && isset($sorts) && isset($pager)) {
+ if ($current->filter->has_list && isset($pager)) {
$pager_url = dcCore::app()->adminurl->get('admin.plugin.' . My::id(), array_diff_key($sorts->values(true), ['page' => ''])) . '&page=%s#record';
echo '
@@ -319,7 +319,7 @@ class Manage extends dcNsProcess
echo '';
# New record
- echo
+ echo
(new Div('newrecord'))->class('multi-part')->title(__('New record'))->items([
(new Form('form-create'))->method('post')->action(dcCore::app()->adminurl->get('admin.plugin.' . My::id()) . '#record')->fields([
(new Para())->items([
diff --git a/src/ManageVars.php b/src/ManageVars.php
index 5ca789e..8314870 100644
--- a/src/ManageVars.php
+++ b/src/ManageVars.php
@@ -14,7 +14,6 @@ declare(strict_types=1);
namespace Dotclear\Plugin\enhancePostContent;
-use dcCore;
use Exception;
class ManageVars
@@ -45,10 +44,10 @@ class ManageVars
throw new Exception(__('no filters'));
}
- $this->action = $_POST['action'] ?? '';
- $this->part = $part;
- $this->filter = $_filters[$part];
- $this->combo = $filters_combo;
+ $this->action = $_POST['action'] ?? '';
+ $this->part = $part;
+ $this->filter = $_filters[$part];
+ $this->combo = $filters_combo;
}
public static function init(): ManageVars
diff --git a/src/My.php b/src/My.php
index b6936ab..48adf85 100644
--- a/src/My.php
+++ b/src/My.php
@@ -22,7 +22,7 @@ use dcCore;
class My
{
/** @var string Required php version */
- public const PHP_MIN = '8.0';
+ public const PHP_MIN = '8.1';
/** @var string Plugin table name */
public const TABLE_NAME = 'epc';
diff --git a/src/Uninstall.php b/src/Uninstall.php
index a97e668..d47c0b2 100644
--- a/src/Uninstall.php
+++ b/src/Uninstall.php
@@ -116,7 +116,7 @@ class Uninstall
/* ns */
My::id(),
/* description */
- sprintf(__('delete %s version number'),My::id())
+ sprintf(__('delete %s version number'), My::id())
);
return true;
diff --git a/src/Widgets.php b/src/Widgets.php
index 7cb659e..fdef955 100644
--- a/src/Widgets.php
+++ b/src/Widgets.php
@@ -14,6 +14,7 @@ declare(strict_types=1);
namespace Dotclear\Plugin\enhancePostContent;
+use ArrayObject;
use dcCore;
use Dotclear\Helper\Html\Html;
use Dotclear\Plugin\widgets\WidgetsStack;
@@ -29,7 +30,7 @@ class Widgets
/**
* Admin part for widget that show extracted content
*
- * @param dcWidgets $w dcWidgets instance
+ * @param WidgetsStack $w WidgetsStack instance
*/
public static function initWidgets(WidgetsStack $w): void
{
@@ -53,7 +54,9 @@ class Widgets
$filters = Epc::getFilters();
$types = [];
foreach ($filters as $id => $filter) {
- $types[$filter->name] = $id;
+ if ($filter->widget != '') {
+ $types[$filter->name] = $id;
+ }
}
$w->epclist->setting(
'type',
@@ -72,20 +75,6 @@ class Widgets
'check'
);
}
- # Case sensitive
- $w->epclist->setting(
- 'nocase',
- __('Search case insensitive'),
- 0,
- 'check'
- );
- # Plural
- $w->epclist->setting(
- 'plural',
- __('Search also plural'),
- 0,
- 'check'
- );
# Show count
$w->epclist->setting(
'show_total',
@@ -103,7 +92,7 @@ class Widgets
/**
* Public part for widget that show extracted content
*
- * @param dcWidget $w dcWidget instance
+ * @param WidgetsElement $w WidgetsElement instance
*/
public static function parseWidget(WidgetsElement $w): string
{
@@ -123,9 +112,9 @@ class Widgets
foreach (Epc::defaultAllowedWidgetValues() as $k => $v) {
$ns = 'content' . $v['id'];
if ($w->$ns && is_callable($v['cb'])) {
- $content .= call_user_func_array(
+ $content .= call_user_func(
$v['cb'],
- [dcCore::app(), $w]
+ $w
);
}
}
@@ -135,16 +124,14 @@ class Widgets
}
# Filter
- $list = [];
+ $list = new ArrayObject();
$filters = Epc::getFilters();
if (isset($filters[$w->type])) {
- $filters[$w->type]->nocase = $w->nocase;
- $filters[$w->type]->plural = $w->plural;
$filters[$w->type]->widgetList($content, $w, $list);
}
- if (empty($list)) {
+ if (!count($list)) {
return '';
}