OSDN Git Service

Added Emoji Only Mode for CHTML1.0
authorAtsushi Konno <konn@users.sourceforge.jp>
Tue, 3 Mar 2009 03:52:50 +0000 (12:52 +0900)
committerAtsushi Konno <konn@users.sourceforge.jp>
Tue, 3 Mar 2009 03:52:50 +0000 (12:52 +0900)
include/chxj_chtml10.h
include/chxj_specified_device.h
include/mod_chxj.h
src/chxj_chtml10.c
src/mod_chxj.c

index 8f02a4b..9b0eda3 100644 (file)
@@ -52,4 +52,7 @@ extern char *chxj_convert_chtml10(
   chxjconvrule_entry    *entryp, 
   cookie_t              *cookie);
 
+
+extern char *chxj_chtml10_emoji_only_converter(request_rec *r, const char *src, apr_size_t len);
+
 #endif
index 5ea3c16..181fc3f 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,15 @@ 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,
+                   const char       *src,
+                   apr_size_t       len);
 };
 
 extern converter_t convert_routine[];
index 881361d..b52078d 100644 (file)
@@ -378,6 +378,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"
@@ -394,6 +395,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 a840e2b..153bce9 100644 (file)
@@ -574,6 +574,62 @@ s_chtml10_search_emoji(chtml10_t *chtml10, char *txt, char **rslt)
   return 0;
 }
 
+char *
+chxj_chtml10_emoji_only_converter(request_rec *r, const char *src, apr_size_t len)
+{
+  apr_size_t ii;
+  Doc doc;
+  chtml10_t __chtml10;
+  chtml10_t *chtml10;
+  char one_byte[2];
+  char two_byte[3];
+  apr_pool_t *pool;
+
+  chtml10 = &__chtml10;
+
+  DBG(r, "REQ[%X] start chxj_chtml10_emoji_eonly_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, &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);
+    }
+  }
+
+  DBG(r, "REQ[%X] end chxj_chtml10_emoji_eonly_converter()", (apr_size_t)(unsigned int)r);
+  return chtml10->out;
+}
 
 /**
  * It is a handler who processes the HTML tag.
index 2f96bb6..f541d23 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_chtml50,
-    .encoder  = chxj_encoding,
+    .converter            = chxj_convert_chtml50,
+    .encoder              = chxj_encoding,
+    .emoji_only_converter = chxj_chtml50_emoji_only_converter,
   },
   {
     /* CHXJ_SPEC_Chtml_7_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_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,
   },
 };
 
@@ -211,10 +224,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, 
@@ -388,6 +405,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,tmp,*len);
+        }
+        else {
+          dst = convert_routine[spec->html_spec_type].emoji_only_converter(r,*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, 
@@ -400,7 +438,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, 
@@ -2268,6 +2306,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':