diff options
Diffstat (limited to 'navit/gui/internal/gui_internal_html.c')
-rw-r--r-- | navit/gui/internal/gui_internal_html.c | 843 |
1 files changed, 411 insertions, 432 deletions
diff --git a/navit/gui/internal/gui_internal_html.c b/navit/gui/internal/gui_internal_html.c index 9b42fbdec..41dab9f50 100644 --- a/navit/gui/internal/gui_internal_html.c +++ b/navit/gui/internal/gui_internal_html.c @@ -22,483 +22,462 @@ struct gui_priv; struct form { - char *onsubmit; + char *onsubmit; }; struct html_tag_map { - char *tag_name; - enum html_tag tag; + char *tag_name; + enum html_tag tag; } html_tag_map[] = { - {"a",html_tag_a}, - {"h1",html_tag_h1}, - {"html",html_tag_html}, - {"img",html_tag_img}, - {"script",html_tag_script}, - {"form",html_tag_form}, - {"input",html_tag_input}, - {"div",html_tag_div}, + {"a",html_tag_a}, + {"h1",html_tag_h1}, + {"html",html_tag_html}, + {"img",html_tag_img}, + {"script",html_tag_script}, + {"form",html_tag_form}, + {"input",html_tag_input}, + {"div",html_tag_div}, }; -static const char * -find_attr(const char **names, const char **values, const char *name) -{ - while (*names) { - if (!g_ascii_strcasecmp(*names, name)) - return *values; - names+=XML_ATTR_DISTANCE; - values+=XML_ATTR_DISTANCE; - } - return NULL; +static const char *find_attr(const char **names, const char **values, const char *name) { + while (*names) { + if (!g_ascii_strcasecmp(*names, name)) + return *values; + names+=XML_ATTR_DISTANCE; + values+=XML_ATTR_DISTANCE; + } + return NULL; } -static char * -find_attr_dup(const char **names, const char **values, const char *name) -{ - return g_strdup(find_attr(names, values, name)); +static char *find_attr_dup(const char **names, const char **values, const char *name) { + return g_strdup(find_attr(names, values, name)); } -void -gui_internal_html_main_menu(struct gui_priv *this) -{ - gui_internal_prune_menu(this, NULL); - gui_internal_html_load_href(this, "#Main Menu", 0); +void gui_internal_html_main_menu(struct gui_priv *this) { + gui_internal_prune_menu(this, NULL); + gui_internal_html_load_href(this, "#Main Menu", 0); } -static void -gui_internal_html_command(struct gui_priv *this, struct widget *w, void *data) -{ - gui_internal_evaluate(this,w->command); +static void gui_internal_html_command(struct gui_priv *this, struct widget *w, void *data) { + gui_internal_evaluate(this,w->command); } -static void -gui_internal_html_submit_set(struct gui_priv *this, struct widget *w, struct form *form) -{ - GList *l; - if (w->form == form && w->name) { - struct attr *attr=attr_new_from_text(w->name, w->text?w->text:""); - if (attr) - gui_set_attr(this->self.u.gui, attr); - attr_free(attr); - } - l=w->children; - while (l) { - w=l->data; - gui_internal_html_submit_set(this, w, form); - l=g_list_next(l); - } +static void gui_internal_html_submit_set(struct gui_priv *this, struct widget *w, struct form *form) { + GList *l; + if (w->form == form && w->name) { + struct attr *attr=attr_new_from_text(w->name, w->text?w->text:""); + if (attr) + gui_set_attr(this->self.u.gui, attr); + attr_free(attr); + } + l=w->children; + while (l) { + w=l->data; + gui_internal_html_submit_set(this, w, form); + l=g_list_next(l); + } } -static void -gui_internal_html_submit(struct gui_priv *this, struct widget *w, void *data) -{ - struct widget *menu; - GList *l; - - dbg(lvl_debug,"enter form %p %s\n",w->form,w->form->onsubmit); - l=g_list_last(this->root.children); - menu=l->data; - graphics_draw_mode(this->gra, draw_mode_begin); - gui_internal_highlight_do(this, NULL); - gui_internal_menu_render(this); - graphics_draw_mode(this->gra, draw_mode_end); - gui_internal_html_submit_set(this, menu, w->form); - gui_internal_evaluate(this,w->form->onsubmit); +static void gui_internal_html_submit(struct gui_priv *this, struct widget *w, void *data) { + struct widget *menu; + GList *l; + + dbg(lvl_debug,"enter form %p %s",w->form,w->form->onsubmit); + l=g_list_last(this->root.children); + menu=l->data; + graphics_draw_mode(this->gra, draw_mode_begin); + gui_internal_highlight_do(this, NULL); + gui_internal_menu_render(this); + graphics_draw_mode(this->gra, draw_mode_end); + gui_internal_html_submit_set(this, menu, w->form); + gui_internal_evaluate(this,w->form->onsubmit); } -void -gui_internal_html_load_href(struct gui_priv *this, char *href, int replace) -{ - if (replace) - gui_internal_prune_menu_count(this, 1, 0); - if (href && href[0] == '#') { - dbg(lvl_debug,"href=%s\n",href); - g_free(this->href); - this->href=g_strdup(href); - gui_internal_html_menu(this, this->html_text, href+1); - } +void gui_internal_html_load_href(struct gui_priv *this, char *href, int replace) { + if (replace) + gui_internal_prune_menu_count(this, 1, 0); + if (href && href[0] == '#') { + dbg(lvl_debug,"href=%s",href); + g_free(this->href); + this->href=g_strdup(href); + gui_internal_html_menu(this, this->html_text, href+1); + } } -void -gui_internal_html_href(struct gui_priv *this, struct widget *w, void *data) -{ - gui_internal_html_load_href(this, w->command, 0); +void gui_internal_html_href(struct gui_priv *this, struct widget *w, void *data) { + gui_internal_html_load_href(this, w->command, 0); } struct div_flags_map { - char *attr; - char *val; - enum flags flags; + char *attr; + char *val; + enum flags flags; } div_flags_map[] = { - {"gravity","none",gravity_none}, - {"gravity","left",gravity_left}, - {"gravity","xcenter",gravity_xcenter}, - {"gravity","right",gravity_right}, - {"gravity","top",gravity_top}, - {"gravity","ycenter",gravity_ycenter}, - {"gravity","bottom",gravity_bottom}, - {"gravity","left_top",gravity_left_top}, - {"gravity","top_center",gravity_top_center}, - {"gravity","right_top",gravity_right_top}, - {"gravity","left_center",gravity_left_center}, - {"gravity","center",gravity_center}, - {"gravity","right_center",gravity_right_center}, - {"gravity","left_bottom",gravity_left_bottom}, - {"gravity","bottom_center",gravity_bottom_center}, - {"gravity","right_bottom",gravity_right_bottom}, - {"expand","1",flags_expand}, - {"fill","1",flags_fill}, - {"orientation","horizontal",orientation_horizontal}, - {"orientation","vertical",orientation_vertical}, - {"orientation","horizontal_vertical",orientation_horizontal_vertical}, + {"gravity","none",gravity_none}, + {"gravity","left",gravity_left}, + {"gravity","xcenter",gravity_xcenter}, + {"gravity","right",gravity_right}, + {"gravity","top",gravity_top}, + {"gravity","ycenter",gravity_ycenter}, + {"gravity","bottom",gravity_bottom}, + {"gravity","left_top",gravity_left_top}, + {"gravity","top_center",gravity_top_center}, + {"gravity","right_top",gravity_right_top}, + {"gravity","left_center",gravity_left_center}, + {"gravity","center",gravity_center}, + {"gravity","right_center",gravity_right_center}, + {"gravity","left_bottom",gravity_left_bottom}, + {"gravity","bottom_center",gravity_bottom_center}, + {"gravity","right_bottom",gravity_right_bottom}, + {"expand","1",flags_expand}, + {"fill","1",flags_fill}, + {"orientation","horizontal",orientation_horizontal}, + {"orientation","vertical",orientation_vertical}, + {"orientation","horizontal_vertical",orientation_horizontal_vertical}, }; -static enum flags -div_flag(const char **names, const char **values, char *name) -{ - int i; - enum flags ret=0; - const char *value=find_attr(names, values, name); - if (!value) - return ret; - for (i = 0 ; i < sizeof(div_flags_map)/sizeof(struct div_flags_map); i++) { - if (!strcmp(div_flags_map[i].attr,name) && !strcmp(div_flags_map[i].val,value)) - ret|=div_flags_map[i].flags; - } - return ret; +static enum flags div_flag(const char **names, const char **values, char *name) { + int i; + enum flags ret=0; + const char *value=find_attr(names, values, name); + if (!value) + return ret; + for (i = 0 ; i < sizeof(div_flags_map)/sizeof(struct div_flags_map); i++) { + if (!strcmp(div_flags_map[i].attr,name) && !strcmp(div_flags_map[i].val,value)) + ret|=div_flags_map[i].flags; + } + return ret; } -static enum flags -div_flags(const char **names, const char **values) -{ - enum flags flags; - flags = div_flag(names, values, "gravity"); - flags |= div_flag(names, values, "orientation"); - flags |= div_flag(names, values, "expand"); - flags |= div_flag(names, values, "fill"); - return flags; +static enum flags div_flags(const char **names, const char **values) { + enum flags flags; + flags = div_flag(names, values, "gravity"); + flags |= div_flag(names, values, "orientation"); + flags |= div_flag(names, values, "expand"); + flags |= div_flag(names, values, "fill"); + return flags; } -static struct widget * -html_image(struct gui_priv *this, const char **names, const char **values) -{ - const char *src, *size; - struct graphics_image *img=NULL; - - src=find_attr(names, values, "src"); - if (!src) - return NULL; - size=find_attr(names, values, "size"); - if (!size) { - const char *class=find_attr(names, values, "class"); - if (class && !strcasecmp(class,"centry")) - size="xs"; - else - size="l"; - } - if (!strcmp(size,"l")) - img=image_new_l(this, src); - else if (!strcmp(size,"s")) - img=image_new_s(this, src); - else if (!strcmp(size,"xs")) - img=image_new_xs(this, src); - if (!img) - return NULL; - return gui_internal_image_new(this, img); +static struct widget *html_image(struct gui_priv *this, const char **names, const char **values) { + const char *src, *size; + struct graphics_image *img=NULL; + + src=find_attr(names, values, "src"); + if (!src) + return NULL; + size=find_attr(names, values, "size"); + if (!size) { + const char *class=find_attr(names, values, "class"); + if (class && !strcasecmp(class,"centry")) + size="xs"; + else + size="l"; + } + if (!strcmp(size,"l")) + img=image_new_l(this, src); + else if (!strcmp(size,"s")) + img=image_new_s(this, src); + else if (!strcmp(size,"xs")) + img=image_new_xs(this, src); + if (!img) + return NULL; + return gui_internal_image_new(this, img); } -static void -gui_internal_html_start(xml_context *dummy, const char *tag_name, const char **names, const char **values, void *data, GError **error) -{ - struct gui_priv *this=data; - int i; - enum html_tag tag=html_tag_none; - struct html *html=&this->html[this->html_depth]; - const char *cond, *type, *font_size; - - if (!g_ascii_strcasecmp(tag_name,"text") || !g_ascii_strcasecmp(tag_name,"p")) - return; - html->skip=0; - html->command=NULL; - html->name=NULL; - html->href=NULL; - html->refresh_cond=NULL; - html->w=NULL; - html->container=NULL; - html->font_size=0; - cond=find_attr(names, values, "cond"); - - if (cond && !this->html_skip) { - if (!command_evaluate_to_boolean(&this->self, cond, NULL)) - html->skip=1; - } - - for (i=0 ; i < sizeof(html_tag_map)/sizeof(struct html_tag_map); i++) { - if (!g_ascii_strcasecmp(html_tag_map[i].tag_name, tag_name)) { - tag=html_tag_map[i].tag; - break; - } - } - html->tag=tag; - html->class=find_attr_dup(names, values, "class"); - if (!this->html_skip && !html->skip) { - switch (tag) { - case html_tag_a: - html->name=find_attr_dup(names, values, "name"); - if (html->name) { - html->skip=this->html_anchor ? strcmp(html->name,this->html_anchor) : 0; - if (!html->skip) - this->html_anchor_found=1; - } - html->command=find_attr_dup(names, values, "onclick"); - html->href=find_attr_dup(names, values, "href"); - html->refresh_cond=find_attr_dup(names, values, "refresh_cond"); - break; - case html_tag_img: - html->command=find_attr_dup(names, values, "onclick"); - html->w=html_image(this, names, values); - break; - case html_tag_form: - this->form=g_new0(struct form, 1); - this->form->onsubmit=find_attr_dup(names, values, "onsubmit"); - break; - case html_tag_input: - type=find_attr_dup(names, values, "type"); - if (!type) - break; - if (!strcmp(type,"image")) { - html->w=html_image(this, names, values); - if (html->w) { - html->w->state|=STATE_SENSITIVE; - html->w->func=gui_internal_html_submit; - } - } - if (!strcmp(type,"text") || !strcmp(type,"password")) { - const char *value=find_attr(names, values, "value"); - html->w=gui_internal_label_new(this, value); - html->w->background=this->background; - html->w->flags |= div_flags(names, values); - html->w->state|=STATE_EDITABLE; - if (!this->editable) { - this->editable=html->w; - html->w->state|=STATE_EDIT; - } - this->keyboard_required=1; - if (!strcmp(type,"password")) - html->w->flags2 |= 1; - } - if (html->w) { - html->w->form=this->form; - html->w->name=find_attr_dup(names, values, "name"); - } - break; - case html_tag_div: - html->w=gui_internal_box_new(this, div_flags(names, values)); - font_size=find_attr(names, values, "font"); - if (font_size) - html->font_size=atoi(font_size); - html->container=this->html_container; - this->html_container=html->w; - break; - default: - break; - } - } - this->html_skip+=html->skip; - this->html_depth++; +static void gui_internal_html_start(xml_context *dummy, const char *tag_name, const char **names, const char **values, + void *data, + GError **error) { + struct gui_priv *this=data; + int i; + enum html_tag tag=html_tag_none; + struct html *html=&this->html[this->html_depth]; + const char *cond, *type, *font_size; + + if (!g_ascii_strcasecmp(tag_name,"text") || !g_ascii_strcasecmp(tag_name,"p")) + return; + html->skip=0; + html->command=NULL; + html->name=NULL; + html->href=NULL; + html->refresh_cond=NULL; + html->w=NULL; + html->container=NULL; + html->font_size=0; + cond=find_attr(names, values, "cond"); + + if (cond && !this->html_skip) { + if (!command_evaluate_to_boolean(&this->self, cond, NULL)) + html->skip=1; + } + + for (i=0 ; i < sizeof(html_tag_map)/sizeof(struct html_tag_map); i++) { + if (!g_ascii_strcasecmp(html_tag_map[i].tag_name, tag_name)) { + tag=html_tag_map[i].tag; + break; + } + } + html->tag=tag; + html->class=find_attr_dup(names, values, "class"); + if (!this->html_skip && !html->skip) { + switch (tag) { + case html_tag_a: + html->name=find_attr_dup(names, values, "name"); + if (html->name) { + html->skip=this->html_anchor ? strcmp(html->name,this->html_anchor) : 0; + if (!html->skip) + this->html_anchor_found=1; + } + html->command=find_attr_dup(names, values, "onclick"); + html->href=find_attr_dup(names, values, "href"); + html->refresh_cond=find_attr_dup(names, values, "refresh_cond"); + break; + case html_tag_img: + html->command=find_attr_dup(names, values, "onclick"); + html->w=html_image(this, names, values); + break; + case html_tag_form: + this->form=g_new0(struct form, 1); + this->form->onsubmit=find_attr_dup(names, values, "onsubmit"); + break; + case html_tag_input: + type=find_attr_dup(names, values, "type"); + if (!type) + break; + if (!strcmp(type,"image")) { + html->w=html_image(this, names, values); + if (html->w) { + html->w->state|=STATE_SENSITIVE; + html->w->func=gui_internal_html_submit; + } + } + if (!strcmp(type,"text") || !strcmp(type,"password")) { + const char *value=find_attr(names, values, "value"); + html->w=gui_internal_label_new(this, value); + html->w->background=this->background; + html->w->flags |= div_flags(names, values); + html->w->state|=STATE_EDITABLE; + if (!this->editable) { + this->editable=html->w; + html->w->state|=STATE_EDIT; + } + this->keyboard_required=1; + if (!strcmp(type,"password")) + html->w->flags2 |= 1; + } + if (html->w) { + html->w->form=this->form; + html->w->name=find_attr_dup(names, values, "name"); + } + break; + case html_tag_div: + html->w=gui_internal_box_new(this, div_flags(names, values)); + font_size=find_attr(names, values, "font"); + if (font_size) + html->font_size=atoi(font_size); + html->container=this->html_container; + this->html_container=html->w; + break; + default: + break; + } + } + this->html_skip+=html->skip; + this->html_depth++; } -static void -gui_internal_html_end(xml_context *dummy, const char *tag_name, void *data, GError **error) -{ - struct gui_priv *this=data; - struct html *html; - struct html *parent=NULL; - - if (!g_ascii_strcasecmp(tag_name,"text") || !g_ascii_strcasecmp(tag_name,"p")) - return; - this->html_depth--; - html=&this->html[this->html_depth]; - if (this->html_depth > 0) - parent=&this->html[this->html_depth-1]; - - - if (!this->html_skip) { - if (html->command && html->w) { - html->w->state |= STATE_SENSITIVE; - html->w->command=html->command; - html->w->func=gui_internal_html_command; - html->command=NULL; - } - if (parent && (parent->href || parent->command) && html->w) { - html->w->state |= STATE_SENSITIVE; - if (parent->command) { - html->w->command=g_strdup(parent->command); - html->w->func=gui_internal_html_command; - } else { - html->w->command=g_strdup(parent->href); - html->w->func=gui_internal_html_href; - } - } - switch (html->tag) { - case html_tag_div: - this->html_container=html->container; - case html_tag_img: - case html_tag_input: - gui_internal_widget_append(this->html_container, html->w); - break; - case html_tag_form: - this->form=NULL; - break; - default: - break; - } - } - this->html_skip-=html->skip; - g_free(html->command); - g_free(html->name); - g_free(html->href); - g_free(html->class); - g_free(html->refresh_cond); +static void gui_internal_html_end(xml_context *dummy, const char *tag_name, void *data, GError **error) { + struct gui_priv *this=data; + struct html *html; + struct html *parent=NULL; + + if (!g_ascii_strcasecmp(tag_name,"text") || !g_ascii_strcasecmp(tag_name,"p")) + return; + this->html_depth--; + html=&this->html[this->html_depth]; + if (this->html_depth > 0) + parent=&this->html[this->html_depth-1]; + + + if (!this->html_skip) { + if (html->command && html->w) { + html->w->state |= STATE_SENSITIVE; + html->w->command=html->command; + html->w->func=gui_internal_html_command; + html->command=NULL; + } + if (parent && (parent->href || parent->command) && html->w) { + html->w->state |= STATE_SENSITIVE; + if (parent->command) { + html->w->command=g_strdup(parent->command); + html->w->func=gui_internal_html_command; + } else { + html->w->command=g_strdup(parent->href); + html->w->func=gui_internal_html_href; + } + } + switch (html->tag) { + case html_tag_div: + this->html_container=html->container; + case html_tag_img: + case html_tag_input: + gui_internal_widget_append(this->html_container, html->w); + break; + case html_tag_form: + this->form=NULL; + break; + default: + break; + } + } + this->html_skip-=html->skip; + g_free(html->command); + g_free(html->name); + g_free(html->href); + g_free(html->class); + g_free(html->refresh_cond); } -static void -gui_internal_refresh_callback_called(struct gui_priv *this, struct menu_data *menu_data) -{ - if (gui_internal_menu_data(this) == menu_data) { - char *href=g_strdup(menu_data->href); - gui_internal_html_load_href(this, href, 1); - g_free(href); - } +static void gui_internal_refresh_callback_called(struct gui_priv *this, struct menu_data *menu_data) { + if (gui_internal_menu_data(this) == menu_data) { + char *href=g_strdup(menu_data->href); + gui_internal_html_load_href(this, href, 1); + g_free(href); + } } -static void -gui_internal_set_refresh_callback(struct gui_priv *this, char *cond) -{ - dbg(lvl_info,"cond=%s\n",cond); - if (cond) { - enum attr_type type; - struct object_func *func; - struct menu_data *menu_data=gui_internal_menu_data(this); - dbg(lvl_info,"navit=%p\n",this->nav); - type=command_evaluate_to_attr(&this->self, cond, NULL, &menu_data->refresh_callback_obj); - if (type == attr_none) { - dbg(lvl_error,"can't get type of '%s'\n",cond); - return; - } - func=object_func_lookup(menu_data->refresh_callback_obj.type); - if (!func) - dbg(lvl_error,"'%s' has no functions\n",cond); - if (func && !func->add_attr) - dbg(lvl_error,"'%s' has no add_attr function\n",cond); - if (!func || !func->add_attr) - return; - menu_data->refresh_callback.type=attr_callback; - menu_data->refresh_callback.u.callback=callback_new_attr_2(callback_cast(gui_internal_refresh_callback_called),type,this,menu_data); - func->add_attr(menu_data->refresh_callback_obj.u.data, &menu_data->refresh_callback); - } +static void gui_internal_set_refresh_callback(struct gui_priv *this, char *cond) { + dbg(lvl_info,"cond=%s",cond); + if (cond) { + enum attr_type type; + struct object_func *func; + struct menu_data *menu_data=gui_internal_menu_data(this); + dbg(lvl_info,"navit=%p",this->nav); + type=command_evaluate_to_attr(&this->self, cond, NULL, &menu_data->refresh_callback_obj); + if (type == attr_none) { + dbg(lvl_error,"can't get type of '%s'",cond); + return; + } + func=object_func_lookup(menu_data->refresh_callback_obj.type); + if (!func) + dbg(lvl_error,"'%s' has no functions",cond); + if (func && !func->add_attr) + dbg(lvl_error,"'%s' has no add_attr function",cond); + if (!func || !func->add_attr) + return; + menu_data->refresh_callback.type=attr_callback; + menu_data->refresh_callback.u.callback=callback_new_attr_2(callback_cast(gui_internal_refresh_callback_called),type, + this,menu_data); + func->add_attr(menu_data->refresh_callback_obj.u.data, &menu_data->refresh_callback); + } } -static void -gui_internal_html_text(xml_context *dummy, const char *text, gsize len, void *data, GError **error) -{ - struct gui_priv *this=data; - struct widget *w; - int depth=this->html_depth-1; - struct html *html=&this->html[depth]; - gchar *text_stripped; - - if (this->html_skip) - return; - while (isspace(text[0])) { - text++; - len--; - } - while (len > 0 && isspace(text[len-1])) - len--; - - text_stripped = g_strndup(text, len); - if (html->tag == html_tag_html && depth > 2) { - if (this->html[depth-1].tag == html_tag_script) { - html=&this->html[depth-2]; - } - } - switch (html->tag) { - case html_tag_a: - if (html->name && len) { - if (html->class && !strcasecmp(html->class,"clist")) - this->html_container=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill /* |flags_scrolly */); - else - this->html_container=gui_internal_box_new(this, gravity_center|orientation_horizontal_vertical|flags_expand|flags_fill); - gui_internal_widget_append(gui_internal_menu(this, _(text_stripped)), this->html_container); - gui_internal_menu_data(this)->href=g_strdup(this->href); - gui_internal_set_refresh_callback(this, html->refresh_cond); - this->html_container->spx=this->spacing*10; - } - break; - case html_tag_h1: - if (!this->html_container) { - this->html_container=gui_internal_box_new(this, gravity_center|orientation_horizontal_vertical|flags_expand|flags_fill); - gui_internal_widget_append(gui_internal_menu(this, _(text_stripped)), this->html_container); - this->html_container->spx=this->spacing*10; - } - break; - case html_tag_img: - if (len) { - if (html->class && !strcasecmp(html->class, "centry")) - w=gui_internal_box_new(this, gravity_left_top|orientation_horizontal|flags_fill); - else - w=gui_internal_box_new(this, gravity_center|orientation_vertical); - gui_internal_widget_append(w, html->w); - gui_internal_widget_append(w, gui_internal_text_new(this, _(text_stripped), gravity_left_top|orientation_vertical|flags_fill)); - html->w=w; - } - break; - case html_tag_div: - if (len) { - gui_internal_widget_append(html->w, gui_internal_text_font_new(this, _(text_stripped), html->font_size, gravity_center|orientation_vertical)); - } - break; - case html_tag_script: - dbg(lvl_debug,"execute %s\n",text_stripped); - gui_internal_evaluate(this,text_stripped); - break; - default: - break; - } - g_free(text_stripped); +static void gui_internal_html_text(xml_context *dummy, const char *text, gsize len, void *data, GError **error) { + struct gui_priv *this=data; + struct widget *w; + int depth=this->html_depth-1; + struct html *html=&this->html[depth]; + gchar *text_stripped; + + if (this->html_skip) + return; + while (isspace(text[0])) { + text++; + len--; + } + while (len > 0 && isspace(text[len-1])) + len--; + + text_stripped = g_strndup(text, len); + if (html->tag == html_tag_html && depth > 2) { + if (this->html[depth-1].tag == html_tag_script) { + html=&this->html[depth-2]; + } + } + switch (html->tag) { + case html_tag_a: + if (html->name && len) { + if (html->class && !strcasecmp(html->class,"clist")) + this->html_container=gui_internal_box_new(this, + gravity_left_top|orientation_vertical|flags_expand|flags_fill /* |flags_scrolly */); + else + this->html_container=gui_internal_box_new(this, gravity_center|orientation_horizontal_vertical|flags_expand|flags_fill); + gui_internal_widget_append(gui_internal_menu(this, _(text_stripped)), this->html_container); + gui_internal_menu_data(this)->href=g_strdup(this->href); + gui_internal_set_refresh_callback(this, html->refresh_cond); + this->html_container->spx=this->spacing*10; + } + break; + case html_tag_h1: + if (!this->html_container) { + this->html_container=gui_internal_box_new(this, gravity_center|orientation_horizontal_vertical|flags_expand|flags_fill); + gui_internal_widget_append(gui_internal_menu(this, _(text_stripped)), this->html_container); + this->html_container->spx=this->spacing*10; + } + break; + case html_tag_img: + if (len) { + if (html->class && !strcasecmp(html->class, "centry")) + w=gui_internal_box_new(this, gravity_left_top|orientation_horizontal|flags_fill); + else + w=gui_internal_box_new(this, gravity_center|orientation_vertical); + gui_internal_widget_append(w, html->w); + gui_internal_widget_append(w, gui_internal_text_new(this, _(text_stripped), + gravity_left_top|orientation_vertical|flags_fill)); + html->w=w; + } + break; + case html_tag_div: + if (len) { + gui_internal_widget_append(html->w, gui_internal_text_font_new(this, _(text_stripped), html->font_size, + gravity_center|orientation_vertical)); + } + break; + case html_tag_script: + dbg(lvl_debug,"execute %s",text_stripped); + gui_internal_evaluate(this,text_stripped); + break; + default: + break; + } + g_free(text_stripped); } -void -gui_internal_html_parse_text(struct gui_priv *this, char *doc) -{ - xml_parse_text(doc, this, gui_internal_html_start, gui_internal_html_end, gui_internal_html_text); +void gui_internal_html_parse_text(struct gui_priv *this, char *doc) { + int res; + + res = xml_parse_text(doc, this, gui_internal_html_start, gui_internal_html_end, gui_internal_html_text); + + if (!res) { + dbg(lvl_error, "FATAL: Failed to parse XML data (looks like incorrect configuration for internal GUI).\n"); + exit(1); + } } -void -gui_internal_html_menu(struct gui_priv *this, const char *document, char *anchor) -{ - char *doc=g_strdup(document); - graphics_draw_mode(this->gra, draw_mode_begin); - this->html_container=NULL; - this->html_depth=0; - this->html_anchor=anchor; - this->html_anchor_found=0; - this->form=NULL; - this->keyboard_required=0; - this->editable=NULL; - callback_list_call_attr_2(this->cbl,attr_gui,anchor,&doc); - gui_internal_html_parse_text(this, doc); - g_free(doc); - if (this->keyboard_required) { - this->html_container->flags=gravity_center|orientation_vertical|flags_expand|flags_fill; - if (this->keyboard) - gui_internal_widget_append(this->html_container, gui_internal_keyboard(this, VKBD_FLAG_2 | gui_internal_keyboard_init_mode(getenv("LANG")))); - else - gui_internal_keyboard_show_native(this, this->html_container, VKBD_FLAG_2 | gui_internal_keyboard_init_mode(getenv("LANG")), getenv("LANG")); - } - gui_internal_menu_render(this); - graphics_draw_mode(this->gra, draw_mode_end); +void gui_internal_html_menu(struct gui_priv *this, const char *document, char *anchor) { + char *doc=g_strdup(document); + graphics_draw_mode(this->gra, draw_mode_begin); + this->html_container=NULL; + this->html_depth=0; + this->html_anchor=anchor; + this->html_anchor_found=0; + this->form=NULL; + this->keyboard_required=0; + this->editable=NULL; + callback_list_call_attr_2(this->cbl,attr_gui,anchor,&doc); + gui_internal_html_parse_text(this, doc); + g_free(doc); + if (this->keyboard_required) { + this->html_container->flags=gravity_center|orientation_vertical|flags_expand|flags_fill; + if (this->keyboard) + gui_internal_widget_append(this->html_container, gui_internal_keyboard(this, + VKBD_FLAG_2 | gui_internal_keyboard_init_mode(getenv("LANG")))); + else + gui_internal_keyboard_show_native(this, this->html_container, + VKBD_FLAG_2 | gui_internal_keyboard_init_mode(getenv("LANG")), getenv("LANG")); + } + gui_internal_menu_render(this); + graphics_draw_mode(this->gra, draw_mode_end); } |