PluginProbe
Jetpack – WP Security, Backup, Speed, & Growth / 13.0.1
Jetpack – WP Security, Backup, Speed, & Growth v13.0.1
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 14.4.2 All 500 releases
jetpack / modules / latex.php
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