diff -pur dillo-0.2.4/src/dw_bullet.c dillo-0.2.4.lists/src/dw_bullet.c --- dillo-0.2.4/src/dw_bullet.c Sat Jun 24 09:09:39 2000 +++ dillo-0.2.4.lists/src/dw_bullet.c Sat Aug 26 15:58:08 2000 @@ -65,6 +65,8 @@ static void Dw_bullet_paint(Dw *dw, DwRe widget->style->fg_gc[widget->state], FALSE, x + 1, y, 6, 6); break; + default: /* Should/could the numeric bullets be treated here ? */ + break; } a_Dw_paint_finish_screen(paint); } diff -pur dillo-0.2.4/src/dw_bullet.h dillo-0.2.4.lists/src/dw_bullet.h --- dillo-0.2.4/src/dw_bullet.h Sat Jun 24 09:09:39 2000 +++ dillo-0.2.4.lists/src/dw_bullet.h Sat Aug 26 15:53:52 2000 @@ -8,9 +8,14 @@ extern "C" { typedef struct _DwBullet DwBullet; typedef enum { - DW_BULLET_DISC, - DW_BULLET_CIRCLE, - DW_BULLET_SQUARE + DW_BULLET_DISC=1, + DW_BULLET_CIRCLE=2, + DW_BULLET_SQUARE=3, + DW_BULLET_1=4, + DW_BULLET_a=5, + DW_BULLET_A=6, + DW_BULLET_i=7, + DW_BULLET_I=8 } DwBulletType; struct _DwBullet { Only in dillo-0.2.4.lists/src: fonts[attr.font] diff -pur dillo-0.2.4/src/html.c dillo-0.2.4.lists/src/html.c --- dillo-0.2.4/src/html.c Mon Aug 21 06:29:23 2000 +++ dillo-0.2.4.lists/src/html.c Sat Aug 26 19:32:58 2000 @@ -58,8 +58,14 @@ static DilloHtml *Html_new(BrowserWindow /* * Local Data */ -/* -RL :: I use this var for
    <\OL> tags */ -static gint number; +static char *roman_I0[] = {"I","II","III","IV","V","VI","VII","VIII","IX"}; +static char *roman_I1[] = {"X","XX","XXX","XL","L","LX","LXX","LXXX","XC"}; +static char *roman_I2[] = {"C","CC","CCC","CD","D","DC","DCC","DCCC","CM"}; +static char *roman_I3[] = {"M","MM","MMM","MMMM"}; +static char *roman_i0[] = {"i","ii","iii","iv","v","vi","vii","viii","ix"}; +static char *roman_i1[] = {"x","xx","xxx","xl","l","lx","lxx","lxxx","xcC"}; +static char *roman_i2[] = {"c","cc","ccc","cd","d","dc","dcc","dccc","cm"}; +static char *roman_i3[] = {"m","mm","mmm","mmmm"}; /* @@ -878,6 +884,7 @@ static void Html_tag_open_ul(DilloHtml * { DwPage *page; DwPageAttr attr; + char tmp[80]; Html_par_push_tag(html, tag, tagsize); @@ -887,9 +894,24 @@ static void Html_tag_open_ul(DilloHtml * attr.left_indent_first = attr.left_indent_rest + 40; attr.left_indent_rest += 40; html->stack[html->stack_top].attr = a_Dw_page_add_attr(page, &attr); - if(html->stack[html->stack_top].list_level < 4) - html->stack[html->stack_top].list_level++; + if (Html_get_attr(tag, tagsize, "type", tmp, sizeof(tmp))) + { + if(strcmp(tmp,"disc")==0) + html->stack[html->stack_top].list_level = DW_BULLET_DISC; + else if(strcmp(tmp,"circle")==0) + html->stack[html->stack_top].list_level = DW_BULLET_CIRCLE; + else if(strcmp(tmp,"square")==0) + html->stack[html->stack_top].list_level = DW_BULLET_SQUARE; + } + else if(html->stack[html->stack_top].list_level < 3) + html->stack[html->stack_top].list_level++; + /* --EG :: I changed the behavior here : types are cycling instead of + * being forced to square. It's easier for mixed lists level counting. + */ + else + html->stack[html->stack_top].list_level = DW_BULLET_DISC; + html->stack[html->stack_top].list_number = 0; } /* @@ -899,19 +921,38 @@ static void Html_tag_open_ol (DilloHtml { DwPage *page; DwPageAttr attr; + char tmp[80]; Html_par_push_tag (html, tag, tagsize); page = (DwPage *)html->dw; attr = page->attrs[html->stack[html->stack_top].attr]; - attr.left_indent_first = attr.left_indent_rest + 40; - attr.left_indent_rest += 40; + attr.left_indent_first = attr.left_indent_rest + 17; + attr.left_indent_rest += 17; html->stack[html->stack_top].attr = a_Dw_page_add_attr (page, &attr); - html->stack[html->stack_top].list_level = 4; /* NUMBERED */ - - number = 0; + if (Html_get_attr(tag, tagsize, "type", tmp, sizeof(tmp))) + { + if(strcmp(tmp,"1")==0) + html->stack[html->stack_top].list_level = DW_BULLET_1; + if(strcmp(tmp,"a")==0) + html->stack[html->stack_top].list_level = DW_BULLET_a; + if(strcmp(tmp,"A")==0) + html->stack[html->stack_top].list_level = DW_BULLET_A; + if(strcmp(tmp,"i")==0) + html->stack[html->stack_top].list_level = DW_BULLET_i; + if(strcmp(tmp,"I")==0) + html->stack[html->stack_top].list_level = DW_BULLET_I; + } + else + html->stack[html->stack_top].list_level = DW_BULLET_1; + if (Html_get_attr(tag, tagsize, "start", tmp, sizeof(tmp))) + { + html->stack[html->stack_top].list_number = atoi(tmp); + } + else + html->stack[html->stack_top].list_number = 1; } /* @@ -921,53 +962,145 @@ static void Html_tag_open_li (DilloHtml { DwPage *page; DwPageAttr attr; + DwPageFont font; Dw *bullet; gint indent; char *str; + int i3,i2, i1, i0; + char tmp[80]; Html_cleanup_tag(html, "p>"); Html_cleanup_tag(html, "li>"); +/* -EG :: we don't need to push tag, as closing is optionnal and we cleanup + * This is to fix the numbering bug. Html_push_tag(html, tag, tagsize); - +*/ page = (DwPage *) html->dw; a_Dw_page_parbreak(page, 1); attr = page->attrs[html->stack[html->stack_top].attr]; indent = attr.left_indent_rest; - if (indent < 40) - indent = 40; + if (indent < 0) + indent = 0; attr.left_indent_first = indent - 12; attr.left_indent_rest = indent; - html->stack[html->stack_top].attr = a_Dw_page_add_attr(page, &attr); + if (Html_get_attr(tag, tagsize, "value", tmp, sizeof(tmp))) + { + html->stack[html->stack_top].list_number = atoi(tmp); + } + + if(html->stack[html->stack_top].list_number){ + /* ORDERED LIST */ + switch(html->stack[html->stack_top].list_level){ + case DW_BULLET_a: + str = g_new(char, 6); + i0 = html->stack[html->stack_top].list_number-1; + i1 = i0/26; + i2 = i1/26; + i0 %= 26; + i1 %= 26; + if(i2>26) /* more than 26*26*26=17576 elements ? */ + sprintf(str, "****. "); + else if(i2) + sprintf(str, " %c%c%c.", 'a'+i2-1,'a'+i1-1,'a'+i0 ); + else if(i1) + sprintf(str, " %c%c.", 'a'+i1-1,'a'+i0 ); + else + sprintf(str, " %c.", 'a'+i0 ); + break; + case DW_BULLET_A: + str = g_new(char, 6); + i0 = html->stack[html->stack_top].list_number - 1; + i1 = i0/26; + i2 = i1/26; + i0 %= 26; + i1 %= 26; + if(i2>26) /* more than 26*26*26=17576 elements ? */ + sprintf(str, "****."); + else if(i2) + sprintf(str, " %c%c%c.", 'A'+i2-1,'A'+i1-1,'A'+i0 ); + else if(i1) + sprintf(str, " %c%c.", 'A'+i1-1,'A'+i0 ); + else + sprintf(str, " %c.", 'A'+i0 ); + break; + case DW_BULLET_i: + str = g_new(char, 20); + i0 = html->stack[html->stack_top].list_number - 1; + i1 = i0/10; + i2 = i1/10; + i3 = i2/10; + i0 %= 10; + i1 %= 10; + i2 %= 10; + if(i3>4) /* more than 4999 elements ? */ + sprintf(tmp, "****."); + else if(i3) + sprintf(tmp, "%s%s%s%s", roman_i3[i3-1],roman_i2[i2-1], + roman_i1[i1-1],roman_i0[i0] ); + else if(i2) + sprintf(tmp, "%s%s%s", roman_i2[i2-1], + roman_i1[i1-1],roman_i0[i0] ); + else if(i1) + sprintf(tmp, "%s%s", roman_i1[i1-1],roman_i0[i0] ); + else + sprintf(tmp, "%s", roman_i0[i0] ); + sprintf(str, "%6s.", tmp); + break; + case DW_BULLET_I: + str = g_new(char, 20); + i0 = html->stack[html->stack_top].list_number - 1; + i1 = i0/10; + i2 = i1/10; + i3 = i2/10; + i0 %= 10; + i1 %= 10; + i2 %= 10; + if(i3>4) /* more than 4999 elements ? */ + sprintf(str, "****."); + else if(i3) + sprintf(tmp, "%s%s%s%s", roman_I3[i3-1],roman_I2[i2-1], + roman_I1[i1-1],roman_I0[i0] ); + else if(i2) + sprintf(tmp, "%s%s%s", roman_I2[i2-1], + roman_I1[i1-1],roman_I0[i0] ); + else if(i1) + sprintf(tmp, "%s%s", roman_I1[i1-1],roman_I0[i0] ); + else + sprintf(tmp, "%s", roman_I0[i0] ); + sprintf(str, "%6s.", tmp); + break; + case DW_BULLET_1: + default: + str = g_new(char, 5); + sprintf(str, "%4d.", html->stack[html->stack_top].list_number); + break; + } + (html->stack[html->stack_top].list_number)++; - switch (html->stack[html->stack_top].list_level) { - case 1: - bullet = a_Dw_bullet_new(DW_BULLET_DISC); + font = page->fonts[attr.font]; + font.name = "courier"; + attr.font = a_Dw_page_find_font(page, &font); + + html->stack[html->stack_top].attr = a_Dw_page_add_attr(page, &attr); + a_Dw_page_add_text ((DwPage *) html->dw, str, + html->stack[html->stack_top].attr); + font = page->fonts[attr.font]; + font.name = "helvetica"; + attr.font = a_Dw_page_find_font(page, &font); + + html->stack[html->stack_top].attr = a_Dw_page_add_attr(page, &attr); + } + else + { + /* UNORDERED LIST */ + html->stack[html->stack_top].attr = a_Dw_page_add_attr(page, &attr); + bullet = a_Dw_bullet_new(html->stack[html->stack_top].list_level); a_Dw_page_add_widget(page, bullet, html->stack[html->stack_top].attr); a_Dw_page_add_space(page, html->stack[html->stack_top].attr); - break; - case 2: - bullet = a_Dw_bullet_new(DW_BULLET_CIRCLE); - a_Dw_page_add_widget(page, bullet, html->stack[html->stack_top].attr); - a_Dw_page_add_space(page, html->stack[html->stack_top].attr); - break; - case 3: - bullet = a_Dw_bullet_new(DW_BULLET_SQUARE); - a_Dw_page_add_widget(page, bullet, html->stack[html->stack_top].attr); - a_Dw_page_add_space(page, html->stack[html->stack_top].attr); - break; - case 4: - str = g_new(char, 5); - sprintf(str, "%d. ", ++number); - a_Dw_page_add_text ((DwPage *) html->dw, str, - html->stack[html->stack_top].attr); - break; - default: - /* Never Reached */ - break; } } diff -pur dillo-0.2.4/src/html.h dillo-0.2.4.lists/src/html.h --- dillo-0.2.4/src/html.h Fri Aug 18 06:40:35 2000 +++ dillo-0.2.4.lists/src/html.h Sat Aug 26 17:20:56 2000 @@ -51,6 +51,7 @@ struct _DilloHtmlState { gint attr; DilloHtmlParseMode parse_mode; gint list_level; + gint list_number; }; typedef enum {