[w3m-dev 04229] Re: <del>, <s>, <ins>, and so on

Hiroyuki Ito <[email protected]> Thu, 26 Apr 2007 23:00:35 +0900 (JST)
Newsgroups gmane.comp.web.w3m.devel
Message-ID <[email protected]>

> 
> 

>   +	return 1; <== 
> >      case HTML_S:
> 
> 





> % w3m -halfdump -o emacs-w3m 
> 
> 

> [DEL:, :DEL], [S:, :S] 
> <ins>  <U> 

"-o emacs-w3m" 
emacs-w3m 



> (1) emacs-w3m  [DEL:, :DEL], [S:, :S] 
>     
>     => 

[DEL:, :DEL], [S:, :S] 
PE_STAND







> (2) ins tag  <ins><U></U></ins> <ins> 
>     <ins>  <u> emacs-w3m 
>     

 <ins>...</ins> 





Index: file.c
===================================================================
RCS file: /cvsroot/w3m/w3m/file.c,v
retrieving revision 1.251
diff -u -r1.251 file.c
--- file.c	19 Apr 2007 12:00:37 -0000	1.251
+++ file.c	25 Apr 2007 09:23:07 -0000
@@ -2444,6 +2444,8 @@
     obuf->bp.in_bold = obuf->in_bold;
     obuf->bp.in_italic = obuf->in_italic;
     obuf->bp.in_under = obuf->in_under;
+    obuf->bp.in_strike = obuf->in_strike;
+    obuf->bp.in_ins = obuf->in_ins;
     obuf->bp.nobr_level = obuf->nobr_level;
     obuf->bp.prev_ctype = obuf->prev_ctype;
     obuf->bp.init_flag = 0;
@@ -2459,6 +2461,8 @@
     obuf->in_bold = obuf->bp.in_bold;
     obuf->in_italic = obuf->bp.in_italic;
     obuf->in_under = obuf->bp.in_under;
+    obuf->in_strike = obuf->bp.in_strike;
+    obuf->in_ins = obuf->bp.in_ins;
     obuf->prev_ctype = obuf->bp.prev_ctype;
     obuf->pos = obuf->bp.pos;
     obuf->top_margin = obuf->bp.top_margin;
@@ -2481,7 +2485,8 @@
 	case HTML_B:
 	case HTML_U:
 	case HTML_I:
-	    push_link(obuf->tag_stack[i]->cmd, obuf->line->length, obuf->pos);
+	case HTML_S:
+ 	    push_link(obuf->tag_stack[i]->cmd, obuf->line->length, obuf->pos);
 	    break;
 	}
 	Strcat_charp(obuf->line, obuf->tag_stack[i]->cmdname);
@@ -2695,7 +2700,8 @@
     FILE *f = h_env->f;
     Str line = obuf->line, pass = NULL;
     char *hidden_anchor = NULL, *hidden_img = NULL, *hidden_bold = NULL,
-	*hidden_under = NULL, *hidden_italic = NULL, *hidden = NULL;
+	*hidden_under = NULL, *hidden_italic = NULL, *hidden_strike = NULL,
+	*hidden_ins = NULL, *hidden = NULL;;
 
 #ifdef DEBUG
     if (w3m_debug) {
@@ -2745,6 +2751,18 @@
 		hidden = hidden_under;
 	}
     }
+    if (obuf->in_strike) {
+	if ((hidden_strike = has_hidden_link(obuf, HTML_S)) != NULL) {
+	    if (!hidden || hidden_strike < hidden)
+		hidden = hidden_strike;
+	}
+    }
+    if (obuf->in_ins) {
+	if ((hidden_ins = has_hidden_link(obuf, HTML_INS)) != NULL) {
+	    if (!hidden || hidden_ins < hidden)
+		hidden = hidden_ins;
+	}
+    }
     if (hidden) {
 	pass = Strnew_charp(hidden);
 	Strshrink(line, line->ptr + line->length - hidden);
@@ -2772,6 +2790,10 @@
 	Strcat_charp(line, "</i>");
     if (obuf->in_under && !hidden_under)
 	Strcat_charp(line, "</u>");
+    if (obuf->in_strike && !hidden_strike)
+	Strcat_charp(line, "</s>");
+    if (obuf->in_ins && !hidden_ins)
+	Strcat_charp(line, "</ins>");
 
     if (obuf->top_margin > 0) {
 	int i;
@@ -2978,6 +3000,10 @@
 	push_tag(obuf, "<I>", HTML_I);
     if (!hidden_under && obuf->in_under)
 	push_tag(obuf, "<U>", HTML_U);
+    if (!hidden_strike && obuf->in_strike)
+	push_tag(obuf, "<S>", HTML_S);
+    if (!hidden_ins && obuf->in_ins)
+	push_tag(obuf, "<INS>", HTML_INS);
 }
 
 void
@@ -3092,6 +3118,10 @@
 	push_tag(obuf, "</i>", HTML_N_I);
     if (obuf->in_under)
 	push_tag(obuf, "</u>", HTML_N_U);
+    if (obuf->in_strike)
+	push_tag(obuf, "</s>", HTML_N_S);
+    if (obuf->in_ins)
+	push_tag(obuf, "</ins>", HTML_N_INS);
     bzero(obuf->fontstat, FONTSTAT_SIZE);
 }
 
@@ -3109,6 +3139,10 @@
 	push_tag(obuf, "<i>", HTML_I);
     if (obuf->in_under)
 	push_tag(obuf, "<u>", HTML_U);
+    if (obuf->in_strike)
+	push_tag(obuf, "<s>", HTML_S);
+    if (obuf->in_ins)
+	push_tag(obuf, "<ins>", HTML_INS);
 }
 
 static Str
@@ -4984,37 +5018,77 @@
     case HTML_AREA:
 	return 0;
     case HTML_DEL:
-	if (displayInsDel)
-	    HTMLlineproc1("<U>[DEL:</U>", h_env);
-	else
+	obuf->in_strike++;
+	if (displayInsDel) {
+	    if (obuf->in_strike == 1) {
+		push_tag(obuf, "<s>", HTML_S);
+	    }
+	} else {
 	    obuf->flag |= RB_DEL;
+	}
 	return 1;
     case HTML_N_DEL:
-	if (displayInsDel)
-	    HTMLlineproc1("<U>:DEL]</U>", h_env);
-	else
-	    obuf->flag &= ~RB_DEL;
+	if (obuf->in_strike == 0)
+	    return 1;
+	if (obuf->in_strike == 1 && close_effect0(obuf, HTML_S))
+	    obuf->in_strike = 0;
+	if (obuf->in_strike > 0) {
+	    obuf->in_strike--;
+	    if (obuf->in_strike == 0) {
+		push_tag(obuf, "</s>", HTML_N_S);
+	    }
+	}
+	if (obuf->in_strike == 0) {
+	    if (!displayInsDel) {
+		obuf->flag &= ~(RB_DEL | RB_S);
+	    }
+	}
 	return 1;
     case HTML_S:
-	if (displayInsDel)
-	    HTMLlineproc1("<U>[S:</U>", h_env);
-	else
-	    obuf->flag |= RB_S;
+	obuf->in_strike++;
+	if (displayInsDel) {
+	    if (obuf->in_strike == 1) {
+		push_tag(obuf, "<s>", HTML_S);
+	    }
+	} else {
+            obuf->flag |= RB_S;
+	}
 	return 1;
     case HTML_N_S:
-	if (displayInsDel)
-	    HTMLlineproc1("<U>:S]</U>", h_env);
-	else
-	    obuf->flag &= ~RB_S;
+	if (obuf->in_strike == 0)
+	    return 1;
+	if (obuf->in_strike == 1 && close_effect0(obuf, HTML_S))
+	    obuf->in_strike = 0;
+	if (obuf->in_strike > 0) {
+	    obuf->in_strike--;
+	    if (obuf->in_strike == 0) {
+		push_tag(obuf, "</s>", HTML_N_S);
+	    }
+	}
+	if (obuf->in_strike == 0){
+	    if (!displayInsDel) {
+		obuf->flag &= ~(RB_DEL | RB_S);
+	    }
+	}
 	return 1;
     case HTML_INS:
-	if (displayInsDel)
-	    HTMLlineproc1("<U>[INS:</U>", h_env);
+	obuf->in_ins++;
+	if (obuf->in_ins == 1) {
+	    push_tag(obuf, "<ins>", HTML_INS);
+	}
 	return 1;
     case HTML_N_INS:
-	if (displayInsDel)
-	    HTMLlineproc1("<U>:INS]</U>", h_env);
-	return 1;
+	if (obuf->in_ins == 0)
+	    return 1;
+	if (obuf->in_ins == 1 && close_effect0(obuf, HTML_INS))
+	    obuf->in_ins = 0;
+	if (obuf->in_ins > 0) {
+	    obuf->in_ins--;
+	    if (obuf->in_ins == 0) {
+		push_tag(obuf, "</ins>", HTML_N_INS);
+	    }
+	}
+ 	return 1;
     case HTML_SUP:
 	if (!(obuf->flag & (RB_DEL | RB_S)))
 	    HTMLlineproc1("^", h_env);
@@ -5108,6 +5182,26 @@
     return NULL;
 }
 
+static int
+ex_efct(int ex)
+{
+    int effect = 0;
+
+    if (! ex)
+	return 0;
+
+    if (ex & PE_EX_ITALIC)
+	effect |= PE_EX_ITALIC_E;
+
+    if (ex & PE_EX_INSERT)
+	effect |= PE_EX_INSERT_E;
+
+    if (ex & PE_EX_STRIKE)
+	effect |= PE_EX_STRIKE_E;
+
+    return effect;
+}
+
 static void
 HTMLlineproc2body(Buffer *buf, Str (*feed) (), int llimit)
 {
@@ -5188,7 +5282,7 @@
 	while (str < endp) {
 	    PSIZE;
 	    mode = get_mctype(str);
-	    if ((effect | ex_effect) & PC_SYMBOL && *str != '<') {
+	    if ((effect | ex_efct(ex_effect)) & PC_SYMBOL && *str != '<') {
 #ifdef USE_M17N
 		char **buf = set_symbol(symbol_width0);
 		int len;
@@ -5196,16 +5290,16 @@
 		p = buf[(int)symbol];
 		len = get_mclen(p);
 		mode = get_mctype(p);
-		PPUSH(mode | effect | ex_effect, *(p++));
+		PPUSH(mode | effect | ex_efct(ex_effect), *(p++));
 		if (--len) {
 		    mode = (mode & ~PC_WCHAR1) | PC_WCHAR2;
 		    while (len--) {
 			PSIZE;
-			PPUSH(mode | effect | ex_effect, *(p++));
+			PPUSH(mode | effect | ex_efct(ex_effect), *(p++));
 		    }
 		}
 #else
-		PPUSH(PC_ASCII | effect | ex_effect, SYMBOL_BASE + symbol);
+		PPUSH(PC_ASCII | effect | ex_efct(ex_effect), SYMBOL_BASE + symbol);
 #endif
 		str += symbol_width;
 	    }
@@ -5214,12 +5308,12 @@
 #else
 	    else if (mode == PC_CTRL || IS_INTSPACE(*str)) {
 #endif
-		PPUSH(PC_ASCII | effect | ex_effect, ' ');
+		PPUSH(PC_ASCII | effect | ex_efct(ex_effect), ' ');
 		str++;
 	    }
 #ifdef USE_M17N
 	    else if (mode & PC_UNKNOWN) {
-		PPUSH(PC_ASCII | effect | ex_effect, ' ');
+		PPUSH(PC_ASCII | effect | ex_efct(ex_effect), ' ');
 		str += get_mclen(str);
 	    }
 #endif
@@ -5227,13 +5321,13 @@
 #ifdef USE_M17N
 		int len = get_mclen(str);
 #endif
-		PPUSH(mode | effect | ex_effect, *(str++));
+		PPUSH(mode | effect | ex_efct(ex_effect), *(str++));
 #ifdef USE_M17N
 		if (--len) {
 		    mode = (mode & ~PC_WCHAR1) | PC_WCHAR2;
 		    while (len--) {
 			PSIZE;
-			PPUSH(mode | effect | ex_effect, *(str++));
+			PPUSH(mode | effect | ex_efct(ex_effect), *(str++));
 		    }
 		}
 #endif
@@ -5251,12 +5345,12 @@
 #else
 		    if (mode == PC_CTRL || IS_INTSPACE(*str)) {
 #endif
-			PPUSH(PC_ASCII | effect | ex_effect, ' ');
+			PPUSH(PC_ASCII | effect | ex_efct(ex_effect), ' ');
 			p++;
 		    }
 #ifdef USE_M17N
 		    else if (mode & PC_UNKNOWN) {
-			PPUSH(PC_ASCII | effect | ex_effect, ' ');
+			PPUSH(PC_ASCII | effect | ex_efct(ex_effect), ' ');
 			p += get_mclen(p);
 		    }
 #endif
@@ -5264,13 +5358,13 @@
 #ifdef USE_M17N
 			int len = get_mclen(p);
 #endif
-			PPUSH(mode | effect | ex_effect, *(p++));
+			PPUSH(mode | effect | ex_efct(ex_effect), *(p++));
 #ifdef USE_M17N
 			if (--len) {
 			    mode = (mode & ~PC_WCHAR1) | PC_WCHAR2;
 			    while (len--) {
 				PSIZE;
-				PPUSH(mode | effect | ex_effect, *(p++));
+				PPUSH(mode | effect | ex_efct(ex_effect), *(p++));
 			    }
 			}
 #endif
@@ -5295,13 +5389,25 @@
 		case HTML_N_I:
 		    ex_effect &= ~PE_EX_ITALIC;
 		    break;
+		case HTML_INS:
+		    ex_effect |= PE_EX_INSERT;
+		    break;
+		case HTML_N_INS:
+		    ex_effect &= ~PE_EX_INSERT;
+		    break;
 		case HTML_U:
 		    effect |= PE_UNDER;
 		    break;
 		case HTML_N_U:
 		    effect &= ~PE_UNDER;
 		    break;
-		case HTML_A:
+		case HTML_S:
+		    ex_effect |= PE_EX_STRIKE;
+		    break;
+		case HTML_N_S:
+		    ex_effect &= ~PE_EX_STRIKE;
+		    break;
+ 		case HTML_A:
 		    if (renderFrameSet &&
 			parsedtag_get_value(tag, ATTR_FRAMENAME, &p)) {
 			p = url_quote_conv(p, buf->document_charset);
@@ -6553,6 +6659,8 @@
     obuf->in_bold = 0;
     obuf->in_italic = 0;
     obuf->in_under = 0;
+    obuf->in_strike = 0;
+    obuf->in_ins = 0;
     obuf->prev_ctype = PC_ASCII;
     obuf->tag_sp = 0;
     obuf->fontstat_sp = 0;
@@ -6595,6 +6703,14 @@
 	push_tag(obuf, "</u>", HTML_N_U);
 	obuf->in_under = 0;
     }
+    if (obuf->in_strike) {
+	push_tag(obuf, "</s>", HTML_N_S);
+	obuf->in_strike = 0;
+    }
+    if (obuf->in_ins) {
+	push_tag(obuf, "</ins>", HTML_N_INS);
+	obuf->in_ins = 0;
+    }
     if (obuf->flag & RB_INTXTA)
 	HTMLlineproc1("</textarea>", h_env);
     /* for unbalanced select tag */
Index: fm.h
===================================================================
RCS file: /cvsroot/w3m/w3m/fm.h,v
retrieving revision 1.135
diff -u -r1.135 fm.h
--- fm.h	19 Apr 2007 11:42:29 -0000	1.135
+++ fm.h	25 Apr 2007 09:23:07 -0000
@@ -167,7 +167,13 @@
 #define PE_VISITED	0x4000
 
 /* Extra effect */
-#define PE_EX_ITALIC	PE_UNDER
+#define PE_EX_ITALIC	0x01
+#define PE_EX_INSERT	0x02
+#define PE_EX_STRIKE	0x04
+
+#define PE_EX_ITALIC_E	PE_UNDER
+#define PE_EX_INSERT_E	PE_UNDER
+#define PE_EX_STRIKE_E	PE_STAND
 
 #define CharType(c)	((c)&P_CHARTYPE)
 #define CharEffect(c)	((c)&(P_EFFECT|PC_SYMBOL))
@@ -539,7 +545,7 @@
 
 #define FONT_STACK_SIZE 5
 
-#define FONTSTAT_SIZE 5
+#define FONTSTAT_SIZE 7
 
 #define _INIT_BUFFER_WIDTH (COLS - (showLineNum ? 6 : 1))
 #define INIT_BUFFER_WIDTH ((_INIT_BUFFER_WIDTH > 0) ? _INIT_BUFFER_WIDTH : 0)
@@ -588,7 +594,9 @@
 #define in_bold fontstat[0]
 #define in_under fontstat[1]
 #define in_italic fontstat[2]
-#define in_stand fontstat[3]
+#define in_strike fontstat[3]
+#define in_ins fontstat[4]
+#define in_stand fontstat[5]
 
 #define RB_PRE		0x01
 #define RB_SCRIPT	0x02