X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FContent%2FText%2FBBCode.php;h=a8b5ec2025546e7ffa0e694597d2f38524ccd8b1;hb=5e2cbce9b6efce2baaed69b6aad1537a51bdae9d;hp=c903ee6945790fcd96e85c476af168c4ff124c91;hpb=a97b540ebb3f1d5bb5c18b4c0fb631443d03b5a7;p=friendica.git diff --git a/src/Content/Text/BBCode.php b/src/Content/Text/BBCode.php index c903ee6945..a8b5ec2025 100644 --- a/src/Content/Text/BBCode.php +++ b/src/Content/Text/BBCode.php @@ -11,11 +11,13 @@ use Exception; use Friendica\BaseObject; use Friendica\Content\OEmbed; use Friendica\Content\Smilies; -use Friendica\Core\Addon; use Friendica\Core\Cache; use Friendica\Core\Config; +use Friendica\Core\Hook; use Friendica\Core\L10n; +use Friendica\Core\Logger; use Friendica\Core\Protocol; +use Friendica\Core\Renderer; use Friendica\Core\System; use Friendica\Model\Contact; use Friendica\Model\Event; @@ -25,6 +27,8 @@ use Friendica\Util\Map; use Friendica\Util\Network; use Friendica\Util\ParseUrl; use Friendica\Util\Proxy as ProxyUtils; +use Friendica\Util\Strings; +use Friendica\Util\XML; class BBCode extends BaseObject { @@ -33,13 +37,14 @@ class BBCode extends BaseObject * * @param string $body Message body * @return array - * 'type' -> Message type ("link", "video", "photo") - * 'text' -> Text before the shared message - * 'after' -> Text after the shared message - * 'image' -> Preview image of the message - * 'url' -> Url to the attached message - * 'title' -> Title of the attachment - * 'description' -> Description of the attachment + * 'type' -> Message type ("link", "video", "photo") + * 'text' -> Text before the shared message + * 'after' -> Text after the shared message + * 'image' -> Preview image of the message + * 'url' -> Url to the attached message + * 'title' -> Title of the attachment + * 'description' -> Description of the attachment + * @throws \Friendica\Network\HTTPException\InternalServerErrorException */ private static function getOldAttachmentData($body) { @@ -104,13 +109,14 @@ class BBCode extends BaseObject * * @param string $body Message body * @return array - * 'type' -> Message type ("link", "video", "photo") - * 'text' -> Text before the shared message - * 'after' -> Text after the shared message - * 'image' -> Preview image of the message - * 'url' -> Url to the attached message - * 'title' -> Title of the attachment - * 'description' -> Description of the attachment + * 'type' -> Message type ("link", "video", "photo") + * 'text' -> Text before the shared message + * 'after' -> Text after the shared message + * 'image' -> Preview image of the message + * 'url' -> Url to the attached message + * 'title' -> Title of the attachment + * 'description' -> Description of the attachment + * @throws \Friendica\Network\HTTPException\InternalServerErrorException */ public static function getAttachmentData($body) { @@ -126,12 +132,12 @@ class BBCode extends BaseObject $type = ""; preg_match("/type='(.*?)'/ism", $attributes, $matches); - if (x($matches, 1)) { + if (!empty($matches[1])) { $type = strtolower($matches[1]); } preg_match('/type="(.*?)"/ism', $attributes, $matches); - if (x($matches, 1)) { + if (!empty($matches[1])) { $type = strtolower($matches[1]); } @@ -149,12 +155,12 @@ class BBCode extends BaseObject $url = ""; preg_match("/url='(.*?)'/ism", $attributes, $matches); - if (x($matches, 1)) { + if (!empty($matches[1])) { $url = $matches[1]; } preg_match('/url="(.*?)"/ism', $attributes, $matches); - if (x($matches, 1)) { + if (!empty($matches[1])) { $url = $matches[1]; } @@ -164,12 +170,12 @@ class BBCode extends BaseObject $title = ""; preg_match("/title='(.*?)'/ism", $attributes, $matches); - if (x($matches, 1)) { + if (!empty($matches[1])) { $title = $matches[1]; } preg_match('/title="(.*?)"/ism', $attributes, $matches); - if (x($matches, 1)) { + if (!empty($matches[1])) { $title = $matches[1]; } @@ -182,12 +188,12 @@ class BBCode extends BaseObject $image = ""; preg_match("/image='(.*?)'/ism", $attributes, $matches); - if (x($matches, 1)) { + if (!empty($matches[1])) { $image = $matches[1]; } preg_match('/image="(.*?)"/ism', $attributes, $matches); - if (x($matches, 1)) { + if (!empty($matches[1])) { $image = $matches[1]; } @@ -197,12 +203,12 @@ class BBCode extends BaseObject $preview = ""; preg_match("/preview='(.*?)'/ism", $attributes, $matches); - if (x($matches, 1)) { + if (!empty($matches[1])) { $preview = $matches[1]; } preg_match('/preview="(.*?)"/ism', $attributes, $matches); - if (x($matches, 1)) { + if (!empty($matches[1])) { $preview = $matches[1]; } @@ -230,7 +236,7 @@ class BBCode extends BaseObject */ $has_title = !empty($item['title']); - $plink = (!empty($item['plink']) ? $item['plink'] : ''); + $plink = defaults($item, 'plink', ''); $post = self::getAttachmentData($body); // if nothing is found, it maybe having an image. @@ -341,6 +347,7 @@ class BBCode extends BaseObject /** * @brief Converts a BBCode text into plaintext * + * @param $text * @param bool $keep_urls Whether to keep URLs in the resulting plaintext * * @return string @@ -379,7 +386,7 @@ class BBCode extends BaseObject $c = preg_match_all('/\[img.*?\](.*?)\[\/img\]/ism', $s, $matches, PREG_SET_ORDER); if ($c) { foreach ($matches as $mtch) { - logger('scale_external_image: ' . $mtch[1]); + Logger::log('scale_external_image: ' . $mtch[1]); $hostname = str_replace('www.', '', substr(System::baseUrl(), strpos(System::baseUrl(), '://') + 3)); if (stristr($mtch[1], $hostname)) { @@ -414,7 +421,7 @@ class BBCode extends BaseObject $Image->scaleDown(640); $new_width = $Image->getWidth(); $new_height = $Image->getHeight(); - logger('scale_external_images: ' . $orig_width . '->' . $new_width . 'w ' . $orig_height . '->' . $new_height . 'h' . ' match: ' . $mtch[0], LOGGER_DEBUG); + Logger::log('scale_external_images: ' . $orig_width . '->' . $new_width . 'w ' . $orig_height . '->' . $new_height . 'h' . ' match: ' . $mtch[0], Logger::DEBUG); $s = str_replace( $mtch[0], '[img=' . $new_width . 'x' . $new_height. ']' . $scaled . '[/img]' @@ -423,7 +430,7 @@ class BBCode extends BaseObject : ''), $s ); - logger('scale_external_images: new string: ' . $s, LOGGER_DEBUG); + Logger::log('scale_external_images: new string: ' . $s, Logger::DEBUG); } } } @@ -442,6 +449,7 @@ class BBCode extends BaseObject * @brief Truncates imported message body string length to max_import_size * @param string $body * @return string + * @throws \Friendica\Network\HTTPException\InternalServerErrorException */ public static function limitBodySize($body) { @@ -451,7 +459,7 @@ class BBCode extends BaseObject // than the maximum, then don't waste time looking for the images if ($maxlen && (strlen($body) > $maxlen)) { - logger('the total body length exceeds the limit', LOGGER_DEBUG); + Logger::log('the total body length exceeds the limit', Logger::DEBUG); $orig_body = $body; $new_body = ''; @@ -471,7 +479,7 @@ class BBCode extends BaseObject if (($textlen + $img_start) > $maxlen) { if ($textlen < $maxlen) { - logger('the limit happens before an embedded image', LOGGER_DEBUG); + Logger::log('the limit happens before an embedded image', Logger::DEBUG); $new_body = $new_body . substr($orig_body, 0, $maxlen - $textlen); $textlen = $maxlen; } @@ -485,7 +493,7 @@ class BBCode extends BaseObject if (($textlen + $img_end) > $maxlen) { if ($textlen < $maxlen) { - logger('the limit happens before the end of a non-embedded image', LOGGER_DEBUG); + Logger::log('the limit happens before the end of a non-embedded image', Logger::DEBUG); $new_body = $new_body . substr($orig_body, 0, $maxlen - $textlen); $textlen = $maxlen; } @@ -508,11 +516,11 @@ class BBCode extends BaseObject if (($textlen + strlen($orig_body)) > $maxlen) { if ($textlen < $maxlen) { - logger('the limit happens after the end of the last image', LOGGER_DEBUG); + Logger::log('the limit happens after the end of the last image', Logger::DEBUG); $new_body = $new_body . substr($orig_body, 0, $maxlen - $textlen); } } else { - logger('the text size with embedded images extracted did not violate the limit', LOGGER_DEBUG); + Logger::log('the text size with embedded images extracted did not violate the limit', Logger::DEBUG); $new_body = $new_body . $orig_body; } @@ -528,10 +536,11 @@ class BBCode extends BaseObject * Note: Can produce a [bookmark] tag in the returned string * * @brief Processes [attachment] tags - * @param string $return + * @param string $return * @param bool|int $simplehtml - * @param bool $tryoembed + * @param bool $tryoembed * @return string + * @throws \Friendica\Network\HTTPException\InternalServerErrorException */ private static function convertAttachment($return, $simplehtml = false, $tryoembed = true) { @@ -622,7 +631,7 @@ class BBCode extends BaseObject $data["title"] = $data["url"]; } - if (($data["text"] == "") && ($data["title"] != "") && ($data["url"] == "")) { + if (empty($data["text"]) && !empty($data["title"]) && empty($data["url"])) { return $data["title"] . $data["after"]; } @@ -773,10 +782,10 @@ class BBCode extends BaseObject /** * Performs a preg_replace within the boundaries of all named BBCode tags in a text * - * @param type $pattern Preg pattern string - * @param type $replace Preg replace string - * @param type $name BBCode tag name - * @param type $text Text to search + * @param string $pattern Preg pattern string + * @param string $replace Preg replace string + * @param string $name BBCode tag name + * @param string $text Text to search * @return string */ public static function pregReplaceInTag($pattern, $replace, $name, $text) @@ -859,187 +868,141 @@ class BBCode extends BaseObject } /** - * Processes [share] tags + * This function converts a [share] block to text according to a provided callback function whose signature is: * - * Note: Can produce a [bookmark] tag in the output + * function(array $attributes, array $author_contact, string $content, boolean $is_quote_share): string * - * @brief Processes [share] tags - * @param array $share preg_match_callback result array - * @param bool|int $simplehtml - * @return string + * Where: + * - $attributes is an array of attributes of the [share] block itself. Missing keys will be completed by the contact + * data lookup + * - $author_contact is a contact record array + * - $content is the inner content of the [share] block + * - $is_quote_share indicates whether there's any content before the [share] block + * - Return value is the string that should replace the [share] block in the provided text + * + * This function is intended to be used by addon connector to format a share block like the target network is expecting it. + * + * @param string $text A BBCode string + * @param callable $callback + * @return string The BBCode string with all [share] blocks replaced */ - private static function convertShare($share, $simplehtml) + public static function convertShare($text, callable $callback) { - $attributes = $share[2]; - - $author = ""; - preg_match("/author='(.*?)'/ism", $attributes, $matches); - if (x($matches, 1)) { - $author = html_entity_decode($matches[1], ENT_QUOTES, 'UTF-8'); - } - - preg_match('/author="(.*?)"/ism', $attributes, $matches); - if (x($matches, 1)) { - $author = $matches[1]; - } - - $profile = ""; - preg_match("/profile='(.*?)'/ism", $attributes, $matches); - if (x($matches, 1)) { - $profile = $matches[1]; - } - - preg_match('/profile="(.*?)"/ism', $attributes, $matches); - if (x($matches, 1)) { - $profile = $matches[1]; - } - - $avatar = ""; - preg_match("/avatar='(.*?)'/ism", $attributes, $matches); - if (x($matches, 1)) { - $avatar = $matches[1]; - } - - preg_match('/avatar="(.*?)"/ism', $attributes, $matches); - if (x($matches, 1)) { - $avatar = $matches[1]; - } - - $link = ""; - preg_match("/link='(.*?)'/ism", $attributes, $matches); - if (x($matches, 1)) { - $link = $matches[1]; - } - - preg_match('/link="(.*?)"/ism', $attributes, $matches); - if (x($matches, 1)) { - $link = $matches[1]; - } - - $posted = ""; - - preg_match("/posted='(.*?)'/ism", $attributes, $matches); - if (x($matches, 1)) { - $posted = $matches[1]; - } + $return = preg_replace_callback( + "/(.*?)\[share(.*?)\](.*?)\[\/share\]/ism", + function ($match) use ($callback) { + $attribute_string = $match[2]; + + $attributes = []; + foreach(['author', 'profile', 'avatar', 'link', 'posted'] as $field) { + preg_match("/$field=(['\"])(.+?)\\1/ism", $attribute_string, $matches); + $attributes[$field] = html_entity_decode(defaults($matches, 2, ''), ENT_QUOTES, 'UTF-8'); + } - preg_match('/posted="(.*?)"/ism', $attributes, $matches); - if (x($matches, 1)) { - $posted = $matches[1]; - } + // We only call this so that a previously unknown contact can be added. + // This is important for the function "Model\Contact::getDetailsByURL()". + // This function then can fetch an entry from the contact table. + Contact::getIdForURL($attributes['profile'], 0, true); - // We only call this so that a previously unknown contact can be added. - // This is important for the function "Model\Contact::getDetailsByURL()". - // This function then can fetch an entry from the contact table. - Contact::getIdForURL($profile, 0, true); + $author_contact = Contact::getDetailsByURL($attributes['profile']); + $author_contact['addr'] = defaults($author_contact, 'addr' , Protocol::getAddrFromProfileUrl($attributes['profile'])); - $data = Contact::getDetailsByURL($profile); + $attributes['author'] = defaults($author_contact, 'name' , $attributes['author']); + $attributes['avatar'] = defaults($author_contact, 'micro', $attributes['avatar']); + $attributes['profile'] = defaults($author_contact, 'url' , $attributes['profile']); - if (x($data, "name") && x($data, "addr")) { - $userid_compact = $data["name"] . " (" . $data["addr"] . ")"; - } else { - $userid_compact = Protocol::getAddrFromProfileUrl($profile, $author); - } - - if (x($data, "addr")) { - $userid = $data["addr"]; - } else { - $userid = Protocol::formatMention($profile, $author); - } + if ($attributes['avatar']) { + $attributes['avatar'] = ProxyUtils::proxifyUrl($attributes['avatar'], false, ProxyUtils::SIZE_THUMB); + } - if (x($data, "name")) { - $author = $data["name"]; - } + return $match[1] . $callback($attributes, $author_contact, $match[3], trim($match[1]) != ''); + }, + $text + ); - if (x($data, "micro")) { - $avatar = $data["micro"]; - } + return $return; + } - $preshare = trim($share[1]); - if ($preshare != "") { - $preshare .= "
"; - } + /** + * Default [share] tag conversion callback + * + * Note: Can produce a [bookmark] tag in the output + * + * @see BBCode::convertShare() + * @param array $attributes [share] block attribute values + * @param array $author_contact Contact row of the shared author + * @param string $content Inner content of the [share] block + * @param boolean $is_quote_share Whether there is content before the [share] block + * @param integer $simplehtml Mysterious integer value depending on the target network/formatting style + * @return string + * @throws \Friendica\Network\HTTPException\InternalServerErrorException + */ + private static function convertShareCallback(array $attributes, array $author_contact, $content, $is_quote_share, $simplehtml) + { + $mention = Protocol::formatMention($attributes['profile'], $attributes['author']); switch ($simplehtml) { case 1: - $text = $preshare . html_entity_decode("♲ ", ENT_QUOTES, 'UTF-8') . ' ' . $userid . ":
»" . $share[3] . "«"; + $text = ($is_quote_share? '
' : '') . '

' . html_entity_decode('♲ ', ENT_QUOTES, 'UTF-8') . ' ' . $mention . ':

' . "\n" . '«' . $content . '»'; break; case 2: - $text = $preshare . html_entity_decode("♲ ", ENT_QUOTES, 'UTF-8') . ' ' . $userid_compact . ":
" . $share[3]; + $text = ($is_quote_share? '
' : '') . '

' . html_entity_decode('♲ ', ENT_QUOTES, 'UTF-8') . ' ' . $author_contact['addr'] . ':

' . "\n" . $content; break; case 3: // Diaspora - $headline = '' . html_entity_decode("♲ ", ENT_QUOTES, 'UTF-8') . $userid . ':
'; - - $text = trim($share[1]); - - if ($text != "") { - $text .= "
"; - } + $headline = '

' . html_entity_decode('♲ ', ENT_QUOTES, 'UTF-8') . $mention . ':

' . "\n"; - if (stripos(normalise_link($link), 'http://twitter.com/') === 0) { - $text .= '
' . $link . ''; + if (stripos(Strings::normaliseLink($attributes['link']), 'http://twitter.com/') === 0) { + $text = ($is_quote_share? '
' : '') . '

' . $attributes['link'] . '

' . "\n"; } else { - $text .= $headline . '
' . trim($share[3]) . "

"; + $text = ($is_quote_share? '
' : '') . $headline . '
' . trim($content) . '
' . "\n"; - if ($link != "") { - $text .= '
[l]'; + if ($attributes['link'] != '') { + $text .= '

[l]

' . "\n"; } } break; case 4: - $headline = '
' . html_entity_decode("♲ ", ENT_QUOTES, 'UTF-8'); - $headline .= L10n::t('%2$s %3$s', $link, $userid, $posted); - $headline .= ":
"; + $headline = '

' . html_entity_decode('♲ ', ENT_QUOTES, 'UTF-8'); + $headline .= L10n::t('%2$s %3$s', $attributes['link'], $mention, $attributes['posted']); + $headline .= ':

' . "\n"; - $text = trim($share[1]); - - if ($text != "") { - $text .= "
"; - } - - $text .= $headline . '
' . trim($share[3]) . "

"; + $text = ($is_quote_share? '
' : '') . $headline . '
' . trim($content) . '
' . "\n"; break; case 5: - $text = $preshare . html_entity_decode("♲ ", ENT_QUOTES, 'UTF-8') . ' ' . $userid_compact . ":
" . $share[3]; + $text = ($is_quote_share? '
' : '') . '

' . html_entity_decode('♲ ', ENT_QUOTES, 'UTF-8') . ' ' . $author_contact['addr'] . ':

' . "\n" . $content; break; case 7: // statusnet/GNU Social - $text = $preshare . html_entity_decode("♲ ", ENT_QUOTES, 'UTF-8') . " @" . $userid_compact . ": " . $share[3]; - break; - case 8: // twitter - $text = $preshare . "RT @" . $userid_compact . ": " . $share[3]; + $text = ($is_quote_share? '
' : '') . '

' . html_entity_decode('♲ ', ENT_QUOTES, 'UTF-8') . ' @' . $author_contact['addr'] . ': ' . $content . '

' . "\n"; break; case 9: // Google+ - $text = $preshare . html_entity_decode("♲ ", ENT_QUOTES, 'UTF-8') . ' ' . $userid_compact . ":
" . $share[3]; + $text = ($is_quote_share? '
' : '') . '

' . html_entity_decode('♲ ', ENT_QUOTES, 'UTF-8') . ' ' . $author_contact['addr'] . ':

' . "\n"; + $text .= '

' . $content . '

' . "\n"; - if ($link != "") { - $text .= "

" . $link; + if ($attributes['link'] != '') { + $text .= '

' . $attributes['link'] . '

'; } break; default: // Transforms quoted tweets in rich attachments to avoid nested tweets - if (stripos(normalise_link($link), 'http://twitter.com/') === 0 && OEmbed::isAllowedURL($link)) { + if (stripos(Strings::normaliseLink($attributes['link']), 'http://twitter.com/') === 0 && OEmbed::isAllowedURL($attributes['link'])) { try { - $oembed = OEmbed::getHTML($link, $preshare); + $text = ($is_quote_share? '
' : '') . OEmbed::getHTML($attributes['link']); } catch (Exception $e) { - $oembed = sprintf('[bookmark=%s]%s[/bookmark]', $link, $preshare); + $text = ($is_quote_share? '
' : '') . sprintf('[bookmark=%s]%s[/bookmark]', $attributes['link'], $content); } - - $text = $preshare . $oembed; } else { - $text = trim($share[1]) . "\n"; - - $avatar = ProxyUtils::proxifyUrl($avatar, false, ProxyUtils::SIZE_THUMB); - - $tpl = get_markup_template('shared_content.tpl'); - $text .= replace_macros($tpl, [ - '$profile' => $profile, - '$avatar' => $avatar, - '$author' => $author, - '$link' => $link, - '$posted' => $posted, - '$content' => trim($share[3]) + $text = ($is_quote_share? "\n" : ''); + + $tpl = Renderer::getMarkupTemplate('shared_content.tpl'); + $text .= Renderer::replaceMacros($tpl, [ + '$profile' => $attributes['profile'], + '$avatar' => $attributes['avatar'], + '$author' => $attributes['author'], + '$link' => $attributes['link'], + '$posted' => $attributes['posted'], + '$content' => trim($content) ]); } break; @@ -1185,8 +1148,9 @@ class BBCode extends BaseObject * @param int $simple_html * @param bool $for_plaintext * @return string + * @throws \Friendica\Network\HTTPException\InternalServerErrorException */ - public static function convert($text, $try_oembed = true, $simple_html = false, $for_plaintext = false) + public static function convert($text, $try_oembed = true, $simple_html = 0, $for_plaintext = false) { $a = self::getApp(); @@ -1214,7 +1178,7 @@ class BBCode extends BaseObject // Extracting multi-line code blocks before the whitespace processing $codeblocks = []; - $text = preg_replace_callback("#\[code(?:=([^\]]*))?\](.*?)\[\/code\]#is", + $text = preg_replace_callback("#\[code(?:=([^\]]*))?\](.*?)\[\/code\]#ism", function ($matches) use (&$codeblocks) { $return = $matches[0]; if (strpos($matches[2], "\n") !== false) { @@ -1329,7 +1293,7 @@ class BBCode extends BaseObject $text); } elseif ($simple_html == 7) { $text = preg_replace("/([@!])\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism", - '$1$3', + '$1$3', $text); } elseif (!$simple_html) { $text = preg_replace("/([@!])\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism", @@ -1366,7 +1330,7 @@ class BBCode extends BaseObject // Handle Diaspora posts $text = preg_replace_callback( - "&\[url=/posts/([^\[\]]*)\](.*)\[\/url\]&Usi", + "&\[url=/?posts/([^\[\]]*)\](.*)\[\/url\]&Usi", function ($match) { return "[url=" . System::baseUrl() . "/display/" . $match[1] . "]" . $match[2] . "[/url]"; }, $text @@ -1384,15 +1348,27 @@ class BBCode extends BaseObject $expression = "=diaspora://.*?/post/([0-9A-Za-z\-_@.:]{15,254}[0-9A-Za-z])=ism"; $text = preg_replace($expression, System::baseUrl()."/display/$1", $text); - $text = preg_replace("/([#])\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism", - '$1$3', $text); - - $text = preg_replace("/\[url\=([$URLSearchString]*)\]#(.*?)\[\/url\]/ism", - '#$2', $text); + /* Tag conversion + * Supports: + * - #[url=][/url] + * - [url=]#[/url] + */ + $text = preg_replace_callback("/(?:#\[url\=[$URLSearchString]*\]|\[url\=[$URLSearchString]*\]#)(.*?)\[\/url\]/ism", function($matches) { + return '#' + . XML::escape($matches[1]) + . ''; + }, $text); + + // We need no target="_blank" for local links + // convert links start with System::baseUrl() as local link without the target="_blank" attribute + $escapedBaseUrl = preg_quote(System::baseUrl(), '/'); + $text = preg_replace("/\[url\](".$escapedBaseUrl."[$URLSearchString]*)\[\/url\]/ism", '$1', $text); + $text = preg_replace("/\[url\=(".$escapedBaseUrl."[$URLSearchString]*)\](.*?)\[\/url\]/ism", '$2', $text); $text = preg_replace("/\[url\]([$URLSearchString]*)\[\/url\]/ism", '$1', $text); $text = preg_replace("/\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism", '$2', $text); - //$Text = preg_replace("/\[url\=([$URLSearchString]*)\]([$URLSearchString]*)\[\/url\]/ism", '$2', $Text); // Red compatibility, though the link can't be authenticated on Friendica $text = preg_replace("/\[zrl\=([$URLSearchString]*)\](.*?)\[\/zrl\]/ism", '$2', $text); @@ -1408,7 +1384,7 @@ class BBCode extends BaseObject $text = preg_replace("/\[mail\=([$MAILSearchString]*)\](.*?)\[\/mail\]/", '$2', $text); // leave open the posibility of [map=something] - // this is replaced in prepare_body() which has knowledge of the item location + // this is replaced in Item::prepareBody() which has knowledge of the item location if (strpos($text, '[/map]') !== false) { $text = preg_replace_callback( @@ -1519,7 +1495,7 @@ class BBCode extends BaseObject $text = str_replace('[hr]', '
', $text); - // This is actually executed in prepare_body() + // This is actually executed in Item::prepareBody() $text = str_replace('[nosmile]', '', $text); @@ -1621,10 +1597,12 @@ class BBCode extends BaseObject $text = preg_replace("/\[zmg\](.*?)\[\/zmg\]/ism", '' . L10n::t('Image/photo') . '', $text); // Shared content - $text = preg_replace_callback("/(.*?)\[share(.*?)\](.*?)\[\/share\]/ism", - function ($match) use ($simple_html) { - return self::convertShare($match, $simple_html); - }, $text); + $text = self::convertShare( + $text, + function (array $attributes, array $author_contact, $content, $is_quote_share) use ($simple_html) { + return self::convertShareCallback($attributes, $author_contact, $content, $is_quote_share, $simple_html); + } + ); $text = preg_replace("/\[crypt\](.*?)\[\/crypt\]/ism", '
' . L10n::t('Encrypted content') . '
', $text); $text = preg_replace("/\[crypt(.*?)\](.*?)\[\/crypt\]/ism", '
' . L10n::t('Encrypted content') . '
', $text); @@ -1697,7 +1675,7 @@ class BBCode extends BaseObject // Summary (e.g. title) is required, earlier revisions only required description (in addition to // start which is always required). Allow desc with a missing summary for compatibility. - if ((x($ev, 'desc') || x($ev, 'summary')) && x($ev, 'start')) { + if ((!empty($ev['desc']) || !empty($ev['summary'])) && !empty($ev['start'])) { $sub = Event::getHTML($ev, $simple_html); $text = preg_replace("/\[event\-summary\](.*?)\[\/event\-summary\]/ism", '', $text); @@ -1711,7 +1689,7 @@ class BBCode extends BaseObject // Replace non graphical smilies for external posts if ($simple_html) { - $text = Smilies::replace($text, false, true); + $text = Smilies::replace($text); } // Unhide all [noparse] contained bbtags unspacefying them @@ -1765,7 +1743,7 @@ class BBCode extends BaseObject // Clean up the HTML by loading and saving the HTML with the DOM. // Bad structured html can break a whole page. - // For performance reasons do it only with ativated item cache or at export. + // For performance reasons do it only with activated item cache or at export. if (!$try_oembed || (get_itemcachepath() != "")) { $doc = new DOMDocument(); $doc->preserveWhiteSpace = false; @@ -1791,7 +1769,7 @@ class BBCode extends BaseObject //$Text = str_replace('
  • ', '
  • ', $Text); //$Text = str_replace('