diff --git a/.gitignore b/.gitignore index 7fdc234..b6fe4af 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,4 @@ .phpdoc/ +vendor/ + +*.bak diff --git a/README.md b/README.md index 40216d0..375cb0c 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,7 @@ Featured on [wpmudev](http://premium.wpmudev.org/blog/12-surprisingly-useful-wor 1. Read the contributing guidelines 1. Clone this repository (`git clone git@github.com:markcheret/footnotes.git`) + - We recommend that you use [VVV](https://varyingvagrantvagrants.org/) for your development environment 1. Install [Composer](https://getcomposer.org/download/), if you don't have it already 1. Install dependencies (`composer install`) 1. Create a new branch from `main` (`git checkout -b `) @@ -25,8 +26,8 @@ Featured on [wpmudev](http://premium.wpmudev.org/blog/12-surprisingly-useful-wor 1. Run PHP_CodeSniffer on the file(s) you want to check (`./vendor/bin/phpcs --standard="WordPress" --colors --encoding=utf-8 -n -p `) 1. (If applicable) run the PHP Code Beautifier and Formatter to attempt to automatically fix any errors (`./vendor/bin/phpcbf --standard="WordPress" --encoding=utf-8 -p `) - Add the `-n` flag to ignore warnings (i.e., show only errors) - - Add the `-s` flag to show sniff codes (used for disabling errors in the code with `phpcs disable:` — MAKE SURE THAT YOU HAVE `phpcs enable` AT THE EARLIEST POINT POSSIBLE, and provide a justification for disabling the sniff code) - - You can run either across the entire project by adding the argument `--ignore=*/vendor/*` and targetting the file `./*.php ./**/*.php` + - Add the `-s` flag to show sniff codes (used for disabling errors in the code with `phpcs disable:` — MAKE SURE THAT YOU HAVE `phpcs enable` AT THE EARLIEST POINT POSSIBLE, and provide a justification for disabling the sniff code) + - You can run either across the entire project by adding the argument `--ignore=*/vendor/*` and targetting the file `./**/*.php` ## Updating Documentation diff --git a/_tools/setup.sh b/_tools/setup.sh new file mode 100644 index 0000000..fd4c786 --- /dev/null +++ b/_tools/setup.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +cp contrib/pre-commit .git/hooks/pre-commit +chmod +x .git/hooks/pre-commit diff --git a/class/config.php b/class/config.php index 98a3245..4025584 100644 --- a/class/config.php +++ b/class/config.php @@ -1,51 +1,46 @@ -foot'; /** * Public Plugin name for dashboard heading - * + * * After properly displaying in dashboard headings until WPv5.4, the above started - * in WPv5.5 being torn apart as if the headline was text-align:justify and not + * in WPv5.5 being torn apart as if the headline was text-align:justify and not * the last line. That ugly display bug badly affected the plugin’s communication. * The only working solution found so far is using position:fixed in one heading * that isn’t translated, and dropping the logo in another, translatable heading. @@ -58,7 +53,6 @@ class MCI_Footnotes_Config { /** * Html tag for the LOVE symbol. * - * @author Stefan Herndler * @since 1.5.0 * @var string */ @@ -75,7 +69,6 @@ class MCI_Footnotes_Config { /** * Short code to DON'T display the 'LOVE ME' slug on certain pages. * - * @author Stefan Herndler * @since 1.5.0 * @var string */ diff --git a/class/convert.php b/class/convert.php index e1823ad..5847d03 100644 --- a/class/convert.php +++ b/class/convert.php @@ -3,20 +3,18 @@ * Includes the Convert Class. * * @filesource - * @author Stefan Herndler + * @package footnotes * @since 1.5.0 12.09.14 10:56 - * + * * Edited: * @since 2.2.0 add lowercase Roman 2020-12-12T1540+0100 - * + * * Last modified: 2020-12-12T1541+0100 */ - /** * Converts data types and Footnotes specific values. * - * @author Stefan Herndler * @since 1.5.0 */ class MCI_Footnotes_Convert { @@ -24,30 +22,29 @@ class MCI_Footnotes_Convert { /** * Converts a integer into the user-defined counter style for the footnotes. * - * @author Stefan Herndler * @since 1.5.0 - * @param int $p_int_Index Index to be converted. - * @param string $p_str_ConvertStyle Style of the new/converted Index. + * @param int $p_int_index Index to be converted. + * @param string $p_str_convert_style Style of the new/converted Index. * @return string Converted Index as string in the defined counter style. - * + * * Edited: * @since 2.2.0 lowercase Roman numerals supported */ - public static function Index($p_int_Index, $p_str_ConvertStyle = "arabic_plain") { - switch ($p_str_ConvertStyle) { - case "romanic": - return self::toRomanic($p_int_Index, true); - case "roman_low": - return self::toRomanic($p_int_Index, false); - case "latin_high": - return self::toLatin($p_int_Index, true); - case "latin_low": - return self::toLatin($p_int_Index, false); - case "arabic_leading": - return self::toArabicLeading($p_int_Index); - case "arabic_plain": + public static function index( $p_int_index, $p_str_convert_style = 'arabic_plain' ) { + switch ( $p_str_convert_style ) { + case 'romanic': + return self::to_romanic( $p_int_index, true ); + case 'roman_low': + return self::to_romanic( $p_int_index, false ); + case 'latin_high': + return self::to_latin( $p_int_index, true ); + case 'latin_low': + return self::to_latin( $p_int_index, false ); + case 'arabic_leading': + return self::to_arabic_leading( $p_int_index ); + case 'arabic_plain': default: - return $p_int_Index; + return $p_int_index; } } @@ -55,175 +52,174 @@ class MCI_Footnotes_Convert { * Converts an integer into latin ascii characters, either lower or upper-case. * Function available from A to ZZ ( means 676 footnotes at 1 page possible). * - * @author Stefan Herndler * @since 1.0-gamma - * @param int $p_int_Value Value/Index to be converted. - * @param bool $p_bool_UpperCase True to convert the value to upper case letter, otherwise to lower case. + * @param int $p_int_value Value/Index to be converted. + * @param bool $p_bool_upper_case True to convert the value to upper case letter, otherwise to lower case. * @return string */ - private static function toLatin($p_int_Value, $p_bool_UpperCase) { - // output string - $l_str_Return = ""; - $l_int_Offset = 0; - // check if the value is higher then 26 = Z - while ($p_int_Value > 26) { - // increase offset and reduce counter - $l_int_Offset++; - $p_int_Value -= 26; + private static function to_latin( $p_int_value, $p_bool_upper_case ) { + // Output string. + $l_str_return = ''; + $l_int_offset = 0; + // Check if the value is higher then 26 = Z. + while ( $p_int_value > 26 ) { + // Increase offset and reduce counter. + $l_int_offset++; + $p_int_value -= 26; } - // if offset set (more then Z), then add a new letter in front - if ($l_int_Offset > 0) { - $l_str_Return = chr($l_int_Offset + 64); + // If offset set (more then Z), then add a new letter in front. + if ( $l_int_offset > 0 ) { + $l_str_return = chr( $l_int_offset + 64 ); } - // add the origin letter - $l_str_Return .= chr($p_int_Value + 64); - // return the latin character representing the integer - if ($p_bool_UpperCase) { - return strtoupper($l_str_Return); + // Add the origin letter. + $l_str_return .= chr( $p_int_value + 64 ); + // Return the latin character representing the integer. + if ( $p_bool_upper_case ) { + return strtoupper( $l_str_return ); } - return strtolower($l_str_Return); + return strtolower( $l_str_return ); } /** * Converts an integer to a leading-0 integer. * - * @author Stefan Herndler * @since 1.0-gamma - * @param int $p_int_Value Value/Index to be converted. + * @param int $p_int_value Value/Index to be converted. * @return string Value with a leading zero. */ - private static function toArabicLeading($p_int_Value) { - // add a leading 0 if number lower then 10 - if ($p_int_Value < 10) { - return "0" . $p_int_Value; + private static function to_arabic_leading( $p_int_value ) { + // Add a leading 0 if number lower then 10. + if ( $p_int_value < 10 ) { + return '0' . $p_int_value; } - return $p_int_Value; + return $p_int_value; } /** * Converts an integer to a romanic letter. * - * @author Stefan Herndler * @since 1.0-gamma - * @param int $p_int_Value Value/Index to be converted. + * @param int $p_int_value Value/Index to be converted. + * @param bool $p_bool_upper_case Whether to uppercase. * @return string - * + * * Edited: * @since 2.2.0 optionally lowercase (code from Latin) 2020-12-12T1538+0100 */ - private static function toRomanic($p_int_Value, $p_bool_UpperCase) { - // table containing all necessary romanic letters - $l_arr_RomanicLetters = array( - 'M' => 1000, + private static function to_romanic( $p_int_value, $p_bool_upper_case ) { + // Table containing all necessary romanic letters. + $l_arr_romanic_letters = array( + 'M' => 1000, 'CM' => 900, - 'D' => 500, + 'D' => 500, 'CD' => 400, - 'C' => 100, + 'C' => 100, 'XC' => 90, - 'L' => 50, + 'L' => 50, 'XL' => 40, - 'X' => 10, + 'X' => 10, 'IX' => 9, - 'V' => 5, + 'V' => 5, 'IV' => 4, - 'I' => 1 + 'I' => 1, ); - // return value - $l_str_Return = ''; - // iterate through integer value until it is reduced to 0 - while ($p_int_Value > 0) { - foreach ($l_arr_RomanicLetters as $l_str_Romanic => $l_int_Arabic) { - if ($p_int_Value >= $l_int_Arabic) { - $p_int_Value -= $l_int_Arabic; - $l_str_Return .= $l_str_Romanic; + // Return value. + $l_str_return = ''; + // Iterate through integer value until it is reduced to 0. + while ( $p_int_value > 0 ) { + foreach ( $l_arr_romanic_letters as $l_str_romanic => $l_int_arabic ) { + if ( $p_int_value >= $l_int_arabic ) { + $p_int_value -= $l_int_arabic; + $l_str_return .= $l_str_romanic; break; } } } - // return romanic letters as string - if ($p_bool_UpperCase) { - return strtoupper($l_str_Return); + // Return romanic letters as string. + if ( $p_bool_upper_case ) { + return strtoupper( $l_str_return ); } - return strtolower($l_str_Return); + return strtolower( $l_str_return ); } /** * Converts a string depending on its value to a boolean. * - * @author Stefan Herndler * @since 1.0-beta - * @param string $p_str_Value String to be converted to boolean. + * @param string $p_str_value String to be converted to boolean. * @return bool Boolean representing the string. */ - public static function toBool($p_str_Value) { - // convert string to lower-case to make it easier - $p_str_Value = strtolower($p_str_Value); - // check if string seems to contain a "true" value - switch ($p_str_Value) { - case "checked": - case "yes": - case "true": - case "on": - case "1": + public static function to_bool( $p_str_value ) { + // Convert string to lower-case to make it easier. + $p_str_value = strtolower( $p_str_value ); + // Check if string seems to contain a "true" value. + switch ( $p_str_value ) { + case 'checked': + case 'yes': + case 'true': + case 'on': + case '1': return true; } - // nothing found that says "true", so we return false + // Nothing found that says "true", so we return false. return false; } /** * Get a html Array short code depending on Arrow-Array key index. * - * @author Stefan Herndler * @since 1.3.2 - * @param int $p_int_Index Index representing the Arrow. If empty all Arrows are specified. + * @param int $p_int_index Index representing the Arrow. If empty all Arrows are specified. * @return array|string Array of all Arrows if Index is empty otherwise html tag of a specific arrow. */ - public static function getArrow($p_int_Index = -1) { - // define all possible arrows - $l_arr_Arrows = array("↑", "↥", "↟", "↩", "↲", "↵", "⇑", "⇡", "⇧", "↑"); - // convert index to an integer - if (!is_int($p_int_Index)) { - $p_int_Index = intval($p_int_Index); + public static function get_arrow( $p_int_index = -1 ) { + // Define all possible arrows. + $l_arr_arrows = array( '↑', '↥', '↟', '↩', '↲', '↵', '⇑', '⇡', '⇧', '↑' ); + // Convert index to an integer. + if ( ! is_int( $p_int_index ) ) { + $p_int_index = intval( $p_int_index ); } - // return the whole arrow array - if ($p_int_Index < 0 || $p_int_Index > count($l_arr_Arrows)) { - return $l_arr_Arrows; + // Return the whole arrow array. + if ( $p_int_index < 0 || $p_int_index > count( $l_arr_arrows ) ) { + return $l_arr_arrows; } - // return a single arrow - return $l_arr_Arrows[$p_int_Index]; + // Return a single arrow. + return $l_arr_arrows[ $p_int_index ]; } + // phpcs:disable WordPress.PHP.DevelopmentFunctions.error_log_var_dump + // phpcs:disable WordPress.PHP.DevelopmentFunctions.error_log_print_r /** * Displays a Variable. * - * @author Stefan Herndler * @since 1.5.0 - * @param mixed $p_mixed_Value + * @param mixed $p_mixed_value The variable to display. + * @return void */ - public static function debug($p_mixed_Value) { - if (empty($p_mixed_Value)) { - var_dump($p_mixed_Value); + public static function debug( $p_mixed_value ) { + if ( empty( $p_mixed_value ) ) { + var_dump( $p_mixed_value ); - } else if (is_array($p_mixed_Value)) { - printf("
");
-			print_r($p_mixed_Value);
-			printf("
"); + } elseif ( is_array( $p_mixed_value ) ) { + printf( '
' );
+			print_r( $p_mixed_value );
+			printf( '
' ); - } else if (is_object($p_mixed_Value)) { - printf("
");
-			print_r($p_mixed_Value);
-			printf("
"); + } elseif ( is_object( $p_mixed_value ) ) { + printf( '
' );
+			print_r( $p_mixed_value );
+			printf( '
' ); - } else if (is_numeric($p_mixed_Value) || is_int($p_mixed_Value)) { - var_dump($p_mixed_Value); + } elseif ( is_numeric( $p_mixed_value ) || is_int( $p_mixed_value ) ) { + var_dump( $p_mixed_value ); - } else if (is_date($p_mixed_Value)) { - var_dump($p_mixed_Value); + } elseif ( is_date( $p_mixed_value ) ) { + var_dump( $p_mixed_value ); } else { - var_dump($p_mixed_Value); + var_dump( $p_mixed_value ); } - echo "
"; + echo '
'; } + // phpcs:disable } diff --git a/class/hooks.php b/class/hooks.php index e86d106..8a0a42a 100644 --- a/class/hooks.php +++ b/class/hooks.php @@ -1,11 +1,11 @@ -ClearAll(); } /** * Add Links to the Plugin in the "installed Plugins" page. * - * @author Stefan Herndler * @since 1.5.0 - * @param array $p_arr_Links Current Links. - * @param string $p_str_PluginFileName Plugins init file name. + * @param array $p_arr_links Current Links. + * @param string $p_str_plugin_file_name Plugins init file name. * @return array */ - public static function PluginLinks($p_arr_Links, $p_str_PluginFileName) { - // append link to the WordPress Plugin page - $p_arr_Links[] = sprintf('%s', __('Support', MCI_Footnotes_Config::C_STR_PLUGIN_NAME)); - // append link to the Settings page - $p_arr_Links[] = sprintf('%s', admin_url('admin.php?page=mfmmf-footnotes'), __('Settings', MCI_Footnotes_Config::C_STR_PLUGIN_NAME)); - // append link to the PlayPal Donate function - $p_arr_Links[] = sprintf('%s', __('Donate', MCI_Footnotes_Config::C_STR_PLUGIN_NAME)); - // return new links - return $p_arr_Links; + public static function plugin_links( $p_arr_links, $p_str_plugin_file_name ) { + // Append link to the WordPress Plugin page. + $p_arr_links[] = sprintf( '%s', __( 'Support', 'footnotes' ) ); + // Append link to the settings page. + $p_arr_links[] = sprintf( '%s', admin_url( 'admin.php?page=mfmmf-footnotes' ), __( 'Settings', 'footnotes' ) ); + // Append link to the PayPal donate function. + $p_arr_links[] = sprintf( '%s', __( 'Donate', 'footnotes' ) ); + // Return new links. + return $p_arr_links; } } diff --git a/class/init.php b/class/init.php index e1001a3..d21ca5a 100644 --- a/class/init.php +++ b/class/init.php @@ -1,12 +1,11 @@ -initializeDashboard(); - // initialize the Plugin Task - $this->initializeTask(); + // Initialize the Plugin Dashboard. + $this->initialize_dashboard(); + // Initialize the Plugin Task. + $this->initialize_task(); - // Register all Public Stylesheets and Scripts - add_action('init', array($this, 'registerPublic')); - // Enqueue all Public Stylesheets and Scripts - add_action('wp_enqueue_scripts', array($this, 'registerPublic')); - // Register all Widgets of the Plugin. - add_action('widgets_init', array($this, 'initializeWidgets')); + // Register all Public Stylesheets and Scripts. + add_action( 'init', array( $this, 'register_public' ) ); + // Enqueue all Public Stylesheets and Scripts. + add_action( 'wp_enqueue_scripts', array( $this, 'register_public' ) ); + // Register all Widgets of the Plugin.. + add_action( 'widgets_init', array( $this, 'initialize_widgets' ) ); } /** * Initializes all Widgets of the Plugin. * - * @author Stefan Herndler * @since 1.5.0 * * @@ -129,37 +125,34 @@ class MCI_Footnotes { * and use the bare register_widget() here. * @see self::run() * - * Also, the visibility of initializeWidgets() is not private any longer. + * Also, the visibility of initialize_widgets() is not private any longer. */ - public function initializeWidgets() { - register_widget( "MCI_Footnotes_Widget_ReferenceContainer" ); + public function initialize_widgets() { + register_widget( 'MCI_Footnotes_Widget_Reference_container' ); } /** * Initializes the Dashboard of the Plugin and loads them. * - * @author Stefan Herndler * @since 1.5.0 */ - private function initializeDashboard() { + private function initialize_dashboard() { new MCI_Footnotes_Layout_Init(); } /** * Initializes the Plugin Task and registers the Task hooks. * - * @author Stefan Herndler * @since 1.5.0 */ - private function initializeTask() { - $this->a_obj_Task = new MCI_Footnotes_Task(); - $this->a_obj_Task->registerHooks(); + private function initialize_task() { + $this->a_obj_task = new MCI_Footnotes_Task(); + $this->a_obj_task->register_hooks(); } /** * Registers and enqueues scripts and stylesheets to the public pages. * - * @author Stefan Herndler * @since 1.5.0 * * @since 2.0.0 Update: Tooltips: fix disabling bug by loading jQuery UI library, thanks to @rajinderverma @ericcorbett2 @honlapdavid @mmallett bug reports, thanks to @vonpiernik code contribution. @@ -168,7 +161,7 @@ class MCI_Footnotes { * @since 2.1.4 automate passing version number for cache busting 2020-11-30T0646+0100 * @since 2.1.4 optionally enqueue an extra stylesheet 2020-12-04T2231+0100 */ - public function registerPublic() { + public function register_public() { /** * Enqueues external scripts. @@ -181,10 +174,10 @@ class MCI_Footnotes { * * The condition about tooltips was missing, only the not-alternative-tooltips part was present. */ - // set conditions re-used for stylesheet enqueuing: - self::$a_bool_TooltipsEnabled = MCI_Footnotes_Convert::toBool(MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_BOOL_FOOTNOTES_MOUSE_OVER_BOX_ENABLED ) ); - self::$a_bool_AlternativeTooltipsEnabled = MCI_Footnotes_Convert::toBool(MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_BOOL_FOOTNOTES_MOUSE_OVER_BOX_ALTERNATIVE ) ); - $l_str_ScriptMode = MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_STR_FOOTNOTES_REFERENCE_CONTAINER_SCRIPT_MODE); + // Set conditions re-used for stylesheet enqueuing. + self::$a_bool_tooltips_enabled = MCI_Footnotes_Convert::to_bool( MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_FOOTNOTES_MOUSE_OVER_BOX_ENABLED ) ); + self::$a_bool_alternative_tooltips_enabled = MCI_Footnotes_Convert::to_bool( MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_FOOTNOTES_MOUSE_OVER_BOX_ALTERNATIVE ) ); + $l_str_script_mode = MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_FOOTNOTES_REFERENCE_CONTAINER_SCRIPT_MODE ); /** * Enqueues the jQuery library registered by WordPress. @@ -195,64 +188,42 @@ class MCI_Footnotes { * * @reporter @hopper87it * @link https://wordpress.org/support/topic/footnotes-wp-rocket/ - * + * * jQuery is also used for animated scrolling, so it was loaded by default. * The function wp_enqueue_script() avoids loading the same library multiple times. * After adding the alternative reference container, jQuery has become optional, * but still enabled by default. */ - if ( $l_str_ScriptMode == 'jquery' || ( self::$a_bool_TooltipsEnabled && ! self::$a_bool_AlternativeTooltipsEnabled ) ) { - + if ( 'jquery' === $l_str_script_mode || ( self::$a_bool_tooltips_enabled && ! self::$a_bool_alternative_tooltips_enabled ) ) { + wp_enqueue_script( 'jquery' ); - + } - if ( self::$a_bool_TooltipsEnabled && ! self::$a_bool_AlternativeTooltipsEnabled ) { + if ( self::$a_bool_tooltips_enabled && ! self::$a_bool_alternative_tooltips_enabled ) { /** * Enqueues the jQuery Tools library shipped with the plugin. * - * redacted jQuery.browser, completed minification; - * see full header in js/jquery.tools.js - * added versioning 2020-11-18T2150+0100 - * not use '-js' in the handle, is appended automatically + * Redacted jQuery.browser, completed minification; + * see full header in js/jquery.tools.js. + * + * Add versioning. + * @since 2.1.2 + * @date 2020-11-18T2150+0100 + * + * No '-js' in the handle, is appended automatically. + * + * Deferring to the footer breaks jQuery tooltip display. + * @date 2021-02-23T1105+0100 */ wp_enqueue_script( 'mci-footnotes-jquery-tools', - plugins_url('footnotes/js/jquery.tools.min.js'), + plugins_url( 'footnotes/js/jquery.tools.min.js' ), array(), - '1.2.7.redacted.2' + '1.2.7.redacted.2', ); - /** - * Registers jQuery UI from the JavaScript Content Delivery Network. - * - * - Update: Tooltips: fix disabling bug by loading jQuery UI library, thanks to @rajinderverma @ericcorbett2 @honlapdavid @mmallett bug reports, thanks to @vonpiernik code contribution. - * - * @since 2.0.0 - * Alternatively, fetch jQuery UI from cdnjs.cloudflare.com: - * @since 2.0.0 add jQueryUI from Cloudflare 2020-10-26T1907+0100 - * Used to add jQuery UI following @vonpiernik: - * : - * - * - * jQueryUI re-enables the tooltip infobox disabled when WPv5.5 was released. - * - * Updated for v2.0.4 by adding jQuery UI from WordPress following @check2020de: - * - * See - * - * This was enabled in Footnotes v2.0.0 through v2.0.3. - * Re-added for 2.0.9d1 / 2.1.1d0 to look whether it can fix a broken tooltip display. 2020-11-07T1601+0100/2020-11-08T2246+0100 - */ - //wp_register_script( 'jQueryUI', 'https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js', null, null, false ); // in header 2020-11-09T2003+0100 - //wp_enqueue_script( 'jQueryUI' ); - /** - * This is then needed instead of the above first instance: - * Add jQuery Tools and finish adding jQueryUI: 2020-11-08T1638+0100/2020-11-08T2246+0100 - */ - //wp_enqueue_script('mci-footnotes-js-jquery-tools', plugins_url('../js/jquery.tools.min.js', __FILE__), ['jQueryUI']); - /** * Enqueues some jQuery UI libraries registered by WordPress. * @@ -308,34 +279,43 @@ class MCI_Footnotes { * The media scope argument 'all' is the default. * No need to use '-css' in the handle, as this is appended automatically. */ - // set tooltip mode for use in stylesheet name: - if ( self::$a_bool_TooltipsEnabled ) { - if ( self::$a_bool_AlternativeTooltipsEnabled ) { - $l_str_TooltipMode = 'al'; - $l_str_TComplement = 'ternative-tooltips'; + // Set tooltip mode for use in stylesheet name. + if ( self::$a_bool_tooltips_enabled ) { + if ( self::$a_bool_alternative_tooltips_enabled ) { + $l_str_tooltip_mode = 'al'; + $l_str_tcomplement = 'ternative-tooltips'; } else { - $l_str_TooltipMode = 'jq'; - $l_str_TComplement = 'uery-tooltips'; + $l_str_tooltip_mode = 'jq'; + $l_str_tcomplement = 'uery-tooltips'; } } else { - $l_str_TooltipMode = 'no'; - $l_str_TComplement = '-tooltips'; + $l_str_tooltip_mode = 'no'; + $l_str_tcomplement = '-tooltips'; } - // set basic responsive page layout mode for use in stylesheet name: - $l_str_PageLayoutOption = MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_STR_FOOTNOTES_PAGE_LAYOUT_SUPPORT); - switch ( $l_str_PageLayoutOption ) { - case "reference-container": $l_str_LayoutMode = '1'; break; - case "entry-content" : $l_str_LayoutMode = '2'; break; - case "main-content" : $l_str_LayoutMode = '3'; break; - case "none": default: $l_str_LayoutMode = '0'; break; + // Set basic responsive page layout mode for use in stylesheet name. + $l_str_page_layout_option = MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_FOOTNOTES_PAGE_LAYOUT_SUPPORT ); + switch ( $l_str_page_layout_option ) { + case 'reference-container': + $l_str_layout_mode = '1'; + break; + case 'entry-content': + $l_str_layout_mode = '2'; + break; + case 'main-content': + $l_str_layout_mode = '3'; + break; + case 'none': + default: + $l_str_layout_mode = '0'; + break; } - // enqueue the tailored united minified stylesheet: + // Enqueue the tailored united minified stylesheet. wp_enqueue_style( - 'mci-footnotes-' . $l_str_TooltipMode . $l_str_TComplement . '-pagelayout-' . $l_str_PageLayoutOption, + 'mci-footnotes-' . $l_str_tooltip_mode . $l_str_tcomplement . '-pagelayout-' . $l_str_page_layout_option, plugins_url( - MCI_Footnotes_Config::C_STR_PLUGIN_NAME . '/css/footnotes-' . $l_str_TooltipMode . 'ttbrpl' . $l_str_LayoutMode . '.min.css' + MCI_Footnotes_Config::C_STR_PLUGIN_NAME . '/css/footnotes-' . $l_str_tooltip_mode . 'ttbrpl' . $l_str_layout_mode . '.min.css' ), array(), C_STR_FOOTNOTES_VERSION, @@ -356,12 +336,12 @@ class MCI_Footnotes { wp_enqueue_style( 'mci-footnotes-tooltips', plugins_url( MCI_Footnotes_Config::C_STR_PLUGIN_NAME . '/css/dev-tooltips.css' ), array(), C_STR_FOOTNOTES_VERSION ); wp_enqueue_style( 'mci-footnotes-alternative', plugins_url( MCI_Footnotes_Config::C_STR_PLUGIN_NAME . '/css/dev-tooltips-alternative.css' ), array(), C_STR_FOOTNOTES_VERSION ); - $l_str_PageLayoutOption = MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_STR_FOOTNOTES_PAGE_LAYOUT_SUPPORT); - if ($l_str_PageLayoutOption != 'none') { + $l_str_page_layout_option = MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_FOOTNOTES_PAGE_LAYOUT_SUPPORT ); + if ( 'none' !== $l_str_page_layout_option ) { wp_enqueue_style( - 'mci-footnotes-layout-' . $l_str_PageLayoutOption, + 'mci-footnotes-layout-' . $l_str_page_layout_option, plugins_url( - MCI_Footnotes_Config::C_STR_PLUGIN_NAME . '/css/dev-layout-' . $l_str_PageLayoutOption . '.css' + MCI_Footnotes_Config::C_STR_PLUGIN_NAME . '/css/dev-layout-' . $l_str_page_layout_option . '.css' ), array(), C_STR_FOOTNOTES_VERSION, diff --git a/class/language.php b/class/language.php index fccf143..cb6b750 100644 --- a/class/language.php +++ b/class/language.php @@ -1,12 +1,11 @@ - array( + 'footnotes_storage' => array( - 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_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_BOOL_FOOTNOTE_SHORTCODE_SYNTAX_VALIDATION_ENABLE => 'yes', + self::C_STR_FOOTNOTE_SHORTCODE_SYNTAX_VALIDATION_ENABLE => 'yes', - self::C_STR_FOOTNOTES_COUNTER_STYLE => 'arabic_plain', - self::C_BOOL_COMBINE_IDENTICAL_FOOTNOTES => 'yes', + self::C_STR_FOOTNOTES_COUNTER_STYLE => 'arabic_plain', + self::C_STR_COMBINE_IDENTICAL_FOOTNOTES => 'yes', - self::C_BOOL_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_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_INT_FOOTNOTES_SCROLL_OFFSET => 20, + self::C_INT_FOOTNOTES_SCROLL_DURATION => 380, - // 2.5.4 fast-tracked: - self::C_BOOL_FOOTNOTES_BACKLINK_TOOLTIP_ENABLE => 'yes', - self::C_STR_FOOTNOTES_BACKLINK_TOOLTIP_TEXT => 'Alt+ ←', + // 2.5.4 fast-tracked. + self::C_STR_FOOTNOTES_BACKLINK_TOOLTIP_ENABLE => 'yes', + self::C_STR_FOOTNOTES_BACKLINK_TOOLTIP_TEXT => 'Alt+ ←', - self::C_STR_REFERENCE_CONTAINER_NAME => 'References', - self::C_STR_REFERENCE_CONTAINER_LABEL_ELEMENT => 'p', - self::C_BOOL_REFERENCE_CONTAINER_LABEL_BOTTOM_BORDER => 'yes', - self::C_BOOL_REFERENCE_CONTAINER_COLLAPSE => 'no', - self::C_STR_FOOTNOTES_REFERENCE_CONTAINER_SCRIPT_MODE => 'jquery', + 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_BOOL_REFERENCE_CONTAINER_START_PAGE_ENABLE => 'yes', + 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', - // whether to enqueue additional stylesheet: - self::C_STR_FOOTNOTES_PAGE_LAYOUT_SUPPORT => 'none', + // Whether to enqueue additional stylesheet. + self::C_STR_FOOTNOTES_PAGE_LAYOUT_SUPPORT => 'none', - // top and bottom margins: - self::C_INT_REFERENCE_CONTAINER_TOP_MARGIN => 24, - self::C_INT_REFERENCE_CONTAINER_BOTTOM_MARGIN => 0, + // Top and bottom margins. + self::C_INT_REFERENCE_CONTAINER_TOP_MARGIN => 24, + self::C_INT_REFERENCE_CONTAINER_BOTTOM_MARGIN => 0, - // table cell borders: - self::C_BOOL_REFERENCE_CONTAINER_ROW_BORDERS_ENABLE => 'no', + // Table cell borders. + self::C_STR_REFERENCE_CONTAINER_ROW_BORDERS_ENABLE => 'no', - // backlink symbol: - self::C_BOOL_REFERENCE_CONTAINER_3COLUMN_LAYOUT_ENABLE => 'no', - self::C_BOOL_REFERENCE_CONTAINER_BACKLINK_SYMBOL_ENABLE => 'yes', - self::C_BOOL_REFERENCE_CONTAINER_BACKLINK_SYMBOL_SWITCH => 'no', + // Backlink symbol. + self::C_STR_REFERENCE_CONTAINER_3COLUMN_LAYOUT_ENABLE => 'no', + self::C_STR_REFERENCE_CONTAINER_BACKLINK_SYMBOL_ENABLE => 'yes', + self::C_STR_REFERENCE_CONTAINER_BACKLINK_SYMBOL_SWITCH => 'no', - // backlink separators and terminators are often not preferred. - // but a choice must be provided along with the ability to customize: - self::C_BOOL_BACKLINKS_SEPARATOR_ENABLED => 'yes', - self::C_STR_BACKLINKS_SEPARATOR_OPTION => 'comma', - self::C_STR_BACKLINKS_SEPARATOR_CUSTOM => '', - self::C_BOOL_BACKLINKS_TERMINATOR_ENABLED => 'no', - self::C_STR_BACKLINKS_TERMINATOR_OPTION => 'full_stop', - self::C_STR_BACKLINKS_TERMINATOR_CUSTOM => '', + // Backlink separators and terminators are often not preferred.. + // But a choice must be provided along with the ability to customize. + 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 => '', - // set backlinks column width: - self::C_BOOL_BACKLINKS_COLUMN_WIDTH_ENABLED => 'no', - self::C_INT_BACKLINKS_COLUMN_WIDTH_SCALAR => '50', - self::C_STR_BACKLINKS_COLUMN_WIDTH_UNIT => 'px', + // Set backlinks column width. + self::C_STR_BACKLINKS_COLUMN_WIDTH_ENABLED => 'no', + self::C_INT_BACKLINKS_COLUMN_WIDTH_SCALAR => '50', + self::C_STR_BACKLINKS_COLUMN_WIDTH_UNIT => 'px', - // set backlinks column max. width: - self::C_BOOL_BACKLINKS_COLUMN_MAX_WIDTH_ENABLED => 'no', - self::C_INT_BACKLINKS_COLUMN_MAX_WIDTH_SCALAR => '140', - self::C_STR_BACKLINKS_COLUMN_MAX_WIDTH_UNIT => 'px', + // Set backlinks column max. width. + 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', - // whether a
tag is inserted: - self::C_BOOL_BACKLINKS_LINE_BREAKS_ENABLED => 'no', + // Whether a
tag is inserted. + self::C_STR_BACKLINKS_LINE_BREAKS_ENABLED => 'no', - // whether to enable URL line wrapping: - self::C_BOOL_FOOTNOTE_URL_WRAP_ENABLED => 'yes', + // Whether to enable URL line wrapping. + self::C_STR_FOOTNOTE_URL_WRAP_ENABLED => 'yes', - // whether to use link elements: - self::C_BOOL_LINK_ELEMENT_ENABLED => 'yes', + // Whether to use link elements. + self::C_STR_LINK_ELEMENT_ENABLED => 'yes', - // excerpt should be disabled: - self::C_BOOL_FOOTNOTES_IN_EXCERPT => 'no', + // Excerpt should be disabled. + self::C_STR_FOOTNOTES_IN_EXCERPT => 'no', - self::C_BOOL_FOOTNOTES_EXPERT_MODE => 'yes', + self::C_STR_FOOTNOTES_EXPERT_MODE => 'yes', - self::C_STR_FOOTNOTES_LOVE => 'no', + self::C_STR_FOOTNOTES_LOVE => 'no', ), - "footnotes_storage_custom" => array( + 'footnotes_storage_custom' => array( - self::C_STR_HYPERLINK_ARROW => '↑', - self::C_STR_HYPERLINK_ARROW_USER_DEFINED => '', + self::C_STR_HYPERLINK_ARROW => '↑', + self::C_STR_HYPERLINK_ARROW_USER_DEFINED => '', - self::C_STR_FOOTNOTES_TOOLTIP_READON_LABEL => 'Continue reading', + self::C_STR_FOOTNOTES_TOOLTIP_READON_LABEL => 'Continue reading', - self::C_BOOL_FOOTNOTES_REFERRER_SUPERSCRIPT_TAGS => 'yes', + self::C_STR_FOOTNOTES_REFERRER_SUPERSCRIPT_TAGS => 'yes', - self::C_STR_FOOTNOTES_STYLING_BEFORE => '[', - self::C_STR_FOOTNOTES_STYLING_AFTER => ']', + self::C_STR_FOOTNOTES_STYLING_BEFORE => '[', + self::C_STR_FOOTNOTES_STYLING_AFTER => ']', - self::C_BOOL_FOOTNOTES_MOUSE_OVER_BOX_ENABLED => 'yes', + self::C_STR_FOOTNOTES_MOUSE_OVER_BOX_ENABLED => 'yes', - self::C_BOOL_FOOTNOTES_MOUSE_OVER_BOX_ALTERNATIVE => 'no', + self::C_STR_FOOTNOTES_MOUSE_OVER_BOX_ALTERNATIVE => 'no', - // The mouse over content truncation should be enabled by default - // to raise awareness of the functionality and to prevent the screen - // from being filled at mouse-over, and to allow the Continue reading: - self::C_BOOL_FOOTNOTES_MOUSE_OVER_BOX_EXCERPT_ENABLED => 'yes', + // The mouse over content truncation should be enabled by default. + // To raise awareness of the functionality and to prevent the screen. + // From being filled at mouse-over, and to allow the Continue reading. + self::C_STR_FOOTNOTES_MOUSE_OVER_BOX_EXCERPT_ENABLED => 'yes', - // The truncation length is raised from 150 to 200 chars: - self::C_INT_FOOTNOTES_MOUSE_OVER_BOX_EXCERPT_LENGTH => 200, + // The truncation length is raised from 150 to 200 chars. + self::C_INT_FOOTNOTES_MOUSE_OVER_BOX_EXCERPT_LENGTH => 200, - // 2.5.4 fast-tracked: - self::C_STR_FOOTNOTES_TOOLTIP_EXCERPT_DELIMITER => '[[/tooltip]]', - self::C_BOOL_FOOTNOTES_TOOLTIP_EXCERPT_MIRROR_ENABLE => 'no', - self::C_STR_FOOTNOTES_TOOLTIP_EXCERPT_MIRROR_SEPARATOR => ' — ', - self::C_STR_FOOTNOTE_REFERRERS_NORMAL_SUPERSCRIPT => 'no', + // 2.5.4 fast-tracked. + 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 => ' — ', + self::C_STR_FOOTNOTE_REFERRERS_NORMAL_SUPERSCRIPT => 'no', - // 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: - self::C_STR_FOOTNOTES_MOUSE_OVER_BOX_POSITION => 'top center', + // 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. + self::C_STR_FOOTNOTES_MOUSE_OVER_BOX_POSITION => 'top center', - self::C_INT_FOOTNOTES_MOUSE_OVER_BOX_OFFSET_X => 0, - // The vertical offset must be negative for the box not to cover - // the current line of text (web coordinates origin is top left): - self::C_INT_FOOTNOTES_MOUSE_OVER_BOX_OFFSET_Y => -7, + self::C_INT_FOOTNOTES_MOUSE_OVER_BOX_OFFSET_X => 0, + // The vertical offset must be negative for the box not to cover. + // The current line of text (web coordinates origin is top left). + self::C_INT_FOOTNOTES_MOUSE_OVER_BOX_OFFSET_Y => -7, - // The width should be limited to start with, for the box to have shape: - self::C_INT_FOOTNOTES_MOUSE_OVER_BOX_MAX_WIDTH => 450, + // The width should be limited to start with, for the box to have shape. + self::C_INT_FOOTNOTES_MOUSE_OVER_BOX_MAX_WIDTH => 450, - // fixed width is for alternative tooltips, cannot reuse max-width nor offsets: + // Fixed width is for alternative tooltips, cannot reuse max-width nor offsets. self::C_STR_FOOTNOTES_ALTERNATIVE_MOUSE_OVER_BOX_POSITION => 'top right', self::C_INT_FOOTNOTES_ALTERNATIVE_MOUSE_OVER_BOX_OFFSET_X => -50, - self::C_INT_FOOTNOTES_ALTERNATIVE_MOUSE_OVER_BOX_OFFSET_Y => 24, - self::C_INT_FOOTNOTES_ALTERNATIVE_MOUSE_OVER_BOX_WIDTH => 400, + self::C_INT_FOOTNOTES_ALTERNATIVE_MOUSE_OVER_BOX_OFFSET_Y => 24, + self::C_INT_FOOTNOTES_ALTERNATIVE_MOUSE_OVER_BOX_WIDTH => 400, - // tooltip display durations: - // called mouse over box not tooltip for consistency - 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 display durations. + // Called mouse over box not tooltip for consistency. + 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 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 - self::C_BOOL_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', + // 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. + 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 => '', - // The mouse over box shouldn’t feature a colored background - // by default, due to diverging user preferences. White is neutral: - self::C_STR_FOOTNOTES_MOUSE_OVER_BOX_BACKGROUND => '#ffffff', + self::C_STR_FOOTNOTES_MOUSE_OVER_BOX_COLOR => '', + // The mouse over box shouldn’t feature a colored background. + // By default, due to diverging user preferences. White is neutral. + 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_WIDTH => 1, + self::C_STR_FOOTNOTES_MOUSE_OVER_BOX_BORDER_COLOR => '#cccc99', - // The mouse over box corners mustn’t be rounded as that is outdated: - self::C_INT_FOOTNOTES_MOUSE_OVER_BOX_BORDER_RADIUS => 0, + // The mouse over box corners mustn’t be rounded as that is outdated. + self::C_INT_FOOTNOTES_MOUSE_OVER_BOX_BORDER_RADIUS => 0, - self::C_STR_FOOTNOTES_MOUSE_OVER_BOX_SHADOW_COLOR => '#666666', + self::C_STR_FOOTNOTES_MOUSE_OVER_BOX_SHADOW_COLOR => '#666666', - // Custom CSS migrates to a dedicated tab: - self::C_STR_CUSTOM_CSS => '', + // Custom CSS migrates to a dedicated tab. + self::C_STR_CUSTOM_CSS => '', ), - "footnotes_storage_expert" => array( + 'footnotes_storage_expert' => array( - // These are checkboxes; keyword 'checked' is converted to Boolean true, - // empty string to false (default): + // These are checkboxes; keyword 'checked' is converted to Boolean true,. + // Empty string to false (default). - // Titles should all be enabled by default to prevent users from - // thinking at first that the feature is broken in post titles. - // See - // Yet in titles, footnotes are still buggy, because WordPress - // uses the title string in menus and in the title element. - self::C_BOOL_EXPERT_LOOKUP_THE_TITLE => '', + // Titles should all be enabled by default to prevent users from. + // Thinking at first that the feature is broken in post titles.. + // See . + // Yet in titles, footnotes are still buggy, because WordPress. + // Uses the title string in menus and in the title element.. + self::C_STR_EXPERT_LOOKUP_THE_TITLE => '', - self::C_BOOL_EXPERT_LOOKUP_THE_CONTENT => 'checked', + self::C_STR_EXPERT_LOOKUP_THE_CONTENT => 'checked', - // And the_excerpt is disabled by default following @nikelaos in - // - // - self::C_BOOL_EXPERT_LOOKUP_THE_EXCERPT => '', + // And the_excerpt is disabled by default following @nikelaos in. + // . + // . + self::C_STR_EXPERT_LOOKUP_THE_EXCERPT => '', - self::C_BOOL_EXPERT_LOOKUP_WIDGET_TITLE => '', + self::C_STR_EXPERT_LOOKUP_WIDGET_TITLE => '', - // 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. - self::C_BOOL_EXPERT_LOOKUP_WIDGET_TEXT => '', + // 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.. + self::C_STR_EXPERT_LOOKUP_WIDGET_TEXT => '', - // 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 - self::C_INT_EXPERT_LOOKUP_THE_TITLE_PRIORITY_LEVEL => PHP_INT_MAX, + // 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. + self::C_INT_EXPERT_LOOKUP_THE_TITLE_PRIORITY_LEVEL => PHP_INT_MAX, - // 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. - self::C_INT_EXPERT_LOOKUP_THE_CONTENT_PRIORITY_LEVEL => 98, - self::C_INT_EXPERT_LOOKUP_THE_EXCERPT_PRIORITY_LEVEL => PHP_INT_MAX, - self::C_INT_EXPERT_LOOKUP_WIDGET_TITLE_PRIORITY_LEVEL => PHP_INT_MAX, - self::C_INT_EXPERT_LOOKUP_WIDGET_TEXT_PRIORITY_LEVEL => 98, + // 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.. + self::C_INT_EXPERT_LOOKUP_THE_CONTENT_PRIORITY_LEVEL => 98, + self::C_INT_EXPERT_LOOKUP_THE_EXCERPT_PRIORITY_LEVEL => PHP_INT_MAX, + self::C_INT_EXPERT_LOOKUP_WIDGET_TITLE_PRIORITY_LEVEL => PHP_INT_MAX, + self::C_INT_EXPERT_LOOKUP_WIDGET_TEXT_PRIORITY_LEVEL => 98, ), - "footnotes_storage_custom_css" => array( + 'footnotes_storage_custom_css' => array( - self::C_BOOL_CUSTOM_CSS_LEGACY_ENABLE => 'yes', - self::C_STR_CUSTOM_CSS_NEW => '', + self::C_STR_CUSTOM_CSS_LEGACY_ENABLE => 'yes', + self::C_STR_CUSTOM_CSS_NEW => '', ), @@ -1074,130 +1033,123 @@ class MCI_Footnotes_Settings { /** * Contains all Settings from each Settings container as soon as this class is initialized. * - * @author Stefan Herndler * @since 1.5.0 * @var array */ - private $a_arr_Settings = array(); + private $a_arr_settings = array(); /** * Class Constructor. Loads all Settings from each WordPress Settings container. * - * @author Stefan Herndler * @since 1.5.0 */ private function __construct() { - $this->loadAll(); + $this->load_all(); } /** * Returns a singleton of this class. * - * @author Stefan Herndler * @since 1.5.0 * @return MCI_Footnotes_Settings */ public static function instance() { - // no instance defined yet, load it - if (self::$a_obj_Instance === null) { - self::$a_obj_Instance = new self(); + // 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; + // Return a singleton of this class. + return self::$a_obj_instance; } /** * Returns the name of a specified Settings Container. * - * @author Stefan Herndler * @since 1.5.0 - * @param int $p_int_Index Settings Container Array Key Index. + * @param int $p_int_index Settings Container Array Key Index. * @return str Settings Container name. */ - public function getContainer($p_int_Index) { - return $this->a_arr_Container[$p_int_Index]; + public function get_container( $p_int_index ) { + return $this->a_arr_container[ $p_int_index ]; } /** * Returns the default values of a specific Settings Container. * - * @author Stefan Herndler * @since 1.5.6 - * @param int $p_int_Index Settings Container Aray Key Index. + * @param int $p_int_index Settings Container Aray Key Index. * @return array */ - public function getDefaults($p_int_Index) { - return $this->a_arr_Default[$this->a_arr_Container[$p_int_Index]]; + 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. * - * @author Stefan Herndler * @since 1.5.0 */ - private function loadAll() { - // clear current settings - $this->a_arr_Settings = array(); - for ($i = 0; $i < count($this->a_arr_Container); $i++) { - // load settings - $this->a_arr_Settings = array_merge($this->a_arr_Settings, $this->Load($i)); + 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. * - * @author Stefan Herndler * @since 1.5.0 - * @param int $p_int_Index Settings Container Array Key Index. + * @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->getContainer($p_int_Index)); - // load all default settings - $l_arr_Default = $this->a_arr_Default[$this->getContainer($p_int_Index)]; + 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; + // 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 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; + // 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; + // Return settings loaded from Container. + return $l_arr_options; } /** * Updates a whole Settings container. * - * @author Stefan Herndler * @since 1.5.0 - * @param int $p_int_Index Index of the Settings container. - * @param array $p_arr_newValues new Settings. + * @param int $p_int_index Index of the Settings container. + * @param array $p_arr_new_values new Settings. * @return bool */ - public function saveOptions($p_int_Index, $p_arr_newValues) { - if (update_option($this->getContainer($p_int_Index), $p_arr_newValues)) { - $this->loadAll(); + 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; @@ -1206,19 +1158,17 @@ class MCI_Footnotes_Settings { /** * Returns the value of specified Settings name. * - * @author Stefan Herndler * @since 1.5.0 - * @param string $p_str_Key Settings Array Key name. + * @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; + 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. * - * @author Stefan Herndler * @since 1.5.0 * * Edit: This didn’t actually work. @@ -1227,27 +1177,28 @@ class MCI_Footnotes_Settings { * done by deleting and reinstalling (see the warning about database backup). * 2020-12-13T1353+0100 */ - public function ClearAll() { - // iterate through each Settings Container - for ($i = 0; $i < count($this->a_arr_Container); $i++) { - // delete the settings container - delete_option($this->getContainer($i)); + 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; + // 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. * - * @author Stefan Herndler * @since 1.5.0 */ - public function RegisterSettings() { - // register all settings - for ($i = 0; $i < count($this->a_arr_Container); $i++) { - register_setting($this->getContainer($i), $this->getContainer($i)); + 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 ) ); } } } diff --git a/class/task.php b/class/task.php index 249636c..7fc22f1 100644 --- a/class/task.php +++ b/class/task.php @@ -1,12 +1,11 @@ -get(MCI_Footnotes_Settings::C_INT_EXPERT_LOOKUP_THE_TITLE_PRIORITY_LEVEL)); - $l_int_TheContentPriority = intval(MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_INT_EXPERT_LOOKUP_THE_CONTENT_PRIORITY_LEVEL)); - $l_int_TheExcerptPriority = intval(MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_INT_EXPERT_LOOKUP_THE_EXCERPT_PRIORITY_LEVEL)); - $l_int_WidgetTitlePriority = intval(MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_INT_EXPERT_LOOKUP_WIDGET_TITLE_PRIORITY_LEVEL)); - $l_int_WidgetTextPriority = intval(MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_INT_EXPERT_LOOKUP_WIDGET_TEXT_PRIORITY_LEVEL)); + // Get values from settings. + $l_int_the_title_priority = intval( MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_INT_EXPERT_LOOKUP_THE_TITLE_PRIORITY_LEVEL ) ); + $l_int_the_content_priority = intval( MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_INT_EXPERT_LOOKUP_THE_CONTENT_PRIORITY_LEVEL ) ); + $l_int_the_excerpt_priority = intval( MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_INT_EXPERT_LOOKUP_THE_EXCERPT_PRIORITY_LEVEL ) ); + $l_int_widget_title_priority = intval( MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_INT_EXPERT_LOOKUP_WIDGET_TITLE_PRIORITY_LEVEL ) ); + $l_int_widget_text_priority = intval( MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_INT_EXPERT_LOOKUP_WIDGET_TEXT_PRIORITY_LEVEL ) ); - // PHP_INT_MAX can be set by -1: - $l_int_TheTitlePriority = ($l_int_TheTitlePriority == -1) ? PHP_INT_MAX : $l_int_TheTitlePriority ; - $l_int_TheContentPriority = ($l_int_TheContentPriority == -1) ? PHP_INT_MAX : $l_int_TheContentPriority ; - $l_int_TheExcerptPriority = ($l_int_TheExcerptPriority == -1) ? PHP_INT_MAX : $l_int_TheExcerptPriority ; - $l_int_WidgetTitlePriority = ($l_int_WidgetTitlePriority == -1) ? PHP_INT_MAX : $l_int_WidgetTitlePriority; - $l_int_WidgetTextPriority = ($l_int_WidgetTextPriority == -1) ? PHP_INT_MAX : $l_int_WidgetTextPriority ; + // PHP_INT_MAX can be set by -1. + $l_int_the_title_priority = ( -1 === $l_int_the_title_priority ) ? PHP_INT_MAX : $l_int_the_title_priority; + $l_int_the_content_priority = ( -1 === $l_int_the_content_priority ) ? PHP_INT_MAX : $l_int_the_content_priority; + $l_int_the_excerpt_priority = ( -1 === $l_int_the_excerpt_priority ) ? PHP_INT_MAX : $l_int_the_excerpt_priority; + $l_int_widget_title_priority = ( -1 === $l_int_widget_title_priority ) ? PHP_INT_MAX : $l_int_widget_title_priority; + $l_int_widget_text_priority = ( -1 === $l_int_widget_text_priority ) ? PHP_INT_MAX : $l_int_widget_text_priority; + // Append custom css to the header. + add_filter( 'wp_head', array( $this, 'wp_head' ), PHP_INT_MAX ); - // append custom css to the header - add_filter('wp_head', array($this, "wp_head"), PHP_INT_MAX); + // Append the love and share me slug to the footer. + add_filter( 'wp_footer', array( $this, 'wp_footer' ), PHP_INT_MAX ); - // append the love and share me slug to the footer - add_filter('wp_footer', array($this, "wp_footer"), PHP_INT_MAX); - - if (MCI_Footnotes_Convert::toBool(MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_BOOL_EXPERT_LOOKUP_THE_TITLE))) { - add_filter('the_title', array($this, "the_title"), $l_int_TheTitlePriority); + if ( MCI_Footnotes_Convert::to_bool( MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_EXPERT_LOOKUP_THE_TITLE ) ) ) { + add_filter( 'the_title', array( $this, 'the_title' ), $l_int_the_title_priority ); } - // configurable priority level for reference container relative positioning; default 98: - if (MCI_Footnotes_Convert::toBool(MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_BOOL_EXPERT_LOOKUP_THE_CONTENT))) { - add_filter('the_content', array($this, "the_content"), $l_int_TheContentPriority); + // Configurable priority level for reference container relative positioning; default 98. + if ( MCI_Footnotes_Convert::to_bool( MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_EXPERT_LOOKUP_THE_CONTENT ) ) ) { + add_filter( 'the_content', array( $this, 'the_content' ), $l_int_the_content_priority ); /** - * Hook for category pages + * Hook for category pages. * * - Bugfix: Hooks: support footnotes on category pages, thanks to @vitaefit bug report, thanks to @misfist code contribution. * @@ -462,10 +532,10 @@ class MCI_Footnotes_Task { * For this to happen, WordPress’ built-in partial HTML blocker needs to be disabled. * @link https://docs.woocommerce.com/document/allow-html-in-term-category-tag-descriptions/ */ - add_filter('term_description', array($this, "the_content"), $l_int_TheContentPriority); + add_filter( 'term_description', array( $this, 'the_content' ), $l_int_the_content_priority ); /** - * Hook for popup maker popups + * Hook for popup maker popups. * * - Bugfix: Hooks: support footnotes in Popup Maker popups, thanks to @squatcher bug report. * @@ -475,22 +545,21 @@ class MCI_Footnotes_Task { * @reporter @squatcher * @link https://wordpress.org/support/topic/footnotes-use-in-popup-maker/ */ - add_filter('pum_popup_content', array($this, "the_content"), $l_int_TheContentPriority); + add_filter( 'pum_popup_content', array( $this, 'the_content' ), $l_int_the_content_priority ); } - if (MCI_Footnotes_Convert::toBool(MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_BOOL_EXPERT_LOOKUP_THE_EXCERPT))) { - add_filter('the_excerpt', array($this, "the_excerpt"), $l_int_TheExcerptPriority); + if ( MCI_Footnotes_Convert::to_bool( MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_EXPERT_LOOKUP_THE_EXCERPT ) ) ) { + add_filter( 'the_excerpt', array( $this, 'the_excerpt' ), $l_int_the_excerpt_priority ); } - if (MCI_Footnotes_Convert::toBool(MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_BOOL_EXPERT_LOOKUP_WIDGET_TITLE))) { - add_filter('widget_title', array($this, "widget_title"), $l_int_WidgetTitlePriority); + if ( MCI_Footnotes_Convert::to_bool( MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_EXPERT_LOOKUP_WIDGET_TITLE ) ) ) { + add_filter( 'widget_title', array( $this, 'widget_title' ), $l_int_widget_title_priority ); } - if (MCI_Footnotes_Convert::toBool(MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_BOOL_EXPERT_LOOKUP_WIDGET_TEXT))) { - add_filter('widget_text', array($this, "widget_text"), $l_int_WidgetTextPriority); + if ( MCI_Footnotes_Convert::to_bool( MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_EXPERT_LOOKUP_WIDGET_TEXT ) ) ) { + add_filter( 'widget_text', array( $this, 'widget_text' ), $l_int_widget_text_priority ); } - /** - * The the_post hook + * The the_post hook. * * - Adding: Hooks: support 'the_post' in response to user request for custom post types. * @@ -555,18 +624,16 @@ class MCI_Footnotes_Task { * @accountable @pewgeuges */ - // reset stored footnotes when displaying the header - self::$a_arr_Footnotes = array(); - self::$a_bool_AllowLoveMe = true; + // Reset stored footnotes when displaying the header. + self::$a_arr_footnotes = array(); + self::$a_bool_allow_love_me = true; } /** * Outputs the custom css to the header of the public page. * - * @author Stefan Herndler * @since 1.5.0 * - * * @since 2.1.1 Bugfix: Reference container: fix start pages by making its display optional, thanks to @dragon013 bug report. * @since 2.1.1 Bugfix: Tooltips: optional alternative JS implementation with CSS transitions to fix configuration-related outage, thanks to @andreasra feedback. * @since 2.1.3 raise settings priority to override theme stylesheets @@ -579,7 +646,7 @@ class MCI_Footnotes_Task { */ public function wp_head() { - // insert start tag without switching out of PHP: + // Insert start tag without switching out of PHP. echo "\r\n\r\n"; /** @@ -921,184 +1007,199 @@ class MCI_Footnotes_Task { * @reporter @andreasra * @link https://wordpress.org/support/topic/footnotes-appearing-in-header/page/2/#post-13632566 * - * The script for alternative tooltips is printed formatted, not minified: + * The script for alternative tooltips is printed formatted, not minified. */ - if ( self::$a_bool_AlternativeTooltipsEnabled ) { + if ( self::$a_bool_alternative_tooltips_enabled ) { ?> -get(MCI_Footnotes_Settings::C_STR_REFERENCE_CONTAINER_POSITION) == "footer") { - echo $this->ReferenceContainer(); + if ( 'footer' === MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_REFERENCE_CONTAINER_POSITION ) ) { + echo wp_kses_post( $this->reference_container() ); } - // get setting for love and share this plugin - $l_str_LoveMeIndex = MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_STR_FOOTNOTES_LOVE); - // check if the admin allows to add a link to the footer - if (empty($l_str_LoveMeIndex) || strtolower($l_str_LoveMeIndex) == "no" || !self::$a_bool_AllowLoveMe) { + // Get setting for love and share this plugin. + $l_str_love_me_index = MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_FOOTNOTES_LOVE ); + // Check if the admin allows to add a link to the footer. + if ( empty( $l_str_love_me_index ) || 'no' === strtolower( $l_str_love_me_index ) || ! self::$a_bool_allow_love_me ) { return; } - // set a hyperlink to the word "footnotes" in the Love slug - $l_str_LinkedName = sprintf('%s', MCI_Footnotes_Config::C_STR_PLUGIN_PUBLIC_NAME); - // get random love me text - if (strtolower($l_str_LoveMeIndex) == "random") { - $l_str_LoveMeIndex = "text-" . rand(1,7); + // Set a hyperlink to the word "footnotes" in the Love slug. + $l_str_linked_name = sprintf( '%s', MCI_Footnotes_Config::C_STR_PLUGIN_PUBLIC_NAME ); + // Get random love me text. + if ( 'random' === strtolower( $l_str_love_me_index ) ) { + $l_str_love_me_index = 'text-' . wp_rand( 1, 7 ); } - switch ($l_str_LoveMeIndex) { - // options named wrt backcompat, simplest is default: - case "text-1": $l_str_LoveMeText = sprintf(__('I %2$s %1$s', MCI_Footnotes_Config::C_STR_PLUGIN_NAME), $l_str_LinkedName, MCI_Footnotes_Config::C_STR_LOVE_SYMBOL); break; - case "text-2": $l_str_LoveMeText = sprintf(__('This website uses the awesome %s plugin.', MCI_Footnotes_Config::C_STR_PLUGIN_NAME), $l_str_LinkedName); break; - case "text-4": $l_str_LoveMeText = sprintf('%s %s', $l_str_LinkedName, MCI_Footnotes_Config::C_STR_LOVE_SYMBOL); break; - case "text-5": $l_str_LoveMeText = sprintf('%s %s', MCI_Footnotes_Config::C_STR_LOVE_SYMBOL, $l_str_LinkedName); break; - case "text-6": $l_str_LoveMeText = sprintf(__('This website uses %s.', MCI_Footnotes_Config::C_STR_PLUGIN_NAME), $l_str_LinkedName); break; - case "text-7": $l_str_LoveMeText = sprintf(__('This website uses the %s plugin.', MCI_Footnotes_Config::C_STR_PLUGIN_NAME), $l_str_LinkedName); break; - case "text-3": default: $l_str_LoveMeText = sprintf('%s', $l_str_LinkedName); break; + switch ( $l_str_love_me_index ) { + // Options named wrt backcompat, simplest is default. + case 'text-1': + /* Translators: 2: Link to plugin page 1: Love heart symbol */ + $l_str_love_me_text = sprintf( __( 'I %2$s %1$s', 'footnotes' ), $l_str_linked_name, MCI_Footnotes_Config::C_STR_LOVE_SYMBOL ); + break; + case 'text-2': + /* Translators: %s: Link to plugin page */ + $l_str_love_me_text = sprintf( __( 'This website uses the awesome %s plugin.', 'footnotes' ), $l_str_linked_name ); + break; + case 'text-4': + /* Translators: 1: Link to plugin page 2: Love heart symbol */ + $l_str_love_me_text = sprintf( '%1$s %2$s', $l_str_linked_name, MCI_Footnotes_Config::C_STR_LOVE_SYMBOL ); + break; + case 'text-5': + /* Translators: 1: Love heart symbol 2: Link to plugin page */ + $l_str_love_me_text = sprintf( '%1$s %2$s', MCI_Footnotes_Config::C_STR_LOVE_SYMBOL, $l_str_linked_name ); + break; + case 'text-6': + /* Translators: %s: Link to plugin page */ + $l_str_love_me_text = sprintf( __( 'This website uses %s.', 'footnotes' ), $l_str_linked_name ); + break; + case 'text-7': + /* Translators: %s: Link to plugin page */ + $l_str_love_me_text = sprintf( __( 'This website uses the %s plugin.', 'footnotes' ), $l_str_linked_name ); + break; + case 'text-3': + default: + /* Translators: %s: Link to plugin page */ + $l_str_love_me_text = sprintf( '%s', $l_str_linked_name ); + break; } - echo sprintf('
%s
', $l_str_LoveMeText); + echo sprintf( '
%s
', wp_kses_post( $l_str_love_me_text ) ); } /** * Replaces footnotes in the post/page title. * - * @author Stefan Herndler * @since 1.5.0 - * @param string $p_str_Content Widget content. + * @param string $p_str_content Widget content. * @return string Content with replaced footnotes. */ - public function the_title($p_str_Content) { - // appends the reference container if set to "post_end" - return $this->exec($p_str_Content, false); + public function the_title( $p_str_content ) { + // Appends the reference container if set to "post_end". + return $this->exec( $p_str_content, false ); } /** * Replaces footnotes in the content of the current page/post. * - * @author Stefan Herndler * @since 1.5.0 - * @param string $p_str_Content Page/Post content. + * @param string $p_str_content Page/Post content. * @return string Content with replaced footnotes. */ - public function the_content($p_str_Content) { - // appends the reference container if set to "post_end" - return $this->exec($p_str_Content, MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_STR_REFERENCE_CONTAINER_POSITION) == "post_end" ? true : false); + public function the_content( $p_str_content ) { + // phpcs:disable WordPress.PHP.YodaConditions.NotYoda + // Appends the reference container if set to "post_end". + return $this->exec( $p_str_content, 'post_end' === MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_REFERENCE_CONTAINER_POSITION ) ); + // phpcs:enable } /** * Replaces footnotes in the excerpt of the current page/post. * - * @author Stefan Herndler * @since 1.5.0 - * @param string $p_str_Content Page/Post content. + * @param string $p_str_content Page/Post content. * @return string Content with replaced footnotes. */ - public function the_excerpt($p_str_Content) { - return $this->exec($p_str_Content, false, !MCI_Footnotes_Convert::toBool(MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_BOOL_FOOTNOTES_IN_EXCERPT))); + public function the_excerpt( $p_str_content ) { + return $this->exec( $p_str_content, false, ! MCI_Footnotes_Convert::to_bool( MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_FOOTNOTES_IN_EXCERPT ) ) ); } /** * Replaces footnotes in the widget title. * - * @author Stefan Herndler * @since 1.5.0 - * @param string $p_str_Content Widget content. + * @param string $p_str_content Widget content. * @return string Content with replaced footnotes. */ - public function widget_title($p_str_Content) { - // appends the reference container if set to "post_end" - return $this->exec($p_str_Content, false); + public function widget_title( $p_str_content ) { + // Appends the reference container if set to "post_end". + return $this->exec( $p_str_content, false ); } /** * Replaces footnotes in the content of the current widget. * - * @author Stefan Herndler * @since 1.5.0 - * @param string $p_str_Content Widget content. + * @param string $p_str_content Widget content. * @return string Content with replaced footnotes. */ - public function widget_text($p_str_Content) { - // appends the reference container if set to "post_end" - return $this->exec($p_str_Content, MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_STR_REFERENCE_CONTAINER_POSITION) == "post_end" ? true : false); + public function widget_text( $p_str_content ) { + // phpcs:disable WordPress.PHP.YodaConditions.NotYoda + // Appends the reference container if set to "post_end". + return $this->exec( $p_str_content, 'post_end' === MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_REFERENCE_CONTAINER_POSITION ) ? true : false ); + // phpcs:enable } /** * Replaces footnotes in each Content var of the current Post object. * - * @author Stefan Herndler * @since 1.5.4 - * @param array|WP_Post $p_mixed_Posts + * @param array|WP_Post $p_mixed_posts The current Post object. */ - public function the_post(&$p_mixed_Posts) { - // single WP_Post object received - if (!is_array($p_mixed_Posts)) { - $p_mixed_Posts = $this->replacePostObject($p_mixed_Posts); + public function the_post( &$p_mixed_posts ) { + // Single WP_Post object received. + if ( ! is_array( $p_mixed_posts ) ) { + $p_mixed_posts = $this->replace_post_object( $p_mixed_posts ); return; } - // array of WP_Post objects received - for($l_int_Index = 0; $l_int_Index < count($p_mixed_Posts); $l_int_Index++) { - $p_mixed_Posts[$l_int_Index] = $this->replacePostObject($p_mixed_Posts[$l_int_Index]); + $num_posts = count( $p_mixed_posts ); + // Array of WP_Post objects received. + for ( $l_int_index = 0; $l_int_index < $num_posts; $l_int_index++ ) { + $p_mixed_posts[ $l_int_index ] = $this->replace_post_object( $p_mixed_posts[ $l_int_index ] ); } } /** * Replace all Footnotes in a WP_Post object. * - * @author Stefan Herndler * @since 1.5.6 - * @param WP_Post $p_obj_Post + * @param WP_Post $p_obj_post The Post object. * @return WP_Post */ - private function replacePostObject($p_obj_Post) { - //MCI_Footnotes_Convert::debug($p_obj_Post); - $p_obj_Post->post_content = $this->exec($p_obj_Post->post_content); - $p_obj_Post->post_content_filtered = $this->exec($p_obj_Post->post_content_filtered); - $p_obj_Post->post_excerpt = $this->exec($p_obj_Post->post_excerpt); - return $p_obj_Post; + private function replace_post_object( $p_obj_post ) { + $p_obj_post->post_content = $this->exec( $p_obj_post->post_content ); + $p_obj_post->post_content_filtered = $this->exec( $p_obj_post->post_content_filtered ); + $p_obj_post->post_excerpt = $this->exec( $p_obj_post->post_excerpt ); + return $p_obj_post; } /** * Replaces all footnotes that occur in the given content. * - * @author Stefan Herndler * @since 1.5.0 - * @param string $p_str_Content Any string that may contain footnotes to be replaced. - * @param bool $p_bool_OutputReferences Appends the Reference Container to the output if set to true, default true. - * @param bool $p_bool_HideFootnotesText Hide footnotes found in the string. + * @param string $p_str_content Any string that may contain footnotes to be replaced. + * @param bool $p_bool_output_references Appends the Reference Container to the output if set to true, default true. + * @param bool $p_bool_hide_footnotes_text Hide footnotes found in the string. * @return string * - * * @since 2.2.0 Adding: Reference container: support for custom position shortcode, thanks to @hamshe issue report. * @since 2.2.5 Bugfix: Reference container: delete position shortcode if unused because position may be widget or footer, thanks to @hamshe bug report. */ - public function exec($p_str_Content, $p_bool_OutputReferences = false, $p_bool_HideFootnotesText = false) { + public function exec( $p_str_content, $p_bool_output_references = false, $p_bool_hide_footnotes_text = false ) { - // replace all footnotes in the content, settings are converted to html characters - $p_str_Content = $this->search($p_str_Content, true, $p_bool_HideFootnotesText); - // replace all footnotes in the content, settings are NOT converted to html characters - $p_str_Content = $this->search($p_str_Content, false, $p_bool_HideFootnotesText); + // Replace all footnotes in the content, settings are converted to html characters. + $p_str_content = $this->search( $p_str_content, true, $p_bool_hide_footnotes_text ); + // Replace all footnotes in the content, settings are NOT converted to html characters. + $p_str_content = $this->search( $p_str_content, false, $p_bool_hide_footnotes_text ); /** - * Reference container customized positioning through shortcode + * Reference container customized positioning through shortcode. * * - Adding: Reference container: support for custom position shortcode, thanks to @hamshe issue report. * @@ -1116,50 +1217,48 @@ class MCI_Footnotes_Task { * * @reporter @hamshe * @link https://wordpress.org/support/topic/reference-container-in-elementor/#post-13784126 - * */ - // append the reference container or insert at shortcode: - $l_str_ReferenceContainerPositionShortcode = MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_STR_REFERENCE_CONTAINER_POSITION_SHORTCODE); - if ( empty( $l_str_ReferenceContainerPositionShortcode ) ) { - $l_str_ReferenceContainerPositionShortcode = '[[references]]'; + // Append the reference container or insert at shortcode. + $l_str_reference_container_position_shortcode = MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_REFERENCE_CONTAINER_POSITION_SHORTCODE ); + if ( empty( $l_str_reference_container_position_shortcode ) ) { + $l_str_reference_container_position_shortcode = '[[references]]'; } - if ( $p_bool_OutputReferences ) { + if ( $p_bool_output_references ) { - if ( strpos( $p_str_Content, $l_str_ReferenceContainerPositionShortcode ) !== false ) { + if ( strpos( $p_str_content, $l_str_reference_container_position_shortcode ) ) { - $p_str_Content = str_replace( $l_str_ReferenceContainerPositionShortcode, $this->ReferenceContainer(), $p_str_Content ); + $p_str_content = str_replace( $l_str_reference_container_position_shortcode, $this->reference_container(), $p_str_content ); } else { - $p_str_Content .= $this->ReferenceContainer(); + $p_str_content .= $this->reference_container(); } - // increment the container ID: - self::$a_int_ReferenceContainerId++; + // Increment the container ID. + self::$a_int_reference_container_id++; } - // delete position shortcode should any remain: - $p_str_Content = str_replace( $l_str_ReferenceContainerPositionShortcode, '', $p_str_Content ); + // Delete position shortcode should any remain. + $p_str_content = str_replace( $l_str_reference_container_position_shortcode, '', $p_str_content ); - // take a look if the LOVE ME slug should NOT be displayed on this page/post, remove the short code if found - if (strpos($p_str_Content, MCI_Footnotes_Config::C_STR_NO_LOVE_SLUG) !== false) { - self::$a_bool_AllowLoveMe = false; - $p_str_Content = str_replace(MCI_Footnotes_Config::C_STR_NO_LOVE_SLUG, "", $p_str_Content); + // Take a look if the LOVE ME slug should NOT be displayed on this page/post, remove the short code if found. + if ( strpos( $p_str_content, MCI_Footnotes_Config::C_STR_NO_LOVE_SLUG ) ) { + self::$a_bool_allow_love_me = false; + $p_str_content = str_replace( MCI_Footnotes_Config::C_STR_NO_LOVE_SLUG, '', $p_str_content ); } - // return the content with replaced footnotes and optional reference container appended: - return $p_str_Content; + // Return the content with replaced footnotes and optional reference container appended. + return $p_str_content; } /** * Replaces all footnotes in the given content and appends them to the static property. * - * @author Stefan Herndler * @since 1.5.0 - * @param string $p_str_Content Content to be searched for footnotes. - * @param bool $p_bool_ConvertHtmlChars html encode settings, default true. - * @param bool $p_bool_HideFootnotesText Hide footnotes found in the string. + * @param string $p_str_content Content to be searched for footnotes. + * @param bool $p_bool_convert_html_chars html encode settings, default true. + * @param bool $p_bool_hide_footnotes_text Hide footnotes found in the string. * @return string * * @since 2.0.0 various. @@ -1168,37 +1267,37 @@ class MCI_Footnotes_Task { * @since 2.5.0 Bugfix: Footnote delimiters: Syntax validation: complete message with hint about setting, thanks to @andreasra bug report. * @since 2.5.0 Bugfix: Footnote delimiters: Syntax validation: limit length of quoted string to 300 characters, thanks to @andreasra bug report. */ - public function search($p_str_Content, $p_bool_ConvertHtmlChars, $p_bool_HideFootnotesText) { + public function search( $p_str_content, $p_bool_convert_html_chars, $p_bool_hide_footnotes_text ) { - // post ID to make everything unique wrt infinite scroll and archive view - self::$a_int_PostId = get_the_id(); + // Post ID to make everything unique wrt infinite scroll and archive view. + self::$a_int_post_id = get_the_id(); - // contains the index for the next footnote on this page - $l_int_FootnoteIndex = count(self::$a_arr_Footnotes) + 1; + // Contains the index for the next footnote on this page. + $l_int_footnote_index = count( self::$a_arr_footnotes ) + 1; - // contains the starting position for the lookup of a footnote - $l_int_PosStart = 0; + // Contains the starting position for the lookup of a footnote. + $l_int_pos_start = 0; - // get start and end tag for the footnotes short code - $l_str_StartingTag = MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_STR_FOOTNOTES_SHORT_CODE_START); - $l_str_EndingTag = MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_STR_FOOTNOTES_SHORT_CODE_END); - if ($l_str_StartingTag == "userdefined" || $l_str_EndingTag == "userdefined") { - $l_str_StartingTag = MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_STR_FOOTNOTES_SHORT_CODE_START_USER_DEFINED); - $l_str_EndingTag = MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_STR_FOOTNOTES_SHORT_CODE_END_USER_DEFINED); + // Get start and end tag for the footnotes short code. + $l_str_starting_tag = MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_FOOTNOTES_SHORT_CODE_START ); + $l_str_ending_tag = MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_FOOTNOTES_SHORT_CODE_END ); + if ( 'userdefined' === $l_str_starting_tag || 'userdefined' === $l_str_ending_tag ) { + $l_str_starting_tag = MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_FOOTNOTES_SHORT_CODE_START_USER_DEFINED ); + $l_str_ending_tag = MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_FOOTNOTES_SHORT_CODE_END_USER_DEFINED ); } - // decode html special chars - if ($p_bool_ConvertHtmlChars) { - $l_str_StartingTag = htmlspecialchars($l_str_StartingTag); - $l_str_EndingTag = htmlspecialchars($l_str_EndingTag); + // Decode html special chars. + if ( $p_bool_convert_html_chars ) { + $l_str_starting_tag = htmlspecialchars( $l_str_starting_tag ); + $l_str_ending_tag = htmlspecialchars( $l_str_ending_tag ); } - // if footnotes short code is empty, return the content without changes - if (empty($l_str_StartingTag) || empty($l_str_EndingTag)) { - return $p_str_Content; + // If footnotes short code is empty, return the content without changes. + if ( empty( $l_str_starting_tag ) || empty( $l_str_ending_tag ) ) { + return $p_str_content; } /** - * Footnote delimiter syntax validation + * Footnote delimiter syntax validation. * * - Adding: Footnote delimiters: syntax validation for balanced footnote start and end tag short codes. * @@ -1219,74 +1318,74 @@ class MCI_Footnotes_Task { * If footnotes short codes are unbalanced, and syntax validation is not disabled, * prepend a warning to the content; displays de facto beneath the post title. */ - if (MCI_Footnotes_Convert::toBool(MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_BOOL_FOOTNOTE_SHORTCODE_SYNTAX_VALIDATION_ENABLE))) { + if ( MCI_Footnotes_Convert::to_bool( MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_FOOTNOTE_SHORTCODE_SYNTAX_VALIDATION_ENABLE ) ) ) { - // make shortcodes conform to regex syntax: - $l_str_StartTagRegex = preg_replace( '#([\(\)\{\}\[\]\*\.\?\!])#', '\\\\$1', $l_str_StartingTag ); - $l_str_EndTagRegex = preg_replace( '#([\(\)\{\}\[\]\*\.\?\!])#', '\\\\$1', $l_str_EndingTag ); + // Make shortcodes conform to regex syntax. + $l_str_start_tag_regex = preg_replace( '#([\(\)\{\}\[\]\*\.\?\!])#', '\\\\$1', $l_str_starting_tag ); + $l_str_end_tag_regex = preg_replace( '#([\(\)\{\}\[\]\*\.\?\!])#', '\\\\$1', $l_str_ending_tag ); - // apply different regex depending on whether start shortcode is double/triple opening parenthesis: - if ( $l_str_StartingTag == '((' || $l_str_StartingTag == '(((' ) { + // Apply different regex depending on whether start shortcode is double/triple opening parenthesis. + if ( '((' === $l_str_starting_tag || '(((' === $l_str_starting_tag ) { - // this prevents from catching a script containing e.g. a double opening parenthesis: - $l_str_ValidationRegex = '#' . $l_str_StartTagRegex . '(((?!' . $l_str_EndTagRegex . ')[^\{\}])*?)(' . $l_str_StartTagRegex . '|$)#s'; + // This prevents from catching a script containing e.g. a double opening parenthesis. + $l_str_validation_regex = '#' . $l_str_start_tag_regex . '(((?!' . $l_str_end_tag_regex . ')[^\{\}])*?)(' . $l_str_start_tag_regex . '|$)#s'; } else { - // catch all only if the start shortcode is not double/triple opening parenthesis, i.e. is unlikely to occur in scripts: - $l_str_ValidationRegex = '#' . $l_str_StartTagRegex . '(((?!' . $l_str_EndTagRegex . ').)*?)(' . $l_str_StartTagRegex . '|$)#s'; + // Catch all only if the start shortcode is not double/triple opening parenthesis, i.e. is unlikely to occur in scripts. + $l_str_validation_regex = '#' . $l_str_start_tag_regex . '(((?!' . $l_str_end_tag_regex . ').)*?)(' . $l_str_start_tag_regex . '|$)#s'; } - // check syntax and get error locations: - preg_match( $l_str_ValidationRegex, $p_str_Content, $p_arr_ErrorLocation ); - if ( empty( $p_arr_ErrorLocation ) ) { - self::$a_bool_SyntaxErrorFlag = false; + // Check syntax and get error locations. + preg_match( $l_str_validation_regex, $p_str_content, $p_arr_error_location ); + if ( empty( $p_arr_error_location ) ) { + self::$a_bool_syntax_error_flag = false; } - // prevent generating and inserting the warning multiple times: - if ( self::$a_bool_SyntaxErrorFlag ) { + // Prevent generating and inserting the warning multiple times. + if ( self::$a_bool_syntax_error_flag ) { - // get plain text string for error location: - $l_str_ErrorSpotString = strip_tags( $p_arr_ErrorLocation[1] ); + // Get plain text string for error location. + $l_str_error_spot_string = wp_strip_all_tags( $p_arr_error_location[1] ); - // limit string length to 300 characters: - if ( strlen( $l_str_ErrorSpotString ) > 300 ) { - $l_str_ErrorSpotString = substr( $l_str_ErrorSpotString, 0, 299 ) . '…'; + // Limit string length to 300 characters. + if ( strlen( $l_str_error_spot_string ) > 300 ) { + $l_str_error_spot_string = substr( $l_str_error_spot_string, 0, 299 ) . '…'; } - // compose warning box: - $l_str_SyntaxErrorWarning = '

'; - $l_str_SyntaxErrorWarning .= __("WARNING: unbalanced footnote start tag short code found.", MCI_Footnotes_Config::C_STR_PLUGIN_NAME); - $l_str_SyntaxErrorWarning .= '

'; + // Compose warning box. + $l_str_syntax_error_warning = '

'; + $l_str_syntax_error_warning .= __( 'WARNING: unbalanced footnote start tag short code found.', 'footnotes' ); + $l_str_syntax_error_warning .= '

'; - // syntax validation setting in the dashboard under the General settings tab: - $l_str_SyntaxErrorWarning .= sprintf( __("If this warning is irrelevant, please disable the syntax validation feature in the dashboard under %s > %s > %s.", MCI_Footnotes_Config::C_STR_PLUGIN_NAME), __("General settings", MCI_Footnotes_Config::C_STR_PLUGIN_NAME), __("Footnote start and end short codes", MCI_Footnotes_Config::C_STR_PLUGIN_NAME), __("Check for balanced shortcodes", MCI_Footnotes_Config::C_STR_PLUGIN_NAME) ); + // Syntax validation setting in the dashboard under the General settings tab. + /* Translators: 1: General Settings 2: Footnote start and end short codes 3: Check for balanced shortcodes */ + $l_str_syntax_error_warning .= sprintf( __( 'If this warning is irrelevant, please disable the syntax validation feature in the dashboard under %1$s > %2$s > %3$s.', 'footnotes' ), __( 'General settings', 'footnotes' ), __( 'Footnote start and end short codes', 'footnotes' ), __( 'Check for balanced shortcodes', 'footnotes' ) ); - $l_str_SyntaxErrorWarning .= '

'; - $l_str_SyntaxErrorWarning .= __("Unbalanced start tag short code found before:", MCI_Footnotes_Config::C_STR_PLUGIN_NAME); - $l_str_SyntaxErrorWarning .= '

“'; - $l_str_SyntaxErrorWarning .= $l_str_ErrorSpotString; - $l_str_SyntaxErrorWarning .= '”

'; + $l_str_syntax_error_warning .= '

'; + $l_str_syntax_error_warning .= __( 'Unbalanced start tag short code found before:', 'footnotes' ); + $l_str_syntax_error_warning .= '

“'; + $l_str_syntax_error_warning .= $l_str_error_spot_string; + $l_str_syntax_error_warning .= '”

'; - // prepend the warning box to the content: - $p_str_Content = $l_str_SyntaxErrorWarning . $p_str_Content; + // Prepend the warning box to the content. + $p_str_content = $l_str_syntax_error_warning . $p_str_content; - // checked, set flag to false to prevent duplicate warning: - self::$a_bool_SyntaxErrorFlag = false; + // Checked, set flag to false to prevent duplicate warning. + self::$a_bool_syntax_error_flag = false; - return $p_str_Content; + return $p_str_content; } } + // Load referrer templates if footnotes text not hidden. + if ( ! $p_bool_hide_footnotes_text ) { - // load referrer templates if footnotes text not hidden: - if (!$p_bool_HideFootnotesText) { - - // load footnote referrer template file: - if (self::$a_bool_AlternativeTooltipsEnabled) { - $l_obj_Template = new MCI_Footnotes_Template(MCI_Footnotes_Template::C_STR_PUBLIC, "footnote-alternative"); + // Load footnote referrer template file. + if ( self::$a_bool_alternative_tooltips_enabled ) { + $l_obj_template = new MCI_Footnotes_Template( MCI_Footnotes_Template::C_STR_PUBLIC, 'footnote-alternative' ); } else { - $l_obj_Template = new MCI_Footnotes_Template(MCI_Footnotes_Template::C_STR_PUBLIC, "footnote"); + $l_obj_template = new MCI_Footnotes_Template( MCI_Footnotes_Template::C_STR_PUBLIC, 'footnote' ); } /** @@ -1295,56 +1394,57 @@ class MCI_Footnotes_Task { * - Bugfix: Tooltips: fix display in Popup Maker popups by correcting a coding error. * * @since 2.5.4 - * @see self::add_filter('pum_popup_content', array($this, "the_content"), $l_int_TheContentPriority) + * @see self::add_filter('pum_popup_content', array($this, "the_content"), $l_int_the_content_priority) */ - self::$a_bool_TooltipsEnabled = MCI_Footnotes_Convert::toBool(MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_BOOL_FOOTNOTES_MOUSE_OVER_BOX_ENABLED)); - self::$a_bool_AlternativeTooltipsEnabled = MCI_Footnotes_Convert::toBool(MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_BOOL_FOOTNOTES_MOUSE_OVER_BOX_ALTERNATIVE)); + self::$a_bool_tooltips_enabled = MCI_Footnotes_Convert::to_bool( MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_FOOTNOTES_MOUSE_OVER_BOX_ENABLED ) ); + self::$a_bool_alternative_tooltips_enabled = MCI_Footnotes_Convert::to_bool( MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_FOOTNOTES_MOUSE_OVER_BOX_ALTERNATIVE ) ); - // load tooltip inline script if jQuery tooltips are enabled: - if (self::$a_bool_TooltipsEnabled && ! self::$a_bool_AlternativeTooltipsEnabled) { - $l_obj_TemplateTooltip = new MCI_Footnotes_Template(MCI_Footnotes_Template::C_STR_PUBLIC, "tooltip"); + // Load tooltip inline script if jQuery tooltips are enabled. + if ( self::$a_bool_tooltips_enabled && ! self::$a_bool_alternative_tooltips_enabled ) { + $l_obj_template_tooltip = new MCI_Footnotes_Template( MCI_Footnotes_Template::C_STR_PUBLIC, 'tooltip' ); } - } else { - $l_obj_Template = null; - $l_obj_TemplateTooltip = null; + $l_obj_template = null; + $l_obj_template_tooltip = null; } - // search footnotes short codes in the content + // Search footnotes short codes in the content. do { - // get first occurrence of the footnote start tag short code: - $i_int_LenContent = strlen($p_str_Content); - if ($l_int_PosStart > $i_int_LenContent) $l_int_PosStart = $i_int_LenContent; - $l_int_PosStart = strpos($p_str_Content, $l_str_StartingTag, $l_int_PosStart); - // no short code found, stop here - if ($l_int_PosStart === false) { + // Get first occurrence of the footnote start tag short code. + $i_int_len_content = strlen( $p_str_content ); + if ( $l_int_pos_start > $i_int_len_content ) { + $l_int_pos_start = $i_int_len_content; + } + $l_int_pos_start = strpos( $p_str_content, $l_str_starting_tag, $l_int_pos_start ); + // No short code found, stop here. + if ( ! $l_int_pos_start ) { break; } - // get first occurrence of the footnote end tag short code: - $l_int_PosEnd = strpos($p_str_Content, $l_str_EndingTag, $l_int_PosStart); - // no short code found, stop here - if ($l_int_PosEnd === false) { + // Get first occurrence of the footnote end tag short code. + $l_int_pos_end = strpos( $p_str_content, $l_str_ending_tag, $l_int_pos_start ); + // No short code found, stop here. + if ( ! $l_int_pos_end ) { break; } - // calculate the length of the footnote - $l_int_Length = $l_int_PosEnd - $l_int_PosStart; + // Calculate the length of the footnote. + $l_int_length = $l_int_pos_end - $l_int_pos_start; - // get footnote text - $l_str_FootnoteText = substr($p_str_Content, $l_int_PosStart + strlen($l_str_StartingTag), $l_int_Length - strlen($l_str_StartingTag)); + // Get footnote text. + $l_str_footnote_text = substr( $p_str_content, $l_int_pos_start + strlen( $l_str_starting_tag ), $l_int_length - strlen( $l_str_starting_tag ) ); - // get tooltip text if present: - self::$a_str_TooltipShortcode = MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_STR_FOOTNOTES_TOOLTIP_EXCERPT_DELIMITER); - self::$a_int_TooltipShortcodeLength = strlen( self::$a_str_TooltipShortcode ); - $l_int_TooltipTextLength = strpos( $l_str_FootnoteText, self::$a_str_TooltipShortcode ); - $l_bool_HasTooltipText = $l_int_TooltipTextLength === false ? false : true; - if ( $l_bool_HasTooltipText ) { - $l_str_TooltipText = substr( $l_str_FootnoteText, 0, $l_int_TooltipTextLength ); + // Get tooltip text if present. + self::$a_str_tooltip_shortcode = MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_FOOTNOTES_TOOLTIP_EXCERPT_DELIMITER ); + self::$a_int_tooltip_shortcode_length = strlen( self::$a_str_tooltip_shortcode ); + $l_int_tooltip_text_length = strpos( $l_str_footnote_text, self::$a_str_tooltip_shortcode ); + $l_bool_has_tooltip_text = ! $l_int_tooltip_text_length ? false : true; + if ( $l_bool_has_tooltip_text ) { + $l_str_tooltip_text = substr( $l_str_footnote_text, 0, $l_int_tooltip_text_length ); } else { - $l_str_TooltipText = ''; + $l_str_tooltip_text = ''; } /** - * URL line wrapping for Unicode non conformant browsers + * URL line wrapping for Unicode non conformant browsers. * * @since 2.1.1 (CSS) * @since 2.1.4 (PHP) @@ -1437,7 +1537,6 @@ class MCI_Footnotes_Task { * @reporter @bernardzit * @link https://wordpress.org/support/topic/footnotes-dont-show-after-update-to-2-2-6/#post-13826029 * - * * @since 2.2.8 Bugfix: Reference container, tooltips: URL wrap: correctly make the quotation mark optional wrt query parameters, thanks to @spiralofhope2 bug report. * @date 2020-12-23T1107+0100 * @@ -1478,48 +1577,48 @@ class MCI_Footnotes_Task { * Note: The WordPress blog engine edits these values, cropping these leading/trailing spaces. * But given they can occur on WP-powered websites, some page builders may probably not. */ - if ( MCI_Footnotes_Convert::toBool( MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_BOOL_FOOTNOTE_URL_WRAP_ENABLED ) ) ) { + if ( MCI_Footnotes_Convert::to_bool( MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_FOOTNOTE_URL_WRAP_ENABLED ) ) ) { - $l_str_FootnoteText = preg_replace( + $l_str_footnote_text = preg_replace( '#(?$1', - $l_str_FootnoteText + $l_str_footnote_text ); } - // Text to be displayed instead of the footnote - $l_str_FootnoteReplaceText = ""; + // Text to be displayed instead of the footnote. + $l_str_footnote_replace_text = ''; - // whether hard links are enabled: - if (self::$a_bool_HardLinksEnable) { + // Whether hard links are enabled. + if ( self::$a_bool_hard_links_enable ) { - // get the configurable parts: - self::$a_str_ReferrerLinkSlug = MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_STR_REFERRER_FRAGMENT_ID_SLUG); - self::$a_str_FootnoteLinkSlug = MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_STR_FOOTNOTE_FRAGMENT_ID_SLUG); - self::$a_str_LinkIdsSeparator = MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_STR_HARD_LINK_IDS_SEPARATOR); + // Get the configurable parts. + self::$a_str_referrer_link_slug = MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_REFERRER_FRAGMENT_ID_SLUG ); + self::$a_str_footnote_link_slug = MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_FOOTNOTE_FRAGMENT_ID_SLUG ); + self::$a_str_link_ids_separator = MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_HARD_LINK_IDS_SEPARATOR ); - // streamline ID concatenation: - self::$a_str_PostContainerIdCompound = self::$a_str_LinkIdsSeparator; - self::$a_str_PostContainerIdCompound .= self::$a_int_PostId; - self::$a_str_PostContainerIdCompound .= self::$a_str_LinkIdsSeparator; - self::$a_str_PostContainerIdCompound .= self::$a_int_ReferenceContainerId; - self::$a_str_PostContainerIdCompound .= self::$a_str_LinkIdsSeparator; + // Streamline ID concatenation. + self::$a_str_post_container_id_compound = self::$a_str_link_ids_separator; + self::$a_str_post_container_id_compound .= self::$a_int_post_id; + self::$a_str_post_container_id_compound .= self::$a_str_link_ids_separator; + self::$a_str_post_container_id_compound .= self::$a_int_reference_container_id; + self::$a_str_post_container_id_compound .= self::$a_str_link_ids_separator; } - // display the footnote referrers and the tooltips: - if (!$p_bool_HideFootnotesText) { - $l_int_Index = MCI_Footnotes_Convert::Index($l_int_FootnoteIndex, MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_STR_FOOTNOTES_COUNTER_STYLE)); + // Display the footnote referrers and the tooltips. + if ( ! $p_bool_hide_footnotes_text ) { + $l_int_index = MCI_Footnotes_Convert::index( $l_int_footnote_index, MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_FOOTNOTES_COUNTER_STYLE ) ); - // display only a truncated footnote text if option enabled: - $l_bool_EnableExcerpt = MCI_Footnotes_Convert::toBool(MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_BOOL_FOOTNOTES_MOUSE_OVER_BOX_EXCERPT_ENABLED)); - $l_int_MaxLength = intval(MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_INT_FOOTNOTES_MOUSE_OVER_BOX_EXCERPT_LENGTH)); + // Display only a truncated footnote text if option enabled. + $l_bool_enable_excerpt = MCI_Footnotes_Convert::to_bool( MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_FOOTNOTES_MOUSE_OVER_BOX_EXCERPT_ENABLED ) ); + $l_int_max_length = intval( MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_INT_FOOTNOTES_MOUSE_OVER_BOX_EXCERPT_LENGTH ) ); - // define excerpt text as footnote text by default: - $l_str_ExcerptText = $l_str_FootnoteText; + // Define excerpt text as footnote text by default. + $l_str_excerpt_text = $l_str_footnote_text; /** - * Tooltip truncation + * Tooltip truncation. * * - Adding: Tooltips: Read-on button: Label: configurable instead of localizable, thanks to @rovanov example provision. * @@ -1534,34 +1633,34 @@ class MCI_Footnotes_Task { * This is equivalent to the WordPress default excerpt generation, i.e. without a * custom excerpt and without a delimiter. But WordPress does word count, usually 55. */ - if (self::$a_bool_TooltipsEnabled && $l_bool_EnableExcerpt) { - $l_str_DummyText = strip_tags($l_str_FootnoteText); - if (is_int($l_int_MaxLength) && strlen($l_str_DummyText) > $l_int_MaxLength) { - $l_str_ExcerptText = substr($l_str_DummyText, 0, $l_int_MaxLength); - $l_str_ExcerptText = substr($l_str_ExcerptText, 0, strrpos($l_str_ExcerptText, ' ')); - $l_str_ExcerptText .= ' … <'; - $l_str_ExcerptText .= self::$a_bool_HardLinksEnable ? 'a' : 'span'; - $l_str_ExcerptText .= ' class="footnote_tooltip_continue" '; - $l_str_ExcerptText .= 'onclick="footnote_moveToAnchor_' . self::$a_int_PostId; - $l_str_ExcerptText .= '_' . self::$a_int_ReferenceContainerId; - $l_str_ExcerptText .= '(\'footnote_plugin_reference_' . self::$a_int_PostId; - $l_str_ExcerptText .= '_' . self::$a_int_ReferenceContainerId; - $l_str_ExcerptText .= "_$l_int_Index');\""; + if ( self::$a_bool_tooltips_enabled && $l_bool_enable_excerpt ) { + $l_str_dummy_text = wp_strip_all_tags( $l_str_footnote_text ); + if ( is_int( $l_int_max_length ) && strlen( $l_str_dummy_text ) > $l_int_max_length ) { + $l_str_excerpt_text = substr( $l_str_dummy_text, 0, $l_int_max_length ); + $l_str_excerpt_text = substr( $l_str_excerpt_text, 0, strrpos( $l_str_excerpt_text, ' ' ) ); + $l_str_excerpt_text .= ' … <'; + $l_str_excerpt_text .= self::$a_bool_hard_links_enable ? 'a' : 'span'; + $l_str_excerpt_text .= ' class="footnote_tooltip_continue" '; + $l_str_excerpt_text .= 'onclick="footnote_move_to_anchor_' . self::$a_int_post_id; + $l_str_excerpt_text .= '_' . self::$a_int_reference_container_id; + $l_str_excerpt_text .= '(\'footnote_plugin_reference_' . self::$a_int_post_id; + $l_str_excerpt_text .= '_' . self::$a_int_reference_container_id; + $l_str_excerpt_text .= "_$l_int_index');\""; - // if enabled, add the hard link fragment ID: - if (self::$a_bool_HardLinksEnable) { + // If enabled, add the hard link fragment ID. + if ( self::$a_bool_hard_links_enable ) { - $l_str_ExcerptText .= ' href="#'; - $l_str_ExcerptText .= self::$a_str_FootnoteLinkSlug; - $l_str_ExcerptText .= self::$a_str_PostContainerIdCompound; - $l_str_ExcerptText .= $l_int_Index; - $l_str_ExcerptText .= '"'; + $l_str_excerpt_text .= ' href="#'; + $l_str_excerpt_text .= self::$a_str_footnote_link_slug; + $l_str_excerpt_text .= self::$a_str_post_container_id_compound; + $l_str_excerpt_text .= $l_int_index; + $l_str_excerpt_text .= '"'; } - $l_str_ExcerptText .= '>'; + $l_str_excerpt_text .= '>'; /** - * Configurable read-on button label + * Configurable read-on button label. * * - Adding: Tooltips: Read-on button: Label: configurable instead of localizable, thanks to @rovanov example provision. * @@ -1571,55 +1670,56 @@ class MCI_Footnotes_Task { * @reporter @rovanov * @link https://wordpress.org/support/topic/offset-x-axis-and-offset-y-axis-does-not-working/ */ - $l_str_ExcerptText .= MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_STR_FOOTNOTES_TOOLTIP_READON_LABEL); + $l_str_excerpt_text .= MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_FOOTNOTES_TOOLTIP_READON_LABEL ); - $l_str_ExcerptText .= self::$a_bool_HardLinksEnable ? '' : ''; + $l_str_excerpt_text .= self::$a_bool_hard_links_enable ? '' : ''; } } /** - * Referrers element superscript or baseline + * Referrers element superscript or baseline. * * Referrers: new setting for vertical align: superscript (default) or baseline (optional), thanks to @cwbayer bug report + * * @since 2.1.1 * * @reporter @cwbayer * @link https://wordpress.org/support/topic/footnote-number-in-text-superscript-disrupts-leading/ * - * define the HTML element to use for the referrers: + * define the HTML element to use for the referrers. */ - if (MCI_Footnotes_Convert::toBool(MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_BOOL_FOOTNOTES_REFERRER_SUPERSCRIPT_TAGS))) { + if ( MCI_Footnotes_Convert::to_bool( MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_FOOTNOTES_REFERRER_SUPERSCRIPT_TAGS ) ) ) { - $l_str_SupSpan = 'sup'; + $l_str_sup_span = 'sup'; } else { - $l_str_SupSpan = 'span'; + $l_str_sup_span = 'span'; } - // whether hard links are enabled: - if (self::$a_bool_HardLinksEnable) { + // Whether hard links are enabled. + if ( self::$a_bool_hard_links_enable ) { - self::$a_str_LinkSpan = 'a'; - self::$a_str_LinkCloseTag = ''; - // self::$a_str_LinkOpenTag will be defined as needed + self::$a_str_link_span = 'a'; + self::$a_str_link_close_tag = ''; + // Self::$a_str_link_open_tag will be defined as needed. - // compose hyperlink address (leading space is in template): - $l_str_FootnoteLinkArgument = 'href="#'; - $l_str_FootnoteLinkArgument .= self::$a_str_FootnoteLinkSlug; - $l_str_FootnoteLinkArgument .= self::$a_str_PostContainerIdCompound; - $l_str_FootnoteLinkArgument .= $l_int_Index; - $l_str_FootnoteLinkArgument .= '" class="footnote_hard_link"'; + // Compose hyperlink address (leading space is in template). + $l_str_footnote_link_argument = 'href="#'; + $l_str_footnote_link_argument .= self::$a_str_footnote_link_slug; + $l_str_footnote_link_argument .= self::$a_str_post_container_id_compound; + $l_str_footnote_link_argument .= $l_int_index; + $l_str_footnote_link_argument .= '" class="footnote_hard_link"'; /** * Compose fragment ID anchor with offset, for use in reference container. * Empty span, child of empty span, to avoid tall dotted rectangles in browser. */ - $l_str_ReferrerAnchorElement = ''; + $l_str_referrer_anchor_element = ''; } else { @@ -1636,101 +1736,101 @@ class MCI_Footnotes_Task { * * If no hyperlink nor offset anchor is needed, initialize as empty. */ - $l_str_FootnoteLinkArgument = ''; - $l_str_ReferrerAnchorElement = ''; + $l_str_footnote_link_argument = ''; + $l_str_referrer_anchor_element = ''; - // The link element is set independently as it may be needed for styling: - if ( MCI_Footnotes_Convert::toBool(MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_BOOL_LINK_ELEMENT_ENABLED)) ) { + // The link element is set independently as it may be needed for styling. + if ( MCI_Footnotes_Convert::to_bool( MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_LINK_ELEMENT_ENABLED ) ) ) { - self::$a_str_LinkSpan = 'a'; - self::$a_str_LinkOpenTag = ''; - self::$a_str_LinkCloseTag = ''; + self::$a_str_link_span = 'a'; + self::$a_str_link_open_tag = ''; + self::$a_str_link_close_tag = ''; } } - // determine tooltip content: - if ( self::$a_bool_TooltipsEnabled ) { - $l_str_TooltipContent = $l_bool_HasTooltipText ? $l_str_TooltipText : $l_str_ExcerptText; + // Determine tooltip content. + if ( self::$a_bool_tooltips_enabled ) { + $l_str_tooltip_content = $l_bool_has_tooltip_text ? $l_str_tooltip_text : $l_str_excerpt_text; } else { - $l_str_TooltipContent = ''; + $l_str_tooltip_content = ''; } - + /** * Determine shrink width if alternative tooltips are enabled. - * + * * @since 2.5.6 */ - $l_str_TooltipStyle = ''; - if ( self::$a_bool_AlternativeTooltipsEnabled && self::$a_bool_TooltipsEnabled ) { - $l_int_TooltipLength = strlen( strip_tags( $l_str_TooltipContent ) ); - if ( $l_int_TooltipLength < 70 ) { - $l_str_TooltipStyle = ' style="width: '; - $l_str_TooltipStyle .= ( $l_int_TooltipLength * .7 ); - $l_str_TooltipStyle .= 'em;"'; + $l_str_tooltip_style = ''; + if ( self::$a_bool_alternative_tooltips_enabled && self::$a_bool_tooltips_enabled ) { + $l_int_tooltip_length = strlen( wp_strip_all_tags( $l_str_tooltip_content ) ); + if ( $l_int_tooltip_length < 70 ) { + $l_str_tooltip_style = ' style="width: '; + $l_str_tooltip_style .= ( $l_int_tooltip_length * .7 ); + $l_str_tooltip_style .= 'em;"'; } } - // fill in 'templates/public/footnote.html': - $l_obj_Template->replace( + // Fill in 'templates/public/footnote.html'. + $l_obj_template->replace( array( - "link-span" => self::$a_str_LinkSpan, - "post_id" => self::$a_int_PostId, - "container_id" => self::$a_int_ReferenceContainerId, - "note_id" => $l_int_Index, - "hard-link" => $l_str_FootnoteLinkArgument, - "sup-span" => $l_str_SupSpan, - "before" => MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_STR_FOOTNOTES_STYLING_BEFORE), - "index" => $l_int_Index, - "after" => MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_STR_FOOTNOTES_STYLING_AFTER), - "anchor-element" => $l_str_ReferrerAnchorElement, - "style" => $l_str_TooltipStyle, - "text" => $l_str_TooltipContent, + 'link-span' => self::$a_str_link_span, + 'post_id' => self::$a_int_post_id, + 'container_id' => self::$a_int_reference_container_id, + 'note_id' => $l_int_index, + 'hard-link' => $l_str_footnote_link_argument, + 'sup-span' => $l_str_sup_span, + 'before' => MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_FOOTNOTES_STYLING_BEFORE ), + 'index' => $l_int_index, + 'after' => MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_FOOTNOTES_STYLING_AFTER ), + 'anchor-element' => $l_str_referrer_anchor_element, + 'style' => $l_str_tooltip_style, + 'text' => $l_str_tooltip_content, ) ); - $l_str_FootnoteReplaceText = $l_obj_Template->getContent(); + $l_str_footnote_replace_text = $l_obj_template->get_content(); - // reset the template - $l_obj_Template->reload(); + // Reset the template. + $l_obj_template->reload(); - // if standard tooltips are enabled but alternative are not: - if (self::$a_bool_TooltipsEnabled && ! self::$a_bool_AlternativeTooltipsEnabled) { + // If standard tooltips are enabled but alternative are not. + if ( self::$a_bool_tooltips_enabled && ! self::$a_bool_alternative_tooltips_enabled ) { - $l_int_OffsetY = intval(MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_INT_FOOTNOTES_MOUSE_OVER_BOX_OFFSET_Y)); - $l_int_OffsetX = intval(MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_INT_FOOTNOTES_MOUSE_OVER_BOX_OFFSET_X)); - $l_int_FadeInDelay = intval(MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_INT_MOUSE_OVER_BOX_FADE_IN_DELAY )); - $l_int_FadeInDuration = intval(MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_INT_MOUSE_OVER_BOX_FADE_IN_DURATION )); - $l_int_FadeOutDelay = intval(MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_INT_MOUSE_OVER_BOX_FADE_OUT_DELAY )); - $l_int_FadeOutDuration = intval(MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_INT_MOUSE_OVER_BOX_FADE_OUT_DURATION)); + $l_int_offset_y = intval( MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_INT_FOOTNOTES_MOUSE_OVER_BOX_OFFSET_Y ) ); + $l_int_offset_x = intval( MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_INT_FOOTNOTES_MOUSE_OVER_BOX_OFFSET_X ) ); + $l_int_fade_in_delay = intval( MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_INT_MOUSE_OVER_BOX_FADE_IN_DELAY ) ); + $l_int_fade_in_duration = intval( MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_INT_MOUSE_OVER_BOX_FADE_IN_DURATION ) ); + $l_int_fade_out_delay = intval( MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_INT_MOUSE_OVER_BOX_FADE_OUT_DELAY ) ); + $l_int_fade_out_duration = intval( MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_INT_MOUSE_OVER_BOX_FADE_OUT_DURATION ) ); - // fill in 'templates/public/tooltip.html': - $l_obj_TemplateTooltip->replace( + // Fill in 'templates/public/tooltip.html'. + $l_obj_template_tooltip->replace( array( - "post_id" => self::$a_int_PostId, - "container_id" => self::$a_int_ReferenceContainerId, - "note_id" => $l_int_Index, - "position" => MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_STR_FOOTNOTES_MOUSE_OVER_BOX_POSITION), - "offset-y" => !empty($l_int_OffsetY) ? $l_int_OffsetY : 0, - "offset-x" => !empty($l_int_OffsetX) ? $l_int_OffsetX : 0, - "fade-in-delay" => !empty($l_int_FadeInDelay ) ? $l_int_FadeInDelay : 0, - "fade-in-duration" => !empty($l_int_FadeInDuration ) ? $l_int_FadeInDuration : 0, - "fade-out-delay" => !empty($l_int_FadeOutDelay ) ? $l_int_FadeOutDelay : 0, - "fade-out-duration" => !empty($l_int_FadeOutDuration) ? $l_int_FadeOutDuration : 0, + 'post_id' => self::$a_int_post_id, + 'container_id' => self::$a_int_reference_container_id, + 'note_id' => $l_int_index, + 'position' => MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_FOOTNOTES_MOUSE_OVER_BOX_POSITION ), + 'offset-y' => ! empty( $l_int_offset_y ) ? $l_int_offset_y : 0, + 'offset-x' => ! empty( $l_int_offset_x ) ? $l_int_offset_x : 0, + 'fade-in-delay' => ! empty( $l_int_fade_in_delay ) ? $l_int_fade_in_delay : 0, + 'fade-in-duration' => ! empty( $l_int_fade_in_duration ) ? $l_int_fade_in_duration : 0, + 'fade-out-delay' => ! empty( $l_int_fade_out_delay ) ? $l_int_fade_out_delay : 0, + 'fade-out-duration' => ! empty( $l_int_fade_out_duration ) ? $l_int_fade_out_duration : 0, ) ); - $l_str_FootnoteReplaceText .= $l_obj_TemplateTooltip->getContent(); - $l_obj_TemplateTooltip->reload(); + $l_str_footnote_replace_text .= $l_obj_template_tooltip->get_content(); + $l_obj_template_tooltip->reload(); } } - // replace the footnote with the template - $p_str_Content = substr_replace($p_str_Content, $l_str_FootnoteReplaceText, $l_int_PosStart, $l_int_Length + strlen($l_str_EndingTag)); + // Replace the footnote with the template. + $p_str_content = substr_replace( $p_str_content, $l_str_footnote_replace_text, $l_int_pos_start, $l_int_length + strlen( $l_str_ending_tag ) ); - // add footnote only if not empty - if (!empty($l_str_FootnoteText)) { - // set footnote to the output box at the end - self::$a_arr_Footnotes[] = $l_str_FootnoteText; - // increase footnote index - $l_int_FootnoteIndex++; + // Add footnote only if not empty. + if ( ! empty( $l_str_footnote_text ) ) { + // Set footnote to the output box at the end. + self::$a_arr_footnotes[] = $l_str_footnote_text; + // Increase footnote index. + $l_int_footnote_index++; } /** @@ -1765,19 +1865,18 @@ class MCI_Footnotes_Task { * footnote, the length of the first footnote and the length of the templates for the * footnote and the tooltip. Moreover, it was causing non-trivial process garbage. */ - // add offset to the new starting position - $l_int_PosStart += $l_int_Length + strlen($l_str_EndingTag); + // Add offset to the new starting position. + $l_int_pos_start += $l_int_length + strlen( $l_str_ending_tag ); - } while (true); + } while ( true ); - // return content - return $p_str_Content; + // Return content. + return $p_str_content; } /** * Generates the reference container. * - * @author Stefan Herndler * @since 1.5.0 * @return string * @@ -1788,16 +1887,15 @@ class MCI_Footnotes_Task { * @since 2.1.1 Bugfix: Referrers, reference container: Combining identical footnotes: fix dead links and ensure referrer-backlink bijectivity, thanks to @happyches bug report. * @since 2.1.1 Bugfix: Reference container: Backlink symbol: make optional, not suggest configuring it to invisible, thanks to @spaceling feedback. */ - public function ReferenceContainer() { + public function reference_container() { - // no footnotes have been replaced on this page: - if (empty(self::$a_arr_Footnotes)) { - return ""; + // No footnotes have been replaced on this page. + if ( empty( self::$a_arr_footnotes ) ) { + return ''; } - /** - * Footnote index backlink symbol + * Footnote index backlink symbol. * * - Bugfix: Reference container: Backlink symbol: make optional, not suggest configuring it to invisible, thanks to @spaceling feedback. * @@ -1806,37 +1904,36 @@ class MCI_Footnotes_Task { * @reporter @spaceling * @link https://wordpress.org/support/topic/change-the-position-5/page/2/#post-13671138 * - * If the backlink symbol is enabled: + * If the backlink symbol is enabled. */ - if (MCI_Footnotes_Convert::toBool(MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_BOOL_REFERENCE_CONTAINER_BACKLINK_SYMBOL_ENABLE))) { + if ( MCI_Footnotes_Convert::to_bool( MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_REFERENCE_CONTAINER_BACKLINK_SYMBOL_ENABLE ) ) ) { - // get html arrow - $l_str_Arrow = MCI_Footnotes_Convert::getArrow(MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_STR_HYPERLINK_ARROW)); - // set html arrow to the first one if invalid index defined - if (is_array($l_str_Arrow)) { - $l_str_Arrow = MCI_Footnotes_Convert::getArrow(0); + // Get html arrow. + $l_str_arrow = MCI_Footnotes_Convert::get_arrow( MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_HYPERLINK_ARROW ) ); + // Set html arrow to the first one if invalid index defined. + if ( is_array( $l_str_arrow ) ) { + $l_str_arrow = MCI_Footnotes_Convert::get_arrow( 0 ); } - // get user defined arrow - $l_str_ArrowUserDefined = MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_STR_HYPERLINK_ARROW_USER_DEFINED); - if (!empty($l_str_ArrowUserDefined)) { - $l_str_Arrow = $l_str_ArrowUserDefined; + // Get user defined arrow. + $l_str_arrow_user_defined = MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_HYPERLINK_ARROW_USER_DEFINED ); + if ( ! empty( $l_str_arrow_user_defined ) ) { + $l_str_arrow = $l_str_arrow_user_defined; } - // wrap the arrow in a @media print { display:hidden } span: - $l_str_FootnoteArrow = ''; - $l_str_FootnoteArrow .= $l_str_Arrow . ''; + // Wrap the arrow in a @media print { display:hidden } span. + $l_str_footnote_arrow = ''; + $l_str_footnote_arrow .= $l_str_arrow . ''; } else { - // If the backlink symbol isn’t enabled, set it to empty: - $l_str_Arrow = ''; - $l_str_FootnoteArrow = ''; + // If the backlink symbol isn’t enabled, set it to empty. + $l_str_arrow = ''; + $l_str_footnote_arrow = ''; } - /** - * Backlink separator + * Backlink separator. * * - Bugfix: Reference container: make separating and terminating punctuation optional and configurable, thanks to @docteurfitness issue report and code contribution. * @@ -1852,59 +1949,69 @@ class MCI_Footnotes_Task { * Initially a comma was appended in this algorithm for enumerations. * The comma in enumerations is not generally preferred. */ - if (MCI_Footnotes_Convert::toBool(MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_BOOL_BACKLINKS_SEPARATOR_ENABLED))) { + if ( MCI_Footnotes_Convert::to_bool( MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_BACKLINKS_SEPARATOR_ENABLED ) ) ) { - // check if it is input-configured: - $l_str_Separator = MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_STR_BACKLINKS_SEPARATOR_CUSTOM); + // Check if it is input-configured. + $l_str_separator = MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_BACKLINKS_SEPARATOR_CUSTOM ); - if (empty($l_str_Separator)) { + if ( empty( $l_str_separator ) ) { - // if it is not, check which option is on: - $l_str_SeparatorOption = MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_STR_BACKLINKS_SEPARATOR_OPTION); - switch ($l_str_SeparatorOption) { - case 'comma' : $l_str_Separator = ','; break; - case 'semicolon': $l_str_Separator = ';'; break; - case 'en_dash' : $l_str_Separator = ' –'; break; + // If it is not, check which option is on. + $l_str_separator_option = MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_BACKLINKS_SEPARATOR_OPTION ); + switch ( $l_str_separator_option ) { + case 'comma': + $l_str_separator = ','; + break; + case 'semicolon': + $l_str_separator = ';'; + break; + case 'en_dash': + $l_str_separator = ' –'; + break; } } - } else { - $l_str_Separator = ''; + $l_str_separator = ''; } /** - * Backlink terminator + * Backlink terminator. * * Initially a dot was appended in the table row template. + * * @since 2.0.6 a dot after footnote numbers is discarded as not localizable; * making it optional was envisaged. - * @since 2.1.4 the terminator is optional, has options, and is configurable: + * @since 2.1.4 the terminator is optional, has options, and is configurable. */ - if (MCI_Footnotes_Convert::toBool(MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_BOOL_BACKLINKS_TERMINATOR_ENABLED))) { + if ( MCI_Footnotes_Convert::to_bool( MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_BACKLINKS_TERMINATOR_ENABLED ) ) ) { - // check if it is input-configured: - $l_str_Terminator = MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_STR_BACKLINKS_TERMINATOR_CUSTOM); + // Check if it is input-configured. + $l_str_terminator = MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_BACKLINKS_TERMINATOR_CUSTOM ); - if (empty($l_str_Terminator)) { + if ( empty( $l_str_terminator ) ) { - // if it is not, check which option is on: - $l_str_TerminatorOption = MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_STR_BACKLINKS_TERMINATOR_OPTION); - switch ($l_str_TerminatorOption) { - case 'period' : $l_str_Terminator = '.'; break; - case 'parenthesis': $l_str_Terminator = ')'; break; - case 'colon' : $l_str_Terminator = ':'; break; + // If it is not, check which option is on. + $l_str_terminator_option = MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_BACKLINKS_TERMINATOR_OPTION ); + switch ( $l_str_terminator_option ) { + case 'period': + $l_str_terminator = '.'; + break; + case 'parenthesis': + $l_str_terminator = ')'; + break; + case 'colon': + $l_str_terminator = ':'; + break; } } - } else { - $l_str_Terminator = ''; + $l_str_terminator = ''; } - /** - * Line breaks + * Line breaks. * * - Bugfix: Reference container: Backlinks: fix stacked enumerations by adding optional line breaks. * @@ -1916,18 +2023,19 @@ class MCI_Footnotes_Task { * Variable number length and proportional character width require explicit line breaks. * Otherwise, an ordinary space character offering a line break opportunity is inserted. */ - $l_str_LineBreak = MCI_Footnotes_Convert::toBool(MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_BOOL_BACKLINKS_LINE_BREAKS_ENABLED)) ? '
' : ' '; + $l_str_line_break = MCI_Footnotes_Convert::to_bool( MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_BACKLINKS_LINE_BREAKS_ENABLED ) ) ? '
' : ' '; /** + * Line breaks for source readability. + * * For maintenance and support, table rows in the reference container should be * separated by an empty line. So we add these line breaks for source readability. - * Before the first table row (breaks between rows are ~200 lines below): + * Before the first table row (breaks between rows are ~200 lines below). */ - $l_str_Body = "\r\n\r\n"; - + $l_str_body = "\r\n\r\n"; /** - * Reference container table row template load + * Reference container table row template load. * * - Bugfix: Reference container: option to restore pre-2.0.0 layout with the backlink symbol in an extra column. * @@ -1935,34 +2043,34 @@ class MCI_Footnotes_Task { * @date 2020-11-16T2024+0100 */ - // when combining identical footnotes is turned on, another template is needed: - if (MCI_Footnotes_Convert::toBool(MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_BOOL_COMBINE_IDENTICAL_FOOTNOTES))) { - // the combining template allows for backlink clusters and supports cell clicking for single notes: - $l_obj_Template = new MCI_Footnotes_Template(MCI_Footnotes_Template::C_STR_PUBLIC, "reference-container-body-combi"); + // When combining identical footnotes is turned on, another template is needed. + if ( MCI_Footnotes_Convert::to_bool( MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_COMBINE_IDENTICAL_FOOTNOTES ) ) ) { + // The combining template allows for backlink clusters and supports cell clicking for single notes. + $l_obj_template = new MCI_Footnotes_Template( MCI_Footnotes_Template::C_STR_PUBLIC, 'reference-container-body-combi' ); } else { - // when 3-column layout is turned on (only available if combining is turned off): - if (MCI_Footnotes_Convert::toBool(MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_BOOL_REFERENCE_CONTAINER_3COLUMN_LAYOUT_ENABLE))) { - $l_obj_Template = new MCI_Footnotes_Template(MCI_Footnotes_Template::C_STR_PUBLIC, "reference-container-body-3column"); + // When 3-column layout is turned on (only available if combining is turned off). + if ( MCI_Footnotes_Convert::to_bool( MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_REFERENCE_CONTAINER_3COLUMN_LAYOUT_ENABLE ) ) ) { + $l_obj_template = new MCI_Footnotes_Template( MCI_Footnotes_Template::C_STR_PUBLIC, 'reference-container-body-3column' ); } else { - // when switch symbol and index is turned on, and combining and 3-columns are off: - if (MCI_Footnotes_Convert::toBool(MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_BOOL_REFERENCE_CONTAINER_BACKLINK_SYMBOL_SWITCH))) { - $l_obj_Template = new MCI_Footnotes_Template(MCI_Footnotes_Template::C_STR_PUBLIC, "reference-container-body-switch"); + // When switch symbol and index is turned on, and combining and 3-columns are off. + if ( MCI_Footnotes_Convert::to_bool( MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_REFERENCE_CONTAINER_BACKLINK_SYMBOL_SWITCH ) ) ) { + $l_obj_template = new MCI_Footnotes_Template( MCI_Footnotes_Template::C_STR_PUBLIC, 'reference-container-body-switch' ); } else { - // default is the standard template: - $l_obj_Template = new MCI_Footnotes_Template(MCI_Footnotes_Template::C_STR_PUBLIC, "reference-container-body"); + // Default is the standard template. + $l_obj_template = new MCI_Footnotes_Template( MCI_Footnotes_Template::C_STR_PUBLIC, 'reference-container-body' ); } } } /** - * Switch backlink symbol and footnote number + * Switch backlink symbol and footnote number. * * - Bugfix: Reference container: option to append symbol (prepended by default), thanks to @spaceling code contribution. * @@ -1978,36 +2086,37 @@ class MCI_Footnotes_Task { * @since 2.1.4 * @date 2020-11-26T1633+0100 */ - $l_bool_SymbolSwitch = MCI_Footnotes_Convert::toBool(MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_BOOL_REFERENCE_CONTAINER_BACKLINK_SYMBOL_SWITCH)); + $l_bool_symbol_switch = MCI_Footnotes_Convert::to_bool( MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_REFERENCE_CONTAINER_BACKLINK_SYMBOL_SWITCH ) ); - // loop through all footnotes found in the page - for ($l_int_Index = 0; $l_int_Index < count(self::$a_arr_Footnotes); $l_int_Index++) { + // Loop through all footnotes found in the page. + $num_footnotes = count( self::$a_arr_footnotes ); + for ( $l_int_index = 0; $l_int_index < $num_footnotes; $l_int_index++ ) { - // get footnote text - $l_str_FootnoteText = self::$a_arr_Footnotes[$l_int_Index]; + // Get footnote text. + $l_str_footnote_text = self::$a_arr_footnotes[ $l_int_index ]; - // if footnote is empty, go to the next one; - // With combine identicals turned on, identicals will be deleted and are skipped: - if (empty($l_str_FootnoteText)) { + // If footnote is empty, go to the next one;. + // With combine identicals turned on, identicals will be deleted and are skipped. + if ( empty( $l_str_footnote_text ) ) { continue; } - // generate content of footnote index cell - $l_int_FirstFootnoteIndex = ($l_int_Index + 1); + // Generate content of footnote index cell. + $l_int_first_footnote_index = ( $l_int_index + 1 ); - // get the footnote index string and - // keep supporting legacy index placeholder: - $l_str_FootnoteId = MCI_Footnotes_Convert::Index(($l_int_Index + 1), MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_STR_FOOTNOTES_COUNTER_STYLE)); + // Get the footnote index string and. + // Keep supporting legacy index placeholder. + $l_str_footnote_id = MCI_Footnotes_Convert::index( ( $l_int_index + 1 ), MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_FOOTNOTES_COUNTER_STYLE ) ); /** - * Case of only one backlink per table row + * Case of only one backlink per table row. * - * If enabled, and for the case the footnote is single, compose hard link: + * If enabled, and for the case the footnote is single, compose hard link. */ - // define anyway: - $l_str_HardLinkAddress = ''; + // Define anyway. + $l_str_hard_link_address = ''; - if (self::$a_bool_HardLinksEnable) { + if ( self::$a_bool_hard_links_enable ) { /** * Use-Backbutton-Hint tooltip, optional and configurable. @@ -2023,43 +2132,42 @@ class MCI_Footnotes_Task { * 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 */ - if ( MCI_Footnotes_Convert::toBool( MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_BOOL_FOOTNOTES_BACKLINK_TOOLTIP_ENABLE ) ) ) { - $l_str_UseBackbuttonHint = ' title="'; - $l_str_UseBackbuttonHint .= MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_STR_FOOTNOTES_BACKLINK_TOOLTIP_TEXT); - $l_str_UseBackbuttonHint .= '"'; + if ( MCI_Footnotes_Convert::to_bool( MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_FOOTNOTES_BACKLINK_TOOLTIP_ENABLE ) ) ) { + $l_str_use_backbutton_hint = ' title="'; + $l_str_use_backbutton_hint .= MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_FOOTNOTES_BACKLINK_TOOLTIP_TEXT ); + $l_str_use_backbutton_hint .= '"'; } else { - $l_str_UseBackbuttonHint = ''; + $l_str_use_backbutton_hint = ''; } /** * Compose fragment ID anchor with offset, for use in reference container. * Empty span, child of empty span, to avoid tall dotted rectangles in browser. */ - $l_str_FootnoteAnchorElement = ''; + $l_str_footnote_anchor_element = ''; - // compose optional hard link address: - $l_str_HardLinkAddress = ' href="#'; - $l_str_HardLinkAddress .= self::$a_str_ReferrerLinkSlug; - $l_str_HardLinkAddress .= self::$a_str_PostContainerIdCompound; - $l_str_HardLinkAddress .= $l_str_FootnoteId . '"'; - $l_str_HardLinkAddress .= $l_str_UseBackbuttonHint; + // Compose optional hard link address. + $l_str_hard_link_address = ' href="#'; + $l_str_hard_link_address .= self::$a_str_referrer_link_slug; + $l_str_hard_link_address .= self::$a_str_post_container_id_compound; + $l_str_hard_link_address .= $l_str_footnote_id . '"'; + $l_str_hard_link_address .= $l_str_use_backbutton_hint; - // compose optional opening link tag with optional hard link, mandatory for instance: - self::$a_str_LinkOpenTag = 'get(MCI_Footnotes_Settings::C_BOOL_COMBINE_IDENTICAL_FOOTNOTES))) { + if ( MCI_Footnotes_Convert::to_bool( MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_COMBINE_IDENTICAL_FOOTNOTES ) ) ) { - // ID, optional hard link address, and class: - $l_str_FootnoteReference = '<' . self::$a_str_LinkSpan; - $l_str_FootnoteReference .= ' id="footnote_plugin_reference_'; - $l_str_FootnoteReference .= self::$a_int_PostId; - $l_str_FootnoteReference .= '_' . self::$a_int_ReferenceContainerId; - $l_str_FootnoteReference .= "_$l_str_FootnoteId\""; - if (self::$a_bool_HardLinksEnable) { - $l_str_FootnoteReference .= ' href="#'; - $l_str_FootnoteReference .= self::$a_str_ReferrerLinkSlug; - $l_str_FootnoteReference .= self::$a_str_PostContainerIdCompound; - $l_str_FootnoteReference .= $l_str_FootnoteId . '"'; - $l_str_FootnoteReference .= $l_str_UseBackbuttonHint; + // ID, optional hard link address, and class. + $l_str_footnote_reference = '<' . self::$a_str_link_span; + $l_str_footnote_reference .= ' id="footnote_plugin_reference_'; + $l_str_footnote_reference .= self::$a_int_post_id; + $l_str_footnote_reference .= '_' . self::$a_int_reference_container_id; + $l_str_footnote_reference .= "_$l_str_footnote_id\""; + if ( self::$a_bool_hard_links_enable ) { + $l_str_footnote_reference .= ' href="#'; + $l_str_footnote_reference .= self::$a_str_referrer_link_slug; + $l_str_footnote_reference .= self::$a_str_post_container_id_compound; + $l_str_footnote_reference .= $l_str_footnote_id . '"'; + $l_str_footnote_reference .= $l_str_use_backbutton_hint; } - $l_str_FootnoteReference .= ' class="footnote_backlink"'; + $l_str_footnote_reference .= ' class="footnote_backlink"'; - // the click event goes in the table cell if footnote remains single: - $l_str_BacklinkEvent = ' onclick="footnote_moveToAnchor_'; - $l_str_BacklinkEvent .= self::$a_int_PostId; - $l_str_BacklinkEvent .= '_' . self::$a_int_ReferenceContainerId; - $l_str_BacklinkEvent .= "('footnote_plugin_tooltip_"; - $l_str_BacklinkEvent .= self::$a_int_PostId; - $l_str_BacklinkEvent .= '_' . self::$a_int_ReferenceContainerId; - $l_str_BacklinkEvent .= "_$l_str_FootnoteId');\""; + // The click event goes in the table cell if footnote remains single. + $l_str_backlink_event = ' onclick="footnote_move_to_anchor_'; + $l_str_backlink_event .= self::$a_int_post_id; + $l_str_backlink_event .= '_' . self::$a_int_reference_container_id; + $l_str_backlink_event .= "('footnote_plugin_tooltip_"; + $l_str_backlink_event .= self::$a_int_post_id; + $l_str_backlink_event .= '_' . self::$a_int_reference_container_id; + $l_str_backlink_event .= "_$l_str_footnote_id');\""; + // The dedicated template enumerating backlinks uses another variable. + $l_str_footnote_backlinks = $l_str_footnote_reference; - // the dedicated template enumerating backlinks uses another variable: - $l_str_FootnoteBacklinks = $l_str_FootnoteReference; + // Append the click event right to the backlink item for enumerations;. + // Else it goes in the table cell. + $l_str_footnote_backlinks .= $l_str_backlink_event . '>'; + $l_str_footnote_reference .= '>'; - // append the click event right to the backlink item for enumerations; - // else it goes in the table cell: - $l_str_FootnoteBacklinks .= $l_str_BacklinkEvent . '>'; - $l_str_FootnoteReference .= '>'; - - // append the optional offset anchor for hard links: - if (self::$a_bool_HardLinksEnable) { - $l_str_FootnoteReference .= $l_str_FootnoteAnchorElement; - $l_str_FootnoteBacklinks .= $l_str_FootnoteAnchorElement; + // Append the optional offset anchor for hard links. + if ( self::$a_bool_hard_links_enable ) { + $l_str_footnote_reference .= $l_str_footnote_anchor_element; + $l_str_footnote_backlinks .= $l_str_footnote_anchor_element; } - // continue both single note and notes cluster, depending on switch option status: - if ($l_bool_SymbolSwitch) { + // Continue both single note and notes cluster, depending on switch option status. + if ( $l_bool_symbol_switch ) { - $l_str_FootnoteReference .= "$l_str_FootnoteId$l_str_FootnoteArrow"; - $l_str_FootnoteBacklinks .= "$l_str_FootnoteId$l_str_FootnoteArrow"; + $l_str_footnote_reference .= "$l_str_footnote_id$l_str_footnote_arrow"; + $l_str_footnote_backlinks .= "$l_str_footnote_id$l_str_footnote_arrow"; } else { - $l_str_FootnoteReference .= "$l_str_FootnoteArrow$l_str_FootnoteId"; - $l_str_FootnoteBacklinks .= "$l_str_FootnoteArrow$l_str_FootnoteId"; + $l_str_footnote_reference .= "$l_str_footnote_arrow$l_str_footnote_id"; + $l_str_footnote_backlinks .= "$l_str_footnote_arrow$l_str_footnote_id"; } - // If that is the only footnote with this text, we’re almost done. + // If that is the only footnote with this text, we’re almost done.. - // check if it isn't the last footnote in the array: - if ($l_int_FirstFootnoteIndex < count(self::$a_arr_Footnotes)) { + // Check if it isn't the last footnote in the array. + if ( $l_int_first_footnote_index < count( self::$a_arr_footnotes ) ) { - // get all footnotes that haven't passed yet: - for ($l_int_CheckIndex = $l_int_FirstFootnoteIndex; $l_int_CheckIndex < count(self::$a_arr_Footnotes); $l_int_CheckIndex++) { + // Get all footnotes that haven't passed yet. + $num_footnotes = count( self::$a_arr_footnotes ); + for ( $l_int_check_index = $l_int_first_footnote_index; $l_int_check_index < $num_footnotes; $l_int_check_index++ ) { - // check if a further footnote is the same as the actual one: - if ($l_str_FootnoteText == self::$a_arr_Footnotes[$l_int_CheckIndex]) { + // Check if a further footnote is the same as the actual one. + if ( self::$a_arr_footnotes[ $l_int_check_index ] === $l_str_footnote_text ) { - // if so, set the further footnote as empty so it won't be displayed later: - self::$a_arr_Footnotes[$l_int_CheckIndex] = ""; + // If so, set the further footnote as empty so it won't be displayed later. + self::$a_arr_footnotes[ $l_int_check_index ] = ''; - // set the flag to true for the combined status: - $l_bool_FlagCombined = true; + // Set the flag to true for the combined status. + $l_bool_flag_combined = true; - // update the footnote ID: - $l_str_FootnoteId = MCI_Footnotes_Convert::Index(($l_int_CheckIndex + 1), MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_STR_FOOTNOTES_COUNTER_STYLE)); + // Update the footnote ID. + $l_str_footnote_id = MCI_Footnotes_Convert::index( ( $l_int_check_index + 1 ), MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_FOOTNOTES_COUNTER_STYLE ) ); - // resume composing the backlinks enumeration: - $l_str_FootnoteBacklinks .= "$l_str_Separator'; - $l_str_FootnoteBacklinks .= $l_str_LineBreak; - $l_str_FootnoteBacklinks .= '<' . self::$a_str_LinkSpan; - $l_str_FootnoteBacklinks .= ' id="footnote_plugin_reference_'; - $l_str_FootnoteBacklinks .= self::$a_int_PostId; - $l_str_FootnoteBacklinks .= '_' . self::$a_int_ReferenceContainerId; - $l_str_FootnoteBacklinks .= "_$l_str_FootnoteId\""; + // Resume composing the backlinks enumeration. + $l_str_footnote_backlinks .= "$l_str_separator'; + $l_str_footnote_backlinks .= $l_str_line_break; + $l_str_footnote_backlinks .= '<' . self::$a_str_link_span; + $l_str_footnote_backlinks .= ' id="footnote_plugin_reference_'; + $l_str_footnote_backlinks .= self::$a_int_post_id; + $l_str_footnote_backlinks .= '_' . self::$a_int_reference_container_id; + $l_str_footnote_backlinks .= "_$l_str_footnote_id\""; - // insert the optional hard link address: - if (self::$a_bool_HardLinksEnable) { - $l_str_FootnoteBacklinks .= ' href="#'; - $l_str_FootnoteBacklinks .= self::$a_str_ReferrerLinkSlug; - $l_str_FootnoteBacklinks .= self::$a_str_PostContainerIdCompound; - $l_str_FootnoteBacklinks .= $l_str_FootnoteId . '"'; - $l_str_FootnoteBacklinks .= $l_str_UseBackbuttonHint; + // Insert the optional hard link address. + if ( self::$a_bool_hard_links_enable ) { + $l_str_footnote_backlinks .= ' href="#'; + $l_str_footnote_backlinks .= self::$a_str_referrer_link_slug; + $l_str_footnote_backlinks .= self::$a_str_post_container_id_compound; + $l_str_footnote_backlinks .= $l_str_footnote_id . '"'; + $l_str_footnote_backlinks .= $l_str_use_backbutton_hint; } - $l_str_FootnoteBacklinks .= ' class="footnote_backlink"'; - $l_str_FootnoteBacklinks .= ' onclick="footnote_moveToAnchor_'; - $l_str_FootnoteBacklinks .= self::$a_int_PostId; - $l_str_FootnoteBacklinks .= '_' . self::$a_int_ReferenceContainerId; - $l_str_FootnoteBacklinks .= "('footnote_plugin_tooltip_"; - $l_str_FootnoteBacklinks .= self::$a_int_PostId; - $l_str_FootnoteBacklinks .= '_' . self::$a_int_ReferenceContainerId; - $l_str_FootnoteBacklinks .= "_$l_str_FootnoteId');\">"; + $l_str_footnote_backlinks .= ' class="footnote_backlink"'; + $l_str_footnote_backlinks .= ' onclick="footnote_move_to_anchor_'; + $l_str_footnote_backlinks .= self::$a_int_post_id; + $l_str_footnote_backlinks .= '_' . self::$a_int_reference_container_id; + $l_str_footnote_backlinks .= "('footnote_plugin_tooltip_"; + $l_str_footnote_backlinks .= self::$a_int_post_id; + $l_str_footnote_backlinks .= '_' . self::$a_int_reference_container_id; + $l_str_footnote_backlinks .= "_$l_str_footnote_id');\">"; - // append the offset anchor for optional hard links: - if (self::$a_bool_HardLinksEnable) { - $l_str_FootnoteBacklinks .= ''; + // Append the offset anchor for optional hard links. + if ( self::$a_bool_hard_links_enable ) { + $l_str_footnote_backlinks .= ''; } - $l_str_FootnoteBacklinks .= $l_bool_SymbolSwitch ? '' : $l_str_FootnoteArrow; - $l_str_FootnoteBacklinks .= $l_str_FootnoteId; - $l_str_FootnoteBacklinks .= $l_bool_SymbolSwitch ? $l_str_FootnoteArrow : ''; + $l_str_footnote_backlinks .= $l_bool_symbol_switch ? '' : $l_str_footnote_arrow; + $l_str_footnote_backlinks .= $l_str_footnote_id; + $l_str_footnote_backlinks .= $l_bool_symbol_switch ? $l_str_footnote_arrow : ''; } } } - // append terminator and end tag: - $l_str_FootnoteReference .= $l_str_Terminator . ''; - $l_str_FootnoteBacklinks .= $l_str_Terminator . ''; + // Append terminator and end tag. + $l_str_footnote_reference .= $l_str_terminator . ''; + $l_str_footnote_backlinks .= $l_str_terminator . ''; } - // line wrapping of URLs already fixed, see above + // Line wrapping of URLs already fixed, see above. - // get reference container item text if tooltip text goes separate: - $l_int_TooltipTextLength = strpos( $l_str_FootnoteText, self::$a_str_TooltipShortcode ); - $l_bool_HasTooltipText = $l_int_TooltipTextLength === false ? false : true; - if ( $l_bool_HasTooltipText ) { - $l_str_NotTooltipText = substr( $l_str_FootnoteText, ( $l_int_TooltipTextLength + self::$a_int_TooltipShortcodeLength ) ); - self::$a_bool_MirrorTooltipText = MCI_Footnotes_Convert::toBool( MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_BOOL_FOOTNOTES_TOOLTIP_EXCERPT_MIRROR_ENABLE ) ); - if ( self::$a_bool_MirrorTooltipText ) { - $l_str_TooltipText = substr( $l_str_FootnoteText, 0, $l_int_TooltipTextLength ); - $l_str_ReferenceTextIntroducer = MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_STR_FOOTNOTES_TOOLTIP_EXCERPT_MIRROR_SEPARATOR); - $l_str_ReferenceText = $l_str_TooltipText . $l_str_ReferenceTextIntroducer . $l_str_NotTooltipText; + // Get reference container item text if tooltip text goes separate. + $l_int_tooltip_text_length = strpos( $l_str_footnote_text, self::$a_str_tooltip_shortcode ); + $l_bool_has_tooltip_text = ! $l_int_tooltip_text_length ? false : true; + if ( $l_bool_has_tooltip_text ) { + $l_str_not_tooltip_text = substr( $l_str_footnote_text, ( $l_int_tooltip_text_length + self::$a_int_tooltip_shortcode_length ) ); + self::$a_bool_mirror_tooltip_text = MCI_Footnotes_Convert::to_bool( MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_FOOTNOTES_TOOLTIP_EXCERPT_MIRROR_ENABLE ) ); + if ( self::$a_bool_mirror_tooltip_text ) { + $l_str_tooltip_text = substr( $l_str_footnote_text, 0, $l_int_tooltip_text_length ); + $l_str_reference_text_introducer = MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_FOOTNOTES_TOOLTIP_EXCERPT_MIRROR_SEPARATOR ); + $l_str_reference_text = $l_str_tooltip_text . $l_str_reference_text_introducer . $l_str_not_tooltip_text; } else { - $l_str_ReferenceText = $l_str_NotTooltipText; + $l_str_reference_text = $l_str_not_tooltip_text; } } else { - $l_str_ReferenceText = $l_str_FootnoteText; + $l_str_reference_text = $l_str_footnote_text; } - // replace all placeholders in table row template: - $l_obj_Template->replace( + // Replace all placeholders in table row template. + $l_obj_template->replace( array( - // placeholder used in all templates: - "text" => $l_str_ReferenceText, + // Placeholder used in all templates. + 'text' => $l_str_reference_text, - // used in standard layout W/O COMBINED FOOTNOTES: - "post_id" => self::$a_int_PostId, - "container_id" => self::$a_int_ReferenceContainerId, - "note_id" => MCI_Footnotes_Convert::Index($l_int_FirstFootnoteIndex, MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_STR_FOOTNOTES_COUNTER_STYLE)), - "link-start" => self::$a_str_LinkOpenTag, - "link-end" => self::$a_str_LinkCloseTag, - "link-span" => self::$a_str_LinkSpan, - "terminator" => $l_str_Terminator, - "anchor-element" => $l_str_FootnoteAnchorElement, - "hard-link" => $l_str_HardLinkAddress, + // Used in standard layout W/O COMBINED FOOTNOTES. + 'post_id' => self::$a_int_post_id, + 'container_id' => self::$a_int_reference_container_id, + 'note_id' => MCI_Footnotes_Convert::index( $l_int_first_footnote_index, MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_FOOTNOTES_COUNTER_STYLE ) ), + 'link-start' => self::$a_str_link_open_tag, + 'link-end' => self::$a_str_link_close_tag, + 'link-span' => self::$a_str_link_span, + 'terminator' => $l_str_terminator, + 'anchor-element' => $l_str_footnote_anchor_element, + 'hard-link' => $l_str_hard_link_address, - // used in standard layout WITH COMBINED IDENTICALS TURNED ON: - "pointer" => $l_bool_FlagCombined ? '' : ' pointer', - "event" => $l_bool_FlagCombined ? '' : $l_str_BacklinkEvent, - "backlinks" => $l_bool_FlagCombined ? $l_str_FootnoteBacklinks : $l_str_FootnoteReference, + // Used in standard layout WITH COMBINED IDENTICALS TURNED ON. + 'pointer' => $l_bool_flag_combined ? '' : ' pointer', + 'event' => $l_bool_flag_combined ? '' : $l_str_backlink_event, + 'backlinks' => $l_bool_flag_combined ? $l_str_footnote_backlinks : $l_str_footnote_reference, - // Legacy placeholders for use in legacy layout templates: - "arrow" => $l_str_FootnoteArrow, - "index" => $l_str_FootnoteId, + // Legacy placeholders for use in legacy layout templates. + 'arrow' => $l_str_footnote_arrow, + 'index' => $l_str_footnote_id, ) ); - $l_str_Body .= $l_obj_Template->getContent(); + $l_str_body .= $l_obj_template->get_content(); - // extra line breaks for page source readability: - $l_str_Body .= "\r\n\r\n"; + // Extra line breaks for page source readability. + $l_str_body .= "\r\n\r\n"; - $l_obj_Template->reload(); + $l_obj_template->reload(); } - // call again for robustness when priority levels don’t match any longer: - self::$a_int_ScrollOffset = intval(MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_INT_FOOTNOTES_SCROLL_OFFSET)); + // Call again for robustness when priority levels don’t match any longer. + self::$a_int_scroll_offset = intval( MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_INT_FOOTNOTES_SCROLL_OFFSET ) ); - // streamline: - $l_bool_CollapseDefault = MCI_Footnotes_Convert::toBool(MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_BOOL_REFERENCE_CONTAINER_COLLAPSE)); + // Streamline. + $l_bool_collapse_default = MCI_Footnotes_Convert::to_bool( MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_REFERENCE_CONTAINER_COLLAPSE ) ); /** - * Reference container label + * Reference container label. * * - Bugfix: Reference container: Label: set empty label to U+202F NNBSP for more robustness, thanks to @lukashuggenberg feedback. * @@ -2283,7 +2391,7 @@ class MCI_Footnotes_Task { * In case of empty label that would apply to the left half button character. * Hence the point in setting an empty label to U+202F NARROW NO-BREAK SPACE. */ - $l_str_ReferenceContainerLabel = MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_STR_REFERENCE_CONTAINER_NAME); + $l_str_reference_container_label = MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_REFERENCE_CONTAINER_NAME ); /** * Select the reference container template according to the script mode. @@ -2294,40 +2402,40 @@ class MCI_Footnotes_Task { * * @reporter @hopper87it * @link https://wordpress.org/support/topic/footnotes-wp-rocket/ - * + * * @reporter @pkverma99 * @link https://wordpress.org/support/topic/footnotes-wp-rocket/#post-14076188 */ - $l_str_ScriptMode = MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_STR_FOOTNOTES_REFERENCE_CONTAINER_SCRIPT_MODE); - - if ( $l_str_ScriptMode == 'jquery' ) { + $l_str_script_mode = MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_FOOTNOTES_REFERENCE_CONTAINER_SCRIPT_MODE ); + + if ( 'jquery' === $l_str_script_mode ) { + + // Load 'templates/public/reference-container.html'. + $l_obj_template_container = new MCI_Footnotes_Template( MCI_Footnotes_Template::C_STR_PUBLIC, 'reference-container' ); - // load 'templates/public/reference-container.html': - $l_obj_TemplateContainer = new MCI_Footnotes_Template(MCI_Footnotes_Template::C_STR_PUBLIC, "reference-container"); - } else { - - // load 'templates/public/js-reference-container.html': - $l_obj_TemplateContainer = new MCI_Footnotes_Template(MCI_Footnotes_Template::C_STR_PUBLIC, "js-reference-container"); + + // Load 'templates/public/js-reference-container.html'. + $l_obj_template_container = new MCI_Footnotes_Template( MCI_Footnotes_Template::C_STR_PUBLIC, 'js-reference-container' ); } - - $l_obj_TemplateContainer->replace( + + $l_obj_template_container->replace( array( - "post_id" => self::$a_int_PostId, - "container_id" => self::$a_int_ReferenceContainerId, - "element" => MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_STR_REFERENCE_CONTAINER_LABEL_ELEMENT), - "name" => empty($l_str_ReferenceContainerLabel) ? ' ' : $l_str_ReferenceContainerLabel, - "button-style" => !$l_bool_CollapseDefault ? 'display: none;' : '', - "style" => $l_bool_CollapseDefault ? 'display: none;' : '', - "content" => $l_str_Body, - "scroll-offset" => (self::$a_int_ScrollOffset / 100), - "scroll-duration" => intval(MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_INT_FOOTNOTES_SCROLL_DURATION)), + 'post_id' => self::$a_int_post_id, + 'container_id' => self::$a_int_reference_container_id, + 'element' => MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_REFERENCE_CONTAINER_LABEL_ELEMENT ), + 'name' => empty( $l_str_reference_container_label ) ? ' ' : $l_str_reference_container_label, + 'button-style' => ! $l_bool_collapse_default ? 'display: none;' : '', + 'style' => $l_bool_collapse_default ? 'display: none;' : '', + 'content' => $l_str_body, + 'scroll-offset' => ( self::$a_int_scroll_offset / 100 ), + 'scroll-duration' => intval( MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_INT_FOOTNOTES_SCROLL_DURATION ) ), ) ); - // free all found footnotes if reference container will be displayed - self::$a_arr_Footnotes = array(); + // Free all found footnotes if reference container will be displayed. + self::$a_arr_footnotes = array(); - return $l_obj_TemplateContainer->getContent(); + return $l_obj_template_container->get_content(); } } diff --git a/class/template.php b/class/template.php index 2c0b8d4..d438748 100644 --- a/class/template.php +++ b/class/template.php @@ -1,39 +1,21 @@ -plugin_directory = plugin_dir_path( dirname( __FILE__ ) ); /** - * Modularize functions + * Modularize functions. * * @since 2.4.0d3 - * - * @author Patrizia Lutz @misfist */ - if( $template = $this->get_template( $p_str_FileType, $p_str_FileName, $p_str_Extension ) ) { + $template = $this->get_template( $p_str_file_type, $p_str_file_name, $p_str_extension ); + if ( $template ) { $this->process_template( $template ); } else { return; @@ -133,124 +107,123 @@ class MCI_Footnotes_Template { /** * Replace all placeholders specified in array. * - * @author Stefan Herndler * @since 1.5.0 - * @param array $p_arr_Placeholders Placeholders (key = placeholder, value = value). + * @param array $p_arr_placeholders Placeholders (key = placeholder, value = value). * @return bool True on Success, False if Placeholders invalid. */ - public function replace($p_arr_Placeholders) { - // no placeholders set - if (empty($p_arr_Placeholders)) { + public function replace( $p_arr_placeholders ) { + // No placeholders set. + if ( empty( $p_arr_placeholders ) ) { return false; } - // template content is empty - if (empty($this->a_str_ReplacedContent)) { + // Template content is empty. + if ( empty( $this->a_str_replaced_content ) ) { return false; } - // iterate through each placeholder and replace it with its value - foreach($p_arr_Placeholders as $l_str_Placeholder => $l_str_Value) { - $this->a_str_ReplacedContent = str_replace("[[" . $l_str_Placeholder . "]]", $l_str_Value, $this->a_str_ReplacedContent); + // Iterate through each placeholder and replace it with its value. + foreach ( $p_arr_placeholders as $l_str_placeholder => $l_str_value ) { + $this->a_str_replaced_content = str_replace( '[[' . $l_str_placeholder . ']]', $l_str_value, $this->a_str_replaced_content ); } - // success + // Success. return true; } /** * Reloads the original content of the template file. * - * @author Stefan Herndler * @since 1.5.0 */ public function reload() { - $this->a_str_ReplacedContent = $this->a_str_OriginalContent; + $this->a_str_replaced_content = $this->a_str_original_content; } /** * Returns the content of the template file with replaced placeholders. * - * @author Stefan Herndler * @since 1.5.0 * @return string Template content with replaced placeholders. */ - public function getContent() { - return $this->a_str_ReplacedContent; + public function get_content() { + return $this->a_str_replaced_content; } /** - * Process template file - * - * @author Patrizia Lutz @misfist + * Process template file. * * @since 2.4.0d3 * - * @param string $template + * @param string $template The template to be processed. * @return void * - * - * @since 2.0.3 replace tab with a space - * @since 2.0.3 replace 2 spaces with 1 - * @since 2.0.4 collapse multiple spaces - * @since 2.2.6 delete a space before a closing pointy bracket - * @since 2.5.4 collapse HTML comments and PHP/JS docblocks (only) + * @since 2.0.3 Replace tab with a space. + * @since 2.0.3 Replace 2 spaces with 1. + * @since 2.0.4 Collapse multiple spaces. + * @since 2.2.6 Delete a space before a closing pointy bracket. + * @since 2.5.4 Collapse HTML comments and PHP/JS docblocks (only). */ public function process_template( $template ) { - $this->a_str_OriginalContent = preg_replace( '##s', "", file_get_contents( $template ) ); - $this->a_str_OriginalContent = preg_replace( '#/\*\*.+?\*/#s', "", $this->a_str_OriginalContent ); - $this->a_str_OriginalContent = str_replace( "\n", "", $this->a_str_OriginalContent ); - $this->a_str_OriginalContent = str_replace( "\r", "", $this->a_str_OriginalContent ); - $this->a_str_OriginalContent = str_replace( "\t", " ", $this->a_str_OriginalContent ); - $this->a_str_OriginalContent = preg_replace( '# +#', " ", $this->a_str_OriginalContent ); - $this->a_str_OriginalContent = str_replace( " >", ">", $this->a_str_OriginalContent ); + $this->a_str_original_content = preg_replace( '##s', '', wp_remote_get( $template ) ); + $this->a_str_original_content = preg_replace( '#/\*\*.+?\*/#s', '', $this->a_str_original_content ); + $this->a_str_original_content = str_replace( "\n", '', $this->a_str_original_content ); + $this->a_str_original_content = str_replace( "\r", '', $this->a_str_original_content ); + $this->a_str_original_content = str_replace( "\t", ' ', $this->a_str_original_content ); + $this->a_str_original_content = preg_replace( '# +#', ' ', $this->a_str_original_content ); + $this->a_str_original_content = str_replace( ' >', '>', $this->a_str_original_content ); $this->reload(); } /** - * Get the template + * Get the template. + * + * - Adding: Templates: Enable template location stack, thanks to @misfist code contribution. * - * @author Patrizia Lutz @misfist + * @since 2.4.0d3 Contribution. + * @since 2.5.0 Release. + * + * @contributor @misfist + * @link https://wordpress.org/support/topic/template-override-filter/#post-13864301 * - * @since 2.4.0d3 - * - * @param string $p_str_FileType - * @param string $p_str_FileName - * @param string $p_str_Extension + * @param string $p_str_file_type The file type of the template. + * @param string $p_str_file_name The file name of the template. + * @param string $p_str_extension The file extension of the template. * @return mixed false | template path */ - public function get_template( $p_str_FileType, $p_str_FileName, $p_str_Extension = "html" ) { + public function get_template( $p_str_file_type, $p_str_file_name, $p_str_extension = 'html' ) { $located = false; /** - * The directory change be modified - * @usage to change location of templates to `template_parts/footnotes/': + * The directory can be changed. + * + * @usage to change location of templates to 'template_parts/footnotes/': * add_filter( 'mci_footnotes_template_directory', function( $directory ) { - * return 'template_parts/footnotes/; + * return 'template_parts/footnotes/'; * } ); */ $template_directory = apply_filters( 'mci_footnotes_template_directory', 'footnotes/templates/' ); - $custom_directory = apply_filters( 'mci_footnotes_custom_template_directory', 'footnotes-custom/' ); - $template_name = $p_str_FileType . '/' . $p_str_FileName . '.' . $p_str_Extension; + $custom_directory = apply_filters( 'mci_footnotes_custom_template_directory', 'footnotes-custom/' ); + $template_name = $p_str_file_type . '/' . $p_str_file_name . '.' . $p_str_extension; /** - * Look in active (child) theme + * Look in active theme. */ if ( file_exists( trailingslashit( get_stylesheet_directory() ) . $template_directory . $template_name ) ) { $located = trailingslashit( get_stylesheet_directory() ) . $template_directory . $template_name; - /** - * Look in parent theme - */ + /** + * Look in parent theme in case active is child. + */ } elseif ( file_exists( trailingslashit( get_template_directory() ) . $template_directory . $template_name ) ) { $located = trailingslashit( get_template_directory() ) . $template_directory . $template_name; - /** - * Look in custom directory - */ + /** + * Look in custom plugin directory. + */ } elseif ( file_exists( trailingslashit( WP_PLUGIN_DIR ) . $custom_directory . 'templates/' . $template_name ) ) { $located = trailingslashit( WP_PLUGIN_DIR ) . $custom_directory . 'templates/' . $template_name; - /** - * Look in plugin - */ + /** + * Fall back to the templates shipped with the plugin. + */ } elseif ( file_exists( $this->plugin_directory . 'templates/' . $template_name ) ) { $located = $this->plugin_directory . 'templates/' . $template_name; } @@ -258,4 +231,4 @@ class MCI_Footnotes_Template { return $located; } -} // end of class +} // End of class. diff --git a/class/widgets/base.php b/class/widgets/base.php index ad41077..cc00326 100644 --- a/class/widgets/base.php +++ b/class/widgets/base.php @@ -1,12 +1,12 @@ - __CLASS__, "description" => $this->getDescription()); - $l_arr_ControlOptions = array("id_base" => strtolower($this->getID()), "width" => $this->getWidgetWidth()); - // registers the Widget + $l_arr_widget_options = array( + 'classname' => __CLASS__, + 'description' => $this->get_description(), + ); + $l_arr_control_options = array( + 'id_base' => strtolower( $this->get_id() ), + 'width' => $this->get_widget_width(), + ); + // Registers the Widget. parent::__construct( - strtolower($this->getID()), // unique ID for the widget, has to be lowercase - $this->getName(), // Plugin name to be displayed - $l_arr_WidgetOptions, // Optional Widget Options - $l_arr_ControlOptions // Optional Widget Control Options - ); + strtolower( $this->get_id() ), // Unique ID for the widget, has to be lowercase. + $this->get_name(), // Plugin name to be displayed. + $l_arr_widget_options, // Optional Widget Options. + $l_arr_control_options // Optional Widget Control Options. + ); } } diff --git a/class/widgets/reference-container.php b/class/widgets/reference-container.php index 2e322ec..e1fc4be 100644 --- a/class/widgets/reference-container.php +++ b/class/widgets/reference-container.php @@ -1,85 +1,78 @@ -get(MCI_Footnotes_Settings::C_STR_REFERENCE_CONTAINER_POSITION) == "widget") { - echo $g_obj_MCI_Footnotes->a_obj_Task->ReferenceContainer(); + public function widget( $args, $instance ) { + global $g_obj_mci_footnotes; + // Reference container positioning is set to "widget area". + if ( 'widget' === MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_REFERENCE_CONTAINER_POSITION ) ) { + echo wp_kses_post( $g_obj_mci_footnotes->a_obj_task->Reference_Container() ); } } } diff --git a/class/wysiwyg.php b/class/wysiwyg.php index 3a27477..90fb108 100644 --- a/class/wysiwyg.php +++ b/class/wysiwyg.php @@ -1,83 +1,89 @@ -getContent(); + public static function new_plain_text_editor_button() { + $l_obj_template = new MCI_Footnotes_Template( MCI_Footnotes_Template::C_STR_DASHBOARD, 'editor-button' ); + echo wp_kses_post( $l_obj_template->get_content() ); } /** * Includes the Plugins WYSIWYG editor script. * - * @author Stefan Herndler * @since 1.5.0 - * @param array $p_arr_Plugins Scripts to be included to the editor. + * @param array $p_arr_plugins Scripts to be included to the editor. * @return array */ - public static function includeScripts($p_arr_Plugins) { - $p_arr_Plugins[MCI_Footnotes_Config::C_STR_PLUGIN_NAME] = plugins_url('/../js/wysiwyg-editor.js', __FILE__); - return $p_arr_Plugins; + public static function include_scripts( $p_arr_plugins ) { + $p_arr_plugins[ MCI_Footnotes_Config::C_STR_PLUGIN_NAME ] = plugins_url( '/../js/wysiwyg-editor.js', __FILE__ ); + return $p_arr_plugins; } /** * AJAX Callback function when the Footnotes Button is clicked. Either in the Plain text or Visual editor. * Returns an JSON encoded array with the Footnotes start and end short code. * - * @author Stefan Herndler * @since 1.5.0 */ - public static function ajaxCallback() { - // get start and end tag for the footnotes short code - $l_str_StartingTag = MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_STR_FOOTNOTES_SHORT_CODE_START); - $l_str_EndingTag = MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_STR_FOOTNOTES_SHORT_CODE_END); - if ($l_str_StartingTag == "userdefined" || $l_str_EndingTag == "userdefined") { - $l_str_StartingTag = MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_STR_FOOTNOTES_SHORT_CODE_START_USER_DEFINED); - $l_str_EndingTag = MCI_Footnotes_Settings::instance()->get(MCI_Footnotes_Settings::C_STR_FOOTNOTES_SHORT_CODE_END_USER_DEFINED); + public static function ajax_callback() { + // Get start and end tag for the footnotes short code. + $l_str_starting_tag = MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_FOOTNOTES_SHORT_CODE_START ); + $l_str_ending_tag = MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_FOOTNOTES_SHORT_CODE_END ); + if ( 'userdefined' === $l_str_starting_tag || 'userdefined' === $l_str_ending_tag ) { + $l_str_starting_tag = MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_FOOTNOTES_SHORT_CODE_START_USER_DEFINED ); + $l_str_ending_tag = MCI_Footnotes_Settings::instance()->get( MCI_Footnotes_Settings::C_STR_FOOTNOTES_SHORT_CODE_END_USER_DEFINED ); } - echo json_encode(array("start" => htmlspecialchars($l_str_StartingTag), "end" => htmlspecialchars($l_str_EndingTag))); + echo wp_json_encode( + array( + 'start' => htmlspecialchars( $l_str_starting_tag ), + 'end' => htmlspecialchars( $l_str_ending_tag ), + ) + ); exit; } -} \ No newline at end of file +} diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..85ecd48 --- /dev/null +++ b/composer.json @@ -0,0 +1,11 @@ +{ + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.1", + "wp-coding-standards/wpcs": "^2.3" + }, + "scripts": { + "post-install-cmd": [ + "bash _tools/setup.sh" + ] + } +} diff --git a/contrib/pre-commit b/contrib/pre-commit new file mode 100644 index 0000000..0dc792f --- /dev/null +++ b/contrib/pre-commit @@ -0,0 +1,61 @@ +#!/bin/sh + +# Modified from: https://github.com/bjornjohansen/wp-pre-commit-hook +# Also: https://softdiscover.com/wordpress/perfect-setup-for-a-wordpress-project-development/ + +PROJECT=`php -r "echo dirname(dirname(dirname(realpath('$0'))));"` +STAGED_FILES_CMD=`git diff --cached --name-only --diff-filter=ACMR HEAD | grep \\\\.php` + +# Determine if a file list is passed +if [ "$#" -eq 1 ] +then + oIFS=$IFS + IFS=' + ' + SFILES="$1" + IFS=$oIFS +fi +SFILES=${SFILES:-$STAGED_FILES_CMD} + +echo "Checking PHP Lint..." +for FILE in $SFILES +do + php -l -d display_errors=0 $PROJECT/$FILE + if [ $? != 0 ] + then + echo "Fix the error before commit." + exit 1 + fi + FILES="$FILES $PROJECT/$FILE" +done + +if [ -f "$PROJECT/phpcs.ruleset.xml" ] +then + RULESET="$PROJECT/phpcs.ruleset.xml" +elif [ -f "$PROJECT/phpcs.xml.dist" ] +then + RULESET="$PROJECT/phpcs.xml.dist" +else + RULESET="WordPress" +fi + +if [ "$FILES" != "" ] +then + echo "Checking Code Standard Compliance, using $RULESET as ruleset standard..." + ./vendor/bin/phpcs --standard="$RULESET" --colors --encoding=utf-8 -n -p $FILES + if [ $? != 0 ] + then + echo "Coding standards errors have been detected. Running phpcbf..." + ./vendor/bin/phpcbf --standard="$RULESET" --encoding=utf-8 -n -p $FILES + git add $FILES + echo "Running Code Sniffer again..." + ./vendor/bin/phpcs --standard="$RULESET" --colors --encoding=utf-8 -n -p $FILES + if [ $? != 0 ] + then + echo "Errors found not fixable automatically. You need to manually fix them." + exit 1 + fi + fi +fi + +exit $? diff --git a/footnotes.php b/footnotes.php index e05f2d9..a03d37a 100755 --- a/footnotes.php +++ b/footnotes.php @@ -1,14 +1,17 @@ -run(); +// Initialize the Plugin. +$g_obj_mci_footnotes = new MCI_Footnotes(); +// Run the Plugin. +$g_obj_mci_footnotes->run(); /** * Sets the stylesheet enqueuing mode for production. - * + * * @since 2.5.5 * @var bool * @see class/init.php - * + * * In production, a minified CSS file tailored to the settings is enqueued. - * + * * Developing stylesheets is meant to be easier when this is set to false. * WARNING: This facility designed for development must NOT be used in production. - */ + */ define( 'C_BOOL_CSS_PRODUCTION_MODE', true ); diff --git a/includes.php b/includes.php index 732cfb9..9501097 100644 --- a/includes.php +++ b/includes.php @@ -3,36 +3,37 @@ * Includes all common files. * * @filesource - * @author Stefan Herndler + * @package footnotes * @since 1.5.0 14.09.14 13:40 */ /** - * Requires (require_once) all *.php files inside a specific Directory. + * Requires (`require_once`) all `*.php` files inside a specific Directory. * * @author Stefan Herndler * @since 1.5.0 - * @param string $p_str_Directory Absolute Directory path to lookup for *.php files + * @param string $p_str_directory Absolute Directory path to lookup for `*.php` files. */ -function MCI_Footnotes_requirePhpFiles($p_str_Directory) { - // append slash at the end of the Directory if not exist - if (substr($p_str_Directory, -1) != "/") { - $p_str_Directory .= "/"; - +function mci_footnotes_require_php_files( $p_str_directory ) { + // Append slash at the end of the Directory if not exist. + if ( '/' !== substr( $p_str_directory, -1 ) ) { + $p_str_directory .= '/'; } - // get all PHP files inside Directory - $l_arr_Files = scandir($p_str_Directory); - // iterate through each class - foreach ($l_arr_Files as $l_str_FileName) { - // skip all non *.php files - if (strtolower(substr($l_str_FileName, -4)) != ".php") { + // Get all PHP files inside Directory. + $l_arr_files = scandir( $p_str_directory ); + // Iterate through each class. + foreach ( $l_arr_files as $l_str_file_name ) { + // Skip all non-PHP files. + if ( '.php' !== strtolower( substr( $l_str_file_name, -4 ) ) ) { continue; } + // phpcs:disable Generic.Commenting.DocComment.MissingShort /** @noinspection PhpIncludeInspection */ - require_once($p_str_Directory . $l_str_FileName); + require_once $p_str_directory . $l_str_file_name; + // phpcs:enable } } -MCI_Footnotes_requirePhpFiles(dirname(__FILE__) . "/class"); -MCI_Footnotes_requirePhpFiles(dirname(__FILE__) . "/class/dashboard"); -MCI_Footnotes_requirePhpFiles(dirname(__FILE__) . "/class/widgets"); +mci_footnotes_require_php_files( dirname( __FILE__ ) . '/class' ); +mci_footnotes_require_php_files( dirname( __FILE__ ) . '/class/layout' ); +mci_footnotes_require_php_files( dirname( __FILE__ ) . '/class/widgets' ); diff --git a/readme.txt b/readme.txt index 82e80f3..766ed9d 100755 --- a/readme.txt +++ b/readme.txt @@ -1,10 +1,10 @@ === footnotes === -Contributors: mark.cheret, lolzim, dartiss, docteurfitness, felipelavinz, martinneumannat, matkus2, meglio, misfist, rumperuu, spaceling, vonpiernik, pewgeuges +Contributors: mark.cheret, lolzim, rumperuu, aricura, misfist, ericakfranz, dartiss, docteurfitness, felipelavinz, martinneumannat, matkus2, meglio, spaceling, vonpiernik, pewgeuges Tags: footnote, footnotes, bibliography, formatting, notes, Post, posts, reference, referencing Requires at least: 3.9 Tested up to: 5.6.1 Requires PHP: 5.6 -Stable Tag: 2.5.5 +Stable Tag: 2.5.6 License: GPLv3 or later License URI: http://www.gnu.org/licenses/gpl-3.0.html @@ -80,7 +80,7 @@ Visit this swift write-up from a **footnotes** user by the name of **Southwest** = 2.5.6 = - Bugfix: Reference container: optional alternative expanding and collapsing without jQuery for use with hard links, thanks to @hopper87it @pkverma99 issue reports. - Bugfix: Alternative tooltips: shrink width to short content. -- Update: Documentation: slightly revise / update the plugin’s welcome page on WordPress.org. +- Update: Documentation: slightly revise or update the plugin’s welcome page on WordPress.org. = 2.5.5 = - Update: Stylesheets: increase speed and energy efficiency by tailoring stylesheets to the needs of the instance, thanks to @docteurfitness design contribution. diff --git a/templates/dashboard/other-plugins.html b/templates/dashboard/other-plugins.html index 91fc1e4..03ad002 100644 --- a/templates/dashboard/other-plugins.html +++ b/templates/dashboard/other-plugins.html @@ -54,7 +54,7 @@ type: 'POST', url: '/wp-admin/admin-ajax.php', data: { - action: 'footnotes_getPluginInfo', + action: 'footnotes_get_plugin_info', plugin: '[[plugin-name]]' }, dataType: 'json',