jQuery RSS/ATOM feed parser plugin
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

170 lines
4.6 KiB

/* jFeed : jQuery feed parser plugin
* Copyright (C) 2007 Jean-François Hovinne - http://www.hovinne.com/
* Dual licensed under the MIT (MIT-license.txt)
* and GPL (GPL-license.txt) licenses.
*/
jQuery.getFeed = function(options) {
options = jQuery.extend({
url: null,
data: null,
cache: true,
success: null,
failure: null,
error: null,
global: true
}, options);
if (options.url) {
if (jQuery.isFunction(options.failure) && jQuery.type(options.error)==='null') {
// Handle legacy failure option
options.error = function(xhr, msg, e){
options.failure(msg, e);
}
} else if (jQuery.type(options.failure) === jQuery.type(options.error) === 'null') {
// Default error behavior if failure & error both unspecified
options.error = function(xhr, msg, e){
window.console&&console.log('getFeed failed to load feed', xhr, msg, e);
}
}
return $.ajax({
type: 'GET',
url: options.url,
data: options.data,
cache: options.cache,
dataType: (jQuery.browser.msie) ? "text" : "xml",
success: function(xml) {
var feed = new JFeed(xml);
if (jQuery.isFunction(options.success)) options.success(feed);
},
error: options.error,
global: options.global
});
}
};
function JFeed(xml) {
if (xml) this.parse(xml);
}
;
JFeed.prototype = {
type: '',
version: '',
title: '',
link: '',
description: '',
parse: function(xml) {
if (jQuery.browser.msie) {
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.loadXML(xml);
xml = xmlDoc;
}
if (jQuery('channel', xml).length == 1) {
this.type = 'rss';
var feedClass = new JRss(xml);
} else if (jQuery('feed', xml).length == 1) {
this.type = 'atom';
var feedClass = new JAtom(xml);
}
if (feedClass) jQuery.extend(this, feedClass);
}
};
function JFeedItem() {};
JFeedItem.prototype = {
title: '',
link: '',
description: '',
updated: '',
id: ''
};
function JAtom(xml) {
this._parse(xml);
};
JAtom.prototype = {
_parse: function(xml) {
var channel = jQuery('feed', xml).eq(0);
this.version = '1.0';
this.title = jQuery(channel).find('title:first').text();
this.link = jQuery(channel).find('link:first').attr('href');
this.description = jQuery(channel).find('subtitle:first').text();
this.language = jQuery(channel).attr('xml:lang');
this.updated = jQuery(channel).find('updated:first').text();
this.items = new Array();
var feed = this;
jQuery('entry', xml).each( function() {
var item = new JFeedItem();
item.title = jQuery(this).find('title').eq(0).text();
item.link = jQuery(this).find('link').eq(0).attr('href');
item.description = jQuery(this).find('content').eq(0).text();
item.updated = jQuery(this).find('updated').eq(0).text();
item.id = jQuery(this).find('id').eq(0).text();
feed.items.push(item);
});
}
};
function JRss(xml) {
this._parse(xml);
};
JRss.prototype = {
_parse: function(xml) {
if(jQuery('rss', xml).length == 0) this.version = '1.0';
else this.version = jQuery('rss', xml).eq(0).attr('version');
var channel = jQuery('channel', xml).eq(0);
this.title = jQuery(channel).find('title:first').text();
this.link = jQuery(channel).find('link:first').text();
this.description = jQuery(channel).find('description:first').text();
this.language = jQuery(channel).find('language:first').text();
this.updated = jQuery(channel).find('lastBuildDate:first').text();
this.items = new Array();
var feed = this;
jQuery('item', xml).each( function() {
var item = new JFeedItem();
item.title = jQuery(this).find('title').eq(0).text();
item.link = jQuery(this).find('link').eq(0).text();
item.description = jQuery(this).find('description').eq(0).text();
item.updated = jQuery(this).find('pubDate').eq(0).text();
item.id = jQuery(this).find('guid').eq(0).text();
feed.items.push(item);
});
}
};