Zen-feed
Express.js middleware for creating Yandex Zen RSS feed.
Features
-
Forms RSS feed as mentioned in official Yandex.Zen documentation.
-
Sanitizing your data to fit official Yandex.Zen documentation.
Installation
This is an Express.js middleware.
Via NPM:
npm install zen-feed
Configuration
In your express application:
const zenFeed = require('zen-feed');
zenFeed.configure(config); // call this before using middleware
app.use('/path/to/feed.rss', (req, res, next) => zenFeed.feed(req, res, next));
config
should be supplied before calling zenFeed.feed
Config format:
const config = {
rssVersion: "2.0",
channelTitle: "My marvelous site",
siteLink: "http://mysite.site",
channelDescription: "This is awesome site!",
channelLanguage: "ru",
getFeedContent: function(){...}, // see getFeedContent() section
useParser: false
}
Config options
Option | Type | Description | Required? |
---|---|---|---|
rssVersion |
String | RSS version (use "2.0") | Yes |
channelTitle |
String | Site name | Yes |
sitelink |
String | Site URL | Yes |
channelDescription |
String | Short site description | No |
channelLanguage |
String | Feed language in ISO 639-1 format | No |
getFeedContent |
Function | See getFeedContent() section | Yes |
useParser |
Boolean | Option to use built-in parser to sanitize HTML-content. (See Sanitize section) | Yes |
getFeedContent()
In order for this middleware to actually work, you should provide async function getFeedContent
.
This function should return an array of publications to be included in feed. Every publication should be represented as Object
. It should look like this:
const sampleItems = [
{
title: "Test publication",
link: "http://testsite.site/test",
pdalink: "http://m.testsite.site/test",
amplink: "http://testsite.site/amp/test",
media_rating: "nonadult",
pubDate: (new Date("July 20, 69 00:20:18 GMT+00:00")).getTime(),
author: "Test author",
category: [
"Технологии",
"Наука"
],
enclosure: [
"http://testsite.site/imgs/test.jpg"
],
description: "Test description",
content_encoded: `
Test publication text
We have cookies!
`
},
{
title: "Another test publication",
link: "http://testsite.site/another-test",
...
},
];
Item format
Field | Type | Description | Required? |
---|---|---|---|
title |
String | Publication title | Yes |
link |
String | Publication URL on your site | Yes |
pdalink |
String | Mobile version (URL) (if exists) | No |
amplink |
String | AMP-version (URL) (if exists) | No |
media_rating |
String | Media rating. Should take one of two values: "adult" or "nonadult |
No |
pubDate |
Number | Publication date in milliseconds since Unix Epoch. (Date.getTime() ) |
Yes |
author |
String | Publication author | Yes |
category |
Array (of String) | Categories of publication. Can only contain items from official documentation. | No |
enclosure |
Array (of Strings) | Must contain URLs of all media objects (images, videos, etc...) used in publication text. Provide full URLs with file extension for correct MIME-type detection. | Yes |
description |
String (CDATA) | Short publication description. | No |
content_encoded |
String (CDATA) | Full publication text. Must be sanitized HTML (as seen in official documentation), otherwise you can use built-in parser. | Yes |
Sanitize
Sanitizing your content simply gets rid of all HTML-elements except for:
i
em
strong
a
img
video
figure
figcaption
media:content
media:description
media:copyright
span
strike
Be warned: it will cut out all
iframe
tags, usually used to embed Youtube/Vimeo/etc players. For Youtube's iframe will be transformed in simplea
tag like this:
<a href="https://www.youtube.com/watch?v=_video_Id">https://www.youtube.com/watch?v=_video_Id</a>
Testing
Jest.js used for testing. Tests can be found in /tests
directory.
npm run test
- basic test-runnpm run test-watch
- Watch files for changes and rerun tests related to changed files. (jest --watch
)npm run test-coverage
- Displays test coverage information (jest --coverage
)npm run test-verbose
- Test run with verbose output (jest --verbose
)
PRs
Pull requests are welcome.
License
© Ismail Valiev (Konrad Molitor), 2019. Distributed under the terms of MIT License.