Completed
Push — add/gutenblocks ( 4de311...cb95a3 )
by
unknown
16:12 queued 07:34
created

shortcodes.php ➔ jetpack_shortcodes_current_screen()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 3
nc 2
nop 1
dl 0
loc 5
rs 9.4285
c 0
b 0
f 0
1
<?php
2
3
/**
4
 * Module Name: Shortcode Embeds
5
 * Module Description: Embed media from popular sites without any coding.
6
 * Sort Order: 3
7
 * First Introduced: 1.1
8
 * Major Changes In: 1.2
9
 * Requires Connection: No
10
 * Auto Activate: Yes
11
 * Module Tags: Photos and Videos, Social, Writing, Appearance
12
 * Feature: Writing
13
 * 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
14
 */
15
16
/**
17
 * Transforms the $atts array into a string that the old functions expected
18
 *
19
 * The old way was:
20
 * [shortcode a=1&b=2&c=3] or [shortcode=1]
21
 * This is parsed as array( a => '1&b=2&c=3' ) and array( 0 => '=1' ), which is useless
22
 *
23
 * @param array $params             Array of old shortcode parameters.
24
 * @param bool  $old_format_support true if [shortcode=foo] format is possible.
25
 *
26
 * @return string $params
27
 */
28
function shortcode_new_to_old_params( $params, $old_format_support = false ) {
29
	$str = '';
30
31
	if ( $old_format_support && isset( $params[0] ) ) {
32
		$str = ltrim( $params[0], '=' );
33
	} elseif ( is_array( $params ) ) {
34
		foreach ( array_keys( $params ) as $key ) {
35
			if ( ! is_numeric( $key ) ) {
36
				$str = $key . '=' . $params[ $key ];
37
			}
38
		}
39
	}
40
41
	return str_replace( array( '&amp;', '&#038;' ), '&', $str );
42
}
43
44
/**
45
 * Load all available Jetpack shortcode files.
46
 */
47
function jetpack_load_shortcodes() {
48
	$shortcode_includes = array();
49
50
	foreach ( Jetpack::glob_php( dirname( __FILE__ ) . '/shortcodes' ) as $file ) {
51
		$filename = substr( basename( $file ), 0, -4 );
52
53
		$shortcode_includes[ $filename ] = $file;
54
	}
55
56
	/**
57
	 * This filter allows other plugins to override which shortcodes Jetpack loads.
58
	 *
59
	 * 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.
60
	 *
61
	 * @module shortcodes
62
	 *
63
	 * @since 2.2.1
64
	 * @since 4.2.0 Added filename without extension as array key.
65
	 *
66
	 * @param array $shortcode_includes An array of which shortcodes to include.
67
	 */
68
	$shortcode_includes = apply_filters( 'jetpack_shortcodes_to_include', $shortcode_includes );
69
70
	foreach ( $shortcode_includes as $include ) {
71
		include $include;
72
	}
73
}
74
75
/**
76
 * Runs preg_replace so that replacements don't happen within open tags.
77
 * Parameters are the same as preg_replace, with an added optional search param for improved performance
78
 *
79
 * @param string $pattern     Pattern to search for.
80
 * @param string $replacement String to replace.
81
 * @param string $content     Post content.
82
 * @param string $search      String to search for.
0 ignored issues
show
Documentation introduced by
Should the type for parameter $search not be string|null?

This check looks for @param annotations where the type inferred by our type inference engine differs from the declared type.

It makes a suggestion as to what type it considers more descriptive.

Most often this is a case of a parameter that can be null in addition to its declared types.

Loading history...
83
 *
84
 * @return string $content    Replaced post content.
85
 */
86 View Code Duplication
function jetpack_preg_replace_outside_tags( $pattern, $replacement, $content, $search = null ) {
0 ignored issues
show
Duplication introduced by
This function seems to be duplicated in your project.

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.

Loading history...
87
	if ( ! function_exists( 'wp_html_split' ) ) {
88
		return $content;
89
	}
90
91
	if ( $search && false === strpos( $content, $search ) ) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $search of type string|null is loosely compared to true; this is ambiguous if the string can be empty. You might want to explicitly use !== null instead.

In PHP, under loose comparison (like ==, or !=, or switch conditions), values of different types might be equal.

For string values, the empty string '' is a special case, in particular the following results might be unexpected:

''   == false // true
''   == null  // true
'ab' == false // false
'ab' == null  // false

// It is often better to use strict comparison
'' === false // false
'' === null  // false
Loading history...
92
		return $content;
93
	}
94
95
	$textarr = wp_html_split( $content );
96
	unset( $content );
97
	foreach ( $textarr as &$element ) {
98
		if ( '' === $element || '<' === $element{0} ) {
99
			continue;
100
		}
101
		$element = preg_replace( $pattern, $replacement, $element );
102
	}
103
104
	return join( $textarr );
105
}
106
107
/**
108
 * Runs preg_replace_callback so that replacements don't happen within open tags.
109
 * Parameters are the same as preg_replace, with an added optional search param for improved performance.
110
 *
111
 * @param string $pattern  Pattern to search for.
112
 * @param string $callback Callback returning the replacement string.
113
 * @param string $content  Post content.
114
 * @param string $search   String to search for.
0 ignored issues
show
Documentation introduced by
Should the type for parameter $search not be string|null?

This check looks for @param annotations where the type inferred by our type inference engine differs from the declared type.

It makes a suggestion as to what type it considers more descriptive.

Most often this is a case of a parameter that can be null in addition to its declared types.

Loading history...
115
 *
116
 * @return string $content Replaced post content.
117
 */
118 View Code Duplication
function jetpack_preg_replace_callback_outside_tags( $pattern, $callback, $content, $search = null ) {
0 ignored issues
show
Duplication introduced by
This function seems to be duplicated in your project.

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.

Loading history...
119
	if ( ! function_exists( 'wp_html_split' ) ) {
120
		return $content;
121
	}
122
123
	if ( $search && false === strpos( $content, $search ) ) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $search of type string|null is loosely compared to true; this is ambiguous if the string can be empty. You might want to explicitly use !== null instead.

In PHP, under loose comparison (like ==, or !=, or switch conditions), values of different types might be equal.

For string values, the empty string '' is a special case, in particular the following results might be unexpected:

''   == false // true
''   == null  // true
'ab' == false // false
'ab' == null  // false

// It is often better to use strict comparison
'' === false // false
'' === null  // false
Loading history...
124
		return $content;
125
	}
126
127
	$textarr = wp_html_split( $content );
128
	unset( $content );
129
	foreach ( $textarr as &$element ) {
130
		if ( '' === $element || '<' === $element{0} ) {
131
			continue;
132
		}
133
		$element = preg_replace_callback( $pattern, $callback, $element );
134
	}
135
136
	return join( $textarr );
137
}
138
139
if ( ! function_exists( 'jetpack_shortcode_get_wpvideo_id' ) ) {
140
	/**
141
	 * Get VideoPress ID from wpvideo shortcode attributes.
142
	 *
143
	 * @param array $atts Shortcode attributes.
144
	 * @return int  $id   VideoPress ID.
145
	 */
146
	function jetpack_shortcode_get_wpvideo_id( $atts ) {
147
		if ( isset( $atts[0] ) ) {
148
			return $atts[0];
149
		} else {
150
			return 0;
151
		}
152
	}
153
}
154
155
if ( ! function_exists( 'jetpack_shortcode_get_videopress_id' ) ) {
156
	/**
157
	 * Get VideoPress ID from videopress shortcode attributes.
158
	 *
159
	 * @param array $atts Shortcode attributes.
160
	 * @return int  $id   VideoPress ID.
161
	 */
162
	function jetpack_shortcode_get_videopress_id( $atts ) {
163
		if ( isset( $atts[0] ) ) {
164
			return $atts[0];
165
		} else {
166
			return 0;
167
		}
168
	}
169
}
170
171
/**
172
 * Common element attributes parsing and sanitizing for src, width and height.
173
 *
174
 * @since 4.5.0
175
 *
176
 * @param array $attrs  With original values.
177
 *
178
 * @return array $attrs With sanitized values.
179
 */
180
function wpcom_shortcodereverse_parseattr( $attrs ) {
181
	$defaults = array(
182
		'src'    => false,
183
		'width'  => false,
184
		'height' => false,
185
	);
186
187
	$attrs = shortcode_atts( $defaults, $attrs );
188
189
	$attrs['src']    = strip_tags( $attrs['src'] ); // For sanity
190
	$attrs['width']  = ( is_numeric( $attrs['width'] ) ) ? abs( intval( $attrs['width'] ) ) : $defaults['width'];
191
	$attrs['height'] = ( is_numeric( $attrs['height'] ) ) ? abs( intval( $attrs['height'] ) ) : $defaults['height'];
192
193
	return $attrs;
194
}
195
196
jetpack_load_shortcodes();
197
198
/**
199
 * Load Gutenberg blocks
200
 *
201
 * @since 5.4
202
 */
203 View Code Duplication
function gutenpack_editor_assets_fold() {
0 ignored issues
show
Duplication introduced by
This function seems to be duplicated in your project.

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.

Loading history...
204
	wp_enqueue_style(
205
		'gutenpack-editor',
206
		plugins_url( 'modules/shortcodes/css/gutenpack.css', JETPACK__PLUGIN_FILE ),
207
		array( 'wp-edit-blocks' ),
208
		JETPACK__VERSION
209
	);
210
	wp_enqueue_script(
211
		'gutenpack',
212
		plugins_url( 'shortcodes/js/block.js', __FILE__ ),
213
		array( 'wp-blocks', 'wp-i18n', 'wp-element', 'underscore' ),
214
		JETPACK__VERSION
215
	);
216
}
217
218
/**
219
 * Maybe load Gutenberg editor assets.
220
 *
221
 * @since 5.4
222
 *
223
 * @param object $screen
224
 */
225
function jetpack_shortcodes_current_screen( $screen ) {
226
	if ( 'toplevel_page_gutenberg' === $screen->base ) {
227
		add_action( 'enqueue_block_editor_assets', 'gutenpack_editor_assets_fold' );
228
	}
229
}
230
add_action( 'current_screen', 'jetpack_shortcodes_current_screen' );
231