2013-02-26 01:09:40 +00:00
< ? php /** @file */
2016-05-03 05:28:27 +00:00
2019-05-10 22:29:05 +00:00
use Zotlabs\Lib\Cache ;
2016-06-23 12:18:58 +00:00
2016-08-12 00:33:28 +00:00
2011-01-31 09:38:49 +00:00
function oembed_replacecb ( $matches ){
2014-01-24 07:46:43 +00:00
2011-05-22 21:03:34 +00:00
$embedurl = $matches [ 1 ];
2015-08-05 03:07:55 +00:00
2016-05-03 05:28:27 +00:00
$result = oembed_action ( $embedurl );
if ( $result [ 'action' ] === 'block' ) {
return '<a href="' . $result [ 'url' ] . '">' . $result [ 'url' ] . '</a>' ;
2016-05-02 02:19:17 +00:00
}
2016-05-03 05:28:27 +00:00
$j = oembed_fetch_url ( $result [ 'url' ]);
2016-05-02 02:19:17 +00:00
$s = oembed_format_object ( $j );
return $s ;
}
function oembed_action ( $embedurl ) {
$host = '' ;
2016-05-03 05:28:27 +00:00
$action = 'filter' ;
2016-05-02 02:19:17 +00:00
2016-05-03 05:28:27 +00:00
$embedurl = trim ( str_replace ( '&' , '&' , $embedurl ));
2016-05-02 02:19:17 +00:00
2019-02-25 23:00:09 +00:00
//logger('oembed_action: ' . $embedurl, LOGGER_DEBUG, LOG_INFO);
2016-05-02 02:19:17 +00:00
2016-05-03 05:28:27 +00:00
if ( strpos ( $embedurl , 'http://' ) === 0 ) {
if ( intval ( get_config ( 'system' , 'embed_sslonly' ))) {
$action = 'block' ;
}
}
2018-03-20 11:08:36 +00:00
2017-01-25 02:33:41 +00:00
if ( strpos ( $embedurl , '.well-known' ) !== false )
$action = 'block' ;
2016-02-05 00:09:36 +00:00
// site white/black list
if (( $x = get_config ( 'system' , 'embed_deny' ))) {
2016-05-02 02:19:17 +00:00
if (( $x ) && ( ! is_array ( $x )))
$x = explode ( " \n " , $x );
if ( $x ) {
foreach ( $x as $ll ) {
$t = trim ( $ll );
2016-05-02 20:31:14 +00:00
if (( $t ) && ( strpos ( $embedurl , $t ) !== false )) {
2016-05-02 02:19:17 +00:00
$action = 'block' ;
break ;
}
2016-02-05 00:09:36 +00:00
}
}
}
2016-05-02 02:19:17 +00:00
$found = false ;
2016-02-05 00:09:36 +00:00
if (( $x = get_config ( 'system' , 'embed_allow' ))) {
2016-05-02 02:19:17 +00:00
if (( $x ) && ( ! is_array ( $x )))
$x = explode ( " \n " , $x );
if ( $x ) {
foreach ( $x as $ll ) {
$t = trim ( $ll );
2016-05-03 05:28:27 +00:00
if (( $t ) && ( strpos ( $embedurl , $t ) !== false ) && ( $action !== 'block' )) {
$found = true ;
$action = 'allow' ;
break ;
2016-02-05 00:09:36 +00:00
}
}
}
2016-05-02 02:19:17 +00:00
if (( ! $found ) && ( $action !== 'block' )) {
$action = 'filter' ;
2016-02-05 00:09:36 +00:00
}
}
2016-05-02 02:19:17 +00:00
// allow individual members to block something that wasn't blocked already.
// They cannot over-ride the site to allow or change the filtering on an
2016-05-03 05:28:27 +00:00
// embed that is not allowed by the site admin.
2016-05-02 02:19:17 +00:00
2015-08-05 03:07:55 +00:00
if ( local_channel ()) {
if (( $x = get_pconfig ( local_channel (), 'system' , 'embed_deny' ))) {
2016-05-02 02:19:17 +00:00
if (( $x ) && ( ! is_array ( $x )))
$x = explode ( " \n " , $x );
if ( $x ) {
foreach ( $x as $ll ) {
$t = trim ( $ll );
2016-05-02 20:31:14 +00:00
if (( $t ) && ( strpos ( $embedurl , $t ) !== false )) {
2016-05-02 02:19:17 +00:00
$action = 'block' ;
2015-08-05 03:07:55 +00:00
break ;
}
}
}
}
}
2016-05-03 05:28:27 +00:00
$arr = array ( 'url' => $embedurl , 'action' => $action );
call_hooks ( 'oembed_action' , $arr );
2019-02-25 23:00:09 +00:00
//logger('action: ' . $arr['action'] . ' url: ' . $arr['url'], LOGGER_DEBUG,LOG_DEBUG);
2011-05-22 21:03:34 +00:00
2016-05-03 05:28:27 +00:00
return $arr ;
2016-05-02 02:19:17 +00:00
}
2011-05-22 21:03:34 +00:00
2015-03-12 01:04:43 +00:00
// if the url is embeddable with oembed, return the bbcode link.
function oembed_process ( $url ) {
2018-05-07 02:57:37 +00:00
2015-03-12 01:04:43 +00:00
$j = oembed_fetch_url ( $url );
2016-12-19 23:38:42 +00:00
logger ( 'oembed_process: ' . print_r ( $j , true ), LOGGER_DATA , LOG_DEBUG );
2016-09-24 12:15:06 +00:00
if ( $j && $j [ 'type' ] !== 'error' )
2015-03-12 01:04:43 +00:00
return '[embed]' . $url . '[/embed]' ;
return false ;
}
2011-05-22 21:03:34 +00:00
function oembed_fetch_url ( $embedurl ){
2012-02-17 07:14:36 +00:00
2016-05-02 02:19:17 +00:00
// These media files should now be caught in bbcode.php
// left here as a fallback in case this is called from another source
2019-07-07 23:32:48 +00:00
$noexts = [ '.mp3' , '.mp4' , '.ogg' , '.ogv' , '.oga' , '.ogm' , '.webm' , '.opus' , '.m4a' , '.mov' ];
2016-05-02 02:19:17 +00:00
2016-05-03 05:28:27 +00:00
$result = oembed_action ( $embedurl );
2012-08-07 06:10:37 +00:00
2016-05-03 05:28:27 +00:00
$embedurl = $result [ 'url' ];
$action = $result [ 'action' ];
2016-02-01 22:52:08 +00:00
2016-06-25 11:09:07 +00:00
foreach ( $noexts as $ext ) {
if ( strpos ( strtolower ( $embedurl ), $ext ) !== false ) {
$action = 'block' ;
}
}
2016-05-02 02:19:17 +00:00
$txt = null ;
2016-02-01 22:52:08 +00:00
2016-08-12 00:33:28 +00:00
// we should try to cache this and avoid a lookup on each render
2017-07-09 23:02:45 +00:00
$is_matrix = is_matrix_url ( $embedurl );
$zrl = (( get_config ( 'system' , 'oembed_zrl' )) ? $is_matrix : false );
2016-08-12 00:33:28 +00:00
2016-12-19 23:38:42 +00:00
$furl = (( local_channel () && $zrl ) ? zid ( $embedurl ) : $embedurl );
2019-05-10 22:29:05 +00:00
if ( $action !== 'block' && ( ! get_config ( 'system' , 'oembed_cache_disable' ))) {
$txt = Cache :: get ( '[' . App :: $videowidth . '] ' . $furl );
2014-02-28 09:30:05 +00:00
}
2019-05-10 22:29:05 +00:00
2019-11-11 04:40:07 +00:00
if ( strpos ( strtolower ( $embedurl ), '.pdf' ) !== false && get_config ( 'system' , 'inline_pdf' )) {
2019-05-10 22:29:05 +00:00
$action = 'allow' ;
$j = [
'html' => '<object data="' . $embedurl . '" type="application/pdf" style="width: 100%; height: 300px;"></object>' ,
'title' => t ( 'View PDF' ),
'type' => 'pdf'
];
2016-05-02 02:19:17 +00:00
2019-05-10 22:29:05 +00:00
// set $txt to something so that we don't attempt to fetch what could be a lengthy pdf.
$txt = EMPTY_STR ;
}
2016-05-02 02:19:17 +00:00
if ( is_null ( $txt )) {
2014-02-28 09:30:05 +00:00
2011-05-22 21:03:34 +00:00
$txt = " " ;
2016-05-02 02:19:17 +00:00
2016-06-25 11:09:07 +00:00
if ( $action !== 'block' ) {
2011-11-17 12:40:11 +00:00
// try oembed autodiscovery
$redirects = 0 ;
2017-04-20 03:48:10 +00:00
$result = z_fetch_url ( $furl , false , $redirects ,
[
'timeout' => 30 ,
'accept_content' => " text/* " ,
'novalidate' => true ,
'session' => (( local_channel () && $zrl ) ? true : false )
]
);
2016-08-31 00:23:14 +00:00
2013-02-26 04:13:30 +00:00
if ( $result [ 'success' ])
$html_text = $result [ 'body' ];
2016-08-31 00:23:14 +00:00
else
logger ( 'fetch failure: ' . $furl );
2013-02-26 04:13:30 +00:00
2016-05-02 02:19:17 +00:00
if ( $html_text ) {
2011-11-17 12:40:11 +00:00
$dom = @ DOMDocument :: loadHTML ( $html_text );
if ( $dom ){
$xpath = new DOMXPath ( $dom );
$attr = " oembed " ;
$xattr = oe_build_xpath ( " class " , " oembed " );
2016-01-31 23:55:27 +00:00
2011-11-17 12:40:11 +00:00
$entries = $xpath -> query ( " //link[@type='application/json+oembed'] " );
foreach ( $entries as $e ){
$href = $e -> getAttributeNode ( " href " ) -> nodeValue ;
2021-01-20 02:21:30 +00:00
// Youtube will happily hand us an http oembed URL even if we specify an https link; and the returned http link will fail with a 40x if you try and fetch it
// This is not our bug, but good luck getting google to fix it.
if ( strpos ( $href , 'http:' ) === 0 && strpos ( $href , 'youtu' ) !== false ) {
$href = str_replace ( 'http:' , 'https:' , $href );
}
2016-03-31 23:06:03 +00:00
$x = z_fetch_url ( $href . '&maxwidth=' . App :: $videowidth );
2016-08-31 00:23:14 +00:00
if ( $x [ 'success' ])
$txt = $x [ 'body' ];
else
logger ( 'fetch failed: ' . $href );
2012-03-25 04:26:50 +00:00
break ;
2011-11-17 12:40:11 +00:00
}
2014-10-08 13:09:15 +00:00
// soundcloud is now using text/json+oembed instead of application/json+oembed,
// others may be also
$entries = $xpath -> query ( " //link[@type='text/json+oembed'] " );
foreach ( $entries as $e ){
$href = $e -> getAttributeNode ( " href " ) -> nodeValue ;
2016-03-31 23:06:03 +00:00
$x = z_fetch_url ( $href . '&maxwidth=' . App :: $videowidth );
2016-08-31 00:23:14 +00:00
if ( $x [ 'success' ])
$txt = $x [ 'body' ];
else
logger ( 'json fetch failed: ' . $href );
2014-10-08 13:09:15 +00:00
break ;
}
2011-10-24 15:28:28 +00:00
}
2011-05-22 21:03:34 +00:00
}
}
2013-06-03 23:53:53 +00:00
if ( $txt == false || $txt == " " ) {
2016-03-31 23:06:03 +00:00
$x = array ( 'url' => $embedurl , 'videowidth' => App :: $videowidth );
2013-06-03 23:53:53 +00:00
call_hooks ( 'oembed_probe' , $x );
if ( array_key_exists ( 'embed' , $x ))
$txt = $x [ 'embed' ];
2011-05-22 21:03:34 +00:00
}
$txt = trim ( $txt );
2016-05-02 02:19:17 +00:00
2011-05-22 21:03:34 +00:00
if ( $txt [ 0 ] != " { " ) $txt = '{"type":"error"}' ;
2017-04-20 03:48:10 +00:00
// save in cache
2016-02-01 22:52:08 +00:00
if ( ! get_config ( 'system' , 'oembed_cache_disable' ))
2019-05-10 22:29:05 +00:00
Cache :: set ( '[' . App :: $videowidth . '] ' . $furl , $txt );
2011-10-24 11:02:38 +00:00
2011-05-22 21:03:34 +00:00
}
2015-08-04 04:17:00 +00:00
2016-09-24 12:15:06 +00:00
2018-05-07 02:57:37 +00:00
if ( ! $j ) {
$j = json_decode ( $txt , true );
}
if ( ! $j ) {
2016-09-24 12:15:06 +00:00
$j = [];
2018-05-07 02:57:37 +00:00
}
2016-05-02 02:19:17 +00:00
2016-05-03 05:28:27 +00:00
if ( $action === 'filter' ) {
2016-09-24 12:15:06 +00:00
if ( $j [ 'html' ]) {
$orig = $j [ 'html' ];
2017-07-09 23:02:45 +00:00
$allow_position = (( $is_matrix ) ? true : false );
2017-09-07 02:55:32 +00:00
// some sites wrap their entire embed in an iframe
// which we will purify away and which we provide anyway.
// So if we see this, grab the frame src url and use that
// as the embed content - which will still need to be purified.
2017-09-11 05:59:26 +00:00
if ( preg_match ( '#\<iframe(.*?)src\=[\'\"](.*?)[\'\"]#' , $j [ 'html' ], $matches )) {
2017-09-07 02:55:32 +00:00
$x = z_fetch_url ( $matches [ 2 ]);
2018-04-26 03:47:30 +00:00
$orig = $j [ 'html' ] = $x [ 'body' ];
2017-09-07 02:55:32 +00:00
}
2018-04-26 03:47:30 +00:00
2018-12-26 23:33:01 +00:00
// logger('frame src: ' . $j['html'], LOGGER_DATA);
2018-04-26 03:47:30 +00:00
2016-09-24 12:15:06 +00:00
$j [ 'html' ] = purify_html ( $j [ 'html' ], $allow_position );
if ( $j [ 'html' ] != $orig ) {
2019-06-21 06:17:04 +00:00
// logger('oembed html was purified. original: ' . $orig . ' purified: ' . $j['html'], LOGGER_DEBUG, LOG_INFO);
2016-05-03 05:28:27 +00:00
}
2016-07-22 00:44:04 +00:00
2016-08-12 00:33:28 +00:00
$orig_len = mb_strlen ( preg_replace ( '/\s+/' , '' , $orig ));
2016-09-24 12:15:06 +00:00
$new_len = mb_strlen ( preg_replace ( '/\s+/' , '' , $j [ 'html' ]));
2016-08-12 00:33:28 +00:00
if ( stripos ( $orig , '<script' ) || ( ! $new_len ))
2016-09-24 12:15:06 +00:00
$j [ 'type' ] = 'error' ;
2016-07-22 00:44:04 +00:00
elseif ( $orig_len ) {
$ratio = $new_len / $orig_len ;
2016-08-12 00:33:28 +00:00
if ( $ratio < 0.5 ) {
2016-09-24 12:15:06 +00:00
$j [ 'type' ] = 'error' ;
2016-08-12 00:33:28 +00:00
logger ( 'oembed html truncated: ' . $ratio , LOGGER_DEBUG , LOG_INFO );
}
2016-07-22 00:44:04 +00:00
}
2016-05-02 02:19:17 +00:00
}
}
2016-09-24 12:15:06 +00:00
$j [ 'embedurl' ] = $embedurl ;
2018-11-01 23:53:45 +00:00
$j [ 'zrl' ] = $is_matrix ;
2016-02-01 22:52:08 +00:00
2016-08-12 00:33:28 +00:00
// logger('fetch return: ' . print_r($j,true));
2016-02-01 22:52:08 +00:00
2011-05-22 21:03:34 +00:00
return $j ;
2016-02-01 22:52:08 +00:00
2011-05-22 21:03:34 +00:00
}
function oembed_format_object ( $j ){
2016-05-25 03:49:23 +00:00
2016-09-24 12:15:06 +00:00
$embedurl = $j [ 'embedurl' ];
2014-10-09 03:37:46 +00:00
2016-02-01 22:52:08 +00:00
// logger('format: ' . print_r($j,true));
2016-09-24 12:15:06 +00:00
$jhtml = oembed_iframe ( $j [ 'embedurl' ],( isset ( $j [ 'width' ]) ? $j [ 'width' ] : null ), ( isset ( $j [ 'height' ]) ? $j [ 'height' ] : null ));
2014-01-24 07:46:43 +00:00
2016-09-24 12:15:06 +00:00
$ret = " <span class='oembed " . $j [ 'type' ] . " '> " ;
switch ( $j [ 'type' ]) {
2011-05-22 21:03:34 +00:00
case " video " : {
2016-09-24 12:15:06 +00:00
if ( isset ( $j [ 'thumbnail_url' ])) {
$tw = ( isset ( $j [ 'thumbnail_width' ])) ? $j [ 'thumbnail_width' ] : 200 ;
$th = ( isset ( $j [ 'thumbnail_height' ])) ? $j [ 'thumbnail_height' ] : 180 ;
2011-10-24 15:31:14 +00:00
$tr = $tw / $th ;
$th = 120 ; $tw = $th * $tr ;
2011-10-24 15:28:28 +00:00
$tpl = get_markup_template ( 'oembed_video.tpl' );
2016-10-21 00:53:15 +00:00
2011-10-24 15:28:28 +00:00
$ret .= replace_macros ( $tpl , array (
2016-03-31 05:13:24 +00:00
'$baseurl' => z_root (),
2011-10-24 15:28:28 +00:00
'$embedurl' => $embedurl ,
2011-10-25 12:59:31 +00:00
'$escapedhtml' => base64_encode ( $jhtml ),
2011-10-24 15:28:28 +00:00
'$tw' => $tw ,
'$th' => $th ,
2016-09-24 12:15:06 +00:00
'$turl' => $j [ 'thumbnail_url' ],
2011-10-24 15:28:28 +00:00
));
2011-05-22 21:03:34 +00:00
} else {
2011-10-25 12:59:31 +00:00
$ret = $jhtml ;
2011-05-22 21:03:34 +00:00
}
$ret .= " <br> " ;
}; break ;
case " photo " : {
2016-09-24 12:15:06 +00:00
$ret .= " <img width=' " . $j [ 'width' ] . " ' src=' " . $j [ 'url' ] . " '> " ;
2011-05-22 21:03:34 +00:00
$ret .= " <br> " ;
}; break ;
case " link " : {
2016-09-24 12:15:06 +00:00
if ( $j [ 'thumbnail_url' ]) {
2016-02-01 00:33:25 +00:00
if ( is_matrix_url ( $embedurl )) {
$embedurl = zid ( $embedurl );
2016-09-24 12:15:06 +00:00
$j [ 'thumbnail_url' ] = zid ( $j [ 'thumbnail_url' ]);
2016-02-01 00:33:25 +00:00
}
2019-11-22 01:34:49 +00:00
$ret = '<a href="' . $embedurl . '" ><img src="' . $j [ 'thumbnail_url' ] . '" alt="thumbnail" /></a><br><br>' ;
2016-01-31 23:55:27 +00:00
}
2016-09-24 12:15:06 +00:00
//$ret = "<a href='".$embedurl."'>".$j['title']."</a>";
2011-05-22 21:03:34 +00:00
}; break ;
2018-05-07 02:57:37 +00:00
case 'pdf' : {
$ret = $j [ 'html' ];
break ;
}
2018-11-01 23:53:45 +00:00
case " rich " :
if ( $j [ 'zrl' ]) {
$ret = (( preg_match ( '/^<div[^>]+>(.*?)<\/div>$/is' , $j [ 'html' ], $o )) ? $o [ 1 ] : $j [ 'html' ]);
}
else {
$ret .= $jhtml ;
}
break ;
2011-05-22 21:03:34 +00:00
}
2011-10-21 14:26:29 +00:00
// add link to source if not present in "rich" type
2016-09-24 12:15:06 +00:00
if ( $j [ 'type' ] != 'rich' || ! strpos ( $j [ 'html' ], $embedurl ) ){
$embedlink = ( isset ( $j [ 'title' ])) ? $j [ 'title' ] : $embedurl ;
2019-11-22 01:34:49 +00:00
$ret .= '<br>' . " <a href=' $embedurl ' rel='oembed'> $embedlink </a> " ;
$ret .= " <br> " ;
2016-09-24 12:15:06 +00:00
if ( isset ( $j [ 'author_name' ])) $ret .= t ( ' by ' ) . $j [ 'author_name' ];
if ( isset ( $j [ 'provider_name' ])) $ret .= t ( ' on ' ) . $j [ 'provider_name' ];
2011-10-21 14:26:29 +00:00
} else {
// add <a> for html2bbcode conversion
2019-11-22 01:34:49 +00:00
$ret .= " <br><a href=' $embedurl ' rel='oembed'> $embedurl </a> " ;
2011-10-21 14:26:29 +00:00
}
2011-05-22 21:03:34 +00:00
$ret .= " <br style='clear:left'></span> " ;
2011-10-21 14:26:29 +00:00
return mb_convert_encoding ( $ret , 'HTML-ENTITIES' , mb_detect_encoding ( $ret ));
2011-01-31 09:38:49 +00:00
}
2011-10-25 03:10:46 +00:00
function oembed_iframe ( $src , $width , $height ) {
2016-02-03 01:14:07 +00:00
$scroll = ' scrolling="no" ' ;
if ( ! $width || strstr ( $width , '%' )) {
2011-10-25 03:10:46 +00:00
$width = '640' ;
2016-02-03 01:14:07 +00:00
$scroll = ' scrolling="auto" ' ;
}
if ( ! $height || strstr ( $height , '%' )) {
2011-10-25 03:10:46 +00:00
$height = '300' ;
2016-02-03 01:14:07 +00:00
$scroll = ' scrolling="auto" ' ;
}
2011-10-25 03:10:46 +00:00
// try and leave some room for the description line.
$height = intval ( $height ) + 80 ;
$width = intval ( $width ) + 40 ;
2014-10-09 03:37:46 +00:00
$s = z_root () . '/oembed/' . base64url_encode ( $src );
2014-03-31 22:56:58 +00:00
2014-10-09 03:37:46 +00:00
// Make sure any children are sandboxed within their own iframe.
2014-03-31 22:56:58 +00:00
2019-04-06 23:33:49 +00:00
return '<iframe ' . ' style="max-width: 100%;" ' . $scroll . 'height="' . $height . '" width="' . $width . '" src="' . $s . '" allowfullscreen frameborder="no" >'
2014-10-09 03:37:46 +00:00
. t ( 'Embedded content' ) . '</iframe>' ;
2011-10-25 03:10:46 +00:00
}
2011-01-31 15:45:58 +00:00
function oembed_bbcode2html ( $text ){
2011-01-31 09:38:49 +00:00
$stopoembed = get_config ( " system " , " no_oembed " );
2011-01-31 10:00:35 +00:00
if ( $stopoembed == true ){
return preg_replace ( " / \ [embed \ ](.+?) \ [ \ /embed \ ]/is " , " <!-- oembed $ 1 --><i> " . t ( 'Embedding disabled' ) . " : $ 1</i><!-- /oembed $ 1 --> " , $text );
}
2011-02-01 07:06:45 +00:00
return preg_replace_callback ( " / \ [embed \ ](.+?) \ [ \ /embed \ ]/is " , 'oembed_replacecb' , $text );
2011-01-31 09:38:49 +00:00
}
2011-01-31 15:45:58 +00:00
function oe_build_xpath ( $attr , $value ){
// http://westhoffswelt.de/blog/0036_xpath_to_select_html_by_class.html
return " contains( normalize-space( @ $attr ), ' $value ' ) or substring( normalize-space( @ $attr ), 1, string-length( ' $value ' ) + 1 ) = ' $value ' or substring( normalize-space( @ $attr ), string-length( @ $attr ) - string-length( ' $value ' ) ) = ' $value ' or @ $attr = ' $value ' " ;
}
function oe_get_inner_html ( $node ) {
$innerHTML = '' ;
$children = $node -> childNodes ;
foreach ( $children as $child ) {
$innerHTML .= $child -> ownerDocument -> saveXML ( $child );
}
return $innerHTML ;
}
/**
* Find < span class = 'oembed' >..< a href = 'url' rel = 'oembed' >..</ a ></ span >
* and replace it with [ embed ] url [ / embed ]
*/
function oembed_html2bbcode ( $text ) {
2011-02-16 08:22:32 +00:00
// start parser only if 'oembed' is in text
if ( strpos ( $text , " oembed " )){
// convert non ascii chars to html entities
$html_text = mb_convert_encoding ( $text , 'HTML-ENTITIES' , mb_detect_encoding ( $text ));
// If it doesn't parse at all, just return the text.
$dom = @ DOMDocument :: loadHTML ( $html_text );
if ( ! $dom )
return $text ;
$xpath = new DOMXPath ( $dom );
$attr = " oembed " ;
$xattr = oe_build_xpath ( " class " , " oembed " );
$entries = $xpath -> query ( " //span[ $xattr ] " );
2011-10-21 14:26:29 +00:00
$xattr = " @rel='oembed' " ; //oe_build_xpath("rel","oembed");
2011-02-16 08:22:32 +00:00
foreach ( $entries as $e ) {
$href = $xpath -> evaluate ( " a[ $xattr ]/@href " , $e ) -> item ( 0 ) -> nodeValue ;
2011-05-22 19:56:47 +00:00
if ( ! is_null ( $href )) $e -> parentNode -> replaceChild ( new DOMText ( " [embed] " . $href . " [/embed] " ), $e );
2011-02-16 08:22:32 +00:00
}
return oe_get_inner_html ( $dom -> getElementsByTagName ( " body " ) -> item ( 0 ) );
} else {
2011-02-09 04:55:34 +00:00
return $text ;
2011-02-16 08:22:32 +00:00
}
2011-01-31 15:45:58 +00:00
}
2011-10-24 11:02:38 +00:00