void HTMLPage::load(const CL_String &page_url, const CL_String &refererer_url) { pageurl = HTMLUrl(page_url, refererer_url); webpage = download_url(page_url, refererer_url); HTMLTokenizer tokenizer; tokenizer.append(webpage); HTMLToken token; while (true) { tokenizer.tokenize(token); if (token.type == HTMLToken::type_null) break; if (token.type == HTMLToken::type_style_tag) { pagecss += load_css(token.value, page_url); } if (token.type == HTMLToken::type_tag_begin || token.type == HTMLToken::type_tag_single) { if (token.name == "link") { CL_String rel, href, media; for (size_t i = 0; i < token.attributes.size(); i++) { if (token.attributes[i].name == "rel") rel = token.attributes[i].value; if (token.attributes[i].name == "href") href = token.attributes[i].value; if (token.attributes[i].name == "media") media = token.attributes[i].value; } if (rel == "stylesheet" && !href.empty() && (media.empty() || media == "screen")) { CL_String css = download_url(href, page_url); pagecss += load_css(css, HTMLUrl(href, page_url).to_string()); } } } } CL_File fhtml("htmlpage.html", CL_File::create_always, CL_File::access_write); fhtml.write(webpage.data(), webpage.length()); fhtml.close(); CL_File fcss("htmlpage.css", CL_File::create_always, CL_File::access_write); fcss.write(pagecss.data(), pagecss.length()); fcss.close(); }
CL_String HTMLPage::load_css(const CL_String &csstext, const CL_String &base_url) { CL_String pagecss; CL_CSSTokenizer css_tokenizer(csstext); CL_CSSToken css_token; while (true) { css_tokenizer.read(css_token, true); if (css_token.type != CL_CSSToken::type_atkeyword || css_token.value != "import") break; css_tokenizer.read(css_token, true); if (css_token.type != CL_CSSToken::type_string) break; CL_String import_url = css_token.value; css_tokenizer.read(css_token, true); if (css_token.type != CL_CSSToken::type_semi_colon) break; CL_String css = download_url(import_url, base_url); pagecss += load_css(css, HTMLUrl(import_url, base_url).to_string()); } pagecss += cl_format("@-clan-base-uri \"%1\";\r\n", base_url); pagecss += csstext; return pagecss; }
EditorState * initialize(int *argc, char **argv[]) { gtk_init(argc, argv); FileContainer* file_container = read_file((*argv)[1]); load_css("/home/lee/dev/src/tyreese/styles/style.css"); /* INITIALIZE COMPONENTS */ GtkWidget *main_window = init_window(file_container); GtkBox *horizontal_box = init_box(GTK_ORIENTATION_HORIZONTAL, TRUE); GtkBox *vertical_box = init_box(GTK_ORIENTATION_VERTICAL, FALSE); GtkEntry *tag = init_tag(); GtkContainer *scroll_container = GTK_CONTAINER(init_scroll_container()); GtkSourceBuffer *source_buffer = init_buffer(file_container); GtkSourceView *source_view = init_buffer_view(source_buffer); GtkSourceSearchSettings *search_settings = gtk_source_search_settings_new(); gtk_source_search_settings_set_regex_enabled (search_settings, TRUE); /* PACK COMPONENTS */ gtk_container_add(scroll_container, GTK_WIDGET(source_view)); gtk_box_pack_start(vertical_box, GTK_WIDGET(tag), FALSE, FALSE, 0); gtk_box_pack_start(vertical_box, GTK_WIDGET(scroll_container), TRUE, TRUE, 0); gtk_widget_set_size_request(GTK_WIDGET(main_window), 480, 768-24); gtk_box_pack_start(horizontal_box, GTK_WIDGET(vertical_box), TRUE, TRUE, 0); gtk_container_add(GTK_CONTAINER(main_window), GTK_WIDGET(horizontal_box)); gtk_widget_grab_focus(GTK_WIDGET(source_view)); /* INITIALIZE EDITOR STATE */ EditorState *editor_state = malloc(sizeof(EditorState)); editor_state->root = main_window; editor_state->view = source_view; editor_state->buffer = source_buffer; editor_state->search.settings = search_settings; editor_state->search.context = NULL; editor_state->mode = NO_MODE; editor_state->tag = tag; editor_state->fc = file_container; /* BIND EVENTS */ g_signal_connect(editor_state->root, "destroy", G_CALLBACK(gtk_main_quit), NULL); g_signal_connect(editor_state->root, "key-press-event", G_CALLBACK(window_key_press), editor_state); g_signal_connect(editor_state->tag, "key-press-event", G_CALLBACK(tag_key_press), editor_state); return editor_state; }