]> git.mxchange.org Git - friendica.git/commitdiff
New model class for tag
authorMichael <heluecht@pirati.ca>
Wed, 15 Apr 2020 16:37:09 +0000 (16:37 +0000)
committerMichael <heluecht@pirati.ca>
Wed, 15 Apr 2020 16:37:09 +0000 (16:37 +0000)
src/Model/Tag.php [new file with mode: 0644]
src/Protocol/DFRN.php
src/Protocol/Diaspora.php

diff --git a/src/Model/Tag.php b/src/Model/Tag.php
new file mode 100644 (file)
index 0000000..2a09ffd
--- /dev/null
@@ -0,0 +1,81 @@
+<?php
+/**
+ * @copyright Copyright (C) 2020, Friendica
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace Friendica\Model;
+
+use Friendica\Core\Logger;
+use Friendica\Database\DBA;
+use Friendica\Content\Text\BBCode;
+
+/**
+ * Class Tag
+ *
+ * This Model class handles tag table interactions.
+ * This tables stores relevant tags related to posts, like hashtags and mentions.
+ */
+class Tag
+{
+    const UNKNOWN           = 0;
+    const HASHTAG           = 1;
+    const MENTION           = 2;
+    const CATEGORY          = 3;
+    const FILE              = 5;
+       /**
+        * An implicit mention is a mention in a comment body that is redundant with the threading information.
+        */
+    const IMPLICIT_MENTION  = 8;
+       /**
+        * An exclusive mention transfers the ownership of the post to the target account, usually a forum.
+        */
+    const EXCLUSIVE_MENTION = 9;
+
+    const TAG_CHARACTER = [
+       self::HASHTAG           => '#',
+       self::MENTION           => '@',
+       self::IMPLICIT_MENTION  => '%',
+       self::EXCLUSIVE_MENTION => '!',
+    ];
+
+       /**
+        * Store tags from the body
+        *
+        * @param integer $uriid
+        * @param string $body
+        */
+       public static function storeFromBody(int $uriid, string $body)
+       {
+               $tags = BBCode::getTags($body);
+               if (empty($tags)) {
+                       return;
+               }
+
+               foreach ($tags as $tag) {
+                       if ((substr($tag, 0, 1) != Term::TAG_CHARACTER[Term::HASHTAG]) || (strlen($tag) <= 1)) {
+                               Logger::info('Skip tag', ['uriid' => $uriid, 'tag' => $tag]);
+                               continue;
+                       }
+
+                       $fields = ['uri-id' => $uriid, 'name' => substr($tag, 1, 64), 'type' => Term::HASHTAG];
+                       DBA::insert('tag', $fields, true);
+                       Logger::info('Stored tag', ['uriid' => $uriid, 'tag' => $tag, 'fields' => $fields]);
+               }
+       }
+}
index 57edfb02b70c9f26f09429598ad8708db569f70d..9ab8bc70c9117637855ae4464974f4ee1aca81d0 100644 (file)
@@ -40,6 +40,7 @@ use Friendica\Model\Mail;
 use Friendica\Model\Notify\Type;
 use Friendica\Model\PermissionSet;
 use Friendica\Model\Profile;
+use Friendica\Model\Tag;
 use Friendica\Model\Term;
 use Friendica\Model\User;
 use Friendica\Network\Probe;
@@ -2407,6 +2408,8 @@ class DFRN
 
                $item['uri-id'] = ItemURI::insert(['uri' => $item['uri'], 'guid' => $item['guid']]);
 
+               Tag::storeFromBody($item['uri-id'], $item["body"]);
+
                // We store the data from "dfrn:diaspora_signature" in a different table, this is done in "Item::insert"
                $dsprsig = XML::unescape(XML::getFirstNodeValue($xpath, "dfrn:diaspora_signature/text()", $entry));
                if ($dsprsig != "") {
index 5aa3463181622e68707c75f621c2918e483584c3..ee2830362ba04776799bb6ed748d24f4c4927194 100644 (file)
@@ -39,6 +39,7 @@ use Friendica\Model\ItemURI;
 use Friendica\Model\ItemDeliveryData;
 use Friendica\Model\Mail;
 use Friendica\Model\Profile;
+use Friendica\Model\Tag;
 use Friendica\Model\Term;
 use Friendica\Model\User;
 use Friendica\Network\Probe;
@@ -1850,25 +1851,6 @@ class Diaspora
                }
        }
 
-       private static function storeTags(int $uriid, string $body)
-       {
-               $tags = BBCode::getTags($body);
-               if (empty($tags)) {
-                       return;
-               }
-
-               foreach ($tags as $tag) {
-                       if ((substr($tag, 0, 1) != Term::TAG_CHARACTER[Term::HASHTAG]) || (strlen($tag) <= 1)) {
-                               Logger::info('Skip tag', ['uriid' => $uriid, 'tag' => $tag]);
-                               continue;
-                       }
-
-                       $fields = ['uri-id' => $uriid, 'name' => substr($tag, 1, 64), 'type' => Term::HASHTAG];
-                       DBA::insert('tag', $fields, true);
-                       Logger::info('Stored tag', ['uriid' => $uriid, 'tag' => $tag, 'fields' => $fields]);
-               }
-       }
-
        /**
         * Processes an incoming comment
         *
@@ -1963,7 +1945,7 @@ class Diaspora
                $datarray["body"] = self::replacePeopleGuid($body, $person["url"]);
 
                self::storeMentions($datarray['uri-id'], $text);
-               self::storeTags($datarray['uri-id'], $datarray["body"]);
+               Tag::storeFromBody($datarray['uri-id'], $datarray["body"]);
 
                self::fetchGuid($datarray);