|
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
|
|
View Code Duplication |
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
|
|
View Code Duplication |
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
|
|
View Code Duplication |
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
|
|
View Code Duplication |
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( '<', '>', '"', ''', '&', '&', "\n", "\r" ), array( '<', '>', '"', "'", '&', '&', ' ', ' ' ), $latex ); |
|
84
|
|
|
} |
|
85
|
|
|
|
|
86
|
|
|
function latex_render( $latex, $fg, $bg, $s = 0 ) { |
|
87
|
|
|
$url = "//s0.wp.com/latex.php?latex=" . urlencode( $latex ) . "&bg=" . $bg . "&fg=" . $fg . "&s=" . $s; |
|
88
|
|
|
$url = esc_url( $url ); |
|
89
|
|
|
$alt = str_replace( '\\', '\', esc_attr( $latex ) ); |
|
90
|
|
|
|
|
91
|
|
|
return '<img src="' . $url . '" alt="' . $alt . '" title="' . $alt . '" class="latex" />'; |
|
92
|
|
|
} |
|
93
|
|
|
|
|
94
|
|
|
/** |
|
95
|
|
|
* The shortcode way. The attributes are the same as the old ones - 'fg' and 'bg', instead of foreground |
|
96
|
|
|
* and background, and 's' is for the font size. |
|
97
|
|
|
* |
|
98
|
|
|
* Example: [latex s=4 bg=00f fg=ff0]\LaTeX[/latex] |
|
99
|
|
|
*/ |
|
100
|
|
|
function latex_shortcode( $atts, $content = '' ) { |
|
101
|
|
|
extract( shortcode_atts( array( |
|
|
|
|
|
|
102
|
|
|
's' => 0, |
|
103
|
|
|
'bg' => latex_get_default_color( 'bg' ), |
|
104
|
|
|
'fg' => latex_get_default_color( 'text', '000' ) |
|
105
|
|
|
), $atts, 'latex' ) ); |
|
106
|
|
|
|
|
107
|
|
|
return latex_render( latex_entity_decode( $content ), $fg, $bg, $s ); |
|
108
|
|
|
} |
|
109
|
|
|
|
|
110
|
|
|
/** |
|
111
|
|
|
* LaTeX needs to be untexturized |
|
112
|
|
|
*/ |
|
113
|
|
|
function latex_no_texturize( $shortcodes ) { |
|
114
|
|
|
$shortcodes[] = 'latex'; |
|
115
|
|
|
return $shortcodes; |
|
116
|
|
|
} |
|
117
|
|
|
|
|
118
|
|
|
add_filter( 'no_texturize_shortcodes', 'latex_no_texturize' ); |
|
119
|
|
|
|
|
120
|
|
|
add_filter( 'the_content', 'latex_markup', 9 ); // before wptexturize |
|
121
|
|
|
add_filter( 'comment_text', 'latex_markup', 9 ); // before wptexturize |
|
122
|
|
|
add_shortcode( 'latex', 'latex_shortcode' ); |
|
123
|
|
|
|
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.
You can also find more detailed suggestions in the “Code” section of your repository.