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.
141 lines
3.1 KiB
141 lines
3.1 KiB
<?php |
|
/** |
|
* Class AMP_O2_Player_Sanitizer |
|
* |
|
* @package AMP |
|
*/ |
|
|
|
/** |
|
* Class AMP_O2_Player_Sanitizer |
|
* |
|
* Converts <div class="vdb_player><script></script></div> embed to <amp-o2-player> |
|
* |
|
* @since 1.0 |
|
* @see https://www.ampproject.org/docs/reference/components/amp-o2-player |
|
*/ |
|
class AMP_O2_Player_Sanitizer extends AMP_Base_Sanitizer { |
|
/** |
|
* Pattern to extract the information required for amp-o2-player element: data-pid, data-vid, data-bcid. |
|
* |
|
* @since 1.0 |
|
*/ |
|
const URL_PATTERN = '#.*delivery.vidible.tv\/jsonp\/pid=(?<data_pid>.*)\/vid=(?<data_vid>.*)\/(?<data_bcid>.*).js.*#i'; |
|
|
|
/** |
|
* AMP Tag. |
|
* |
|
* @since 1.0 |
|
* @var string AMP Tag. |
|
*/ |
|
private static $amp_tag = 'amp-o2-player'; |
|
|
|
/** |
|
* Amp O2 Player class. |
|
* |
|
* @since 1.0 |
|
* @var string CSS class to identify O2 Player <div> to replace with AMP version. |
|
*/ |
|
private static $xpath_selector = '//div[ contains( @class, \'vdb_player\' ) ]/script'; |
|
|
|
/** |
|
* Height to set for O2 Player elements. |
|
* |
|
* @since 1.0 |
|
* @var string |
|
*/ |
|
private static $height = '270'; |
|
|
|
/** |
|
* Width to set for O2 Player elements. |
|
* |
|
* @since 1.0 |
|
* @var string |
|
*/ |
|
private static $width = '480'; |
|
|
|
/** |
|
* Sanitize the O2 Player elements from the HTML contained in this instance's DOMDocument. |
|
* |
|
* @since 1.0 |
|
*/ |
|
public function sanitize() { |
|
/** |
|
* XPath. |
|
* |
|
* @var DOMXPath $xpath |
|
*/ |
|
$xpath = new DOMXPath( $this->dom ); |
|
|
|
/** |
|
* Node list. |
|
* |
|
* @var DOMNodeList $nodes |
|
*/ |
|
$nodes = $xpath->query( self::$xpath_selector ); |
|
$num_nodes = $nodes->length; |
|
|
|
if ( 0 === $num_nodes ) { |
|
return; |
|
} |
|
|
|
for ( $i = $num_nodes - 1; $i >= 0; $i-- ) { |
|
$node = $nodes->item( $i ); |
|
|
|
$this->create_amp_o2_player( $this->dom, $node ); |
|
} |
|
|
|
} |
|
|
|
/** |
|
* Replaces node with amp-o2-player |
|
* |
|
* @since 1.0 |
|
* @param DOMDocument $dom The HTML Document. |
|
* @param DOMElement $node The DOMNode to adjust and replace. |
|
*/ |
|
private function create_amp_o2_player( $dom, $node ) { |
|
$o2_attributes = $this->get_o2_player_attributes( $node->getAttribute( 'src' ) ); |
|
|
|
if ( ! empty( $o2_attributes ) ) { |
|
$component_attributes = array_merge( |
|
$o2_attributes, |
|
[ |
|
'data-macros' => 'm.playback=click', |
|
'layout' => 'responsive', |
|
'width' => self::$width, |
|
'height' => self::$height, |
|
] |
|
); |
|
|
|
$amp_o2_player = AMP_DOM_Utils::create_node( $dom, self::$amp_tag, $component_attributes ); |
|
|
|
$parent_node = $node->parentNode; |
|
|
|
// replaces the wrapper that contains the script with amp-o2-player element. |
|
$parent_node->parentNode->replaceChild( $amp_o2_player, $parent_node ); |
|
|
|
$this->did_convert_elements = true; |
|
} |
|
} |
|
|
|
/** |
|
* Gets O2 Player's required attributes from script src |
|
* |
|
* @since 1.0 |
|
* @param string $src Script src. |
|
* |
|
* @return array The data-* attributes for o2 player. |
|
*/ |
|
private function get_o2_player_attributes( $src ) { |
|
$found = preg_match( self::URL_PATTERN, $src, $matches ); |
|
if ( $found ) { |
|
return [ |
|
'data-pid' => $matches['data_pid'], |
|
'data-vid' => $matches['data_vid'], |
|
'data-bcid' => $matches['data_bcid'], |
|
]; |
|
} |
|
return []; |
|
} |
|
|
|
}
|
|
|