📄 html.c
字号:
#endif Html_par_push_tag(html, tag, tagsize);#ifdef USE_TABLES if ((attrbuf = Html_get_attr(html, tag, tagsize, "border"))) border = isdigit(attrbuf[0]) ? strtol (attrbuf, NULL, 10) : 1; if ((attrbuf = Html_get_attr(html, tag, tagsize, "cellspacing"))) cellspacing = strtol (attrbuf, NULL, 10); if ((attrbuf = Html_get_attr(html, tag, tagsize, "cellpadding"))) cellpadding = strtol (attrbuf, NULL, 10); /* The style for the table */ style_attrs = *html->stack[html->stack_top].style; a_Dw_style_box_set_val (&style_attrs.border_width, border); a_Dw_style_box_set_border_color (&style_attrs, a_Dw_style_shaded_color_new ( html->stack[html->stack_top].current_bg_color, html->bw->main_window->window)); a_Dw_style_box_set_border_style (&style_attrs, DW_STYLE_BORDER_OUTSET); style_attrs.border_spacing = cellspacing; if ((attrbuf = Html_get_attr(html, tag, tagsize, "width"))) style_attrs.width = Html_parse_length (attrbuf); if (!prefs.force_my_colors && (attrbuf = Html_get_attr(html, tag, tagsize, "bgcolor"))) { bgcolor = a_Color_parse (attrbuf, -1); if (bgcolor != -1) { if (bgcolor == 0xffffff && !prefs.allow_white_bg) bgcolor = prefs.bg_color; html->stack[html->stack_top].current_bg_color = bgcolor; style_attrs.background_color = a_Dw_style_color_new (bgcolor, html->bw->main_window->window); } } tstyle = a_Dw_style_new (&style_attrs, html->bw->main_window->window); /* The style for the cells */ style_attrs = *html->stack[html->stack_top].style; a_Dw_style_box_set_val (&style_attrs.border_width, border ? 1 : 0); a_Dw_style_box_set_val (&style_attrs.padding, cellpadding); a_Dw_style_box_set_border_color (&style_attrs, tstyle->border_color.top); a_Dw_style_box_set_border_style (&style_attrs, DW_STYLE_BORDER_INSET); old_style = html->stack[html->stack_top].table_cell_style; html->stack[html->stack_top].table_cell_style = a_Dw_style_new (&style_attrs, html->bw->main_window->window); if (old_style) a_Dw_style_unref (old_style); table = a_Dw_table_new (); a_Dw_page_add_widget (DW_PAGE (html->dw), table, tstyle); a_Dw_style_unref (tstyle); html->stack[html->stack_top].table_mode = DILLO_HTML_TABLE_MODE_TOP; html->stack[html->stack_top].table = table;#endif}/* * used by <TD> and <TH> */static void Html_tag_open_table_cell(DilloHtml *html, char *tag, gint tagsize, DwStyleTextAlignType text_align){#ifdef USE_TABLES DwWidget *col_page; gint colspan = 1, rowspan = 1; const char *attrbuf; DwStyle style_attrs, *style, *old_style; gint32 bgcolor; gboolean new_style; switch (html->stack[html->stack_top].table_mode) { case DILLO_HTML_TABLE_MODE_NONE: DEBUG_HTML_MSG("<td> or <th> outside <table>\n"); return; case DILLO_HTML_TABLE_MODE_TOP: DEBUG_HTML_MSG("<td> or <th> outside <tr>\n"); /* a_Dw_table_add_cell takes care that dillo does not crash. */ /* continues */ case DILLO_HTML_TABLE_MODE_TR: case DILLO_HTML_TABLE_MODE_TD: /* todo: check errors? */ if ((attrbuf = Html_get_attr(html, tag, tagsize, "colspan"))) colspan = strtol (attrbuf, NULL, 10); if ((attrbuf = Html_get_attr(html, tag, tagsize, "rowspan"))) rowspan = strtol (attrbuf, NULL, 10); /* text style */ old_style = html->stack[html->stack_top].style; style_attrs = *old_style; style_attrs.text_align = text_align; if (Html_get_attr(html, tag, tagsize, "nowrap")) style_attrs.nowrap = TRUE; else style_attrs.nowrap = FALSE; html->stack[html->stack_top].style = a_Dw_style_new (&style_attrs, html->bw->main_window->window); a_Dw_style_unref (old_style); Html_tag_set_align_attr (html, tag, tagsize); /* cell style */ style_attrs = *html->stack[html->stack_top].table_cell_style; new_style = FALSE; if ((attrbuf = Html_get_attr(html, tag, tagsize, "width"))) { style_attrs.width = Html_parse_length (attrbuf); new_style = TRUE; } if (!prefs.force_my_colors && (attrbuf = Html_get_attr(html, tag, tagsize, "bgcolor"))) { bgcolor = a_Color_parse (attrbuf, -1); if (bgcolor != -1) { if (bgcolor == 0xffffff && !prefs.allow_white_bg) bgcolor = prefs.bg_color; new_style = TRUE; style_attrs.background_color = a_Dw_style_color_new (bgcolor, html->bw->main_window->window); html->stack[html->stack_top].current_bg_color = bgcolor; } } col_page = a_Dw_page_new (); if (new_style) { style = a_Dw_style_new (&style_attrs, html->bw->main_window->window); a_Dw_widget_set_style (col_page, style); a_Dw_style_unref (style); } else a_Dw_widget_set_style (col_page, html->stack[html->stack_top].table_cell_style); a_Dw_table_add_cell (DW_TABLE (html->stack[html->stack_top].table), col_page, colspan, rowspan); html->stack[html->stack_top].page = html->dw = col_page; /* Handle it when the user clicks on a link */ Html_connect_signals(html, GTK_OBJECT(col_page)); break; default: /* compiler happiness */ break; } html->stack[html->stack_top].table_mode = DILLO_HTML_TABLE_MODE_TD;#endif}/* * <TD> */static void Html_tag_open_td(DilloHtml *html, char *tag, gint tagsize){ Html_cleanup_tag(html, "p>"); Html_cleanup_tag(html, "td>"); Html_cleanup_tag(html, "th>"); Html_push_tag(html, tag, tagsize); Html_tag_open_table_cell (html, tag, tagsize, DW_STYLE_TEXT_ALIGN_LEFT);}/* * <TH> */static void Html_tag_open_th(DilloHtml *html, char *tag, gint tagsize){ Html_cleanup_tag(html, "p>"); Html_cleanup_tag(html, "td>"); Html_cleanup_tag(html, "th>"); Html_push_tag(html, tag, tagsize); Html_set_top_font(html, NULL, 0, 1, 1); Html_tag_open_table_cell (html, tag, tagsize, DW_STYLE_TEXT_ALIGN_CENTER);}/* * <TR> */static void Html_tag_open_tr(DilloHtml *html, char *tag, gint tagsize){ const char *attrbuf; DwStyle style_attrs, *style; gint32 bgcolor; Html_cleanup_tag(html, "p>"); Html_cleanup_tag(html, "td>"); Html_cleanup_tag(html, "th>"); Html_cleanup_tag(html, "tr>"); Html_push_tag(html, tag, tagsize);#ifdef USE_TABLES switch (html->stack[html->stack_top].table_mode) { case DILLO_HTML_TABLE_MODE_NONE: //g_print ("Invalid HTML syntax: <tr> outside <table>\n"); return; case DILLO_HTML_TABLE_MODE_TOP: case DILLO_HTML_TABLE_MODE_TR: case DILLO_HTML_TABLE_MODE_TD: style = NULL; if (!prefs.force_my_colors && (attrbuf = Html_get_attr(html, tag, tagsize, "bgcolor"))) { bgcolor = a_Color_parse (attrbuf, -1); if (bgcolor != -1) { if (bgcolor == 0xffffff && !prefs.allow_white_bg) bgcolor = prefs.bg_color; style_attrs = *html->stack[html->stack_top].style; style_attrs.background_color = a_Dw_style_color_new (bgcolor, html->bw->main_window->window); style = a_Dw_style_new (&style_attrs, html->bw->main_window->window); html->stack[html->stack_top].current_bg_color = bgcolor; } } a_Dw_table_add_row (DW_TABLE (html->stack[html->stack_top].table), style); if (style) a_Dw_style_unref (style); break; default: break; } html->stack[html->stack_top].table_mode = DILLO_HTML_TABLE_MODE_TR;#else a_Dw_page_add_parbreak(DW_PAGE (html->dw), 0, html->stack[(html)->stack_top].style);#endif}/* * <FRAME> * todo: This is just a temporary fix while real frame support * isn't finished. Imitates lynx/w3m's frames. */static void Html_tag_open_frame (DilloHtml *html, gchar *tag, gint tagsize){ const char *attrbuf; gchar *src; DilloUrl *url; DwPage *page; DwStyle style_attrs, *link_style; DwWidget *bullet; gint dummy; page = DW_PAGE(html->dw); if ( !(attrbuf = Html_get_attr(html, tag, tagsize, "src")) ) return; if (!(url = a_Url_new(attrbuf, URL_STR_(html->linkblock->base_url), 0, 0))) return; src = g_strdup(attrbuf); style_attrs = *(html->stack[html->stack_top].style); if (a_Cache_url_read(url, &dummy)) /* visited frame */ style_attrs.color = a_Dw_style_color_new (html->linkblock->visited_color, html->bw->main_window->window); else /* unvisited frame */ style_attrs.color = a_Dw_style_color_new (html->linkblock->link_color, html->bw->main_window->window); style_attrs.uline = TRUE; style_attrs.link = Html_set_new_link(html, &url); link_style = a_Dw_style_new (&style_attrs, html->bw->main_window->window); a_Dw_page_add_parbreak(page, 5, html->stack[(html)->stack_top].style); bullet = a_Dw_bullet_new(DW_BULLET_DISC); a_Dw_page_add_widget(page, bullet, html->stack[html->stack_top].style); a_Dw_page_add_space(page, html->stack[html->stack_top].style); /* If 'name' tag is present use it, if not use 'src' value */ if ( !(attrbuf = Html_get_attr(html, tag, tagsize, "name")) ) { a_Dw_page_add_text(page, g_strdup(src), link_style); } else { a_Dw_page_add_text(page, g_strdup(attrbuf), link_style); } a_Dw_page_add_parbreak(page, 5, html->stack[(html)->stack_top].style); a_Dw_style_unref(link_style); g_free(src);}/* * <FRAMESET> * todo: This is just a temporary fix while real frame support * isn't finished. Imitates lynx/w3m's frames. */static void Html_tag_open_frameset (DilloHtml *html, gchar *tag, gint tagsize){ a_Dw_page_add_text(DW_PAGE(html->dw), g_strdup("--FRAME--"), html->stack[html->stack_top].style); Html_add_indented(html, 40, 0, 5);}/* * <H1> | <H2> | <H3> | <H4> | <H5> | <H6> */static void Html_tag_open_h(DilloHtml *html, char *tag, gint tagsize){ Html_par_push_tag(html, tag, tagsize); /* todo: combining these two would be slightly faster */ Html_set_top_font(html, prefs.vw_fontname, Html_level_to_fontsize(FontSizesNum - (tag[2] - '0')), 1, 3); Html_tag_set_align_attr (html, tag, tagsize); /* First finalize unclosed H tags (we test if already named anyway) */ a_Menu_pagemarks_set_text(html->bw, html->Stash->str); a_Menu_pagemarks_add(html->bw, DW_PAGE (html->dw), html->stack[html->stack_top].style, (tag[2] - '0')); Html_stash_init(html); html->stack[html->stack_top].parse_mode = DILLO_HTML_PARSE_MODE_STASH_AND_BODY;}static void Html_tag_close_h(DilloHtml *html, char *tag, gint tagsize){ a_Menu_pagemarks_set_text(html->bw, html->Stash->str); html->stack[html->stack_top].parse_mode = DILLO_HTML_PARSE_MODE_BODY; Html_pop_tag(html, tag, tagsize); a_Dw_page_add_parbreak(DW_PAGE (html->dw), 9, html->stack[(html)->stack_top].style);}/* * <BIG> | <SMALL> */static void Html_tag_open_big_small(DilloHtml *html, char *tag, gint tagsize){ gint level; Html_push_tag(html, tag, tagsize); level = Html_fontsize_to_level(html->stack[html->stack_top].style->font->size) + ((g_strncasecmp(tag+1, "big", 3)) ? -1 : 1); Html_set_top_font(html, NULL, Html_level_to_fontsize(level), 0, 0);}/* * <BR> */static void Html_tag_open_br(DilloHtml *html, char *tag, gint tagsize){ a_Dw_page_add_linebreak(DW_PAGE (html->dw), html->stack[(html)->stack_top].style);}/* For testing, should be removed soon. */static void Html_tag_open_button_clicked(void){ g_print ("DwButton was clicked!\n");}/* * <BUTTON> */static void Html_tag_open_button(DilloHtml *html, char *tag, gint tagsize){ /* * Buttons are rendered on one line, this is (at several levels) a * bit simpler. May be changed in the future. */ DwStyle style_attrs, *style; DwWidget *button, *page; /* Render the button */ Html_push_tag(html, tag, tagsize); style_attrs = *html->stack[html->stack_top].style; a_Dw_style_box_set_val(&style_attrs.margin, 0); a_Dw_style_box_set_val(&style_attrs.border_width, 0); a_Dw_style_box_set_val(&style_attrs.padding, 0); style = a_Dw_style_new (&style_attrs, html->bw->main_window->window); button = a_Dw_button_new (); a_Dw_page_add_parbreak (DW_PAGE (html->dw), 5, style); a_Dw_page_add_widget (DW_PAGE (html->dw), button, style); a_Dw_page_add_parbreak (DW_PAGE (html->dw), 5, style); a_Dw_style_unref (style); a_Dw_style_box_set_val(&style_attrs.margin, 5); style = a_Dw_style_new (&style_attrs, html->bw->main_window->window); page = a_Dw_page_new (); a_Dw_widget_set_style (page, style); a_Dw_style_unref (style); a_Dw_container_add (DW_CONTAINER (button), page); a_Dw_style_box_set_val(&style_attrs.margin, 0); html->stack[html->stack_top].page = html->dw = page; /* Handle it when the user clicks on a link */ Html_connect_signals(html, GTK_OBJECT(page)); /* for testing: */ a_Dw_button_set_sensitive (DW_BUTTON (button), TRUE); gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(Html_tag_open_button_clicked), NULL);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -