diff --git a/wp-content/plugins/mathjax-latex/class-mathjax-latex-admin.php b/wp-content/plugins/mathjax-latex/class-mathjax-latex-admin.php new file mode 100644 index 0000000000000000000000000000000000000000..75746393a39335124077e6e3d884ffcdd31aa8cc --- /dev/null +++ b/wp-content/plugins/mathjax-latex/class-mathjax-latex-admin.php @@ -0,0 +1,246 @@ +<?php + +/* + * The contents of this file are subject to the GPL License, Version 3.0. + * + * Copyright (C) 2013, Phillip Lord, Newcastle University + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +class MathJax_Latex_Admin { + + public static $admin_tags = [ + 'input' => [ + 'type' => [], + 'name' => [], + 'id' => [], + 'disabled' => [], + 'value' => [], + 'checked' => [], + ], + 'select' => [ + 'name' => [], + 'id' => [], + ], + 'option' => [ + 'value' => [], + 'selected' => [], + ], + ]; + + public function __construct() { + add_action( 'admin_menu', [ $this, 'admin_page_init' ] ); + } + + public function admin_page_init() { + add_options_page( 'MathJax-LaTeX', 'MathJax-LaTeX', 'manage_options', 'kblog-mathjax-latex', [ $this, 'plugin_options_menu' ] ); + } + + public function plugin_options_menu() { + if ( ! current_user_can( 'manage_options' ) ) { + wp_die( __( 'You do not have sufficient permissions to access this page.' ) ); //xss ok + } + + $this->table_head(); + + // save options if this is a valid post + if ( isset( $_POST['kblog_mathjax_latex_save_field'] ) && // input var okay + wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['kblog_mathjax_latex_save_field'] ) ), 'kblog_mathjax_latex_save_action' ) // input var okay + ) { + echo "<div class='updated settings-error' id='etting-error-settings_updated'><p><strong>Settings saved.</strong></p></div>\n"; + $this->admin_save(); + } + + $checked_force_load = ''; + + if ( get_option( 'kblog_mathjax_force_load' ) ) { + $checked_force_load = 'checked="true"'; + } + + $this->admin_table_row( + 'Force Load', + 'Force the MathJax JavaScript to be loaded on every post. This removes the need to use the [mathjax] shortcode.', + "<input type='checkbox' name='kblog_mathjax_force_load' id='kblog_mathjax_force_load' value='1' $checked_force_load />", + '' + ); + + $selected_inline = get_option( 'kblog_mathjax_latex_inline' ) === 'inline' ? 'selected="true"' : ''; + $selected_display = get_option( 'kblog_mathjax_latex_inline' ) === 'display' ? 'selected="true"' : ''; + + $syntax_input = <<<EOT +<select name="kblog_mathjax_latex_inline" id="kblog_mathjax_latex_inline"> +<option value="inline" $selected_inline>Inline</option> +<option value="display" $selected_display>Display</option> +</select> +EOT; + + $this->admin_table_row( + 'Default [latex] syntax attribute.', + "By default, the [latex] shortcode renders equations using the MathJax 'inline' syntax.", + $syntax_input, + 'kblog_mathjax_latex_inline' + ); + + $wp_latex_disabled = method_exists( 'WP_LaTeX', 'init' ) ? "disabled='disable'" : ''; + $wp_latex_disabled_warning = method_exists( 'WP_LaTeX', 'init' ) ? 'Disable wp-latex to use this syntax.' : ''; + + $use_wp_latex_syntax = get_option( 'kblog_mathjax_use_wplatex_syntax', false ) ? "checked='true'" : ''; + + $this->admin_table_row( + 'Use wp-latex syntax?', + "Allows use of the \$latex$ syntax, but conflicts with wp-latex. $wp_latex_disabled_warning", + "<input type='checkbox' name='kblog_mathjax_use_wplatex_syntax' id='kblog_mathjax_use_wplatex_syntax' $wp_latex_disabled $use_wp_latex_syntax value='1'/>", + 'kblog_mathjax_use_wplatex_syntax' + ); + + $use_cdn = get_option( 'kblog_mathjax_use_cdn', true ) ? 'checked="true"' : ''; + + $this->admin_table_row( + 'Use MathJax CDN Service?', + 'Allows use of the MathJax hosted content delivery network. By using this, you are agreeing to the <a href="http://www.mathjax.org/download/mathjax-cdn-terms-of-service/">MathJax CDN Terms of Service</a>.', + "<input type='checkbox' name='kblog_mathjax_use_cdn' id='use_cdn' value='1' $use_cdn/>", + 'use_cdn' + ); + + $custom_location_disabled = get_option( 'kblog_mathjax_use_cdn', true ) ? 'disabled="disabled"' : ''; + $custom_location = "value='" . esc_attr( get_option( 'kblog_mathjax_custom_location', '' ) ) . "'"; + + $this->admin_table_row( + 'Custom MathJax location?', + 'If you are not using the MathJax CDN enter the location of your MathJax script.', + "<input type='textbox' name='kblog_mathjax_custom_location' id='kblog_mathjax_custom_location' $custom_location $custom_location_disabled>", + 'kblog_mathjax_custom_location' + ); + + $options = $this->config_options(); + + $select_string = "<select name='kblog_mathjax_config' id='kblog_mathjax_config'>\n"; + + foreach ( $options as $i ) { + $selected = get_option( 'kblog_mathjax_config', 'default' ) === $i ? "selected='true'" : ''; + $select_string .= "<option value='$i' " . esc_attr( $selected ) . ">$i</option>\n"; + } + + $select_string .= '</select>'; + + $this->admin_table_row( + 'MathJax Configuration', + "See the <a href='http://docs.mathjax.org/en/v1.1-latest/configuration.html#loading'>MathJax documentation</a> for more details.", + $select_string, + 'kblog_mathjax_config' + ); + + $this->table_foot(); + } + + public function config_options() { + $options = [ + 'default', + 'Accessible', + 'TeX-AMS_HTML', + 'TeX-AMS-MML_HTMLorMML', + ]; + + return $options; + } + + public function admin_save() { + if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) { + check_ajax_referer( 'kblog_mathjax_latex_save_field', 'security' ); + } + + update_option( 'kblog_mathjax_force_load', array_key_exists( 'kblog_mathjax_force_load', $_POST ) ); // input var okay + + if ( array_key_exists( 'kblog_mathjax_latex_inline', $_POST ) && isset( $_POST['kblog_mathjax_latex_inline'] ) && // input var okay + in_array( sanitize_text_field( wp_unslash( $_POST['kblog_mathjax_latex_inline'] ) ), [ 'inline', 'display' ], true ) // input var okay + ) { + update_option( 'kblog_mathjax_latex_inline', sanitize_text_field( wp_unslash( $_POST['kblog_mathjax_latex_inline'] ) ) ); // input var okay + } + + update_option( 'kblog_mathjax_use_wplatex_syntax', array_key_exists( 'kblog_mathjax_use_wplatex_syntax', $_POST ) ); // input var okay + + update_option( 'kblog_mathjax_use_cdn', array_key_exists( 'kblog_mathjax_use_cdn', $_POST ) ); // input var okay + + if ( array_key_exists( 'kblog_mathjax_custom_location', $_POST ) && isset( $_POST['kblog_mathjax_custom_location'] ) ) { // input var okay + update_option( 'kblog_mathjax_custom_location', esc_url_raw( wp_unslash( $_POST['kblog_mathjax_custom_location'] ) ) ); // input var okay + } + + if ( array_key_exists( 'kblog_mathjax_config', $_POST ) && isset( $_POST['kblog_mathjax_config'] ) && // input var okay + in_array( sanitize_text_field( wp_unslash( $_POST['kblog_mathjax_config'] ) ), $this->config_options(), true ) // input var okay + ) { + update_option( 'kblog_mathjax_config', sanitize_text_field( wp_unslash( $_POST['kblog_mathjax_config'] ) ) ); // input var okay + } + } + + public function table_head() { + ?> + <div class='wrap' id='mathjax-latex-options'> + <h2>Mathjax-Latex by Kblog</h2> + <form id='mathjaxlatex' name='mathjaxlatex' action='' method='POST'> + <?php wp_nonce_field( 'kblog_mathjax_latex_save_action', 'kblog_mathjax_latex_save_field', true ); ?> + <table class='form-table'> + <caption class='screen-reader-text'>The following lists configuration options for the MathJax-LaTeX plugin.</caption> + <?php + } + + public function table_foot() { + ?> + </table> + + <p class="submit"><input type="submit" class="button button-primary" value="Save Changes"/></p> + </form> + + </div> + <script type="text/javascript"> + jQuery(function($) { + if (typeof($.fn.prop) !== 'function') { + return; // ignore this for sites with jquery < 1.6 + } + // enable or disable the cdn input field when checking/unchuecking the "use cdn" checkbox + var cdn_check = $('#use_cdn'), + cdn_location = $('#kblog_mathjax_custom_location'); + + cdn_check.change(function() { + var checked = cdn_check.is(':checked'); + cdn_location.prop('disabled', checked); + }); + }); + </script> + <?php + } + + public function admin_table_row( $head, $comment, $input, $input_id ) { + ?> + <tr valign="top"> + <th scope="row"> + <label for="<?php echo esc_attr( $input_id ); ?>"><?php echo esc_html( $head ); ?></label> + </th> + <td> + <?php echo wp_kses( $input, self::$admin_tags ); ?> + <p class="description"><?php echo wp_kses_post( $comment ); ?></p> + </td> + </tr> + <?php + } +} // class + +function mathjax_latex_admin_init() { + global $mathjax_latex_admin; + $mathjax_latex_admin = new MathJax_Latex_Admin(); +} + +if ( is_admin() ) { + mathjax_latex_admin_init(); +} diff --git a/wp-content/plugins/mathjax-latex/class-mathjax-latex.php b/wp-content/plugins/mathjax-latex/class-mathjax-latex.php new file mode 100644 index 0000000000000000000000000000000000000000..29a1da0988672292513f8a013152f93a4208b6ed --- /dev/null +++ b/wp-content/plugins/mathjax-latex/class-mathjax-latex.php @@ -0,0 +1,291 @@ +<?php +/* + * The contents of this file are subject to the LGPL License, Version 3.0. + * + * Copyright (C) 2010-2013, Phillip Lord, Newcastle University + * Copyright (C) 2010-2011, Simon Cockell, Newcastle University + * + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see http://www.gnu.org/licenses/. + */ + +define( 'MATHJAX_VERSION', '1.3.10' ); + +require_once __DIR__ . '/class-mathjax-latex-admin.php'; + +class MathJax_Latex { + public static $add_script; + public static $block_script; + public static $mathml_tags = [ + 'math' => [ 'class', 'id', 'style', 'dir', 'href', 'mathbackground', 'mathcolor', 'display', 'overflow', 'xmlns' ], + 'maction' => [ 'actiontype', 'class', 'id', 'style', 'href', 'mathbackground', 'mathcolor', 'selection' ], + 'maligngroup' => [], + 'malignmark' => [], + 'menclose' => [ 'class', 'id', 'style', 'href', 'mathbackground', 'mathcolor', 'notation' ], + 'merror' => [ 'class', 'id', 'style', 'href', 'mathbackground', 'mathcolor' ], + 'mfenced' => [ 'class', 'id', 'style', 'close', 'href', 'mathbackground', 'mathcolor', 'open', 'separators' ], + 'mfrac' => [ 'bevelled', 'class', 'id', 'style', 'denomalign', 'href', 'linethickness', 'mathbackground', 'mathcolor', 'numalign' ], + 'mglyph' => [ 'alt', 'class', 'id', 'style', 'height', 'href', 'mathbackground', 'src', 'valign', 'width' ], + 'mi' => [ 'class', 'id', 'style', 'href', 'mathbackground', 'mathcolor', 'mathsize', 'mathvariant' ], + 'mlabeledtr' => [ 'class', 'id', 'style', 'columnalign', 'groupalign', 'href', 'mathbackground', 'mathcolor', 'rowalign' ], + 'mlongdiv' => [], + 'mmultiscripts' => [ 'class', 'id', 'style', 'href', 'mathbackground', 'mathcolor', 'subscriptshift', 'superscriptshift' ], + 'mn' => [ 'class', 'id', 'style', 'dir', 'href', 'mathbackground', 'mathcolor', 'mathsize', 'mathvariant' ], + 'mo' => [ 'accent', 'class', 'id', 'style', 'dir', 'fence', 'form', 'href', 'largeop', 'lspace', 'mathbackground', 'mathcolor', 'mathsize', 'mathvariant', 'maxsize', 'minsize', 'moveablelimits', 'rspace', 'separator', 'stretchy', 'symmetric' ], + 'mover' => [ 'accent', 'align', 'class', 'id', 'style', 'href', 'mathbackground', 'mathcolor' ], + 'mpadded' => [ 'class', 'id', 'style', 'depth', 'height', 'href', 'lspace', 'mathbackground', 'mathcolor', 'voffset', 'width' ], + 'mphantom' => [ 'class', 'id', 'style', 'mathbackground' ], + 'mroot' => [ 'class', 'id', 'style', 'href', 'mathbackground', 'mathcolor' ], + 'mrow' => [ 'class', 'id', 'style', 'dir', 'href', 'mathbackground', 'mathcolor' ], + 'ms' => [ 'class', 'id', 'style', 'dir', 'lquote', 'href', 'mathbackground', 'mathcolor', 'mathsize', 'mathvariant', 'rquote' ], + 'mscarries' => [], + 'mscarry' => [], + 'msgroup' => [], + 'msline' => [], + 'mspace' => [ 'class', 'id', 'style', 'depth', 'height', 'linebreak', 'mathbackground', 'width' ], + 'msqrt' => [ 'class', 'id', 'style', 'href', 'mathbackground', 'mathcolor' ], + 'msrow' => [], + 'mstack' => [], + 'mstyle' => [ 'dir', 'decimalpoint', 'displaystyle', 'infixlinebreakstyle', 'scriptlevel', 'scriptminsize', 'scriptsizemultiplier' ], + 'msub' => [ 'class', 'id', 'style', 'mathbackground', 'mathcolor', 'subscriptshift' ], + 'msubsup' => [ 'class', 'id', 'style', 'href', 'mathbackground', 'mathcolor', 'subscriptshift', 'superscriptshift' ], + 'msup' => [ 'class', 'id', 'style', 'href', 'mathbackground', 'mathcolor', 'superscriptshift' ], + 'mtable' => [ 'class', 'id', 'style', 'align', 'alignmentscope', 'columnalign', 'columnlines', 'columnspacing', 'columnwidth', 'displaystyle', 'equalcolumns', 'equalrows', 'frame', 'framespacing', 'groupalign', 'href', 'mathbackground', 'mathcolor', 'minlabelspacing', 'rowalign', 'rowlines', 'rowspacing', 'side', 'width' ], + 'mtd' => [ 'class', 'id', 'style', 'columnalign', 'columnspan', 'groupalign', 'href', 'mathbackground', 'mathcolor', 'rowalign', 'rowspan' ], + 'mtext' => [ 'class', 'id', 'style', 'dir', 'href', 'mathbackground', 'mathcolor', 'mathsize', 'mathvariant' ], + 'mtr' => [ 'class', 'id', 'style', 'columnalign', 'groupalign', 'href', 'mathbackground', 'mathcolor', 'rowalign' ], + 'munder' => [ 'accentunder', 'align', 'class', 'id', 'style', 'mathbackground', 'mathcolor' ], + 'munderover' => [ 'accent', 'accentunder', 'align', 'class', 'id', 'style', 'href', 'mathbackground', 'mathcolor' ], + 'semantics' => [ 'definitionURL', 'encoding', 'cd', 'name', 'src' ], + 'annotation' => [ 'definitionURL', 'encoding', 'cd', 'name', 'src' ], + 'annotation-xml' => [ 'definitionURL', 'encoding', 'cd', 'name', 'src' ], + ]; + + public static function init() { + register_activation_hook( __FILE__, [ __CLASS__, 'mathjax_install' ] ); + register_deactivation_hook( __FILE__, [ __CLASS__, 'mathjax_uninstall' ] ); + + if ( get_option( 'kblog_mathjax_force_load' ) ) { + self::$add_script = true; + } + + add_shortcode( 'mathjax', [ __CLASS__, 'mathjax_shortcode' ] ); + add_shortcode( 'nomathjax', [ __CLASS__, 'nomathjax_shortcode' ] ); + add_shortcode( 'latex', [ __CLASS__, 'latex_shortcode' ] ); + add_action( 'wp_footer', [ __CLASS__, 'add_script' ] ); + add_filter( 'script_loader_tag', [ __CLASS__, 'script_loader_tag' ], 10, 3 ); + + if ( get_option( 'kblog_mathjax_use_wplatex_syntax' ) ) { + add_filter( 'the_content', [ __CLASS__, 'inline_to_shortcode' ] ); + } + + add_filter( 'plugin_action_links', [ __CLASS__, 'mathjax_settings_link' ], 9, 2 ); + + add_filter( 'the_content', [ __CLASS__, 'filter_br_tags_on_math' ] ); + + add_action( 'init', [ __CLASS__, 'allow_mathml_tags' ] ); + add_filter( 'tiny_mce_before_init', [ __CLASS__, 'allow_mathml_tags_in_tinymce' ] ); + } + + // registers default options + public static function mathjax_install() { + add_option( 'kblog_mathjax_force_load', false ); + add_option( 'kblog_mathjax_latex_inline', 'inline' ); + add_option( 'kblog_mathjax_use_wplatex_syntax', false ); + add_option( 'kblog_mathjax_use_cdn', true ); + add_option( 'kblog_mathjax_custom_location', false ); + add_option( 'kblog_mathjax_config', 'default' ); + } + + public static function mathjax_uninstall() { + delete_option( 'kblog_mathjax_force_load' ); + delete_option( 'kblog_mathjax_latex_inline' ); + delete_option( 'kblog_mathjax_use_wplatex_syntax' ); + delete_option( 'kblog_mathjax_use_cdn' ); + delete_option( 'kblog_mathjax_custom_location' ); + delete_option( 'kblog_mathjax_config' ); + } + + public static function mathjax_shortcode( $atts, $content ) { + self::$add_script = true; + } + + public static function nomathjax_shortcode( $atts, $content ) { + self::$block_script = true; + } + + public static function latex_shortcode( $atts, $content ) { + self::$add_script = true; + + // this gives us an optional "syntax" attribute, which defaults to "inline", but can also be "display" + $shortcode_atts = shortcode_atts( + [ + 'syntax' => get_option( 'kblog_mathjax_latex_inline' ), + ], $atts + ); + + if ( 'inline' === $shortcode_atts['syntax'] ) { + return '\(' . $content . '\)'; + } elseif ( 'display' === $shortcode_atts['syntax'] ) { + return '\[' . $content . '\]'; + } + } + + public static function add_script() { + if ( ! self::$add_script ) { + return; + } + + if ( self::$block_script ) { + return; + } + + // initialise option for existing MathJax-LaTeX users + if ( get_option( 'kblog_mathjax_use_cdn' ) || ! get_option( 'kblog_mathjax_custom_location' ) ) { + $mathjax_location = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.2/MathJax.js'; + } else { + $mathjax_location = get_option( 'kblog_mathjax_custom_location' ); + } + + $mathjax_url = $mathjax_location . '?config=' . get_option( 'kblog_mathjax_config' ); + + wp_enqueue_script( 'mathjax', $mathjax_url, false, MATHJAX_VERSION, false ); + + $mathjax_config = apply_filters( 'mathjax_config', [] ); + if ( $mathjax_config ) { + wp_add_inline_script( 'mathjax', 'MathJax.Hub.Config(' . wp_json_encode( $mathjax_config ) . ');' ); + } + } + + + /** + * Set the script tag to have type text/x-mathjax-config + * + * @param string $tag The `<script>` tag for the enqueued script. + * @param string $handle The script's registered handle. + * @param string $src The script's source URL. + * + * @return string $tag + */ + public static function script_loader_tag( $tag, $handle = null, $src = null ) { + if ( 'mathjax' === $handle ) { + // replace the <script> tag for the inline script, but not for the <script> tag with src="" + return str_replace( "<script type='text/javascript'>", "<script type='text/x-mathjax-config'>", $tag ); + } + + return $tag; + } + + public static function inline_to_shortcode( $content ) { + if ( false === strpos( $content, '$latex' ) ) { + return $content; + } + + self::$add_script = true; + + return preg_replace_callback( '#\$latex[= ](.*?[^\\\\])\$#', [ __CLASS__, 'inline_to_shortcode_callback' ], $content ); + } + + public static function inline_to_shortcode_callback( $matches ) { + + // + // Also support wp-latex syntax. This includes the ability to set background and foreground + // colour, which we can ignore. + // + + if ( preg_match( '/.+((?:&|&)s=(-?[0-4])).*/i', $matches[1], $s_matches ) ) { + $matches[1] = str_replace( $s_matches[1], '', $matches[1] ); + } + + if ( preg_match( '/.+((?:&|&)fg=([0-9a-f]{6})).*/i', $matches[1], $fg_matches ) ) { + $matches[1] = str_replace( $fg_matches[1], '', $matches[1] ); + } + + if ( preg_match( '/.+((?:&|&)bg=([0-9a-f]{6})).*/i', $matches[1], $bg_matches ) ) { + $matches[1] = str_replace( $bg_matches[1], '', $matches[1] ); + } + + return "[latex]{$matches[1]}[/latex]"; + } + + // add a link to settings on the plugin management page + public static function mathjax_settings_link( $links, $file ) { + if ( 'mathjax-latex/mathjax-latex.php' === $file && function_exists( 'admin_url' ) ) { + $settings_link = '<a href="' . esc_url( admin_url( 'options-general.php?page=kblog-mathjax-latex' ) ) . '">' . esc_html__( 'Settings' ) . '</a>'; + array_unshift( $links, $settings_link ); + } + return $links; + } + + /** + * Removes the <br /> tags inside math tags + * + * @param $content + * @return string without <br /> tags + */ + public static function filter_br_tags_on_math( $content ) { + $filtered_content = preg_replace_callback( + '/(<math.*>.*<\/math>)/isU', + function( $matches ) { + return str_replace( array( '<br/>', '<br />', '<br>' ), '', $matches[0] ); + }, + $content + ); + return null === $filtered_content ? $content : $filtered_content; + } + + /** + * Allow MathML tags within WordPress + * http://vip.wordpress.com/documentation/register-additional-html-attributes-for-tinymce-and-wp-kses/ + * https://developer.mozilla.org/en-US/docs/Web/MathML/Element + */ + public static function allow_mathml_tags() { + global $allowedposttags; + + foreach ( self::$mathml_tags as $tag => $attributes ) { + $allowedposttags[ $tag ] = []; + + foreach ( $attributes as $a ) { + $allowedposttags[ $tag ][ $a ] = true; + } + } + } + + /** + * Ensure that the MathML tags will not be removed + * by the TinyMCE editor + */ + public static function allow_mathml_tags_in_tinymce( $options ) { + + $extended_tags = []; + + foreach ( self::$mathml_tags as $tag => $attributes ) { + if ( ! empty( $attributes ) ) { + $tag = $tag . '[' . implode( '|', $attributes ) . ']'; + } + + $extended_tags[] = $tag; + } + + if ( ! isset( $options['extended_valid_elements'] ) ) { + $options['extended_valid_elements'] = ''; + } + + $options['extended_valid_elements'] .= ',' . implode( ',', $extended_tags ); + $options['extended_valid_elements'] = trim( $options['extended_valid_elements'], ',' ); + + return $options; + } +} + +MathJax_Latex::init(); diff --git a/wp-content/plugins/mathjax-latex/mathjax-latex.php b/wp-content/plugins/mathjax-latex/mathjax-latex.php index ae19036e9b6ad3e876b83a24328d3227f3cb37ba..143d1e240c8dc4c940e1cf2e5706d04333c134f9 100644 --- a/wp-content/plugins/mathjax-latex/mathjax-latex.php +++ b/wp-content/plugins/mathjax-latex/mathjax-latex.php @@ -2,7 +2,7 @@ /** * Plugin Name: MathJax-LaTeX * Description: Transform latex equations in JavaScript using mathjax - * Version: 1.3.8 + * Version: 1.3.10 * Author: Phillip Lord, Simon Cockell, Paul Schreiber * Author URI: http://knowledgeblog.org * @@ -12,292 +12,4 @@ * Paul Schreiber (paulschreiber@gmail.com) */ -/* - * The contents of this file are subject to the LGPL License, Version 3.0. - * - * Copyright (C) 2010-2013, Phillip Lord, Newcastle University - * Copyright (C) 2010-2011, Simon Cockell, Newcastle University - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see http://www.gnu.org/licenses/. - */ - -define( 'MATHJAX_VERSION', '1.3.8' ); - -require_once dirname( __FILE__ ) . '/mathjax-latex-admin.php'; - -class MathJax { - public static $add_script; - public static $block_script; - public static $mathml_tags = array( - 'math' => array( 'class', 'id', 'style', 'dir', 'href', 'mathbackground', 'mathcolor', 'display', 'overflow', 'xmlns' ), - 'maction' => array( 'actiontype', 'class', 'id', 'style', 'href', 'mathbackground', 'mathcolor', 'selection' ), - 'maligngroup' => array(), - 'malignmark' => array(), - 'menclose' => array( 'class', 'id', 'style', 'href', 'mathbackground', 'mathcolor', 'notation' ), - 'merror' => array( 'class', 'id', 'style', 'href', 'mathbackground', 'mathcolor' ), - 'mfenced' => array( 'class', 'id', 'style', 'close', 'href', 'mathbackground', 'mathcolor', 'open', 'separators' ), - 'mfrac' => array( 'bevelled', 'class', 'id', 'style', 'denomalign', 'href', 'linethickness', 'mathbackground', 'mathcolor', 'numalign' ), - 'mglyph' => array( 'alt', 'class', 'id', 'style', 'height', 'href', 'mathbackground', 'src', 'valign', 'width' ), - 'mi' => array( 'class', 'id', 'style', 'href', 'mathbackground', 'mathcolor', 'mathsize', 'mathvariant' ), - 'mlabeledtr' => array( 'class', 'id', 'style', 'columnalign', 'groupalign', 'href', 'mathbackground', 'mathcolor', 'rowalign' ), - 'mlongdiv' => array(), - 'mmultiscripts' => array( 'class', 'id', 'style', 'href', 'mathbackground', 'mathcolor', 'subscriptshift', 'superscriptshift' ), - 'mn' => array( 'class', 'id', 'style', 'dir', 'href', 'mathbackground', 'mathcolor', 'mathsize', 'mathvariant' ), - 'mo' => array( 'accent', 'class', 'id', 'style', 'dir', 'fence', 'form', 'href', 'largeop', 'lspace', 'mathbackground', 'mathcolor', 'mathsize', 'mathvariant', 'maxsize', 'minsize', 'moveablelimits', 'rspace', 'separator', 'stretchy', 'symmetric' ), - 'mover' => array( 'accent', 'align', 'class', 'id', 'style', 'href', 'mathbackground', 'mathcolor' ), - 'mpadded' => array( 'class', 'id', 'style', 'depth', 'height', 'href', 'lspace', 'mathbackground', 'mathcolor', 'voffset', 'width' ), - 'mphantom' => array( 'class', 'id', 'style', 'mathbackground' ), - 'mroot' => array( 'class', 'id', 'style', 'href', 'mathbackground', 'mathcolor' ), - 'mrow' => array( 'class', 'id', 'style', 'dir', 'href', 'mathbackground', 'mathcolor' ), - 'ms' => array( 'class', 'id', 'style', 'dir', 'lquote', 'href', 'mathbackground', 'mathcolor', 'mathsize', 'mathvariant', 'rquote' ), - 'mscarries' => array(), - 'mscarry' => array(), - 'msgroup' => array(), - 'msline' => array(), - 'mspace' => array( 'class', 'id', 'style', 'depth', 'height', 'linebreak', 'mathbackground', 'width' ), - 'msqrt' => array( 'class', 'id', 'style', 'href', 'mathbackground', 'mathcolor' ), - 'msrow' => array(), - 'mstack' => array(), - 'mstyle' => array( 'dir', 'decimalpoint', 'displaystyle', 'infixlinebreakstyle', 'scriptlevel', 'scriptminsize', 'scriptsizemultiplier' ), - 'msub' => array( 'class', 'id', 'style', 'mathbackground', 'mathcolor', 'subscriptshift' ), - 'msubsup' => array( 'class', 'id', 'style', 'href', 'mathbackground', 'mathcolor', 'subscriptshift', 'superscriptshift' ), - 'msup' => array( 'class', 'id', 'style', 'href', 'mathbackground', 'mathcolor', 'superscriptshift' ), - 'mtable' => array( 'class', 'id', 'style', 'align', 'alignmentscope', 'columnalign', 'columnlines', 'columnspacing', 'columnwidth', 'displaystyle', 'equalcolumns', 'equalrows', 'frame', 'framespacing', 'groupalign', 'href', 'mathbackground', 'mathcolor', 'minlabelspacing', 'rowalign', 'rowlines', 'rowspacing', 'side', 'width' ), - 'mtd' => array( 'class', 'id', 'style', 'columnalign', 'columnspan', 'groupalign', 'href', 'mathbackground', 'mathcolor', 'rowalign', 'rowspan' ), - 'mtext' => array( 'class', 'id', 'style', 'dir', 'href', 'mathbackground', 'mathcolor', 'mathsize', 'mathvariant' ), - 'mtr' => array( 'class', 'id', 'style', 'columnalign', 'groupalign', 'href', 'mathbackground', 'mathcolor', 'rowalign' ), - 'munder' => array( 'accentunder', 'align', 'class', 'id', 'style', 'mathbackground', 'mathcolor' ), - 'munderover' => array( 'accent', 'accentunder', 'align', 'class', 'id', 'style', 'href', 'mathbackground', 'mathcolor' ), - 'semantics' => array( 'definitionURL', 'encoding', 'cd', 'name', 'src' ), - 'annotation' => array( 'definitionURL', 'encoding', 'cd', 'name', 'src' ), - 'annotation-xml' => array( 'definitionURL', 'encoding', 'cd', 'name', 'src' ), - ); - - public static function init() { - register_activation_hook( __FILE__, array( __CLASS__, 'mathjax_install' ) ); - register_deactivation_hook( __FILE__, array( __CLASS__, 'mathjax_uninstall' ) ); - - if ( get_option( 'kblog_mathjax_force_load' ) ) { - self::$add_script = true; - } - - add_shortcode( 'mathjax', array( __CLASS__, 'mathjax_shortcode' ) ); - add_shortcode( 'nomathjax', array( __CLASS__, 'nomathjax_shortcode' ) ); - add_shortcode( 'latex', array( __CLASS__, 'latex_shortcode' ) ); - add_action( 'wp_footer', array( __CLASS__, 'add_script' ) ); - add_filter( 'script_loader_tag', array( __CLASS__, 'script_loader_tag' ), 10, 3 ); - - if ( get_option( 'kblog_mathjax_use_wplatex_syntax' ) ) { - add_filter( 'the_content', array( __CLASS__, 'inline_to_shortcode' ) ); - } - - add_filter( 'plugin_action_links', array( __CLASS__, 'mathjax_settings_link' ), 9, 2 ); - - add_filter( 'the_content', array( __CLASS__, 'filter_br_tags_on_math' ) ); - - add_action( 'init', array( __CLASS__, 'allow_mathml_tags' ) ); - add_filter( 'tiny_mce_before_init', array( __CLASS__, 'allow_mathml_tags_in_tinymce' ) ); - } - - // registers default options - public static function mathjax_install() { - add_option( 'kblog_mathjax_force_load', false ); - add_option( 'kblog_mathjax_latex_inline', 'inline' ); - add_option( 'kblog_mathjax_use_wplatex_syntax', false ); - add_option( 'kblog_mathjax_use_cdn', true ); - add_option( 'kblog_mathjax_custom_location', false ); - add_option( 'kblog_mathjax_config', 'default' ); - } - - public static function mathjax_uninstall() { - delete_option( 'kblog_mathjax_force_load' ); - delete_option( 'kblog_mathjax_latex_inline' ); - delete_option( 'kblog_mathjax_use_wplatex_syntax' ); - delete_option( 'kblog_mathjax_use_cdn' ); - delete_option( 'kblog_mathjax_custom_location' ); - delete_option( 'kblog_mathjax_config' ); - } - - public static function mathjax_shortcode( $atts, $content ) { - self::$add_script = true; - } - - public static function nomathjax_shortcode( $atts, $content ) { - self::$block_script = true; - } - - public static function latex_shortcode( $atts, $content ) { - self::$add_script = true; - - // this gives us an optional "syntax" attribute, which defaults to "inline", but can also be "display" - $shortcode_atts = shortcode_atts( - array( - 'syntax' => get_option( 'kblog_mathjax_latex_inline' ), - ), $atts - ); - - if ( 'inline' === $shortcode_atts['syntax'] ) { - return '\(' . $content . '\)'; - } elseif ( 'display' === $shortcode_atts['syntax'] ) { - return '\[' . $content . '\]'; - } - } - - public static function add_script() { - if ( ! self::$add_script ) { - return; - } - - if ( self::$block_script ) { - return; - } - - // initialise option for existing MathJax-LaTeX users - if ( get_option( 'kblog_mathjax_use_cdn' ) || ! get_option( 'kblog_mathjax_custom_location' ) ) { - $mathjax_location = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.2/MathJax.js'; - } else { - $mathjax_location = get_option( 'kblog_mathjax_custom_location' ); - } - - $mathjax_url = $mathjax_location . '?config=' . get_option( 'kblog_mathjax_config' ); - - wp_enqueue_script( 'mathjax', $mathjax_url, false, MATHJAX_VERSION, false ); - - $mathjax_config = apply_filters( 'mathjax_config', array() ); - if ( $mathjax_config ) { - wp_add_inline_script( 'mathjax', 'MathJax.Hub.Config(' . wp_json_encode( $mathjax_config ) . ');' ); - } - } - - - /** - * Set the script tag to have type text/x-mathjax-config - * - * @param string $tag The `<script>` tag for the enqueued script. - * @param string $handle The script's registered handle. - * @param string $src The script's source URL. - * - * @return string $tag - */ - public static function script_loader_tag( $tag, $handle = null, $src = null ) { - if ( 'mathjax' === $handle ) { - // replace the <script> tag for the inline script, but not for the <script> tag with src="" - return str_replace( "<script type='text/javascript'>", "<script type='text/x-mathjax-config'>", $tag ); - } - - return $tag; - } - - public static function inline_to_shortcode( $content ) { - if ( false === strpos( $content, '$latex' ) ) { - return $content; - } - - self::$add_script = true; - - return preg_replace_callback( '#\$latex[= ](.*?[^\\\\])\$#', array( __CLASS__, 'inline_to_shortcode_callback' ), $content ); - } - - public static function inline_to_shortcode_callback( $matches ) { - - // - // Also support wp-latex syntax. This includes the ability to set background and foreground - // colour, which we can ignore. - // - - if ( preg_match( '/.+((?:&|&)s=(-?[0-4])).*/i', $matches[1], $s_matches ) ) { - $matches[1] = str_replace( $s_matches[1], '', $matches[1] ); - } - - if ( preg_match( '/.+((?:&|&)fg=([0-9a-f]{6})).*/i', $matches[1], $fg_matches ) ) { - $matches[1] = str_replace( $fg_matches[1], '', $matches[1] ); - } - - if ( preg_match( '/.+((?:&|&)bg=([0-9a-f]{6})).*/i', $matches[1], $bg_matches ) ) { - $matches[1] = str_replace( $bg_matches[1], '', $matches[1] ); - } - - return "[latex]{$matches[1]}[/latex]"; - } - - // add a link to settings on the plugin management page - public static function mathjax_settings_link( $links, $file ) { - if ( 'mathjax-latex/mathjax-latex.php' === $file && function_exists( 'admin_url' ) ) { - $settings_link = '<a href="' . esc_url( admin_url( 'options-general.php?page=kblog-mathjax-latex' ) ) . '">' . esc_html__( 'Settings' ) . '</a>'; - array_unshift( $links, $settings_link ); - } - return $links; - } - - /** - * Removes the <br /> tags inside math tags - * - * @param $content - * @return string without <br /> tags - */ - public static function filter_br_tags_on_math( $content ) { - return preg_replace_callback( - '/(<math.*>.*<\/math>)/isU', - function( $matches ) { - return str_replace( array( '<br/>', '<br />', '<br>' ), '', $matches[0] ); - }, - $content - ); - } - - /** - * Allow MathML tags within WordPress - * http://vip.wordpress.com/documentation/register-additional-html-attributes-for-tinymce-and-wp-kses/ - * https://developer.mozilla.org/en-US/docs/Web/MathML/Element - */ - public static function allow_mathml_tags() { - global $allowedposttags; - - foreach ( self::$mathml_tags as $tag => $attributes ) { - $allowedposttags[ $tag ] = array(); - - foreach ( $attributes as $a ) { - $allowedposttags[ $tag ][ $a ] = true; - } - } - } - - /** - * Ensure that the MathML tags will not be removed - * by the TinyMCE editor - */ - public static function allow_mathml_tags_in_tinymce( $options ) { - - $extended_tags = array(); - - foreach ( self::$mathml_tags as $tag => $attributes ) { - if ( ! empty( $attributes ) ) { - $tag = $tag . '[' . implode( '|', $attributes ) . ']'; - } - - $extended_tags[] = $tag; - } - - if ( ! isset( $options['extended_valid_elements'] ) ) { - $options['extended_valid_elements'] = ''; - } - - $options['extended_valid_elements'] .= ',' . implode( ',', $extended_tags ); - $options['extended_valid_elements'] = trim( $options['extended_valid_elements'], ',' ); - - return $options; - } -} - -MathJax::init(); +require_once __DIR__ . '/class-mathjax-latex.php'; diff --git a/wp-content/plugins/mathjax-latex/readme.txt b/wp-content/plugins/mathjax-latex/readme.txt index 6c1a451a169f758895678aadde529b175ed5efdc..e71307860067213c173ee648091d868214ed03e4 100644 --- a/wp-content/plugins/mathjax-latex/readme.txt +++ b/wp-content/plugins/mathjax-latex/readme.txt @@ -4,8 +4,8 @@ Contributors: philliplord, sjcockell, knowledgeblog, d_swan, paulschreiber, jwen Tags: mathematics, math, latex, mathml, mathjax, science, res-comms, scholar, academic Requires at least: 3.0 Tested up to: 4.9.1 -Stable tag: 1.3.8 -Requires PHP: 5.4.0 +Stable tag: 1.3.10 +Requires PHP: 7.0.0 License: GPLv2 This plugin enables mathjax (http://www.mathjax.org) functionality for @@ -34,6 +34,16 @@ MathJax-LaTeX is developed on [GitHub](https://github.com/phillord/mathjax-latex == Changelog == += 1.3.10 = + +1. Rename class files, per PHPCS +2. Gracefully handle null values in filter_br_tags_on_math. Thanks to Yang Liu. + += 1.3.9 = + +1. Code style changes, per PHPCS 3.3.0 and WPCS 0.14.1 +1. Use PHP 7 short array syntax + = 1.3.8 = 1. Code style changes, per PHPCS 3.1.1 and WPCS 0.14