]> git.mxchange.org Git - friendica.git/blobdiff - include/bbcode.php
Degrade priority step by step
[friendica.git] / include / bbcode.php
index 2a70f95e59ee4fe159d3119b25558d92c8350507..0c4e12c9ad49e6e9fc44faf7fa68656f25682a67 100644 (file)
@@ -1,5 +1,7 @@
 <?php
-use \Friendica\Core\Config;
+
+use Friendica\App;
+use Friendica\Core\Config;
 
 require_once 'include/oembed.php';
 require_once 'include/event.php';
@@ -47,25 +49,14 @@ function bb_attachment($Text, $simplehtml = false, $tryoembed = true) {
                $data["title"] = str_replace(array("http://", "https://"), "", $data["title"]);
        }
 
-       if (((strpos($data["text"], "[img=") !== false) OR (strpos($data["text"], "[img]") !== false)) AND ($data["image"] != "")) {
+       if (((strpos($data["text"], "[img=") !== false) || (strpos($data["text"], "[img]") !== false)) && ($data["image"] != "")) {
                $data["preview"] = $data["image"];
                $data["image"] = "";
        }
 
        if ($simplehtml == 7) {
-               $title2 = $data["title"];
-
-               $test1 = trim(html_entity_decode($data["text"],ENT_QUOTES,'UTF-8'));
-               $test2 = trim(html_entity_decode($data["title"],ENT_QUOTES,'UTF-8'));
-
-               // If the link description is similar to the text above then don't add the link description
-               if (($data["title"] != "") AND ((strpos($test1,$test2) !== false) OR
-                       (similar_text($test1,$test2) / strlen($data["title"])) > 0.9)) {
-                       $title2 = $data["url"];
-               }
-               $text = sprintf('<a href="%s" title="%s" class="attachment thumbnail" rel="nofollow external">%s</a><br />',
-                               $data["url"], $data["title"], $title2);
-       } elseif (($simplehtml != 4) AND ($simplehtml != 0)) {
+               $text = style_url_for_mastodon($data["url"]);
+       } elseif (($simplehtml != 4) && ($simplehtml != 0)) {
                $text = sprintf('<a href="%s" target="_blank">%s</a><br>', $data["url"], $data["title"]);
        } else {
                $text = sprintf('<span class="type-%s">', $data["type"]);
@@ -80,13 +71,13 @@ function bb_attachment($Text, $simplehtml = false, $tryoembed = true) {
                if (strstr(strtolower($oembed), "<iframe ")) {
                        $text = $oembed;
                } else {
-                       if (($data["image"] != "") AND !strstr(strtolower($oembed), "<img ")) {
+                       if (($data["image"] != "") && !strstr(strtolower($oembed), "<img ")) {
                                $text .= sprintf('<a href="%s" target="_blank"><img src="%s" alt="" title="%s" class="attachment-image" /></a><br />', $data["url"], proxy_url($data["image"]), $data["title"]);
-                       } elseif (($data["preview"] != "") AND !strstr(strtolower($oembed), "<img ")) {
+                       } elseif (($data["preview"] != "") && !strstr(strtolower($oembed), "<img ")) {
                                $text .= sprintf('<a href="%s" target="_blank"><img src="%s" alt="" title="%s" class="attachment-preview" /></a><br />', $data["url"], proxy_url($data["preview"]), $data["title"]);
                        }
 
-                       if (($data["type"] == "photo") AND ($data["url"] != "") AND ($data["image"] != "")) {
+                       if (($data["type"] == "photo") && ($data["url"] != "") && ($data["image"] != "")) {
                                $text .= sprintf('<a href="%s" target="_blank"><img src="%s" alt="" title="%s" class="attachment-image" /></a>', $data["url"], proxy_url($data["image"]), $data["title"]);
                        } else {
                                $text .= $oembed;
@@ -97,7 +88,7 @@ function bb_attachment($Text, $simplehtml = false, $tryoembed = true) {
                        }
                }
        }
-       return $data["text"] . $text . $data["after"];
+       return trim($data["text"].' '.$text.' '.$data["after"]);
 }
 
 function bb_remove_share_information($Text, $plaintext = false, $nolink = false) {
@@ -112,25 +103,25 @@ function bb_remove_share_information($Text, $plaintext = false, $nolink = false)
 
        $title = htmlentities($data["title"], ENT_QUOTES, 'UTF-8', false);
        $text = htmlentities($data["text"], ENT_QUOTES, 'UTF-8', false);
-       if ($plaintext OR (($title != "") AND strstr($text, $title))) {
+       if ($plaintext || (($title != "") && strstr($text, $title))) {
                $data["title"] = $data["url"];
-       } elseif (($text != "") AND strstr($title, $text)) {
+       } elseif (($text != "") && strstr($title, $text)) {
                $data["text"] = $data["title"];
                $data["title"] = $data["url"];
        }
 
-       if (($data["text"] == "") AND ($data["title"] != "") AND ($data["url"] == "")) {
+       if (($data["text"] == "") && ($data["title"] != "") && ($data["url"] == "")) {
                return $data["title"] . $data["after"];
        }
 
        // If the link already is included in the post, don't add it again
-       if (($data["url"] != "") AND strpos($data["text"], $data["url"])) {
+       if (($data["url"] != "") && strpos($data["text"], $data["url"])) {
                return $data["text"] . $data["after"];
        }
 
        $text = $data["text"];
 
-       if (($data["url"] != "") AND ($data["title"] != "")) {
+       if (($data["url"] != "") && ($data["title"] != "")) {
                $text .= "\n[url=" . $data["url"] . "]" . $data["title"] . "[/url]";
        } elseif (($data["url"] != "")) {
                $text .= "\n" . $data["url"];
@@ -156,7 +147,7 @@ function cleancss($input) {
        for ($i = 0; $i < strlen($input); $i++) {
                $char = substr($input, $i, 1);
 
-               if (($char >= "a") and ($char <= "z")) {
+               if (($char >= "a") && ($char <= "z")) {
                        $cleaned .= $char;
                }
 
@@ -168,6 +159,54 @@ function cleancss($input) {
        return $cleaned;
 }
 
+/**
+ * @brief Converts [url] BBCodes in a format that looks fine on Mastodon. (callback function)
+ * @param array $match Array with the matching values
+ * @return string reformatted link including HTML codes
+ */
+function bb_style_url($match) {
+        $url = $match[1];
+
+       if (isset($match[2]) && ($match[1] != $match[2])) {
+               return $match[0];
+       }
+
+        $parts = parse_url($url);
+        if (!isset($parts['scheme'])) {
+                return $match[0];
+        }
+
+       return style_url_for_mastodon($url);
+}
+
+/**
+ * @brief Converts [url] BBCodes in a format that looks fine on Mastodon and GNU Social.
+ * @param string $url URL that is about to be reformatted
+ * @return string reformatted link including HTML codes
+ */
+function style_url_for_mastodon($url) {
+        $styled_url = $url;
+
+        $parts = parse_url($url);
+        $scheme = $parts['scheme'].'://';
+        $styled_url = str_replace($scheme, '', $styled_url);
+
+        $html = '<a href="%s" class="attachment" rel="nofollow noopener" target="_blank">'.
+                 '<span class="invisible">%s</span>';
+
+        if (strlen($styled_url) > 30) {
+                $html .= '<span class="ellipsis">%s</span>'.
+                        '<span class="invisible">%s</span></a>';
+
+                $ellipsis = substr($styled_url, 0, 30);
+                $rest = substr($styled_url, 30);
+                return sprintf($html, $url, $scheme, $ellipsis, $rest);
+        } else {
+                $html .= '%s</a>';
+                return sprintf($html, $url, $scheme, $styled_url);
+        }
+}
+
 function stripcode_br_cb($s) {
        return '[code]' . str_replace('<br />', '', $s[1]) . '[/code]';
 }
@@ -446,20 +485,20 @@ function bb_ShareAttributes($share, $simplehtml) {
 
        $data = get_contact_details_by_url($profile);
 
-       if (isset($data["name"]) AND ($data["name"] != "") AND isset($data["addr"]) AND ($data["addr"] != ""))
+       if (isset($data["name"]) && ($data["name"] != "") && isset($data["addr"]) && ($data["addr"] != ""))
                $userid_compact = $data["name"]." (".$data["addr"].")";
        else
                $userid_compact = GetProfileUsername($profile,$author, true);
 
-       if (isset($data["addr"]) AND ($data["addr"] != ""))
+       if (isset($data["addr"]) && ($data["addr"] != ""))
                $userid = $data["addr"];
        else
                $userid = GetProfileUsername($profile,$author, false);
 
-       if (isset($data["name"]) AND ($data["name"] != ""))
+       if (isset($data["name"]) && ($data["name"] != ""))
                $author = $data["name"];
 
-       if (isset($data["micro"]) AND ($data["micro"] != ""))
+       if (isset($data["micro"]) && ($data["micro"] != ""))
                $avatar = $data["micro"];
 
        $preshare = trim($share[1]);
@@ -705,7 +744,7 @@ function bb_RemovePictureLinks($match) {
 }
 
 function bb_expand_links($match) {
-       if (($match[3] == "") OR ($match[2] == $match[3]) OR stristr($match[2], $match[3])) {
+       if (($match[3] == "") || ($match[2] == $match[3]) || stristr($match[2], $match[3])) {
                return ($match[1] . "[url]" . $match[2] . "[/url]");
        } else {
                return ($match[1] . $match[3] . " [url]" . $match[2] . "[/url]");
@@ -891,7 +930,7 @@ function bbcode($Text, $preserve_nl = false, $tryoembed = true, $simplehtml = fa
        $MAILSearchString = $URLSearchString;
 
        // Remove all hashtag addresses
-       if ((!$tryoembed OR $simplehtml) AND !in_array($simplehtml, array(3, 7))) {
+       if ((!$tryoembed || $simplehtml) && !in_array($simplehtml, array(3, 7))) {
                $Text = preg_replace("/([#@])\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism", '$1$3', $Text);
        } elseif ($simplehtml == 3) {
                $Text = preg_replace("/([@])\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism",
@@ -940,7 +979,14 @@ function bbcode($Text, $preserve_nl = false, $tryoembed = true, $simplehtml = fa
        // 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) {
-                       $Text = preg_replace("/([^\]\='".'"'."]|^)(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)/ism", '$1<a href="$2" target="_blank">$2</a>', $Text);
+                       if ($simplehtml != 7) {
+                               $Text = preg_replace("/([^\]\='".'"'."]|^)(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)/ism", '$1<a href="$2" target="_blank">$2</a>', $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);
@@ -1080,7 +1126,7 @@ function bbcode($Text, $preserve_nl = false, $tryoembed = true, $simplehtml = fa
        // Check for [spoiler] text
        // handle nested quotes
        $endlessloop = 0;
-       while ((strpos($Text, "[/spoiler]") !== false) and (strpos($Text, "[spoiler]") !== false) and (++$endlessloop < 20)) {
+       while ((strpos($Text, "[/spoiler]") !== false) && (strpos($Text, "[spoiler]") !== false) && (++$endlessloop < 20)) {
                $Text = preg_replace("/\[spoiler\](.*?)\[\/spoiler\]/ism", "$SpoilerLayout", $Text);
        }
 
@@ -1090,7 +1136,7 @@ function bbcode($Text, $preserve_nl = false, $tryoembed = true, $simplehtml = fa
 
        // handle nested quotes
        $endlessloop = 0;
-       while ((strpos($Text, "[/spoiler]")!== false)  and (strpos($Text, "[spoiler=") !== false) and (++$endlessloop < 20)) {
+       while ((strpos($Text, "[/spoiler]")!== false)  && (strpos($Text, "[spoiler=") !== false) && (++$endlessloop < 20)) {
                $Text = preg_replace("/\[spoiler=[\"\']*(.*?)[\"\']*\](.*?)\[\/spoiler\]/ism",
                                     "<br /><strong class=".'"spoiler"'.">" . $t_wrote . "</strong><blockquote class=".'"spoiler"'.">$2</blockquote>",
                                     $Text);
@@ -1102,7 +1148,7 @@ function bbcode($Text, $preserve_nl = false, $tryoembed = true, $simplehtml = fa
        // Check for [quote] text
        // handle nested quotes
        $endlessloop = 0;
-       while ((strpos($Text, "[/quote]") !== false) and (strpos($Text, "[quote]") !== false) and (++$endlessloop < 20)) {
+       while ((strpos($Text, "[/quote]") !== false) && (strpos($Text, "[quote]") !== false) && (++$endlessloop < 20)) {
                $Text = preg_replace("/\[quote\](.*?)\[\/quote\]/ism", "$QuoteLayout", $Text);
        }
 
@@ -1112,7 +1158,7 @@ function bbcode($Text, $preserve_nl = false, $tryoembed = true, $simplehtml = fa
 
        // handle nested quotes
        $endlessloop = 0;
-       while ((strpos($Text, "[/quote]")!== false)  and (strpos($Text, "[quote=") !== false) and (++$endlessloop < 20)) {
+       while ((strpos($Text, "[/quote]")!== false)  && (strpos($Text, "[quote=") !== false) && (++$endlessloop < 20)) {
                $Text = preg_replace("/\[quote=[\"\']*(.*?)[\"\']*\](.*?)\[\/quote\]/ism",
                                     "<br /><strong class=".'"author"'.">" . $t_wrote . "</strong><blockquote>$2</blockquote>",
                                     $Text);
@@ -1273,7 +1319,7 @@ function bbcode($Text, $preserve_nl = false, $tryoembed = true, $simplehtml = fa
        // 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.
-       if (!$tryoembed OR (get_itemcachepath() != "")) {
+       if (!$tryoembed || (get_itemcachepath() != "")) {
                $doc = new DOMDocument();
                $doc->preserveWhiteSpace = false;