diff --git a/include/text.php b/include/text.php index 956344d63d..e2d2e05d37 100644 --- a/include/text.php +++ b/include/text.php @@ -1080,6 +1080,159 @@ 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',
+		'redred#matrix',
+		'redred#matrixmatrix'
+	);
+
+	$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