Smarty で携帯絵文字

携帯絵文字変換スクリプトをPHPで作ってみた。 携帯サイトを作ろう! -ちょっと詳しいモバイルサイトの作り方-で変換スクリプトが公開されていたので、Smartyのテンプレートで使えるようにカスタム関数にしてみました。使い方はファイルをlib/plugins/にfunction.emoji.phpなどとして突っ込んで、emoji.csvを呼び出しスクリプトと同じ場所に置けばOK。

カスタム関数を書きなれてないので間違ってるかも知れないけども・・。

<?php
//携帯端末のユーザエージェントを判定
function mobile($data)
{
	if (preg_match("/^DoCoMo\/[12]\.0/i", $data)) {
		return "i";	// i-mode
	} else if (preg_match("/^(J\-PHONE|Vodafone|MOT\-[CV]980|SoftBank)\//i", $data)) {
		return "s";	// softbank
	} else if (preg_match("/^KDDI\-/i", $data) || preg_match("/UP\.Browser/i", $data)) {
		return "e";	// ezweb
	} else if (preg_match("/^PDXGW/i", $data) || preg_match("/(DDIPOCKET|WILLCOM);/i", $data)) {
		return "w";	// willcom
	} else if (preg_match("/^L\-mode/i", $data)) {
		return "l";	// l-mode
	} else {
		return "p";	// pc
	}
}

//携帯キャリアに合わせて絵文字を出力
function emoji($data, $emoji_array)
{

	//携帯UA取得
	$agent = $_SERVER["HTTP_USER_AGENT"];
	if(preg_match("/[0-9]{1,3}/", $data) && is_numeric($data) && 0 < $data && $data < 253) {
		switch (mobile($agent)) {
			case "i";
				$put = $emoji_array[$data][1];
				break;
			case "e";
				if (preg_match("/[^0-9]/", $emoji_array[$data][2])) {
					$put = $emoji_array[$data][2];
				} else {
					$put = "<img localsrc=\"".$emoji_array[$data][2]."\" />";
				}
				break;
			case "s";
				if (preg_match("/^[A-Z]{1}?/", $emoji_array[$data][3])) {
					$put = "\x1B\$".$emoji_array[$data][3]."\x0F";
				} else {
					$put = $emoji_array[$data][3];
				}
				break;
			case "p";
				$put = "[PCでは絵文字は表示されません]";
				break;
		}
		return $put;
	} else {
		return "[Error!]\n";
	}
}

function encode($data) {
	$data = mb_convert_encoding($data, "SJIS", "auto");
	return $data;
}

function smarty_function_emoji($params, &$smarty)
{

	if (!isset($params['num'])) {
		$smarty->trigger_error("emoji: missing 'num' parameter");
		return;
	}

	if($params['num'] == '') {
		return;
	}

	$smarty->_compile_source('evaluated template', $params['num'], $_var_compiled);

	//絵文字変換表
	$emoji_data = "emoji.csv";

	//入力値取得
	$num = $params['num'];

	//変換表を配列に格納
	$emojis = file($emoji_data);
	foreach ($emojis as $num => $line) {
		$line_data = explode(',', $line);
		$emoji_array[$line_data[0]] = $line_data;
	}

	//処理
	$_contents = emoji($params['num'], $emoji_array);

	if (!empty($params['assign'])) {
		$smarty->assign($params['assign'], $_contents);
	} else {
		return $_contents;
	}
}
?>

テンプレート側に記述する時は、

{emoji num="120"}

などとすればOK。


追記

使っていたらエラーが出てしまったので、一部変更。