PluginProbe
Jetpack – WP Security, Backup, Speed, & Growth / 16.3
Jetpack – WP Security, Backup, Speed, & Growth v16.3
16.3 16.3-beta 16.3-a.5 16.3-a.7 16.3-a.3 16.3-a.1 16.2 16.2-beta 12.0.3 12.1.3 12.2.3 12.3.2 12.4.2 12.5.2 12.6.4 12.7.3 12.8.3 12.9.5 13.0.2 13.1.5 13.2.4 13.3.3 13.4.5 13.5.2 13.6.2 All 508 releases
← All changes | modules/latex.php +181 -0 16.2-beta → 16.3 View file →
@@ -1,0 +1,181 @@
1 +<?php
2 +/**
3 + * Module Name: Beautiful Math
4 + * Module Description: Add beautifully formatted math equations to your posts and pages using LaTeX.
5 + * Sort Order: 12
6 + * First Introduced: 1.1
7 + * Requires Connection: No
8 + * Auto Activate: No
9 + * Module Tags: Writing
10 + * Feature: Writing
11 + * Additional Search Queries: latex, math, equation, equations, formula, code
12 + *
13 + * @package automattic/jetpack
14 + */
15 +
16 +if ( ! defined( 'ABSPATH' ) ) {
17 + exit( 0 );
18 +}
19 +
20 +/**
21 + * LaTeX support.
22 + *
23 + * Backward compatibility requires support for both "[latex][/latex]", and
24 + * "$latex $" shortcodes.
25 + *
26 + * $latex e^{\i \pi} + 1 = 0$ -> [latex]e^{\i \pi} + 1 = 0[/latex]
27 + * $latex [a, b]$ -> [latex][a, b][/latex]
28 + */
29 +
30 +/**
31 + * Markup LaTeX content.
32 + *
33 + * @param string $content Post or comment contents to markup.
34 + */
35 +function latex_markup( $content ) {
36 + $textarr = wp_html_split( $content );
37 +
38 + $regex = '%
39 + \$latex(?:=\s*|\s+)
40 + ((?:
41 + [^$]+ # Not a dollar
42 + |
43 + (?<=(?<!\\\\)\\\\)\$ # Dollar preceded by exactly one slash
44 + )+)
45 + (?<!\\\\)\$ # Dollar preceded by zero slashes
46 + %ix';
47 +
48 + foreach ( $textarr as &$element ) {
49 + if ( '' === $element || '<' === $element[0] ) {
50 + continue;
51 + }
52 +
53 + if ( false === stripos( $element, '$latex' ) ) {
54 + continue;
55 + }
56 +
57 + $element = preg_replace_callback( $regex, 'latex_src', $element );
58 + }
59 +
60 + return implode( '', $textarr );
61 +}
62 +
63 +/**
64 + * Process LaTeX string to rendered image.
65 + *
66 + * @param array $matches Matched regex results.
67 + */
68 +function latex_src( $matches ) {
69 + $latex = $matches[1];
70 +
71 + $bg = latex_get_default_color( 'bg' );
72 + $fg = latex_get_default_color( 'text', '000' );
73 + $s = 0;
74 +
75 + $latex = latex_entity_decode( $latex );
76 + if ( preg_match( '/.+(&fg=[0-9a-f]{6}).*/i', $latex, $fg_matches ) ) {
77 + $fg = substr( $fg_matches[1], 4 );
78 + $latex = str_replace( $fg_matches[1], '', $latex );
79 + }
80 + if ( preg_match( '/.+(&bg=[0-9a-f]{6}).*/i', $latex, $bg_matches ) ) {
81 + $bg = substr( $bg_matches[1], 4 );
82 + $latex = str_replace( $bg_matches[1], '', $latex );
83 + }
84 + if ( preg_match( '/.+(&s=[0-9-]{1,2}).*/i', $latex, $s_matches ) ) {
85 + $s = (int) substr( $s_matches[1], 3 );
86 + $latex = str_replace( $s_matches[1], '', $latex );
87 + }
88 +
89 + return latex_render( $latex, $fg, $bg, $s );
90 +}
91 +
92 +/**
93 + * Get the default color for an attribute.
94 + *
95 + * @param string $color Attribute to color (e.g. bg).
96 + * @param string $default_color Default fallback color to use.
97 + */
98 +function latex_get_default_color( $color, $default_color = 'ffffff' ) {
99 + global $themecolors;
100 + return $themecolors[ $color ] ?? $default_color;
101 +}
102 +
103 +/**
104 + * Decode special characters in a LaTeX string.
105 + *
106 + * @param string $latex Character encoded content.
107 + */
108 +function latex_entity_decode( $latex ) {
109 + return str_replace( array( '&lt;', '&gt;', '&quot;', '&#039;', '&#038;', '&amp;', "\n", "\r" ), array( '<', '>', '"', "'", '&', '&', ' ', ' ' ), $latex );
110 +}
111 +
112 +/**
113 + * Returns the URL for the server-side rendered image of LaTeX.
114 + *
115 + * @param string $latex LaTeX string.
116 + * @param string $fg Foreground color.
117 + * @param string $bg Background color.
118 + * @param int $s Matches.
119 + *
120 + * @return string Image URL for the rendered LaTeX.
121 + */
122 +function latex_render( $latex, $fg, $bg, $s = 0 ) {
123 + $url = add_query_arg(
124 + urlencode_deep(
125 + array(
126 + 'latex' => $latex,
127 + 'bg' => $bg,
128 + 'fg' => $fg,
129 + 's' => $s,
130 + 'c' => '20201002', // cache buster. Added 2020-10-02 after server migration caused faulty rendering.
131 + )
132 + ),
133 + ( is_ssl() ? 'https://' : 'http://' ) . 's0.wp.com/latex.php'
134 + );
135 +
136 + $alt = str_replace( '\\', '&#92;', esc_attr( $latex ) );
137 +
138 + return sprintf(
139 + '<img src="%1$s" alt="%2$s" class="latex" />',
140 + esc_url( $url ),
141 + $alt
142 + );
143 +}
144 +
145 +/**
146 + * The shortcode way. The attributes are the same as the old ones - 'fg' and 'bg', instead of foreground
147 + * and background, and 's' is for the font size.
148 + *
149 + * Example: [latex s=4 bg=00f fg=ff0]\LaTeX[/latex]
150 + *
151 + * @param array $atts Shortcode attributes.
152 + * @param string $content Content to format.
153 + */
154 +function latex_shortcode( $atts, $content = '' ) {
155 + $attr = shortcode_atts(
156 + array(
157 + 's' => 0,
158 + 'bg' => latex_get_default_color( 'bg' ),
159 + 'fg' => latex_get_default_color( 'text', '000' ),
160 + ),
161 + $atts,
162 + 'latex'
163 + );
164 +
165 + return latex_render( latex_entity_decode( $content ), $attr['fg'], $attr['bg'], $attr['s'] );
166 +}
167 +
168 +/**
169 + * LaTeX needs to be untexturized.
170 + *
171 + * @param array $shortcodes Array of shortcodes not to texturize.
172 + */
173 +function latex_no_texturize( $shortcodes ) {
174 + $shortcodes[] = 'latex';
175 + return $shortcodes;
176 +}
177 +add_filter( 'no_texturize_shortcodes', 'latex_no_texturize' );
178 +
179 +add_filter( 'the_content', 'latex_markup', 9 ); // Before wptexturize.
180 +add_filter( 'comment_text', 'latex_markup', 9 ); // Before wptexturize.
181 +add_shortcode( 'latex', 'latex_shortcode' );