mirror of
https://github.com/rkd77/elinks.git
synced 2024-12-04 14:46:47 -05:00
Add basic support for RSS parsing for application/rss+xml content types
This means the RSS source will be highlighted, but by default the HTML renderer will be used for the default rendering.
This commit is contained in:
parent
5777941d06
commit
56d634b946
@ -811,6 +811,7 @@ render_dom_document(struct cache_entry *cached, struct document *document,
|
||||
struct dom_renderer renderer;
|
||||
struct conv_table *convert_table;
|
||||
struct sgml_parser *parser;
|
||||
enum sgml_document_type doctype;
|
||||
|
||||
assert(document->options.plain);
|
||||
|
||||
@ -824,7 +825,13 @@ render_dom_document(struct cache_entry *cached, struct document *document,
|
||||
|
||||
document->bgcolor = document->options.default_bg;
|
||||
|
||||
parser = init_sgml_parser(SGML_PARSER_STREAM, SGML_DOCTYPE_HTML,
|
||||
if (cached->content_type
|
||||
&& !strlcasecmp("application/rss+xml", 19, cached->content_type, -1))
|
||||
doctype = SGML_DOCTYPE_RSS;
|
||||
else
|
||||
doctype = SGML_DOCTYPE_HTML;
|
||||
|
||||
parser = init_sgml_parser(SGML_PARSER_STREAM, doctype,
|
||||
&renderer, cached->uri,
|
||||
dom_source_renderer_push_callbacks,
|
||||
dom_source_renderer_pop_callbacks);
|
||||
|
@ -19,6 +19,7 @@
|
||||
#include "document/html/renderer.h"
|
||||
#include "document/plain/renderer.h"
|
||||
#include "document/renderer.h"
|
||||
#include "document/rss/renderer.h"
|
||||
#include "document/view.h"
|
||||
#include "ecmascript/ecmascript.h"
|
||||
#include "encoding/encoding.h"
|
||||
@ -241,7 +242,8 @@ render_encoded_document(struct cache_entry *cached, struct document *document)
|
||||
if (document->options.plain) {
|
||||
#ifdef CONFIG_DOM
|
||||
if (cached->content_type
|
||||
&& !strlcasecmp("text/html", 9, cached->content_type, -1))
|
||||
&& (!strlcasecmp("text/html", 9, cached->content_type, -1)
|
||||
|| !strlcasecmp("application/rss+xml", 19, cached->content_type, -1)))
|
||||
render_dom_document(cached, document, &buffer);
|
||||
else
|
||||
#endif
|
||||
|
@ -1,7 +1,7 @@
|
||||
top_builddir=../../..
|
||||
include $(top_builddir)/Makefile.config
|
||||
|
||||
SUBDIRS = html
|
||||
SUBDIRS = html rss
|
||||
OBJS = sgml.o parser.o scanner.o
|
||||
|
||||
include $(top_srcdir)/Makefile.lib
|
||||
|
3
src/document/sgml/rss/attribute.inc
Normal file
3
src/document/sgml/rss/attribute.inc
Normal file
@ -0,0 +1,3 @@
|
||||
/* RSS attributes */
|
||||
|
||||
RSS_(ATTRIBUTE, ISPERMALINK, 0),
|
10
src/document/sgml/rss/element.inc
Normal file
10
src/document/sgml/rss/element.inc
Normal file
@ -0,0 +1,10 @@
|
||||
/* RSS elements */
|
||||
|
||||
RSS_(ELEMENT, CHANNEL, 0),
|
||||
RSS_(ELEMENT, ITEM, 0),
|
||||
RSS_(ELEMENT, TITLE, 0),
|
||||
RSS_(ELEMENT, AUTHOR, 0),
|
||||
RSS_(ELEMENT, PUBDATE, 0),
|
||||
RSS_(ELEMENT, GUID, 0),
|
||||
RSS_(ELEMENT, LINK, 0),
|
||||
RSS_(ELEMENT, DESCRIPTION, 0),
|
35
src/document/sgml/rss/rss.c
Normal file
35
src/document/sgml/rss/rss.c
Normal file
@ -0,0 +1,35 @@
|
||||
/* SGML node handling */
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "elinks.h"
|
||||
|
||||
#include "document/sgml/rss/rss.h"
|
||||
#include "document/sgml/sgml.h"
|
||||
|
||||
|
||||
#define RSS_(node, name, id) SGML_NODE_INFO(RSS, node, name, id)
|
||||
|
||||
static struct sgml_node_info rss_attributes[RSS_ATTRIBUTES] = {
|
||||
SGML_NODE_HEAD(RSS, ATTRIBUTE),
|
||||
|
||||
#include "document/sgml/rss/attribute.inc"
|
||||
};
|
||||
|
||||
static struct sgml_node_info rss_elements[RSS_ELEMENTS] = {
|
||||
SGML_NODE_HEAD(RSS, ELEMENT),
|
||||
|
||||
#include "document/sgml/rss/element.inc"
|
||||
};
|
||||
|
||||
|
||||
struct sgml_info sgml_rss_info = {
|
||||
SGML_DOCTYPE_RSS,
|
||||
rss_attributes,
|
||||
rss_elements,
|
||||
};
|
28
src/document/sgml/rss/rss.h
Normal file
28
src/document/sgml/rss/rss.h
Normal file
@ -0,0 +1,28 @@
|
||||
#ifndef EL__DOCUMENT_SGML_RSS_RSS_H
|
||||
#define EL__DOCUMENT_SGML_RSS_RSS_H
|
||||
|
||||
#include "document/sgml/sgml.h"
|
||||
|
||||
extern struct sgml_info sgml_rss_info;
|
||||
|
||||
#define RSS_(node, name, flags) SGML_NODE_INFO_TYPE(RSS, node, name)
|
||||
|
||||
enum rss_element_type {
|
||||
RSS_ELEMENT_UNKNOWN,
|
||||
|
||||
#include "document/sgml/rss/element.inc"
|
||||
|
||||
RSS_ELEMENTS,
|
||||
};
|
||||
|
||||
enum rss_attribute_type {
|
||||
RSS_ATTRIBUTE_UNKNOWN,
|
||||
|
||||
#include "document/sgml/rss/attribute.inc"
|
||||
|
||||
RSS_ATTRIBUTES,
|
||||
};
|
||||
|
||||
#undef RSS_
|
||||
|
||||
#endif
|
@ -17,6 +17,7 @@
|
||||
/* Backend includes: */
|
||||
|
||||
#include "document/sgml/html/html.h"
|
||||
#include "document/sgml/rss/rss.h"
|
||||
|
||||
|
||||
int
|
||||
@ -30,6 +31,7 @@ sgml_info_strcmp(const void *key_, const void *node_)
|
||||
|
||||
struct sgml_info *sgml_info[SGML_DOCTYPES] = {
|
||||
&sgml_html_info,
|
||||
&sgml_rss_info,
|
||||
};
|
||||
|
||||
struct sgml_info *
|
||||
|
@ -77,6 +77,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_DOCTYPES,
|
||||
};
|
||||
|
@ -1146,6 +1146,7 @@ struct {
|
||||
} static known_types[] = {
|
||||
{ "text/html", 0 },
|
||||
{ "application/xhtml+xml", 0 }, /* RFC 3236 */
|
||||
{ "application/rss+xml", 0 },
|
||||
{ "text/plain", 1 },
|
||||
{ NULL, 1 },
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user