powered by nequal
Home » sfJpMobilePlugin » Timeline » 939

Changeset 939 -- 2009-06-09 02:50:43

Comment
[Add Tag:Release] sfJpMobilePlugin

Diffs

sfJpMobilePlugin/tags/0.0.2-beta/config/jpmobile/emoji/sb_dec.yml

@@ -0,0 +1,256 @@
+# vim:set expandtab tabstop=2 softtabstop=2 shiftwidth=2:
+# $Id$
+dec:
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": "●"
+  "": "●"
+  "": "●"
+  "": "●"
+  "": "○"
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": "⇔"
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": "Y!"
+  "": "Y!"
+  "": ""
+  "": "D"
+  "": "D"
+  "": "¥"
+  "": "FREE"
+  "": "ID"
+  "": ""
+  "": ""
+  "": "CL"
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": "Q"
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": "♪"
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": "!?"
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": "~"
+  "": "~"
+  "": ""
+  "": "S!"
+  "": "S!"
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": "禁"
+  "": ""
+  "": "合"
+  "": ""
+  "": "⇔"
+  "": "↑↓"
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+

sfJpMobilePlugin/tags/0.0.2-beta/config/jpmobile/emoji/au_dec.yml

@@ -0,0 +1,256 @@
+# vim:set expandtab tabstop=2 softtabstop=2 shiftwidth=2:
+# $Id$
+dec:
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": "○"
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": "D"
+  "": "D"
+  "": "¥"
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": "合"
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+  "": ""
+

sfJpMobilePlugin/tags/0.0.2-beta/config/jpmobile/emoji/dc_dec.yml

@@ -0,0 +1,3 @@
+# vim:set expandtab tabstop=2 softtabstop=2 shiftwidth=2:
+# $Id$
+dec: []

sfJpMobilePlugin/tags/0.0.2-beta/config/jpmobile/emoji/sb_enc.yml

@@ -0,0 +1,231 @@
+# vim:set expandtab tabstop=2 softtabstop=2 shiftwidth=2:
+# $Id$
+enc:
+  "ee818a": ""
+  "ee8189": ""
+  "ee818b": ""
+  "ee8188": ""
+  "ee84bd": ""
+  "ee9183": ""
+  "ee818b": ""
+  "ee90bc": ""
+  "ee88bf": ""
+  "ee8980": ""
+  "ee8981": ""
+  "ee8982": ""
+  "ee8983": ""
+  "ee8984": ""
+  "ee8985": ""
+  "ee8986": ""
+  "ee8987": ""
+  "ee8988": ""
+  "ee8989": ""
+  "ee898a": ""
+  "ee8899": ""
+  "ee8096": ""
+  "ee8094": ""
+  "ee8095": ""
+  "ee8098": ""
+  "ee8093": ""
+  "ee90aa": ""
+  "ee84b2": ""
+  "ee8089": ""
+  "ee809e": ""
+  "ee90b4": ""
+  "ee809f": ""
+  "ee809b": ""
+  "ee90ae": ""
+  "ee809e": ""
+  "ee8882": ""
+  "ee809d": ""
+  "ee80b6": ""
+  "ee80b8": ""
+  "ee8593": ""
+  "ee8595": ""
+  "ee858d": ""
+  "ee8594": ""
+  "ee8598": ""
+  "ee8596": ""
+  "ee80ba": ""
+  "ee858f": ""
+  "ee858e": ""
+  "ee90a8": ""
+  "ee8183": ""
+  "ee8185": ""
+  "ee8184": ""
+  "ee8187": ""
+  "ee84a0": ""
+  "ee84be": ""
+  "ee8c93": ""
+  "ee80bc": ""
+  "ee80bd": ""
+  "ee88b6": ""
+  "ee84a4": ""
+  "ee8c8a": ""
+  "ee9482": ""
+  "ee9483": ""
+  "ee80b7": ""
+  "ee84a5": ""
+  "ee8c8e": ""
+  "ee8888": ""
+  "ee8088": ""
+  "ee8ca3": ""
+  "ee8588": ""
+  "ee8c94": ""
+  "ee8492": ""
+  "ee8d8b": ""
+  "ee8089": ""
+  "ee808a": ""
+  "ee8c81": ""
+  "ee808c": ""
+  "ee84ab": ""
+  "ee84a6": ""
+  "ee888c": ""
+  "ee888e": ""
+  "ee888d": ""
+  "ee888f": ""
+  "ee9099": ""
+  "ee909b": ""
+  "ee8090": ""
+  "ee8091": ""
+  "ee8092": ""
+  "ee88b8": ""
+  "ee88b7": ""
+  "ee94b6": ""
+  "ee8087": ""
+  "ee8494": ""
+  "ee888a": ""
+  "ee8192": ""
+  "ee818f": ""
+  "ee809c": ""
+  "ee80b3": ""
+  "ee88b9": ""
+  "ee8ca4": ""
+  "ee8c8b": ""
+  "ee8c81": ""
+  "ee8081": ""
+  "ee849b": ""
+  "ee8586": ""
+  "ee88b4": ""
+  "ee88b5": ""
+  "ee80a5": ""
+  "ee8484": ""
+  "ee8483": ""
+  "ee808b": ""
+  "ee8483": ""
+  "ee80bf": ""
+  "ee88bd": ""
+  "ee8494": ""
+  "ee8892": ""
+  "ee84b2": ""
+  "ee8891": ""
+  "ee8890": ""
+  "ee889c": ""
+  "ee889d": ""
+  "ee889e": ""
+  "ee889f": ""
+  "ee88a0": ""
+  "ee88a1": ""
+  "ee88a2": ""
+  "ee88a3": ""
+  "ee88a4": ""
+  "ee88a5": ""
+  "ee80a2": ""
+  "ee8ca7": ""
+  "ee80a3": ""
+  "ee8ca7": ""
+  "ee9095": ""
+  "ee8199": ""
+  "ee8198": ""
+  "ee9087": ""
+  "ee9086": ""
+  "ee88b6": ""
+  "ee84a3": ""
+  "ee8c86": ""
+  "ee8083": ""
+  "ee8cae": ""
+  "ee848f": ""
+  "ee8cb4": ""
+  "ee808d": ""
+  "ee8c91": ""
+  "ee8ca6": ""
+  "ee88b8": ""
+  "ee84bc": ""
+  "ee80a1": ""
+  "ee8cb7": ""
+  "ee8cb5": ""
+  "ee8cb1": ""
+  "ee8cb1": ""
+  "ee8cb0": ""
+  "ee8cb2": ""
+  "ee8c99": ""
+  "ee8ca3": ""
+  "ee8c9c": ""
+  "ee8c9b": ""
+  "ee8093": ""
+  "ee8ca5": ""
+  "ee80b6": ""
+  "ee84af": ""
+  "ee808c": ""
+  "ee8ca9": ""
+  "ee8496": ""
+  "ee8c81": ""
+  "ee848e": ""
+  "ee80b4": ""
+  "ee80a9": ""
+  "ee84b6": ""
+  "ee8cb8": ""
+  "ee80a5": ""
+  "ee9083": ""
+  "ee9094": ""
+  "ee9081": ""
+  "ee908f": ""
+  "ee9096": ""
+  "ee908e": ""
+  "ee8486": ""
+  "ee808e": ""
+  "ee9089": ""
+  "ee9085": ""
+  "ee9095": ""
+  "ee9086": ""
+  "ee9082": ""
+  "ee9091": ""
+  "ee9093": ""
+  "ee8cb3": ""
+  "ee8c81": ""
+  "ee898e": ""
+  "ee94b7": ""
+  "ee8495": ""
+  "ee8c95": ""
+  "ee8cb2": ""
+  "ee898f": ""
+  "ee84b7": ""
+  "ee88ab": ""
+  "ee88aa": ""
+  "ee8597": ""
+  "ee90be": ""
+  "ee84ac": ""
+  "ee8490": ""
+  "ee8ca7": ""
+  "ee8c84": ""
+  "ee8d8a": ""
+  "ee8d85": ""
+  "ee8490": ""
+  "ee8498": ""
+  "ee80b0": ""
+  "ee8d82": ""
+  "ee8186": ""
+  "ee8c8b": ""
+  "ee8d80": ""
+  "ee8cb9": ""
+  "ee9181": ""
+  "ee94a3": ""
+  "ee8195": ""
+  "ee8099": ""
+  "ee8196": ""
+  "ee9084": ""
+  "ee809a": ""
+  "ee848b": ""
+  "ee8184": ""
+  "ee908b": ""
+

sfJpMobilePlugin/tags/0.0.2-beta/config/jpmobile/emoji/au_enc.yml

@@ -0,0 +1,251 @@
+# vim:set expandtab tabstop=2 softtabstop=2 shiftwidth=2:
+# $Id$
+enc:
+  "ee9288": ""
+  "ee928d": ""
+  "ee928c": ""
+  "ee9285": ""
+  "ee9287": ""
+  "ee91a9": ""
+  "ee9698": ""
+  "ee8aaf": ""
+  "ee928f": ""
+  "ee9290": ""
+  "ee9291": ""
+  "ee9292": ""
+  "ee9293": ""
+  "ee9294": ""
+  "ee9295": ""
+  "ee9296": ""
+  "ee9297": ""
+  "ee9298": ""
+  "ee9299": ""
+  "ee929a": ""
+  "ee91ab": ""
+  "ee92ba": ""
+  "ee9699": ""
+  "ee92b7": ""
+  "ee92b6": ""
+  "ee89b3": ""
+  "ee969a": ""
+  "ee92b9": ""
+  "ee969b": ""
+  "ee92b5": ""
+  "ee96bc": ""
+  "ee92b0": ""
+  "ee92b1": ""
+  "ee92b1": ""
+  "ee92af": ""
+  "ee8989": ""
+  "ee92b3": ""
+  "ee92ab": ""
+  "ee92ad": ""
+  "ee979e": ""
+  "ee979f": ""
+  "ee92aa": ""
+  "ee92a3": ""
+  "ee8988": ""
+  "ee92a4": ""
+  "ee95b1": ""
+  "ee92a6": ""
+  "ee91aa": ""
+  "ee92a5": ""
+  "ee92ac": ""
+  "ee9697": ""
+  "ee9382": ""
+  "ee9383": ""
+  "ee9396": ""
+  "ee949a": ""
+  "ee9496": ""
+  "ee9483": ""
+  "ee9497": ""
+  "ee9595": ""
+  "ee8aa9": ""
+  "ee9488": ""
+  "ee969c": ""
+  "ee8abc": ""
+  "ee969e": ""
+  "ee929e": ""
+  "ee91bd": ""
+  "ee91be": ""
+  "ee9495": ""
+  "ee929c": ""
+  "ee929f": ""
+  "ee969f": ""
+  "ee938f": ""
+  "ee96a0": ""
+  "ee9696": ""
+  "ee9688": ""
+  "ee8999": ""
+  "ee9482": ""
+  "ee9386": ""
+  "ee948c": ""
+  "ee89ac": ""
+  "ee96a1": ""
+  "ee96a2": ""
+  "ee96a3": ""
+  "ee96a4": ""
+  "ee96a5": ""
+  "ee8cb7": ""
+  "ee96a6": ""
+  "ee96a7": ""
+  "ee958d": ""
+  "ee958c": ""
+  "ee8b9e": ""
+  "ee8b9f": ""
+  "ee93be": ""
+  "ee91bf": ""
+  "ee96a8": ""
+  "ee96a9": ""
+  "ee96aa": ""
+  "ee9286": ""
+  "ee93a1": ""
+  "ee939b": ""
+  "ee92b4": ""
+  "ee9389": ""
+  "ee9596": ""
+  "ee92be": ""
+  "ee929c": ""
+  "eeac83": ""
+  "ee93bc": ""
+  "ee92ab": ""
+  "ee8ab8": ""
+  "ee9592": ""
+  "eeadba": ""
+  "ee9593": ""
+  "ee9694": ""
+  "ee9782": ""
+  "ee8c96": ""
+  "ee94a0": ""
+  "ee95b7": ""
+  "ee95b7": ""
+  "ee94a1": ""
+  "ee95b8": ""
+  "ee898f": ""
+  "ee9499": ""
+  "ee959d": ""
+  "ee96ab": ""
+  "ee9498": ""
+  "ee96b5": ""
+  "ee8ba0": ""
+  "ee95b8": ""
+  "ee8cb8": ""
+  "ee94ac": ""
+  "ee94a2": ""
+  "ee94a3": ""
+  "ee94a4": ""
+  "ee94a5": ""
+  "ee94a6": ""
+  "ee94a7": ""
+  "ee94a8": ""
+  "ee94a9": ""
+  "ee94aa": ""
+  "ee96ac": ""
+  "ee9695": ""
+  "ee8ca9": ""
+  "ee91b7": ""
+  "ee91b8": ""
+  "ee91b1": ""
+  "ee91b2": ""
+  "ee8a8a": ""
+  "eeab83": ""
+  "ee96ae": ""
+  "ee8ba1": ""
+  "ee96be": ""
+  "ee92bc": ""
+  "ee899c": ""
+  "ee93ab": ""
+  "ee89b2": ""
+  "ee91b6": ""
+  "ee93a5": ""
+  "ee93b3": ""
+  "ee91ba": ""
+  "ee9485": ""
+  "ee8ba2": ""
+  "ee91b5": ""
+  "ee9282": ""
+  "ee8ba3": ""
+  "ee8ba4": ""
+  "ee96b0": ""
+  "ee96b1": ""
+  "ee93a6": ""
+  "ee93b4": ""
+  "ee968c": ""
+  "ee8ba5": ""
+  "ee8a9f": ""
+  "ee96b2": ""
+  "ee96b2": ""
+  "ee96b6": ""
+  "ee9484": ""
+  "ee9489": ""
+  "ee8cab": ""
+  "ee92b8": ""
+  "ee9492": ""
+  "ee92ab": ""
+  "ee9387": ""
+  "ee96b8": ""
+  "ee8cac": ""
+  "ee9687": ""
+  "ee92a1": ""
+  "ee9789": ""
+  "ee9494": ""
+  "ee91bc": ""
+  "ee92ae": ""
+  "ee89b5": ""
+  "ee95ba": ""
+  "ee8a87": ""
+  "eeab85": ""
+  "ee96b1": ""
+  "ee9786": ""
+  "ee8c91": ""
+  "ee8a90": ""
+  "ee9784": ""
+  "ee93b9": ""
+  "ee93a7": ""
+  "ee9783": ""
+  "ee8a8c": ""
+  "ee8a89": ""
+  "ee8a86": ""
+  "ee91b3": ""
+  "ee8c9d": ""
+  "ee8a9e": ""
+  "ee92a0": ""
+  "ee9598": ""
+  "ee958e": ""
+  "ee91ab": ""
+  "ee93b1": ""
+  "ee8cad": ""
+  "ee9599": ""
+  "ee9281": ""
+  "ee9284": ""
+  "ee8991": ""
+  "ee8990": ""
+  "ee8cae": ""
+  "ee8caf": ""
+  "ee8987": ""
+  "ee8cb0": ""
+  "ee96bd": ""
+  "ee9493": ""
+  "ee9392": ""
+  "ee93aa": ""
+  "ee8ba9": ""
+  "ee8a80": ""
+  "ee8cb1": ""
+  "ee938e": ""
+  "ee938a": ""
+  "ee9395": ""
+  "ee9390": ""
+  "ee899e": ""
+  "ee96b4": ""
+  "ee89b6": ""
+  "ee8cb2": ""
+  "ee93a0": ""
+  "ee939c": ""
+  "ee929a": ""
+  "ee8a94": ""
+  "ee8cb4": ""
+  "ee9398": ""
+  "ee939e": ""
+  "ee9381": ""
+  "ee9785": ""
+

sfJpMobilePlugin/tags/0.0.2-beta/config/jpmobile/emoji/dc_enc.yml

@@ -0,0 +1,240 @@
+# vim:set expandtab tabstop=2 softtabstop=2 shiftwidth=2:
+# $Id$
+enc:
+  "ee98be": ""
+  "ee98bf": ""
+  "ee9980": ""
+  "ee9981": ""
+  "ee9982": ""
+  "ee9983": ""
+  "ee9984": ""
+  "ee9985": ""
+  "ee9986": ""
+  "ee9987": ""
+  "ee9988": ""
+  "ee9989": ""
+  "ee998a": ""
+  "ee998b": ""
+  "ee998c": ""
+  "ee998d": ""
+  "ee998e": ""
+  "ee998f": ""
+  "ee9990": ""
+  "ee9993": ""
+  "ee9994": ""
+  "ee9995": ""
+  "ee9996": ""
+  "ee9997": ""
+  "ee9998": ""
+  "ee9999": ""
+  "ee999a": ""
+  "ee999b": ""
+  "ee999c": ""
+  "ee999d": ""
+  "ee999f": ""
+  "ee99a0": ""
+  "ee99a1": ""
+  "ee99a2": ""
+  "ee99a4": ""
+  "ee99a5": ""
+  "ee99a6": ""
+  "ee99a7": ""
+  "ee99a8": ""
+  "ee99a9": ""
+  "ee99aa": ""
+  "ee99ab": ""
+  "ee99ac": ""
+  "ee99ad": ""
+  "ee99ae": ""
+  "ee99af": ""
+  "ee99b0": ""
+  "ee99b1": ""
+  "ee99b2": ""
+  "ee99b3": ""
+  "ee99b4": ""
+  "ee99b5": ""
+  "ee99b6": ""
+  "ee99b7": ""
+  "ee99b8": ""
+  "ee99b9": ""
+  "ee99ba": ""
+  "ee99bb": ""
+  "ee99bc": ""
+  "ee99bd": ""
+  "ee99be": ""
+  "ee99bf": ""
+  "ee9a80": ""
+  "ee9a81": ""
+  "ee9a83": ""
+  "ee9a84": ""
+  "ee9a85": ""
+  "ee9a86": ""
+  "ee9a87": ""
+  "ee9a88": ""
+  "ee9a89": ""
+  "ee9a8a": ""
+  "ee9a8b": ""
+  "ee9a8c": ""
+  "ee9a8d": ""
+  "ee9a8e": ""
+  "ee9a8f": ""
+  "ee9a90": ""
+  "ee9a91": ""
+  "ee9a92": ""
+  "ee9a93": ""
+  "ee9a94": ""
+  "ee9a95": ""
+  "ee9a96": ""
+  "ee9a97": ""
+  "ee9a98": ""
+  "ee9a99": ""
+  "ee9a9a": ""
+  "ee9a9b": ""
+  "ee9a9c": ""
+  "ee9a9d": ""
+  "ee9a9e": ""
+  "ee9a9f": ""
+  "ee9aa0": ""
+  "ee9aa1": ""
+  "ee9aa2": ""
+  "ee9aa3": ""
+  "ee9aa4": ""
+  "ee9aa5": ""
+  "ee9aac": ""
+  "ee9aad": ""
+  "ee9ab1": ""
+  "ee9ab3": ""
+  "ee9ab7": ""
+  "ee9ab9": ""
+  "ee9aba": ""
+  "ee9b8e": ""
+  "ee9b8f": ""
+  "ee9b90": ""
+  "ee9b92": ""
+  "ee9b93": ""
+  "ee9b95": ""
+  "ee9b96": ""
+  "ee9b98": ""
+  "ee9b99": ""
+  "ee9b9a": ""
+  "ee9b9b": ""
+  "ee9b9c": ""
+  "ee9b9d": ""
+  "ee9b9e": ""
+  "ee9b9f": ""
+  "ee9ba0": ""
+  "ee9ba1": ""
+  "ee9ba2": ""
+  "ee9ba3": ""
+  "ee9ba4": ""
+  "ee9ba5": ""
+  "ee9ba6": ""
+  "ee9ba7": ""
+  "ee9ba8": ""
+  "ee9ba9": ""
+  "ee9baa": ""
+  "ee9bab": ""
+  "ee9bac": ""
+  "ee9bad": ""
+  "ee9bae": ""
+  "ee9baf": ""
+  "ee9bb0": ""
+  "ee9bb1": ""
+  "ee9bb3": ""
+  "ee9bb4": ""
+  "ee9bb5": ""
+  "ee9bb6": ""
+  "ee9bb7": ""
+  "ee9bb8": ""
+  "ee9bb9": ""
+  "ee9bba": ""
+  "ee9bbb": ""
+  "ee9bbc": ""
+  "ee9bbd": ""
+  "ee9bbe": ""
+  "ee9bbf": ""
+  "ee9c80": ""
+  "ee9c81": ""
+  "ee9c82": ""
+  "ee9c83": ""
+  "ee9c84": ""
+  "ee9c85": ""
+  "ee9c87": ""
+  "ee9c88": ""
+  "ee9c8a": ""
+  "ee9c8b": ""
+  "ee9c8d": ""
+  "ee9c8e": ""
+  "ee9c8f": ""
+  "ee9c90": ""
+  "ee9c91": ""
+  "ee9c92": ""
+  "ee9c93": ""
+  "ee9c94": ""
+  "ee9c95": ""
+  "ee9c96": ""
+  "ee9c97": ""
+  "ee9c98": ""
+  "ee9c99": ""
+  "ee9c9a": ""
+  "ee9c9b": ""
+  "ee9c9c": ""
+  "ee9c9d": ""
+  "ee9c9e": ""
+  "ee9c9f": ""
+  "ee9ca0": ""
+  "ee9ca2": ""
+  "ee9ca3": ""
+  "ee9ca4": ""
+  "ee9ca5": ""
+  "ee9ca6": ""
+  "ee9ca7": ""
+  "ee9ca8": ""
+  "ee9ca9": ""
+  "ee9caa": ""
+  "ee9cab": ""
+  "ee9cac": ""
+  "ee9cad": ""
+  "ee9cae": ""
+  "ee9caf": ""
+  "ee9cb0": ""
+  "ee9cb1": ""
+  "ee9cb2": ""
+  "ee9cb3": ""
+  "ee9cb4": ""
+  "ee9cb5": ""
+  "ee9cb6": ""
+  "ee9cb7": ""
+  "ee9cb8": ""
+  "ee9cb9": ""
+  "ee9cba": ""
+  "ee9cbb": ""
+  "ee9cbc": ""
+  "ee9cbd": ""
+  "ee9cbe": ""
+  "ee9cbf": ""
+  "ee9d80": ""
+  "ee9d81": ""
+  "ee9d82": ""
+  "ee9d83": ""
+  "ee9d84": ""
+  "ee9d85": ""
+  "ee9d86": ""
+  "ee9d87": ""
+  "ee9d88": ""
+  "ee9d89": ""
+  "ee9d8a": ""
+  "ee9d8b": ""
+  "ee9d8c": ""
+  "ee9d8d": ""
+  "ee9d8e": ""
+  "ee9d8f": ""
+  "ee9d90": ""
+  "ee9d91": ""
+  "ee9d92": ""
+  "ee9d93": ""
+  "ee9d94": ""
+  "ee9d95": ""
+  "ee9d96": ""
+  "ee9d97": ""
+

sfJpMobilePlugin/tags/0.0.2-beta/config/config_handlers.yml

@@ -0,0 +1,3 @@
+config/jpmobile/emoji/*.yml:
+  file: %SF_PLUGINS_DIR%/sfJpMobilePlugin/lib/config/sfJpMobileEmojiConfigHandler.class.php
+  class: sfJpMobileEmojiConfigHandler

sfJpMobilePlugin/tags/0.0.2-beta/config/sfJpMobilePluginConfiguration.class.php

@@ -0,0 +1,19 @@
+<?php
+/* vim:set expandtab tabstop=2 softtabstop=2 shiftwidth=2: */
+/**
+ * sfJpMobilePlugin configuration.
+ *
+ * @package     sfJpMobilePlugin
+ * @subpackage  config
+ * @version     $Id$
+ */
+class sfJpMobilePluginConfiguration extends sfPluginConfiguration
+{
+  /**
+   * @see sfPluginConfiguration
+   */
+  public function initialize()
+  {
+    sfJpMobile::initialize();
+  }
+}

sfJpMobilePlugin/tags/0.0.2-beta/lib/device/sfJpMobileDeviceKddi.class.php

@@ -0,0 +1,28 @@
+<?php
+/* vim:set expandtab tabstop=2 softtabstop=2 shiftwidth=2: */
+/**
+ * KDDI用端末オブジェクト
+ *
+ * @package     sfJpMobilePlugin
+ * @subpackage  device
+ * @version     $Id: 3ec9d2ff32ea2e10093131dca1f29b940f2ef230 $
+ */
+class sfJpMobileDeviceKddi extends sfJpMobileDevice
+{
+  protected $_emojiClass = 'sfJpMobileEmojiKddi';
+  protected function _initialize()
+  {
+    $this->_uid = getenv('HTTP_X_UP_SUBNO');
+  }
+  public function parse()
+  {
+    if ($ua = getenv('HTTP_USER_AGENT')) {
+      if (preg_match('/^.+?-([^\s]+)/', $ua, $matches)) {
+        $this->_deviceId = $matches[1];
+      }
+      return null;
+    }
+    throw new sfMobileNotDetermineException('May be access from PC browser');
+  }
+
+}

sfJpMobilePlugin/tags/0.0.2-beta/lib/device/sfJpMobileDevice.class.php

@@ -0,0 +1,86 @@
+<?php
+/* vim:set expandtab tabstop=2 softtabstop=2 shiftwidth=2: */
+/**
+ * sfDevice abstract class
+ * キャリア毎の実装をする際には、このクラスを継承する
+ *
+ * @package     sfJpMobile
+ * @subpackage  device
+ * @version     $Id: 54197c2f015b7e40ff9ef92466479819b5ef72af $
+ */
+abstract class sfJpMobileDevice
+{
+  /**
+   * @var string uid
+   */
+  protected $_uid;
+  /**
+   * @var string model name
+   */
+  protected $_deviceId;
+  /**
+   * @var string emoji class name
+   */
+  protected $_emojiClass = null;
+  /**
+   * @var sfJpMobileEmoji
+   */
+  protected static $_emoji = null;
+  /**
+   * constructor
+   */
+  public function __construct()
+  {
+    $this->parse();
+    $this->_initialize();
+  }
+  /**
+   * initialize
+   * @return null
+   */
+  protected function _initialize(){}
+  /**
+   * parse UserAgent
+   * @throws  sfMobilenotDetermineException
+   * @return  null
+   */
+  public abstract function parse();
+  /**
+   * set emoji object
+   * @param   string  $class
+   * @return  null
+   */
+  public function setEmojiClass($class)
+  {
+    $this->_emojiClass = $class;
+  }
+  /**
+   * get UID
+   * @return  string
+   */
+  public function getUid()
+  {
+    return $this->_uid;
+  }
+  /**
+   * get device id
+   * @return  string
+   */
+  public function getDeviceId()
+  {
+    return $this->_deviceId;
+  }
+
+  /**
+   * get emoji obuject
+   * @return sfJpMobileEmoji
+   */
+  public function getEmoji()
+  {
+    if (!(self::$_emoji instanceof $this->_emojiClass)) {
+      self::$_emoji = new $this->_emojiClass();
+    }
+    return self::$_emoji;
+  }
+
+}

sfJpMobilePlugin/tags/0.0.2-beta/lib/device/sfJpMobileDeviceDocomo.class.php

@@ -0,0 +1,34 @@
+<?php
+/* vim:set expandtab tabstop=2 softtabstop=2 shiftwidth=2: */
+/**
+ * DoCoMo用端末オブジェクト
+ *
+ * @package     sfJpMobile
+ * @subpackage  device
+ * @version     $Id$
+ */
+class sfJpMobileDeviceDocomo extends sfJpMobileDevice
+{
+  protected $_emojiClass = 'sfJpMobileEmojiDocomo';
+  protected function _initialize()
+  {
+    if ($uid = getenv('HTTP_X_DCMGUID')) {
+      $this->_uid = $uid;
+    } else if (array_key_exists('uid', $_GET) && $_GET['uid'] != 'NULLGWDOCOMO') {
+      $this->_uid = $_GET['uid'];
+    } else if (array_key_exists('uid', $_POST) && $_POST['uid'] != 'NULLGWDOCOMO') {
+      $this->_uid = $_POST['uid'];
+    }
+  }
+  public function parse()
+  {
+    if ($ua = getenv('HTTP_USER_AGENT')) {
+      if (preg_match('#^DoCoMo/[12]\.0[/\s]([^/(]+)#', $ua, $matches)) {
+        $this->_deviceId = $matches[1];
+        return null;
+      }
+    }
+    throw new sfMobileNotDetermineException('May be access from PC browser');
+  }
+
+}

sfJpMobilePlugin/tags/0.0.2-beta/lib/device/sfJpMobileDevicePc.class.php

@@ -0,0 +1,22 @@
+<?php
+/* vim:set expandtab tabstop=2 softtabstop=2 shiftwidth=2: */
+/**
+ * PC用端末オブジェクト
+ *
+ * @package     sfJpMobile
+ * @subpackage  device
+ * @version     $Id$
+ */
+class sfJpMobileDevicePc extends sfJpMobileDevice
+{
+  protected $_emojiClass = 'sfJpMobileEmojiPc';
+  protected function _initialize()
+  {
+    $uid = getenv('REMOTE_ADDR');
+  }
+  public function parse()
+  {
+    $this->_deviceId = "PC";
+  }
+
+}

sfJpMobilePlugin/tags/0.0.2-beta/lib/device/sfJpMobileDeviceSoftbank.class.php

@@ -0,0 +1,32 @@
+<?php
+/* vim:set expandtab tabstop=2 softtabstop=2 shiftwidth=2: */
+/**
+ * SoftBank用端末オブジェクト
+ *
+ * @package     sfJpMobilePlugin
+ * @subpackage  device
+ * @version     $Id: e5d7ce4a97e9c6bbc88e82dcf199c81f3bec26cb $
+ */
+class sfJpMobileDeviceSoftbank extends sfJpMobileDevice
+{
+  protected $_emojiClass = 'sfJpMobileEmojiSoftbank';
+  protected function _initialize()
+  {
+    if ($this->_uid = getenv('HTTP_X_JPHONE_UID')) {
+      $this->_uid = substr($this->_uid, 2);
+    };
+  }
+  public function parse()
+  {
+    if ($ua = getenv('HTTP_USER_AGENT')) {
+      if (preg_match('!^MOT-([^/]+)!', $ua, $matches)) {
+        $this->_deviceId = $matches[1];
+      } else if (preg_match('!^.+?/.+?/([^/]+)!', $ua, $matches)) {
+        $this->_deviceId = $matches[1];
+      }
+      return null;
+    }
+    throw new sfMobileNotDetermineException('May be access from PC browser');
+  }
+
+}

sfJpMobilePlugin/tags/0.0.2-beta/lib/helper/JpMobileUrlHelper.php

@@ -0,0 +1,35 @@
+<?php
+/* vim:set expandtab tabstop=2 softtabstop=2 shiftwidth=2: */
+/**
+ * 携帯ページ用ヘルパ
+ *
+ * @package     sfJpMobile
+ * @subpackage  helper
+ * @version     $Id$
+ */
+
+/**
+ * generate URI
+ * @param   string|array  $param
+ * @param   bool          $absolute
+ * @return  string
+ */
+function jpmobile_url_for($param, $absolute = false)
+{
+  $url = url_for($param, $absolute);
+  if (sfJpMobile::isDocomo()) {
+    $url .= "?guid=ON";
+  }
+  return $url;
+}
+/**
+ * a tag
+ * @param  string $name          name of the link, i.e. string to appear between the <a> tags
+ * @param  string $internal_uri  'module/action' or '@rule' of the action
+ * @param  array  $options       additional HTML compliant <a> tag parameters
+ */
+function jpmobile_link_to($name, $internal_uri = '', $options = array())
+{
+  $url = jpmobile_url_for($internal_uri);
+  return link_to($name, $url, $options);
+}
\ No newline at end of file

sfJpMobilePlugin/tags/0.0.2-beta/lib/controller/sfJpMobileController.class.php

@@ -0,0 +1,39 @@
+<?php
+/* vim:set expandtab tabstop=2 softtabstop=2 shiftwidth=2: */
+/**
+ * 携帯ページ用コントローラ
+ *
+ * @package     sfJpMobilePlugin
+ * @subpackage  controller
+ * @version     $Id$
+ */
+class sfJpMobileController extends sfFrontWebController
+{
+  public function getView($moduleName, $actionName, $viewName)
+  {
+    // user view exists?
+    $file = sfConfig::get('sf_app_module_dir') . '/' . $moduleName . '/view/'
+          . $actionName . $viewName . 'View.class.php';
+
+    if (is_readable($file)) {
+      require_once($file);
+
+      $class = $actionName.$viewName.'View';
+
+      // fix for same name classes
+      $moduleClass = $moduleName.'_'.$class;
+
+      if (class_exists($moduleClass, false)) {
+        $class = $moduleClass;
+      }
+    } else {
+      // view class (as configured in module.yml or defined in action)
+      $class = sfConfig::get('app_view_class', 'sfJpMobile').'View';
+      if (!class_exists($class)) {
+        $class = sfConfig::get('mod_'.strtolower($moduleName).'_view_class', 'sfPHP').'View';
+      }
+    }
+
+    return new $class($this->context, $moduleName, $actionName, $viewName);
+  }
+}
\ No newline at end of file

sfJpMobilePlugin/tags/0.0.2-beta/lib/emoji/sfJpMobileEmojiSoftbank.class.php

@@ -0,0 +1,13 @@
+<?php
+/* vim:set expandtab tabstop=2 softtabstop=2 shiftwidth=2: */
+/**
+ * SoftBank絵文字オブジェクト
+ *
+ * @package     sfJpMobile
+ * @subpackage  emoji
+ * @version     $Id: cc34213571e627a190f4758e2ab03b0574131ba0 $
+ */
+class sfJpMobileEmojiSoftbank extends sfJpMobileEmoji
+{
+  protected $_binCodeRegex = '/\xEE[\x80\x81\x84\x85\x88\x89\x8C\x8D\x90\x91\x94][\x80-\xBF]/';
+}

sfJpMobilePlugin/tags/0.0.2-beta/lib/emoji/sfJpMobileEmojiKddi.class.php

@@ -0,0 +1,13 @@
+<?php
+/* vim:set expandtab tabstop=2 softtabstop=2 shiftwidth=2: */
+/**
+ * KDDI絵文字オブジェクト
+ *
+ * @package     sfJpMobile
+ * @subpackage  emoji
+ * @version     $Id: 2bb0147bc2c5d74e3fa9a042ae2cde838ee9c8f3 $
+ */
+class sfJpMobileEmojiKddi extends sfJpMobileEmoji
+{
+  protected $_binCodeRegex = '/\xEE(?:\x88[\xB4-\xBF]|\x8D[\x80-\x82]|\x91[\xA8-\xBF]|\x97[\x80-\x9F]|[\x89-\x8C\x92-\x96][\x80-\xBF])/';
+}

sfJpMobilePlugin/tags/0.0.2-beta/lib/emoji/sfJpMobileEmoji.class.php

@@ -0,0 +1,105 @@
+<?php
+/* vim:set expandtab tabstop=2 softtabstop=2 shiftwidth=2: */
+/**
+ * 基本絵文字クラス
+ *
+ * @package     sfJpMobile
+ * @subpackage  emoji
+ * @version     $Id: c91f5e46986310dd91ad9a92cda78305fa3ebd03 $
+ */
+abstract class sfJpMobileEmoji
+{
+  /**
+   * 変換テーブル
+   * @var array
+   */
+  protected $_decTable;
+  /**
+   * エンコードテーブル
+   * @var array
+   */
+  protected $_encTable;
+  /**
+   * Webコード検出パターン
+   * @var string
+   */
+  protected $_webCodeRegex = '/(&#xE(?:6|7)[A-F0-9]{2};)/i';
+  /**
+   * バイナリコード検出パターン
+   * @var string
+   */
+  protected $_binCodeRegex;
+
+  /**
+   * constructor
+   */
+  public function __construct()
+  {
+    // 絵文字変換テーブルの読み込み
+    include sfContext::getInstance()->getConfigCache()->checkConfig('config/jpmobile/emoji/' . strtolower(sfJpMobile::getShortCarrierName()) . '_dec.yml');
+    include sfContext::getInstance()->getConfigCache()->checkConfig('config/jpmobile/emoji/' . strtolower(sfJpMobile::getShortCarrierName()) . '_enc.yml');
+    $this->_decTable = sfConfig::get('jpmobile_emoji_dec', array());
+    $this->_encTable = sfConfig::get('jpmobile_emoji_enc', array());
+    $this->initialize();
+  }
+  /**
+   * initialize
+   * @return null
+   */
+  public function initialize(){}
+  /**
+   * 変換
+   * @param   string    $str    変換対象
+   * @return  string
+   */
+  public function convert($str)
+  {
+    foreach ($this->findTextCode($str) as $key) {
+      if (array_key_exists($key, $this->_decTable)) {
+        $str = str_replace($key, $this->_decTable[$key], $str);
+      }
+    }
+    return $str;
+  }
+  /**
+   * DoCoMo用16進数コードへのエンコード
+   * @param   string    $str    対象
+   * @return  string
+   */
+  public function encode($str)
+  {
+    foreach ($this->findBin($str) as $bin) {
+      $hex = bin2hex($bin);
+      $replace = array_key_exists($hex, $this->_encTable) ? $this->_encTable[$hex] : '';
+      $str = str_replace($bin, $replace, $str);
+    }
+    return $str;
+  }
+  /**
+   * DoCoMo絵文字テキストコード検出
+   * @param   string    $str    検索対象文字列
+   * @return  array
+   */
+  public function findTextCode($str)
+  {
+    $result = array();
+    if (preg_match_all($this->_webCodeRegex, $str, $matches)) {
+      $matches = array_unique($matches[0]);
+    }
+    return $result;
+  }
+  /**
+   * バイナリ絵文字検出
+   * @param   string    $str    検索対象文字列
+   * @return  array
+   */
+  public function findBin($str)
+  {
+    $result = array();
+    if (preg_match_all($this->_binCodeRegex, $str, $matches)) {
+      $result = array_unique($matches[0]);
+    }
+    return $result;
+  }
+
+}

sfJpMobilePlugin/tags/0.0.2-beta/lib/emoji/sfJpMobileEmojiDocomo.class.php

@@ -0,0 +1,28 @@
+<?php
+/* vim:set expandtab tabstop=2 softtabstop=2 shiftwidth=2: */
+/**
+ * DoCoMo絵文字オブジェクト
+ *
+ * @package     sfJpMobile
+ * @subpackage  emoji
+ * @version     $Id: 4abd1936fb25c82d327150c8a509d6aa86fe9bd9 $
+ */
+class sfJpMobileEmojiDocomo extends sfJpMobileEmoji
+{
+  public function initialize()
+  {
+    $this->_binCodeRegex = '/\xEE(?:'
+                         . '\x98[\xBE-\xBF]'
+                         . '|\x99[\x80-\xBF]'
+                         . '|\x9A[\x80-\xBA]'
+                         . '|\x9B[\x8E-\xBF]'
+                         . '|\x9C[\x80-\xBF]'
+                         . '|\x9D[\x80-\x97]'
+                         . ')/';
+  }
+  public function convert($str)
+  {
+    return $str;
+  }
+
+}

sfJpMobilePlugin/tags/0.0.2-beta/lib/emoji/sfJpMobileEmojiPc.class.php

@@ -0,0 +1,22 @@
+<?php
+/* vim:set expandtab tabstop=2 softtabstop=2 shiftwidth=2: */
+/**
+ * PC用絵文字オブジェクト
+ *
+ * @package     sfJpMobile
+ * @subpackage  emoji
+ * @version     $Id: 5d337a9f05d194c88d800baa2a5d76448fb0fcd4 $
+ */
+class sfJpMobileEmojiPc extends sfJpMobileEmoji
+{
+  public function convert($str)
+  {
+    return $str;
+  }
+  public function findBin($str)
+  {
+    $result = array();
+    return $result;
+  }
+
+}

sfJpMobilePlugin/tags/0.0.2-beta/lib/sfJpMobile.class.php

@@ -0,0 +1,213 @@
+<?php
+/* vim:set expandtab tabstop=2 softtabstop=2 shiftwidth=2: */
+/**
+ * Net_UserAgent_Mobileでは少々腰が重たいので、Railsのjpmobile風な判別方法で
+ *
+ * @package     sfJpMobile
+ * @subpackage  lib
+ * @version     $Id$
+ */
+class sfJpMobile
+{
+  /**
+   * @var sfDevice
+   */
+  private static $_device = null;
+  /**
+   * @var stdClass
+   */
+  private static $_carrier = null;
+  /**
+   * initialize
+   * @return null
+   */
+  public static function initialize()
+  {
+    self::$_carrier = new stdClass();
+  }
+  /**
+   * ドライバの生成
+   * @return sfJpMobileDevice
+   */
+  public static function getDevice()
+  {
+    try {
+      $term = '';
+      switch (true) {
+        case self::isDocomo():
+          $term = 'Docomo';
+          break;
+        case self::isKddi():
+          $term = 'Kddi';
+          break;
+        case self::isSoftbank():
+          $term = 'Softbank';
+          break;
+        /*
+        case self::isWillcom():
+          $term = 'Willcom';
+          break;
+        */
+        default:
+          $term = 'Pc';
+          break;
+      }
+      return self::_termFactory($term);
+    } catch (sfMobileNotDetermineException $e) {
+      return self::_termFactory('Pc');
+    }
+  }
+
+  /**
+   * Deviceクラスのファクトリメソッド
+   * @param   string
+   * @return  sfJpMobileDevice
+   */
+  private static function _termFactory($term)
+  {
+    $class = "sfJpMobileDevice{$term}";
+    if (!(self::$_device instanceof sfDevice)) {
+      self::$_device = new $class;
+    }
+    return self::$_device;
+  }
+
+  /**
+   * UserAgentによるパターン検索
+   * @param		array|string
+   * @return 	boolean
+   * @throws	sfMobileNotDetermineException
+   */
+  private static function _checkCarrier($patterns)
+  {
+    if (!($ua = getenv('HTTP_USER_AGENT'))) {
+      throw new sfMobileNotDetermineException('May be access from PC Browser.');
+    }
+    if (!is_array($patterns)) {
+      $patterns = array($patterns);
+    }
+    foreach ($patterns as $pattern) {
+      if (preg_match($pattern, $ua)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * 携帯かどうか
+   * @return boolean
+   */
+  public static function isMobile()
+  {
+    return self::isDocomo() || self::isKddi() || self::isSoftbank() || self::isWillcom();
+  }
+
+  /**
+   * DoCoMoかどうか
+	 * @return boolean
+   */
+  public static function isDocomo()
+  {
+    if (!isset(self::$_carrier->docomo)) {
+      self::$_carrier->docomo = self::_checkCarrier('/^DoCoMo/');
+    }
+    return self::$_carrier->docomo;
+  }
+
+  /**
+   * KDDIかどうか
+   * @return boolean
+   */
+  public static function isKddi()
+  {
+    if (!isset(self::$_carrier->kddi)) {
+      $patterns = array(
+        '/^KDDI-/',
+        '/^UP\.Browser/',
+      );
+      self::$_carrier->kddi = self::_checkCarrier($patterns);
+    }
+    return self::$_carrier->kddi;
+  }
+
+  /**
+   * SoftBankかどうか
+   * @return boolean
+   */
+  public static function isSoftbank()
+  {
+    if (!isset(self::$_carrier->softbank)) {
+      $patterns = array(
+        '/^SoftBank/',
+        '/^Semulator/',
+        '/^Vodafone/',
+        '/^Vemulator/',
+        '/^MOT-/',
+        '/^MOTEMULATOR/',
+        '/^J-PHONE/',
+        '/^J-EMULATOR/',
+      );
+      self::$_carrier->softbank = self::_checkCarrier($patterns);
+    }
+    return self::$_carrier->softbank;
+  }
+
+  /**
+   * WILLCOMかどうか
+   * @return boolean
+   */
+  public static function isWillcom()
+  {
+    if (!isset(self::$_carrier->willcom)) {
+      self::$_carrier->willcom = self::_checkCarrier('#^Mozilla/3\.0\((?:DDIPOCKET|WILLCOM);#');
+    }
+    return self::$_carrier->willcom;
+  }
+
+  /**
+   * キャリア名の取得
+   * @return string
+   */
+  public static function getCarrierName()
+  {
+    if (self::isDocomo()) {
+      return 'DoCoMo';
+    } else if (self::isKddi()) {
+      return 'KDDI';
+    } else if (self::isSoftbank()) {
+      return 'SoftBank';
+    } else if (self::isWillcom()) {
+      return 'willcom';
+    }
+    return 'PC';
+  }
+
+  /**
+   * 短いキャリア名の取得
+   * @return string
+   */
+  public static function getShortCarrierName()
+  {
+    if (self::isDocomo()) {
+      return 'dc';
+    } else if (self::isKddi()) {
+      return 'au';
+    } else if (self::isSoftbank()) {
+      return 'sb';
+    } else if (self::isWillcom()) {
+      return 'wm';
+    }
+    return 'pc';
+  }
+
+  /**
+   * 絵文字オブジェクトの取得
+   * @return sfJpMobileEmoji
+   */
+  public static function getEmoji()
+  {
+    return self::getDevice()->getEmoji();
+  }
+
+}

sfJpMobilePlugin/tags/0.0.2-beta/lib/storage/sfJpMobileSessionStorage.class.php

@@ -0,0 +1,27 @@
+<?php
+/* vim: set expandtab tabstop=2 softtabstop=2 shiftwidth=2: */
+/**
+ * 携帯用セッションストレージ
+ *
+ * @package       sfJpMobile
+ * @subpackage    storage
+ * @version       $Id$
+ */
+class sfJpMobileSessionStorage extends sfSessionStorage
+{
+  /**
+   * @return null
+   */
+  public function initialize($options = null)
+  {
+    if (sfJpMobile::isMobile()) {
+      ini_set("session.use_trans_sid", 1);
+      ini_set("session.use_cookies", 0);
+      ini_set("session.use_only_cookies", 0);
+    } else {
+      ini_set("session.use_trans_sid", 0);
+      ini_set("session.use_cookies", 1);
+    }
+    parent::initialize($options);
+  }
+}
\ No newline at end of file

sfJpMobilePlugin/tags/0.0.2-beta/lib/config/sfJpMobileEmojiConfigHandler.class.php

@@ -0,0 +1,22 @@
+<?php
+/* vim:set expandtab tabstop=2 softtabstop=2 shiftwidth=2: */
+/**
+ * 絵文字変換テーブルファイル用パーサー
+ *
+ * @package     sfJpMobile
+ * @subpackage  config
+ * @version     $Id$
+ */
+class sfJpMobileEmojiConfigHandler extends sfYamlConfigHandler
+{
+  public function execute($configFiles)
+  {
+    $config = $this->parseYamls($configFiles);
+    $format = "<?php\n"
+            . "// auto-generated by %s\n"
+            . "// date: %s\n"
+            . "sfConfig::add(array('jpmobile_emoji_%s' => %s));"
+            . "";
+    return sprintf($format, __CLASS__, date('Y/m/d H:i:s'), key($config), var_export(current($config), true));
+  }
+}

sfJpMobilePlugin/tags/0.0.2-beta/lib/filter/sfJpMobileFilter.class.php

@@ -0,0 +1,118 @@
+<?php
+/* vim:set expandtab tabstop=2 softtabstop=2 shiftwidth=2: */
+/**
+ * モバイルページ用フィルタ
+ *
+ * @package     sfJpMobile
+ * @subpackage  filter
+ * @version     $Id: bf86adb0f9c5084636a3ffea792b5fbf279a8e4a $
+ */
+class sfJpMobileFilter extends sfFilter
+{
+  /**
+   * @param sfFilter $filterChain
+   */
+  public function execute($filterChain)
+  {
+    if (sfJpMobile::isMobile()) {
+      if ($this->isFirstCall()) {
+        // UIDの取得
+        $this->_canGetUid();
+        // パラメータのUTF-8化
+        $this->_paramConvertToUtf8();
+        // キャッシュ制御設定
+        $this->_setCacheControl();
+        // Content-Typeの設定
+        $this->_setContentType();
+      }
+
+      $filterChain->execute();
+
+      // 出力データの加工
+      $this->_convertContent();
+    } else {
+      $filterChain->execute();
+    }
+  }
+  /**
+   * UIDが取得できる状態かどうか
+   * 取得のためのパラメータが設定されていなかったら、パラメータを付けてリダイレクトする
+   *
+   * @return null
+   */
+  private function _canGetUid()
+  {
+    $context = $this->getContext();
+    $req = $context->getRequest();
+    if ($req->isMethod('get') && sfJpMobile::isDocomo() && $req->getParameter('guid') == null) {
+      $uri = getenv('REQUEST_URI');
+      $uri .= strpos($uri, '?') === false ? '?' : '&';
+      $context->getController()
+              ->getAction($context->getModuleName(), $context->getActionName())
+              ->redirect("{$uri}guid=ON");
+    }
+  }
+  /**
+   * パラメータのUTF-8化
+   * @return null
+   */
+  private function _paramConvertToUtf8()
+  {
+    if (sfJpMobile::isDocomo() || sfJpMobile::isKddi()) {
+      foreach ($this->getContext()->getRequest()->getParameterHolder()->getAll() as $key => $val) {
+        mb_convert_variables('UTF-8', 'SJIS-win,UTF-8', $val);
+        $this->getContext()->getRequest()->setParameter($key, $val);
+      }
+    }
+  }
+  /**
+   * Content-Typeの設定
+   * @return null
+   */
+  private function _setContentType()
+  {
+    $response = $this->getContext()->getResponse();
+    if (sfJpMobile::isDocomo()) {
+      // TODO XHTML対応機種かどうかの判別を入れる
+      $response->setHttpHeader("Content-Type", "application/xhtml+xml; charset=Shift_JIS");
+      $response->setContentType("application/xhtml+xml; charset=Shift_JIS");
+    } else if (sfJpMobile::isKddi()) {
+      $response->setHttpHeader("Content-Type", "text/html; charset=Shift_JIS");
+      $response->setContentType("text/html; charset=Shift_JIS");
+    } else {
+      $response->setHttpHeader("Content-Type", "text/html; charset=UTF-8");
+      $response->setContentType("text/html; charset=UTF-8");
+    }
+  }
+  /**
+   * キャッシュ制御
+   * @return null
+   */
+  private function _setCacheControl()
+  {
+    $response = $this->getContext()->getResponse();
+    $response->setHttpHeader("Expires", "Thu, 01 Dec 1994 16:00:00 GMT");
+    $response->setHttpHeader("Last-Modified", gmdate("D, d M Y H:i:s")." GMT");
+    $response->setHttpHeader("Cache-Control", "no-cache,must-revalidate");
+    $response->setHttpHeader("Cache-Control", "post-check=0,pre-check=0", false);
+    $response->setHttpHeader("Pragma", "no-cache");
+  }
+  /**
+   * 出力コンテンツの変換
+   * @return null
+   */
+  private function _convertContent()
+  {
+    $content = $this->getContext()->getResponse()->getContent();
+    // 絵文字変換
+    if (!sfJpMobile::isDocomo()) {
+      $content = sfJpMobile::getEmoji()->convert($content);
+    }
+    // 出力文字コードの変更
+    if (!sfJpMobile::isMobile() || (!sfJpMobile::isSoftbank() && !sfJpMobile::isWillcom())) {
+      $content = mb_convert_encoding($content, 'SJIS-win', 'UTF-8');
+    }
+    $this->getContext()->getResponse()->setContent($content);
+  }
+
+}

sfJpMobilePlugin/tags/0.0.2-beta/lib/view/sfJpMobileView.class.php

@@ -0,0 +1,26 @@
+<?php
+/* vim:set expandtab tabstop=2 softtabstop=2 shiftwidth=2: */
+/**
+ * 携帯用標準ビュー
+ *
+ * @package     sfJpMobileView
+ * @subpackage  view
+ * @version     $Id$
+ */
+class sfJpMobileView extends sfPHPView
+{
+  protected function renderFile($_sfFile)
+  {
+    $info = pathinfo($_sfFile);
+    $base = "{$info['dirname']}/{$info['filename']}";
+    $filename = $base . ucfirst(strtolower(sfJpMobile::getCarrierName())) . '.' . $info['extension'];
+    if (!is_readable($filename)) {
+      $filename = "{$base}Mobile.{$info['extension']}";
+      if (!sfJpMobile::isMobile() || !is_readable($filename)) {
+        $filename = $_sfFile;
+      }
+    }
+    return parent::renderFile($filename);
+  }
+
+}
\ No newline at end of file

sfJpMobilePlugin/tags/0.0.2-beta/lib/view/sfJpMobilePartialView.class.php

@@ -0,0 +1,26 @@
+<?php
+/* vim:set expandtab tabstop=2 softtabstop=2 shiftwidth=2: */
+/**
+ * 携帯用パーシャルビュー
+ *
+ * @package     sfJpMobileView
+ * @subpackage  view
+ * @version     $Id: 5bbff10933284560e81f720f8647e68ad4033288 $
+ */
+class sfJpMobilePartialView extends sfPartialView
+{
+  protected function renderFile($_sfFile)
+  {
+    $info = pathinfo($_sfFile);
+    $base = "{$info['dirname']}/{$info['filename']}";
+    $filename = $base . ucfirst(strtolower(sfJpMobile::getCarrierName())) . '.' . $info['extension'];
+    if (!is_readable($filename)) {
+      $filename = "{$base}Mobile.{$info['extension']}";
+      if (!sfJpMobile::isMobile() || !is_readable($filename)) {
+        $filename = $_sfFile;
+      }
+    }
+    return parent::renderFile($filename);
+  }
+
+}
\ No newline at end of file

sfJpMobilePlugin/tags/0.0.2-beta/lib/exception/sfMobileNotDetermineException.class.php

@@ -0,0 +1,12 @@
+<?php
+/* vim:set expandtab tabstop=2 softtabstop=2 shiftwidth=2: */
+/**
+ * sfMobileNotDetermineException
+ *
+ * @package     sfJpMobilePlugin
+ * @subpackage  exception
+ * @version     $Id$
+ */
+class sfMobileNotDetermineException extends sfException
+{
+}

sfJpMobilePlugin/tags/0.0.2-beta/modules/jpmobile/templates/_dtd.php

@@ -0,0 +1,13 @@
+<?php echo '<?xml version="1.0" encoding="Shift_JIS"?>' ?>
+<?php if (sfJpMobile::isDocomo()): ?>
+<!DOCTYPE html PUBLIC "-//i-mode group (ja)//DTD XHTML i-XHTML(Locale/Ver.=ja/1.1) 1.0//EN" "i-xhtml_4ja_10.dtd">
+<?php elseif (sfJpMobile::isKddi()): ?>
+<!DOCTYPE html PUBLIC "-//OPENWAVE//DTD XHTML 1.0//EN" "http://www.openwave.com/DTD/xhtml-basic.dtd">
+<?php elseif (sfJpMobile::isSoftbank()): ?>
+<!DOCTYPE html PUBLIC "-//JPHONE//DTD XHTML Basic 1.0 Plus//EN" "xhtml-basic10-plus.dtd">
+<?php else: ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<?php endif; ?>
+
+<?php /* $Id$ */ ?>
+<?php /* vim:set expandtab tabstop=2 softtabstop=2 shiftwidth=2: */ ?>
\ No newline at end of file

sfJpMobilePlugin/tags/0.0.2-beta/README

@@ -0,0 +1,69 @@
+= sfJpMobilePlugin: 携帯サイト作成支援のsymfony用プラグイン
+
+== こんなもの
+symfonyで携帯サイトを作った際に作ったものをプラグインとして抜き出したもの。
+自分の仕事で利用しているので、下位機種はもとより、中位機種の対応すら考慮されてません。
+キャリア判別にはファイアーウォール側でIP判別を行っているので、IPによる判別機能はもっていません。
+
+== 実装機能
+* UserAgentによるキャリア判別
+* 端末IDの取得
+* 契約者番号の取得
+* セッションへの対応
+* 絵文字の相互変換
+* テンプレートの自動振り分け
+
+== 設置方法
+
+=== 利用するコントローラの変更
+apps/*/config/factories.yml
+  all:
+    controlelr:
+      class: sfJpMobileController
+
+=== フィルタの追加
+apps/*/config/filters.ymlの"insert your own filters here"の下
+  jpmobile:
+    class: sfJpMobileFilter
+
+=== ビュー関連の設定
+
+==== クラスの指定
+apps/*/config/app.yml(app/*/modules/*/config/module.yml でもOK)
+  all:
+    view:
+      class: sfJpMobile
+
+==== ヘルパーの利用
+apps/*/config/settings.yml
+  all:
+    standard_helpers:       [Partial, Cache, Form, JpMobileUrl]
+
+==== レイアウトの変更
+自分で宣言してもいいけど、一応DOCTYPEの切り替えパーシャルがプリセットされている。
+
+apps/*/templates/layout.phpのDOCTYPE宣言のところをごっそり
+  <?php include_partial('jpmobile/dtd') ?>
+
+=== セッションの利用
+apps/*/config/factories.yml
+  all:
+    storage:
+      class: sfJpMobileSessionStorage
+      param:
+        session_name: symfony   # ここはお好きな名前で
+
+== テンプレートの振り分けについて
+下記の様にテンプレートファイル名を付けることで、振り分けることが可能です。
+
+* 通常:     indexSuccess.php
+* 携帯共通: indexSuccessMobile.php
+* DoCoMo:   indexSuccessDocomo.php
+* KDDI:     indexSuccessKddi.php
+* SoftBank: indexSuccessSoftbank.php
+* PC:       indexSuccessPc.php
+
+DoCoMoでアクセスした場合、***Docomo -> ***Mobile -> 通常 の順でテンプレートを探します。
+
+=== 副作用
+レイアウトも同様に振り分けられちゃいます。