PluginProbe
Easy Footnotes / 1.0.16
Easy Footnotes v1.0.16
trunk 1.0.1 1.0.10 1.0.11 1.0.12 1.0.13 1.0.14 1.0.15 1.0.16 1.0.2 1.0.3 1.0.4 1.0.5 1.0.6 1.0.7 1.0.8 1.0.9 1.1.0 1.1.1 1.1.10 1.1.11 1.1.12 1.1.13 1.1.14 1.1.2 All 32 releases
← All changes | easy-footnotes.php +85 -241 trunk1.0.16 View file →
@@ -2,110 +2,62 @@
2 2 /**
3 3 * Plugin Name: Easy Footnotes
4 4 * Plugin URI: https://jasonyingling.me/easy-footnotes-wordpress/
5 5 * Description: Easily add footnotes to your posts with a simple shortcode.
6 - * Text Domain: easy-footnotes
7 - * Version: 1.1.14
6 + * Version: 1.0.16
8 7 * Author: Jason Yingling
9 8 * Author URI: https://jasonyingling.me
10 9 * License: GPL2
11 - *
12 - * @package easy-footnotes
13 10 */
14 11
15 -/*
16 - Copyright 2018 Jason Yingling (email : yingling017@gmail.com)
12 + /* Copyright 2018 Jason Yingling (email : yingling017@gmail.com)
17 13
18 - This program is free software; you can redistribute it and/or modify
19 - it under the terms of the GNU General Public License, version 2, as
20 - published by the Free Software Foundation.
14 + This program is free software; you can redistribute it and/or modify
15 + it under the terms of the GNU General Public License, version 2, as
16 + published by the Free Software Foundation.
21 17
22 - This program is distributed in the hope that it will be useful,
23 - but WITHOUT ANY WARRANTY; without even the implied warranty of
24 - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
25 - GNU General Public License for more details.
18 + This program is distributed in the hope that it will be useful,
19 + but WITHOUT ANY WARRANTY; without even the implied warranty of
20 + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 + GNU General Public License for more details.
26 22
27 - You should have received a copy of the GNU General Public License
28 - along with this program; if not, write to the Free Software
29 - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
23 + You should have received a copy of the GNU General Public License
24 + along with this program; if not, write to the Free Software
25 + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
30 26 */
31 -/**
32 - * The Easy Footnotes class. In camel case. Because I didn't follow WPCS way back when.
33 - */
27 +
34 28 class easyFootnotes {
35 29
36 - /**
37 - * Add label option using add_option if it does not already exist.
38 - *
39 - * @var array $footnotes An array for the footnotes to be stored.
40 - */
41 - public $footnotes = array();
30 + // Add label option using add_option if it does not already exist
31 + public $footnotes = array();
42 32 public $footnoteCount = 0;
43 33 public $prevPost;
44 - public $footnoteOptions;
45 - public $footnoteLookup = array();
46 - public $usedFootnoteNumbers = array();
47 34
48 - private $footnoteSettings;
49 -
50 - private $version = '1.1.14';
51 -
52 - /**
53 - * Constructing the initial plugin options, shortcodes, and hooks.
54 - */
55 35 public function __construct() {
56 - $this->footnoteSettings = array(
57 - 'footnoteLabel' => 'Footnotes',
58 - 'useLabel' => false,
59 - 'hide_easy_footnote_after_posts' => false,
60 - 'show_easy_footnote_on_front' => false,
61 - 'reset_footnotes' => false,
62 - 'combine_duplicate_footnotes' => false,
36 + $footnoteSettings = array(
37 + 'footnoteLabel' => 'Footnotes',
38 + 'useLabel' => false,
39 + 'hide_easy_footnote_after_posts' => false
63 40 );
64 41
65 - add_option( 'easy_footnotes_options', $this->footnoteSettings );
66 - add_shortcode( 'note', array( $this, 'easy_footnote_shortcode' ) );
67 - add_shortcode( 'efn_note', array( $this, 'easy_footnote_shortcode' ) );
68 - add_shortcode( 'efn_reset', array( $this, 'short_code_reset' ) );
69 - add_filter( 'the_content', array( $this, 'easy_footnote_after_content' ), 20 );
70 -
71 - $this->footnoteOptions = get_option( 'easy_footnotes_options' );
72 - if ( isset( $this->footnoteOptions['reset_footnotes'] ) && $this->footnoteOptions['reset_footnotes'] || ( ! isset( $this->footnoteOptions[ 'combine_duplicate_footnotes' ] ) || $this->footnoteOptions[ 'combine_duplicate_footnotes' ] === false ) ) {
73 - add_filter( 'the_content', array( $this, 'easy_footnote_reset' ), 999 );
74 - }
75 -
76 - add_action( 'wp_enqueue_scripts', array( $this, 'register_qtip_scripts' ) );
77 - add_action( 'admin_menu', array( $this, 'easy_footnotes_admin_actions' ) );
78 - add_action( 'admin_enqueue_scripts', array( $this, 'easy_footnotes_admin_scripts' ) );
79 - add_action( 'init', array($this, 'efn_load_textdomain') );
80 -
81 - $this->footnoteOptions = get_option( 'easy_footnotes_options' );
42 + add_option('easy_footnotes_options', $footnoteSettings);
43 + add_shortcode( 'note', array($this, 'easy_footnote_shortcode') );
44 + add_filter('the_content', array($this, 'easy_footnote_after_content'), 20);
45 + add_filter('the_content', array($this, 'easy_footnote_reset'), 999);
46 + add_action('wp_enqueue_scripts', array($this, 'register_qtip_scripts'));
47 + add_action('admin_menu', array($this, 'easy_footnotes_admin_actions'));
48 + add_action( 'admin_enqueue_scripts', array($this, 'easy_footnotes_admin_scripts') );
82 49 }
83 50
84 - /**
85 - * Registering the scripts and styles used by jQuery qTip.
86 - */
87 51 public function register_qtip_scripts() {
88 - wp_register_script( 'imagesloaded', plugins_url( '/assets/qtip/imagesloaded.pkgd.min.js', __FILE__ ), array(), $this->version, true );
89 - wp_register_script( 'qtip', plugins_url( '/assets/qtip/jquery.qtip.min.js', __FILE__ ), array( 'jquery', 'imagesloaded' ), $this->version, true );
90 - wp_register_script( 'qtipcall', plugins_url( '/assets/qtip/jquery.qtipcall.js', __FILE__ ), array( 'jquery', 'qtip' ), $this->version, true );
91 - wp_register_style( 'qtipstyles', plugins_url( '/assets/qtip/jquery.qtip.min.css', __FILE__ ), array(), $this->version, false );
92 - wp_register_style( 'easyfootnotescss', plugins_url( '/assets/easy-footnotes.css', __FILE__ ), array(), $this->version, false );
52 + wp_register_script( 'imagesloaded', plugins_url( '/assets/qtip/imagesloaded.pkgd.min.js' , __FILE__ ), null, false, true );
53 + wp_register_script( 'qtip', plugins_url( '/assets/qtip/jquery.qtip.min.js' , __FILE__ ), array('jquery', 'imagesloaded'), false, true );
54 + wp_register_script( 'qtipcall', plugins_url( '/assets/qtip/jquery.qtipcall.js' , __FILE__ ), array('jquery', 'qtip'), false, true );
55 + wp_register_style( 'qtipstyles', plugins_url( '/assets/qtip/jquery.qtip.min.css' , __FILE__ ), null, false, false );
56 + wp_register_style( 'easyfootnotescss', plugins_url( '/assets/easy-footnotes.css' , __FILE__ ), null, false, false );
93 57 }
94 58
95 - /**
96 - * Create the Easy Footnotes shortcode.
97 - *
98 - * @param array $atts Shortcode attributes.
99 - * @param string $content Content within the shortcode.
100 - */
101 - public function easy_footnote_shortcode( $atts, $content = null ) {
102 - if ( isset( $this->footnoteOptions['show_easy_footnote_on_front'] ) && $this->footnoteOptions['show_easy_footnote_on_front'] ) {
103 - $efn_show_on_front = is_front_page();
104 - } else {
105 - $efn_show_on_front = false;
106 - }
107 -
59 + public function easy_footnote_shortcode($atts, $content = null) {
108 60 wp_enqueue_style( 'qtipstyles' );
109 61 wp_enqueue_style( 'easyfootnotescss' );
110 62 wp_enqueue_script( 'imagesloaded' );
111 63 wp_enqueue_script( 'qtip' );
@@ -111,173 +63,95 @@
111 63 wp_enqueue_script( 'qtip' );
112 64 wp_enqueue_script( 'qtipcall' );
113 65 wp_enqueue_style( 'dashicons' );
114 66
115 - // Accept optional custom number attribute
116 - $atts = shortcode_atts(
117 - array(
118 - 'num' => null
119 - ),
120 - $atts
121 - );
67 + extract (shortcode_atts(array(
68 + ), $atts));
122 69
123 70 $post_id = get_the_ID();
124 71
125 - $content = do_shortcode( $content );
72 + $content = do_shortcode($content);
73 +
74 + $count = $this->footnoteCount;
126 75
127 - $content_id = md5( preg_replace("/[^A-Za-z0-9 ]/", '', wp_strip_all_tags( html_entity_decode( $content ) ) ) );
76 + // Increment the counter
77 + $count++;
128 78
129 - if ( isset( $this->footnoteOptions[ 'combine_duplicate_footnotes' ] ) && $this->footnoteOptions[ 'combine_duplicate_footnotes' ] === true ) {
130 - /**
131 - * Search for existing footnote for removing duplicate
132 - * Also add the same numbers to duplicate footnotes
133 - */
134 - if (!isset($this->usedFootnoteNumbers) ) {
135 - $this->usedFootnoteNumbers = array();
136 - }
137 - if (!isset($this->footnoteLookup)) {
138 - $this->footnoteLookup = array();
139 - }
140 - }
79 + // Set the footnoteCount (This whole process needs reworked)
80 + $this->footnoteCount = $count;
141 81
82 + //$this->easy_footnote_count($this->footnoteCount, get_the_ID());
83 + $this->easy_footnote_content($content);
142 84
143 - // If a custom number is provided, use that number and mark it as used
144 - if ( ! empty( $atts['num'] ) ) {
145 - $footnote_number = intval( $atts['num'] );
146 - $this->usedFootnoteNumbers[] = $footnote_number; // Track custom number
147 - $this->footnoteLookup[$content_id] = $footnote_number;
148 - $this->footnotes[$footnote_number] = $content;
149 - } elseif ( isset( $this->footnoteLookup[$content_id] ) ) {
150 - if ( isset( $this->footnoteOptions[ 'combine_duplicate_footnotes' ] ) && $this->footnoteOptions[ 'combine_duplicate_footnotes' ] === true ) {
151 - // Use existing footnote number for duplicate content
152 - $footnote_number = $this->footnoteLookup[$content_id];
153 - } else {
154 - $this->footnoteCount++;
155 - $footnote_number = $this->footnoteCount;
156 - $this->footnotes[$footnote_number] = $content;
157 - }
85 + if (is_singular() && is_main_query()) {
86 + $footnoteLink = '#easy-footnote-bottom-'.$this->footnoteCount.'-'.$post_id;;
158 87 } else {
159 - // Auto-increment for new footnotes, skipping used numbers
160 - do {
161 - $this->footnoteCount++;
162 - } while ( in_array( $this->footnoteCount, $this->usedFootnoteNumbers ) );
163 -
164 - $footnote_number = $this->footnoteCount;
165 - $this->footnoteLookup[$content_id] = $footnote_number;
166 - $this->usedFootnoteNumbers[] = $footnote_number; // Mark as used
167 - $this->footnotes[$footnote_number] = $content;
88 + $footnoteLink = get_permalink(get_the_ID()).'#easy-footnote-bottom-'.$this->footnoteCount.'-'.$post_id;
168 89 }
169 90
170 - // Generate the correct footnote link with the correct number
171 - $footnoteLink = (is_singular() || $efn_show_on_front) && is_main_query()
172 - ? '#easy-footnote-bottom-' . $footnote_number . '-' . $post_id
173 - : get_permalink($post_id) . '#easy-footnote-bottom-' . $footnote_number . '-' . $post_id;
174 -
175 - // Now generate the footnote markup with the correct number and link
176 - $footnoteContent = "<span id='easy-footnote-" . esc_attr($footnote_number) . '-' . $post_id
177 - . "' class='easy-footnote-margin-adjust'></span><span class='easy-footnote'>"
178 - . "<a href='" . esc_url($footnoteLink) . "' title='" . htmlspecialchars($content, ENT_QUOTES)
179 - . "'><sup>" . esc_html($footnote_number) . "</sup></a></span>";
180 -
91 + $footnoteContent = "<span id='easy-footnote-".esc_attr($this->footnoteCount).'-'.$post_id."' class='easy-footnote-margin-adjust'></span><span class='easy-footnote'><a href='".esc_url($footnoteLink)."' title='".htmlspecialchars($content, ENT_QUOTES)."'><sup>".esc_html($this->footnoteCount)."</sup></a></span>";
92 +
181 93 return $footnoteContent;
182 94 }
183 95
184 - /**
185 - * The content of a particular footnote.
186 - *
187 - * @param string $content The content from a particular call of the shortcode.
188 - */
189 - public function easy_footnote_content( $content ) {
190 - $this->footnotes[ $this->footnoteCount ] = $content;
96 + public function easy_footnote_content($content) {
97 + $this->footnotes[$this->footnoteCount] = $content;
191 98
192 99 return $this->footnotes;
193 100 }
194 101
195 - /**
196 - * Display the list of footnotes after the post content.
197 - *
198 - * @param string $content The content of the current post.
199 - */
200 - public function easy_footnote_after_content( $content ) {
201 - if ( isset( $this->footnoteOptions['hide_easy_footnote_after_posts'] ) && $this->footnoteOptions['hide_easy_footnote_after_posts'] ) {
202 - return $content;
102 + public function easy_footnote_count($count, $currentPost) {
103 + if ($this->prevPost != $currentPost) {
104 + $count = 0;
203 105 }
204 106
205 - if ( isset( $this->footnoteOptions['show_easy_footnote_on_front'] ) && $this->footnoteOptions['show_easy_footnote_on_front'] ) {
206 - $efn_show_on_front = is_front_page() || is_home();
207 - } else {
208 - $efn_show_on_front = false;
107 + $this->prevPost = $currentPost;
108 +
109 + $count++;
110 +
111 + $this->footnoteCount = $count;
112 +
113 + return $this->footnoteCount;
114 + }
115 +
116 + public function easy_footnote_after_content($content) {
117 +
118 + $footnoteOptions = get_option('easy_footnotes_options');
119 +
120 + if ( isset($footnoteOptions['hide_easy_footnote_after_posts']) && $footnoteOptions['hide_easy_footnote_after_posts'] ) {
121 + return $content;
209 122 }
210 123
211 - if ( ( is_singular() || $efn_show_on_front ) && is_main_query() ) {
124 + if (is_singular() && is_main_query()) {
212 125 $footnotesInsert = $this->footnotes;
213 126
214 127 $footnoteCopy = '';
215 - $efn_output = '';
216 128
217 - $useLabel = isset( $this->footnoteOptions['useLabel'] ) ? $this->footnoteOptions['useLabel'] : false;
218 - $efLabel = isset($this->footnoteOptions['footnoteLabel'] ) ? $this->footnoteOptions['footnoteLabel'] : __( 'Footnotes', 'easy-footnotes' );
129 + $useLabel = $footnoteOptions['useLabel'];
130 + $efLabel = $footnoteOptions['footnoteLabel'];
219 131
220 132 $post_id = get_the_ID();
221 133
222 - // Create a new array to track used footnotes and their numbers
223 - $footnote_number = 1;
224 -
225 - // sort footnotes according to numbers
226 - ksort($footnotesInsert);
227 -
228 - foreach ( $footnotesInsert as $count => $footnote ) {
229 -
230 - if ( isset( $this->footnoteOptions[ 'combine_duplicate_footnotes' ] ) && $this->footnoteOptions[ 'combine_duplicate_footnotes' ] === true ) {
231 - // If the footnote is already in the lookup, use its number
232 - if ( isset( $this->footnoteLookup[$footnote] ) ) {
233 - $count = $this->footnoteLookup[$footnote];
234 - } else {
235 - // Skip custom numbers that were already used
236 - while ( in_array( $footnote_number, $this->usedFootnoteNumbers ) ) {
237 - $footnote_number++;
238 - }
239 - }
240 - }
241 - // Generate back-to-top link and the footnote item
242 - $footnoteCopy .= '<li class="easy-footnote-single"><span id="easy-footnote-bottom-' . esc_attr( $count ) . '-' . $post_id . '" class="easy-footnote-margin-adjust"></span>' . wp_kses_post( $footnote ) . '<a class="easy-footnote-to-top" href="' . esc_url( '#easy-footnote-' . $count . '-' . $post_id ) . '"></a></li>';
134 + foreach ($footnotesInsert as $count => $footnote) {
135 + $footnoteCopy .= '<li class="easy-footnote-single"><span id="easy-footnote-bottom-'.esc_attr($count).'-'.$post_id.'" class="easy-footnote-margin-adjust"></span>'.wp_kses_post($footnote).'<a class="easy-footnote-to-top" href="'.esc_url('#easy-footnote-'.$count.'-'.$post_id).'"></a></li>';
243 136 }
244 - if ( ! empty( $footnotesInsert ) ) {
245 - if ( true === $useLabel ) {
246 - $footnote_label = '<div class="easy-footnote-title"><h4>' . esc_html( $efLabel ) . '</h4></div>';
247 - // Filter for editing footnote label markup and output.
248 - $footnote_label = apply_filters( 'efn_footnote_label', $footnote_label, $efLabel );
249 -
250 - $efn_output .= $footnote_label;
137 + if (!empty($footnotesInsert)) {
138 + if ($useLabel === true) {
139 + $content .= '<div class="easy-footnote-title"><h4>'.esc_html($efLabel).'</h4></div><ol class="easy-footnotes-wrapper">'.$footnoteCopy.'</ol>';
140 + } else {
141 + $content .= '<ol class="easy-footnotes-wrapper">'.$footnoteCopy.'</ol>';
251 142 }
143 + }
252 144
253 - $footnote_content = '';
254 -
255 - // Add filter before footnote list.
256 - $footnote_content = apply_filters( 'before_footnote', $footnote_content );
257 - $footnote_content .= '<ol class="easy-footnotes-wrapper">' . $footnoteCopy . '</ol>';
258 -
259 - // Add filter after footnote list.
260 - $footnote_content = apply_filters( 'after_footnote', $footnote_content );
261 -
262 - $efn_output .= $footnote_content;
263 -
264 - // Add filters for the entire footnote list output.
265 - $efn_output = apply_filters( 'efn_footnote_list_output', $efn_output );
266 -
267 - $content .= do_shortcode( $efn_output );
268 - }
269 145 }
270 -
146 +
271 147 return $content;
272 148 }
273 149
274 150 /**
275 151 * Reset the footnote count and footnote array each time the_content has been run.
276 - *
277 - * @param string $content The content of the post from the_content filter.
278 152 */
279 - public function easy_footnote_reset( $content ) {
153 + public function easy_footnote_reset($content) {
280 154 $this->footnoteCount = 0;
281 155
282 156 $this->footnotes = array();
283 157
@@ -283,50 +157,20 @@
283 157
284 158 return $content;
285 159 }
286 160
287 - /**
288 - * Include the easy-footnotes-admin.php file.
289 - */
161 + // Functions to create Reading Time admin pages
290 162 public function easy_footnotes_admin() {
291 - include 'easy-footnotes-admin.php';
163 + include('easy-footnotes-admin.php');
292 164 }
293 165
294 - /**
295 - * Function to add options page for Easy Footnote Settings.
296 - */
297 166 public function easy_footnotes_admin_actions() {
298 - add_options_page(
299 - __( 'Easy Footnotes Settings', 'easy-footnotes' ),
300 - __( 'Easy Footnotes', 'easy-footnotes' ),
301 - 'manage_options',
302 - 'easy-footnotes-settings',
303 - array( $this, 'easy_footnotes_admin' )
304 - );
167 + add_options_page("Easy Footnotes Settings", "Easy Footnotes", "manage_options", "easy-footnotes-settings", array($this, "easy_footnotes_admin"));
305 168 }
306 169
307 - /**
308 - * Function for enqueuring EAsy Footnotes admin scripts.
309 - */
310 170 public function easy_footnotes_admin_scripts() {
311 - wp_enqueue_style( 'easy-footnotes-admin-styles', plugins_url( '/assets/easy-footnotes-admin.css', __FILE__ ), '', $this->version );
312 - wp_enqueue_script( 'easy-footnotes-admin-scripts', plugins_url( '/assets/js/easy-footnotes-admin.js', __FILE__ ), array( 'jquery' ), $this->version, true );
171 + wp_enqueue_style( 'easy-footnotes-admin-styles', plugins_url( '/assets/easy-footnotes-admin.css' , __FILE__ ), '', '1.0.13' );
313 172 }
314 173
315 - /**
316 - * Load plugin textdomain easy-footnotes
317 - */
318 - public function efn_load_textdomain() {
319 - load_plugin_textdomain( 'easy-footnotes', false, dirname( plugin_basename( __FILE__ ) ) . '/languages' );
320 - }
321 -
322 - /**
323 - * Manually reset footnotes and counter
324 - */
325 - public function short_code_reset() {
326 - $this->footnoteCount = 0;
327 - $this->footnotes = array();
328 - return "";
329 - }
330 174 }
331 175
332 176 $easyFootnotes = new easyFootnotes();