mirror of
https://github.com/LightAir/turbo-rss.git
synced 2026-02-04 03:56:19 +00:00
rss to yandex turbo
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1 +1,2 @@
|
||||
/.idea/
|
||||
node_modules
|
||||
|
||||
6
.idea/inspectionProfiles/Project_Default.xml
generated
Normal file
6
.idea/inspectionProfiles/Project_Default.xml
generated
Normal file
@@ -0,0 +1,6 @@
|
||||
<component name="InspectionProjectProfileManager">
|
||||
<profile version="1.0">
|
||||
<option name="myName" value="Project Default" />
|
||||
<inspection_tool class="JSHint" enabled="true" level="ERROR" enabled_by_default="true" />
|
||||
</profile>
|
||||
</component>
|
||||
85
.idea/jsLinters/jshint.xml
generated
Normal file
85
.idea/jsLinters/jshint.xml
generated
Normal file
@@ -0,0 +1,85 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="JSHintConfiguration" version="2.9.5" use-config-file="true">
|
||||
<option asi="false" />
|
||||
<option bitwise="true" />
|
||||
<option boss="false" />
|
||||
<option browser="true" />
|
||||
<option browserify="false" />
|
||||
<option camelcase="false" />
|
||||
<option couch="false" />
|
||||
<option curly="true" />
|
||||
<option debug="false" />
|
||||
<option devel="false" />
|
||||
<option dojo="false" />
|
||||
<option elision="false" />
|
||||
<option enforceall="false" />
|
||||
<option eqeqeq="true" />
|
||||
<option eqnull="false" />
|
||||
<option es3="false" />
|
||||
<option es5="false" />
|
||||
<option esnext="false" />
|
||||
<option evil="false" />
|
||||
<option expr="false" />
|
||||
<option forin="true" />
|
||||
<option freeze="false" />
|
||||
<option funcscope="false" />
|
||||
<option futurehostile="false" />
|
||||
<option gcl="false" />
|
||||
<option globalstrict="false" />
|
||||
<option immed="false" />
|
||||
<option iterator="false" />
|
||||
<option jasmine="false" />
|
||||
<option jquery="false" />
|
||||
<option lastsemic="false" />
|
||||
<option latedef="false" />
|
||||
<option laxbreak="false" />
|
||||
<option laxcomma="false" />
|
||||
<option loopfunc="false" />
|
||||
<option maxerr="50" />
|
||||
<option mocha="false" />
|
||||
<option module="false" />
|
||||
<option mootools="false" />
|
||||
<option moz="false" />
|
||||
<option multistr="false" />
|
||||
<option newcap="false" />
|
||||
<option noarg="true" />
|
||||
<option nocomma="false" />
|
||||
<option node="false" />
|
||||
<option noempty="true" />
|
||||
<option nomen="false" />
|
||||
<option nonbsp="false" />
|
||||
<option nonew="true" />
|
||||
<option nonstandard="false" />
|
||||
<option notypeof="false" />
|
||||
<option noyield="false" />
|
||||
<option onevar="false" />
|
||||
<option passfail="false" />
|
||||
<option phantom="false" />
|
||||
<option plusplus="false" />
|
||||
<option proto="false" />
|
||||
<option prototypejs="false" />
|
||||
<option qunit="false" />
|
||||
<option quotmark="false" />
|
||||
<option rhino="false" />
|
||||
<option scripturl="false" />
|
||||
<option shadow="false" />
|
||||
<option shelljs="false" />
|
||||
<option singleGroups="false" />
|
||||
<option smarttabs="false" />
|
||||
<option strict="true" />
|
||||
<option sub="false" />
|
||||
<option supernew="false" />
|
||||
<option trailing="false" />
|
||||
<option typed="false" />
|
||||
<option undef="true" />
|
||||
<option unused="false" />
|
||||
<option validthis="false" />
|
||||
<option varstmt="false" />
|
||||
<option white="false" />
|
||||
<option withstmt="false" />
|
||||
<option worker="false" />
|
||||
<option wsh="false" />
|
||||
<option yui="false" />
|
||||
</component>
|
||||
</project>
|
||||
@@ -1,4 +1,5 @@
|
||||
{
|
||||
"esversion":6,
|
||||
"curly": true,
|
||||
"eqeqeq": true,
|
||||
"immed": true,
|
||||
|
||||
193
lib/index.js
193
lib/index.js
@@ -1,9 +1,6 @@
|
||||
'use strict';
|
||||
|
||||
var mime = require('mime-types');
|
||||
var xml = require('xml');
|
||||
var fs = require('fs');
|
||||
|
||||
const xml = require('xml');
|
||||
|
||||
function ifTruePush(bool, array, data) {
|
||||
if (bool) {
|
||||
@@ -11,179 +8,91 @@ function ifTruePush(bool, array, data) {
|
||||
}
|
||||
}
|
||||
|
||||
function ifTruePushArray(bool, array, dataArray) {
|
||||
if(!bool) {
|
||||
return;
|
||||
}
|
||||
function generateXML(data) {
|
||||
|
||||
dataArray.forEach(function(item) {
|
||||
ifTruePush(item, array, item);
|
||||
});
|
||||
}
|
||||
let channel = [];
|
||||
|
||||
function getSize(filename) {
|
||||
if (typeof fs === 'undefined') {
|
||||
return 0;
|
||||
}
|
||||
return fs.statSync(filename).size;
|
||||
}
|
||||
channel.push({title: {_cdata: data.title}});
|
||||
channel.push({link: data.link || 'http://github.com/lightair/yandex-turbo'});
|
||||
channel.push({description: {_cdata: data.description || data.title}});
|
||||
channel.push({language: 'ru'});
|
||||
|
||||
function generateXML (data){
|
||||
data.items.forEach(function (item) {
|
||||
|
||||
var channel = [];
|
||||
channel.push({ title: { _cdata: data.title } });
|
||||
channel.push({ description: { _cdata: data.description || data.title } });
|
||||
channel.push({ link: data.site_url || 'http://github.com/dylang/node-rss' });
|
||||
// image_url set?
|
||||
if (data.image_url) {
|
||||
channel.push({ image: [ {url: data.image_url}, {title: data.title}, {link: data.site_url} ] });
|
||||
}
|
||||
channel.push({ generator: data.generator });
|
||||
channel.push({ lastBuildDate: new Date().toUTCString() });
|
||||
let item_values = [];
|
||||
|
||||
ifTruePush(data.feed_url, channel, { 'atom:link': { _attr: { href: data.feed_url, rel: 'self', type: 'application/rss+xml' } } });
|
||||
ifTruePush(data.author, channel, { 'author': { _cdata: data.author } });
|
||||
ifTruePush(data.pubDate, channel, { 'pubDate': new Date(data.pubDate).toGMTString() });
|
||||
ifTruePush(data.copyright, channel, { 'copyright': { _cdata: data.copyright } });
|
||||
ifTruePush(data.language, channel, { 'language': { _cdata: data.language } });
|
||||
ifTruePush(data.managingEditor, channel, { 'managingEditor': { _cdata: data.managingEditor } });
|
||||
ifTruePush(data.webMaster, channel, { 'webMaster': { _cdata: data.webMaster } });
|
||||
ifTruePush(data.docs, channel, { 'docs': data.docs });
|
||||
ifTruePush(data.ttl, channel, { 'ttl': data.ttl });
|
||||
ifTruePush(data.hub, channel, { 'atom:link': { _attr: { href: data.hub, rel: 'hub' } } });
|
||||
item_values.push({_attr: {'turbo': 'true'}});
|
||||
|
||||
if (data.categories) {
|
||||
data.categories.forEach(function(category) {
|
||||
ifTruePush(category, channel, { category: { _cdata: category } });
|
||||
});
|
||||
}
|
||||
item_values.push({link: item.url});
|
||||
item_values.push({'turbo:source': item.url});
|
||||
// item_values.push({'turbo:topic': item.title});
|
||||
|
||||
ifTruePushArray(data.custom_elements, channel, data.custom_elements);
|
||||
ifTruePush(item.date, item_values, {pubDate: new Date(item.date).toGMTString()});
|
||||
ifTruePush(item.author, item_values, {author: item.author});
|
||||
|
||||
data.items.forEach(function(item) {
|
||||
var item_values = [
|
||||
{ title: { _cdata: item.title } }
|
||||
];
|
||||
ifTruePush(item.description, item_values, { description: { _cdata: item.description } });
|
||||
ifTruePush(item.url, item_values, { link: item.url });
|
||||
ifTruePush(item.link || item.guid || item.title, item_values, { guid: [ { _attr: { isPermaLink: !item.guid && !!item.url } }, item.guid || item.url || item.title ] });
|
||||
let img = '';
|
||||
let menu = '';
|
||||
|
||||
item.categories.forEach(function(category) {
|
||||
ifTruePush(category, item_values, { category: { _cdata: category } });
|
||||
});
|
||||
|
||||
ifTruePush(item.author || data.author, item_values, { 'dc:creator': { _cdata: item.author || data.author } });
|
||||
ifTruePush(item.date, item_values, { pubDate: new Date(item.date).toGMTString() });
|
||||
|
||||
//Set GeoRSS to true if lat and long are set
|
||||
data.geoRSS = data.geoRSS || (item.lat && item.long);
|
||||
ifTruePush(item.lat, item_values, {'geo:lat': item.lat});
|
||||
ifTruePush(item.long, item_values, {'geo:long': item.long});
|
||||
|
||||
if( item.enclosure && item.enclosure.url) {
|
||||
if( item.enclosure.file ) {
|
||||
item_values.push({
|
||||
enclosure : {
|
||||
_attr : {
|
||||
url : item.enclosure.url,
|
||||
length : item.enclosure.size || getSize(item.enclosure.file),
|
||||
type : item.enclosure.type || mime.lookup(item.enclosure.file)
|
||||
}
|
||||
}
|
||||
});
|
||||
} else {
|
||||
item_values.push({
|
||||
enclosure : {
|
||||
_attr : {
|
||||
url : item.enclosure.url,
|
||||
length : item.enclosure.size || 0,
|
||||
type : item.enclosure.type || mime.lookup(item.enclosure.url)
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
if (item.img) {
|
||||
img = '<figure><img src="' + item.image_url + '" /></figure>';
|
||||
}
|
||||
|
||||
ifTruePushArray(item.custom_elements, item_values, item.custom_elements);
|
||||
if (item.menu) {
|
||||
menu = '<menu>' + item.menu + '</menu>';
|
||||
}
|
||||
|
||||
channel.push({ item: item_values });
|
||||
let fullContent = '<header>' + img + ' <h1>' + item.title + '</h1>' + item.content + menu + '</header>';
|
||||
|
||||
item_values.push({'turbo:content': {_cdata: fullContent}});
|
||||
channel.push({item: item_values});
|
||||
|
||||
});
|
||||
|
||||
//set up the attributes for the RSS feed.
|
||||
var _attr = {
|
||||
'xmlns:dc': 'http://purl.org/dc/elements/1.1/',
|
||||
'xmlns:content': 'http://purl.org/rss/1.0/modules/content/',
|
||||
'xmlns:atom': 'http://www.w3.org/2005/Atom',
|
||||
let _attr = {
|
||||
'xmlns:yandex': 'http://news.yandex.ru',
|
||||
'xmlns:media': 'http://search.yahoo.com/mrss/',
|
||||
'xmlns:turbo': 'http://turbo.yandex.ru',
|
||||
version: '2.0'
|
||||
};
|
||||
|
||||
Object.keys(data.custom_namespaces).forEach(function(name) {
|
||||
_attr['xmlns:' + name] = data.custom_namespaces[name];
|
||||
});
|
||||
|
||||
//only add namespace if GeoRSS is true
|
||||
if(data.geoRSS){
|
||||
_attr['xmlns:geo'] = 'http://www.w3.org/2003/01/geo/wgs84_pos#';
|
||||
}
|
||||
|
||||
return {
|
||||
rss: [
|
||||
{ _attr: _attr },
|
||||
{ channel: channel }
|
||||
{_attr: _attr},
|
||||
{channel: channel}
|
||||
]
|
||||
};
|
||||
}
|
||||
|
||||
function RSS (options, items) {
|
||||
function YTurbo(options, items) {
|
||||
options = options || {};
|
||||
|
||||
this.title = options.title || 'Untitled RSS Feed';
|
||||
this.description = options.description || '';
|
||||
this.generator = options.generator || 'RSS for Node';
|
||||
this.feed_url = options.feed_url;
|
||||
this.site_url = options.site_url;
|
||||
this.image_url = options.image_url;
|
||||
this.author = options.author;
|
||||
this.categories = options.categories;
|
||||
this.pubDate = options.pubDate;
|
||||
this.hub = options.hub;
|
||||
this.docs = options.docs;
|
||||
this.copyright = options.copyright;
|
||||
this.language = options.language;
|
||||
this.managingEditor = options.managingEditor;
|
||||
this.webMaster = options.webMaster;
|
||||
this.ttl = options.ttl;
|
||||
//option to return feed as GeoRSS is set automatically if feed.lat/long is used
|
||||
this.geoRSS = options.geoRSS || false;
|
||||
this.custom_namespaces = options.custom_namespaces || {};
|
||||
this.custom_elements = options.custom_elements || [];
|
||||
this.items = items || [];
|
||||
this.title = options.title || 'Channel Yandex RSS';
|
||||
this.description = options.description || '';
|
||||
this.link = options.link;
|
||||
this.image_url = options.image_url;
|
||||
this.author = options.author;
|
||||
this.content = options.content;
|
||||
this.pubDate = options.pubDate;
|
||||
this.items = items || [];
|
||||
|
||||
this.item = function (options) {
|
||||
options = options || {};
|
||||
var item = {
|
||||
title: options.title || 'No title',
|
||||
description: options.description || '',
|
||||
url: options.url,
|
||||
guid: options.guid,
|
||||
categories: options.categories || [],
|
||||
author: options.author,
|
||||
date: options.date,
|
||||
lat: options.lat,
|
||||
long: options.long,
|
||||
enclosure: options.enclosure || false,
|
||||
custom_elements: options.custom_elements || []
|
||||
let item = {
|
||||
title: options.title || 'No title',
|
||||
description: options.description || '',
|
||||
url: options.url,
|
||||
author: options.author,
|
||||
date: options.date,
|
||||
content: options.content
|
||||
};
|
||||
|
||||
this.items.push(item);
|
||||
return this;
|
||||
};
|
||||
|
||||
this.xml = function(indent) {
|
||||
return '<?xml version="1.0" encoding="UTF-8"?>' +
|
||||
xml(generateXML(this), indent);
|
||||
this.xml = function (indent) {
|
||||
return xml(generateXML(this), indent);
|
||||
};
|
||||
}
|
||||
|
||||
module.exports = RSS;
|
||||
module.exports = YTurbo;
|
||||
|
||||
5569
package-lock.json
generated
Normal file
5569
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
30
package.json
30
package.json
@@ -1,16 +1,12 @@
|
||||
{
|
||||
"name": "rss",
|
||||
"version": "1.2.2",
|
||||
"description": "RSS feed generator. Add RSS feeds to any project. Supports enclosures and GeoRSS.",
|
||||
"name": "turbo-rss",
|
||||
"version": "1.0.0",
|
||||
"description": "RSS based, feed generator for Yandex turbo",
|
||||
"keywords": [
|
||||
"rss",
|
||||
"xml",
|
||||
"atom",
|
||||
"podcasts",
|
||||
"ghost",
|
||||
"feed",
|
||||
"feed builder",
|
||||
"rss feed"
|
||||
"yandex",
|
||||
"turbo",
|
||||
"rss yandex",
|
||||
"yandex turbo"
|
||||
],
|
||||
"main": "lib/index",
|
||||
"scripts": {
|
||||
@@ -18,12 +14,13 @@
|
||||
"lint": "grunt lint",
|
||||
"test:browser": "prova -b"
|
||||
},
|
||||
"homepage": "http://github.com/dylang/node-rss",
|
||||
"homepage": "http://github.com/lightair/yandex-turbo",
|
||||
"author": {
|
||||
"name": "Dylan Greene",
|
||||
"email": "dylang@gmail.com"
|
||||
"name": "LightAir",
|
||||
"email": "public@softroot.ru"
|
||||
},
|
||||
"contributors": [
|
||||
"LightAir <public@softroot.ru>",
|
||||
"Dylan Greene <dylang@gmail.com>",
|
||||
"Xavier Damman <xdamman@gmail.com>",
|
||||
"Michael R. Lange",
|
||||
@@ -37,10 +34,10 @@
|
||||
],
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "http://github.com/dylang/node-rss.git"
|
||||
"url": "http://github.com/lightair/yandex-turbo.git"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "http://github.com/dylang/node-rss/issues"
|
||||
"url": "http://github.com/lightair/yandex-turbo/issues"
|
||||
},
|
||||
"testling": {
|
||||
"files": "test/*.js",
|
||||
@@ -56,7 +53,6 @@
|
||||
]
|
||||
},
|
||||
"dependencies": {
|
||||
"mime-types": "2.1.13",
|
||||
"xml": "1.0.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
|
||||
18
readme.md
18
readme.md
@@ -1,12 +1,6 @@
|
||||
## rss [](https://travis-ci.org/dylang/node-rss) [](https://www.npmjs.org/package/rss)
|
||||
|
||||
> RSS feed generator. Add RSS feeds to any project. Supports enclosures and GeoRSS.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## turbo-rss [](https://travis-ci.org/lightair/turbo-rss)
|
||||
|
||||
>RSS based, feed generator for Yandex turbo.
|
||||
|
||||
|
||||
### Usage
|
||||
@@ -14,18 +8,16 @@
|
||||
#### Create a new feed
|
||||
|
||||
```js
|
||||
var RSS = require('rss');
|
||||
var TS = require('turbo-rss');
|
||||
|
||||
var feed = new RSS(feedOptions);
|
||||
var feed = new TS(feedOptions);
|
||||
```
|
||||
|
||||
##### `feedOptions`
|
||||
|
||||
* `title` **string** Title of your site or feed
|
||||
* `description` _optional_ **string** A short description of the feed.
|
||||
* `generator` _optional_ **string** Feed generator.
|
||||
* `feed_url` **url string** Url to the rss feed.
|
||||
* `site_url` **url string** Url to the site that the feed is for.
|
||||
* `link` **url string** Url to the site that the feed is for.
|
||||
* `image_url` _optional_ **url string** Small image for feed readers to use.
|
||||
* `docs` _optional_ **url string** Url to documentation on this feed.
|
||||
* `managingEditor` _optional_ **string** Who manages content in this feed.
|
||||
|
||||
Reference in New Issue
Block a user