From 9a0bf837565b482e84dc65bf6b23438babc15797 Mon Sep 17 00:00:00 2001 From: Jonas Fonseca Date: Fri, 30 Dec 2005 22:19:32 +0100 Subject: [PATCH] Add basic stuff for XBEL parsing/highlighting using the DOM engine --- src/document/renderer.c | 5 +- src/dom/sgml/Makefile | 2 +- src/dom/sgml/sgml.c | 2 + src/dom/sgml/sgml.h | 1 + src/dom/sgml/xbel/Makefile | 6 ++ src/dom/sgml/xbel/attribute.inc | 14 ++++ src/dom/sgml/xbel/element.inc | 12 +++ src/dom/sgml/xbel/xbel.c | 35 +++++++++ src/dom/sgml/xbel/xbel.h | 28 +++++++ src/mime/backend/default.c | 1 + src/session/download.c | 3 + test/xbel/favorez.xbel | 134 ++++++++++++++++++++++++++++++++ 12 files changed, 241 insertions(+), 2 deletions(-) create mode 100644 src/dom/sgml/xbel/Makefile create mode 100644 src/dom/sgml/xbel/attribute.inc create mode 100644 src/dom/sgml/xbel/element.inc create mode 100644 src/dom/sgml/xbel/xbel.c create mode 100644 src/dom/sgml/xbel/xbel.h create mode 100644 test/xbel/favorez.xbel diff --git a/src/document/renderer.c b/src/document/renderer.c index 5fc369e7..d3168940 100644 --- a/src/document/renderer.c +++ b/src/document/renderer.c @@ -242,7 +242,10 @@ render_encoded_document(struct cache_entry *cached, struct document *document) #ifdef CONFIG_DOM if (cached->content_type && (!strlcasecmp("text/html", 9, cached->content_type, -1) - || !strlcasecmp("application/rss+xml", 19, cached->content_type, -1))) + || !strlcasecmp("application/rss+xml", 19, cached->content_type, -1) + || !strlcasecmp("application/xbel+xml", 20, cached->content_type, -1) + || !strlcasecmp("application/x-xbel", 18, cached->content_type, -1) + || !strlcasecmp("application/xbel", 16, cached->content_type, -1))) render_dom_document(cached, document, &buffer); else #endif diff --git a/src/dom/sgml/Makefile b/src/dom/sgml/Makefile index 23dceb31..a899f393 100644 --- a/src/dom/sgml/Makefile +++ b/src/dom/sgml/Makefile @@ -1,7 +1,7 @@ top_builddir=../../.. include $(top_builddir)/Makefile.config -SUBDIRS = html rss +SUBDIRS = html rss xbel OBJS = sgml.o parser.o scanner.o include $(top_srcdir)/Makefile.lib diff --git a/src/dom/sgml/sgml.c b/src/dom/sgml/sgml.c index b5181a72..49445321 100644 --- a/src/dom/sgml/sgml.c +++ b/src/dom/sgml/sgml.c @@ -18,6 +18,7 @@ #include "dom/sgml/html/html.h" #include "dom/sgml/rss/rss.h" +#include "dom/sgml/xbel/xbel.h" int @@ -32,6 +33,7 @@ sgml_info_strcmp(const void *key_, const void *node_) struct sgml_info *sgml_info[SGML_DOCTYPES] = { &sgml_html_info, &sgml_rss_info, + &sgml_xbel_info, }; struct sgml_info * diff --git a/src/dom/sgml/sgml.h b/src/dom/sgml/sgml.h index 4c5664a8..0e059f60 100644 --- a/src/dom/sgml/sgml.h +++ b/src/dom/sgml/sgml.h @@ -78,6 +78,7 @@ get_sgml_node_info(struct sgml_node_info list[], struct dom_node *node) enum sgml_document_type { SGML_DOCTYPE_HTML, SGML_DOCTYPE_RSS, + SGML_DOCTYPE_XBEL, SGML_DOCTYPES, }; diff --git a/src/dom/sgml/xbel/Makefile b/src/dom/sgml/xbel/Makefile new file mode 100644 index 00000000..22248de0 --- /dev/null +++ b/src/dom/sgml/xbel/Makefile @@ -0,0 +1,6 @@ +top_builddir=../../../.. +include $(top_builddir)/Makefile.config + +OBJS = xbel.o + +include $(top_srcdir)/Makefile.lib diff --git a/src/dom/sgml/xbel/attribute.inc b/src/dom/sgml/xbel/attribute.inc new file mode 100644 index 00000000..e5c1bd3a --- /dev/null +++ b/src/dom/sgml/xbel/attribute.inc @@ -0,0 +1,14 @@ +/* XBEL attributes */ +/* http://pyxml.sourceforge.net/topics/xbel/docs/html/public-text.html */ + +#undef VERSION + +XBEL_(ATTRIBUTE, ADDED, 0), +XBEL_(ATTRIBUTE, FOLDED, 0), +XBEL_(ATTRIBUTE, HREF, SGML_ATTRIBUTE_REFERENCE), +XBEL_(ATTRIBUTE, ID, SGML_ATTRIBUTE_IDENTIFIER), +XBEL_(ATTRIBUTE, MODIFIED, 0), +XBEL_(ATTRIBUTE, OWNER, 0), +XBEL_(ATTRIBUTE, REF, 0), +XBEL_(ATTRIBUTE, VERSION, 0), +XBEL_(ATTRIBUTE, VISITED, 0), diff --git a/src/dom/sgml/xbel/element.inc b/src/dom/sgml/xbel/element.inc new file mode 100644 index 00000000..ff8e457b --- /dev/null +++ b/src/dom/sgml/xbel/element.inc @@ -0,0 +1,12 @@ +/* XBEL elements */ +/* http://pyxml.sourceforge.net/topics/xbel/docs/html/public-text.html */ + +XBEL_(ELEMENT, ALIAS, SGML_ELEMENT_EMPTY), +XBEL_(ELEMENT, BOOKMARK, 0), +XBEL_(ELEMENT, DESC, 0), +XBEL_(ELEMENT, FOLDER, 0), +XBEL_(ELEMENT, INFO, 0), +XBEL_(ELEMENT, METADATA, 0), +XBEL_(ELEMENT, SEPARATOR, 0), +XBEL_(ELEMENT, TITLE, 0), +XBEL_(ELEMENT, XBEL, 0), diff --git a/src/dom/sgml/xbel/xbel.c b/src/dom/sgml/xbel/xbel.c new file mode 100644 index 00000000..acfcf10c --- /dev/null +++ b/src/dom/sgml/xbel/xbel.c @@ -0,0 +1,35 @@ +/* SGML node handling */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include + +#include "elinks.h" + +#include "dom/sgml/xbel/xbel.h" +#include "dom/sgml/sgml.h" + + +#define XBEL_(node, name, id) SGML_NODE_INFO(XBEL, node, name, id) + +static struct sgml_node_info xbel_attributes[XBEL_ATTRIBUTES] = { + SGML_NODE_HEAD(XBEL, ATTRIBUTE), + +#include "dom/sgml/xbel/attribute.inc" +}; + +static struct sgml_node_info xbel_elements[XBEL_ELEMENTS] = { + SGML_NODE_HEAD(XBEL, ELEMENT), + +#include "dom/sgml/xbel/element.inc" +}; + + +struct sgml_info sgml_xbel_info = { + SGML_DOCTYPE_XBEL, + xbel_attributes, + xbel_elements, +}; diff --git a/src/dom/sgml/xbel/xbel.h b/src/dom/sgml/xbel/xbel.h new file mode 100644 index 00000000..493c4940 --- /dev/null +++ b/src/dom/sgml/xbel/xbel.h @@ -0,0 +1,28 @@ +#ifndef EL_DOM_SGML_XBEL_XBEL_H +#define EL_DOM_SGML_XBEL_XBEL_H + +#include "dom/sgml/sgml.h" + +extern struct sgml_info sgml_xbel_info; + +#define XBEL_(node, name, flags) SGML_NODE_INFO_TYPE(XBEL, node, name) + +enum xbel_element_type { + XBEL_ELEMENT_UNKNOWN, + +#include "dom/sgml/xbel/element.inc" + + XBEL_ELEMENTS, +}; + +enum xbel_attribute_type { + XBEL_ATTRIBUTE_UNKNOWN, + +#include "dom/sgml/xbel/attribute.inc" + + XBEL_ATTRIBUTES, +}; + +#undef XBEL_ + +#endif diff --git a/src/mime/backend/default.c b/src/mime/backend/default.c index d1fc2a70..a32803a8 100644 --- a/src/mime/backend/default.c +++ b/src/mime/backend/default.c @@ -99,6 +99,7 @@ static struct option_info default_mime_options[] = { #endif #ifdef CONFIG_DOM INIT_OPT_MIME_EXTENSION("rss", "application/rss+xml"), + INIT_OPT_MIME_EXTENSION("xbel", "application/xbel+xml"), #endif NULL_OPTION_INFO, diff --git a/src/session/download.c b/src/session/download.c index 2455ef90..3e3ad241 100644 --- a/src/session/download.c +++ b/src/session/download.c @@ -1148,6 +1148,9 @@ struct { { "application/xhtml+xml", 0 }, /* RFC 3236 */ #if CONFIG_DOM { "application/rss+xml", 1 }, + { "application/xbel+xml", 1 }, + { "application/xbel", 1 }, + { "application/x-xbel", 1 }, #endif { "text/plain", 1 }, { NULL, 1 }, diff --git a/test/xbel/favorez.xbel b/test/xbel/favorez.xbel new file mode 100644 index 00000000..fc1e23a3 --- /dev/null +++ b/test/xbel/favorez.xbel @@ -0,0 +1,134 @@ + + + +]> + +Administrator Favorieten + +Administrator favorite bookmarks + + + top + + Inside Netscape + + Browser Central + + + Free E-mail + + + Google Search ACM_PLAY + + + Netscape Information + + + Red Hat -- Linux, Embedded Linux and Open Sou... + + + Shop@Netscape + + + + XML + + 15 Seconds Advanced UI Design Using XML and ... + + + BIOML - Chapter 4 Extending BIOML + + + JavaWSTutorialTOC.html + + + namespaces + + [XML-SIG] XBEL documentation, draft + + + Namespaces in XML + + + + Navigating Along the ancestor Axis + + + Producing HTML tables with XSLT + + + STG XML Validation Form + + + URIs and Ids + + + Use recursion effectively in XSL + + + XML Bookmark Exchange Language (XBEL) Informa... + + + XML DOM - Validate XML + + + XML Spy - Import, Export, and Convert XML dat... + + + XML The Language of B2B E-commerce + + + XSL Languages + + + XSL Transformation + + + + JavaScript + + IBM United States + + + SourceForge.net Welcome + + + subfolder + + Microsoft Corporation + + + subsubfolder + + MySQL The World's Most Popular Open Source Da... + + + + WarpGear Software + + + + Sun Microsystems + + + + Amazon.co.uk At a glance IBM ViaVoice 10.0 Pr... + + + Delphi Programming Hide taskbar + + + MPEG-1 File Format Specification + + + Yellow Pages + + + NodeDB.com Wiki - Nokia-C110 + + +