Files ready for urgent bugfix v2.0.4, please check, test, release if OK

git-svn-id: https://plugins.svn.wordpress.org/footnotes/trunk@2410551 b8457f37-d9ea-0310-8a92-e5e31aec5664
This commit is contained in:
pewgeuges 2020-11-01 05:41:22 +00:00
parent 98a12726ff
commit 389d4ea5bd
25 changed files with 553 additions and 411 deletions

View file

@ -5,6 +5,8 @@
* @filesource
* @author Stefan Herndler
* @since 1.5.0 12.09.14 10:56
*
* Last edited for v2.0.4 2020-11-01T0452+0100
*/
@ -16,39 +18,63 @@
*/
class MCI_Footnotes_Config {
/**
* Internal Plugin name.
*
* @author Stefan Herndler
* @since 1.5.0
* @var string
*/
const C_STR_PLUGIN_NAME = "footnotes";
/**
* Internal Plugin name.
*
* @author Stefan Herndler
* @since 1.5.0
* @var string
*/
const C_STR_PLUGIN_NAME = "footnotes";
/**
* Public Plugin name.
*
* @author Stefan Herndler
* @since 1.5.0
* @var string
*/
const C_STR_PLUGIN_PUBLIC_NAME = '<span class="footnote_tag_styling footnote_tag_styling_1">foot</span><span class="footnote_tag_styling footnote_tag_styling_2">notes</span>';
/**
* Public Plugin name.
*
* @author Stefan Herndler
* @since 1.5.0
* @var string
*
* edited classes for v2.0.4
*/
const C_STR_PLUGIN_PUBLIC_NAME = '<span class="footnotes_logo footnotes_logo_part1">foot</span><span class="footnotes_logo footnotes_logo_part2">notes</span>';
/**
* Html tag for the LOVE symbol.
*
* @author Stefan Herndler
* @since 1.5.0
* @var string
*/
const C_STR_LOVE_SYMBOL = '<span style="color:#ff6d3b; font-weight:bold;">&hearts;</span>';
/**
* 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
* the last line. That ugly display bug badly affected the plugins communication.
* The only working solution found so far is using position:fixed in one heading
* that isnt translated, and dropping the logo in another, translatable heading.
*
* @since 2.0.4
* @var string
*/
const C_STR_PLUGIN_HEADING_NAME = '<span class="footnotes_logo_heading footnotes_logo_part1_heading">foot</span><span class="footnotes_logo_heading footnotes_logo_part2_heading">notes</span>';
/**
* Short code to DON'T display the 'LOVE ME' slug on certain pages.
*
* @author Stefan Herndler
* @since 1.5.0
* @var string
*/
const C_STR_NO_LOVE_SLUG = '[[no footnotes: love]]';
}
/**
* Html tag for the LOVE symbol.
*
* @author Stefan Herndler
* @since 1.5.0
* @var string
*/
const C_STR_LOVE_SYMBOL = '<span style="color:#ff6d3b; font-weight:bold;">&hearts;</span>';
/**
* HTML code for the 'love' symbol used in dashboard heading
*
* @since 2.0.4
* @var string
*/
const C_STR_LOVE_SYMBOL_HEADING = '<span class="footnotes_heart_heading">&hearts;</span>';
/**
* Short code to DON'T display the 'LOVE ME' slug on certain pages.
*
* @author Stefan Herndler
* @since 1.5.0
* @var string
*/
const C_STR_NO_LOVE_SLUG = '[[no footnotes: love]]';
}

View file

@ -5,6 +5,8 @@
* @filesource
* @author Stefan Herndler
* @since 1.5.0 14.09.14 14:47
*
* Edited for v2.0.4 2020-11-01T0509+0100
*/
/**
@ -72,17 +74,23 @@ class MCI_Footnotes_Layout_Settings extends MCI_Footnotes_LayoutEngine {
* @author Stefan Herndler
* @since 1.5.0
* @return array
*
* Edited for v2.0.4 to reflect changes in display since WPv5.5
* Details in class/config.php
*/
protected function getMetaBoxes() {
return array(
// Change string "%s styling" to "Footnotes styling":
$this->addMetaBox("settings", "styling", __("Footnotes styling", MCI_Footnotes_Config::C_STR_PLUGIN_NAME), "Styling"),
$this->addMetaBox("settings", "reference-container", __("References Container", MCI_Footnotes_Config::C_STR_PLUGIN_NAME), "ReferenceContainer"),
$this->addMetaBox("settings", "styling", sprintf(__("%s styling", MCI_Footnotes_Config::C_STR_PLUGIN_NAME), MCI_Footnotes_Config::C_STR_PLUGIN_PUBLIC_NAME), "Styling"),
$this->addMetaBox("settings", "love", MCI_Footnotes_Config::C_STR_PLUGIN_PUBLIC_NAME . '&nbsp;' . MCI_Footnotes_Config::C_STR_LOVE_SYMBOL, "Love"),
// Leave intact since this is not localized:
$this->addMetaBox("settings", "love", MCI_Footnotes_Config::C_STR_PLUGIN_HEADING_NAME . '&nbsp;' . MCI_Footnotes_Config::C_STR_LOVE_SYMBOL_HEADING, "Love"),
$this->addMetaBox("settings", "other", __("Other", MCI_Footnotes_Config::C_STR_PLUGIN_NAME), "Other"),
// This is restored to meet user demand for arrow symbol semantics:
$this->addMetaBox("customize", "hyperlink-arrow", __("Hyperlink symbol in the Reference container", MCI_Footnotes_Config::C_STR_PLUGIN_NAME), "HyperlinkArrow"),
$this->addMetaBox("customize", "superscript", __("Superscript layout", MCI_Footnotes_Config::C_STR_PLUGIN_NAME), "Superscript"),
$this->addMetaBox("customize", "mouse-over-box", __("Mouse-over box", MCI_Footnotes_Config::C_STR_PLUGIN_NAME), "MouseOverBox"),
$this->addMetaBox("customize", "custom-css", __("Add custom CSS to the public page", MCI_Footnotes_Config::C_STR_PLUGIN_NAME), "CustomCSS"),
$this->addMetaBox("expert", "lookup", __("WordPress hooks to look for Footnote short codes", MCI_Footnotes_Config::C_STR_PLUGIN_NAME), "lookupHooks"),
@ -360,6 +368,34 @@ class MCI_Footnotes_Layout_Settings extends MCI_Footnotes_LayoutEngine {
echo $l_obj_Template->getContent();
}
/**
* Displays all settings for the prepended symbol
*
* @author Stefan Herndler
* @since 1.5.0
*
* Edited heading for v2.0.4
* The former 'hyperlink arrow' became 'prepended arrow' in v2.0.3 after
* a user complaint about missing backlinking semantics of the footnote number.
*/
public function HyperlinkArrow() {
// load template file
$l_obj_Template = new MCI_Footnotes_Template(MCI_Footnotes_Template::C_STR_DASHBOARD, "customize-hyperlink-arrow");
// replace all placeholders
$l_obj_Template->replace(
array(
"label-symbol" => $this->addLabel(MCI_Footnotes_Settings::C_STR_HYPERLINK_ARROW, __("Hyperlink symbol", MCI_Footnotes_Config::C_STR_PLUGIN_NAME)),
"symbol" => $this->addSelectBox(MCI_Footnotes_Settings::C_STR_HYPERLINK_ARROW, MCI_Footnotes_Convert::getArrow()),
"label-user-defined" => $this->addLabel(MCI_Footnotes_Settings::C_STR_HYPERLINK_ARROW_USER_DEFINED, __("or enter a user defined symbol", MCI_Footnotes_Config::C_STR_PLUGIN_NAME)),
"user-defined" => $this->addTextBox(MCI_Footnotes_Settings::C_STR_HYPERLINK_ARROW_USER_DEFINED),
"comment" => __("if set it overrides the hyperlink symbol above", MCI_Footnotes_Config::C_STR_PLUGIN_NAME)
)
);
// display template with replaced placeholders
echo $l_obj_Template->getContent();
}
/**
* Displays the custom css box.
*

View file

@ -1,16 +1,18 @@
<?php
/**
* Includes the main Class of the Plugin.
*
* IMPORTANT: In registerPublic(), keep plugin version # up to date for cache busting.
*
* @filesource
* @author Stefan Herndler
* @since 1.5.0 12.09.14 10:56
*
* Edited for v2.0.0: Added jQueryUI following @vonpiernik 2020-10-26T1907+0100
* Edited for v2.0.3: Added style sheet versioning 2020-10-29T1413+0100
* Edited for v2.0.4: Enqueuing settings.css 2020-11-01T0317+0100
*/
// Versioning: update plugin version # for style sheet cache busting on line 103
// Added jQueryUI on 2020-10-26T1907+0100
// Following @vonpiernik <https://wordpress.org/support/topic/tooltip-hover-not-showing/#post-13456762>
/**
* Entry point of the Plugin. Loads the Dashboard and executes the Task.
@ -20,91 +22,98 @@
*/
class MCI_Footnotes {
/**
* Reference to the Plugin Task object.
*
* @author Stefan Herndler
* @since 1.5.0
* @var null|MCI_Footnotes_Task
*/
public $a_obj_Task = null;
/**
* Reference to the Plugin Task object.
*
* @author Stefan Herndler
* @since 1.5.0
* @var null|MCI_Footnotes_Task
*/
public $a_obj_Task = null;
/**
* Executes the Plugin.
*
* @author Stefan Herndler
* @since 1.5.0
*/
public function run() {
// register language
MCI_Footnotes_Language::registerHooks();
// register Button hooks
MCI_Footnotes_WYSIWYG::registerHooks();
// register general hooks
MCI_Footnotes_Hooks::registerHooks();
// initialize the Plugin Dashboard
$this->initializeDashboard();
// initialize the Plugin Task
$this->initializeTask();
// 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'));
}
/**
* Executes the Plugin.
*
* @author Stefan Herndler
* @since 1.5.0
*/
public function run() {
// register language
MCI_Footnotes_Language::registerHooks();
// register Button hooks
MCI_Footnotes_WYSIWYG::registerHooks();
// register general hooks
MCI_Footnotes_Hooks::registerHooks();
// initialize the Plugin Dashboard
$this->initializeDashboard();
// initialize the Plugin Task
$this->initializeTask();
// 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'));
}
/**
* Initializes all Widgets of the Plugin.
*
* @author Stefan Herndler
* @since 1.5.0
*/
public function initializeWidgets() {
register_widget("MCI_Footnotes_Widget_ReferenceContainer");
}
/**
* Initializes all Widgets of the Plugin.
*
* @author Stefan Herndler
* @since 1.5.0
*/
public function initializeWidgets() {
register_widget("MCI_Footnotes_Widget_ReferenceContainer");
}
/**
* Initializes the Dashboard of the Plugin and loads them.
*
* @author Stefan Herndler
* @since 1.5.0
*/
private function initializeDashboard() {
new MCI_Footnotes_Layout_Init();
}
/**
* Initializes the Dashboard of the Plugin and loads them.
*
* @author Stefan Herndler
* @since 1.5.0
*/
private function initializeDashboard() {
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();
}
/**
* 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();
}
/**
* Registers and enqueue scripts and stylesheets to the public pages.
*
* @author Stefan Herndler
* @since 1.5.0
*/
public function registerPublic() {
// Add jQueryUI following @vonpiernik <https://wordpress.org/support/topic/tooltip-hover-not-showing/#post-13456762>:
wp_register_script( 'jQueryUI', 'https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js', null, null, true );
wp_enqueue_script( 'jQueryUI' );
// IMPORTANT: current version number for cache busting:
wp_enqueue_style('mci-footnotes-css-public', plugins_url('../css/public.css', __FILE__), '', '2.0.3');
// add the jQuery plugin (already registered by WordPress)
wp_enqueue_script('jquery');
// Finish adding jQueryUI:
wp_enqueue_script('mci-footnotes-js-jquery-tools', plugins_url('../js/jquery.tools.min.js', __FILE__), ['jQueryUI']);
}
/**
* Registers and enqueues scripts and stylesheets to the public pages.
*
* @author Stefan Herndler
* @since 1.5.0
*
* Updated for v2.0.0 by adding jQueryUI following vonpiernik (@vonpiernik).
* See <https://wordpress.org/support/topic/tooltip-hover-not-showing/#post-13456762>
*
* jQueryUI re-enables the tooltip infobox disabled when WPv5.5 was released.
*/
public function registerPublic() {
// Add jQueryUI:
wp_register_script( 'jQueryUI', 'https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js', null, null, true );
wp_enqueue_script( 'jQueryUI' );
// IMPORTANT: up-to-date plugin version number for cache busting.
wp_enqueue_style('mci-footnotes-css-public', plugins_url('../css/public.css', __FILE__), '', '2.0.4');
wp_enqueue_style('mci-footnotes-css-settings', plugins_url('../css/settings.css', __FILE__), '', '2.0.4');
// add the jQuery plugin (already registered by WordPress)
wp_enqueue_script('jquery');
// Finish adding jQueryUI:
wp_enqueue_script('mci-footnotes-js-jquery-tools', plugins_url('../js/jquery.tools.min.js', __FILE__), ['jQueryUI']);
}
}

View file

@ -5,6 +5,8 @@
* @filesource
* @author Stefan Herndler
* @since 1.5.0 14.09.14 10:43
*
* Edited for v2.0.4 2020-11-01T0333+0100
*/
@ -372,7 +374,10 @@ class MCI_Footnotes_Settings {
self::C_STR_REFERENCE_CONTAINER_NAME => 'References',
self::C_BOOL_REFERENCE_CONTAINER_COLLAPSE => '',
self::C_STR_REFERENCE_CONTAINER_POSITION => 'post_end',
self::C_BOOL_COMBINE_IDENTICAL_FOOTNOTES => 'yes',
// Identical footnotes should not be combined by default
// as long as the feature raises criticism for malfunctioning:
// <https://wordpress.org/support/topic/too-many-errors-18/>
self::C_BOOL_COMBINE_IDENTICAL_FOOTNOTES => '',
self::C_STR_FOOTNOTES_SHORT_CODE_START => '((',
self::C_STR_FOOTNOTES_SHORT_CODE_END => '))',
self::C_STR_FOOTNOTES_SHORT_CODE_START_USER_DEFINED => '',
@ -581,4 +586,4 @@ class MCI_Footnotes_Settings {
register_setting($this->getContainer($i), $this->getContainer($i));
}
}
}
}

View file

@ -6,10 +6,10 @@
* @author Stefan Herndler
* @since 1.5.0
*
* Edited for v2.0.0 and following.
* Last modified 2020-11-01T0342+0100
*/
/*
Last modified: 2020-10-29T1402+0100
*/
// If called directly, abort:
defined( 'ABSPATH' ) or die;
@ -309,10 +309,8 @@ class MCI_Footnotes_Task {
* @return string
*/
public function search($p_str_Content, $p_bool_ConvertHtmlChars, $p_bool_HideFootnotesText) {
// prepare prepending post ID to make footnote IDs unique wrt archive view:
$id_underscore = get_the_id();
$id_underscore .= '_';
self::$a_str_Prefix = $id_underscore;
// prepare prepending post ID to make footnote IDs unique wrt archive view:
self::$a_str_Prefix = get_the_id() . '_';
// contains the index for the next footnote on this page
$l_int_FootnoteIndex = count(self::$a_arr_Footnotes) + 1;
// contains the starting position for the lookup of a footnote

View file

@ -5,8 +5,10 @@
* @filesource
* @author Stefan Herndler
* @since 1.5.0 14.09.14 10:58
*
* Last modified: 2020-11-01T0347+0100
*/
// Last modified: 2020-10-29T0805+0100
/**
* Handles each Template file for the Plugin Frontend (e.g. Settings Dashboard, Public pages, ...).
@ -17,114 +19,114 @@
*/
class MCI_Footnotes_Template {
/**
* Directory name for dashboard templates.
*
* @author Stefan Herndler
* @since 1.5.0
* @var string
*/
const C_STR_DASHBOARD = "dashboard";
/**
* Directory name for dashboard templates.
*
* @author Stefan Herndler
* @since 1.5.0
* @var string
*/
const C_STR_DASHBOARD = "dashboard";
/**
* Directory name for public templates.
*
* @author Stefan Herndler
* @since 1.5.0
* @var string
*/
const C_STR_PUBLIC = "public";
/**
* Directory name for public templates.
*
* @author Stefan Herndler
* @since 1.5.0
* @var string
*/
const C_STR_PUBLIC = "public";
/**
* Contains the content of the template after initialize.
*
* @author Stefan Herndler
* @since 1.5.0
* @var string
*/
private $a_str_OriginalContent = "";
/**
* Contains the content of the template after initialize.
*
* @author Stefan Herndler
* @since 1.5.0
* @var string
*/
private $a_str_OriginalContent = "";
/**
* Contains the content of the template after initialize with replaced place holders.
*
* @author Stefan Herndler
* @since 1.5.0
* @var string
*/
private $a_str_ReplacedContent = "";
/**
* Contains the content of the template after initialize with replaced place holders.
*
* @author Stefan Herndler
* @since 1.5.0
* @var string
*/
private $a_str_ReplacedContent = "";
/**
* Class Constructor. Reads and loads the template file without replace any placeholder.
*
* @author Stefan Herndler
* @since 1.5.0
* @param string $p_str_FileType Template file type (take a look on the Class constants).
* @param string $p_str_FileName Template file name inside the Template directory without the file extension.
* @param string $p_str_Extension Optional Template file extension (default: html)
*/
public function __construct($p_str_FileType, $p_str_FileName, $p_str_Extension = "html") {
// no template file type and/or file name set
if (empty($p_str_FileType) || empty($p_str_FileName)) {
return;
}
// get absolute path to the specified template file
$l_str_TemplateFile = dirname(__FILE__) . "/../templates/" . $p_str_FileType . "/" . $p_str_FileName . "." . $p_str_Extension;
// Template file does not exist
if (!file_exists($l_str_TemplateFile)) {
return;
}
// get Template file content
$this->a_str_OriginalContent = str_replace("\n", "", file_get_contents($l_str_TemplateFile));
$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 = str_replace(" ", " ", $this->a_str_OriginalContent);
$this->reload();
}
/**
* Class Constructor. Reads and loads the template file without replace any placeholder.
*
* @author Stefan Herndler
* @since 1.5.0
* @param string $p_str_FileType Template file type (take a look on the Class constants).
* @param string $p_str_FileName Template file name inside the Template directory without the file extension.
* @param string $p_str_Extension Optional Template file extension (default: html)
*/
public function __construct($p_str_FileType, $p_str_FileName, $p_str_Extension = "html") {
// no template file type and/or file name set
if (empty($p_str_FileType) || empty($p_str_FileName)) {
return;
}
// get absolute path to the specified template file
$l_str_TemplateFile = dirname(__FILE__) . "/../templates/" . $p_str_FileType . "/" . $p_str_FileName . "." . $p_str_Extension;
// Template file does not exist
if (!file_exists($l_str_TemplateFile)) {
return;
}
// get Template file content
$this->a_str_OriginalContent = str_replace("\n", "", file_get_contents($l_str_TemplateFile));
$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->reload();
}
/**
* Replace all placeholders specified in array.
*
* @author Stefan Herndler
* @since 1.5.0
* @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)) {
return false;
}
// template content is empty
if (empty($this->a_str_ReplacedContent)) {
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);
}
// success
return true;
}
/**
* Replace all placeholders specified in array.
*
* @author Stefan Herndler
* @since 1.5.0
* @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)) {
return false;
}
// template content is empty
if (empty($this->a_str_ReplacedContent)) {
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);
}
// 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;
}
/**
* 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;
}
/**
* 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;
}
/**
* 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;
}
} // end of class