OSDN Git Service

Merge branch 'branch_0.13.0' into branch_0.13.0-svn
authorkonn <konn@1a406e8e-add9-4483-a2c8-d8cac5b7c224>
Tue, 3 Mar 2009 17:52:31 +0000 (17:52 +0000)
committerkonn <konn@1a406e8e-add9-4483-a2c8-d8cac5b7c224>
Tue, 3 Mar 2009 17:52:31 +0000 (17:52 +0000)
Conflicts:
etc/device_data.xml

git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/modchxj/mod_chxj/branches/RELEASE_0_13_0@4635 1a406e8e-add9-4483-a2c8-d8cac5b7c224

24 files changed:
ChangeLog
debian-sarge/changelog
debian/changelog
etc/device_data.xml
include/chxj_chtml10.h
include/chxj_chtml20.h
include/chxj_chtml30.h
include/chxj_chtml40.h
include/chxj_chtml50.h
include/chxj_jhtml.h
include/chxj_jxhtml.h
include/chxj_specified_device.h
include/chxj_xhtml_mobile_1_0.h
include/mod_chxj.h
src/chxj_chtml10.c
src/chxj_chtml20.c
src/chxj_chtml30.c
src/chxj_chtml40.c
src/chxj_chtml50.c
src/chxj_jhtml.c
src/chxj_jxhtml.c
src/chxj_tag_util.c
src/chxj_xhtml_mobile_1_0.c
src/mod_chxj.c

index 90d9807..79b7a52 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+libapache2-mod-chxj (0.12.32-1) unstable; urgency=low
+
+  * Added new features.
+    - Added EmojiOnly Option for ChxjConvertRule directive.
+  * Fixed bug.
+    - The conversion of QUERY_STRING in a tag is invalid.
+    - The conversion of QUERY_STRING in form tag is invalid.
+
+ -- Atsushi Konno <konn@users.sourceforge.jp>  Wed,  4 Mar 2009 01:02:19 +0900
+
 libapache2-mod-chxj (0.12.31-1) unstable; urgency=low
 
   * Added new features.
index 90fbd58..00d7c46 100644 (file)
@@ -1,3 +1,13 @@
+libapache2-mod-chxj (0.12.32-1) unstable; urgency=low
+
+  * Added new features.
+    - Added EmojiOnly Option for ChxjConvertRule directive.
+  * Fixed bug.
+    - The conversion of QUERY_STRING in a tag is invalid.
+    - The conversion of QUERY_STRING in form tag is invalid.
+
+ -- Atsushi Konno <konn@users.sourceforge.jp>  Wed,  4 Mar 2009 01:02:19 +0900
+
 libapache2-mod-chxj (0.12.31-1) unstable; urgency=low
 
   * Added new features.
index 7677c27..e2d514d 100644 (file)
@@ -1,3 +1,13 @@
+libapache2-mod-chxj (0.12.32-1) unstable; urgency=low
+
+  * Added new features. 
+    - Added EmojiOnly Option for ChxjConvertRule directive.
+  * Fixed bug.
+    - The conversion of QUERY_STRING in a tag is invalid.
+    - The conversion of QUERY_STRING in form tag is invalid.
+
+ -- Atsushi Konno <konn@users.sourceforge.jp>  Wed,  4 Mar 2009 01:02:19 +0900
+
 libapache2-mod-chxj (0.12.31-1) unstable; urgency=low
 
   * Added new features. 
index ea7bd49..af299fd 100644 (file)
       DoCoMo/2.0 F01A(c100;TB;W30H22)
       DoCoMo/2.0 F01A(c100;TB;W30H15)
       DoCoMo/2.0 F01A(c100;TB;W17H12)
-      DoCoMo/2.0 F01A(c100;TB;W17H8) 
       DoCoMo/2.0 F01A(c100;TB;W40H29)
       DoCoMo/2.0 F01A(c100;TB;W40H20)
       DoCoMo/2.0 F01A(c100;SD)
       DoCoMo/2.0 F01A(c100;TC;W30H22)
       DoCoMo/2.0 F01A(c100;TC;W30H15)
       DoCoMo/2.0 F01A(c100;TC;W17H12)
-      DoCoMo/2.0 F01A(c100;TC;W17H8) 
       DoCoMo/2.0 F01A(c100;TC;W40H29)
       DoCoMo/2.0 F01A(c100;TC;W40H20)
     -->
       <dpi_heigh>96</dpi_heigh>
     </device>
 
+    <!--
+     P-01A
+     DoCoMo/2.0 P01A(c100;SD)
+     DoCoMo/2.0 P01A(c100;SJ)
+     DoCoMo/2.0 P01A(c100;TB;W16H10)
+     DoCoMo/2.0 P01A(c100;TB;W20H13)
+     DoCoMo/2.0 P01A(c100;TB;W24H13)
+     DoCoMo/2.0 P01A(c100;TB;W24H15)
+     DoCoMo/2.0 P01A(c100;TB;W30H19)
+     DoCoMo/2.0 P01A(c100;TC;W16H10)
+     DoCoMo/2.0 P01A(c100;TC;W20H13)
+     DoCoMo/2.0 P01A(c100;TC;W24H13)
+     DoCoMo/2.0 P01A(c100;TC;W24H15)
+     DoCoMo/2.0 P01A(c100;TC;W30H19)
+     DoCoMo/2.0 P01A(c100;TD)
+     DoCoMo/2.0 P01A(c100;TJ)
+    -->
+    <device>
+      <device_id>P01A</device_id>
+      <device_name>DoCoMo P-01A</device_name>
+      <html_spec_type>CHTML_7_0</html_spec_type><!-- IHTML7.2/IXHTML2.3 -->
+      <width>240</width>
+      <heigh>350</heigh>
+      <gif>true</gif>
+      <jpeg>true</jpeg>
+      <png>false</png>
+      <bmp2>false</bmp2>
+      <bmp4>false</bmp4>
+      <color>262144</color>
+      <emoji_type></emoji_type>
+      <wp_width>480</wp_width>
+      <wp_heigh>854</wp_heigh>
+      <cache>102400</cache>
+      <dpi_width>96</dpi_width>
+      <dpi_heigh>96</dpi_heigh>
+    </device>
+
+    <!--
+      SH-01A
+      DoCoMo/2.0 SH01A(c100;SD)
+      DoCoMo/2.0 SH01A(c100;SJ)
+      DoCoMo/2.0 SH01A(c100;TB;W16H08)
+      DoCoMo/2.0 SH01A(c100;TB;W16H10)
+      DoCoMo/2.0 SH01A(c100;TB;W20H10)
+      DoCoMo/2.0 SH01A(c100;TB;W20H13)
+      DoCoMo/2.0 SH01A(c100;TB;W24H12)
+      DoCoMo/2.0 SH01A(c100;TB;W24H16)
+      DoCoMo/2.0 SH01A(c100;TB;W30H15)
+      DoCoMo/2.0 SH01A(c100;TB;W30H20)
+      DoCoMo/2.0 SH01A(c100;TC;W16H08)
+      DoCoMo/2.0 SH01A(c100;TC;W16H10)
+      DoCoMo/2.0 SH01A(c100;TC;W20H10)
+      DoCoMo/2.0 SH01A(c100;TC;W20H13)
+      DoCoMo/2.0 SH01A(c100;TC;W24H12)
+      DoCoMo/2.0 SH01A(c100;TC;W24H16)
+      DoCoMo/2.0 SH01A(c100;TC;W30H15)
+      DoCoMo/2.0 SH01A(c100;TC;W30H20)
+      DoCoMo/2.0 SH01A(c100;TD)
+      DoCoMo/2.0 SH01A(c100;TJ)
+    -->
+    <device>
+      <device_id>SH01A</device_id>
+      <device_name>DoCoMo SH-01A</device_name>
+      <html_spec_type>CHTML_7_0</html_spec_type><!-- IHTML7.2/IXHTML2.3 -->
+      <width>240</width>
+      <heigh>320</heigh>
+      <gif>true</gif>
+      <jpeg>true</jpeg>
+      <png>false</png>
+      <bmp2>false</bmp2>
+      <bmp4>false</bmp4>
+      <color>16777216</color>
+      <emoji_type></emoji_type>
+      <wp_width>480</wp_width>
+      <wp_heigh>854</wp_heigh>
+      <cache>102400</cache>
+      <dpi_width>96</dpi_width>
+      <dpi_heigh>96</dpi_heigh>
+    </device>
+
+
+
+    <!--
+      N-03A
+      DoCoMo/2.0 N03A(c100;TB;W16H10)
+      DoCoMo/2.0 N03A(c100;TB;W20H13)
+      DoCoMo/2.0 N03A(c100;TB;W24H16)
+      DoCoMo/2.0 N03A(c100;TB;W30H20)
+      DoCoMo/2.0 N03A(c100;TC;W16H10)
+      DoCoMo/2.0 N03A(c100;TC;W20H13)
+      DoCoMo/2.0 N03A(c100;TC;W24H16)
+      DoCoMo/2.0 N03A(c100;TC;W30H20)
+      DoCoMo/2.0 N03A(c100;TD)
+      DoCoMo/2.0 N03A(c100;TJ)
+    -->
+    <device>
+      <device_id>N03A</device_id>
+      <device_name>DoCoMo N-03A</device_name>
+      <html_spec_type>CHTML_7_0</html_spec_type><!-- IHTML7.1/IXHTML2.2 -->
+      <width>240</width>
+      <heigh>320</heigh>
+      <gif>true</gif>
+      <jpeg>true</jpeg>
+      <png>false</png>
+      <bmp2>false</bmp2>
+      <bmp4>false</bmp4>
+      <color>262144</color>
+      <emoji_type></emoji_type>
+      <wp_width>240</wp_width>
+      <wp_heigh>427</wp_heigh>
+      <cache>102400</cache>
+      <dpi_width>96</dpi_width>
+      <dpi_heigh>96</dpi_heigh>
+    </device>
+
+
+    <!--
+      N-01A
+      DoCoMo/2.0 N01A(c100;SD)
+      DoCoMo/2.0 N01A(c100;SJ)
+      DoCoMo/2.0 N01A(c100;TB;W16H10)
+      DoCoMo/2.0 N01A(c100;TB;W16H8)
+      DoCoMo/2.0 N01A(c100;TB;W20H10)
+      DoCoMo/2.0 N01A(c100;TB;W20H13)
+      DoCoMo/2.0 N01A(c100;TB;W24H12)
+      DoCoMo/2.0 N01A(c100;TB;W24H16)
+      DoCoMo/2.0 N01A(c100;TB;W30H15)
+      DoCoMo/2.0 N01A(c100;TB;W30H20)
+      DoCoMo/2.0 N01A(c100;TC;W16H10)
+      DoCoMo/2.0 N01A(c100;TC;W20H10)
+      DoCoMo/2.0 N01A(c100;TC;W20H13)
+      DoCoMo/2.0 N01A(c100;TC;W24H12)
+      DoCoMo/2.0 N01A(c100;TC;W24H16)
+      DoCoMo/2.0 N01A(c100;TC;W30H15)
+      DoCoMo/2.0 N01A(c100;TC;W30H20)
+      DoCoMo/2.0 N01A(c100;TD)
+      DoCoMo/2.0 N01A(c100;TJ)
+    -->
+    <device>
+      <device_id>N01A</device_id>
+      <device_name>DoCoMo N-01A</device_name>
+      <html_spec_type>CHTML_7_0</html_spec_type><!-- IHTML7.2/IXHTML2.3 -->
+      <width>240</width>
+      <heigh>320</heigh>
+      <gif>true</gif>
+      <jpeg>true</jpeg>
+      <png>false</png>
+      <bmp2>false</bmp2>
+      <bmp4>false</bmp4>
+      <color>262144</color>
+      <emoji_type></emoji_type>
+      <wp_width>280</wp_width>
+      <wp_heigh>854</wp_heigh>
+      <cache>102400</cache>
+      <dpi_width>96</dpi_width>
+      <dpi_heigh>96</dpi_heigh>
+    </device>
+
+
+    <device>
+      <device_id>UNKNOWN_DEVICE</device_id>
+      <device_name>UNKNOWN DoCoMo Device</device_name>
+      <html_spec_type>CHTML_3_0</html_spec_type>
+      <width>118</width>
+      <heigh>128</heigh>
+      <gif>true</gif>
+      <jpeg>false</jpeg>
+      <png>false</png>
+      <bmp2>false</bmp2>
+      <bmp4>false</bmp4>
+      <color>4096</color>
+      <emoji_type></emoji_type>
+
+      <wp_width>120</wp_width>
+      <wp_heigh>130</wp_heigh>
+      <cache>100000</cache>
+      <dpi_width>96</dpi_width>
+      <dpi_heigh>96</dpi_heigh>
+    </device>
+
   </user_agent>
 
 
index 1f7180a..dda7044 100644 (file)
@@ -64,4 +64,7 @@ extern char *chxj_convert_chtml10(
   chxjconvrule_entry    *entryp, 
   cookie_t              *cookie);
 
+
+extern char *chxj_chtml10_emoji_only_converter(request_rec *r, device_table *spec, const char *src, apr_size_t len);
+
 #endif
index 59b22a5..236d846 100644 (file)
@@ -65,4 +65,6 @@ extern char *chxj_convert_chtml20(
   chxjconvrule_entry    *entryp,
   cookie_t              *cookie);
 
+extern char *chxj_chtml20_emoji_only_converter(request_rec *r, device_table *spec, const char *src, apr_size_t len);
+
 #endif
index 2f4d921..dfcc11e 100644 (file)
@@ -65,4 +65,7 @@ extern char *chxj_convert_chtml30(
   chxjconvrule_entry    *entryp,
   cookie_t              *cookie);
 
+
+extern char *chxj_chtml30_emoji_only_converter(request_rec *r, device_table *spec, const char *src, apr_size_t len);
+
 #endif
index 7f659dc..7b21ef1 100644 (file)
@@ -65,4 +65,6 @@ extern char *chxj_convert_chtml40(
   chxjconvrule_entry    *entryp,
   cookie_t              *cookie);
 
+extern char *chxj_chtml40_emoji_only_converter(request_rec *r, device_table *spec, const char *src, apr_size_t len);
+
 #endif
index aaf4aa0..fbad72b 100644 (file)
@@ -64,4 +64,7 @@ extern char *chxj_convert_chtml50(
   chxjconvrule_entry    *entryp,
   cookie_t              *cookie);
 
+
+extern char *chxj_chtml50_emoji_only_converter(request_rec *r, device_table *spec, const char *src, apr_size_t len);
+
 #endif
index a7f55bb..c56df89 100644 (file)
@@ -71,4 +71,7 @@ extern char *chxj_convert_jhtml(
   chxjconvrule_entry        *entryp,
   cookie_t                  *cookie);
 
+
+extern char *chxj_jhtml_emoji_only_converter(request_rec *r, device_table *spec, const char *src, apr_size_t len);
+
 #endif
index d31e531..5e8e6b2 100644 (file)
@@ -73,4 +73,7 @@ extern char *chxj_convert_jxhtml(
   chxjconvrule_entry        *entryp,
   cookie_t                  *cookie);
 
+
+extern char *chxj_jxhtml_emoji_only_converter(request_rec *r, device_table *spec, const char *src, apr_size_t len);
+
 #endif
index 5ea3c16..9d6abd9 100644 (file)
@@ -102,7 +102,7 @@ typedef struct converter_t converter_t;
 
 struct converter_t {
   /* convert routine */
-  char(*converter)(request_rec                 *r,
+  char *(*converter)(request_rec                 *r,
                      struct device_table_t       *spec,
                      const char                  *src, 
                      apr_size_t                  srclen, 
@@ -110,9 +110,16 @@ struct converter_t {
                      struct chxjconvrule_entry   *entryp,
                      cookie_t                    *cookie);
 
-  char(*encoder)(request_rec  *r,
+  char *(*encoder)(request_rec  *r,
                    const char   *src,
                    apr_size_t   *len);
+
+
+  char *(*emoji_only_converter)(
+                   request_rec           *r,
+                   struct device_table_t *spec,
+                   const char            *src,
+                   apr_size_t            len);
 };
 
 extern converter_t convert_routine[];
index f53e7d8..7cab114 100644 (file)
@@ -65,4 +65,7 @@ extern char *chxj_convert_xhtml_mobile_1_0(
   chxjconvrule_entry    *entryp,
   cookie_t              *cookie);
 
+
+extern char *chxj_xhtml_emoji_only_converter(request_rec *r, device_table *spec, const char *src, apr_size_t len);
+
 #endif
index 5a86d7c..7ca6e1b 100644 (file)
@@ -380,6 +380,7 @@ struct mod_chxj_config {
 #define CONVRULE_QSCONV_OFF_BIT       (0x00000200)
 #define CONVRULE_JRCONV_OFF_BIT       (0x00000400)
 #define CONVRULE_NOCACHE_ON_BIT       (0x00000800)
+#define CONVRULE_EMOJI_ONLY_BIT       (0x00001000)
 
 #define CONVRULE_ENGINE_ON_CMD        "EngineOn"
 #define CONVRULE_ENGINE_OFF_CMD       "EngineOff"
@@ -398,6 +399,7 @@ struct mod_chxj_config {
 #define CONVRULE_QSCONV_OFF_CMD       "QSConvOff"
 #define CONVRULE_JRCONV_OFF_CMD       "JRConvOff"
 #define CONVRULE_NOCACHE_ON_CMD       "NoCacheOn"
+#define CONVRULE_EMOJI_ONLY_CMD       "EmojiOnly"
 
 
 #define CONVRULE_FLAG_NOTMATCH        (0x00000001)
index a3dfc24..e6e3765 100644 (file)
@@ -602,20 +602,77 @@ s_chtml10_search_emoji(chtml10_t *chtml10, char *txt, char **rslt)
     &&  strlen(ee->imode->string) > 0
     &&  *ee->imode->string == *txt
     &&  strncasecmp(ee->imode->string, txt, strlen(ee->imode->string)) == 0) {
-      if (!spec || !spec->emoji_type) {
-        *rslt = apr_palloc(r->pool, 3);
-        (*rslt)[0] = ee->imode->hex1byte & 0xff;
-        (*rslt)[1] = ee->imode->hex2byte & 0xff;
-        (*rslt)[2] = 0;
-        return strlen(ee->imode->string);
-      }
-
-      return 0;
+      *rslt = apr_palloc(r->pool, 3);
+      (*rslt)[0] = ee->imode->hex1byte & 0xff;
+      (*rslt)[1] = ee->imode->hex2byte & 0xff;
+      (*rslt)[2] = 0;
+      return strlen(ee->imode->string);
     }
   }
   return 0;
 }
 
+char *
+chxj_chtml10_emoji_only_converter(request_rec *r, device_table *spec, const char *src, apr_size_t len)
+{
+  apr_size_t ii;
+  Doc __doc;
+  Doc *doc;
+  chtml10_t __chtml10;
+  chtml10_t *chtml10;
+  char one_byte[2];
+  char two_byte[3];
+  apr_pool_t *pool;
+
+  chtml10 = &__chtml10;
+  doc     = &__doc;
+
+  DBG(r, "REQ[%X] start chxj_chtml10_emoji_only_converter()", (apr_size_t)(unsigned int)r);
+  memset(doc,     0, sizeof(Doc));
+  memset(chtml10, 0, sizeof(chtml10_t));
+
+  doc->r        = r;
+  chtml10->doc  = doc;
+  chtml10->spec = spec;
+  chtml10->out  = qs_alloc_zero_byte_string(r->pool);
+  chtml10->conf = chxj_get_module_config(r->per_dir_config, &chxj_module);
+  chtml10->doc->parse_mode = PARSE_MODE_CHTML;
+
+  apr_pool_create(&pool, r->pool);
+
+  chxj_buffered_write_init(pool, &doc->buf);
+
+  for (ii=0; ii<len; ii++) {
+    char *out;
+    int   rtn;
+
+    rtn = s_chtml10_search_emoji(chtml10, (char *)&src[ii], &out);
+    if (rtn) {
+      W_V(out);
+      ii+=(rtn - 1);
+      continue;
+    }
+  
+    if (is_sjis_kanji(src[ii])) {
+      two_byte[0] = src[ii+0];
+      two_byte[1] = src[ii+1];
+      two_byte[2] = 0;
+      W_V(two_byte);
+      ii++;
+    }
+    else {
+      one_byte[0] = src[ii+0];
+      one_byte[1] = 0;
+      W_V(one_byte);
+    }
+  }
+
+  chtml10->out = chxj_buffered_write_flush(chtml10->out, &doc->buf);
+
+  DBG(r, "REQ[%X] end chxj_chtml10_emoji_only_converter()", (apr_size_t)(unsigned int)r);
+  return chtml10->out;
+}
+
 
 /**
  * It is a handler who processes the HTML tag.
index 08120fc..0dc5da0 100644 (file)
@@ -659,6 +659,66 @@ s_chtml20_search_emoji(chtml20_t *chtml20, char *txt, char **rslt)
   return 0;
 }
 
+char *
+chxj_chtml20_emoji_only_converter(request_rec *r, device_table *spec, const char *src, apr_size_t len)
+{
+  apr_size_t ii;
+  Doc __doc;
+  Doc *doc;
+  chtml20_t __chtml20;
+  chtml20_t *chtml20;
+  char one_byte[2];
+  char two_byte[3];
+  apr_pool_t *pool;
+
+  chtml20 = &__chtml20;
+  doc     = &__doc;
+
+  DBG(r, "REQ[%X] start chxj_chtml20_emoji_eonly_converter()", (apr_size_t)(unsigned int)r);
+  memset(doc,     0, sizeof(Doc));
+  memset(chtml20, 0, sizeof(chtml20_t));
+
+  doc->r        = r;
+  chtml20->doc  = doc;
+  chtml20->spec = spec;
+  chtml20->out  = qs_alloc_zero_byte_string(r->pool);
+  chtml20->conf = chxj_get_module_config(r->per_dir_config, &chxj_module);
+  chtml20->doc->parse_mode = PARSE_MODE_CHTML;
+
+  apr_pool_create(&pool, r->pool);
+
+  chxj_buffered_write_init(pool, &doc->buf);
+
+  for (ii=0; ii<len; ii++) {
+    char *out;
+    int   rtn;
+
+    rtn = s_chtml20_search_emoji(chtml20, (char *)&src[ii], &out);
+    if (rtn) {
+      W_V(out);
+      ii+=(rtn - 1);
+      continue;
+    }
+
+    if (is_sjis_kanji(src[ii])) {
+      two_byte[0] = src[ii+0];
+      two_byte[1] = src[ii+1];
+      two_byte[2] = 0;
+      W_V(two_byte);
+      ii++;
+    }
+    else {
+      one_byte[0] = src[ii+0];
+      one_byte[1] = 0;
+      W_V(one_byte);
+    }
+  }
+  chtml20->out = chxj_buffered_write_flush(chtml20->out, &doc->buf);
+
+  DBG(r, "REQ[%X] end chxj_chtml20_emoji_eonly_converter()", (apr_size_t)(unsigned int)r);
+  return chtml20->out;
+}
+
 
 /**
  * It is a handler who processes the HTML tag.
index 644d7bf..632e2a5 100644 (file)
@@ -663,6 +663,67 @@ s_chtml30_search_emoji(chtml30_t *chtml30, char *txt, char **rslt)
 }
 
 
+char *
+chxj_chtml30_emoji_only_converter(request_rec *r, device_table *spec, const char *src, apr_size_t len)
+{
+  apr_size_t ii;
+  Doc __doc;
+  Doc *doc;
+  chtml30_t __chtml30;
+  chtml30_t *chtml30;
+  char one_byte[2];
+  char two_byte[3];
+  apr_pool_t *pool;
+
+  chtml30 = &__chtml30;
+  doc     = &__doc;
+
+  DBG(r, "REQ[%X] start chxj_chtml30_emoji_eonly_converter()", (apr_size_t)(unsigned int)r);
+  memset(doc,     0, sizeof(Doc));
+  memset(chtml30, 0, sizeof(chtml30_t));
+
+  doc->r        = r;
+  chtml30->doc  = doc;
+  chtml30->spec = spec;
+  chtml30->out  = qs_alloc_zero_byte_string(r->pool);
+  chtml30->conf = chxj_get_module_config(r->per_dir_config, &chxj_module);
+  chtml30->doc->parse_mode = PARSE_MODE_CHTML;
+
+  apr_pool_create(&pool, r->pool);
+
+  chxj_buffered_write_init(pool, &doc->buf);
+
+  for (ii=0; ii<len; ii++) {
+    char *out;
+    int   rtn;
+
+    rtn = s_chtml30_search_emoji(chtml30, (char *)&src[ii], &out);
+    if (rtn) {
+      W_V(out);
+      ii+=(rtn - 1);
+      continue;
+    }
+
+    if (is_sjis_kanji(src[ii])) {
+      two_byte[0] = src[ii+0];
+      two_byte[1] = src[ii+1];
+      two_byte[2] = 0;
+      W_V(two_byte);
+      ii++;
+    }
+    else {
+      one_byte[0] = src[ii+0];
+      one_byte[1] = 0;
+      W_V(one_byte);
+    }
+  }
+  chtml30->out = chxj_buffered_write_flush(chtml30->out, &doc->buf);
+
+  DBG(r, "REQ[%X] end chxj_chtml30_emoji_eonly_converter()", (apr_size_t)(unsigned int)r);
+  return chtml30->out;
+}
+
+
 /**
  * It is a handler who processes the HTML tag.
  *
index cc22e4a..5332d44 100644 (file)
@@ -606,6 +606,67 @@ s_chtml40_search_emoji(chtml40_t *chtml40, char *txt, char **rslt)
 }
 
 
+char *
+chxj_chtml40_emoji_only_converter(request_rec *r, device_table *spec, const char *src, apr_size_t len)
+{
+  apr_size_t ii;
+  Doc __doc;
+  Doc *doc;
+  chtml40_t __chtml40;
+  chtml40_t *chtml40;
+  char one_byte[2];
+  char two_byte[3];
+  apr_pool_t *pool;
+
+  chtml40 = &__chtml40;
+  doc     = &__doc;
+
+  DBG(r, "REQ[%X] start chxj_chtml40_emoji_eonly_converter()", (apr_size_t)(unsigned int)r);
+  memset(doc,     0, sizeof(Doc));
+  memset(chtml40, 0, sizeof(chtml40_t));
+
+  doc->r        = r;
+  chtml40->doc  = doc;
+  chtml40->spec = spec;
+  chtml40->out  = qs_alloc_zero_byte_string(r->pool);
+  chtml40->conf = chxj_get_module_config(r->per_dir_config, &chxj_module);
+  chtml40->doc->parse_mode = PARSE_MODE_CHTML;
+
+  apr_pool_create(&pool, r->pool);
+
+  chxj_buffered_write_init(pool, &doc->buf);
+
+  for (ii=0; ii<len; ii++) {
+    char *out;
+    int   rtn;
+
+    rtn = s_chtml40_search_emoji(chtml40, (char *)&src[ii], &out);
+    if (rtn) {
+      W_V(out);
+      ii+=(rtn - 1);
+      continue;
+    }
+
+    if (is_sjis_kanji(src[ii])) {
+      two_byte[0] = src[ii+0];
+      two_byte[1] = src[ii+1];
+      two_byte[2] = 0;
+      W_V(two_byte);
+      ii++;
+    }
+    else {
+      one_byte[0] = src[ii+0];
+      one_byte[1] = 0;
+      W_V(one_byte);
+    }
+  }
+  chtml40->out = chxj_buffered_write_flush(chtml40->out, &doc->buf);
+
+  DBG(r, "REQ[%X] end chxj_chtml40_emoji_eonly_converter()", (apr_size_t)(unsigned int)r);
+  return chtml40->out;
+}
+
+
 /**
  * It is a handler who processes the HTML tag.
  *
index fa6e991..c636800 100644 (file)
@@ -586,6 +586,67 @@ s_chtml50_search_emoji(chtml50_t *chtml50, char *txt, char **rslt)
 }
 
 
+char *
+chxj_chtml50_emoji_only_converter(request_rec *r, device_table *spec, const char *src, apr_size_t len)
+{
+  apr_size_t ii;
+  Doc __doc;
+  Doc *doc;
+  chtml50_t __chtml50;
+  chtml50_t *chtml50;
+  char one_byte[2];
+  char two_byte[3];
+  apr_pool_t *pool;
+
+  chtml50 = &__chtml50;
+  doc     = &__doc;
+
+  DBG(r, "REQ[%X] start chxj_chtml50_emoji_eonly_converter()", (apr_size_t)(unsigned int)r);
+  memset(doc,     0, sizeof(Doc));
+  memset(chtml50, 0, sizeof(chtml50_t));
+
+  doc->r        = r;
+  chtml50->doc  = doc;
+  chtml50->spec = spec;
+  chtml50->out  = qs_alloc_zero_byte_string(r->pool);
+  chtml50->conf = chxj_get_module_config(r->per_dir_config, &chxj_module);
+  chtml50->doc->parse_mode = PARSE_MODE_CHTML;
+
+  apr_pool_create(&pool, r->pool);
+
+  chxj_buffered_write_init(pool, &doc->buf);
+
+  for (ii=0; ii<len; ii++) {
+    char *out;
+    int   rtn;
+
+    rtn = s_chtml50_search_emoji(chtml50, (char *)&src[ii], &out);
+    if (rtn) {
+      W_V(out);
+      ii+=(rtn - 1);
+      continue;
+    }
+
+    if (is_sjis_kanji(src[ii])) {
+      two_byte[0] = src[ii+0];
+      two_byte[1] = src[ii+1];
+      two_byte[2] = 0;
+      W_V(two_byte);
+      ii++;
+    }
+    else {
+      one_byte[0] = src[ii+0];
+      one_byte[1] = 0;
+      W_V(one_byte);
+    }
+  }
+  chtml50->out = chxj_buffered_write_flush(chtml50->out, &doc->buf);
+
+  DBG(r, "REQ[%X] end chxj_chtml50_emoji_eonly_converter()", (apr_size_t)(unsigned int)r);
+  return chtml50->out;
+}
+
+
 /**
  * It is a handler who processes the HTML tag.
  *
index 43f58f4..3ade1bc 100644 (file)
@@ -605,6 +605,67 @@ s_jhtml_search_emoji(jhtml_t *jhtml, char *txt, char **rslt)
 }
 
 
+char *
+chxj_jhtml_emoji_only_converter(request_rec *r, device_table *spec, const char *src, apr_size_t len)
+{
+  apr_size_t ii;
+  Doc __doc;
+  Doc *doc;
+  jhtml_t __jhtml;
+  jhtml_t *jhtml;
+  char one_byte[2];
+  char two_byte[3];
+  apr_pool_t *pool;
+
+  jhtml = &__jhtml;
+  doc   = &__doc;
+
+  DBG(r, "REQ[%X] start chxj_jhtml_emoji_eonly_converter()", (apr_size_t)(unsigned int)r);
+  memset(doc,   0, sizeof(Doc));
+  memset(jhtml, 0, sizeof(jhtml_t));
+
+  doc->r      = r;
+  jhtml->doc  = doc;
+  jhtml->spec = spec;
+  jhtml->out  = qs_alloc_zero_byte_string(r->pool);
+  jhtml->conf = chxj_get_module_config(r->per_dir_config, &chxj_module);
+  jhtml->doc->parse_mode = PARSE_MODE_CHTML;
+
+  apr_pool_create(&pool, r->pool);
+
+  chxj_buffered_write_init(pool, &doc->buf);
+
+  for (ii=0; ii<len; ii++) {
+    char *out;
+    int   rtn;
+
+    rtn = s_jhtml_search_emoji(jhtml, (char *)&src[ii], &out);
+    if (rtn) {
+      W_V(out);
+      ii+=(rtn - 1);
+      continue;
+    }
+
+    if (is_sjis_kanji(src[ii])) {
+      two_byte[0] = src[ii+0];
+      two_byte[1] = src[ii+1];
+      two_byte[2] = 0;
+      W_V(two_byte);
+      ii++;
+    }
+    else {
+      one_byte[0] = src[ii+0];
+      one_byte[1] = 0;
+      W_V(one_byte);
+    }
+  }
+  jhtml->out = chxj_buffered_write_flush(jhtml->out, &doc->buf);
+
+  DBG(r, "REQ[%X] end chxj_jhtml_emoji_eonly_converter()", (apr_size_t)(unsigned int)r);
+  return jhtml->out;
+}
+
+
 /**
  * It is a handler who processes the HTML tag.
  *
index 2142166..7cca2ec 100644 (file)
@@ -602,6 +602,67 @@ s_jxhtml_search_emoji(jxhtml_t *jxhtml, char *txt, char **rslt)
 }
 
 
+char *
+chxj_jxhtml_emoji_only_converter(request_rec *r, device_table *spec, const char *src, apr_size_t len)
+{
+  apr_size_t ii;
+  Doc __doc;
+  Doc *doc;
+  jxhtml_t __jxhtml;
+  jxhtml_t *jxhtml;
+  char one_byte[2];
+  char two_byte[3];
+  apr_pool_t *pool;
+
+  jxhtml = &__jxhtml;
+  doc    = &__doc;
+
+  DBG(r, "REQ[%X] start chxj_jxhtml_emoji_eonly_converter()", (apr_size_t)(unsigned int)r);
+  memset(doc,    0, sizeof(Doc));
+  memset(jxhtml, 0, sizeof(jxhtml_t));
+
+  doc->r       = r;
+  jxhtml->doc  = doc;
+  jxhtml->spec = spec;
+  jxhtml->out  = qs_alloc_zero_byte_string(r->pool);
+  jxhtml->conf = chxj_get_module_config(r->per_dir_config, &chxj_module);
+  jxhtml->doc->parse_mode = PARSE_MODE_CHTML;
+
+  apr_pool_create(&pool, r->pool);
+
+  chxj_buffered_write_init(pool, &doc->buf);
+
+  for (ii=0; ii<len; ii++) {
+    char *out;
+    int   rtn;
+
+    rtn = s_jxhtml_search_emoji(jxhtml, (char *)&src[ii], &out);
+    if (rtn) {
+      W_V(out);
+      ii+=(rtn - 1);
+      continue;
+    }
+
+    if (is_sjis_kanji(src[ii])) {
+      two_byte[0] = src[ii+0];
+      two_byte[1] = src[ii+1];
+      two_byte[2] = 0;
+      W_V(two_byte);
+      ii++;
+    }
+    else {
+      one_byte[0] = src[ii+0];
+      one_byte[1] = 0;
+      W_V(one_byte);
+    }
+  }
+  jxhtml->out = chxj_buffered_write_flush(jxhtml->out, &doc->buf);
+
+  DBG(r, "REQ[%X] end chxj_jxhtml_emoji_eonly_converter()", (apr_size_t)(unsigned int)r);
+  return jxhtml->out;
+}
+
+
 /**
  * It is a handler who processes the HTML tag.
  *
index ab4e648..de6989a 100644 (file)
@@ -468,8 +468,10 @@ chxj_chxjif_is_mine(device_table *spec, Doc *doc, Node *tag)
     if ((*name == 'l' || *name == 'L') && strcasecmp(name, "lang") == 0) {
 
       DBG(r, "lang found [%s] spec [%d]", value, spec->html_spec_type);
-
-      if (STRCASEEQ('x','X',"xhtml",value)) {
+      if (STRCASEEQ('a','A',"all",value)) {
+        return 1;
+      }
+      else if (STRCASEEQ('x','X',"xhtml",value)) {
         if (spec->html_spec_type == CHXJ_SPEC_XHtml_Mobile_1_0) {
           /* Yes , it is mine */
           return 1;
index 57eef5e..cc1f965 100644 (file)
@@ -662,6 +662,67 @@ s_xhtml_search_emoji(xhtml_t *xhtml, char *txt, char **rslt)
 }
 
 
+char *
+chxj_xhtml_emoji_only_converter(request_rec *r, device_table *spec, const char *src, apr_size_t len)
+{
+  apr_size_t ii;
+  Doc __doc;
+  Doc *doc;
+  xhtml_t __xhtml;
+  xhtml_t *xhtml;
+  char one_byte[2];
+  char two_byte[3];
+  apr_pool_t *pool;
+
+  xhtml = &__xhtml;
+  doc   = &__doc;
+
+  DBG(r, "REQ[%X] start chxj_xhtml_emoji_eonly_converter()", (apr_size_t)(unsigned int)r);
+  memset(doc,     0, sizeof(Doc));
+  memset(xhtml, 0, sizeof(xhtml_t));
+
+  doc->r        = r;
+  xhtml->doc  = doc;
+  xhtml->spec = spec;
+  xhtml->out  = qs_alloc_zero_byte_string(r->pool);
+  xhtml->conf = chxj_get_module_config(r->per_dir_config, &chxj_module);
+  xhtml->doc->parse_mode = PARSE_MODE_CHTML;
+
+  apr_pool_create(&pool, r->pool);
+
+  chxj_buffered_write_init(pool, &doc->buf);
+
+  for (ii=0; ii<len; ii++) {
+    char *out;
+    int   rtn;
+
+    rtn = s_xhtml_search_emoji(xhtml, (char *)&src[ii], &out);
+    if (rtn) {
+      W_V(out);
+      ii+=(rtn - 1);
+      continue;
+    }
+
+    if (is_sjis_kanji(src[ii])) {
+      two_byte[0] = src[ii+0];
+      two_byte[1] = src[ii+1];
+      two_byte[2] = 0;
+      W_V(two_byte);
+      ii++;
+    }
+    else {
+      one_byte[0] = src[ii+0];
+      one_byte[1] = 0;
+      W_V(one_byte);
+    }
+  }
+  xhtml->out = chxj_buffered_write_flush(xhtml->out, &doc->buf);
+
+  DBG(r, "REQ[%X] end chxj_xhtml_emoji_eonly_converter()", (apr_size_t)(unsigned int)r);
+  return xhtml->out;
+}
+
+
 /**
  * It is a handler who processes the HTML tag.
  *
index c00b775..c97e2e9 100644 (file)
 converter_t convert_routine[] = {
   {
     /* CHXJ_SPEC_UNKNOWN          */
-    .converter = NULL,
-    .encoder  = NULL,
+    .converter            = NULL,
+    .encoder              = NULL,
+    .emoji_only_converter = NULL,
   },
   {
     /* CHXJ_SPEC_Chtml_1_0        */
-    .converter = chxj_convert_chtml10,
-    .encoder  = chxj_encoding,
+    .converter            = chxj_convert_chtml10,
+    .encoder              = chxj_encoding,
+    .emoji_only_converter = chxj_chtml10_emoji_only_converter,
   },
   {
     /* CHXJ_SPEC_Chtml_2_0        */
-    .converter = chxj_convert_chtml20,
-    .encoder  = chxj_encoding,
+    .converter            = chxj_convert_chtml20,
+    .encoder              = chxj_encoding,
+    .emoji_only_converter = chxj_chtml20_emoji_only_converter,
   },
   {
     /* CHXJ_SPEC_Chtml_3_0        */
-    .converter = chxj_convert_chtml30,
-    .encoder  = chxj_encoding,
+    .converter            = chxj_convert_chtml30,
+    .encoder              = chxj_encoding,
+    .emoji_only_converter = chxj_chtml30_emoji_only_converter,
   },
   {
     /* CHXJ_SPEC_Chtml_4_0        */
-    .converter = chxj_convert_chtml40,
-    .encoder  = chxj_encoding,
+    .converter            = chxj_convert_chtml40,
+    .encoder              = chxj_encoding,
+    .emoji_only_converter = chxj_chtml40_emoji_only_converter,
   },
   {
     /* CHXJ_SPEC_Chtml_5_0        */
-    .converter = chxj_convert_chtml50,
-    .encoder  = chxj_encoding,
+    .converter            = chxj_convert_chtml50,
+    .encoder              = chxj_encoding,
+    .emoji_only_converter = chxj_chtml50_emoji_only_converter,
   },
   {
     /* CHXJ_SPEC_Chtml_6_0        */
     .converter = chxj_convert_ixhtml10,
     .encoder  = chxj_encoding,
+    .emoji_only_converter = chxj_chtml50_emoji_only_converter, /* XXX: TODO */
   },
   {
     /* CHXJ_SPEC_Chtml_7_0        */
     .converter = chxj_convert_ixhtml10,
     .encoder  = chxj_encoding,
+    .emoji_only_converter = chxj_chtml50_emoji_only_converter, /* XXX: TODO */
   },
   {
     /* CHXJ_SPEC_XHtml_Mobile_1_0 */
-    .converter = chxj_convert_xhtml_mobile_1_0,
-    .encoder  = chxj_encoding,
+    .converter            = chxj_convert_xhtml_mobile_1_0,
+    .encoder              = chxj_encoding,
+    .emoji_only_converter = chxj_xhtml_emoji_only_converter,
   },
   {
     /* CHXJ_SPEC_Hdml             */
-    .converter = chxj_convert_hdml,
-    .encoder  = chxj_encoding,
+    .converter            = chxj_convert_hdml,
+    .encoder              = chxj_encoding,
+    .emoji_only_converter = NULL,
   },
   {
     /* CHXJ_SPEC_Jhtml            */
-    .converter = chxj_convert_jhtml,
-    .encoder  = chxj_encoding,
+    .converter            = chxj_convert_jhtml,
+    .encoder              = chxj_encoding,
+    .emoji_only_converter = chxj_jhtml_emoji_only_converter,
   },
   {
     /* CHXJ_SPEC_Jxhtml            */
-    .converter = chxj_convert_jxhtml,
-    .encoder  = chxj_encoding,
+    .converter            = chxj_convert_jxhtml,
+    .encoder              = chxj_encoding,
+    .emoji_only_converter = chxj_jxhtml_emoji_only_converter,
   },
   {
     /* CHXJ_SPEC_HTML             */
     .converter = NULL,
     .encoder  = NULL,
+    .emoji_only_converter = NULL,
   },
 };
 
@@ -213,10 +226,14 @@ chxj_headers_fixup(request_rec *r)
       DBG(r, "REQ[%X] end chxj_headers_fixup() (no pattern)", (unsigned int)(apr_size_t)r);
       return DECLINED;
     }
-    if (!entryp || !(entryp->action & CONVRULE_ENGINE_ON_BIT)) {
+    if (!(entryp->action & CONVRULE_ENGINE_ON_BIT)) {
       DBG(r, "REQ[%X] end chxj_headers_fixup() (engine off)", (unsigned int)(apr_size_t)r);
       return DECLINED;
     }
+    if (entryp->action & CONVRULE_EMOJI_ONLY_BIT) {
+      DBG(r, "REQ[%X] end chxj_headers_fixup() (emoji only)", (unsigned int)(apr_size_t)r);
+      return DECLINED;
+    } 
   
     apr_table_setn(r->headers_in, 
                    CHXJ_HTTP_USER_AGENT, 
@@ -367,7 +384,7 @@ chxj_convert(request_rec *r, const char **src, apr_size_t *len, device_table *sp
    * save cookie.
    */
   cookie = NULL;
-  if (entryp->action & CONVRULE_COOKIE_ON_BIT) {
+  if (entryp->action & CONVRULE_COOKIE_ON_BIT && !(entryp->action & CONVRULE_EMOJI_ONLY_BIT)) {
     switch(spec->html_spec_type) {
     case CHXJ_SPEC_Chtml_1_0:
     case CHXJ_SPEC_Chtml_2_0:
@@ -393,6 +410,27 @@ chxj_convert(request_rec *r, const char **src, apr_size_t *len, device_table *sp
                                                           *src, 
                                                           (apr_size_t *)len);
 
+    if (entryp->action & CONVRULE_EMOJI_ONLY_BIT) {
+      if (convert_routine[spec->html_spec_type].emoji_only_converter) {
+        if (tmp) {
+          dst = convert_routine[spec->html_spec_type].emoji_only_converter(r,spec, tmp,*len);
+        }
+        else {
+          dst = convert_routine[spec->html_spec_type].emoji_only_converter(r,spec, *src,*len);
+        }
+        if (dst != NULL) {
+          *len = strlen(dst);
+        }
+        else {
+          dst = apr_palloc(r->pool, 1);
+          *dst = 0;
+          *len = 0;
+        }
+      }
+      DBG(r, "REQ[%X] end of chxj_convert()(emoji only)", (unsigned int)(apr_size_t)r);
+      return dst;
+    }
+
     if (convert_routine[spec->html_spec_type].converter) {
       if (tmp)
         dst = convert_routine[spec->html_spec_type].converter(r, 
@@ -405,7 +443,7 @@ chxj_convert(request_rec *r, const char **src, apr_size_t *len, device_table *sp
       else
         dst = convert_routine[spec->html_spec_type].converter(r,
                                                               spec, 
-                                                              tmp
+                                                              *src
                                                               *len, 
                                                               len, 
                                                               entryp, 
@@ -2260,6 +2298,10 @@ cmd_convert_rule(cmd_parms *cmd, void *mconfig, const char *arg)
       if (strcasecmp(CONVRULE_ENGINE_OFF_CMD, action) == 0) {
         newrule->action |= CONVRULE_ENGINE_OFF_BIT;
       }
+      else
+      if (strcasecmp(CONVRULE_EMOJI_ONLY_CMD, action) == 0) {
+        newrule->action |= CONVRULE_EMOJI_ONLY_BIT;
+      }
       break;
 
     case 'C':