PluginProbe
Jetpack – WP Security, Backup, Speed, & Growth / 11.8.4
Jetpack – WP Security, Backup, Speed, & Growth v11.8.4
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 13.7.2 13.8.3 13.9.2 14.0.1 14.1.1 14.2.2 14.3.1 All 501 releases
jetpack / modules / latex.php

latex.php in Jetpack – WP Security, Backup, Speed, & Growth 11.8.4, at modules/latex.php

178 lines 4.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Module Name: Beautiful Math
4 * Module Description: Use the LaTeX markup language to write mathematical equations and formulas
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 /**
17 * LaTeX support.
18 *
19 * Backward compatibility requires support for both "[latex][/latex]", and
20 * "$latex $" shortcodes.
21 *
22 * $latex e^{\i \pi} + 1 = 0$ -> [latex]e^{\i \pi} + 1 = 0[/latex]
23 * $latex [a, b]$ -> [latex][a, b][/latex]
24 */
25
26 /**
27 * Markup LaTeX content.
28 *
29 * @param string $content Post or comment contents to markup.
30 */
31 function latex_markup( $content ) {
32 $textarr = wp_html_split( $content );
33
34 $regex = '%
35 \$latex(?:=\s*|\s+)
36 ((?:
37 [^$]+ # Not a dollar
38 |
39 (?<=(?<!\\\\)\\\\)\$ # Dollar preceded by exactly one slash
40 )+)
41 (?<!\\\\)\$ # Dollar preceded by zero slashes
42 %ix';
43
44 foreach ( $textarr as &$element ) {
45 if ( '' === $element || '<' === $element[0] ) {
46 continue;
47 }
48
49 if ( false === stripos( $element, '$latex' ) ) {
50 continue;
51 }
52
53 $element = preg_replace_callback( $regex, 'latex_src', $element );
54 }
55
56 return implode( '', $textarr );
57 }
58
59 /**
60 * Process LaTeX string to rendered image.
61 *
62 * @param array $matches Matched regex results.
63 */
64 function latex_src( $matches ) {
65 $latex = $matches[1];
66
67 $bg = latex_get_default_color( 'bg' );
68 $fg = latex_get_default_color( 'text', '000' );
69 $s = 0;
70
71 $latex = latex_entity_decode( $latex );
72 if ( preg_match( '/.+(&fg=[0-9a-f]{6}).*/i', $latex, $fg_matches ) ) {
73 $fg = substr( $fg_matches[1], 4 );
74 $latex = str_replace( $fg_matches[1], '', $latex );
75 }
76 if ( preg_match( '/.+(&bg=[0-9a-f]{6}).*/i', $latex, $bg_matches ) ) {
77 $bg = substr( $bg_matches[1], 4 );
78 $latex = str_replace( $bg_matches[1], '', $latex );
79 }
80 if ( preg_match( '/.+(&s=[0-9-]{1,2}).*/i', $latex, $s_matches ) ) {
81 $s = (int) substr( $s_matches[1], 3 );
82 $latex = str_replace( $s_matches[1], '', $latex );
83 }
84
85 return latex_render( $latex, $fg, $bg, $s );
86 }
87
88 /**
89 * Get the default color for an attribute.
90 *
91 * @param string $color Attribute to color (e.g. bg).
92 * @param string $default_color Default fallback color to use.
93 */
94 function latex_get_default_color( $color, $default_color = 'ffffff' ) {
95 global $themecolors;
96 return isset( $themecolors[ $color ] ) ? $themecolors[ $color ] : $default_color;
97 }
98
99 /**
100 * Decode special characters in a LaTeX string.
101 *
102 * @param string $latex Character encoded content.
103 */
104 function latex_entity_decode( $latex ) {
105 return str_replace( array( '&lt;', '&gt;', '&quot;', '&#039;', '&#038;', '&amp;', "\n", "\r" ), array( '<', '>', '"', "'", '&', '&', ' ', ' ' ), $latex );
106 }
107
108 /**
109 * Returns the URL for the server-side rendered image of LaTeX.
110 *
111 * @param string $latex LaTeX string.
112 * @param string $fg Foreground color.
113 * @param string $bg Background color.
114 * @param int $s Matches.
115 *
116 * @return string Image URL for the rendered LaTeX.
117 */
118 function latex_render( $latex, $fg, $bg, $s = 0 ) {
119 $url = add_query_arg(
120 urlencode_deep(
121 array(
122 'latex' => $latex,
123 'bg' => $bg,
124 'fg' => $fg,
125 's' => $s,
126 'c' => '20201002', // cache buster. Added 2020-10-02 after server migration caused faulty rendering.
127 )
128 ),
129 ( is_ssl() ? 'https://' : 'http://' ) . 's0.wp.com/latex.php'
130 );
131
132 $alt = str_replace( '\\', '&#92;', esc_attr( $latex ) );
133
134 return sprintf(
135 '<img src="%1$s" alt="%2$s" class="latex" />',
136 esc_url( $url ),
137 $alt
138 );
139 }
140
141 /**
142 * The shortcode way. The attributes are the same as the old ones - 'fg' and 'bg', instead of foreground
143 * and background, and 's' is for the font size.
144 *
145 * Example: [latex s=4 bg=00f fg=ff0]\LaTeX[/latex]
146 *
147 * @param array $atts Shortcode attributes.
148 * @param string $content Content to format.
149 */
150 function latex_shortcode( $atts, $content = '' ) {
151 $attr = shortcode_atts(
152 array(
153 's' => 0,
154 'bg' => latex_get_default_color( 'bg' ),
155 'fg' => latex_get_default_color( 'text', '000' ),
156 ),
157 $atts,
158 'latex'
159 );
160
161 return latex_render( latex_entity_decode( $content ), $attr['fg'], $attr['bg'], $attr['s'] );
162 }
163
164 /**
165 * LaTeX needs to be untexturized.
166 *
167 * @param array $shortcodes Array of shortcodes not to texturize.
168 */
169 function latex_no_texturize( $shortcodes ) {
170 $shortcodes[] = 'latex';
171 return $shortcodes;
172 }
173 add_filter( 'no_texturize_shortcodes', 'latex_no_texturize' );
174
175 add_filter( 'the_content', 'latex_markup', 9 ); // Before wptexturize.
176 add_filter( 'comment_text', 'latex_markup', 9 ); // Before wptexturize.
177 add_shortcode( 'latex', 'latex_shortcode' );
178