PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 16.1-a.5
Jetpack – WP Security, Backup, Speed, & Growth v16.1-a.5
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
canonical-urls 4 months ago carousel 1 day ago comment-likes 8 months ago comments 2 months ago custom-post-types 1 month ago external-media 8 months ago google-fonts 1 month ago gravatar 6 years ago infinite-scroll 1 month ago likes 1 day ago markdown 2 months ago memberships 1 day ago photon-cdn 1 day ago plugin-search 2 months ago post-by-email 8 months ago related-posts 1 week ago scan 4 months ago seo-tools 1 month ago sharedaddy 1 month ago shortcodes 1 week ago shortlinks 1 month ago simple-payments 8 months ago site-icon 8 months ago sitemaps 2 months ago stats 7 months ago subscriptions 1 week ago theme-tools 1 month ago tiled-gallery 1 month ago verification-tools 2 months ago videopress 1 day ago widget-visibility 2 months ago widgets 1 month ago woocommerce-analytics 3 months ago wordads 1 month ago wpcom-tos 7 months ago account-protection.php 3 months ago blaze.php 8 months ago blocks.php 8 months ago canonical-urls.php 5 months ago carousel.php 8 months ago comment-likes.php 8 months ago comments.php 4 months ago contact-form.php 8 months ago copy-post.php 2 months ago custom-content-types.php 3 months ago google-fonts.php 3 months ago gravatar-hovercards.php 2 months ago infinite-scroll.php 8 months ago json-api.php 8 months ago latex.php 2 months ago likes.php 2 months ago markdown.php 8 months ago module-extras.php 8 months ago module-headings.php 1 week ago module-info.php 5 months ago monitor.php 1 month ago notes.php 1 day ago photon-cdn.php 8 months ago photon.php 8 months ago plugin-search.php 1 month ago podcast.php 1 week ago post-by-email.php 3 months ago post-list.php 8 months ago protect.php 3 months ago publicize.php 8 months ago related-posts.php 2 months ago search.php 8 months ago seo-tools.php 1 month ago sharedaddy.php 5 months ago shortcodes.php 8 months ago shortlinks.php 2 months ago simple-payments.php 8 months ago sitemaps.php 8 months ago sso.php 1 month ago stats.php 1 week ago subscriptions.php 1 week ago theme-tools.php 8 months ago tiled-gallery.php 8 months ago vaultpress.php 8 months ago verification-tools.php 3 months ago videopress.php 8 months ago waf.php 8 months ago widget-visibility.php 8 months ago widgets.php 8 months ago woocommerce-analytics.php 8 months ago wordads.php 8 months ago wpcom-reader.php 5 months 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 $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