⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 document.c

📁 一个很有名的浏览器
💻 C
字号:
/* Information about current document and current link *//* $Id: document.c,v 1.112.4.6 2005/05/01 21:11:28 jonas Exp $ */#ifdef HAVE_CONFIG_H#include "config.h"#endif#include <stdlib.h>#include <string.h>#include <sys/types.h>#ifdef HAVE_TIME_H#include <time.h>#endif#include "elinks.h"#include "bfu/dialog.h"#include "cache/cache.h"#include "dialogs/document.h"#include "document/document.h"#include "document/html/renderer.h"#include "document/view.h"#include "globhist/globhist.h"#include "intl/gettext/libintl.h"#include "protocol/header.h"#include "protocol/uri.h"#include "sched/location.h"#include "sched/session.h"#include "terminal/terminal.h"#include "terminal/window.h"#include "util/conv.h"#include "util/memory.h"#include "util/string.h"#include "viewer/text/link.h"#include "viewer/text/view.h"voidnowhere_box(struct terminal *term, unsigned char *title){	assert(term);	if_assert_failed return;	if (!title || !*title)		title = N_("Info");	info_box(term, 0, title, ALIGN_CENTER,		 N_("You are nowhere!"));}/* Location info. message box. */voiddocument_info_dialog(struct session *ses){	struct terminal *term = ses->tab->term;	struct location *location = cur_loc(ses);	struct document_view *doc_view;	struct cache_entry *cached;	struct string msg;	if (!location) {		nowhere_box(term, NULL);		return;	}	doc_view = current_frame(ses);	if (!init_string(&msg)) return;	add_to_string(&msg, _("URL", term));	add_to_string(&msg, ": ");	/* Add the uri with password and post info stripped */	add_uri_to_string(&msg, location->vs.uri, URI_PUBLIC);	add_char_to_string(&msg, '\n');	if (doc_view && doc_view->document->title) {		add_format_to_string(&msg, "%s: %s", _("Title", term),				     doc_view->document->title);	}	add_char_to_string(&msg, '\n');	cached = find_in_cache(location->vs.uri);	if (cached) {		unsigned char *a;		add_format_to_string(&msg, "\n%s: %d",				     _("Size", term), cached->length);		if (cached->incomplete) {			add_format_to_string(&msg, " (%s)", _("incomplete", term));		}		if (doc_view) {			add_format_to_string(&msg, "\n%s: %s", _("Codepage", term),					get_cp_name(doc_view->document->cp));			if (doc_view->document->cp_status == CP_STATUS_ASSUMED) {				add_format_to_string(&msg, " (%s)", _("assumed", term));			} else if (doc_view->document->cp_status == CP_STATUS_IGNORED) {				add_format_to_string(&msg, " (%s)",						_("ignoring server setting", term));			}		}		a = parse_header(cached->head, "Server", NULL);		if (a) {			add_format_to_string(&msg, "\n%s: %s",					     _("Server", term), a);			mem_free(a);		}		if (cached->ssl_info) {			add_format_to_string(&msg, "\n%s: %s",					     _("SSL Cipher", term),					     cached->ssl_info);		}		if (cached->encoding_info) {			add_format_to_string(&msg, "\n%s: %s",					     _("Encoding", term),					     cached->encoding_info);		}		a = parse_header(cached->head, "Date", NULL);		if (a) {			add_format_to_string(&msg, "\n%s: %s",					     _("Date", term), a);			mem_free(a);		}		if (cached->last_modified) {			add_format_to_string(&msg, "\n%s: %s",					     _("Last modified", term),					     cached->last_modified);		}	}#ifdef CONFIG_GLOBHIST	{		unsigned char *last_visit = NULL;		struct global_history_item *historyitem;		add_format_to_string(&msg, "\n%s: ",				     _("Last visit time", term));		historyitem = get_global_history_item(struri(location->vs.uri));		if (historyitem) last_visit = ctime(&historyitem->last_visit);		/* GNU's documentation says that ctime() can return NULL.		 * The Open Group Base Specifications Issue 6 implies		 * otherwise, but is ambiguous. Let's be safe. -- Miciah		 */		if (last_visit) {			/* The string returned by ctime() includes a newline,			 * and we don't want that, so we use add_bytes_to_str.			 * The string always has exactly 25 characters, so add			 * 24 bytes: The length of the string, minus one for			 * the newline. -- Miciah			 */			add_bytes_to_string(&msg, last_visit, 24);		} else {			add_to_string(&msg, _("Unknown", term));		}	}#endif	if (doc_view) {		unsigned char *a = get_current_link_info(ses, doc_view);		struct link *link;		add_char_to_string(&msg, '\n');		if (a) {			add_format_to_string(&msg, "\n%s: %s",					     _("Link", term), a);			mem_free(a);		}		a = get_current_link_title(doc_view);		if (a) {			add_format_to_string(&msg, "\n%s: %s",					     _("Link title", term), a);			mem_free(a);		}		link = get_current_link_in_view(doc_view);		if (link) {			struct string img;#ifdef CONFIG_GLOBHIST			struct global_history_item *historyitem;#endif			if (link->where_img && init_string(&img)) {				add_string_uri_to_string(&img, link->where_img,							 URI_PUBLIC);				decode_uri_string_for_display(&img);				add_format_to_string(&msg, "\n%s: %s",						     _("Link image", term),						     img.source);				done_string(&img);			}#ifdef CONFIG_GLOBHIST			historyitem = get_global_history_item(link->where);			if (historyitem) {				unsigned char *last_visit;				last_visit = ctime(&historyitem->last_visit);				if (last_visit)					add_format_to_string(&msg,						"\n%s: %.24s",						_("Link last visit time",						  term),						last_visit);				if (*historyitem->title)					add_format_to_string(&msg, "\n%s: %s",						_("Link title (from history)",						  term),						historyitem->title);			}#endif		}	}	info_box(term, MSGBOX_FREE_TEXT | MSGBOX_SCROLLABLE,		 N_("Info"), ALIGN_LEFT, msg.source);}voidcached_header_dialog(struct session *ses, struct cache_entry *cached){	int msgbox_flags = 0;	unsigned char *title = N_("Header info");	unsigned char *headers = NULL;	int i = 0, j = 0;	if (!cached || !cached->head || !*cached->head)		goto display_headers;#ifdef CONFIG_DEBUG	/* If |cached->head| starts with a newline, it has been	 * internally generated, usually to give ELinks-generated	 * documents (e.g., file:// directory listings) a MIME type	 * of text/html. */	if (*cached->head == '\r')		title = N_("Internal header info");#endif	headers = mem_alloc(strlen(cached->head) + 1);	if (!headers) return;	/* Sanitize headers string. */	/* XXX: Do we need to check length and limit	 * it to something reasonable? */	while (cached->head[i]) {		/* Check for control chars. */		if (cached->head[i] < ' '		    && cached->head[i] != '\n') {			/* Ignore '\r' but replace			 * other control chars with			 * a visible char. */			if (cached->head[i] != '\r') {				 headers[j] = '*';				 j++;			}		} else {			headers[j] = cached->head[i];			j++;		}		i++;	}	/* Ensure null termination. */	headers[j] = '\0';	/* Remove any trailing newlines. */	while (j && headers[--j] == '\n')		headers[j] = '\0';	if (!*headers)		mem_free_set(&headers, NULL);display_headers:	if (!headers) {		headers = N_("No header info.");	} else {		msgbox_flags = MSGBOX_FREE_TEXT | MSGBOX_SCROLLABLE;	}	/* Headers info message box. */	info_box(ses->tab->term, msgbox_flags,		title, ALIGN_LEFT, headers);}/* Headers info. message box. */voidprotocol_header_dialog(struct session *ses){	if (!have_location(ses)) {		nowhere_box(ses->tab->term, N_("Header info"));		return;	}	cached_header_dialog(ses, find_in_cache(cur_loc(ses)->vs.uri));}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -