From b7b7b1b664b07f3a8c82ba72c9dcfab16dd5979a Mon Sep 17 00:00:00 2001
From: Hypolite Petovan <hypolite@mrpetovan.com>
Date: Tue, 8 Jan 2019 20:55:36 -0500
Subject: [PATCH] Add support for Hubzilla forum mentions (starting with !)

---
 src/Content/Text/BBCode.php   |  7 +++++--
 src/Content/Text/Markdown.php | 13 ++++++++-----
 2 files changed, 13 insertions(+), 7 deletions(-)

diff --git a/src/Content/Text/BBCode.php b/src/Content/Text/BBCode.php
index 6d2b152ee8..1ddae09eac 100644
--- a/src/Content/Text/BBCode.php
+++ b/src/Content/Text/BBCode.php
@@ -1809,6 +1809,9 @@ class BBCode extends BaseObject
 	 * @brief Callback function to replace a Friendica style mention in a mention for Diaspora
 	 *
 	 * @param array $match Matching values for the callback
+	 *                     [1] = Mention type (! or @)
+	 *                     [2] = Name
+	 *                     [3] = Address
 	 * @return string Replaced mention
 	 */
 	private static function bbCodeMention2DiasporaCallback($match)
@@ -1823,7 +1826,7 @@ class BBCode extends BaseObject
 			return $match[0];
 		}
 
-		$mention = '@{' . $match[2] . '; ' . $contact['addr'] . '}';
+		$mention = $match[1] . '{' . $match[2] . '; ' . $contact['addr'] . '}';
 		return $mention;
 	}
 
@@ -1908,7 +1911,7 @@ class BBCode extends BaseObject
 		if ($for_diaspora) {
 			$url_search_string = "^\[\]";
 			$text = preg_replace_callback(
-				"/([@]\[(.*?)\])\(([$url_search_string]*?)\)/ism",
+				"/([@!])\[(.*?)\]\(([$url_search_string]*?)\)/ism",
 				['self', 'bbCodeMention2DiasporaCallback'],
 				$text
 			);
diff --git a/src/Content/Text/Markdown.php b/src/Content/Text/Markdown.php
index 2289bee869..994d968334 100644
--- a/src/Content/Text/Markdown.php
+++ b/src/Content/Text/Markdown.php
@@ -44,27 +44,30 @@ class Markdown extends BaseObject
 	 * @brief Callback function to replace a Diaspora style mention in a mention for Friendica
 	 *
 	 * @param array $match Matching values for the callback
+	 *                     [1] = mention type (@ or !)
+	 *                     [2] = name (optional)
+	 *                     [3] = address
 	 * @return string Replaced mention
 	 */
 	private static function diasporaMention2BBCodeCallback($match)
 	{
-		if ($match[2] == '') {
+		if ($match[3] == '') {
 			return;
 		}
 
-		$data = Contact::getDetailsByAddr($match[2]);
+		$data = Contact::getDetailsByAddr($match[3]);
 
 		if (empty($data)) {
 			return;
 		}
 
-		$name = $match[1];
+		$name = $match[2];
 
 		if ($name == '') {
 			$name = $data['name'];
 		}
 
-		return '@[url=' . $data['url'] . ']' . $name . '[/url]';
+		return $match[1] . '[url=' . $data['url'] . ']' . $name . '[/url]';
 	}
 
 	/*
@@ -93,7 +96,7 @@ class Markdown extends BaseObject
 
 		$s = self::convert($s);
 
-		$regexp = "/@\{(?:([^\}]+?); )?([^\} ]+)\}/";
+		$regexp = "/([@!])\{(?:([^\}]+?); ?)?([^\} ]+)\}/";
 		$s = preg_replace_callback($regexp, ['self', 'diasporaMention2BBCodeCallback'], $s);
 
 		$s = str_replace('&#35;', '#', $s);
-- 
2.39.5