. * Yet in titles, footnotes are still buggy, because WordPress. * Uses the title string in menus and in the title element.. */ const C_STR_EXPERT_LOOKUP_THE_TITLE = 'footnote_inputfield_expert_lookup_the_title'; /** * Settings Container Key to enable the 'the_content' hook. * * @since 1.5.5 * @var str */ const C_STR_EXPERT_LOOKUP_THE_CONTENT = 'footnote_inputfield_expert_lookup_the_content'; /** * Settings Container Key to enable the 'the_excerpt' hook. * * @since 1.5.5 * @var str * * @since 2.1.3 excerpt hook: disable by default, thanks to @nikelaos * @link https://wordpress.org/support/topic/doesnt-work-any-more-11/#post-13687068 * And the_excerpt is disabled by default following @nikelaos in. * . * . */ const C_STR_EXPERT_LOOKUP_THE_EXCERPT = 'footnote_inputfield_expert_lookup_the_excerpt'; /** * Settings Container Key to enable the 'widget_title' hook. * * @since 1.5.5 * @var str */ const C_STR_EXPERT_LOOKUP_WIDGET_TITLE = 'footnote_inputfield_expert_lookup_widget_title'; /** * Settings Container Key to enable the 'widget_text' hook. * * @since 1.5.5 * @var str * 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.. */ const C_STR_EXPERT_LOOKUP_WIDGET_TEXT = 'footnote_inputfield_expert_lookup_widget_text'; /** * Settings Container Key for the Expert mode. * * @since 1.5.5 * @var str * * @since 2.1.6 This setting removed as irrelevant since priority level settings need permanent visibility. * @date 2020-12-09T2107+0100 * * 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. * @date 2020-11-06T1342+0100 */ const C_STR_FOOTNOTES_EXPERT_MODE = 'footnote_inputfield_enable_expert_mode'; /** * Settings Container Key for the mouse-over box to define the color. * * @since 1.5.6 * @var str */ const C_STR_FOOTNOTES_MOUSE_OVER_BOX_COLOR = 'footnote_inputfield_custom_mouse_over_box_color'; /** * Settings Container Key for the mouse-over box to define the background color. * * @since 1.5.6 * @var str * * #fff7a7 hard-coded 1.2.5..1.5.5 * #fff7a7 default 1.5.6..2.0.6 * #ffffff default 2.0.7..2.5.10 * The mouse over box shouldn’t feature a colored background. * By default, due to diverging user preferences. White is neutral. */ const C_STR_FOOTNOTES_MOUSE_OVER_BOX_BACKGROUND = 'footnote_inputfield_custom_mouse_over_box_background'; /** * Settings Container Key for the mouse-over box to define the border width. * * @since 1.5.6 * @var str */ const C_INT_FOOTNOTES_MOUSE_OVER_BOX_BORDER_WIDTH = 'footnote_inputfield_custom_mouse_over_box_border_width'; /** * Settings Container Key for the mouse-over box to define the border color. * * @since 1.5.6 * @var str */ const C_STR_FOOTNOTES_MOUSE_OVER_BOX_BORDER_COLOR = 'footnote_inputfield_custom_mouse_over_box_border_color'; /** * Settings Container Key for the mouse-over box to define the border radius. * * @since 1.5.6 * @var str * The mouse over box corners mustn’t be rounded as that is outdated. */ const C_INT_FOOTNOTES_MOUSE_OVER_BOX_BORDER_RADIUS = 'footnote_inputfield_custom_mouse_over_box_border_radius'; /** * Settings Container Key for the mouse-over box to define the max. width. * * @since 1.5.6 * @var str * The width should be limited to start with, for the box to have shape. */ const C_INT_FOOTNOTES_MOUSE_OVER_BOX_MAX_WIDTH = 'footnote_inputfield_custom_mouse_over_box_max_width'; /** * Settings Container Key for the mouse-over box to define the position. * * @since 1.5.7 * @var str * The default position should not be lateral because of the risk. * The box gets squeezed between note anchor at line end and window edge,. * And top because reading at the bottom of the window is more likely. */ const C_STR_FOOTNOTES_MOUSE_OVER_BOX_POSITION = 'footnote_inputfield_custom_mouse_over_box_position'; /** * Settings Container Key for the mouse-over box to define the offset (x). * * @since 1.5.7 * @var str */ const C_INT_FOOTNOTES_MOUSE_OVER_BOX_OFFSET_X = 'footnote_inputfield_custom_mouse_over_box_offset_x'; /** * Settings Container Key for the mouse-over box to define the offset (y). * * @since 1.5.7 * @var str * The vertical offset must be negative for the box not to cover. * The current line of text (web coordinates origin is top left). */ const C_INT_FOOTNOTES_MOUSE_OVER_BOX_OFFSET_Y = 'footnote_inputfield_custom_mouse_over_box_offset_y'; /** * Settings Container Key for the mouse-over box to define the box-shadow color. * * @since 1.5.8 * @var str */ const C_STR_FOOTNOTES_MOUSE_OVER_BOX_SHADOW_COLOR = 'footnote_inputfield_custom_mouse_over_box_shadow_color'; /** * Settings Container Key for the label of the Read-on button in truncated tooltips. * * - Adding: Tooltips: Read-on button: Label: configurable instead of localizable, thanks to @rovanov example provision. * * @since 2.1.0 * @date 2020-11-08T2106+0100 * * @reporter @rovanov * @link https://wordpress.org/support/topic/offset-x-axis-and-offset-y-axis-does-not-working/ * * @var str */ const C_STR_FOOTNOTES_TOOLTIP_READON_LABEL = 'footnote_inputfield_readon_label'; /** * Settings Container Key to enable the alternative tooltips. * * - Bugfix: Tooltips: optional alternative JS implementation with CSS transitions to fix configuration-related outage, thanks to @andreasra feedback. * * @since 2.1.1 * @date 2020-11-11T1817+0100 * * @reporter @andreasra * @link https://wordpress.org/support/topic/footnotes-appearing-in-header/page/2/#post-13632566 * * @var str * * These alternative tooltips work around a website related jQuery UI * outage. They are low-script but use the AMP incompatible onmouseover * and onmouseout arguments, along with CSS transitions for fade-in/out. * The very small script is inserted after Footnotes’ internal stylesheet. */ const C_STR_FOOTNOTES_MOUSE_OVER_BOX_ALTERNATIVE = 'footnote_inputfield_custom_mouse_over_box_alternative'; /** * Settings Container Key for the referrer element. * * - Bugfix: Referrers: new setting for vertical align: superscript (default) or baseline (optional), thanks to @cwbayer bug report. * * @since 2.1.1 * @date 2020-11-16T0859+0100 * * @reporter @cwbayer * @link https://wordpress.org/support/topic/footnote-number-in-text-superscript-disrupts-leading/ * * @var str */ const C_STR_FOOTNOTES_REFERRER_SUPERSCRIPT_TAGS = 'footnotes_inputfield_referrer_superscript_tags'; /** * Settings Container Key to enable the display of a backlink symbol. * * - Bugfix: Reference container: Backlink symbol: make optional, not suggest configuring it to invisible, thanks to @spaceling feedback. * * @since 2.1.1 * @date 2020-11-16T2021+0100 * * @reporter @spaceling * @link https://wordpress.org/support/topic/change-the-position-5/page/2/#post-13671138 * * @var str */ const C_STR_REFERENCE_CONTAINER_BACKLINK_SYMBOL_ENABLE = 'footnotes_inputfield_reference_container_backlink_symbol_enable'; /** * Settings Container Key to not display the reference container on the homepage. * * - Bugfix: Reference container: fix start pages by making its display optional, thanks to @dragon013 bug report. * * @since 2.1.1 * * @reporter @dragon013 * @link https://wordpress.org/support/topic/possible-to-hide-it-from-start-page/ * * @var str */ const C_STR_REFERENCE_CONTAINER_START_PAGE_ENABLE = 'footnotes_inputfield_reference_container_start_page_enable'; /** * Settings Container Key to enable the legacy layout of the reference container. * * - Bugfix: Reference container: option to restore pre-2.0.0 layout with the backlink symbol in an extra column. * * @since 2.1.1 * @var str */ const C_STR_REFERENCE_CONTAINER_3COLUMN_LAYOUT_ENABLE = 'footnotes_inputfield_reference_container_3column_layout_enable'; /** * Settings Container Key to get the backlink symbol switch side. * * - Bugfix: Reference container: option to append symbol (prepended by default), thanks to @spaceling code contribution. * * @since 2.1.1 * @date 2020-11-16T2024+0100 * * @contributor @spaceling * @link https://wordpress.org/support/topic/change-the-position-5/#post-13615994 * * @var str */ const C_STR_REFERENCE_CONTAINER_BACKLINK_SYMBOL_SWITCH = 'footnotes_inputfield_reference_container_backlink_symbol_switch'; /** * Settings Container Key for 'the_content' hook priority level. * * @since 2.1.1 * @date 2020-11-16T0859+0100 * * @var str * 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 short codes, causing issues with fake footnotes.. */ const C_INT_EXPERT_LOOKUP_THE_CONTENT_PRIORITY_LEVEL = 'footnote_inputfield_expert_lookup_the_content_priority_level'; /** * Settings Container Key for 'the_title' hook priority level. * * @since 2.1.2 * @date 2020-11-20T0620+0100 * * @var str * Initially hard-coded default. * Shows "9223372036854780000" instead of 9223372036854775807 in the numbox. * Empty should be interpreted as PHP_INT_MAX, but a numbox cannot be set to empty. * . * Interpret -1 as PHP_INT_MAX instead. */ const C_INT_EXPERT_LOOKUP_THE_TITLE_PRIORITY_LEVEL = 'footnote_inputfield_expert_lookup_the_title_priority_level'; /** * Settings Container Key for 'widget_title' hook priority level. * * @since 2.1.2 * @date 2020-11-20T0620+0100 * * @var str */ const C_INT_EXPERT_LOOKUP_WIDGET_TITLE_PRIORITY_LEVEL = 'footnote_inputfield_expert_lookup_widget_title_priority_level'; /** * Settings Container Key for 'widget_text' hook priority level. * * @since 2.1.2 * @date 2020-11-20T0620+0100 * * @var str */ const C_INT_EXPERT_LOOKUP_WIDGET_TEXT_PRIORITY_LEVEL = 'footnote_inputfield_expert_lookup_widget_text_priority_level'; /** * Settings Container Key for 'the_excerpt' hook priority level. * * @since 2.1.2 * @date 2020-11-20T0620+0100 * * @var str */ const C_INT_EXPERT_LOOKUP_THE_EXCERPT_PRIORITY_LEVEL = 'footnote_inputfield_expert_lookup_the_excerpt_priority_level'; /** * Settings Container Keys for the link element option. * * @since 2.1.4 * @var str * Whether to use link elements. * Link element option. */ const C_STR_LINK_ELEMENT_ENABLED = 'footnote_inputfield_link_element_enabled'; /** * Settings Container Keys for backlink typography and layout. * * @since 2.1.4 * @var str * Backlink typography. * Backlink separators and terminators are often not preferred.. * But a choice must be provided along with the ability to customize. */ const C_STR_BACKLINKS_SEPARATOR_ENABLED = 'footnotes_inputfield_backlinks_separator_enabled'; /** * Settings Container Keys for backlink typography and layout. * * @since 2.1.4 * @var str */ const C_STR_BACKLINKS_SEPARATOR_OPTION = 'footnotes_inputfield_backlinks_separator_option'; /** * Settings Container Keys for backlink typography and layout. * * @since 2.1.4 * @var str */ const C_STR_BACKLINKS_SEPARATOR_CUSTOM = 'footnotes_inputfield_backlinks_separator_custom'; /** * Settings Container Keys for backlink typography and layout. * * @since 2.1.4 * @var str */ const C_STR_BACKLINKS_TERMINATOR_ENABLED = 'footnotes_inputfield_backlinks_terminator_enabled'; /** * Settings Container Keys for backlink typography and layout. * * @since 2.1.4 * @var str */ const C_STR_BACKLINKS_TERMINATOR_OPTION = 'footnotes_inputfield_backlinks_terminator_option'; /** * Settings Container Keys for backlink typography and layout. * * @since 2.1.4 * @var str|bool|int|flo */ const C_STR_BACKLINKS_TERMINATOR_CUSTOM = 'footnotes_inputfield_backlinks_terminator_custom'; /** * Settings Container Keys for backlink typography and layout. * * @since 2.1.4 * @var str|bool|int|flo * Set backlinks column width. * Backlink layout. */ const C_STR_BACKLINKS_COLUMN_WIDTH_ENABLED = 'footnotes_inputfield_backlinks_column_width_enabled'; /** * Settings Container Keys for backlink typography and layout. * * @since 2.1.4 * @var str|bool|int|flo */ const C_INT_BACKLINKS_COLUMN_WIDTH_SCALAR = 'footnotes_inputfield_backlinks_column_width_scalar'; /** * Settings Container Keys for backlink typography and layout. * * @since 2.1.4 * @var str|bool|int|flo */ const C_STR_BACKLINKS_COLUMN_WIDTH_UNIT = 'footnotes_inputfield_backlinks_column_width_unit'; /** * Settings Container Keys for backlink typography and layout. * * @since 2.1.4 * @var str|bool|int|flo * Set backlinks column max. width. */ const C_STR_BACKLINKS_COLUMN_MAX_WIDTH_ENABLED = 'footnotes_inputfield_backlinks_column_max_width_enabled'; /** * Settings Container Keys for backlink typography and layout. * * @since 2.1.4 * @var str|bool|int|flo */ const C_INT_BACKLINKS_COLUMN_MAX_WIDTH_SCALAR = 'footnotes_inputfield_backlinks_column_max_width_scalar'; /** * Settings Container Keys for backlink typography and layout. * * @since 2.1.4 * @var str|bool|int|flo */ const C_STR_BACKLINKS_COLUMN_MAX_WIDTH_UNIT = 'footnotes_inputfield_backlinks_column_max_width_unit'; /** * Settings Container Keys for backlink typography and layout. * * @since 2.1.4 * @var str|bool|int|flo * Whether a
tag is inserted. */ const C_STR_BACKLINKS_LINE_BREAKS_ENABLED = 'footnotes_inputfield_backlinks_line_breaks_enabled'; /** * Settings Container Keys for tooltip font size. * * @since 2.1.4 * @var str|bool|int|flo * Tooltip font size. * Called mouse over box not tooltip for consistency. * Tooltip font size reset to legacy by default since 2.1.4;. * Was set to inherit since 2.1.1 as it overrode custom CSS,. * Is moved to settings since 2.1.4 2020-12-04T1023+0100. */ const C_STR_MOUSE_OVER_BOX_FONT_SIZE_ENABLED = 'footnotes_inputfield_mouse_over_box_font_size_enabled'; /** * Settings Container Keys for tooltip font size. * * @since 2.1.4 * @var str|bool|int|flo */ const C_FLO_MOUSE_OVER_BOX_FONT_SIZE_SCALAR = 'footnotes_inputfield_mouse_over_box_font_size_scalar'; /** * Settings Container Keys for tooltip font size. * * @since 2.1.4 * @var str|bool|int|flo */ const C_STR_MOUSE_OVER_BOX_FONT_SIZE_UNIT = 'footnotes_inputfield_mouse_over_box_font_size_unit'; /** * Settings Container Keys for page layout support. * * @since 2.1.4 * @var str|bool|int|flo * Whether to enqueue additional stylesheet. * Page layout support. */ const C_STR_FOOTNOTES_PAGE_LAYOUT_SUPPORT = 'footnotes_inputfield_page_layout_support'; /** * Settings Container Keys for scroll offset. * * - Bugfix: Scroll offset: make configurable to fix site-dependent issues related to fixed headers. * * @since 2.1.4 * @date 2020-12-05T0538+0100 */ const C_INT_FOOTNOTES_SCROLL_OFFSET = 'footnotes_inputfield_scroll_offset'; /** * Settings Container Keys for scroll duration. * * - Bugfix: Scroll duration: make configurable to conform to website content and style requirements. * * @since 2.1.4 * @date 2020-12-05T0538+0100 */ const C_INT_FOOTNOTES_SCROLL_DURATION = 'footnotes_inputfield_scroll_duration'; /** * Settings Container Keys for tooltip display durations. * * @since 2.1.4 * @date 2020-12-05T0538+0100 * Called mouse over box not tooltip for consistency. */ const C_INT_MOUSE_OVER_BOX_FADE_IN_DELAY = 'footnotes_inputfield_mouse_over_box_fade_in_delay'; /** * Settings Container Keys for tooltip display durations. * * @since 2.1.4 * @date 2020-12-05T0538+0100 */ const C_INT_MOUSE_OVER_BOX_FADE_IN_DURATION = 'footnotes_inputfield_mouse_over_box_fade_in_duration'; /** * Settings Container Keys for tooltip display durations. * * @since 2.1.4 * @date 2020-12-05T0538+0100 */ const C_INT_MOUSE_OVER_BOX_FADE_OUT_DELAY = 'footnotes_inputfield_mouse_over_box_fade_out_delay'; /** * Settings Container Keys for tooltip display durations. * * @since 2.1.4 * @date 2020-12-05T0538+0100 */ const C_INT_MOUSE_OVER_BOX_FADE_OUT_DURATION = 'footnotes_inputfield_mouse_over_box_fade_out_duration'; /** * Settings Container Key for URL wrap option. * * This is made optional because it causes weird line breaks. * Unicode-compliant browsers break URLs at slashes. * * @since 2.1.6 * @var str * * 2020-12-09T1554+0100..2020-12-13T1313+0100 */ const C_STR_FOOTNOTE_URL_WRAP_ENABLED = 'footnote_inputfield_url_wrap_enabled'; /** * Settings Container Key for reference container position shortcode. * * @since 2.2.0 * @var str * * 2020-12-13T2056+0100 */ const C_STR_REFERENCE_CONTAINER_POSITION_SHORTCODE = 'footnote_inputfield_reference_container_position_shortcode'; /** * Settings Container Key for the Custom CSS migrated to a dedicated tab. * * @since 2.2.2 Bugfix: Dashboard: Custom CSS: unearth text area and migrate to dedicated tab as designed. * @date 2020-12-15T0520+0100 * @var str */ const C_STR_CUSTOM_CSS_NEW = 'footnote_inputfield_custom_css_new'; /** * Settings Container Key to enable display of legacy Custom CSS metaboxes. * * @since 2.2.2 * @date 2020-12-15T0520+0100 * @var str * * @since 2.3.0 swap Boolean from 'migration complete' to 'show legacy' * @date 2020-12-27T1233+0100 * * The Boolean must be false if its setting is contained in the container to be hidden, * because when saving, all missing constants are emptied, and to_bool() converts empty to false. */ const C_STR_CUSTOM_CSS_LEGACY_ENABLE = 'footnote_inputfield_custom_css_legacy_enable'; /** * Settings Container Keys for alternative tooltip position. * * @since 2.2.5 * @var int * * 2020-12-17T0746+0100 * Fixed width is for alternative tooltips, cannot reuse max-width nor offsets. */ const C_STR_FOOTNOTES_ALTERNATIVE_MOUSE_OVER_BOX_POSITION = 'footnotes_inputfield_alternative_mouse_over_box_position'; /** * Settings Container Keys for alternative tooltip position. * * @since 2.2.5 * @var int * * 2020-12-17T0746+0100 */ const C_INT_FOOTNOTES_ALTERNATIVE_MOUSE_OVER_BOX_OFFSET_X = 'footnotes_inputfield_alternative_mouse_over_box_offset_x'; /** * Settings Container Keys for alternative tooltip position. * * @since 2.2.5 * @var int * * 2020-12-17T0746+0100 */ const C_INT_FOOTNOTES_ALTERNATIVE_MOUSE_OVER_BOX_OFFSET_Y = 'footnotes_inputfield_alternative_mouse_over_box_offset_y'; /** * Settings Container Keys for alternative tooltip position. * * @since 2.2.5 * @var int * * 2020-12-17T0746+0100 */ const C_INT_FOOTNOTES_ALTERNATIVE_MOUSE_OVER_BOX_WIDTH = 'footnotes_inputfield_alternative_mouse_over_box_width'; /** * Settings Container Keys for reference container label element, thanks to @markhillyer. * * @link https://wordpress.org/support/topic/how-do-i-eliminate-the-horizontal-line-beneath-the-reference-container-heading/ * * @since 2.2.5 * @var int * * 2020-12-18T1509+0100 */ const C_STR_REFERENCE_CONTAINER_LABEL_ELEMENT = 'footnotes_inputfield_reference_container_label_element'; /** * Settings Container Keys for reference container label element, thanks to @markhillyer. * * @link https://wordpress.org/support/topic/how-do-i-eliminate-the-horizontal-line-beneath-the-reference-container-heading/ * * @since 2.2.5 * @var int * * 2020-12-18T1509+0100 */ const C_STR_REFERENCE_CONTAINER_LABEL_BOTTOM_BORDER = 'footnotes_inputfield_reference_container_label_bottom_border'; /** * Settings Container Key for table cell borders, thanks to @noobishh. * * @link https://wordpress.org/support/topic/borders-25/ * * @since 2.2.10 * @var str * * 2020-12-25T2311+0100 */ const C_STR_REFERENCE_CONTAINER_ROW_BORDERS_ENABLE = 'footnotes_inputfield_reference_container_row_borders_enable'; /** * Settings container keys for reference container top margin. * * @since 2.3.0 * @var int|bool|str * * 2020-12-29T0914+0100 */ const C_INT_REFERENCE_CONTAINER_TOP_MARGIN = 'footnotes_inputfield_reference_container_top_margin'; /** * Settings container keys for reference container bottom margin. * * @since 2.3.0 * @var int|bool|str * * 2020-12-29T0914+0100 */ const C_INT_REFERENCE_CONTAINER_BOTTOM_MARGIN = 'footnotes_inputfield_reference_container_bottom_margin'; /** * Settings container keys for hard link enabling. * * @since 2.3.0 * @var int|bool|str * * 2020-12-29T0914+0100 */ const C_STR_FOOTNOTES_HARD_LINKS_ENABLE = 'footnotes_inputfield_hard_links_enable'; /** * Settings container keys for hard link anchors in referrers and footnotes. * * @since 2.3.0 * @var int|bool|str * * 2020-12-29T0914+0100 */ const C_STR_REFERRER_FRAGMENT_ID_SLUG = 'footnotes_inputfield_referrer_fragment_id_slug'; /** * Settings container keys for hard link anchors in referrers and footnotes. * * @since 2.3.0 * @var int|bool|str * * 2020-12-29T0914+0100 */ const C_STR_FOOTNOTE_FRAGMENT_ID_SLUG = 'footnotes_inputfield_footnote_fragment_id_slug'; /** * Settings container keys for hard link anchors in referrers and footnotes. * * @since 2.3.0 * @var int|bool|str * * 2020-12-29T0914+0100 */ const C_STR_HARD_LINK_IDS_SEPARATOR = 'footnotes_inputfield_hard_link_ids_separator'; /** * Settings container key for shortcode syntax validation. * * @since 2.4.0 * @date 2021-01-01T0616+0100 * * @var str */ const C_STR_FOOTNOTE_SHORTCODE_SYNTAX_VALIDATION_ENABLE = 'footnotes_inputfield_shortcode_syntax_validation_enable'; /** * Settings container key to enable backlink tooltips. * * - Update: Reference container: Hard backlinks (optional): optional configurable tooltip hinting to use the backbutton instead, thanks to @theroninjedi47 bug report. * * @since 2.5.4 * * @reporter @theroninjedi47 * @link https://wordpress.org/support/topic/hyperlinked-footnotes-creating-excessive-back-history/ * * When hard links are enabled, clicks on the backlinks are logged in the browsing history, * along with clicks on the referrers. * This tooltip hints to use the backbutton instead, so the history gets streamlined again. * @link https://wordpress.org/support/topic/making-it-amp-compatible/#post-13837359 * * @var str */ const C_STR_FOOTNOTES_BACKLINK_TOOLTIP_ENABLE = 'footnotes_inputfield_backlink_tooltip_enable'; /** * Settings container key to configure the backlink tooltip. * * - Update: Reference container: Hard backlinks (optional): optional configurable tooltip hinting to use the backbutton instead, thanks to @theroninjedi47 bug report. * * @since 2.5.4 * * @reporter @theroninjedi47 * @link https://wordpress.org/support/topic/hyperlinked-footnotes-creating-excessive-back-history/ * * @var str */ const C_STR_FOOTNOTES_BACKLINK_TOOLTIP_TEXT = 'footnotes_inputfield_backlink_tooltip_text'; /** * Settings container key to configure the tooltip excerpt delimiter. * * - Update: Tooltips: ability to display dedicated content before `[[/tooltip]]`, thanks to @jbj2199 issue report. * * The first implementation used a fixed shortcode provided in the changelog. * But Footnotes’ UI design policy is to make shortcodes freely configurable. * * @since 2.5.4 * * @reporter @jbj2199 * @link https://wordpress.org/support/topic/change-tooltip-text/ * * Tooltips can display another content than the footnote entry * in the reference container. The trigger is a shortcode in * the footnote text separating the tooltip text from the note. * That is consistent with what WordPress does for excerpts. * * @var str */ const C_STR_FOOTNOTES_TOOLTIP_EXCERPT_DELIMITER = 'footnotes_inputfield_tooltip_excerpt_delimiter'; /** * Settings container key to enable mirroring the tooltip excerpt in the reference container. * * @since 2.5.4 * @var str * * Tooltips, even jQuery-driven, may be hard to consult on mobiles. * This option allows to read the tooltip content in the reference container too. * @link https://wordpress.org/support/topic/change-tooltip-text/#post-13935050 * But this must not be the default behavior. * @link https://wordpress.org/support/topic/change-tooltip-text/#post-13935488 */ const C_STR_FOOTNOTES_TOOLTIP_EXCERPT_MIRROR_ENABLE = 'footnotes_inputfield_tooltip_excerpt_mirror_enable'; /** * Settings container key to configure the tooltip excerpt separator in the reference container. * * @since 2.5.4 * @var str */ const C_STR_FOOTNOTES_TOOLTIP_EXCERPT_MIRROR_SEPARATOR = 'footnotes_inputfield_tooltip_excerpt_mirror_separator'; /** * Settings container key to enable superscript style normalization. * * -Bugfix: Referrers: optional fixes to vertical alignment, font size and position (static) for in-theme consistency and cross-theme stability, thanks to @tomturowski bug report. * * @since 2.5.4 * * @reporter @tomturowski * @link https://wordpress.org/support/topic/in-line-superscript-ref-rides-to-high/ * * @var str */ const C_STR_FOOTNOTE_REFERRERS_NORMAL_SUPERSCRIPT = 'footnotes_inputfield_referrers_normal_superscript'; /** * Settings container key to select the script mode for the reference container. * * - Bugfix: Reference container: optional alternative expanding and collapsing without jQuery for use with hard links, thanks to @hopper87it @pkverma99 issue reports. * * @since 2.5.6 * * @reporter @hopper87it * @link https://wordpress.org/support/topic/footnotes-wp-rocket/ * * @var str */ const C_STR_FOOTNOTES_REFERENCE_CONTAINER_SCRIPT_MODE = 'footnotes_inputfield_reference_container_script_mode'; /** * SETTINGS STORAGE. */ /** * Stores a singleton reference of this class. * * @since 1.5.0 * @var MCI_Footnotes_Settings */ private static $a_obj_instance = null; /** * Contains all Settings Container names. * * @since 1.5.0 * @var array * * Edited. * 2.2.2 added tab for Custom CSS 2020-12-15T0740+0100 * * These are the storage container names, one per dashboard tab. */ private $a_arr_container = array( 'footnotes_storage', 'footnotes_storage_custom', 'footnotes_storage_expert', 'footnotes_storage_custom_css', ); /** * Contains all Default Settings for each Settings Container. * * @since 1.5.0 * @var array * * Comments are moved to constant docblocks. */ private $a_arr_default = array( // General settings. 'footnotes_storage' => array( // Footnote start and end short codes. self::C_STR_FOOTNOTES_SHORT_CODE_START => '((', self::C_STR_FOOTNOTES_SHORT_CODE_END => '))', self::C_STR_FOOTNOTES_SHORT_CODE_START_USER_DEFINED => '', self::C_STR_FOOTNOTES_SHORT_CODE_END_USER_DEFINED => '', self::C_STR_FOOTNOTE_SHORTCODE_SYNTAX_VALIDATION_ENABLE => 'yes', // Footnotes numbering. self::C_STR_FOOTNOTES_COUNTER_STYLE => 'arabic_plain', self::C_STR_COMBINE_IDENTICAL_FOOTNOTES => 'yes', // Scrolling behavior. self::C_INT_FOOTNOTES_SCROLL_OFFSET => 20, self::C_INT_FOOTNOTES_SCROLL_DURATION => 380, self::C_STR_FOOTNOTES_HARD_LINKS_ENABLE => 'no', self::C_STR_REFERRER_FRAGMENT_ID_SLUG => 'r', self::C_STR_FOOTNOTE_FRAGMENT_ID_SLUG => 'f', self::C_STR_HARD_LINK_IDS_SEPARATOR => '+', self::C_STR_FOOTNOTES_BACKLINK_TOOLTIP_ENABLE => 'yes', self::C_STR_FOOTNOTES_BACKLINK_TOOLTIP_TEXT => 'Alt+ ←', // Reference container. self::C_STR_REFERENCE_CONTAINER_NAME => 'References', self::C_STR_REFERENCE_CONTAINER_LABEL_ELEMENT => 'p', self::C_STR_REFERENCE_CONTAINER_LABEL_BOTTOM_BORDER => 'yes', self::C_STR_REFERENCE_CONTAINER_COLLAPSE => 'no', self::C_STR_FOOTNOTES_REFERENCE_CONTAINER_SCRIPT_MODE => 'jquery', self::C_STR_REFERENCE_CONTAINER_POSITION => 'post_end', self::C_STR_REFERENCE_CONTAINER_POSITION_SHORTCODE => '[[references]]', self::C_STR_REFERENCE_CONTAINER_START_PAGE_ENABLE => 'yes', self::C_INT_REFERENCE_CONTAINER_TOP_MARGIN => 24, self::C_INT_REFERENCE_CONTAINER_BOTTOM_MARGIN => 0, self::C_STR_FOOTNOTES_PAGE_LAYOUT_SUPPORT => 'none', self::C_STR_FOOTNOTE_URL_WRAP_ENABLED => 'yes', self::C_STR_REFERENCE_CONTAINER_BACKLINK_SYMBOL_ENABLE => 'yes', self::C_STR_REFERENCE_CONTAINER_BACKLINK_SYMBOL_SWITCH => 'no', self::C_STR_REFERENCE_CONTAINER_3COLUMN_LAYOUT_ENABLE => 'no', self::C_STR_REFERENCE_CONTAINER_ROW_BORDERS_ENABLE => 'no', self::C_STR_BACKLINKS_SEPARATOR_ENABLED => 'yes', self::C_STR_BACKLINKS_SEPARATOR_OPTION => 'comma', self::C_STR_BACKLINKS_SEPARATOR_CUSTOM => '', self::C_STR_BACKLINKS_TERMINATOR_ENABLED => 'no', self::C_STR_BACKLINKS_TERMINATOR_OPTION => 'full_stop', self::C_STR_BACKLINKS_TERMINATOR_CUSTOM => '', self::C_STR_BACKLINKS_COLUMN_WIDTH_ENABLED => 'no', self::C_INT_BACKLINKS_COLUMN_WIDTH_SCALAR => '50', self::C_STR_BACKLINKS_COLUMN_WIDTH_UNIT => 'px', self::C_STR_BACKLINKS_COLUMN_MAX_WIDTH_ENABLED => 'no', self::C_INT_BACKLINKS_COLUMN_MAX_WIDTH_SCALAR => '140', self::C_STR_BACKLINKS_COLUMN_MAX_WIDTH_UNIT => 'px', self::C_STR_BACKLINKS_LINE_BREAKS_ENABLED => 'no', self::C_STR_LINK_ELEMENT_ENABLED => 'yes', // Footnotes in excerpts. self::C_STR_FOOTNOTES_IN_EXCERPT => 'no', // Footnotes love. self::C_STR_FOOTNOTES_LOVE => 'no', // Deprecated. self::C_STR_FOOTNOTES_EXPERT_MODE => 'yes', ), // Referrers and tooltips. 'footnotes_storage_custom' => array( // Backlink symbol. self::C_STR_HYPERLINK_ARROW => '↑', self::C_STR_HYPERLINK_ARROW_USER_DEFINED => '', // Referrer typesetting and formatting. self::C_STR_FOOTNOTES_REFERRER_SUPERSCRIPT_TAGS => 'yes', self::C_STR_FOOTNOTE_REFERRERS_NORMAL_SUPERSCRIPT => 'no', self::C_STR_FOOTNOTES_STYLING_BEFORE => '[', self::C_STR_FOOTNOTES_STYLING_AFTER => ']', // Tooltips. self::C_STR_FOOTNOTES_MOUSE_OVER_BOX_ENABLED => 'yes', self::C_STR_FOOTNOTES_MOUSE_OVER_BOX_ALTERNATIVE => 'no', // Tooltip position. self::C_STR_FOOTNOTES_MOUSE_OVER_BOX_POSITION => 'top center', self::C_STR_FOOTNOTES_ALTERNATIVE_MOUSE_OVER_BOX_POSITION => 'top right', self::C_INT_FOOTNOTES_MOUSE_OVER_BOX_OFFSET_X => 0, self::C_INT_FOOTNOTES_ALTERNATIVE_MOUSE_OVER_BOX_OFFSET_X => -50, self::C_INT_FOOTNOTES_MOUSE_OVER_BOX_OFFSET_Y => -7, self::C_INT_FOOTNOTES_ALTERNATIVE_MOUSE_OVER_BOX_OFFSET_Y => 24, // Tooltip dimensions. self::C_INT_FOOTNOTES_MOUSE_OVER_BOX_MAX_WIDTH => 450, self::C_INT_FOOTNOTES_ALTERNATIVE_MOUSE_OVER_BOX_WIDTH => 400, // Tooltip timing. self::C_INT_MOUSE_OVER_BOX_FADE_IN_DELAY => 0, self::C_INT_MOUSE_OVER_BOX_FADE_IN_DURATION => 200, self::C_INT_MOUSE_OVER_BOX_FADE_OUT_DELAY => 400, self::C_INT_MOUSE_OVER_BOX_FADE_OUT_DURATION => 200, // Tooltip truncation. self::C_STR_FOOTNOTES_MOUSE_OVER_BOX_EXCERPT_ENABLED => 'yes', self::C_INT_FOOTNOTES_MOUSE_OVER_BOX_EXCERPT_LENGTH => 200, self::C_STR_FOOTNOTES_TOOLTIP_READON_LABEL => 'Continue reading', // Tooltip text. self::C_STR_FOOTNOTES_TOOLTIP_EXCERPT_DELIMITER => '[[/tooltip]]', self::C_STR_FOOTNOTES_TOOLTIP_EXCERPT_MIRROR_ENABLE => 'no', self::C_STR_FOOTNOTES_TOOLTIP_EXCERPT_MIRROR_SEPARATOR => ' — ', // Tooltip appearance. self::C_STR_MOUSE_OVER_BOX_FONT_SIZE_ENABLED => 'yes', self::C_FLO_MOUSE_OVER_BOX_FONT_SIZE_SCALAR => 13, self::C_STR_MOUSE_OVER_BOX_FONT_SIZE_UNIT => 'px', self::C_STR_FOOTNOTES_MOUSE_OVER_BOX_COLOR => '', self::C_STR_FOOTNOTES_MOUSE_OVER_BOX_BACKGROUND => '#ffffff', self::C_INT_FOOTNOTES_MOUSE_OVER_BOX_BORDER_WIDTH => 1, self::C_STR_FOOTNOTES_MOUSE_OVER_BOX_BORDER_COLOR => '#cccc99', self::C_INT_FOOTNOTES_MOUSE_OVER_BOX_BORDER_RADIUS => 0, self::C_STR_FOOTNOTES_MOUSE_OVER_BOX_SHADOW_COLOR => '#666666', // Your existing Custom CSS code. self::C_STR_CUSTOM_CSS => '', ), // Scope and priority 'footnotes_storage_expert' => array( // WordPress hooks with priority level. self::C_STR_EXPERT_LOOKUP_THE_TITLE => '', self::C_INT_EXPERT_LOOKUP_THE_TITLE_PRIORITY_LEVEL => PHP_INT_MAX, self::C_STR_EXPERT_LOOKUP_THE_CONTENT => 'checked', self::C_INT_EXPERT_LOOKUP_THE_CONTENT_PRIORITY_LEVEL => 98, self::C_STR_EXPERT_LOOKUP_THE_EXCERPT => '', self::C_INT_EXPERT_LOOKUP_THE_EXCERPT_PRIORITY_LEVEL => PHP_INT_MAX, self::C_STR_EXPERT_LOOKUP_WIDGET_TITLE => '', self::C_INT_EXPERT_LOOKUP_WIDGET_TITLE_PRIORITY_LEVEL => PHP_INT_MAX, self::C_STR_EXPERT_LOOKUP_WIDGET_TEXT => '', self::C_INT_EXPERT_LOOKUP_WIDGET_TEXT_PRIORITY_LEVEL => 98, ), // Custom CSS. 'footnotes_storage_custom_css' => array( // Your existing Custom CSS code. self::C_STR_CUSTOM_CSS_LEGACY_ENABLE => 'yes', // Custom CSS. self::C_STR_CUSTOM_CSS_NEW => '', ), ); /** * Contains all Settings from each Settings container as soon as this class is initialized. * * @since 1.5.0 * @var array */ private $a_arr_settings = array(); /** * Class Constructor. Loads all Settings from each WordPress Settings container. * * @since 1.5.0 */ private function __construct() { $this->load_all(); } /** * Returns a singleton of this class. * * @since 1.5.0 * @return MCI_Footnotes_Settings */ public static function instance() { // No instance defined yet, load it. if ( ! self::$a_obj_instance ) { self::$a_obj_instance = new self(); } // Return a singleton of this class. return self::$a_obj_instance; } /** * Returns the name of a specified Settings Container. * * @since 1.5.0 * @param int $p_int_index Settings Container Array Key Index. * @return str Settings Container name. */ public function get_container( $p_int_index ) { return $this->a_arr_container[ $p_int_index ]; } /** * Returns the default values of a specific Settings Container. * * @since 1.5.6 * @param int $p_int_index Settings Container Aray Key Index. * @return array */ public function get_defaults( $p_int_index ) { return $this->a_arr_default[ $this->a_arr_container[ $p_int_index ] ]; } /** * Loads all Settings from each Settings container. * * @since 1.5.0 */ private function load_all() { // Clear current settings. $this->a_arr_settings = array(); $num_settings = count( $this->a_arr_container ); for ( $i = 0; $i < $num_settings; $i++ ) { // Load settings. $this->a_arr_settings = array_merge( $this->a_arr_settings, $this->load( $i ) ); } } /** * Loads all Settings from specified Settings Container. * * @since 1.5.0 * @param int $p_int_index Settings Container Array Key Index. * @return array Settings loaded from Container of Default Settings if Settings Container is empty (first usage). * * @since ditched trimming whitespace from text box content in response to user request. * @link https://wordpress.org/support/topic/leading-space-in-footnotes-tag/#post-5347966 */ private function load( $p_int_index ) { // Load all settings from container. $l_arr_options = get_option( $this->get_container( $p_int_index ) ); // Load all default settings. $l_arr_default = $this->a_arr_default[ $this->get_container( $p_int_index ) ]; // No settings found, set them to their default value. if ( empty( $l_arr_options ) ) { return $l_arr_default; } // Iterate through all available settings ( = default values). foreach ( $l_arr_default as $l_str_key => $l_str_value ) { // Available setting not found in the container. if ( ! array_key_exists( $l_str_key, $l_arr_options ) ) { // Define the setting with its default value. $l_arr_options[ $l_str_key ] = $l_str_value; } } // Iterate through each setting in the container. foreach ( $l_arr_options as $l_str_key => $l_str_value ) { // Remove all whitespace at the beginning and end of a setting. // Trimming whitespace is ditched. // $l_str_value = trim($l_str_value);. // Write the sanitized value back to the setting container. $l_arr_options[ $l_str_key ] = $l_str_value; } // Return settings loaded from Container. return $l_arr_options; } /** * Updates a whole Settings container. * * @since 1.5.0 * @param int $p_int_index Index of the Settings container. * @param array $p_arr_new_values new Settings. * @return bool */ public function save_options( $p_int_index, $p_arr_new_values ) { if ( update_option( $this->get_container( $p_int_index ), $p_arr_new_values ) ) { $this->load_all(); return true; } return false; } /** * Returns the value of specified Settings name. * * @since 1.5.0 * @param string $p_str_key Settings Array Key name. * @return mixed Value of the Setting on Success or Null in Settings name is invalid. */ public function get( $p_str_key ) { return array_key_exists( $p_str_key, $this->a_arr_settings ) ? $this->a_arr_settings[ $p_str_key ] : null; } /** * Deletes each Settings Container and loads the default values for each Settings Container. * * @since 1.5.0 * * Edit: This didn’t actually work. * @since 2.2.0 this function is not called any longer when deleting the plugin, * to protect user data against loss, since manually updating a plugin is safer * done by deleting and reinstalling (see the warning about database backup). * 2020-12-13T1353+0100 */ public function clear_all() { // Iterate through each Settings Container. $num_settings = count( $this->a_arr_container ); for ( $i = 0; $i < $num_settings; $i++ ) { // Delete the settings container. delete_option( $this->get_container( $i ) ); } // Set settings back to the default values. $this->a_arr_settings = $this->a_arr_default; } /** * Register all Settings Container for the Plugin Settings Page in the Dashboard. * Settings Container Label will be the same as the Settings Container Name. * * @since 1.5.0 */ public function register_settings() { // Register all settings. $num_settings = count( $this->a_arr_container ); for ( $i = 0; $i < $num_settings; $i++ ) { register_setting( $this->get_container( $i ), $this->get_container( $i ) ); } } }