diff --git a/include/bbcode.php b/include/bbcode.php
index ab599e7c9..f20942dba 100644
--- a/include/bbcode.php
+++ b/include/bbcode.php
@@ -40,8 +40,19 @@ function bb_map_location($match) {
return str_replace($match[0], '
' . Map::byLocation($match[1]) . '
', $match[0]);
}
-function bb_attachment($Text, $simplehtml = false, $tryoembed = true) {
-
+/**
+ * Processes [attachment] tags
+ *
+ * Note: Can produce a [bookmark] tag in the returned string
+ *
+ * @brief Processes [attachment] tags
+ * @param string $Text
+ * @param bool|int $simplehtml
+ * @param bool $tryoembed
+ * @return string
+ */
+function bb_attachment($Text, $simplehtml = false, $tryoembed = true)
+{
$data = get_attachment_data($Text);
if (!$data) {
return $Text;
@@ -52,10 +63,7 @@ function bb_attachment($Text, $simplehtml = false, $tryoembed = true) {
$data["title"] = str_replace(array("http://", "https://"), "", $data["title"]);
}
- if (((strpos($data["text"], "[img=") !== false)
- || (strpos($data["text"], "[img]") !== false)
- || Config::get('system', 'always_show_preview'))
- && ($data["image"] != "")) {
+ if (((strpos($data["text"], "[img=") !== false) || (strpos($data["text"], "[img]") !== false) || Config::get('system', 'always_show_preview')) && ($data["image"] != "")) {
$data["preview"] = $data["image"];
$data["image"] = "";
}
@@ -69,11 +77,13 @@ function bb_attachment($Text, $simplehtml = false, $tryoembed = true) {
$text = sprintf('', $data["type"]);
}
- $bookmark = array(sprintf('[bookmark=%s]%s[/bookmark]', $data["url"], $data["title"]), $data["url"], $data["title"]);
+ $oembed = sprintf('[bookmark=%s]%s[/bookmark]', $data['url'], $data['title']);
if ($tryoembed) {
- $oembed = tryoembed($bookmark);
- } else {
- $oembed = $bookmark[0];
+ try {
+ $oembed = OEmbed::getHTML($data['url'], $data['title']);
+ } catch (Exception $e) {
+ // $oembed isn't modified
+ }
}
if (stripos($oembed, "', '', $s[1]) . '[/code]';
}
-function tryoembed($match) {
- $url = $match[1];
-
- // Always embed the SSL version
- $url = str_replace(array("http://www.youtube.com/", "http://player.vimeo.com/"),
- array("https://www.youtube.com/", "https://player.vimeo.com/"), $url);
-
- $o = OEmbed::fetchURL($url);
-
- if (!is_object($o)) {
- return $match[0];
- }
-
- if (isset($match[2])) {
- $o->title = $match[2];
- }
-
- if ($o->type == "error") {
- return $match[0];
- }
-
- $html = OEmbed::formatObject($o);
-
- return $html;
-}
-
/*
* [noparse][i]italic[/i][/noparse] turns into
* [noparse][ i ]italic[ /i ][/noparse],
@@ -432,6 +416,16 @@ function bb_replace_images($body, $images) {
return $newbody;
}
+/**
+ * Processes [share] tags
+ *
+ * Note: Can produce a [bookmark] tag in the output
+ *
+ * @brief Processes [share] tags
+ * @param array $share preg_match_callback result array
+ * @param bool|int $simplehtml
+ * @return string
+ */
function bb_ShareAttributes($share, $simplehtml)
{
$attributes = $share[2];
@@ -520,7 +514,6 @@ function bb_ShareAttributes($share, $simplehtml)
}
$preshare = trim($share[1]);
-
if ($preshare != "") {
$preshare .= "
";
}
@@ -588,8 +581,13 @@ function bb_ShareAttributes($share, $simplehtml)
default:
// Transforms quoted tweets in rich attachments to avoid nested tweets
if (stripos(normalise_link($link), 'http://twitter.com/') === 0 && OEmbed::isAllowedURL($link)) {
- $bookmark = array(sprintf('[bookmark=%s]%s[/bookmark]', $link, $preshare), $link, $preshare);
- $text = $preshare . tryoembed($bookmark);
+ try {
+ $oembed = OEmbed::getHTML($link, $preshare);
+ } catch (Exception $e) {
+ $oembed = sprintf('[bookmark=%s]%s[/bookmark]', $link, $preshare);
+ }
+
+ $text = $preshare . $oembed;
} else {
$text = trim($share[1]) . "\n";
@@ -597,14 +595,13 @@ function bb_ShareAttributes($share, $simplehtml)
$tpl = get_markup_template('shared_content.tpl');
$text .= replace_macros($tpl, array(
- '$profile' => $profile,
- '$avatar' => $avatar,
- '$author' => $author,
- '$link' => $link,
- '$posted' => $posted,
- '$content' => trim($share[3])
- )
- );
+ '$profile' => $profile,
+ '$avatar' => $avatar,
+ '$author' => $author,
+ '$link' => $link,
+ '$posted' => $posted,
+ '$content' => trim($share[3])
+ ));
}
break;
}
diff --git a/src/Content/OEmbed.php b/src/Content/OEmbed.php
index 4aaae4d5d..50b8bb4e3 100644
--- a/src/Content/OEmbed.php
+++ b/src/Content/OEmbed.php
@@ -15,6 +15,7 @@ use dba;
use DOMDocument;
use DOMXPath;
use DOMNode;
+use Exception;
require_once 'include/dba.php';
require_once 'mod/proxy.php';
@@ -305,6 +306,27 @@ class OEmbed
return allowed_domain($domain, $allowed, true);
}
+ public static function getHTML($url, $title = null)
+ {
+ // Always embed the SSL version
+ $url = str_replace(array("http://www.youtube.com/", "http://player.vimeo.com/"),
+ array("https://www.youtube.com/", "https://player.vimeo.com/"), $url);
+
+ $o = OEmbed::fetchURL($url);
+
+ if (!is_object($o) || $o->type == 'error') {
+ throw new Exception('OEmbed failed for URL: ' . $url);
+ }
+
+ if (x($title)) {
+ $o->title = $title;
+ }
+
+ $html = OEmbed::formatObject($o);
+
+ return $html;
+ }
+
/**
* @brief Generates the iframe HTML for an oembed attachment.
*