You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
78 lines
1.9 KiB
78 lines
1.9 KiB
<?php |
|
/** |
|
* Class AMP_Scribd_Embed_Handler |
|
* |
|
* @package AMP |
|
* @since 1.4 |
|
*/ |
|
|
|
/** |
|
* Class AMP_Scribd_Embed_Handler |
|
*/ |
|
class AMP_Scribd_Embed_Handler extends AMP_Base_Embed_Handler { |
|
|
|
/** |
|
* Registers embed. |
|
*/ |
|
public function register_embed() { |
|
add_filter( 'embed_oembed_html', [ $this, 'filter_embed_oembed_html' ], 10, 2 ); |
|
} |
|
|
|
/** |
|
* Unregisters embed. |
|
*/ |
|
public function unregister_embed() { |
|
remove_filter( 'embed_oembed_html', [ $this, 'filter_embed_oembed_html' ] ); |
|
} |
|
|
|
/** |
|
* Filter oEmbed HTML for Scribd to be AMP compatible. |
|
* |
|
* @param string $cache Cache for oEmbed. |
|
* @param string $url Embed URL. |
|
* @return string Embed. |
|
*/ |
|
public function filter_embed_oembed_html( $cache, $url ) { |
|
if ( ! in_array( wp_parse_url( $url, PHP_URL_HOST ), [ 'scribd.com', 'www.scribd.com' ], true ) ) { |
|
return $cache; |
|
} |
|
|
|
return $this->sanitize_iframe( $cache ); |
|
} |
|
|
|
/** |
|
* Retrieves iframe element from HTML string and amends or appends the correct sandbox permissions. |
|
* |
|
* @param string $html HTML string. |
|
* @return string iframe with correct sandbox permissions. |
|
*/ |
|
private function sanitize_iframe( $html ) { |
|
return preg_replace_callback( |
|
'#^.*<iframe(?P<iframe_attributes>[^>]+?)></iframe>.*$#s', |
|
function ( $matches ) { |
|
$attrs = $matches['iframe_attributes']; |
|
|
|
// Amend the required keywords to the iframe's sandbox. |
|
$sandbox = 'allow-popups allow-scripts'; |
|
$replaced = 0; |
|
$attrs = preg_replace( |
|
'#(?<=\ssandbox=["\'])#', |
|
"{$sandbox} ", // whitespace is necessary to separate prior permissions. |
|
$attrs, |
|
1, |
|
$replaced |
|
); |
|
|
|
// If no sandbox attribute was found, then add the attribute. |
|
if ( 0 === $replaced ) { |
|
$attrs .= sprintf( ' sandbox="%s"', $sandbox ); |
|
} |
|
|
|
// The iframe sanitizer will convert this into an amp-iframe. |
|
return "<iframe{$attrs}></iframe>"; |
|
}, |
|
$html |
|
); |
|
} |
|
|
|
}
|
|
|