/* -*- Mode: c; c-basic-offset: 2 -*-
*
* raptor_rss.h - Redland Parser Toolkit Internal RSS Model and API
*
* Copyright (C) 2004-2006, David Beckett http://purl.org/net/dajobe/
* Copyright (C) 2004-2005, University of Bristol, UK http://www.bristol.ac.uk/
*
* This package is Free Software and part of Redland http://librdf.org/
*
* It is licensed under the following three licenses as alternatives:
* 1. GNU Lesser General Public License (LGPL) V2.1 or any newer version
* 2. GNU General Public License (GPL) V2 or any newer version
* 3. Apache License, V2.0 or any newer version
*
* You may not use this file except in compliance with at least one of
* the above three licenses.
*
* See LICENSE.html or LICENSE.txt at the top of this package for the
* complete terms and further detail along with the license texts for
* the licenses in COPYING.LIB, COPYING and LICENSE-2.0.txt respectively.
*
*
*/
#ifndef RAPTOR_RSS_H
#define RAPTOR_RSS_H
#ifdef __cplusplus
extern "C" {
#endif
typedef enum {
/* common */
RAPTOR_RSS_CHANNEL,
RAPTOR_RSS_IMAGE,
RAPTOR_RSS_TEXTINPUT,
/* list items */
RAPTOR_RSS_ITEM,
/* atom author */
RAPTOR_ATOM_AUTHOR,
/* also common, but IGNORED */
RAPTOR_RSS_SKIPHOURS,
RAPTOR_RSS_SKIPDAYS,
RAPTOR_RSS_ENCLOSURE,
RAPTOR_ATOM_FEED,
RAPTOR_ATOM_ENTRY,
/* unknown name found */
RAPTOR_RSS_UNKNOWN,
/* nothing found yet */
RAPTOR_RSS_NONE,
/* deliberately not counting NONE */
RAPTOR_RSS_COMMON_SIZE = RAPTOR_RSS_NONE - RAPTOR_RSS_CHANNEL,
RAPTOR_RSS_COMMON_IGNORED = RAPTOR_RSS_SKIPHOURS
} raptor_rss_type;
/* Namespaces used in RSS */
#define RSS1_0_NAMESPACE_URI "http://purl.org/rss/1.0/"
#define RSS0_91_NAMESPACE_URI "http://purl.org/rss/1.0/modules/rss091#"
#define RSS2_0_ENC_NAMESPACE_URI "http://purl.oclc.org/net/rss_2.0/enc#"
#define ATOM0_3_NAMESPACE_URI "http://purl.org/atom/ns#"
#define DC_NAMESPACE_URI "http://purl.org/dc/elements/1.1/"
#define RSS1_1_NAMESPACE_URI "http://purl.org/net/rss1.1#"
#define CONTENT_NAMESPACE_URI "http://web.resource.org/rss/1.0/modules/content/"
#define ATOM1_0_NAMESPACE_URI "http://www.w3.org/2005/Atom"
#define RDF_NAMESPACE_URI "http://www.w3.org/1999/02/22-rdf-syntax-ns#"
/* Old netscape namespace, turn into RSS 1.0 */
#define RSS0_9_NAMESPACE_URI "http://my.netscape.com/rdf/simple/0.9/"
typedef enum {
RSS_UNKNOWN_NS = 0,
RSS_NO_NS = 1,
RSS0_91_NS = 2,
RSS0_9_NS = 3,
RSS0_92_NS = RSS_NO_NS,
RSS2_0_NS = RSS_NO_NS,
RSS1_0_NS = 4,
ATOM0_3_NS = 5,
DC_NS = 6,
RSS2_0_ENC_NS = 7,
RSS1_1_NS = 8,
CONTENT_NS = 9,
ATOM1_0_NS = 10,
RDF_NS = 11,
RAPTOR_RSS_NAMESPACES_SIZE = RDF_NS + 1
} rss_info_namespace;
typedef struct {
const char *const uri_string;
const char *prefix;
raptor_uri* uri;
raptor_namespace* nspace;
} raptor_rss_namespace_info;
extern raptor_rss_namespace_info raptor_rss_namespaces_info[RAPTOR_RSS_NAMESPACES_SIZE];
#define RAPTOR_RSS_INFO_FLAG_URI_VALUE 1
/* Typed nodes used in RSS */
typedef struct {
const char* name;
rss_info_namespace nspace;
int flags;
raptor_uri* uri;
raptor_qname* qname;
} raptor_rss_info;
extern raptor_rss_info raptor_rss_types_info[RAPTOR_RSS_COMMON_SIZE];
/* Fields of typed nodes used in RSS */
typedef enum {
RAPTOR_RSS_FIELD_TITLE,
RAPTOR_RSS_FIELD_LINK,
RAPTOR_RSS_FIELD_DESCRIPTION,
RAPTOR_RSS_FIELD_URL, /* image */
RAPTOR_RSS_FIELD_NAME, /* textinput */
RAPTOR_RSS_FIELD_LANGUAGE, /* channel 0.91 */
RAPTOR_RSS_FIELD_RATING, /* channel 0.91 */
RAPTOR_RSS_FIELD_COPYRIGHT, /* channel 0.91 */
RAPTOR_RSS_FIELD_PUBDATE, /* channel 0.91, item 2.0 */
RAPTOR_RSS_FIELD_LASTBUILDDATE, /* channel 0.91 */
RAPTOR_RSS_FIELD_DOCS, /* channel 0.91 */
RAPTOR_RSS_FIELD_MANAGINGEDITOR,/* channel 0.91 */
RAPTOR_RSS_FIELD_WEBMASTER, /* channel 0.91 */
RAPTOR_RSS_FIELD_CLOUD, /* channel 0.92, 2.0 */
RAPTOR_RSS_FIELD_TTL, /* channel 2.0 */
RAPTOR_RSS_FIELD_WIDTH, /* image 0.91 */
RAPTOR_RSS_FIELD_HEIGHT, /* image 0.91 */
RAPTOR_RSS_FIELD_HOUR, /* skipHours 0.91 */
RAPTOR_RSS_FIELD_DAY, /* skipDays 0.91 */
RAPTOR_RSS_FIELD_GENERATOR, /* channel 0.92, 2.0 */
RAPTOR_RSS_FIELD_SOURCE, /* item 0.92, 2.0 */
RAPTOR_RSS_FIELD_AUTHOR, /* item 2.0 */
RAPTOR_RSS_FIELD_GUID, /* item 2.0 */
RAPTOR_RSS_FIELD_ENCLOSURE, /* item 0.92, 2.0 */
RAPTOR_RSS_RDF_ENCLOSURE, /* In RDF output, not an RSS field */
RAPTOR_RSS_RDF_ENCLOSURE_URL, /* In RDF output, not an RSS field */
RAPTOR_RSS_RDF_ENCLOSURE_LENGTH, /* In RDF output, not an RSS field */
RAPTOR_RSS_RDF_ENCLOSURE_TYPE, /* In RDF output, not an RSS field */
RAPTOR_RSS_FIELD_LENGTH, /* item 0.92, 2.0 */
RAPTOR_RSS_FIELD_TYPE, /* item 0.92, 2.0 */
RAPTOR_RSS_FIELD_CATEGORY, /* item 0.92, 2.0, channel 2.0 */
RAPTOR_RSS_FIELD_COMMENTS, /* comments v? */
RAPTOR_RSS_FIELD_ITEMS, /* rss 1.0 items */
RAPTOR_RSS_FIELD_IMAGE, /* rss 1.0 property from channel->image) */
RAPTOR_RSS_FIELD_TEXTINPUT, /* rss 1.0 property from channel->textinput */
RAPTOR_RSS_FIELD_ATOM_COPYRIGHT, /* atom 0.3 copyright */
RAPTOR_RSS_FIELD_ATOM_CREATED, /* atom 0.3 created */
RAPTOR_RSS_FIELD_ATOM_ISSUED, /* atom 0.3 issued */
RAPTOR_RSS_FIELD_ATOM_MODIFIED, /* atom 0.3 modified */
RAPTOR_RSS_FIELD_ATOM_TAGLINE, /* atom 0.3 tagline */
RAPTOR_RSS_FIELD_ATOM_AUTHOR, /* atom 1.0 author */
RAPTOR_RSS_FIELD_ATOM_CATEGORY, /* atom 1.0 category */
RAPTOR_RSS_FIELD_ATOM_CONTENT, /* atom 1.0 content */
RAPTOR_RSS_FIELD_ATOM_CONTRIBUTOR, /* atom 1.0 contributor */
RAPTOR_RSS_FIELD_ATOM_EMAIL, /* atom 1.0 email */
RAPTOR_RSS_FIELD_ATOM_ENTRY, /* atom 1.0 entry */
RAPTOR_RSS_FIELD_ATOM_FEED, /* atom 1.0 feed */
RAPTOR_RSS_FIELD_ATOM_GENERATOR, /* atom 1.0 generator */
RAPTOR_RSS_FIELD_ATOM_ICON, /* atom 1.0 icon */
RAPTOR_RSS_FIELD_ATOM_ID, /* atom 1.0 id */
RAPTOR_RSS_FIELD_ATOM_LINK, /* atom 1.0 link */
RAPTOR_RSS_FIELD_ATOM_LOGO, /* atom 1.0 logo */
RAPTOR_RSS_FIELD_ATOM_NAME, /* atom 1.0 name */
RAPTOR_RSS_FIELD_ATOM_PUBLISHED, /* atom 1.0 published */
RAPTOR_RSS_FIELD_ATOM_RIGHTS, /* atom 1.0 rights */
RAPTOR_RSS_FIELD_ATOM_SOURCE, /* atom 1.0 source */
RAPTOR_RSS_FIELD_ATOM_SUBTITLE, /* atom 1.0 subtitle */
RAPTOR_RSS_FIELD_ATOM_SUMMARY, /* atom 1.0 summary */
RAPTOR_RSS_FIELD_ATOM_TITLE, /* atom 1.0 title */
RAPTOR_RSS_FIELD_ATOM_UPDATED, /* atom 1.0 updated */
RAPTOR_RSS_FIELD_ATOM_URI, /* atom 1.0 uri */
RAPTOR_RSS_FIELD_DC_TITLE, /* DC title */
RAPTOR_RSS_FIELD_DC_CONTRIBUTOR, /* DC contributor */
RAPTOR_RSS_FIELD_DC_CREATOR, /* DC creator */
RAPTOR_RSS_FIELD_DC_PUBLISHER, /* DC publisher */
RAPTOR_RSS_FIELD_DC_SUBJECT, /* DC subject */
RAPTOR_RSS_FIELD_DC_DESCRIPTION, /* DC description */
RAPTOR_RSS_FIELD_DC_DATE, /* DC date */
RAPTOR_RSS_FIELD_DC_TYPE, /* DC type */
RAPTOR_RSS_FIELD_DC_FORMAT, /* DC format */
RAPTOR_RSS_FIELD_DC_IDENTIFIER, /* DC identifier */
RAPTOR_RSS_FIELD_DC_LANGUAGE, /* DC language */
RAPTOR_RSS_FIELD_DC_RELATION, /* DC relation */
RAPTOR_RSS_FIELD_DC_SOURCE, /* DC source */
RAPTOR_RSS_FIELD_DC_COVERAGE, /* DC coverage */
RAPTOR_RSS_FIELD_DC_RIGHTS, /* DC rights */
RAPTOR_RSS_FIELD_CONTENT_ENCODED, /* rss 1.0 module content:encoded */
RAPTOR_RSS_FIELD_UNKNOWN,
RAPTOR_RSS_FIELD_NONE,
RAPTOR_RSS_FIELDS_SIZE=RAPTOR_RSS_FIELD_UNKNOWN
} raptor_rss_fields_type;
extern raptor_rss_info raptor_rss_fields_info[RAPTOR_RSS_FIELDS_SIZE+2];
typedef struct {
raptor_rss_fields_type from;
raptor_rss_fields_type to;
} raptor_field_pair;
extern const raptor_field_pair raptor_atom_to_rss[];
/* RSS enclosure support */
struct raptor_rss_enclosure_s
{
raptor_identifier identifier;
raptor_uri *node_type;
raptor_uri *url;
char *length;
char *type;
struct raptor_rss_enclosure_s* next;
};
typedef struct raptor_rss_enclosure_s raptor_rss_enclosure;
struct raptor_rss_field_s
{
unsigned char* value;
raptor_uri* uri;
struct raptor_rss_field_s* next;
};
typedef struct raptor_rss_field_s raptor_rss_field;
/* RSS items (instances of typed nodes) containing fields */
struct raptor_rss_item_s
{
raptor_uri *uri;
raptor_identifier identifier;
raptor_rss_info *node_type;
raptor_rss_field* fields[RAPTOR_RSS_FIELDS_SIZE];
raptor_rss_enclosure* enclosure;
int fields_count;
struct raptor_rss_item_s* next;
};
typedef struct raptor_rss_item_s raptor_rss_item;
/* raptor_rss_common.c */
#define RAPTOR_RSS_N_CONCEPTS 2
#define RAPTOR_RSS_RDF_type_URI(rss_model) ((rss_model)->concepts[0])
#define RAPTOR_RSS_RDF_Seq_URI(rss_model) ((rss_model)->concepts[1])
typedef struct {
/* RAPTOR_RSS_CHANNEL, RAPTOR_RSS_IMAGE, RAPTOR_RSS_TEXTINPUT */
raptor_rss_item* common[RAPTOR_RSS_COMMON_SIZE];
/* list of items RAPTOR_RSS_ITEM */
raptor_rss_item* items;
/* this points to the last one added, so we can append easy */
raptor_rss_item* last;
/* item count */
int items_count;
raptor_uri* concepts[RAPTOR_RSS_N_CONCEPTS];
raptor_namespace_stack *nstack;
} raptor_rss_model;
/* raptor_rss_common.c */
void raptor_rss_common_init(void);
void raptor_rss_common_terminate(void);
void raptor_rss_model_init(raptor_rss_model* rss_model);
void raptor_rss_model_clear(raptor_rss_model* rss_model);
void raptor_rss_model_add_item(raptor_rss_model* rss_model);
raptor_rss_item* raptor_rss_model_add_common(raptor_rss_model* rss_model, raptor_rss_type type);
raptor_rss_item* raptor_rss_model_get_common(raptor_rss_model* rss_model, raptor_rss_type type);
void raptor_clear_rss_item(raptor_rss_item* item);
void raptor_free_rss_item(raptor_rss_item* item);
void raptor_rss_item_add_enclosure(raptor_rss_item* item, raptor_rss_enclosure* enclosure);
void raptor_rss_item_add_field(raptor_rss_item* item, int type, raptor_rss_field* field);
raptor_rss_enclosure* raptor_rss_new_enclosure(void);
void raptor_enclosure_free(raptor_rss_enclosure* enclosure);
raptor_rss_field* raptor_rss_new_field(void);
void raptor_rss_field_free(raptor_rss_field* field);
int raptor_rss_date_uplift(raptor_rss_field* to_field, const unsigned char *date_string);
#ifdef __cplusplus
}
#endif
#endif