' . Map::byCoordinates(str_replace('/', ' ', $match[1])) . '', $match[0]); } function bb_map_location($match) { // the extra space in the following line is intentional return str_replace($match[0], '
' . Map::byLocation($match[1]) . '
', $match[0]); } /** * 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; } if (isset($data["title"])) { $data["title"] = strip_tags($data["title"]); $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"] != "")) { $data["preview"] = $data["image"]; $data["image"] = ""; } if ($simplehtml == 7) { $text = style_url_for_mastodon($data["url"]); } elseif (($simplehtml != 4) && ($simplehtml != 0)) { $text = sprintf('%s
', $data["url"], $data["title"]); } else { if ($simplehtml != 4) { $text = sprintf('', $data["type"]); } $oembed = sprintf('[bookmark=%s]%s[/bookmark]', $data['url'], $data['title']); if ($tryoembed) { try { $oembed = OEmbed::getHTML($data['url'], $data['title']); } catch (Exception $e) { // $oembed isn't modified } } if (stripos($oembed, "', $Text); } else { $Text = preg_replace("/\[iframe\](.*?)\[\/iframe\]/ism", '$1', $Text); } // Youtube extensions if ($tryoembed) { $Text = preg_replace_callback("/\[youtube\](https?:\/\/www.youtube.com\/watch\?v\=.*?)\[\/youtube\]/ism", 'tryoembed', $Text); $Text = preg_replace_callback("/\[youtube\](www.youtube.com\/watch\?v\=.*?)\[\/youtube\]/ism", 'tryoembed', $Text); $Text = preg_replace_callback("/\[youtube\](https?:\/\/youtu.be\/.*?)\[\/youtube\]/ism", 'tryoembed', $Text); } $Text = preg_replace("/\[youtube\]https?:\/\/www.youtube.com\/watch\?v\=(.*?)\[\/youtube\]/ism", '[youtube]$1[/youtube]', $Text); $Text = preg_replace("/\[youtube\]https?:\/\/www.youtube.com\/embed\/(.*?)\[\/youtube\]/ism", '[youtube]$1[/youtube]', $Text); $Text = preg_replace("/\[youtube\]https?:\/\/youtu.be\/(.*?)\[\/youtube\]/ism", '[youtube]$1[/youtube]', $Text); if ($tryoembed) { $Text = preg_replace("/\[youtube\]([A-Za-z0-9\-_=]+)(.*?)\[\/youtube\]/ism", '', $Text); } else { $Text = preg_replace("/\[youtube\]([A-Za-z0-9\-_=]+)(.*?)\[\/youtube\]/ism", 'https://www.youtube.com/watch?v=$1', $Text); } if ($tryoembed) { $Text = preg_replace_callback("/\[vimeo\](https?:\/\/player.vimeo.com\/video\/[0-9]+).*?\[\/vimeo\]/ism", 'tryoembed', $Text); $Text = preg_replace_callback("/\[vimeo\](https?:\/\/vimeo.com\/[0-9]+).*?\[\/vimeo\]/ism", 'tryoembed', $Text); } $Text = preg_replace("/\[vimeo\]https?:\/\/player.vimeo.com\/video\/([0-9]+)(.*?)\[\/vimeo\]/ism", '[vimeo]$1[/vimeo]', $Text); $Text = preg_replace("/\[vimeo\]https?:\/\/vimeo.com\/([0-9]+)(.*?)\[\/vimeo\]/ism", '[vimeo]$1[/vimeo]', $Text); if ($tryoembed) { $Text = preg_replace("/\[vimeo\]([0-9]+)(.*?)\[\/vimeo\]/ism", '', $Text); } else { $Text = preg_replace("/\[vimeo\]([0-9]+)(.*?)\[\/vimeo\]/ism", 'https://vimeo.com/$1', $Text); } // $Text = preg_replace("/\[youtube\](.*?)\[\/youtube\]/", '', $Text); // oembed tag $Text = OEmbed::BBCode2HTML($Text); // Avoid triple linefeeds through oembed $Text = str_replace("


", "

", $Text); // If we found an event earlier, strip out all the event code and replace with a reformatted version. // Replace the event-start section with the entire formatted event. The other bbcode is stripped. // 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')) { $sub = format_event_html($ev, $simplehtml); $Text = preg_replace("/\[event\-summary\](.*?)\[\/event\-summary\]/ism", '', $Text); $Text = preg_replace("/\[event\-description\](.*?)\[\/event\-description\]/ism", '', $Text); $Text = preg_replace("/\[event\-start\](.*?)\[\/event\-start\]/ism", $sub, $Text); $Text = preg_replace("/\[event\-finish\](.*?)\[\/event\-finish\]/ism", '', $Text); $Text = preg_replace("/\[event\-location\](.*?)\[\/event\-location\]/ism", '', $Text); $Text = preg_replace("/\[event\-adjust\](.*?)\[\/event\-adjust\]/ism", '', $Text); $Text = preg_replace("/\[event\-id\](.*?)\[\/event\-id\]/ism", '', $Text); } // Replace non graphical smilies for external posts if ($simplehtml) { $Text = Smilies::replace($Text, false, true); } // Replace inline code blocks $Text = preg_replace_callback("|(?!]*>)([^<]*)(?!]*>)|ism", function ($match) use ($simplehtml) { $return = '' . $match[1] . ''; // Use for Diaspora inline code blocks if ($simplehtml === 3) { $return = '' . $match[1] . ''; } return $return; } , $Text); // Unhide all [noparse] contained bbtags unspacefying them // and triming the [noparse] tag. $Text = preg_replace_callback("/\[noparse\](.*?)\[\/noparse\]/ism", 'bb_unspacefy_and_trim', $Text); $Text = preg_replace_callback("/\[nobb\](.*?)\[\/nobb\]/ism", 'bb_unspacefy_and_trim', $Text); $Text = preg_replace_callback("/\[pre\](.*?)\[\/pre\]/ism", 'bb_unspacefy_and_trim', $Text); $Text = preg_replace('/\[\&\;([#a-z0-9]+)\;\]/', '&$1;', $Text); $Text = preg_replace('/\&\#039\;/', '\'', $Text); $Text = preg_replace('/\"\;/', '"', $Text); // fix any escaped ampersands that may have been converted into links $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'); $Text = preg_replace('#<([^>]*?)(src)="(?!' . implode('|', $allowed_src_protocols) . ')(.*?)"(.*?)>#ism', '<$1$2=""$4 class="invalid-src" title="' . 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')); // 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); if ($saved_image) { $Text = bb_replace_images($Text, $saved_image); } // 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 || (get_itemcachepath() != "")) { $doc = new DOMDocument(); $doc->preserveWhiteSpace = false; $Text = mb_convert_encoding($Text, 'HTML-ENTITIES', "UTF-8"); $doctype = ''; $encoding = ''; @$doc->loadHTML($encoding.$doctype."".$Text.""); $doc->encoding = 'UTF-8'; $Text = $doc->saveHTML(); $Text = str_replace(array("", "", $doctype, $encoding), array("", "", "", ""), $Text); $Text = str_replace('
', '', $Text); //$Text = mb_convert_encoding($Text, "UTF-8", 'HTML-ENTITIES'); } // Clean up some useless linebreaks in lists //$Text = str_replace('

', '', $Text); //$Text = str_replace('
', '', $Text); //$Text = str_replace('
  • ', '
  • ', $Text); //$Text = str_replace('