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( + '<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 ~friendica', + 'redredmatrix', + 'redredmatrix' + ); + + $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 .= '<3';
+		$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(
-		'<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 ~friendica',
-		'redredmatrix',
-		'redredmatrix'
-	);
-
-	$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 .= '<3';
-	$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);
+	}
+}