Merge pull request #6184 from MrPetovan/task/normalize-bbcode-hashtags

Normalize BBCode hashtags links
This commit is contained in:
Michael Vogel 2018-11-24 13:14:50 +01:00 committed by GitHub
commit 42a3610a79
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 44 additions and 35 deletions

View file

@ -97,7 +97,7 @@ function add_page_info_data(array $data, $no_photos = false)
/// @TODO make a positive list of allowed characters /// @TODO make a positive list of allowed characters
$hashtag = str_replace([" ", "+", "/", ".", "#", "'", "", "`", "(", ")", "", ""], $hashtag = str_replace([" ", "+", "/", ".", "#", "'", "", "`", "(", ")", "", ""],
["", "", "", "", "", "", "", "", "", "", "", ""], $keyword); ["", "", "", "", "", "", "", "", "", "", "", ""], $keyword);
$hashtags .= "#[url=" . System::baseUrl() . "/search?tag=" . rawurlencode($hashtag) . "]" . $hashtag . "[/url] "; $hashtags .= "#[url=" . System::baseUrl() . "/search?tag=" . $hashtag . "]" . $hashtag . "[/url] ";
} }
} }
@ -148,7 +148,7 @@ function add_page_keywords($url, $photo = "", $keywords = false, $keyword_blackl
$tags .= ", "; $tags .= ", ";
} }
$tags .= "#[url=" . System::baseUrl() . "/search?tag=" . rawurlencode($hashtag) . "]" . $hashtag . "[/url]"; $tags .= "#[url=" . System::baseUrl() . "/search?tag=" . $hashtag . "]" . $hashtag . "[/url]";
} }
} }

View file

@ -613,7 +613,7 @@ function photos_post(App $a)
} }
$profile = str_replace(',', '%2c', $profile); $profile = str_replace(',', '%2c', $profile);
$str_tags .= '@[url='.$profile.']'.$newname.'[/url]'; $str_tags .= '@[url=' . $profile . ']' . $newname . '[/url]';
} }
} elseif (strpos($tag, '#') === 0) { } elseif (strpos($tag, '#') === 0) {
$tagname = substr($tag, 1); $tagname = substr($tag, 1);

View file

@ -93,7 +93,7 @@ function tagger_content(App $a) {
</target> </target>
EOT; EOT;
$tagid = System::baseUrl() . '/search?tag=' . $term; $tagid = System::baseUrl() . '/search?tag=' . $xterm;
$objtype = ACTIVITY_OBJ_TAGTERM; $objtype = ACTIVITY_OBJ_TAGTERM;
$obj = <<< EOT $obj = <<< EOT
@ -113,7 +113,7 @@ EOT;
return; return;
} }
$termlink = html_entity_decode('&#x2317;') . '[url=' . System::baseUrl() . '/search?tag=' . urlencode($term) . ']'. $term . '[/url]'; $termlink = html_entity_decode('&#x2317;') . '[url=' . System::baseUrl() . '/search?tag=' . $term . ']'. $term . '[/url]';
$arr = []; $arr = [];
@ -170,7 +170,7 @@ EOT;
$term_objtype, $term_objtype,
TERM_HASHTAG, TERM_HASHTAG,
DBA::escape($term), DBA::escape($term),
DBA::escape(System::baseUrl() . '/search?tag=' . $term), '',
intval($owner_uid) intval($owner_uid)
); );
} }
@ -192,7 +192,7 @@ EOT;
$term_objtype, $term_objtype,
TERM_HASHTAG, TERM_HASHTAG,
DBA::escape($term), DBA::escape($term),
DBA::escape(System::baseUrl() . '/search?tag=' . $term), '',
intval($owner_uid) intval($owner_uid)
); );
} }

View file

@ -28,6 +28,7 @@ use Friendica\Util\Network;
use Friendica\Util\ParseUrl; use Friendica\Util\ParseUrl;
use Friendica\Util\Proxy as ProxyUtils; use Friendica\Util\Proxy as ProxyUtils;
use Friendica\Util\Strings; use Friendica\Util\Strings;
use Friendica\Util\XML;
class BBCode extends BaseObject class BBCode extends BaseObject
{ {
@ -1340,15 +1341,21 @@ class BBCode extends BaseObject
$expression = "=diaspora://.*?/post/([0-9A-Za-z\-_@.:]{15,254}[0-9A-Za-z])=ism"; $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($expression, System::baseUrl()."/display/$1", $text);
$text = preg_replace("/([#])\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism", /* Tag conversion
'$1<a href="' . System::baseUrl() . '/search?tag=$3" class="tag" title="$3">$3</a>', $text); * Supports:
* - #[url=<anything>]<term>[/url]
$text = preg_replace("/\[url\=([$URLSearchString]*)\]#(.*?)\[\/url\]/ism", * - [url=<anything>]#<term>[/url]
'#<a href="' . System::baseUrl() . '/search?tag=$2" class="tag" title="$2">$2</a>', $text); */
$text = preg_replace_callback("/(?:#\[url\=[$URLSearchString]*\]|\[url\=[$URLSearchString]*\]#)(.*?)\[\/url\]/ism", function($matches) {
return '#<a href="'
. System::baseUrl() . '/search?tag=' . rawurlencode($matches[1])
. '" class="tag" title="' . XML::escape($matches[1]) . '">'
. XML::escape($matches[1])
. '</a>';
}, $text);
$text = preg_replace("/\[url\]([$URLSearchString]*)\[\/url\]/ism", '<a href="$1" target="_blank">$1</a>', $text); $text = preg_replace("/\[url\]([$URLSearchString]*)\[\/url\]/ism", '<a href="$1" target="_blank">$1</a>', $text);
$text = preg_replace("/\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism", '<a href="$1" target="_blank">$2</a>', $text); $text = preg_replace("/\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism", '<a href="$1" target="_blank">$2</a>', $text);
//$Text = preg_replace("/\[url\=([$URLSearchString]*)\]([$URLSearchString]*)\[\/url\]/ism", '<a href="$1" target="_blank">$2</a>', $Text);
// Red compatibility, though the link can't be authenticated on Friendica // Red compatibility, though the link can't be authenticated on Friendica
$text = preg_replace("/\[zrl\=([$URLSearchString]*)\](.*?)\[\/zrl\]/ism", '<a href="$1" target="_blank">$2</a>', $text); $text = preg_replace("/\[zrl\=([$URLSearchString]*)\](.*?)\[\/zrl\]/ism", '<a href="$1" target="_blank">$2</a>', $text);

View file

@ -2448,15 +2448,15 @@ class Item extends BaseObject
$basetag = str_replace('_',' ',substr($tag,1)); $basetag = str_replace('_',' ',substr($tag,1));
$newtag = '#[url=' . System::baseUrl() . '/search?tag=' . rawurlencode($basetag) . ']' . $basetag . '[/url]'; $newtag = '#[url=' . System::baseUrl() . '/search?tag=' . $basetag . ']' . $basetag . '[/url]';
$item["body"] = str_replace($tag, $newtag, $item["body"]); $item["body"] = str_replace($tag, $newtag, $item["body"]);
if (!stristr($item["tag"], "/search?tag=" . $basetag . "]" . $basetag . "[/url]")) { if (!stristr($item["tag"], "/search?tag=" . $basetag . "]" . $basetag . "[/url]")) {
if (strlen($item["tag"])) { if (strlen($item["tag"])) {
$item["tag"] = ','.$item["tag"]; $item["tag"] = ',' . $item["tag"];
} }
$item["tag"] = $newtag.$item["tag"]; $item["tag"] = $newtag . $item["tag"];
} }
} }

View file

@ -140,6 +140,7 @@ class Term
$type = TERM_HASHTAG; $type = TERM_HASHTAG;
$term = substr($tag, 1); $term = substr($tag, 1);
$link = '';
} elseif ((substr(trim($tag), 0, 1) == '@') || (substr(trim($tag), 0, 1) == '!')) { } elseif ((substr(trim($tag), 0, 1) == '@') || (substr(trim($tag), 0, 1) == '!')) {
$type = TERM_MENTION; $type = TERM_MENTION;
@ -152,6 +153,7 @@ class Term
} else { // This shouldn't happen } else { // This shouldn't happen
$type = TERM_HASHTAG; $type = TERM_HASHTAG;
$term = $tag; $term = $tag;
$link = '';
} }
if (DBA::exists('term', ['uid' => $message['uid'], 'otype' => TERM_OBJ_POST, 'oid' => $itemid, 'url' => $link])) { if (DBA::exists('term', ['uid' => $message['uid'], 'otype' => TERM_OBJ_POST, 'oid' => $itemid, 'url' => $link])) {
@ -262,29 +264,29 @@ class Term
); );
while ($tag = DBA::fetch($taglist)) { while ($tag = DBA::fetch($taglist)) {
if ($tag["url"] == "") { if ($tag['url'] == '') {
$tag["url"] = $searchpath . $tag["term"]; $tag['url'] = $searchpath . rawurlencode($tag['term']);
} }
$orig_tag = $tag["url"]; $orig_tag = $tag['url'];
$author = ['uid' => 0, 'id' => $item['author-id'], $author = ['uid' => 0, 'id' => $item['author-id'],
'network' => $item['author-network'], 'url' => $item['author-link']]; 'network' => $item['author-network'], 'url' => $item['author-link']];
$tag["url"] = Contact::magicLinkByContact($author, $tag['url']); $tag['url'] = Contact::magicLinkByContact($author, $tag['url']);
if ($tag["type"] == TERM_HASHTAG) { if ($tag['type'] == TERM_HASHTAG) {
if ($orig_tag != $tag["url"]) { if ($orig_tag != $tag['url']) {
$item['body'] = str_replace($orig_tag, $tag["url"], $item['body']); $item['body'] = str_replace($orig_tag, $tag['url'], $item['body']);
} }
$return['hashtags'][] = "#<a href=\"" . $tag["url"] . "\" target=\"_blank\">" . $tag["term"] . "</a>"; $return['hashtags'][] = '#<a href="' . $tag['url'] . '" target="_blank">' . $tag['term'] . '</a>';
$prefix = "#"; $prefix = '#';
} elseif ($tag["type"] == TERM_MENTION) { } elseif ($tag['type'] == TERM_MENTION) {
$return['mentions'][] = "@<a href=\"" . $tag["url"] . "\" target=\"_blank\">" . $tag["term"] . "</a>"; $return['mentions'][] = '@<a href="' . $tag['url'] . '" target="_blank">' . $tag['term'] . '</a>';
$prefix = "@"; $prefix = '@';
} }
$return['tags'][] = $prefix . "<a href=\"" . $tag["url"] . "\" target=\"_blank\">" . $tag["term"] . "</a>"; $return['tags'][] = $prefix . '<a href="' . $tag['url'] . '" target="_blank">' . $tag['term'] . '</a>';
} }
DBA::close($taglist); DBA::close($taglist);

View file

@ -350,7 +350,7 @@ class Feed {
$tags .= ', '; $tags .= ', ';
} }
$taglink = "#[url=" . System::baseUrl() . "/search?tag=" . rawurlencode($hashtag) . "]" . $hashtag . "[/url]"; $taglink = "#[url=" . System::baseUrl() . "/search?tag=" . $hashtag . "]" . $hashtag . "[/url]";
$tags .= $taglink; $tags .= $taglink;
} }

View file

@ -634,15 +634,15 @@ class OStatus
if ($categories) { if ($categories) {
foreach ($categories as $category) { foreach ($categories as $category) {
foreach ($category->attributes as $attributes) { foreach ($category->attributes as $attributes) {
if ($attributes->name == "term") { if ($attributes->name == 'term') {
$term = $attributes->textContent; $term = $attributes->textContent;
if (!empty($item["tag"])) { if (!empty($item['tag'])) {
$item["tag"] .= ','; $item['tag'] .= ',';
} else { } else {
$item["tag"] = ''; $item['tag'] = '';
} }
$item["tag"] .= "#[url=".System::baseUrl()."/search?tag=".$term."]".$term."[/url]"; $item['tag'] .= '#[url=' . System::baseUrl() . '/search?tag=' . $term . ']' . $term . '[/url]';
} }
} }
} }