summaryrefslogtreecommitdiff
blob: de7828c6e7a0b58d832ffc1951c141edf6a84011 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
<?php

/**
 * Module Name: Shortcode Embeds
 * Module Description: Embed media from popular sites without any coding.
 * Sort Order: 3
 * First Introduced: 1.1
 * Major Changes In: 1.2
 * Requires Connection: No
 * Auto Activate: Yes
 * Module Tags: Photos and Videos, Social, Writing, Appearance
 * Feature: Writing
 * Additional Search Queries: shortcodes, shortcode, embeds, media, bandcamp, dailymotion, facebook, flickr, google calendars, google maps, google+, polldaddy, recipe, recipes, scribd, slideshare, slideshow, slideshows, soundcloud, ted, twitter, vimeo, vine, youtube
 */

/**
 * Transforms the $atts array into a string that the old functions expected
 *
 * The old way was:
 * [shortcode a=1&b=2&c=3] or [shortcode=1]
 * This is parsed as array( a => '1&b=2&c=3' ) and array( 0 => '=1' ), which is useless
 *
 * @param array $params             Array of old shortcode parameters.
 * @param bool  $old_format_support true if [shortcode=foo] format is possible.
 *
 * @return string $params
 */
function shortcode_new_to_old_params( $params, $old_format_support = false ) {
	$str = '';

	if ( $old_format_support && isset( $params[0] ) ) {
		$str = ltrim( $params[0], '=' );
	} elseif ( is_array( $params ) ) {
		foreach ( array_keys( $params ) as $key ) {
			if ( ! is_numeric( $key ) ) {
				$str = $key . '=' . $params[ $key ];
			}
		}
	}

	return str_replace( array( '&amp;', '&#038;' ), '&', $str );
}

/**
 * Load all available Jetpack shortcode files.
 */
function jetpack_load_shortcodes() {
	$shortcode_includes = array();

	foreach ( Jetpack::glob_php( dirname( __FILE__ ) . '/shortcodes' ) as $file ) {
		$filename = substr( basename( $file ), 0, -4 );

		$shortcode_includes[ $filename ] = $file;
	}

	/**
	 * This filter allows other plugins to override which shortcodes Jetpack loads.
	 *
	 * Fires as part of the `plugins_loaded` WP hook, so modifying code needs to be in a plugin, not in a theme's functions.php.
	 *
	 * @module shortcodes
	 *
	 * @since 2.2.1
	 * @since 4.2.0 Added filename without extension as array key.
	 *
	 * @param array $shortcode_includes An array of which shortcodes to include.
	 */
	$shortcode_includes = apply_filters( 'jetpack_shortcodes_to_include', $shortcode_includes );

	foreach ( $shortcode_includes as $include ) {
		include_once $include;
	}
}

/**
 * Runs preg_replace so that replacements don't happen within open tags.
 * Parameters are the same as preg_replace, with an added optional search param for improved performance
 *
 * @param string $pattern     Pattern to search for.
 * @param string $replacement String to replace.
 * @param string $content     Post content.
 * @param string $search      String to search for.
 *
 * @return string $content    Replaced post content.
 */
function jetpack_preg_replace_outside_tags( $pattern, $replacement, $content, $search = null ) {
	if ( $search && false === strpos( $content, $search ) ) {
		return $content;
	}

	$textarr = wp_html_split( $content );
	unset( $content );
	foreach ( $textarr as &$element ) {
		if ( '' === $element || '<' === $element{0} ) {
			continue;
		}
		$element = preg_replace( $pattern, $replacement, $element );
	}

	return join( $textarr );
}

/**
 * Runs preg_replace_callback so that replacements don't happen within open tags.
 * Parameters are the same as preg_replace, with an added optional search param for improved performance.
 *
 * @param string $pattern  Pattern to search for.
 * @param string $callback Callback returning the replacement string.
 * @param string $content  Post content.
 * @param string $search   String to search for.
 *
 * @return string $content Replaced post content.
 */
function jetpack_preg_replace_callback_outside_tags( $pattern, $callback, $content, $search = null ) {
	if ( $search && false === strpos( $content, $search ) ) {
		return $content;
	}

	$textarr = wp_html_split( $content );
	unset( $content );
	foreach ( $textarr as &$element ) {
		if ( '' === $element || '<' === $element{0} ) {
			continue;
		}
		$element = preg_replace_callback( $pattern, $callback, $element );
	}

	return join( $textarr );
}

if ( ! function_exists( 'jetpack_shortcode_get_wpvideo_id' ) ) {
	/**
	 * Get VideoPress ID from wpvideo shortcode attributes.
	 *
	 * @param array $atts Shortcode attributes.
	 * @return int  $id   VideoPress ID.
	 */
	function jetpack_shortcode_get_wpvideo_id( $atts ) {
		if ( isset( $atts[0] ) ) {
			return $atts[0];
		} else {
			return 0;
		}
	}
}

if ( ! function_exists( 'jetpack_shortcode_get_videopress_id' ) ) {
	/**
	 * Get VideoPress ID from videopress shortcode attributes.
	 *
	 * @param array $atts Shortcode attributes.
	 * @return int  $id   VideoPress ID.
	 */
	function jetpack_shortcode_get_videopress_id( $atts ) {
		if ( isset( $atts[0] ) ) {
			return $atts[0];
		} else {
			return 0;
		}
	}
}

/**
 * Common element attributes parsing and sanitizing for src, width and height.
 *
 * @since 4.5.0
 *
 * @param array $attrs  With original values.
 *
 * @return array $attrs With sanitized values.
 */
function wpcom_shortcodereverse_parseattr( $attrs ) {
	$defaults = array(
		'src'    => false,
		'width'  => false,
		'height' => false,
	);

	$attrs = shortcode_atts( $defaults, $attrs );

	$attrs['src']    = strip_tags( $attrs['src'] ); // For sanity
	$attrs['width']  = ( is_numeric( $attrs['width'] ) ) ? abs( intval( $attrs['width'] ) ) : $defaults['width'];
	$attrs['height'] = ( is_numeric( $attrs['height'] ) ) ? abs( intval( $attrs['height'] ) ) : $defaults['height'];

	return $attrs;
}

/**
 * When an embed service goes away, we can use this handler
 * to output a link for history's sake.
 */
function jetpack_deprecated_embed_handler( $matches, $attr, $url ) {
	return sprintf( '<a href="%s">%s</a>', esc_url( $url ), esc_html( esc_url( $url ) ) );
}

jetpack_load_shortcodes();