diff options
Diffstat (limited to 'classes/pluginhost.php')
-rwxr-xr-x | classes/pluginhost.php | 128 |
1 files changed, 77 insertions, 51 deletions
diff --git a/classes/pluginhost.php b/classes/pluginhost.php index 413fddeae..7e5f6029c 100755 --- a/classes/pluginhost.php +++ b/classes/pluginhost.php @@ -22,54 +22,54 @@ class PluginHost { // Hooks marked with *1 are run in global context and available // to plugins loaded in config.php only - const HOOK_ARTICLE_BUTTON = 1; - const HOOK_ARTICLE_FILTER = 2; - const HOOK_PREFS_TAB = 3; - const HOOK_PREFS_TAB_SECTION = 4; - const HOOK_PREFS_TABS = 5; - const HOOK_FEED_PARSED = 6; - const HOOK_UPDATE_TASK = 7; // *1 - const HOOK_AUTH_USER = 8; - const HOOK_HOTKEY_MAP = 9; - const HOOK_RENDER_ARTICLE = 10; - const HOOK_RENDER_ARTICLE_CDM = 11; - const HOOK_FEED_FETCHED = 12; - const HOOK_SANITIZE = 13; - const HOOK_RENDER_ARTICLE_API = 14; - const HOOK_TOOLBAR_BUTTON = 15; - const HOOK_ACTION_ITEM = 16; - const HOOK_HEADLINE_TOOLBAR_BUTTON = 17; - const HOOK_HOTKEY_INFO = 18; - const HOOK_ARTICLE_LEFT_BUTTON = 19; - const HOOK_PREFS_EDIT_FEED = 20; - const HOOK_PREFS_SAVE_FEED = 21; - const HOOK_FETCH_FEED = 22; - const HOOK_QUERY_HEADLINES = 23; - const HOOK_HOUSE_KEEPING = 24; // *1 - const HOOK_SEARCH = 25; - const HOOK_FORMAT_ENCLOSURES = 26; - const HOOK_SUBSCRIBE_FEED = 27; - const HOOK_HEADLINES_BEFORE = 28; - const HOOK_RENDER_ENCLOSURE = 29; - const HOOK_ARTICLE_FILTER_ACTION = 30; - const HOOK_ARTICLE_EXPORT_FEED = 31; - const HOOK_MAIN_TOOLBAR_BUTTON = 32; - const HOOK_ENCLOSURE_ENTRY = 33; - const HOOK_FORMAT_ARTICLE = 34; - const HOOK_FORMAT_ARTICLE_CDM = 35; /* RIP */ - const HOOK_FEED_BASIC_INFO = 36; - const HOOK_SEND_LOCAL_FILE = 37; - const HOOK_UNSUBSCRIBE_FEED = 38; - const HOOK_SEND_MAIL = 39; - const HOOK_FILTER_TRIGGERED = 40; - const HOOK_GET_FULL_TEXT = 41; - const HOOK_ARTICLE_IMAGE = 42; - const HOOK_FEED_TREE = 43; - const HOOK_IFRAME_WHITELISTED = 44; - const HOOK_ENCLOSURE_IMPORTED = 45; - const HOOK_HEADLINES_CUSTOM_SORT_MAP = 46; - const HOOK_HEADLINES_CUSTOM_SORT_OVERRIDE = 47; - const HOOK_HEADLINE_TOOLBAR_SELECT_MENU_ITEM = 48; + const HOOK_ARTICLE_BUTTON = "hook_article_button"; + const HOOK_ARTICLE_FILTER = "hook_article_filter"; + const HOOK_PREFS_TAB = "hook_prefs_tab"; + const HOOK_PREFS_TAB_SECTION = "hook_prefs_tab_section"; + const HOOK_PREFS_TABS = "hook_prefs_tabs"; + const HOOK_FEED_PARSED = "hook_feed_parsed"; + const HOOK_UPDATE_TASK = "hook_update_task"; //*1 + const HOOK_AUTH_USER = "hook_auth_user"; + const HOOK_HOTKEY_MAP = "hook_hotkey_map"; + const HOOK_RENDER_ARTICLE = "hook_render_article"; + const HOOK_RENDER_ARTICLE_CDM = "hook_render_article_cdm"; + const HOOK_FEED_FETCHED = "hook_feed_fetched"; + const HOOK_SANITIZE = "hook_sanitize"; + const HOOK_RENDER_ARTICLE_API = "hook_render_article_api"; + const HOOK_TOOLBAR_BUTTON = "hook_toolbar_button"; + const HOOK_ACTION_ITEM = "hook_action_item"; + const HOOK_HEADLINE_TOOLBAR_BUTTON = "hook_headline_toolbar_button"; + const HOOK_HOTKEY_INFO = "hook_hotkey_info"; + const HOOK_ARTICLE_LEFT_BUTTON = "hook_article_left_button"; + const HOOK_PREFS_EDIT_FEED = "hook_prefs_edit_feed"; + const HOOK_PREFS_SAVE_FEED = "hook_prefs_save_feed"; + const HOOK_FETCH_FEED = "hook_fetch_feed"; + const HOOK_QUERY_HEADLINES = "hook_query_headlines"; + const HOOK_HOUSE_KEEPING = "hook_house_keeping"; //*1 + const HOOK_SEARCH = "hook_search"; + const HOOK_FORMAT_ENCLOSURES = "hook_format_enclosures"; + const HOOK_SUBSCRIBE_FEED = "hook_subscribe_feed"; + const HOOK_HEADLINES_BEFORE = "hook_headlines_before"; + const HOOK_RENDER_ENCLOSURE = "hook_render_enclosure"; + const HOOK_ARTICLE_FILTER_ACTION = "hook_article_filter_action"; + const HOOK_ARTICLE_EXPORT_FEED = "hook_article_export_feed"; + const HOOK_MAIN_TOOLBAR_BUTTON = "hook_main_toolbar_button"; + const HOOK_ENCLOSURE_ENTRY = "hook_enclosure_entry"; + const HOOK_FORMAT_ARTICLE = "hook_format_article"; + const HOOK_FORMAT_ARTICLE_CDM = "hook_format_article_cdm"; /* RIP */ + const HOOK_FEED_BASIC_INFO = "hook_feed_basic_info"; + const HOOK_SEND_LOCAL_FILE = "hook_send_local_file"; + const HOOK_UNSUBSCRIBE_FEED = "hook_unsubscribe_feed"; + const HOOK_SEND_MAIL = "hook_send_mail"; + const HOOK_FILTER_TRIGGERED = "hook_filter_triggered"; + const HOOK_GET_FULL_TEXT = "hook_get_full_text"; + const HOOK_ARTICLE_IMAGE = "hook_article_image"; + const HOOK_FEED_TREE = "hook_feed_tree"; + const HOOK_IFRAME_WHITELISTED = "hook_iframe_whitelisted"; + const HOOK_ENCLOSURE_IMPORTED = "hook_enclosure_imported"; + const HOOK_HEADLINES_CUSTOM_SORT_MAP = "hook_headlines_custom_sort_map"; + const HOOK_HEADLINES_CUSTOM_SORT_OVERRIDE = "hook_headlines_custom_sort_override"; + const HOOK_HEADLINE_TOOLBAR_SELECT_MENU_ITEM = "hook_headline_toolbar_select_menu_item"; const KIND_ALL = 1; const KIND_SYSTEM = 2; @@ -131,9 +131,35 @@ class PluginHost { return $this->plugins[strtolower($name)] ?? null; } - function run_hooks($type, $method, $args) { - foreach ($this->get_hooks($type) as $hook) { - $hook->$method($args); + function run_hooks($hook, ...$args) { + $method = strtolower($hook); + + foreach ($this->get_hooks($hook) as $plugin) { + Debug::log("invoking: " . get_class($plugin) . "->$hook()", Debug::$LOG_VERBOSE); + + try { + $plugin->$method(...$args); + } catch (Exception $ex) { + user_error($ex, E_USER_WARNING); + } catch (Error $err) { + user_error($err, E_USER_WARNING); + } + } + } + + function run_hooks_callback($hook, $callback, ...$args) { + $method = strtolower($hook); + + foreach ($this->get_hooks($hook) as $plugin) { + //Debug::log("invoking: " . get_class($plugin) . "->$hook()", Debug::$LOG_VERBOSE); + + try { + $callback($plugin->$method(...$args), $plugin); + } catch (Exception $ex) { + user_error($ex, E_USER_WARNING); + } catch (Error $err) { + user_error($err, E_USER_WARNING); + } } } |