From a3113ed1955bdae2ba88e542245a91aa7a8b2718 Mon Sep 17 00:00:00 2001 From: maxpozdeev Date: Sat, 9 Sep 2023 17:31:26 +0300 Subject: [PATCH] * add filter action for smart syntax parser --- src/includes/api/TasksController.php | 9 ++- src/includes/filters.php | 84 ++++++++++++++++++++++++++++ src/init.php | 1 + 3 files changed, 91 insertions(+), 3 deletions(-) create mode 100644 src/includes/filters.php diff --git a/src/includes/api/TasksController.php b/src/includes/api/TasksController.php index 32e0f1a..6c8289c 100644 --- a/src/includes/api/TasksController.php +++ b/src/includes/api/TasksController.php @@ -241,9 +241,9 @@ class TasksController extends ApiController { ); if (Config::get('smartsyntax') != 0 && (false !== $a = $this->parseSmartSyntax($t['title']))) { - $t['title'] = $a['title']; - $t['prio'] = $a['prio']; - $t['tags'] = $a['tags']; + $t['title'] = (string) $a['title']; + $t['prio'] = (int) $a['prio']; + $t['tags'] = (string) $a['tags']; } $this->response->data = $t; } @@ -803,6 +803,9 @@ class TasksController extends ApiController { if (count($tags) > 0) { $a['tags'] = implode( ',' , $tags ); } + + do_filter('parseSmartSyntax', $title, $a); + return $a; } diff --git a/src/includes/filters.php b/src/includes/filters.php new file mode 100644 index 0000000..276f892 --- /dev/null +++ b/src/includes/filters.php @@ -0,0 +1,84 @@ + + Licensed under the GNU GPL version 2 or any later. See file COPYRIGHT for details. +*/ + +class MTTFilterCenter +{ + private static $filters = []; + + public static function addFilterCallbackForAction(string $action, callable $callback): bool + { + if (!isset(self::$filters[$action])) { + self::$filters[$action] = []; + } + if (!in_array($callback, self::$filters[$action])) { + // do not duplicate same callback + self::$filters[$action][] = $callback; + return true; + } + return false; + } + + + public static function addFilterForAction(string $action, MTTFilterInterface $filter): bool + { + if (!isset(self::$filters[$action])) { + self::$filters[$action] = []; + } + if (!in_array($filter, self::$filters[$action])) { + // do not duplicate same filter + self::$filters[$action][] = $filter; + return true; + } + return false; + } + + + public static function hasFiltersForAction(string $action): bool + { + if (isset(self::$filters[$action]) && count(self::$filters[$action]) > 0) { + return true; + } + return false; + } + + + public static function filter(string $action, $in, &$out): bool + { + if (!isset(self::$filters[$action]) || count(self::$filters[$action]) == 0) { + return false; + } + foreach (self::$filters[$action] as $filter) { + if ($filter instanceof MTTFilterInterface) { + $filter->filter($in, $out); + } + else { + $filter($in, $out); + } + } + return true; + } +} + +interface MTTFilterInterface +{ + function filter($in, &$out); +} + +function add_filter(string $action, MTTFilterInterface $filter) { + MTTFilterCenter::addFilterForAction($action, $filter); +} + +function add_filter_callback(string $action, callable $callback) { + MTTFilterCenter::addFilterCallbackForAction($action, $callback); +} + +function do_filter(string $action, $in, &$out): bool { + return MTTFilterCenter::filter($action, $in, $out); +} + + diff --git a/src/init.php b/src/init.php index 5ccfa81..1299ef1 100644 --- a/src/init.php +++ b/src/init.php @@ -40,6 +40,7 @@ require_once(MTTINC. 'class.dbconnection.php'); require_once(MTTINC. 'class.dbcore.php'); require_once(MTTINC. 'class.config.php'); require_once(MTTINC. 'notifications.php'); +require_once(MTTINC. 'filters.php'); configureDbConnection();