PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 15.1.2
Jetpack – WP Security, Backup, Speed, & Growth v15.1.2
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 14.5.1 14.6.1 14.7.1 14.8.1 14.9.2 15.0.3 15.1.2 15.2.1 15.3.2 15.4.1 15.5.1 15.6.1 15.7.2 15.8.1 15.9.2 16.0.2 16.1.3 16.2-a.5 16.2-a.3 16.1.2 16.2-a.1 16.1.1 16.1 16.1-beta 16.1-beta.2 16.1-beta.3 16.1-a.5 16.1-a.3 16.0.1 16.1-a.1 16.0 16.0-beta 16.0-a.7 16.0-a.5 15.9.1 16.0-a.3 16.0-a.1 15.9 15.9-beta 15.9-a.7 15.9-a.5 15.9-a.3 15.9-a.1 15.8 15.8-beta 15.8-a.7 15.8-a.5 5.2.5 5.3.4 5.4.4 5.5.5 5.6.5 5.7.5 5.8.4 5.9.4 6.0.4 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.1.5 6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.4 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.5 6.5.1 6.5.2 6.5.3 6.5.4 6.6 6.6.1 6.6.2 6.6.3 6.6.4 6.6.5 6.7 6.7.1 6.7.2 6.7.3 6.7.4 6.8 6.8.1 6.8.2 6.8.3 6.8.4 6.8.5 6.9 6.9.1 6.9.2 6.9.3 6.9.4 7.0 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2 7.2.1 7.2.1.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3 7.3.0.1 7.3.1 7.3.1.1 7.3.2 7.3.3 7.3.4 7.3.5 7.4 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.5 7.5.0.1 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.5.6 7.5.7 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4 7.7.5 7.7.6 7.8 7.8.1 7.8.2 7.8.3 7.8.4 7.9 7.9.1 7.9.2 7.9.3 7.9.4 8.0 8.0.1 8.0.2 8.0.3 8.1 8.1.1 8.1.2 8.1.3 8.1.4 8.2 8.2.0.1 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.4.5 8.5 8.5.1 8.5.2 8.5.3 8.6 8.6.1 8.6.2 8.6.3 8.6.4 8.7 8.7.0.1 8.7.1 8.7.2 8.7.3 8.7.4 8.8 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.9 8.9.1 8.9.2 8.9.3 8.9.4 9.0 9.0.1 9.0.2 9.0.3 9.0.4 9.0.5 9.1 9.1.1 9.1.2 9.1.3 9.2 9.2.1 9.2.2 9.2.3 9.2.4 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.5 9.5.1 9.5.2 9.5.3 9.5.4 9.5.5 9.6 9.6.1 9.6.2 9.6.3 9.6.4 9.7 9.7.1 9.7.2 15.7-beta.2 9.7.3 15.7.1 9.8 15.8-a.1 9.8.1 15.8-a.3 9.8.2 2.0.9 9.8.3 2.1.7 9.9 2.2.10 9.9.1 2.3.10 9.9.2 2.4.7 9.9.3 2.5.5 2.6.6 2.7.5 2.8.5 2.9.6 3.0.6 3.1.5 3.2.5 3.3.6 3.4.6 3.5.6 3.6.4 3.7.5 3.8.5 3.9.10 4.0.7 4.1.4 4.2.5 4.3.5 4.4.5 4.5.3 4.6.3 4.7.4 4.8.5 4.9.3 5.0.3 5.1.4 trunk 10.0 10.0.1 10.0.2 10.1 10.1.1 10.1.2 10.2 10.2.1 10.2.2 10.2.3 10.3 10.3.1 10.3.2 10.4 10.4.1 10.4.2 10.5 10.5.1 10.5.2 10.5.3 10.6 10.6.1 10.6.2 10.7 10.7.1 10.7.2 10.8 10.8.1 10.8.2 10.9 10.9.1 10.9.2 10.9.3 11.0 11.0.1 11.0.2 11.1 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.2.1 11.2.2 11.3 11.3.1 11.3.2 11.3.3 11.3.4 11.4 11.4.1 11.4.2 11.5 11.5.1 11.5.2 11.5.3 11.6 11.6.1 11.6.2 11.7 11.7.1 11.7.2 11.7.3 11.8 11.8.3 11.8.4 11.8.5 11.8.6 11.9 11.9.1 11.9.2 11.9.3 12.0 12.0.1 12.0.2 12.1 12.1.1 12.1.2 12.2 12.2.1 12.2.2 12.3 12.3.1 12.4 12.4.1 12.5 12.5.1 12.6 12.6.1 12.6.2 12.6.3 12.7 12.7.1 12.7.2 12.8 12.8.1 12.8.2 12.9 12.9.1 12.9.2 12.9.3 12.9.4 13.0 13.0.1 13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.2 13.2.1 13.2.2 13.2.3 13.3 13.3.1 13.3.2 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.5 13.5.1 13.6 13.6.1 13.7 13.7.1 13.8 13.8.1 13.8.2 13.9 13.9.1 14.0 14.1 14.2 14.2.1 14.3 14.4 14.4.1 14.5 14.6 14.7 14.8 14.9 14.9.1 15.0 15.0.1 15.0.2 15.1 15.1.1 15.2 15.3 15.3.1 15.4 15.5 15.6 15.7 15.7-a.1 15.7-a.3 15.7-a.5 15.7-a.7 15.7-beta
jetpack / modules / latex.php
jetpack / modules Last commit date
carousel 1 year ago comment-likes 1 year ago comments 1 year ago custom-post-types 1 year ago external-media 1 year ago google-fonts 11 months ago gravatar 6 years ago infinite-scroll 11 months ago likes 1 year ago markdown 1 year ago memberships 11 months ago photon-cdn 11 months ago plugin-search 1 year ago post-by-email 1 year ago related-posts 11 months ago scan 1 year ago seo-tools 1 year ago sharedaddy 11 months ago shortcodes 11 months ago simple-payments 1 year ago site-icon 11 months ago sitemaps 11 months ago stats 1 year ago subscriptions 11 months ago theme-tools 11 months ago tiled-gallery 1 year ago verification-tools 1 year ago videopress 11 months ago widget-visibility 11 months ago widgets 10 months ago woocommerce-analytics 11 months ago wordads 1 year ago wpcom-tos 1 year ago account-protection.php 1 year ago blaze.php 1 year ago blocks.php 1 year ago carousel.php 1 year ago comment-likes.php 1 year ago comments.php 1 year ago contact-form.php 1 year ago copy-post.php 1 year ago custom-content-types.php 1 year ago google-fonts.php 1 year ago gravatar-hovercards.php 1 year ago infinite-scroll.php 1 year ago json-api.php 1 year ago latex.php 1 year ago likes.php 1 year ago markdown.php 1 year ago module-extras.php 1 year ago module-headings.php 1 year ago module-info.php 1 year ago monitor.php 1 year ago notes.php 1 year ago photon-cdn.php 10 months ago photon.php 1 year ago plugin-search.php 1 year ago post-by-email.php 1 year ago post-list.php 1 year ago protect.php 1 year ago publicize.php 1 year ago related-posts.php 1 year ago search.php 1 year ago seo-tools.php 1 year ago sharedaddy.php 1 year ago shortcodes.php 1 year ago shortlinks.php 11 months ago simple-payments.php 1 year ago sitemaps.php 1 year ago sso.php 1 year ago stats.php 11 months ago subscriptions.php 11 months ago theme-tools.php 1 year ago tiled-gallery.php 1 year ago vaultpress.php 1 year ago verification-tools.php 1 year ago videopress.php 1 year ago waf.php 1 year ago widget-visibility.php 1 year ago widgets.php 1 year ago woocommerce-analytics.php 1 year ago wordads.php 1 year ago wpgroho.js 1 year ago
latex.php
182 lines
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 isset( $themecolors[ $color ] ) ? $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' );
182