This repository has been archived on 2023-08-16. You can view files and clone it, but cannot push or open issues or pull requests.
footnotes/src/public/class-general.php

295 lines
8.8 KiB
PHP
Raw Normal View History

<?php
/**
* The public-facing functionality of the plugin.
*
2021-05-01 20:34:46 +00:00
* @package footnotes
* @since 2.8.0
*/
2021-05-02 18:33:29 +00:00
declare(strict_types=1);
2021-05-01 20:34:46 +00:00
namespace footnotes\general;
2021-05-01 20:38:11 +00:00
2021-05-01 20:34:46 +00:00
use footnotes\includes as Includes;
/**
2021-05-01 20:34:46 +00:00
* Class provide all public-facing functionality of the plugin.
*
* Defines the plugin name, version, and enqueues all public-facing stylesheets
* and JavaScript.
*
2021-05-01 20:34:46 +00:00
* @package footnotes
* @since 2.8.0
*/
2021-05-01 20:34:46 +00:00
class General {
/**
* The ID of this plugin.
*
2021-04-30 17:03:15 +00:00
* @since 2.8.0
2021-05-01 18:22:41 +00:00
2021-04-30 17:03:15 +00:00
* @access private
* @var string $plugin_name The ID of this plugin.
*/
2021-05-02 18:33:29 +00:00
private string $plugin_name;
/**
* The version of this plugin.
*
2021-04-30 17:03:15 +00:00
* @since 2.8.0
2021-05-01 18:22:41 +00:00
2021-04-30 17:03:15 +00:00
* @access private
* @var string $version The current version of this plugin.
*/
2021-05-02 18:33:29 +00:00
private string $version;
2021-04-27 08:54:07 +00:00
2021-04-27 08:31:08 +00:00
/**
* The reference container widget.
*
2021-04-30 17:03:15 +00:00
* @since 2.8.0
*
2021-05-01 20:34:46 +00:00
* @var Widget\Reference_Container $reference_container_widget The reference container widget
2021-04-27 08:31:08 +00:00
*/
2021-05-02 18:33:29 +00:00
private Widget\Reference_Container $reference_container_widget;
/**
2021-04-27 08:31:08 +00:00
* The footnote parser.
*
2021-04-30 17:03:15 +00:00
* @since 1.5.0
2021-05-01 20:34:46 +00:00
* @since 2.8.0 Moved from {@see Footnotes} to {@see Includes\Public}.
2021-05-02 18:33:29 +00:00
* @todo Review null init.
2021-04-30 17:03:15 +00:00
*
2021-05-01 20:34:46 +00:00
* @var Parser $task The Plugin task.
*/
2021-05-02 18:33:29 +00:00
public ?Parser $a_obj_task = null;
/**
* Flag for using tooltips.
*
2021-04-30 17:03:15 +00:00
* @since 2.4.0
2021-05-01 20:34:46 +00:00
* @since 2.8.0 Moved from {@see Footnotes} to {@see Includes\Public}.
2021-04-30 17:03:15 +00:00
*
* @var bool $tooltips_enabled Whether tooltips are enabled or not.
*/
public static $a_bool_tooltips_enabled = false;
/**
* Allows to determine whether alternative tooltips are enabled.
*
2021-04-30 17:03:15 +00:00
* @since 2.1.1
2021-05-01 20:34:46 +00:00
* @since 2.8.0 Moved from {@see Footnotes} to {@see Includes\Public}.
2021-04-30 17:03:15 +00:00
*
* @var bool
*/
public static $a_bool_alternative_tooltips_enabled = false;
/**
* Allows to determine whether AMP compatibility mode is enabled.
*
2021-04-30 17:03:15 +00:00
* @since 2.6.0
2021-05-01 20:34:46 +00:00
* @since 2.8.0 Moved from {@see Footnotes} to {@see Includes\Public}.
2021-04-30 17:03:15 +00:00
*
* @var bool
*/
public static $a_bool_amp_enabled = false;
/**
* Allows to determine the script mode among jQuery or plain JS.
*
2021-04-30 17:03:15 +00:00
* @since 2.5.6
2021-05-01 20:34:46 +00:00
* @since 2.8.0 Moved from {@see Footnotes} to {@see Includes\Public}.
2021-04-30 17:03:15 +00:00
*
* @var string js to use plain JavaScript, jquery to use jQuery.
*/
public static $a_str_script_mode = 'js';
/**
* Initialize the class and set its properties.
*
2021-04-30 17:03:15 +00:00
* @since 2.8.0
2021-05-01 18:22:41 +00:00
* @param string $plugin_name The name of this plugin.
* @param string $version The version of this plugin.
*/
2021-05-02 18:33:29 +00:00
public function __construct( string $plugin_name, string $version ) {
$this->plugin_name = $plugin_name;
$this->version = $version;
$this->load_dependencies();
2021-04-26 22:04:20 +00:00
// Set conditions re-used for stylesheet enqueuing and in class/task.php.
2021-05-01 20:34:46 +00:00
self::$a_bool_amp_enabled = Includes\Convert::to_bool( Includes\Settings::instance()->get( Includes\Settings::C_STR_FOOTNOTES_AMP_COMPATIBILITY_ENABLE ) );
self::$a_bool_tooltips_enabled = Includes\Convert::to_bool( Includes\Settings::instance()->get( Includes\Settings::C_STR_FOOTNOTES_MOUSE_OVER_BOX_ENABLED ) );
self::$a_bool_alternative_tooltips_enabled = Includes\Convert::to_bool( Includes\Settings::instance()->get( Includes\Settings::C_STR_FOOTNOTES_MOUSE_OVER_BOX_ALTERNATIVE ) );
self::$a_str_script_mode = Includes\Settings::instance()->get( Includes\Settings::C_STR_FOOTNOTES_REFERENCE_CONTAINER_SCRIPT_MODE );
}
/**
* Load the required public-facing dependencies.
*
* Include the following files that provide the public-facing functionality
* of this plugin:
*
2021-05-01 20:34:46 +00:00
* - {@see Parser}: parses Posts and Pages for footnote shortcodes; and
* - {@see Widget\Reference_Container}: defines the Reference Container widget.
*
2021-04-30 17:03:15 +00:00
* @since 2.8.0
*/
2021-05-02 18:33:29 +00:00
private function load_dependencies(): void {
// TODO: neaten up and document once placements and names are settled.
2021-05-01 20:34:46 +00:00
require_once plugin_dir_path( dirname( __FILE__ ) ) . 'includes/class-config.php';
require_once plugin_dir_path( dirname( __FILE__ ) ) . 'includes/class-settings.php';
require_once plugin_dir_path( dirname( __FILE__ ) ) . 'includes/class-convert.php';
2021-05-01 20:34:46 +00:00
require_once plugin_dir_path( dirname( __FILE__ ) ) . 'public/class-parser.php';
require_once plugin_dir_path( dirname( __FILE__ ) ) . 'public/widget/class-reference-container.php';
2021-05-01 20:34:46 +00:00
$this->reference_container_widget = new Widget\Reference_Container( $this->plugin_name );
2021-04-27 08:54:07 +00:00
2021-05-01 20:34:46 +00:00
$this->a_obj_task = new Parser();
}
/**
* Register the stylesheets for the public-facing side of the site.
*
2021-04-30 17:03:15 +00:00
* Enables enqueuing the formatted individual stylesheets if {@see PRODUCTION_ENV}
* is `true`.
2021-04-27 07:31:37 +00:00
*
2021-04-30 17:03:15 +00:00
* @since 1.5.0
* @since 2.5.5 Change stylesheet schema.
2021-05-01 20:34:46 +00:00
* @since 2.8.0 Moved from {@see Footnotes} to {@see Includes\Public}.
*/
2021-05-02 18:33:29 +00:00
public function enqueue_styles(): void {
if ( PRODUCTION_ENV ) {
// Set tooltip mode for use in stylesheet name.
if ( self::$a_bool_tooltips_enabled ) {
if ( self::$a_bool_amp_enabled ) {
$l_str_tooltip_mode_short = 'ampt';
$l_str_tooltip_mode_long = 'amp-tooltips';
} elseif ( self::$a_bool_alternative_tooltips_enabled ) {
$l_str_tooltip_mode_short = 'altt';
$l_str_tooltip_mode_long = 'alternative-tooltips';
} else {
$l_str_tooltip_mode_short = 'jqtt';
$l_str_tooltip_mode_long = 'jquery-tooltips';
}
} else {
$l_str_tooltip_mode_short = 'nott';
$l_str_tooltip_mode_long = 'no-tooltips';
}
// Set basic responsive page layout mode for use in stylesheet name.
2021-05-01 20:34:46 +00:00
$l_str_page_layout_option = Includes\Settings::instance()->get( Includes\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.
wp_enqueue_style(
"footnotes-{$l_str_tooltip_mode_long}-pagelayout-{$l_str_page_layout_option}",
plugin_dir_url( __FILE__ ) . "css/footnotes-{$l_str_tooltip_mode_short}brpl{$l_str_layout_mode}.min.css",
array(),
( PRODUCTION_ENV ) ? $this->version : filemtime(
plugin_dir_path(
2021-05-02 18:33:29 +00:00
__FILE__
) . "css/footnotes-{$l_str_tooltip_mode_short}brpl{$l_str_layout_mode}.min.css"
),
'all'
);
2021-05-02 18:19:46 +00:00
} else {
2021-05-02 18:33:29 +00:00
foreach ( array( 'amp-tooltips', 'common', 'layout-entry-content', 'layout-main-content', 'layout-reference-container', 'tooltips', 'tooltips-alternative' ) as $val ) {
2021-05-02 18:19:46 +00:00
wp_enqueue_style(
"footnotes-$val",
plugin_dir_url( __FILE__ ) . "css/dev-$val.css",
array(),
filemtime(
plugin_dir_path(
2021-05-02 18:33:29 +00:00
__FILE__
2021-05-02 18:19:46 +00:00
) . "css/dev-$val.css"
),
'all'
);
}
}
}
/**
* Register the JavaScript for the public-facing side of the site.
*
2021-04-30 17:03:15 +00:00
* @since 1.5.0
* @since 2.0.0 Add jQueryUI dependency.
* @since 2.1.2 Add jQuery Tools dependency.
* @since 2.5.6 Add jQuery dependency.
2021-05-01 20:34:46 +00:00
* @since 2.8.0 Moved from {@see Footnotes} to {@see Includes\Public}.
*/
2021-05-02 18:33:29 +00:00
public function enqueue_scripts(): void {
2021-04-30 17:03:15 +00:00
/*
* Enqueues the jQuery library registered by WordPress.
*
* As jQuery is also used for animated scrolling, 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 ( ! self::$a_bool_amp_enabled ) {
if ( 'jquery' === self::$a_str_script_mode || ( self::$a_bool_tooltips_enabled && ! self::$a_bool_alternative_tooltips_enabled ) ) {
wp_enqueue_script( 'jquery' );
}
if ( self::$a_bool_tooltips_enabled && ! self::$a_bool_alternative_tooltips_enabled ) {
2021-04-30 17:03:15 +00:00
/*
* Enqueues the jQuery Tools library shipped with the plugin.
*
2021-04-30 17:03:15 +00:00
* Redacted `jQuery.browser`, completed minification;
* see full header in `public/js/jquery.tools.js`.
2021-04-30 17:03:15 +00:00
* No -js in the handle, is appended automatically.
* Deferring to the footer breaks jQuery tooltip display.
*/
wp_enqueue_script( $this->plugin_name, plugin_dir_url( __FILE__ ) . 'js/jquery.tools' . ( ( PRODUCTION_ENV ) ? '.min' : '' ) . '.js', array(), '1.2.7.redacted.2', false );
2021-04-30 17:03:15 +00:00
/*
* Enqueues some jQuery UI libraries registered by WordPress.
*
* If alternative tooltips are enabled, these libraries are not needed.
*/
wp_enqueue_script( 'jquery-ui-core' );
wp_enqueue_script( 'jquery-ui-widget' );
wp_enqueue_script( 'jquery-ui-position' );
wp_enqueue_script( 'jquery-ui-tooltip' );
}
}
}
2021-04-27 08:54:07 +00:00
2021-04-27 08:31:08 +00:00
/**
* Register the widget(s) for the public-facing side of the site.
*
2021-04-30 17:03:15 +00:00
* @since 1.5.0
2021-05-01 20:34:46 +00:00
* @since 2.8.0 Moved from {@see Footnotes} to {@see Includes\Public}.
2021-04-27 08:31:08 +00:00
*/
2021-05-02 18:33:29 +00:00
public function register_widgets(): void {
2021-04-27 08:31:08 +00:00
register_widget( $this->reference_container_widget );
}
}