From bdb7dee5ee55623f5f79134d9656f5198dd59b16 Mon Sep 17 00:00:00 2001 From: Rumperuu Date: Sun, 8 Aug 2021 15:01:01 +0100 Subject: [PATCH] refactor: redo remaining settings Note: the already-deprecated `FOOTNOTES_EXPERT_MODE`, `CUSTOM_CSS` and `CUSTOM_CSS_LEGACY_MODE_ENABLE` settings have been dropped. The original `CUSTOM_CSS_NEW` setting has been renamed to `CUSTOM_CSS`. --- settings.ods | Bin 41370 -> 42169 bytes src/admin/layout/class-engine.php | 15 +- src/admin/layout/class-init.php | 4 +- src/admin/layout/class-settings-page.php | 195 +---------- src/includes/class-core.php | 1 - src/includes/class-settings.php | 308 ------------------ src/includes/settings/class-setting.php | 50 ++- .../settings/class-settings-group.php | 7 +- .../class-custom-css-settings-group.php | 58 ++++ .../class-custom-css-settings-section.php | 7 +- ...ass-reference-container-settings-group.php | 36 +- ...lass-tooltip-appearance-settings-group.php | 10 +- ...lass-tooltip-dimensions-settings-group.php | 2 + ...ss-scope-and-priority-settings-section.php | 11 +- .../class-wordpress-hooks-settings-group.php | 279 ++++++++++++++++ src/public/class-parser.php | 46 ++- 16 files changed, 445 insertions(+), 584 deletions(-) create mode 100644 src/includes/settings/custom-css/class-custom-css-settings-group.php create mode 100644 src/includes/settings/scope-and-priority/class-wordpress-hooks-settings-group.php diff --git a/settings.ods b/settings.ods index 64556c3686686762b27672f4b63e0ce1eeb8e133..c9a15e6137486c97b1f818b1d1ea84d2d0aba3f0 100644 GIT binary patch delta 40301 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 SUxRL5LVSzp(4`CiX8#|rmP!Et delta 39524 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', + $name, + $name, + $style ?? '', + isset($readonly) ? ' readonly="readonly"' : '', + $disabled ? ' disabled': '', + $value, + ) ); } protected function add_input_number( array $args ): void { @@ -484,7 +498,6 @@ abstract class Engine { ); } - /************************************************************************** * NEW METHODS END **************************************************************************/ diff --git a/src/admin/layout/class-init.php b/src/admin/layout/class-init.php index 41f972b..bdaf216 100644 --- a/src/admin/layout/class-init.php +++ b/src/admin/layout/class-init.php @@ -91,9 +91,7 @@ class Init { * * @since 1.5.0 */ - public function initialize_settings(): void { - Settings::instance()->register_settings(); - + public function initialize_settings(): void { Settings::instance()->settings_sections['general']->add_settings_section(); Settings::instance()->settings_sections['referrers_and_tooltips']->add_settings_section(); Settings::instance()->settings_sections['scope_and_priority']->add_settings_section(); diff --git a/src/admin/layout/class-settings-page.php b/src/admin/layout/class-settings-page.php index 943308c..8073e98 100644 --- a/src/admin/layout/class-settings-page.php +++ b/src/admin/layout/class-settings-page.php @@ -97,6 +97,9 @@ class SettingsPage extends Engine { case 'text': $this->add_input_text($args); return; + case 'textarea': + $this->add_input_textarea($args); + return; case 'number': $this->add_input_number($args); return; @@ -117,169 +120,7 @@ class SettingsPage extends Engine { /************************************************************************** * NEW METHODS END **************************************************************************/ - - /** - * Displays the Custom CSS box. - * - * @since 1.5.0 - */ - public function custom_css() { - // Load template file. - $template = new Template( Template::DASHBOARD, 'customize-css' ); - // Replace all placeholders. - $template->replace( - array( - 'label-css' => $this->add_label( Settings::CUSTOM_CSS, __( 'Your existing Custom CSS code:', 'footnotes' ) ), - 'css' => $this->add_textarea( Settings::CUSTOM_CSS ), - 'description-css' => __( 'Custom CSS migrates to a dedicated tab. This text area is intended to keep your data safe, and the code remains valid while visible. Please copy-paste the content into the new text area under the new tab.', 'footnotes' ), - - // phpcs:disable Squiz.PHP.CommentedOutCode.Found - // CSS classes are listed in the template. - // Localized notices are dropped to ease translators' task. - - // "label-class-1" => ".footnote_plugin_tooltip_text",. - // "class-1" => $this->add_text(__("superscript, Footnotes index", $this->plugin_name)),. - - // "label-class-2" => ".footnote_tooltip",. - // "class-2" => $this->add_text(__("mouse-over box, tooltip for each superscript", $this->plugin_name)),. - - // "label-class-3" => ".footnote_plugin_index",. - // "class-3" => $this->add_text(__("1st column of the Reference Container, Footnotes index", $this->plugin_name)),. - - // "label-class-4" => ".footnote_plugin_text",. - // "class-4" => $this->add_text(__("2nd column of the Reference Container, Footnote text", $this->plugin_name)). - // phpcs:enable - ) - ); - // Display template with replaced placeholders. - // phpcs:disable WordPress.Security.EscapeOutput.OutputNotEscaped - echo $template->get_content(); - // phpcs:enable - } - - /** - * Displays transitional legacy Custom CSS box. - * - * @since 2.2.2 - * @deprecated - */ - public function custom_css_migration(): void { - - // Options for Yes/No select box. - $enabled = array( - 'yes' => __( 'Yes', 'footnotes' ), - 'no' => __( 'No', 'footnotes' ), - ); - - // Load template file. - $template = new Template( Template::DASHBOARD, 'customize-css-migration' ); - // Replace all placeholders. - $template->replace( - array( - 'label-css' => $this->add_label( Settings::CUSTOM_CSS, __( 'Your existing Custom CSS code:', 'footnotes' ) ), - 'css' => $this->add_textarea( Settings::CUSTOM_CSS ), - 'description-css' => __( 'Custom CSS migrates to a dedicated tab. This text area is intended to keep your data safe, and the code remains valid while visible. Please copy-paste the content into the new text area below. Set Show legacy to No. Save twice.', 'footnotes' ), - - 'label-show-legacy' => $this->add_label( Settings::CUSTOM_CSS_LEGACY_ENABLE, 'Show legacy Custom CSS settings containers:' ), - 'show-legacy' => $this->add_select_box( Settings::CUSTOM_CSS_LEGACY_ENABLE, $enabled ), - 'notice-show-legacy' => __( 'Please set to No when you are done migrating, for the legacy Custom CSS containers to disappear.', 'footnotes' ), - // Translators: %s: Referres and tooltips. - 'description-show-legacy' => sprintf( __( 'The legacy Custom CSS under the %s tab and its mirror here are emptied, and the select box saved as No, when the settings tab is saved while the settings container is not displayed.', 'footnotes' ), __( 'Referrers and tooltips', 'footnotes' ) ), - - ) - ); - // Display template with replaced placeholders. - // phpcs:disable WordPress.Security.EscapeOutput.OutputNotEscaped - echo $template->get_content(); - // phpcs:enable - } - - /** - * Displays the new Custom CSS box. - * - * @since 2.2.2 - */ - public function custom_css_new(): void { - // Load template file. - $template = new Template( Template::DASHBOARD, 'customize-css-new' ); - // Replace all placeholders. - $template->replace( - array( - 'css' => $this->add_textarea( Settings::CUSTOM_CSS_NEW ), - - 'headline' => $this->add_text( __( 'Recommended CSS classes:', 'footnotes' ) ), - - ) - ); - // Display template with replaced placeholders. - // phpcs:disable WordPress.Security.EscapeOutput.OutputNotEscaped - echo $template->get_content(); - // phpcs:enable - } - - /** - * Displays available Hooks to look for Footnote short codes. - * - * Priority level was initially a hard-coded default - * shows ‘9223372036854775807’ in the numbox - * empty should be interpreted as `PHP_INT_MAX`, - * but a numbox cannot be set to empty, see {@link https://github.com/Modernizr/Modernizr/issues/171 - * here} - * define -1 as `PHP_INT_MAX` instead - * - * @since 1.5.5 - */ - public function lookup_hooks(): void { - // Load template file. - $template = new Template( Template::DASHBOARD, 'expert-lookup' ); - - // Replace all placeholders. - $template->replace( - array( - 'description-1' => __( 'The priority level determines whether Footnotes is executed timely before other plugins, and how the reference container is positioned relative to other features.', 'footnotes' ), - // Translators: 1: 99; 2: 1200. - 'description-2' => sprintf( __( 'For the_content, this figure must be lower than %1$d so that certain strings added by a plugin running at %1$d may not be mistaken as a footnote. This makes also sure that the reference container displays above a feature inserted by a plugin running at %2$d.', 'footnotes' ), 99, 1200 ), - // Translators: 1: PHP_INT_MAX; 2: 0; 3: -1; 4: 'PHP_INT_MAX'. - 'description-3' => sprintf( __( '%1$d is lowest priority, %2$d is highest. To set priority level to lowest, set it to %3$d, interpreted as %1$d, the constant %4$s.', 'footnotes' ), PHP_INT_MAX, 0, -1, 'PHP_INT_MAX' ), - 'description-4' => __( 'The widget_text hook must be enabled either when footnotes are present in theme text widgets, or when Elementor accordions or toggles shall have a reference container per section. If they should not, this hook must be disabled.', 'footnotes' ), - - 'head-hook' => __( 'WordPress hook function name', 'footnotes' ), - 'head-checkbox' => __( 'Activate', 'footnotes' ), - 'head-numbox' => __( 'Priority level', 'footnotes' ), - 'head-url' => __( 'WordPress documentation', 'footnotes' ), - - 'label-the-title' => $this->add_label( Settings::EXPERT_LOOKUP_THE_TITLE, 'the_title' ), - 'the-title' => $this->add_checkbox( Settings::EXPERT_LOOKUP_THE_TITLE ), - 'priority-the-title' => $this->add_num_box( Settings::EXPERT_LOOKUP_THE_TITLE_PRIORITY_LEVEL, -1, PHP_INT_MAX ), - 'url-the-title' => 'https://developer.wordpress.org/reference/hooks/the_title/', - - 'label-the-content' => $this->add_label( Settings::EXPERT_LOOKUP_THE_CONTENT, 'the_content' ), - 'the-content' => $this->add_checkbox( Settings::EXPERT_LOOKUP_THE_CONTENT ), - 'priority-the-content' => $this->add_num_box( Settings::EXPERT_LOOKUP_THE_CONTENT_PRIORITY_LEVEL, -1, PHP_INT_MAX ), - 'url-the-content' => 'https://developer.wordpress.org/reference/hooks/the_content/', - - 'label-the-excerpt' => $this->add_label( Settings::EXPERT_LOOKUP_THE_EXCERPT, 'the_excerpt' ), - 'the-excerpt' => $this->add_checkbox( Settings::EXPERT_LOOKUP_THE_EXCERPT ), - 'priority-the-excerpt' => $this->add_num_box( Settings::EXPERT_LOOKUP_THE_EXCERPT_PRIORITY_LEVEL, -1, PHP_INT_MAX ), - 'url-the-excerpt' => 'https://developer.wordpress.org/reference/functions/the_excerpt/', - - 'label-widget-title' => $this->add_label( Settings::EXPERT_LOOKUP_WIDGET_TITLE, 'widget_title' ), - 'widget-title' => $this->add_checkbox( Settings::EXPERT_LOOKUP_WIDGET_TITLE ), - 'priority-widget-title' => $this->add_num_box( Settings::EXPERT_LOOKUP_WIDGET_TITLE_PRIORITY_LEVEL, -1, PHP_INT_MAX ), - 'url-widget-title' => 'https://codex.wordpress.org/Plugin_API/Filter_Reference/widget_title', - - 'label-widget-text' => $this->add_label( Settings::EXPERT_LOOKUP_WIDGET_TEXT, 'widget_text' ), - 'widget-text' => $this->add_checkbox( Settings::EXPERT_LOOKUP_WIDGET_TEXT ), - 'priority-widget-text' => $this->add_num_box( Settings::EXPERT_LOOKUP_WIDGET_TEXT_PRIORITY_LEVEL, -1, PHP_INT_MAX ), - 'url-widget-text' => 'https://codex.wordpress.org/Plugin_API/Filter_Reference/widget_text', - ) - ); - // Display template with replaced placeholders. - // phpcs:disable WordPress.Security.EscapeOutput.OutputNotEscaped - echo $template->get_content(); - // phpcs:enable - } - + /** * Displays a short introduction to the plugin. * @@ -420,34 +261,6 @@ class SettingsPage extends Engine { protected function get_meta_boxes(): array { $meta_boxes = array(); - $meta_boxes[] = $this->add_meta_box( 'settings', 'amp-compat', __( 'AMP compatibility', 'footnotes' ), 'amp_compat' ); - $meta_boxes[] = $this->add_meta_box( 'settings', 'numbering', __( 'Footnotes numbering', 'footnotes' ), 'numbering' ); - $meta_boxes[] = $this->add_meta_box( 'settings', 'scrolling', __( 'Scrolling behavior', 'footnotes' ), 'scrolling' ); - $meta_boxes[] = $this->add_meta_box( 'settings', 'hard-links', __( 'URL fragment ID configuration', 'footnotes' ), 'hard_links' ); - $meta_boxes[] = $this->add_meta_box( 'settings', 'reference-container', __( 'Reference container', 'footnotes' ), 'reference_container' ); - $meta_boxes[] = $this->add_meta_box( 'settings', 'excerpts', __( 'Footnotes in excerpts', 'footnotes' ), 'excerpts' ); - $meta_boxes[] = $this->add_meta_box( 'settings', 'love', Config::PLUGIN_HEADING_NAME . ' ' . Config::LOVE_SYMBOL_HEADING, 'love' ); - - $meta_boxes[] = $this->add_meta_box( 'customize', 'superscript', __( 'Referrers', 'footnotes' ), 'superscript' ); - $meta_boxes[] = $this->add_meta_box( 'customize', 'label-solution', __( 'Referrers in labels', 'footnotes' ), 'label_solution' ); - $meta_boxes[] = $this->add_meta_box( 'customize', 'mouse-over-box', __( 'Tooltips', 'footnotes' ), 'mouseover_box' ); - $meta_boxes[] = $this->add_meta_box( 'customize', 'mouse-over-box-position', __( 'Tooltip position', 'footnotes' ), 'mouseover_box_position' ); - $meta_boxes[] = $this->add_meta_box( 'customize', 'mouse-over-box-dimensions', __( 'Tooltip dimensions', 'footnotes' ), 'mouseover_box_dimensions' ); - $meta_boxes[] = $this->add_meta_box( 'customize', 'mouse-over-box-timing', __( 'Tooltip timing', 'footnotes' ), 'mouseover_box_timing' ); - $meta_boxes[] = $this->add_meta_box( 'customize', 'mouse-over-box-truncation', __( 'Tooltip truncation', 'footnotes' ), 'mouseover_box_truncation' ); - $meta_boxes[] = $this->add_meta_box( 'customize', 'mouse-over-box-text', __( 'Tooltip text', 'footnotes' ), 'mouseover_box_text' ); - $meta_boxes[] = $this->add_meta_box( 'customize', 'mouse-over-box-appearance', __( 'Tooltip appearance', 'footnotes' ), 'mouseover_box_appearance' ); - if ( Convert::to_bool( Settings::instance()->get( Settings::CUSTOM_CSS_LEGACY_ENABLE ) ) ) { - $meta_boxes[] = $this->add_meta_box( 'customize', 'custom-css', __( 'Your existing Custom CSS code', 'footnotes' ), 'custom_css' ); - } - - $meta_boxes[] = $this->add_meta_box( 'expert', 'lookup', __( 'WordPress hooks with priority level', 'footnotes' ), 'lookup_hooks' ); - - if ( Convert::to_bool( Settings::instance()->get( Settings::CUSTOM_CSS_LEGACY_ENABLE ) ) ) { - $meta_boxes[] = $this->add_meta_box( 'customcss', 'custom-css-migration', __( 'Your existing Custom CSS code', 'footnotes' ), 'custom_css_migration' ); - } - $meta_boxes[] = $this->add_meta_box( 'customcss', 'custom-css-new', __( 'Custom CSS', 'footnotes' ), 'custom_css_new' ); - $meta_boxes[] = $this->add_meta_box( 'how-to', 'help', __( 'Brief introduction: How to use the plugin', 'footnotes' ), 'help' ); $meta_boxes[] = $this->add_meta_box( 'how-to', 'donate', __( 'Help us to improve our Plugin', 'footnotes' ), 'donate' ); diff --git a/src/includes/class-core.php b/src/includes/class-core.php index 18a1e74..f1dcc04 100644 --- a/src/includes/class-core.php +++ b/src/includes/class-core.php @@ -192,7 +192,6 @@ class Core { require_once plugin_dir_path( __DIR__ ) . 'public/class-general.php'; $this->loader = new Loader(); - } /** * Define the locale for this plugin for internationalization. diff --git a/src/includes/class-settings.php b/src/includes/class-settings.php index deb883e..cefa64c 100644 --- a/src/includes/class-settings.php +++ b/src/includes/class-settings.php @@ -35,226 +35,6 @@ use footnotes\includes\settings\customcss\CustomCSSSettingsSection; * Moved under `footnotes\includes` namespace. */ class Settings { - /** - * Options for the custom width units (per cent is a ratio, not a unit). - * - * @var array - * - * @since 2.8.0 - * @todo Move to `SettingsSection`/`SettingsGroup`. - */ - const WIDTH_UNIT_OPTIONS = array( - '%' => 'per cent', - 'px' => 'pixels', - 'rem' => 'root em', - 'em' => 'em', - 'vw' => 'viewport width', - ); - - /** - * Settings container key for the Custom CSS. - * - * @var string - * - * @since 1.5.0 - * @todo Move to `SettingsSection`/`SettingsGroup`. - */ - const CUSTOM_CSS = 'footnote_inputfield_custom_css'; - - /** - * Settings container key to enable the `the_title` hook. - * - * These are checkboxes; the keyword `checked` is converted to `true`, whilst - * an empty string (the default) is converted to `false`. - * - * Hooks should all be enabled by default to prevent users from thinking at - * first that the feature is broken in post titles (see {@link - * https://wordpress.org/support/topic/more-feature-ideas/ here} for more - * information). - * - * @var string - * - * @since 1.5.5 - * @todo In titles, footnotes are still buggy, because WordPress uses the - * title string in menus and in the title element, but Footnotes doesn't - * delete footnotes in them. - * @todo Move to `SettingsSection`/`SettingsGroup`. - */ - const EXPERT_LOOKUP_THE_TITLE = 'footnote_inputfield_expert_lookup_the_title'; - - /** - * Settings container key to enable the `the_content` hook. - * - * @var string - * - * @since 1.5.5 - * @todo Move to `SettingsSection`/`SettingsGroup`. - */ - const EXPERT_LOOKUP_THE_CONTENT = 'footnote_inputfield_expert_lookup_the_content'; - - /** - * Settings container key to enable the `the_excerpt` hook. - * - * @var string - * - * @see FOOTNOTES_IN_EXCERPT - * - * @since 1.5.5 - * @since 2.6.3 Enable by default. - * @todo Move to `SettingsSection`/`SettingsGroup`. - */ - const EXPERT_LOOKUP_THE_EXCERPT = 'footnote_inputfield_expert_lookup_the_excerpt'; - - /** - * Settings container key to enable the `widget_title` hook. - * - * @var string - * - * @since 1.5.5 - * @todo Move to `SettingsSection`/`SettingsGroup`. - */ - const EXPERT_LOOKUP_WIDGET_TITLE = 'footnote_inputfield_expert_lookup_widget_title'; - - /** - * Settings container key to enable the `widget_text` hook. - * - * The `widget_text` hook must be disabled by default, because it causes - * multiple reference containers to appear in Elementor accordions, but - * it must be enabled if multiple reference containers are desired, as - * in Elementor toggles. - * - * @var string - * - * @since 1.5.5 - * @todo Move to `SettingsSection`/`SettingsGroup`. - */ - const EXPERT_LOOKUP_WIDGET_TEXT = 'footnote_inputfield_expert_lookup_widget_text'; - - /** - * Settings container key for the mouse-over box to define the max. width. - * - * The width should be limited to start with, for the box to have shape. - * - * The default width is 450. - * - * @var int - * - * @since 1.5.6 - * @todo Move to `SettingsSection`/`SettingsGroup`. - */ - const FOOTNOTES_MOUSE_OVER_BOX_MAX_WIDTH = 'footnote_inputfield_custom_mouse_over_box_max_width'; - - /** - * Settings container key to get the backlink symbol switch side. - * - * @var string - * - * @since 2.1.1 - * @todo Move to `SettingsSection`/`SettingsGroup`. - */ - const REFERENCE_CONTAINER_BACKLINK_SYMBOL_SWITCH = 'footnotes_inputfield_reference_container_backlink_symbol_switch'; - - /** - * Settings container key for `the_content` hook priority level. - * - * Priority level of `the_content` and of `widget_text` as the only relevant - * hooks must be less than 99 because social buttons may yield scripts - * that contain the strings ‘((’ and ‘))’ (i.e., the default footnote - * start and end shortcodes), which causes issues with fake footnotes. - * - * Setting `the_content` priority to 10 instead of `PHP_INT_MAX` makes the - * footnotes reference container display beneath the post and above other - * features added by other plugins, e.g. related post lists and social buttons. - * - * For the {@link https://wordpress.org/plugins/yet-another-related-posts-plugin/ - * YARPP} plugin to display related posts below the Footnotes reference container, - * priority needs to be at least 1,200. - * - * `PHP_INT_MAX` cannot be reset by leaving the number box empty, because - * WebKit browsers don't allow it, so we must resort to -1. - * - * @var int - * - * @since 2.0.5 - * @todo Move to `SettingsSection`/`SettingsGroup`. - */ - const EXPERT_LOOKUP_THE_CONTENT_PRIORITY_LEVEL = 'footnote_inputfield_expert_lookup_the_content_priority_level'; - - /** - * Settings container key for `the_title` hook priority level. - * - * @var int - * - * @since 2.1.2 - * @todo Move to `SettingsSection`/`SettingsGroup`. - */ - const EXPERT_LOOKUP_THE_TITLE_PRIORITY_LEVEL = 'footnote_inputfield_expert_lookup_the_title_priority_level'; - - /** - * Settings container key for `widget_title` hook priority level. - * - * @var int - * - * @since 2.1.2 - * @todo Move to `SettingsSection`/`SettingsGroup`. - */ - const EXPERT_LOOKUP_WIDGET_TITLE_PRIORITY_LEVEL = 'footnote_inputfield_expert_lookup_widget_title_priority_level'; - - /** - * Settings container key for `widget_text` hook priority level. - * - * @var int - * - * @since 2.1.2 - * @todo Move to `SettingsSection`/`SettingsGroup`. - */ - const EXPERT_LOOKUP_WIDGET_TEXT_PRIORITY_LEVEL = 'footnote_inputfield_expert_lookup_widget_text_priority_level'; - - /** - * Settings container key for `the_excerpt` hook priority level. - * - * @var int - * - * @since 2.1.2 - * @todo Move to `SettingsSection`/`SettingsGroup`. - */ - const EXPERT_LOOKUP_THE_EXCERPT_PRIORITY_LEVEL = 'footnote_inputfield_expert_lookup_the_excerpt_priority_level'; - - /** - * Settings container key for reference container position shortcode. - * - * @var string - * - * @since 2.2.0 - * @todo Move to `SettingsSection`/`SettingsGroup`. - */ - const REFERENCE_CONTAINER_POSITION_SHORTCODE = 'footnote_inputfield_reference_container_position_shortcode'; - - /** - * Settings container key for the Custom CSS migrated to a dedicated tab. - * - * @var string - * - * @since 2.2.2 - * @todo Move to `SettingsSection`/`SettingsGroup`. - */ - const CUSTOM_CSS_NEW = 'footnote_inputfield_custom_css_new'; - - /** - * Settings container key to enable display of legacy Custom CSS metaboxes. - * - * This must be `false` if its setting is contained in the container to be hidden - * because when saving, all missing constants are emptied, and {@see - * Footnotes_Convert::to_bool()} converts empty to `false`. - * - * @var string - * - * @since 2.2.2 - * @since 2.3.0 Swap migration Boolean, meaning ‘show legacy’ instead of - * ‘migration complete’, due to storage data structure constraints. - * @todo Move to `SettingsSection`/`SettingsGroup`. - */ - const CUSTOM_CSS_LEGACY_ENABLE = 'footnote_inputfield_custom_css_legacy_enable'; /** * Contains all Settings option group slugs. @@ -272,73 +52,6 @@ class Settings { 'footnotes_storage_expert', 'footnotes_storage_custom_css', ); - - /** - * Contains all default values for each Settings Container. - * - * @var (string|int)[] - * - * @since 1.5.0 - * @since 2.8.0 Rename from `default` to `default_settings`. - * @deprecated - * - * @todo Delete once moved to `SettingsSection`/`SettingsGroup`s. - */ - private array $default_settings = array( - - // Referrers and tooltips. - 'footnotes_storage_custom' => array( - - // Your existing Custom CSS code. - self::CUSTOM_CSS => '', - - ), - - // Scope and priority. - 'footnotes_storage_expert' => array( - - // WordPress hooks with priority level. - self::EXPERT_LOOKUP_THE_TITLE => "", - self::EXPERT_LOOKUP_THE_TITLE_PRIORITY_LEVEL => PHP_INT_MAX, - - self::EXPERT_LOOKUP_THE_CONTENT => 'checked', - self::EXPERT_LOOKUP_THE_CONTENT_PRIORITY_LEVEL => 98, - - self::EXPERT_LOOKUP_THE_EXCERPT => '', - self::EXPERT_LOOKUP_THE_EXCERPT_PRIORITY_LEVEL => PHP_INT_MAX, - - self::EXPERT_LOOKUP_WIDGET_TITLE => '', - self::EXPERT_LOOKUP_WIDGET_TITLE_PRIORITY_LEVEL => PHP_INT_MAX, - - self::EXPERT_LOOKUP_WIDGET_TEXT => '', - self::EXPERT_LOOKUP_WIDGET_TEXT_PRIORITY_LEVEL => 98, - - ), - - // Custom CSS. - 'footnotes_storage_custom_css' => array( - - // Your existing Custom CSS code. - self::CUSTOM_CSS_LEGACY_ENABLE => 'yes', - - // Custom CSS. - self::CUSTOM_CSS_NEW => '', - - ), - - ); - - /** - * Contains all Settings from each Settings Container. - * - * @var (string|int)[] - * - * @since 1.5.0 - * @deprecated - * - * @todo Delete once all `SettingsSection`/`SettingsGroup`s set up. - */ - public array $settings = array(); /** * Contains each section of settings. @@ -491,27 +204,6 @@ class Settings { return $this->settings[ $key ] ?? null; } - /** - * Register all Settings Containers for the plugin Settings Page in the Dashboard. - * - * The Settings Container label will be the same as the Settings Container name. - * - * @since 1.5.0 - * @todo Only register current tab? - */ - public function register_settings(): void { - // Register all settings. - foreach ($this->default_settings as $options_groups_name => $options_groups_values) { - foreach ($options_groups_values as $setting_name => $setting_value) { - if (!is_array($setting_value)) { - register_setting( $options_groups_name, $setting_name ); - } else { - register_setting( $options_groups_name, $setting_name, $setting_value['setting_args']); - } - } - } - } - /** * Returns a singleton of this class. * diff --git a/src/includes/settings/class-setting.php b/src/includes/settings/class-setting.php index 6ab4a9e..17a5f5e 100644 --- a/src/includes/settings/class-setting.php +++ b/src/includes/settings/class-setting.php @@ -18,7 +18,55 @@ use footnotes\includes\Settings; * @package footnotes * @since 2.8.0 */ -class Setting { +class Setting { + /** + * Options for the custom width units (per cent is a ratio, not a unit). + * + * @var array + * + * @since 2.8.0 + */ + const WIDTH_UNIT_OPTIONS = array( + '%' => 'per cent', + 'px' => 'pixels', + 'rem' => 'root em', + 'em' => 'em', + 'vw' => 'viewport width', + ); + + /** + * Options for the custom font size units (per cent is a ratio, not a unit). + * + * @var array + * + * @since 2.8.0 + */ + const FONT_SIZE_UNIT_OPTIONS = array( + 'em' => 'em', + 'rem' => 'rem', + 'px' => 'pixels', + 'pt' => 'points', + 'pc' => 'picas', + 'mm' => 'millimeters', + '%' => 'per cent', + ); + + /** + * Options for the HTML text elements. + * + * @var array + * + * @since 2.8.0 + */ + const TEXT_ELEMENT_OPTIONS = array( + 'p' => 'paragraph', + 'h2' => 'heading 2', + 'h3' => 'heading 3', + 'h4' => 'heading 4', + 'h5' => 'heading 5', + 'h6' => 'heading 6', + ); + /** * Setting value. * diff --git a/src/includes/settings/class-settings-group.php b/src/includes/settings/class-settings-group.php index 9a2865b..dc7b7f8 100644 --- a/src/includes/settings/class-settings-group.php +++ b/src/includes/settings/class-settings-group.php @@ -109,9 +109,12 @@ abstract class SettingsGroup { protected function load_values(array|false $options): void { if ( ! $options ) return; + // TODO remove unfound settings from option foreach ( $options as $setting_key => $setting_value ) { - $this->settings[$setting_key]->set_value( $setting_value ); - } + $setting = $this->settings[$setting_key]; + if ($setting) $setting->set_value( $setting_value ); + else trigger_error("Setting with key {$setting_key} not found, skipping...", E_USER_WARNING); + } } public function add_settings_fields(Layout\SettingsPage $component): void { diff --git a/src/includes/settings/custom-css/class-custom-css-settings-group.php b/src/includes/settings/custom-css/class-custom-css-settings-group.php new file mode 100644 index 0000000..06e9b4b --- /dev/null +++ b/src/includes/settings/custom-css/class-custom-css-settings-group.php @@ -0,0 +1,58 @@ + 'footnote_inputfield_custom_css_new', + 'name' => 'Your Existing Custom CSS Code', + 'type' => 'string', + 'input_type' => 'textarea', + ); + + protected function add_settings( array|false $options ): void { + $this->settings = array( + self::CUSTOM_CSS['key'] => $this->add_setting( self::CUSTOM_CSS ), + ); + + $this->load_values( $options ); + } +} diff --git a/src/includes/settings/custom-css/class-custom-css-settings-section.php b/src/includes/settings/custom-css/class-custom-css-settings-section.php index b654e66..219abb6 100644 --- a/src/includes/settings/custom-css/class-custom-css-settings-section.php +++ b/src/includes/settings/custom-css/class-custom-css-settings-section.php @@ -15,7 +15,7 @@ require_once plugin_dir_path( __DIR__ ) . 'class-settings-section.php'; use footnotes\includes\settings\SettingsSection; // Import settings groups. -//use footnotes\includes\settings\custom-css\...; +use footnotes\includes\settings\customcss\CustomCSSSettingsGroup; /** * Class defining plugin referrer and tooltips settings. @@ -52,13 +52,12 @@ class CustomCSSSettingsSection extends SettingsSection { protected function load_dependencies(): void { parent::load_dependencies(); - //require_once plugin_dir_path( __DIR__ ) . 'general/class-reference-container-settings-group.php'; + require_once plugin_dir_path( __DIR__ ) . 'custom-css/class-custom-css-settings-group.php'; } protected function add_settings_groups(): void { $this->settings_groups = array ( - // Add settings groups. - //...::GROUP_ID => new ...($this->options_group_slug, $this->section_slug), + CustomCSSSettingsGroup::GROUP_ID => new CustomCSSSettingsGroup($this->options_group_slug, $this->section_slug), ); } } diff --git a/src/includes/settings/general/class-reference-container-settings-group.php b/src/includes/settings/general/class-reference-container-settings-group.php index 7c0a867..0c8b827 100644 --- a/src/includes/settings/general/class-reference-container-settings-group.php +++ b/src/includes/settings/general/class-reference-container-settings-group.php @@ -64,14 +64,7 @@ class ReferenceContainerSettingsGroup extends SettingsGroup { 'default_value' => 'p', 'type' => 'string', 'input_type' => 'select', - 'input_options' => array( - 'p' => 'paragraph', - 'h2' => 'heading 2', - 'h3' => 'heading 3', - 'h4' => 'heading 4', - 'h5' => 'heading 5', - 'h6' => 'heading 6', - ), + 'input_options' => Setting::TEXT_ELEMENT_OPTIONS ); /** @@ -577,7 +570,7 @@ class ReferenceContainerSettingsGroup extends SettingsGroup { 'default_value' => 'px', 'type' => 'string', 'input_type' => 'select', - 'input_options' => Settings::WIDTH_UNIT_OPTIONS, + 'input_options' => Setting::WIDTH_UNIT_OPTIONS, 'enabled_by' => self::BACKLINKS_COLUMN_WIDTH_ENABLED, ); @@ -644,7 +637,7 @@ class ReferenceContainerSettingsGroup extends SettingsGroup { 'default_value' => 'px', 'type' => 'string', 'input_type' => 'select', - 'input_options' => Settings::WIDTH_UNIT_OPTIONS, + 'input_options' => Setting::WIDTH_UNIT_OPTIONS, 'enabled_by' => self::BACKLINKS_COLUMN_MAX_WIDTH_ENABLED, ); @@ -688,28 +681,6 @@ class ReferenceContainerSettingsGroup extends SettingsGroup { 'input_type' => 'checkbox', ); - /** - * Settings container key for the Expert mode. - * - * Since the removal of the `the_post` hook, the tab is no danger zone any longer. - * All users, not experts only, need to be able to control relative positioning. - * - * @var string - * - * @since 1.5.5 - * @since 2.1.6 Setting deprecated. - * @deprecated - * @todo Un-deprecate or delete. - */ - const FOOTNOTES_EXPERT_MODE = array( - 'key' => 'footnote_inputfield_enable_expert_mode', - 'name' => 'Expert Mode', - 'description' => 'DEPRECATED', - 'default_value' => true, - 'type' => 'boolean', - 'input_type' => 'checkbox', - ); - protected function add_settings( array|false $options ): void { $this->settings = array( self::REFERENCE_CONTAINER_NAME['key'] => $this->add_setting( self::REFERENCE_CONTAINER_NAME ), @@ -744,7 +715,6 @@ class ReferenceContainerSettingsGroup extends SettingsGroup { self::BACKLINKS_COLUMN_MAX_WIDTH_UNIT['key'] => $this->add_setting( self::BACKLINKS_COLUMN_MAX_WIDTH_UNIT ), self::BACKLINKS_LINE_BREAKS_ENABLED['key'] => $this->add_setting( self::BACKLINKS_LINE_BREAKS_ENABLED ), self::LINK_ELEMENT_ENABLED['key'] => $this->add_setting( self::LINK_ELEMENT_ENABLED ), - self::FOOTNOTES_EXPERT_MODE['key'] => $this->add_setting( self::FOOTNOTES_EXPERT_MODE ), ); $this->load_values( $options ); diff --git a/src/includes/settings/referrers-and-tooltips/class-tooltip-appearance-settings-group.php b/src/includes/settings/referrers-and-tooltips/class-tooltip-appearance-settings-group.php index b981160..1063ef9 100644 --- a/src/includes/settings/referrers-and-tooltips/class-tooltip-appearance-settings-group.php +++ b/src/includes/settings/referrers-and-tooltips/class-tooltip-appearance-settings-group.php @@ -90,15 +90,7 @@ class TooltipAppearanceSettingsGroup extends SettingsGroup { 'default_value' => 'px', 'type' => 'string', 'input_type' => 'select', - 'input_options' => array( - 'em' => 'em', - 'rem' => 'rem', - 'px' => 'pixels', - 'pt' => 'points', - 'pc' => 'picas', - 'mm' => 'millimeters', - '%' => 'per cent', - ), + 'input_options' => Setting::FONT_SIZE_UNIT_OPTIONS ); /** diff --git a/src/includes/settings/referrers-and-tooltips/class-tooltip-dimensions-settings-group.php b/src/includes/settings/referrers-and-tooltips/class-tooltip-dimensions-settings-group.php index 34d5528..f3c9101 100644 --- a/src/includes/settings/referrers-and-tooltips/class-tooltip-dimensions-settings-group.php +++ b/src/includes/settings/referrers-and-tooltips/class-tooltip-dimensions-settings-group.php @@ -35,6 +35,8 @@ class TooltipDimensionsSettingsGroup extends SettingsGroup { /** * Settings container key for the mouse-over box to define the max. width. * + * The width should be limited to start with, for the box to have shape. + * * @var array * * @since 1.5.6 diff --git a/src/includes/settings/scope-and-priority/class-scope-and-priority-settings-section.php b/src/includes/settings/scope-and-priority/class-scope-and-priority-settings-section.php index 9de0e5b..896f384 100644 --- a/src/includes/settings/scope-and-priority/class-scope-and-priority-settings-section.php +++ b/src/includes/settings/scope-and-priority/class-scope-and-priority-settings-section.php @@ -13,11 +13,11 @@ namespace footnotes\includes\settings\scopeandpriority; require_once plugin_dir_path( __DIR__ ) . 'class-settings-section.php'; use footnotes\includes\settings\SettingsSection; -// Import settings groups. -//use footnotes\includes\settings\scope-and-priority\...; + +use footnotes\includes\settings\scopeandpriority\WordPressHooksSettingsGroup; /** - * Class defining plugin referrer and tooltips settings. + * Class defining plugin hook priority settings. * * @package footnotes * @since 2.8.0 @@ -51,13 +51,12 @@ class ScopeAndPrioritySettingsSection extends SettingsSection { protected function load_dependencies(): void { parent::load_dependencies(); - //require_once plugin_dir_path( __DIR__ ) . 'general/class-reference-container-settings-group.php'; + require_once plugin_dir_path( __DIR__ ) . 'scope-and-priority/class-wordpress-hooks-settings-group.php'; } protected function add_settings_groups(): void { $this->settings_groups = array ( - // Add settings groups. - //...::GROUP_ID => new ...($this->options_group_slug, $this->section_slug), + WordPressHooksSettingsGroup::GROUP_ID => new WordPressHooksSettingsGroup($this->options_group_slug, $this->section_slug), ); } } diff --git a/src/includes/settings/scope-and-priority/class-wordpress-hooks-settings-group.php b/src/includes/settings/scope-and-priority/class-wordpress-hooks-settings-group.php new file mode 100644 index 0000000..51360a7 --- /dev/null +++ b/src/includes/settings/scope-and-priority/class-wordpress-hooks-settings-group.php @@ -0,0 +1,279 @@ + 'footnote_inputfield_expert_lookup_the_title', + 'name' => 'the_title()', + 'description' => 'https://developer.wordpress.org/reference/hooks/the_title/', + 'default_value' => false, + 'type' => 'boolean', + 'input_type' => 'checkbox', + ); + + /** + * Settings container key for `the_title` hook priority level. + * + * @var array + * + * @since 2.1.2 + * @since 2.8.0 Move from `Settings` to `ReferenceContainerSettingsGroup`. + * Convert from `int` to `array`. + */ + const EXPERT_LOOKUP_THE_TITLE_PRIORITY_LEVEL = array( + 'key' => 'footnote_inputfield_expert_lookup_the_title_priority_level', + 'name' => 'the_title() Priority Level', + 'description' => 'The priority level determines whether Footnotes is executed timely before other plugins, and how the reference container is positioned relative to other features. 9223372036854775807 is lowest priority, 0 is highest. To set priority level to lowest, set it to -1, interpreted as 9223372036854775807, the constant PHP_INT_MAX.', + 'default_value' => PHP_INT_MAX, + 'type' => 'number', + 'input_type' => 'number', + 'input_max' => PHP_INT_MAX, + 'input_min' => -1, + ); + + /** + * Settings container key to enable the `the_content` hook. + * + * @var array + * + * @since 1.5.5 + * @since 2.8.0 Move from `Settings` to `ReferenceContainerSettingsGroup`. + * Convert from `string` to `array`. + * Convert setting data type from `string` to `boolean`. + */ + const EXPERT_LOOKUP_THE_CONTENT = array( + 'key' => 'footnote_inputfield_expert_lookup_the_content', + 'name' => 'the_content()', + 'description' => 'https://developer.wordpress.org/reference/hooks/the_content/', + 'default_value' => true, + 'type' => 'boolean', + 'input_type' => 'checkbox', + ); + + /** + * Settings container key for `the_content` hook priority level. + * + * Priority level of `the_content` and of `widget_text` as the only relevant + * hooks must be less than 99 because social buttons may yield scripts + * that contain the strings ‘((’ and ‘))’ (i.e., the default footnote + * start and end shortcodes), which causes issues with fake footnotes. + * + * Setting `the_content` priority to 10 instead of `PHP_INT_MAX` makes the + * footnotes reference container display beneath the post and above other + * features added by other plugins, e.g. related post lists and social buttons. + * + * For the {@link https://wordpress.org/plugins/yet-another-related-posts-plugin/ + * YARPP} plugin to display related posts below the Footnotes reference container, + * priority needs to be at least 1,200. + * + * `PHP_INT_MAX` cannot be reset by leaving the number box empty, because + * WebKit browsers don't allow it, so we must resort to -1. + * + * @var array + * + * @since 2.0.5 + * @since 2.8.0 Move from `Settings` to `ReferenceContainerSettingsGroup`. + * Convert from `int` to `array`. + */ + const EXPERT_LOOKUP_THE_CONTENT_PRIORITY_LEVEL = array( + 'key' => 'footnote_inputfield_expert_lookup_the_content_priority_level', + 'name' => 'the_content() Priority Level', + 'description' => 'The priority level determines whether Footnotes is executed timely before other plugins, and how the reference container is positioned relative to other features. 9223372036854775807 is lowest priority, 0 is highest. To set priority level to lowest, set it to -1, interpreted as 9223372036854775807, the constant PHP_INT_MAX. For the_content, this figure must be lower than 99 so that certain strings added by a plugin running at 99 may not be mistaken as a footnote. This makes also sure that the reference container displays above a feature inserted by a plugin running at 1200.', + 'default_value' => 98, + 'type' => 'number', + 'input_type' => 'number', + 'input_max' => PHP_INT_MAX, + 'input_min' => -1, + ); + + + /** + * Settings container key to enable the `the_excerpt` hook. + * + * @var array + * + * @since 1.5.5 + * @since 2.8.0 Move from `Settings` to `ReferenceContainerSettingsGroup`. + * Convert from `string` to `array`. + * Convert setting data type from `string` to `boolean`. + */ + const EXPERT_LOOKUP_THE_EXCERPT = array( + 'key' => 'footnote_inputfield_expert_lookup_the_excerpt', + 'name' => 'the_excerpt()', + 'description' => 'https://developer.wordpress.org/reference/hooks/the_excerpt/', + 'default_value' => false, + 'type' => 'boolean', + 'input_type' => 'checkbox', + ); + + /** + * Settings container key for `the_excerpt` hook priority level. + * + * @var array + * + * @since 2.1.2 + * @since 2.8.0 Move from `Settings` to `ReferenceContainerSettingsGroup`. + * Convert from `int` to `array`. + */ + const EXPERT_LOOKUP_THE_EXCERPT_PRIORITY_LEVEL = array( + 'key' => 'footnote_inputfield_expert_lookup_the_excerpt_priority_level', + 'name' => 'the_excerpt() Priority Level', + 'description' => 'The priority level determines whether Footnotes is executed timely before other plugins, and how the reference container is positioned relative to other features. 9223372036854775807 is lowest priority, 0 is highest. To set priority level to lowest, set it to -1, interpreted as 9223372036854775807, the constant PHP_INT_MAX.', + 'default_value' => PHP_INT_MAX, + 'type' => 'number', + 'input_type' => 'number', + 'input_max' => PHP_INT_MAX, + 'input_min' => -1, + ); + + /** + * Settings container key to enable the `widget_title` hook. + * + * @var array + * + * @since 1.5.5 + * @since 2.8.0 Move from `Settings` to `ReferenceContainerSettingsGroup`. + * Convert from `string` to `array`. + * Convert setting data type from `string` to `boolean`. + */ + const EXPERT_LOOKUP_WIDGET_TITLE = array( + 'key' => 'footnote_inputfield_expert_lookup_widget_title', + 'name' => 'widget_title()', + 'description' => 'https://codex.wordpress.org/Plugin_API/Filter_Reference/widget_title', + 'default_value' => false, + 'type' => 'boolean', + 'input_type' => 'checkbox', + ); + + /** + * Settings container key for `widget_title` hook priority level. + * + * @var array + * + * @since 2.1.2 + * @since 2.8.0 Move from `Settings` to `ReferenceContainerSettingsGroup`. + * Convert from `int` to `array`. + */ + const EXPERT_LOOKUP_WIDGET_TITLE_PRIORITY_LEVEL = array( + 'key' => 'footnote_inputfield_expert_lookup_widget_title_priority_level', + 'name' => 'widget_title() Priority Level', + 'description' => 'The priority level determines whether Footnotes is executed timely before other plugins, and how the reference container is positioned relative to other features. 9223372036854775807 is lowest priority, 0 is highest. To set priority level to lowest, set it to -1, interpreted as 9223372036854775807, the constant PHP_INT_MAX.', + 'default_value' => PHP_INT_MAX, + 'type' => 'number', + 'input_type' => 'number', + 'input_max' => PHP_INT_MAX, + 'input_min' => -1, + ); + + /** + * Settings container key to enable the `widget_text` hook. + * + * The `widget_text` hook must be disabled by default, because it causes + * multiple reference containers to appear in Elementor accordions, but + * it must be enabled if multiple reference containers are desired, as + * in Elementor toggles. + * + * @var array + * + * @since 1.5.5 + * @since 2.8.0 Move from `Settings` to `ReferenceContainerSettingsGroup`. + * Convert from `string` to `array`. + * Convert setting data type from `string` to `boolean`. + */ + const EXPERT_LOOKUP_WIDGET_TEXT = array( + 'key' => 'footnote_inputfield_expert_lookup_widget_text', + 'name' => 'widget_text()', + 'description' => 'https://codex.wordpress.org/Plugin_API/Filter_Reference/widget_text. The widget_text() hook must be enabled either when footnotes are present in theme text widgets, or when Elementor accordions or toggles shall have a reference container per section. If they should not, this hook must be disabled.', + 'default_value' => false, + 'type' => 'boolean', + 'input_type' => 'checkbox', + ); + + /** + * Settings container key for `widget_text` hook priority level. + * + * @var array + * + * @since 2.1.2 + * @since 2.8.0 Move from `Settings` to `ReferenceContainerSettingsGroup`. + * Convert from `int` to `array`. + */ + const EXPERT_LOOKUP_WIDGET_TEXT_PRIORITY_LEVEL = array( + 'key' => 'footnote_inputfield_expert_lookup_widget_text_priority_level', + 'name' => 'widget_text() Priority Level', + 'description' => 'The priority level determines whether Footnotes is executed timely before other plugins, and how the reference container is positioned relative to other features. 9223372036854775807 is lowest priority, 0 is highest. To set priority level to lowest, set it to -1, interpreted as 9223372036854775807, the constant PHP_INT_MAX.', + 'default_value' => 98, + 'type' => 'number', + 'input_type' => 'number', + 'input_max' => PHP_INT_MAX, + 'input_min' => -1, + ); + + protected function add_settings( array|false $options ): void { + $this->settings = array( + self::EXPERT_LOOKUP_THE_TITLE['key'] => $this->add_setting( self::EXPERT_LOOKUP_THE_TITLE ), + self::EXPERT_LOOKUP_THE_TITLE_PRIORITY_LEVEL['key'] => $this->add_setting( self::EXPERT_LOOKUP_THE_TITLE_PRIORITY_LEVEL ), + self::EXPERT_LOOKUP_THE_CONTENT['key'] => $this->add_setting( self::EXPERT_LOOKUP_THE_CONTENT ), + self::EXPERT_LOOKUP_THE_CONTENT_PRIORITY_LEVEL['key'] => $this->add_setting( self::EXPERT_LOOKUP_THE_CONTENT_PRIORITY_LEVEL ), + self::EXPERT_LOOKUP_THE_EXCERPT['key'] => $this->add_setting( self::EXPERT_LOOKUP_THE_EXCERPT ), + self::EXPERT_LOOKUP_THE_EXCERPT_PRIORITY_LEVEL['key'] => $this->add_setting( self::EXPERT_LOOKUP_THE_EXCERPT_PRIORITY_LEVEL ), + self::EXPERT_LOOKUP_WIDGET_TITLE['key'] => $this->add_setting( self::EXPERT_LOOKUP_WIDGET_TITLE ), + self::EXPERT_LOOKUP_WIDGET_TITLE_PRIORITY_LEVEL['key'] => $this->add_setting( self::EXPERT_LOOKUP_WIDGET_TITLE_PRIORITY_LEVEL ), + self::EXPERT_LOOKUP_WIDGET_TEXT['key'] => $this->add_setting( self::EXPERT_LOOKUP_WIDGET_TEXT ), + self::EXPERT_LOOKUP_WIDGET_TEXT_PRIORITY_LEVEL['key'] => $this->add_setting( self::EXPERT_LOOKUP_WIDGET_TEXT_PRIORITY_LEVEL ), + ); + + $this->load_values( $options ); + } +} diff --git a/src/public/class-parser.php b/src/public/class-parser.php index b6c64f8..e30d2d3 100644 --- a/src/public/class-parser.php +++ b/src/public/class-parser.php @@ -13,7 +13,7 @@ declare(strict_types=1); namespace footnotes\general; -use footnotes\includes\{Settings, Convert, Template}; +use footnotes\includes\{Settings, Config, Convert, Template}; /** * @todo Replace with constant imports. @@ -39,6 +39,8 @@ use footnotes\includes\settings\referrersandtooltips\{ TooltipTimingSettingsGroup, TooltipTruncationSettingsGroup }; +use footnotes\includes\settings\scopeandpriority\WordPressHooksSettingsGroup; +use footnotes\includes\settings\customcss\CustomCSSSettingsGroup; /** * Searches and replaces the footnotes and generates the reference container. @@ -297,11 +299,11 @@ class Parser { */ public function register_hooks(): void { // Get values from settings. - $the_title_priority = (int) Settings::instance()->get( Settings::EXPERT_LOOKUP_THE_TITLE_PRIORITY_LEVEL ); - $the_content_priority = (int) Settings::instance()->get( Settings::EXPERT_LOOKUP_THE_CONTENT_PRIORITY_LEVEL ); - $the_excerpt_priority = (int) Settings::instance()->get( Settings::EXPERT_LOOKUP_THE_EXCERPT_PRIORITY_LEVEL ); - $widget_title_priority = (int) Settings::instance()->get( Settings::EXPERT_LOOKUP_WIDGET_TITLE_PRIORITY_LEVEL ); - $widget_text_priority = (int) Settings::instance()->get( Settings::EXPERT_LOOKUP_WIDGET_TEXT_PRIORITY_LEVEL ); + $the_title_priority = Settings::instance()->get_setting( WordPressHooksSettingsGroup::EXPERT_LOOKUP_THE_TITLE_PRIORITY_LEVEL['key'] )->get_value(); + $the_content_priority = Settings::instance()->get_setting( WordPressHooksSettingsGroup::EXPERT_LOOKUP_THE_CONTENT_PRIORITY_LEVEL['key'] )->get_value(); + $the_excerpt_priority = Settings::instance()->get_setting( WordPressHooksSettingsGroup::EXPERT_LOOKUP_THE_EXCERPT_PRIORITY_LEVEL['key'] )->get_value(); + $widget_title_priority = Settings::instance()->get_setting( WordPressHooksSettingsGroup::EXPERT_LOOKUP_WIDGET_TITLE_PRIORITY_LEVEL['key'] )->get_value(); + $widget_text_priority = Settings::instance()->get_setting( WordPressHooksSettingsGroup::EXPERT_LOOKUP_WIDGET_TEXT_PRIORITY_LEVEL['key'] )->get_value(); // PHP_INT_MAX can be set by -1. $the_title_priority = ( -1 === $the_title_priority ) ? PHP_INT_MAX : $the_title_priority; @@ -324,7 +326,7 @@ class Parser { PHP_INT_MAX ); - if ( Convert::to_bool( Settings::instance()->get( Settings::EXPERT_LOOKUP_THE_TITLE ) ) ) { + if ( Settings::instance()->get_setting( WordPressHooksSettingsGroup::EXPERT_LOOKUP_THE_TITLE['key'] )->get_value() ) { add_filter( 'the_title', fn( string $content): string => $this->footnotes_in_title( $content ), @@ -333,7 +335,7 @@ class Parser { } // Configurable priority level for reference container relative positioning; default 98. - if ( Convert::to_bool( Settings::instance()->get( Settings::EXPERT_LOOKUP_THE_CONTENT ) ) ) { + if ( Settings::instance()->get_setting( WordPressHooksSettingsGroup::EXPERT_LOOKUP_THE_CONTENT['key'] )->get_value() ) { add_filter( 'the_content', fn( string $content): string => $this->footnotes_in_content( $content ), @@ -375,7 +377,7 @@ class Parser { ); } - if ( Convert::to_bool( Settings::instance()->get( Settings::EXPERT_LOOKUP_THE_EXCERPT ) ) ) { + if ( Settings::instance()->get_setting( WordPressHooksSettingsGroup::EXPERT_LOOKUP_THE_EXCERPT['key'] )->get_value() ) { /** * Adds a filter to the excerpt hook. * @@ -391,7 +393,7 @@ class Parser { ); } - if ( Convert::to_bool( Settings::instance()->get( Settings::EXPERT_LOOKUP_WIDGET_TITLE ) ) ) { + if ( Settings::instance()->get_setting( WordPressHooksSettingsGroup::EXPERT_LOOKUP_WIDGET_TITLE['key'] )->get_value() ) { /** * TODO */ @@ -402,7 +404,7 @@ class Parser { ); } - if ( Convert::to_bool( Settings::instance()->get( Settings::EXPERT_LOOKUP_WIDGET_TEXT ) ) ) { + if ( Settings::instance()->get_setting( WordPressHooksSettingsGroup::EXPERT_LOOKUP_WIDGET_TEXT['key'] )->get_value() ) { /** * TODO */ @@ -699,11 +701,7 @@ class Parser { * Set custom CSS to override settings, not conversely. * Legacy Custom CSS is used until it’s set to disappear after dashboard tab migration. */ - if ( Convert::to_bool( Settings::instance()->get( Settings::CUSTOM_CSS_LEGACY_ENABLE ) ) ) { - echo Settings::instance()->get( Settings::CUSTOM_CSS ); - echo "\r\n"; - } - echo Settings::instance()->get( Settings::CUSTOM_CSS_NEW ); + echo Settings::instance()->get_setting( CustomCSSSettingsGroup::CUSTOM_CSS['key'] )->get_value(); // Insert end tag without switching out of PHP. echo "\r\n\r\n"; @@ -1116,11 +1114,11 @@ class Parser { public function unify_delimiters( string $content ): string { // Get footnotes start and end tag short codes. - $starting_tag = Settings::instance()->get_setting( ShortcodeSettingsGroup::FOOTNOTES_SHORT_CODE_START )->get_value(); - $ending_tag = Settings::instance()->get_setting( ShortcodeSettingsGroup::FOOTNOTES_SHORT_CODE_END )->get_value(); + $starting_tag = Settings::instance()->get_setting( ShortcodeSettingsGroup::FOOTNOTES_SHORT_CODE_START['key'] )->get_value(); + $ending_tag = Settings::instance()->get_setting( ShortcodeSettingsGroup::FOOTNOTES_SHORT_CODE_END['key'] )->get_value(); if ( 'userdefined' === $starting_tag || 'userdefined' === $ending_tag ) { - $starting_tag = Settings::instance()->get_setting( ShortcodeSettingsGroup::FOOTNOTES_SHORT_CODE_START_USER_DEFINED )->get_value(); - $ending_tag = Settings::instance()->get_setting( ShortcodeSettingsGroup::FOOTNOTES_SHORT_CODE_END_USER_DEFINED )->get_value(); + $starting_tag = Settings::instance()->get_setting( ShortcodeSettingsGroup::FOOTNOTES_SHORT_CODE_START_USER_DEFINED['key'] )->get_value(); + $ending_tag = Settings::instance()->get_setting( ShortcodeSettingsGroup::FOOTNOTES_SHORT_CODE_END_USER_DEFINED['key'] )->get_value(); } // If any footnotes short code is empty, return the content without changes. @@ -1184,8 +1182,6 @@ class Parser { // Get footnote delimiter shortcodes and unify them. $content = self::unify_delimiters( $content ); - print_r('FOO'); - print_r($content); /* * Checks for balanced footnote delimiters; delimiter syntax validation. @@ -1195,7 +1191,7 @@ class Parser { */ // If enabled. - if ( Settings::instance()->get_setting( ShortcodeSettingsGroup::FOOTNOTE_SHORTCODE_SYNTAX_VALIDATION_ENABLE['key'] ->get_value()) ) { + if ( Settings::instance()->get_setting( ShortcodeSettingsGroup::FOOTNOTE_SHORTCODE_SYNTAX_VALIDATION_ENABLE['key']) ->get_value() ) { // Apply different regex depending on whether start shortcode is double/triple opening parenthesis. if ( '((' === self::$start_tag || '(((' === self::$start_tag ) { @@ -1623,7 +1619,7 @@ class Parser { $offset_x = Settings::instance()->get_setting( TooltipPositionSettingsGroup::FOOTNOTES_MOUSE_OVER_BOX_OFFSET_X['key'] )->get_value(); $fade_in_delay = Settings::instance()->get_setting( TooltipTimingSettingsGroup::MOUSE_OVER_BOX_FADE_IN_DELAY['key'] )->get_value(); $fade_in_duration = Settings::instance()->get_setting( TooltipTimingSettingsGroup::MOUSE_OVER_BOX_FADE_IN_DURATION['key'] )->get_value(); - $fade_out_delay = Settings::instance()->get_settingget( TooltipTimingSettingsGroup::MOUSE_OVER_BOX_FADE_OUT_DELAY['key'] )->get_value(); + $fade_out_delay = Settings::instance()->get_setting( TooltipTimingSettingsGroup::MOUSE_OVER_BOX_FADE_OUT_DELAY['key'] )->get_value(); $fade_out_duration = Settings::instance()->get_setting( TooltipTimingSettingsGroup::MOUSE_OVER_BOX_FADE_OUT_DURATION['key'] )->get_value(); // Fill in 'public/partials/tooltip.html'. @@ -2206,7 +2202,7 @@ class Parser { array( 'post_id' => self::$post_id, 'container_id' => self::$reference_container_id, - 'element' => Settings::instance()->get_setting( ReferenceContainerSettingsGroup::REFERENCE_CONTAINER_LABEL_ELEMENT ), + 'element' => Settings::instance()->get_setting( ReferenceContainerSettingsGroup::REFERENCE_CONTAINER_LABEL_ELEMENT['key'] )->get_value(), 'name' => empty( $reference_container_label ) ? ' ' : $reference_container_label, 'button-style' => $collapse_default ? '' : 'display: none;', 'style' => $collapse_default ? 'display: none;' : '',