From 5f7c5e6ab66ff0340a33ea1f2f8b02ee83991d2d Mon Sep 17 00:00:00 2001
From: rabuzarus <>
Date: Mon, 1 Feb 2016 17:43:12 +0100
Subject: [PATCH] rework autocomplete: Access list of smilies over JSON
---
include/network.php | 15 ++++
include/smilies.php | 179 ++++++++++++++++++++++++++++++++++++++++++++
include/text.php | 157 +-------------------------------------
mod/smilies.php | 20 ++++-
4 files changed, 215 insertions(+), 156 deletions(-)
create mode 100644 include/smilies.php
diff --git a/include/network.php b/include/network.php
index c6379e407..84f1297e0 100644
--- a/include/network.php
+++ b/include/network.php
@@ -1344,3 +1344,18 @@ function short_link($url) {
}
return $slinky->short();
}};
+
+/**
+ * @brief Encodes content to json
+ *
+ * This function encodes an array to json format
+ * and adds an application/json HTTP header to the output.
+ * After finishing the process is getting killed.
+ *
+ * @param array $x
+ */
+function json_return_and_die($x) {
+ header("content-type: application/json");
+ echo json_encode($x);
+ killme();
+}
diff --git a/include/smilies.php b/include/smilies.php
new file mode 100644
index 000000000..7b3feefca
--- /dev/null
+++ b/include/smilies.php
@@ -0,0 +1,179 @@
+ smilie shortcut
+ * 'icons' => icon in html
+ *
+ * @hook smilie ('texts' => smilies texts array, 'icons' => smilies html array)
+ */
+ public static function list_smilies() {
+
+ $texts = array(
+ '<3',
+ '</3',
+ '<\\3',
+ ':-)',
+ ';-)',
+ ':-(',
+ ':-P',
+ ':-p',
+ ':-"',
+ ':-"',
+ ':-x',
+ ':-X',
+ ':-D',
+ '8-|',
+ '8-O',
+ ':-O',
+ '\\o/',
+ 'o.O',
+ 'O.o',
+ 'o_O',
+ 'O_o',
+ ":'(",
+ ":-!",
+ ":-/",
+ ":-[",
+ "8-)",
+ ':beer',
+ ':homebrew',
+ ':coffee',
+ ':facepalm',
+ ':like',
+ ':dislike',
+ '~friendica',
+ 'red#',
+ 'red#matrix'
+
+ );
+
+ $icons = array(
+ '',
+ '
',
+ '
',
+ '
',
+ '
',
+ '
',
+ '
',
+ '
',
+ '
',
+ '
',
+ '
',
+ '
',
+ '
',
+ '
',
+ '
',
+ '
',
+ '
',
+ '
',
+ '
',
+ '
',
+ '
',
+ '
',
+ '
',
+ '
',
+ '
',
+ '
',
+ '
',
+ '
',
+ '
',
+ '
',
+ '
',
+ '
',
+ '~friendica
',
+ 'red
matrix',
+ 'red
matrix'
+ );
+
+ $params = array('texts' => $texts, 'icons' => $icons);
+ call_hooks('smilie', $params);
+
+ return $params;
+
+ }
+
+ /**
+ * @brief Replaces text emoticons with graphical images
+ *
+ * It is expected that this function will be called using HTML text.
+ * We will escape text between HTML pre and code blocks from being
+ * processed.
+ *
+ * At a higher level, the bbcode [nosmile] tag can be used to prevent this
+ * function from being executed by the prepare_text() routine when preparing
+ * bbcode source for HTML display
+ *
+ * @param string $s
+ * @param boolean $sample
+ *
+ * @return string
+ */
+ public static function replace($s, $sample = false) {
+ if(intval(get_config('system','no_smilies'))
+ || (local_user() && intval(get_pconfig(local_user(),'system','no_smilies'))))
+ return $s;
+
+ $s = preg_replace_callback('/
(.*?)<\/pre>/ism','self::smile_encode',$s);
+ $s = preg_replace_callback('/(.*?)<\/code>/ism','self::smile_encode',$s);
+
+ $params = self::list_smilies();
+ $params['string'] = $s;
+
+ if($sample) {
+ $s = '';
+ for($x = 0; $x < count($params['texts']); $x ++) {
+ $s .= '- ' . $params['texts'][$x] . '
- ' . $params['icons'][$x] . '
';
+ }
+ }
+ else {
+ $params['string'] = preg_replace_callback('/<(3+)/','self::preg_heart',$params['string']);
+ $s = str_replace($params['texts'],$params['icons'],$params['string']);
+ }
+
+ $s = preg_replace_callback('/(.*?)<\/pre>/ism','self::smile_decode',$s);
+ $s = preg_replace_callback('/(.*?)<\/code>/ism','self::smile_decode',$s);
+
+ return $s;
+ }
+
+ private function smile_encode($m) {
+ return(str_replace($m[1],base64url_encode($m[1]),$m[0]));
+ }
+
+ private function smile_decode($m) {
+ return(str_replace($m[1],base64url_decode($m[1]),$m[0]));
+ }
+
+
+ /**
+ * @brief expand <3333 to the correct number of hearts
+ *
+ * @param string $x
+ * @return string
+ */
+ private function preg_heart($x) {
+ if(strlen($x[1]) == 1)
+ return $x[0];
+ $t = '';
+ for($cnt = 0; $cnt < strlen($x[1]); $cnt ++)
+ $t .= '
';
+ $r = str_replace($x[0],$t,$x[0]);
+ return $r;
+ }
+
+}
diff --git a/include/text.php b/include/text.php
index 4f3af5aee..eb8dde40c 100644
--- a/include/text.php
+++ b/include/text.php
@@ -2,6 +2,7 @@
require_once("include/template_processor.php");
require_once("include/friendica_smarty.php");
+require_once("include/smilies.php");
require_once("include/map.php");
require_once("mod/proxy.php");
@@ -1079,160 +1080,6 @@ function get_mood_verbs() {
return $arr;
}
-
-
-if(! function_exists('smilies')) {
-/**
- * Replaces text emoticons with graphical images
- *
- * It is expected that this function will be called using HTML text.
- * We will escape text between HTML pre and code blocks from being
- * processed.
- *
- * At a higher level, the bbcode [nosmile] tag can be used to prevent this
- * function from being executed by the prepare_text() routine when preparing
- * bbcode source for HTML display
- *
- * @param string $s
- * @param boolean $sample
- * @return string
- * @hook smilie ('texts' => smilies texts array, 'icons' => smilies html array, 'string' => $s)
- */
-function smilies($s, $sample = false) {
- $a = get_app();
-
- if(intval(get_config('system','no_smilies'))
- || (local_user() && intval(get_pconfig(local_user(),'system','no_smilies'))))
- return $s;
-
- $s = preg_replace_callback('/(.*?)<\/pre>/ism','smile_encode',$s);
- $s = preg_replace_callback('/(.*?)<\/code>/ism','smile_encode',$s);
-
- $texts = array(
- '<3',
- '</3',
- '<\\3',
- ':-)',
- ';-)',
- ':-(',
- ':-P',
- ':-p',
- ':-"',
- ':-"',
- ':-x',
- ':-X',
- ':-D',
- '8-|',
- '8-O',
- ':-O',
- '\\o/',
- 'o.O',
- 'O.o',
- 'o_O',
- 'O_o',
- ":'(",
- ":-!",
- ":-/",
- ":-[",
- "8-)",
- ':beer',
- ':homebrew',
- ':coffee',
- ':facepalm',
- ':like',
- ':dislike',
- '~friendica',
- 'red#',
- 'red#matrix'
-
- );
-
- $icons = array(
- '
',
- '
',
- '
',
- '
',
- '
',
- '
',
- '
',
- '
',
- '
',
- '
',
- '
',
- '
',
- '
',
- '
',
- '
',
- '
',
- '
',
- '
',
- '
',
- '
',
- '
',
- '
',
- '
',
- '
',
- '
',
- '
',
- '
',
- '
',
- '
',
- '
',
- '
',
- '
',
- '~friendica
',
- 'red
matrix',
- 'red
matrix'
- );
-
- $params = array('texts' => $texts, 'icons' => $icons, 'string' => $s);
- call_hooks('smilie', $params);
-
- if($sample) {
- $s = '';
- for($x = 0; $x < count($params['texts']); $x ++) {
- $s .= '- ' . $params['texts'][$x] . '
- ' . $params['icons'][$x] . '
';
- }
- }
- else {
- $params['string'] = preg_replace_callback('/<(3+)/','preg_heart',$params['string']);
- $s = str_replace($params['texts'],$params['icons'],$params['string']);
- }
-
- $s = preg_replace_callback('/(.*?)<\/pre>/ism','smile_decode',$s);
- $s = preg_replace_callback('/(.*?)<\/code>/ism','smile_decode',$s);
-
- return $s;
-
-}}
-
-function smile_encode($m) {
- return(str_replace($m[1],base64url_encode($m[1]),$m[0]));
-}
-
-function smile_decode($m) {
- return(str_replace($m[1],base64url_decode($m[1]),$m[0]));
-}
-
-
-/**
- * expand <3333 to the correct number of hearts
- *
- * @param string $x
- * @return string
- */
-function preg_heart($x) {
- $a = get_app();
- if(strlen($x[1]) == 1)
- return $x[0];
- $t = '';
- for($cnt = 0; $cnt < strlen($x[1]); $cnt ++)
- $t .= '
';
- $r = str_replace($x[0],$t,$x[0]);
- return $r;
-}
-
-
if(! function_exists('day_translate')) {
/**
* Translate days and months names
@@ -1549,7 +1396,7 @@ function prepare_text($text) {
if(stristr($text,'[nosmile]'))
$s = bbcode($text);
else
- $s = smilies(bbcode($text));
+ $s = smilies::replace(bbcode($text));
return trim($s);
}}
diff --git a/mod/smilies.php b/mod/smilies.php
index c47f95da7..5a157e368 100644
--- a/mod/smilies.php
+++ b/mod/smilies.php
@@ -1,3 +1,21 @@
argv[1]==="json"){
+ $tmp = smilies::list_smilies();
+ $results = array();
+ for($i = 0; $i < count($tmp['texts']); $i++) {
+ $results[] = array('text' => $tmp['texts'][$i], 'icon' => $tmp['icons'][$i]);
+ }
+ json_return_and_die($results);
+ }
+ else {
+ return smilies('',true);
+ }
+}