예제 #1
0
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();
}
예제 #2
0
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;
}
예제 #3
0
파일: initialize.c 프로젝트: lf94/tyreese
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;
}