X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=include%2Fbbcode.php;h=20631818a2503fbe8167130edd644e1cccd6a41b;hb=28d79281a9d521591d197215aaf9a7c92ed265e1;hp=08bfab3ed72b60c0225f324e5e3bd2c960e1d231;hpb=465e1d6a5ca86794d3359536fcf2735889fbbc03;p=friendica.git diff --git a/include/bbcode.php b/include/bbcode.php index 08bfab3ed7..20631818a2 100644 --- a/include/bbcode.php +++ b/include/bbcode.php @@ -1,17 +1,22 @@ %s
', $data["url"], $data["title"]); } else { try { - if ($tryoembed) { + if ($tryoembed && OEmbed::isAllowedURL($data['url'])) { $return = OEmbed::getHTML($data['url'], $data['title']); } else { throw new Exception('OEmbed is disabled for this attachment.'); } } catch (Exception $e) { if ($simplehtml != 4) { - $return = sprintf('', $data["type"]); + $return = sprintf('
', $data["type"]); } if ($data["image"] != "") { @@ -94,15 +99,19 @@ function bb_attachment($return, $simplehtml = false, $tryoembed = true) if (($data["type"] == "photo") && ($data["url"] != "") && ($data["image"] != "")) { $return .= sprintf('', $data["url"], proxy_url($data["image"]), $data["title"]); } else { - $return .= sprintf('[bookmark=%s]%s[/bookmark]', $data['url'], $data['title']); + $return .= sprintf('

%s

', $data['url'], $data['title']); } - if (trim($data["description"]) != "") { + if ($data["description"] != "" && $data["description"] != $data["title"]) { $return .= sprintf('
%s
', trim(bbcode($data["description"]))); } + if ($data["type"] == "link") { + $return .= sprintf('%s', $data['url'], parse_url($data['url'], PHP_URL_HOST)); + } + if ($simplehtml != 4) { - $return .= ''; + $return .= '
'; } } } @@ -112,7 +121,7 @@ function bb_attachment($return, $simplehtml = false, $tryoembed = true) function bb_remove_share_information($Text, $plaintext = false, $nolink = false) { - $data = get_attachment_data($Text); + $data = BBCode::getAttachmentData($Text); if (!$data) { return $Text; @@ -276,7 +285,7 @@ function bb_find_open_close($s, $open, $close, $occurence = 1) { return false; } - $res = array( 'start' => $start_pos, 'end' => $end_pos ); + $res = [ 'start' => $start_pos, 'end' => $end_pos ]; return $res; } @@ -312,16 +321,16 @@ function get_bb_tag_pos($s, $name, $occurence = 1) { return false; } - $res = array( - 'start' => array( + $res = [ + 'start' => [ 'open' => $start_open, 'close' => $start_close - ), - 'end' => array( + ], + 'end' => [ 'open' => $end_open, 'close' => $end_open + strlen('[/' . $name . ']') - ), - ); + ], + ]; if ($start_equal !== false) { $res['start']['equal'] = $start_equal + 1; @@ -356,7 +365,7 @@ function bb_tag_preg_replace($pattern, $replace, $name, $s) { function bb_extract_images($body) { - $saved_image = array(); + $saved_image = []; $orig_body = $body; $new_body = ''; @@ -394,7 +403,7 @@ function bb_extract_images($body) { $new_body = $new_body . $orig_body; - return array('body' => $new_body, 'images' => $saved_image); + return ['body' => $new_body, 'images' => $saved_image]; } function bb_replace_images($body, $images) { @@ -406,7 +415,7 @@ function bb_replace_images($body, $images) { // We're depending on the property of 'foreach' (specified on the PHP website) that // it loops over the array starting from the first element and going sequentially // to the last element - $newbody = str_replace('[$#saved_image' . $cnt . '#$]', '' . t('Image/photo') . '', $newbody); + $newbody = str_replace('[$#saved_image' . $cnt . '#$]', '' . L10n::t('Image/photo') . '', $newbody); $cnt++; } @@ -544,7 +553,7 @@ function bb_ShareAttributes($share, $simplehtml) break; case 4: $headline .= '
' . html_entity_decode("♲ ", ENT_QUOTES, 'UTF-8'); - $headline .= t('%2$s %3$s', $link, $userid, $posted); + $headline .= L10n::t('%2$s %3$s', $link, $userid, $posted); $headline .= ":
"; $text = trim($share[1]); @@ -591,14 +600,14 @@ function bb_ShareAttributes($share, $simplehtml) $avatar = proxy_url($avatar, false, PROXY_SIZE_THUMB); $tpl = get_markup_template('shared_content.tpl'); - $text .= replace_macros($tpl, array( + $text .= replace_macros($tpl, [ '$profile' => $profile, '$avatar' => $avatar, '$author' => $author, '$link' => $link, '$posted' => $posted, '$content' => trim($share[3]) - )); + ]); } break; } @@ -680,7 +689,7 @@ function GetProfileUsername($profile, $username, $compact = false, $getnetwork = $StatusnetUser = preg_replace("=https?://(.*)/user/(.*)=ism", "$2", $profile); if ($StatusnetUser != $profile) { /// @TODO Some hosts run on https, not just http and sometimes http is disabled, let's support both here - $UserData = fetch_url("http://".$StatusnetHost."/api/users/show.json?user_id=".$StatusnetUser); + $UserData = Network::fetchUrl("http://".$StatusnetHost."/api/users/show.json?user_id=".$StatusnetUser); $user = json_decode($UserData); if ($user) { if ($getnetwork) { @@ -739,16 +748,14 @@ function bb_RemovePictureLinks($match) { $text = "[url=".$match[2]."]".$match[2]."[/url]"; // if its not a picture then look if its a page that contains a picture link - require_once("include/network.php"); - - $body = fetch_url($match[1]); + $body = Network::fetchUrl($match[1]); $doc = new DOMDocument(); @$doc->loadHTML($body); $xpath = new DomXPath($doc); $list = $xpath->query("//meta[@name]"); foreach ($list as $node) { - $attr = array(); + $attr = []; if ($node->attributes->length) foreach ($node->attributes as $attribute) @@ -796,16 +803,14 @@ function bb_CleanPictureLinksSub($match) { $text = "[img]".$match[2]."[/img]"; // if its not a picture then look if its a page that contains a picture link - require_once("include/network.php"); - - $body = fetch_url($match[1]); + $body = Network::fetchUrl($match[1]); $doc = new DOMDocument(); @$doc->loadHTML($body); $xpath = new DomXPath($doc); $list = $xpath->query("//meta[@name]"); foreach ($list as $node) { - $attr = array(); + $attr = []; if ($node->attributes->length) foreach ($node->attributes as $attribute) @@ -947,36 +952,54 @@ function bbcode($Text, $preserve_nl = false, $tryoembed = true, $simplehtml = fa // removing multiplicated newlines if (Config::get("system", "remove_multiplicated_lines")) { - $search = array("\n\n\n", "\n ", " \n", "[/quote]\n\n", "\n[/quote]", "[/li]\n", "\n[li]", "\n[ul]", "[/ul]\n", "\n\n[share ", "[/attachment]\n", - "\n[h1]", "[/h1]\n", "\n[h2]", "[/h2]\n", "\n[h3]", "[/h3]\n", "\n[h4]", "[/h4]\n", "\n[h5]", "[/h5]\n", "\n[h6]", "[/h6]\n"); - $replace = array("\n\n", "\n", "\n", "[/quote]\n", "[/quote]", "[/li]", "[li]", "[ul]", "[/ul]", "\n[share ", "[/attachment]", - "[h1]", "[/h1]", "[h2]", "[/h2]", "[h3]", "[/h3]", "[h4]", "[/h4]", "[h5]", "[/h5]", "[h6]", "[/h6]"); + $search = ["\n\n\n", "\n ", " \n", "[/quote]\n\n", "\n[/quote]", "[/li]\n", "\n[li]", "\n[ul]", "[/ul]\n", "\n\n[share ", "[/attachment]\n", + "\n[h1]", "[/h1]\n", "\n[h2]", "[/h2]\n", "\n[h3]", "[/h3]\n", "\n[h4]", "[/h4]\n", "\n[h5]", "[/h5]\n", "\n[h6]", "[/h6]\n"]; + $replace = ["\n\n", "\n", "\n", "[/quote]\n", "[/quote]", "[/li]", "[li]", "[ul]", "[/ul]", "\n[share ", "[/attachment]", + "[h1]", "[/h1]", "[h2]", "[/h2]", "[h3]", "[/h3]", "[h4]", "[/h4]", "[h5]", "[/h5]", "[h6]", "[/h6]"]; do { $oldtext = $Text; $Text = str_replace($search, $replace, $Text); } while ($oldtext != $Text); } + // Set up the parameters for a URL search string + $URLSearchString = "^\[\]"; + // Set up the parameters for a MAIL search string + $MAILSearchString = $URLSearchString; + + // if the HTML is used to generate plain text, then don't do this search, but replace all URL of that kind to text + if (!$forplaintext) { + // Autolink feature (thanks to http://code.seebz.net/p/autolink-php/) + // Currently disabled, since the function is too greedy + // $autolink_regex = "`([^\]\=\"']|^)(https?\://[^\s<]+[^\s<\.\)])`ism"; + $autolink_regex = "/([^\]\='".'"'."]|^)(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)/ism"; + $Text = preg_replace($autolink_regex, '$1[url]$2[/url]', $Text); + if ($simplehtml == 7) { + $Text = preg_replace_callback("/\[url\]([$URLSearchString]*)\[\/url\]/ism", 'bb_style_url', $Text); + $Text = preg_replace_callback("/\[url\=([$URLSearchString]*)\]([$URLSearchString]*)\[\/url\]/ism", 'bb_style_url', $Text); + } + } else { + $Text = preg_replace("(\[url\]([$URLSearchString]*)\[\/url\])ism", " $1 ", $Text); + $Text = preg_replace_callback("&\[url=([^\[\]]*)\]\[img\](.*)\[\/img\]\[\/url\]&Usi", 'bb_RemovePictureLinks', $Text); + } + + // Handle attached links or videos $Text = bb_attachment($Text, $simplehtml, $tryoembed); - $Text = str_replace(array("\r","\n"), array('
', '
'), $Text); + $Text = str_replace(["\r","\n"], ['
', '
'], $Text); if ($preserve_nl) { - $Text = str_replace(array("\n", "\r"), array('', ''), $Text); + $Text = str_replace(["\n", "\r"], ['', ''], $Text); } - // Set up the parameters for a URL search string - $URLSearchString = "^\[\]"; - // Set up the parameters for a MAIL search string - $MAILSearchString = $URLSearchString; - // Remove all hashtag addresses - if ((!$tryoembed || $simplehtml) && !in_array($simplehtml, array(3, 7))) { + if ((!$tryoembed || $simplehtml) && !in_array($simplehtml, [3, 7])) { $Text = preg_replace("/([#@!])\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism", '$1$3', $Text); } elseif ($simplehtml == 3) { + // The ! is converted to @ since Diaspora only understands the @ $Text = preg_replace("/([@!])\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism", - '$1$3', + '@$3', $Text); } elseif ($simplehtml == 7) { $Text = preg_replace("/([@!])\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism", @@ -994,7 +1017,7 @@ function bbcode($Text, $preserve_nl = false, $tryoembed = true, $simplehtml = fa $Text = preg_replace("/#\[url\=[$URLSearchString]*\]\^\[\/url\]\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/i", "[bookmark=$1]$2[/bookmark]", $Text); - if (in_array($simplehtml, array(2, 6, 7, 8, 9))) { + if (in_array($simplehtml, [2, 6, 7, 8, 9])) { $Text = preg_replace_callback("/([^#@!])\[url\=([^\]]*)\](.*?)\[\/url\]/ism", "bb_expand_links", $Text); //$Text = preg_replace("/[^#@!]\[url\=([^\]]*)\](.*?)\[\/url\]/ism", ' $2 [url]$1[/url]', $Text); $Text = preg_replace("/\[bookmark\=([^\]]*)\](.*?)\[\/bookmark\]/ism", ' $2 [url]$1[/url]',$Text); @@ -1023,29 +1046,11 @@ function bbcode($Text, $preserve_nl = false, $tryoembed = true, $simplehtml = fa $expression = "=diaspora://.*?/post/([0-9A-Za-z\-_@.:]{15,254}[0-9A-Za-z])=ism"; $Text = preg_replace($expression, System::baseUrl()."/display/$1", $Text); - // if the HTML is used to generate plain text, then don't do this search, but replace all URL of that kind to text -// if ($simplehtml != 7) { - if (!$forplaintext) { - if ($simplehtml != 7) { - $Text = preg_replace("/([^\]\='".'"'."]|^)(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)/ism", '$1$2', $Text); - } else { - $Text = preg_replace("/([^\]\='".'"'."]|^)(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)/ism", '$1[url]$2[/url]', $Text); - - $Text = preg_replace_callback("/\[url\]([$URLSearchString]*)\[\/url\]/ism", 'bb_style_url', $Text); - $Text = preg_replace_callback("/\[url\=([$URLSearchString]*)\]([$URLSearchString]*)\[\/url\]/ism", 'bb_style_url', $Text); - } - } else { - $Text = preg_replace("(\[url\]([$URLSearchString]*)\[\/url\])ism", " $1 ", $Text); - $Text = preg_replace_callback("&\[url=([^\[\]]*)\]\[img\](.*)\[\/img\]\[\/url\]&Usi", 'bb_RemovePictureLinks', $Text); - } -// } - - if ($tryoembed) { - $Text = preg_replace_callback("/\[url\]([$URLSearchString]*)\[\/url\]/ism", $tryoembed_callback, $Text); - } - $Text = preg_replace("/([#])\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism", - '$1$3', $Text); + '$1$3', $Text); + + $Text = preg_replace("/\[url\=([$URLSearchString]*)\]#(.*?)\[\/url\]/ism", + '#$2', $Text); $Text = preg_replace("/\[url\]([$URLSearchString]*)\[\/url\]/ism", '$1', $Text); $Text = preg_replace("/\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism", '$2', $Text); @@ -1179,7 +1184,7 @@ function bbcode($Text, $preserve_nl = false, $tryoembed = true, $simplehtml = fa // Check for [spoiler=Author] text - $t_wrote = t('$1 wrote:'); + $t_wrote = L10n::t('$1 wrote:'); // handle nested quotes $endlessloop = 0; @@ -1201,7 +1206,7 @@ function bbcode($Text, $preserve_nl = false, $tryoembed = true, $simplehtml = fa // Check for [quote=Author] text - $t_wrote = t('$1 wrote:'); + $t_wrote = L10n::t('$1 wrote:'); // handle nested quotes $endlessloop = 0; @@ -1222,8 +1227,8 @@ function bbcode($Text, $preserve_nl = false, $tryoembed = true, $simplehtml = fa // [img]pathtoimage[/img] $Text = preg_replace_callback("/\[img\](.*?)\[\/img\]/ism", 'bb_PictureCache', $Text); - $Text = preg_replace("/\[img\](.*?)\[\/img\]/ism", '' . t('Image/photo') . '', $Text); - $Text = preg_replace("/\[zmg\](.*?)\[\/zmg\]/ism", '' . t('Image/photo') . '', $Text); + $Text = preg_replace("/\[img\](.*?)\[\/img\]/ism", '' . L10n::t('Image/photo') . '', $Text); + $Text = preg_replace("/\[zmg\](.*?)\[\/zmg\]/ism", '' . L10n::t('Image/photo') . '', $Text); // Shared content $Text = preg_replace_callback("/(.*?)\[share(.*?)\](.*?)\[\/share\]/ism", @@ -1231,13 +1236,13 @@ function bbcode($Text, $preserve_nl = false, $tryoembed = true, $simplehtml = fa return bb_ShareAttributes($match, $simplehtml); }, $Text); - $Text = preg_replace("/\[crypt\](.*?)\[\/crypt\]/ism", '
' . t('Encrypted content') . '
', $Text); - $Text = preg_replace("/\[crypt(.*?)\](.*?)\[\/crypt\]/ism", '
' . t('Encrypted content') . '
', $Text); - //$Text = preg_replace("/\[crypt=(.*?)\](.*?)\[\/crypt\]/ism", '
' . t('Encrypted content') . '
', $Text); + $Text = preg_replace("/\[crypt\](.*?)\[\/crypt\]/ism", '
' . L10n::t('Encrypted content') . '
', $Text); + $Text = preg_replace("/\[crypt(.*?)\](.*?)\[\/crypt\]/ism", '
' . L10n::t('Encrypted content') . '
', $Text); + //$Text = preg_replace("/\[crypt=(.*?)\](.*?)\[\/crypt\]/ism", '
' . L10n::t('Encrypted content') . '
', $Text); // Try to Oembed if ($tryoembed) { - $Text = preg_replace("/\[video\](.*?\.(ogg|ogv|oga|ogm|webm|mp4))\[\/video\]/ism", '', $Text); + $Text = preg_replace("/\[video\](.*?\.(ogg|ogv|oga|ogm|webm|mp4))\[\/video\]/ism", '', $Text); $Text = preg_replace("/\[audio\](.*?\.(ogg|ogv|oga|ogm|webm|mp4|mp3))\[\/audio\]/ism", '', $Text); $Text = preg_replace_callback("/\[video\](.*?)\[\/video\]/ism", $tryoembed_callback, $Text); @@ -1349,20 +1354,20 @@ function bbcode($Text, $preserve_nl = false, $tryoembed = true, $simplehtml = fa $Text = preg_replace('/\<([^>]*?)(src|href)=(.*?)\&\;(.*?)\>/ism', '<$1$2=$3&$4>', $Text); // sanitizes src attributes (http and redir URLs for displaying in a web page, cid used for inline images in emails) - static $allowed_src_protocols = array('http', 'redir', 'cid'); + static $allowed_src_protocols = ['http', 'redir', 'cid']; $Text = preg_replace('#<([^>]*?)(src)="(?!' . implode('|', $allowed_src_protocols) . ')(.*?)"(.*?)>#ism', - '<$1$2=""$4 class="invalid-src" title="' . t('Invalid source protocol') . '">', $Text); + '<$1$2=""$4 data-original-src="$3" class="invalid-src" title="' . L10n::t('Invalid source protocol') . '">', $Text); // sanitize href attributes (only whitelisted protocols URLs) // default value for backward compatibility - $allowed_link_protocols = Config::get('system', 'allowed_link_protocols', array('ftp', 'mailto', 'gopher', 'cid')); + $allowed_link_protocols = Config::get('system', 'allowed_link_protocols', ['ftp', 'mailto', 'gopher', 'cid']); // Always allowed protocol even if config isn't set or not including it $allowed_link_protocols[] = 'http'; $allowed_link_protocols[] = 'redir/'; $regex = '#<([^>]*?)(href)="(?!' . implode('|', $allowed_link_protocols) . ')(.*?)"(.*?)>#ism'; - $Text = preg_replace($regex, '<$1$2="javascript:void(0)"$4 class="invalid-href" title="' . t('Invalid link protocol') . '">', $Text); + $Text = preg_replace($regex, '<$1$2="javascript:void(0)"$4 data-original-href="$3" class="invalid-href" title="' . L10n::t('Invalid link protocol') . '">', $Text); if ($saved_image) { $Text = bb_replace_images($Text, $saved_image); @@ -1382,7 +1387,7 @@ function bbcode($Text, $preserve_nl = false, $tryoembed = true, $simplehtml = fa @$doc->loadHTML($encoding.$doctype."".$Text.""); $doc->encoding = 'UTF-8'; $Text = $doc->saveHTML(); - $Text = str_replace(array("", "", $doctype, $encoding), array("", "", "", ""), $Text); + $Text = str_replace(["", "", $doctype, $encoding], ["", "", "", ""], $Text); $Text = str_replace('
', '', $Text); @@ -1396,7 +1401,7 @@ function bbcode($Text, $preserve_nl = false, $tryoembed = true, $simplehtml = fa //$Text = str_replace('
  • ', '
  • ', $Text); //$Text = str_replace('