]> git.mxchange.org Git - friendica.git/commitdiff
hashtag autocomplete
authorrabuzarus <rabuzarus@t-online.de>
Fri, 16 Mar 2018 12:55:26 +0000 (13:55 +0100)
committerrabuzarus <rabuzarus@t-online.de>
Fri, 16 Mar 2018 12:55:26 +0000 (13:55 +0100)
src/Module/Hashtag.php [new file with mode: 0644]
view/js/autocomplete.js

diff --git a/src/Module/Hashtag.php b/src/Module/Hashtag.php
new file mode 100644 (file)
index 0000000..879b27e
--- /dev/null
@@ -0,0 +1,36 @@
+<?php
+/**
+ * @file src/Module/Hashtag.php
+ */
+namespace Friendica\Module;
+
+use Friendica\BaseModule;
+use Friendica\Core\System;
+use dba;
+
+/**
+ * Hashtag module.
+ */
+class Hashtag extends BaseModule {
+
+       public static function init()
+{
+               $result = [];
+
+               $t = escape_tags($_REQUEST['t']);
+               if (empty($t)) {
+                       System::jsonExit($result);
+               }
+
+               $taglist = dba::p("SELECT DISTINCT(`term`) FROM `term` WHERE `term` LIKE ? AND `type` = ? ORDER BY `term`",
+                       $t . '%',
+                       intval(TERM_HASHTAG)
+               );
+               while ($tag = dba::fetch($taglist)) {
+                       $result[] = ['text' => strtolower($tag['term'])];
+               }
+               dba::close($taglist);
+
+               System::jsonExit($result);
+       }
+}
index 219ad794bc86a4b18a34626ad4c691bf36a3b18b..eb9d5efbea9bdccd99c1614592d1afdb1ed27ee5 100644 (file)
@@ -77,6 +77,10 @@ function contact_format(item) {
                return "<div>" + item.text + "</div>";
 }
 
+function tag_format(item) {
+       return "<div class='dropdown-item'>" + '#' + item.text + "</div>";
+}
+
 function editor_replace(item) {
        if (typeof item.replace !== 'undefined') {
                return '$1$2' + item.replace;
@@ -212,6 +216,15 @@ function string2bb(element) {
                        template: contact_format,
                };
 
+               // Autocomplete hashtags
+               tags = {
+                       match: /(^|\s)(\#)([^ \n]{2,})$/,
+                       index: 3,
+                       search: function(term, callback) { $.getJSON(baseurl + '/hashtag/' + '?f=&t=' + term).done(function(data) { callback($.map(data, function(entry) { return entry.text.indexOf(term) === 0 ? entry : null; })); }); },
+                       replace: function(item) { return "$1$2" + item.text + ' '; },
+                       template: tag_format
+               };
+
                // Autocomplete smilies e.g. ":like"
                smilies = {
                        match: /(^|\s)(:[a-z]{2,})$/,
@@ -222,7 +235,7 @@ function string2bb(element) {
                };
 
                this.attr('autocomplete','off');
-               this.textcomplete([contacts, forums, smilies], {className:'acpopup', zIndex:10000});
+               this.textcomplete([contacts, forums, smilies, tags], {className:'acpopup', zIndex:10000});
        };
 })( jQuery );
 
@@ -248,8 +261,18 @@ function string2bb(element) {
                        replace: webbie_replace,
                        template: contact_format,
                };
+
+               // Autocomplete hashtags
+               tags = {
+                       match: /(^|\s)(\#)([^ \n]{2,})$/,
+                       index: 3,
+                       search: function(term, callback) { $.getJSON(baseurl + '/hashtag/' + '?f=&t=' + term).done(function(data) { callback($.map(data, function(entry) { return entry.text.indexOf(term) === 0 ? entry : null; })); }); },
+                       replace: function(item) { return "$1$2" + item.text; },
+                       template: tag_format
+               };
+
                this.attr('autocomplete', 'off');
-               var a = this.textcomplete([contacts, community], {className:'acpopup', maxCount:100, zIndex: 10000, appendTo:'nav'});
+               var a = this.textcomplete([contacts, community, tags], {className:'acpopup', maxCount:100, zIndex: 10000, appendTo:'nav'});
                a.on('textComplete:select', function(e, value, strategy) { submit_form(this); });
        };
 })( jQuery );