summaryrefslogtreecommitdiff
blob: 3574028774b1c9bd8a594cc6d3490fa2180dc114 (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
<?php
/**
 * Slideshare shortcode
 *
 * Formats:
 * Old style (still compatible): [slideshare id=5342235&doc=camprock-101002163655-phpapp01&w=300&h=200]
 * New style: [slideshare id=5342235&w=300&h=200&fb=0&mw=0&mh=0&sc=no]
 *
 * Legend:
 *  id    = Document ID provided by Slideshare
 *  w     = Width of iFrame     (int)
 *  h     = Height of iFrame    (int)
 *  fb    = iFrame frameborder  (int)
 *  mw    = iFrame marginwidth  (int)
 *  mh    = iFrame marginheight (int)
 *  sc    = iFrame Scrollbar    (yes/no)
 *  pro   = Slideshare Pro      (yes/no)
 *  style = Inline CSS          (string)
 *
 * @package Jetpack
 */

/**
 * Register and display shortcode.
 *
 * @param array $atts Shortcode attributes.
 */
function slideshare_shortcode( $atts ) {
	global $content_width;

	$params = shortcode_new_to_old_params( $atts );
	parse_str( $params, $arguments );

	if ( empty( $arguments ) ) {
		return '<!-- SlideShare error: no arguments -->';
	}

	$attr = shortcode_atts(
		array(
			'id'    => '',
			'w'     => '',
			'h'     => '',
			'fb'    => '',
			'mw'    => '',
			'mh'    => '',
			'sc'    => '',
			'pro'   => '',
			'style' => '',
		),
		$arguments
	);

	// check that the Slideshare ID contains letters, numbers and query strings.
	$pattern = '/[^-_a-zA-Z0-9?=&]/';
	if ( empty( $attr['id'] ) || preg_match( $pattern, $attr['id'] ) ) {
		return '<!-- SlideShare error: id is missing or has illegal characters -->';
	}

	// check the width/height.
	$w = intval( $attr['w'] );

	// If no width was specified (or uses the wrong format), and if we have a $content_width, use that.
	if ( empty( $w ) && ! empty( $content_width ) ) {
		$w = intval( $content_width );
	} elseif ( $w < 300 || $w > 1600 ) { // If width was specified, but is too small/large, set default value.
		$w = 425;
	} else {
		$w = intval( $w );
	}

	$h = ceil( $w * 348 / 425 ); // Note: user-supplied height is ignored.

	if ( ! empty( $attr['pro'] ) ) {
		$source = 'https://www.slideshare.net/slidesharepro/' . $attr['id'];
	} else {
		$source = 'https://www.slideshare.net/slideshow/embed_code/' . $attr['id'];
	}

	if ( isset( $attr['rel'] ) ) {
		$source = add_query_arg( 'rel', intval( $attr['rel'] ), $source );
	}

	if ( ! empty( $attr['startSlide'] ) ) {
		$source = add_query_arg( 'startSlide', intval( $attr['startSlide'] ), $source );
	}

	$player = sprintf( "<iframe src='%s' width='%d' height='%d'", esc_url( $source ), $w, $h );

	// check the frameborder.
	if ( ! empty( $attr['fb'] ) || '0' === $attr['fb'] ) {
		$player .= " frameborder='" . intval( $attr['fb'] ) . "'";
	}

	// check the margin width; if not empty, cast as int.
	if ( ! empty( $attr['mw'] ) || '0' === $attr['mw'] ) {
		$player .= " marginwidth='" . intval( $attr['mw'] ) . "'";
	}

	// check the margin height, if not empty, cast as int.
	if ( ! empty( $attr['mh'] ) || '0' === $attr['mh'] ) {
		$player .= " marginheight='" . intval( $attr['mh'] ) . "'";
	}

	if ( ! empty( $attr['style'] ) ) {
		$player .= " style='" . esc_attr( $attr['style'] ) . "'";
	}

	// check the scrollbar; cast as a lowercase string for comparison.
	if ( ! empty( $attr['sc'] ) ) {
		$sc = strtolower( $attr['sc'] );

		if ( in_array( $sc, array( 'yes', 'no' ), true ) ) {
			$player .= " scrolling='" . $sc . "'";
		}
	}

	$player .= ' allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe>';

	/**
	 * Filter the returned SlideShare shortcode.
	 *
	 * @module shortcodes
	 *
	 * @since 4.7.0
	 *
	 * @param string $player The iframe to return.
	 * @param array  $atts   The attributes specified in the shortcode.
	 */
	return apply_filters( 'jetpack_slideshare_shortcode', $player, $atts );
}
add_shortcode( 'slideshare', 'slideshare_shortcode' );