smilie shortcut
	 *	'icons' => icon in html
	 *
	 * @hook smilie ('texts' => smilies texts array, 'icons' => smilies html array)
	 */
	public static function get_list() {
		$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 HML Output of the Smilie
	 */
	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::encode',$s);
		$s = preg_replace_callback('/(.*?)<\/code>/ism','self::encode',$s);
		$params = self::get_list();
		$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::decode',$s);
		$s = preg_replace_callback('/(.*?)<\/code>/ism','self::decode',$s);
		return $s;
	}
	private function encode($m) {
		return(str_replace($m[1],base64url_encode($m[1]),$m[0]));
	}
	private function 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 HTML Output
	 *
	 * @todo: Rework because it doesn't work correctly
	 */
	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;
	}
}