PluginProbe
Jetpack – WP Security, Backup, Speed, & Growth / 9.9.3
Jetpack – WP Security, Backup, Speed, & Growth v9.9.3
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
148 lines 3.9 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
14 /**
15 * LaTeX support.
16 *
17 * Backward compatibility requires support for both "[latex][/latex]", and
18 * "$latex $" shortcodes.
19 *
20 * $latex e^{\i \pi} + 1 = 0$ -> [latex]e^{\i \pi} + 1 = 0[/latex]
21 * $latex [a, b]$ -> [latex][a, b][/latex]
22 */
23
24 function latex_markup( $content ) {
25 $textarr = wp_html_split( $content );
26
27 $regex = '%
28 \$latex(?:=\s*|\s+)
29 ((?:
30 [^$]+ # Not a dollar
31 |
32 (?<=(?<!\\\\)\\\\)\$ # Dollar preceded by exactly one slash
33 )+)
34 (?<!\\\\)\$ # Dollar preceded by zero slashes
35 %ix';
36
37 foreach ( $textarr as &$element ) {
38 if ( '' == $element || '<' === $element[0] ) {
39 continue;
40 }
41
42 if ( false === stripos( $element, '$latex' ) ) {
43 continue;
44 }
45
46 $element = preg_replace_callback( $regex, 'latex_src', $element );
47 }
48
49 return implode( '', $textarr );
50 }
51
52 function latex_src( $matches ) {
53 $latex = $matches[1];
54
55 $bg = latex_get_default_color( 'bg' );
56 $fg = latex_get_default_color( 'text', '000' );
57 $s = 0;
58
59
60 $latex = latex_entity_decode( $latex );
61 if ( preg_match( '/.+(&fg=[0-9a-f]{6}).*/i', $latex, $fg_matches ) ) {
62 $fg = substr( $fg_matches[1], 4 );
63 $latex = str_replace( $fg_matches[1], '', $latex );
64 }
65 if ( preg_match( '/.+(&bg=[0-9a-f]{6}).*/i', $latex, $bg_matches ) ) {
66 $bg = substr( $bg_matches[1], 4 );
67 $latex = str_replace( $bg_matches[1], '', $latex );
68 }
69 if ( preg_match( '/.+(&s=[0-9-]{1,2}).*/i', $latex, $s_matches ) ) {
70 $s = (int) substr( $s_matches[1], 3 );
71 $latex = str_replace( $s_matches[1], '', $latex );
72 }
73
74 return latex_render( $latex, $fg, $bg, $s );
75 }
76
77 function latex_get_default_color( $color, $default_color = 'ffffff' ) {
78 global $themecolors;
79 return isset($themecolors[$color]) ? $themecolors[$color] : $default_color;
80 }
81
82 function latex_entity_decode( $latex ) {
83 return str_replace( array( '&lt;', '&gt;', '&quot;', '&#039;', '&#038;', '&amp;', "\n", "\r" ), array( '<', '>', '"', "'", '&', '&', ' ', ' ' ), $latex );
84 }
85
86 /**
87 * Returns the URL for the server-side rendered image of LaTeX.
88 *
89 * @param string $latex LaTeX string.
90 * @param string $fg Foreground color.
91 * @param string $bg Background color.
92 * @param int $s Matches.
93 *
94 * @return string Image URL for the rendered LaTeX.
95 */
96 function latex_render( $latex, $fg, $bg, $s = 0 ) {
97 $url = add_query_arg(
98 urlencode_deep(
99 array(
100 'latex' => $latex,
101 'bg' => $bg,
102 'fg' => $fg,
103 's' => $s,
104 'c' => '20201002', // cache buster. Added 2020-10-02 after server migration caused faulty rendering.
105 )
106 ),
107 ( is_ssl() ? 'https://' : 'http://' ) . 's0.wp.com/latex.php'
108 );
109
110 $alt = str_replace( '\\', '&#92;', esc_attr( $latex ) );
111
112 return sprintf(
113 '<img src="%1$s" alt="%2$s" class="latex" />',
114 esc_url( $url ),
115 $alt
116 );
117 }
118
119 /**
120 * The shortcode way. The attributes are the same as the old ones - 'fg' and 'bg', instead of foreground
121 * and background, and 's' is for the font size.
122 *
123 * Example: [latex s=4 bg=00f fg=ff0]\LaTeX[/latex]
124 */
125 function latex_shortcode( $atts, $content = '' ) {
126 extract( shortcode_atts( array(
127 's' => 0,
128 'bg' => latex_get_default_color( 'bg' ),
129 'fg' => latex_get_default_color( 'text', '000' )
130 ), $atts, 'latex' ) );
131
132 return latex_render( latex_entity_decode( $content ), $fg, $bg, $s );
133 }
134
135 /**
136 * LaTeX needs to be untexturized
137 */
138 function latex_no_texturize( $shortcodes ) {
139 $shortcodes[] = 'latex';
140 return $shortcodes;
141 }
142
143 add_filter( 'no_texturize_shortcodes', 'latex_no_texturize' );
144
145 add_filter( 'the_content', 'latex_markup', 9 ); // before wptexturize
146 add_filter( 'comment_text', 'latex_markup', 9 ); // before wptexturize
147 add_shortcode( 'latex', 'latex_shortcode' );
148