Namazu-users-ja(旧)


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: mknmz のメタタグの扱い



古川です。

From: knok@xxxxxxxxxxxxx (NOKUBI Takatsugu)
Subject: [namazu-users-ja] Re: mknmz のメタタグの扱い
Date: Tue, 5 Dec 2000 17:44:48 JST

knok>   pl/codeconv.pl の
knok>         my $nkf_opt = "-emXZ1";
knok>   から Z1 を消せば一応変換はしなくなりそうですが、副作用もありそうです...
knok> 
knok> >> # そういうフィルタを書いて、mknmz から呼び出させる方法があるはずだと
knok> >> # 思いますが、具体的な方法は、私は分かりません。
knok> 
knok>   元の encoding も考慮しないといけないので難しそうな気がします。

よく考えてみましたが、その処理は nkf にやってもらうのが、一番いい
と思います。

というわけで、パッチを作ってみました。興味のあるかたはどうぞ。
パッチを当てたら、-Z3 オプションで

    >      >
    <      <
    “”    "
    &      &

の変換をします。pl/codeconv.pl は

         my $nkf_opt = "-emXZ1Z3";

とするとよいでしょう。

1.71 用と 1.92 用のパッチを作りましたが、1.92 用は、-Z1 オプション
のバグ (空白が文字化けする) の修正もしています。


-- 
Rei FURUKAWA 
furukawa@xxxxxxxxxxxx
--- nkf.c.orig	Wed Dec  6 09:50:49 2000
+++ nkf.c	Wed Dec  6 16:56:15 2000
@@ -216,6 +216,7 @@
 /* X0208 -> ASCII converter */
 
 static int             c1_return;
+static char            *c1_entity;
 
 /* fold parameter */
 static int line = 0;    /* chars in line */
@@ -516,6 +517,7 @@
 	    /*  bit:0   Convert X0208
 		bit:1   Convert Kankaku to one space
 		bit:2   Convert Kankaku to two spaces
+		bit:3   Convert HTML Entities
 	    */
 	    if('9'>= *cp && *cp>='0') 
 		alpha_f |= 1<<(*cp++ -'0');
@@ -1110,7 +1112,9 @@
     } else if(c2 == 0) {
         if(c1 == '\n' && add_cr == TRUE) 
             putchar('\r');
-        if(c1 != '\r') 
+        if (c1_entity)
+            while (*c1_entity) putchar(*c1_entity++);
+        else if(c1 != '\r') 
             putchar(c1);
         else if(del_cr == FALSE) 
             putchar(c1);
@@ -1162,7 +1166,9 @@
     else if(c2 == 0) {
         if(c1 == '\n' && add_cr == TRUE) 
             putchar('\r');
-        if(c1 != '\r') 
+        if (c1_entity)
+            while (*c1_entity) putchar(*c1_entity++);
+        else if(c1 != '\r') 
             putchar(c1);
         else if(del_cr == FALSE) 
             putchar(c1);
@@ -1238,7 +1244,9 @@
         }
         if(c1 == '\n' && add_cr == TRUE) 
             putchar('\r');
-        if(c1 != '\r') 
+        if (c1_entity)
+            while (*c1_entity) putchar(*c1_entity++);
+        else if(c1 != '\r') 
             putchar(c1);
         else if(del_cr == FALSE) 
             putchar(c1);
@@ -1447,6 +1455,7 @@
 {
         if(c2) c1 &= 0x7f;
         c1_return = c1;
+        c1_entity = 0;
         if(c2==EOF) return c2;
         c2 &= 0x7f;
         if(rot_f) {
@@ -1475,6 +1484,14 @@
                }
            } else if(0x20<c1 && c1<0x7f && fv[c1-0x20]) {
                c1_return = fv[c1-0x20];
+               if (alpha_f & 0x08){
+                   switch (c1_return){
+                     case '>': c1_entity = "&gt;"; break;
+                     case '<': c1_entity = "&lt;"; break;
+                     case '"': c1_entity = "&quot;"; break;
+                     case '&': c1_entity = "&amp;"; break;
+                   }
+               }
                return 0;
            } 
         }
@@ -1851,7 +1868,8 @@
     fprintf(stderr,"m[BQ0]   MIME decode [B:base64,Q:quoted,0:no decode]\n");
     fprintf(stderr,"l        ISO8859-1 (Latin-1) support\n");
     fprintf(stderr,"f        Folding: -f60 or -f\n");
-    fprintf(stderr,"Z[0-2]   Convert X0208 alphabet to ASCII  1: Kankaku to space,2: 2 spaces\n");
+    fprintf(stderr,"Z[0-3]   Convert X0208 alphabet to ASCII  1: Kankaku to space,2: 2 spaces,\n");
+    fprintf(stderr,"                                          3: Convert HTML Entity\n");
     fprintf(stderr,"X,x      Assume X0201 kana in MS-Kanji, -x preserves X0201 \n");
     fprintf(stderr,"B[0-2]   Broken input  0: missing ESC,1: any X on ESC-[($]-X,2: ASCII on NL\n");
 #ifdef MSDOS
--- nkf.c.orig	Wed Dec  6 10:09:59 2000
+++ nkf.c	Wed Dec  6 14:23:23 2000
@@ -649,6 +649,7 @@
             /*  bit:0   Convert X0208
                 bit:1   Convert Kankaku to one space
                 bit:2   Convert Kankaku to two spaces
+                bit:3   Convert HTML Entity
             */
             if ('9'>= *cp && *cp>='0') 
                 alpha_f |= 1<<(*cp++ -'0');
@@ -1670,6 +1671,7 @@
        if (0x21==c1) {
            if (alpha_f&0x2) {
                c1 = ' ';
+               c2 = 0;
            } else if (alpha_f&0x4) {
                 (*o_zconv)(0,' ');
                 (*o_zconv)(0,' ');
@@ -1678,6 +1680,19 @@
        } else if (0x20<c1 && c1<0x7f && fv[c1-0x20]) {
            c1 = fv[c1-0x20];
            c2 =  0;
+           if (alpha_f&0x8) {
+               char *entity = 0;
+               switch (c1){
+                 case '>': entity = "&gt;"; break;
+                 case '<': entity = "&lt;"; break;
+                 case '"': entity = "&quot;"; break;
+                 case '&': entity = "&amp;"; break;
+               }
+               if (entity){
+                   while (*entity) (*o_zconv)(0, *entity++);
+                   return;
+               }
+           }
        } 
     }
     (*o_zconv)(c2,c1);
@@ -2297,7 +2312,8 @@
     fprintf(stderr,"M[BQ]    MIME encode [B:base64 Q:quoted]\n");
     fprintf(stderr,"l        ISO8859-1 (Latin-1) support\n");
     fprintf(stderr,"f        Folding: -f60 or -f\n");
-    fprintf(stderr,"Z[0-2]   Convert X0208 alphabet to ASCII  1: Kankaku to space,2: 2 spaces\n");
+    fprintf(stderr,"Z[0-3]   Convert X0208 alphabet to ASCII  1: Kankaku to space,2: 2 spaces\n");
+    fprintf(stderr,"         3: Convert HTML Entities\n");
     fprintf(stderr,"X,x      Assume X0201 kana in MS-Kanji, -x preserves X0201\n");
     fprintf(stderr,"B[0-2]   Broken input  0: missing ESC,1: any X on ESC-[($]-X,2: ASCII on NL\n");
 #ifdef MSDOS