A small library for turning RSS XML feeds into JavaScript objects

Overview

rss-parser

Version Build Status Downloads

A small library for turning RSS XML feeds into JavaScript objects.

Installation

npm install --save rss-parser

Usage

You can parse RSS from a URL (parser.parseURL) or an XML string (parser.parseString).

Both callbacks and Promises are supported.

NodeJS

Here's an example in NodeJS using Promises with async/await:

let Parser = require('rss-parser');
let parser = new Parser();

(async () => {

  let feed = await parser.parseURL('https://www.reddit.com/.rss');
  console.log(feed.title);

  feed.items.forEach(item => {
    console.log(item.title + ':' + item.link)
  });

})();

TypeScript

When using TypeScript, you can set a type to control the custom fields:

import Parser from 'rss-parser';

type CustomFeed = {foo: string};
type CustomItem = {bar: number};

const parser: Parser<CustomFeed, CustomItem> = new Parser({
  customFields: {
    feed: ['foo', 'baz'],
    //            ^ will error because `baz` is not a key of CustomFeed
    item: ['bar']
  }
});

(async () => {

  const feed = await parser.parseURL('https://www.reddit.com/.rss');
  console.log(feed.title); // feed will have a `foo` property, type as a string

  feed.items.forEach(item => {
    console.log(item.title + ':' + item.link) // item will have a `bar` property type as a number
  });
})();

Web

We recommend using a bundler like webpack, but we also provide pre-built browser distributions in the dist/ folder. If you use the pre-built distribution, you'll need a polyfill for Promise support.

Here's an example in the browser using callbacks:

">
<script src="/node_modules/rss-parser/dist/rss-parser.min.js">script>
<script>

// Note: some RSS feeds can't be loaded in the browser due to CORS security.
// To get around this, you can use a proxy.
const CORS_PROXY = "https://cors-anywhere.herokuapp.com/"

let parser = new RSSParser();
parser.parseURL(CORS_PROXY + 'https://www.reddit.com/.rss', function(err, feed) {
  if (err) throw err;
  console.log(feed.title);
  feed.items.forEach(function(entry) {
    console.log(entry.title + ':' + entry.link);
  })
})

script>

Upgrading from v2 to v3

A few minor breaking changes were made in v3. Here's what you need to know:

  • You need to construct a new Parser() before calling parseString or parseURL
  • parseFile is no longer available (for better browser support)
  • options are now passed to the Parser constructor
  • parsed.feed is now just feed (top-level object removed)
  • feed.entries is now feed.items (to better match RSS XML)

Output

Check out the full output format in test/output/reddit.json

this is a link & this is bold text' contentSnippet: 'this is a link & this is bold text' guid: 'https://www.reddit.com/r/funny/comments/3skxqc/the_water_is_too_deep_so_he_improvises/' categories: - funny isoDate: '2015-11-12T21:16:39.000Z'">
feedUrl: 'https://www.reddit.com/.rss'
title: 'reddit: the front page of the internet'
description: ""
link: 'https://www.reddit.com/'
items:
    - title: 'The water is too deep, so he improvises'
      link: 'https://www.reddit.com/r/funny/comments/3skxqc/the_water_is_too_deep_so_he_improvises/'
      pubDate: 'Thu, 12 Nov 2015 21:16:39 +0000'
      creator: "John Doe"
      content: 'this is a link & this is bold text'
      contentSnippet: 'this is a link & this is bold text'
      guid: 'https://www.reddit.com/r/funny/comments/3skxqc/the_water_is_too_deep_so_he_improvises/'
      categories:
          - funny
      isoDate: '2015-11-12T21:16:39.000Z'
Notes:
  • The contentSnippet field strips out HTML tags and unescapes HTML entities
  • The dc: prefix will be removed from all fields
  • Both dc:date and pubDate will be available in ISO 8601 format as isoDate
  • If author is specified, but not dc:creator, creator will be set to author (see article)
  • Atom's updated becomes lastBuildDate for consistency

XML Options

Custom Fields

If your RSS feed contains fields that aren't currently returned, you can access them using the customFields option.

let parser = new Parser({
  customFields: {
    feed: ['otherTitle', 'extendedDescription'],
    item: ['coAuthor','subtitle'],
  }
});

parser.parseURL('https://www.reddit.com/.rss', function(err, feed) {
  console.log(feed.extendedDescription);

  feed.items.forEach(function(entry) {
    console.log(entry.coAuthor + ':' + entry.subtitle);
  })
})

To rename fields, you can pass in an array with two items, in the format [fromField, toField]:

let parser = new Parser({
  customFields: {
    item: [
      ['dc:coAuthor', 'coAuthor'],
    ]
  }
})

To pass additional flags, provide an object as the third array item. Currently there is one such flag:

  • keepArray (false) - set to true to return all values for fields that can have multiple entries.
  • includeSnippet (false) - set to true to add an additional field, ${toField}Snippet, with HTML stripped out
let parser = new Parser({
  customFields: {
    item: [
      ['media:content', 'media:content', {keepArray: true}],
    ]
  }
})

Default RSS version

If your RSS Feed doesn't contain a tag with a version attribute, you can pass a defaultRSS option for the Parser to use:

let parser = new Parser({
  defaultRSS: 2.0
});

xml2js passthrough

rss-parser uses xml2js to parse XML. You can pass these options to new xml2js.Parser() by specifying options.xml2js:

let parser = new Parser({
  xml2js: {
    emptyTag: '--EMPTY--',
  }
});

HTTP Options

Timeout

You can set the amount of time (in milliseconds) to wait before the HTTP request times out (default 60 seconds):

let parser = new Parser({
  timeout: 1000,
});

Headers

You can pass headers to the HTTP request:

let parser = new Parser({
  headers: {'User-Agent': 'something different'},
});

Redirects

By default, parseURL will follow up to five redirects. You can change this with options.maxRedirects.

let parser = new Parser({maxRedirects: 100});

Request passthrough

rss-parser uses http/https module to do requests. You can pass these options to http.get()/https.get() by specifying options.requestOptions:

e.g. to allow unauthorized certificate

let parser = new Parser({
  requestOptions: {
    rejectUnauthorized: false
  }
});

Contributing

Contributions are welcome! If you are adding a feature or fixing a bug, please be sure to add a test case

Running Tests

The tests run the RSS parser for several sample RSS feeds in test/input and outputs the resulting JSON into test/output. If there are any changes to the output files the tests will fail.

To check if your changes affect the output of any test cases, run

npm test

To update the output files with your changes, run

WRITE_GOLDEN=true npm test

Publishing Releases

npm run build
git commit -a -m "Build distribution"
npm version minor # or major/patch
npm publish
git push --follow-tags
Comments
  • Cannot use 'new' with an expression whose type lacks a call or construct signature.

    Cannot use 'new' with an expression whose type lacks a call or construct signature.

    Trying to use this NPM Package in a SharePoint ReactJS Framework project and when I try to use it, I get "Cannot use 'new' with an expression whose type lacks a call or construct signature."

    I'm trying the NodeJS example to start with and it's erroring on the following line:

    var parser = require('rss-parser'); let parser = new Parser();

    I have also tried import { Parser } from 'rss-parser'; in the project and it finds the module but get this as well:

    Module '"../../../../../spfx/node_modules/rss-parser"' has no exported member 'Parser'.

    Any Thoughts?

    opened by FaganSC 23
  • Adding TS typings.

    Adding TS typings.

    Hey, @bobby-brennan. Thanks for this awesome package!

    Due to Hacktoberfest 2018, I'm contributing to some packages that I use; yours is one of those.

    TypeScript typings help a lot of us who use it due to it's integration to TSLint and some more strict checkings, needed to be performed in some cases in the used packages as well; that's why I've decided to share the ones that I've made, making it more accessible to all that programs in this environment :)

    Since I'm not altering any of your JavaScript code, didn't feel the need to write any test. But I ran the documentation examples in a dummy tests scenario through ts-node.

    note: this is the project that I use your package, I intend to go back to it someday: github.com/Fazendaaa/podsearch_bot.

    opened by Fazendaaa 14
  • Uncaught (in promise) Error: Unexpected close tag ; Chrome User-Agent?

    Uncaught (in promise) Error: Unexpected close tag ; Chrome User-Agent?

    I am currently seeing inconsistent behavior across browsers using rss-parser.

    I am testing with this RSS feed: http://www.marketwatch.com/rss/topstories

    I do get the same error for all RSS feeds I have tried on the same domain.

    Here is the relevant code, Vue-flavored:

    const CORS_PROXY = 'https://cors-anywhere.herokuapp.com/'
    
    export default {
    ...
      mounted() {
        require('../../node_modules/rss-parser/dist/rss-parser.js')
        this.getFeeds()
      },
    
      methods: {
        async getFeeds() {
          const parser = new RSSParser({
            headers: {
              'User-Agent': 'rss-parser',
              'Cache-Control': 'no-cache',
              'Pragma': 'no-cache'
            },
            defaultRSS: 2.0,
            xml2js: {
              strict: true
            }
          })
          const feedRequests = this.$page.frontmatter.feeds.map(feed => {
            return parser.parseURL(CORS_PROXY + feed)
          })
          this.feeds = await Promise.all(feedRequests)
        }
      }
    }
    

    In Firefox, this will make a request that returns a valid RSS XML response; in Chrome, this is returning HTML, which makes rss-parser return the following error:

    Uncaught (in promise) Error: Unexpected close tag
    Line: 9
    Column: 7
    Char: >
        at error (rss-parser.js?e48f:12624)
        at strictFail (rss-parser.js?e48f:12648)
        at closeTag (rss-parser.js?e48f:12834)
        at SAXParser.write (rss-parser.js?e48f:13397)
        at Parser.parseString (rss-parser.js?e48f:11945)
        at Parser.eval [as parseString] (rss-parser.js?e48f:11620)
        at eval (rss-parser.js?e48f:8448)
        at new Promise (<anonymous>)
        at Parser.parseString (rss-parser.js?e48f:8447)
        at exports.IncomingMessage.eval (rss-parser.js?e48f:8520)
    

    I can change all of the header attributes using the headers option, but User-Agent is the only one that will not change on Chrome (Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36). I suspect this has something to do with what I'm seeing.

    Is there any way I can work around this? I will provide more information if necessary.

    opened by seevee 12
  • Fix RSSParser is not a constructor error

    Fix RSSParser is not a constructor error

    I've reverted this typings change: https://github.com/bobby-brennan/rss-parser/commit/e88c78e42ecdb51f2c8eb741276b1712d273603d as it breaks the current code usage. There's no other way to get it working. export = Parser is a valid syntax for CommonJS-exported modules (https://stackoverflow.com/a/51238234).

    Unfortunately, I don't know how to have other types exported.

    Resolves https://github.com/bobby-brennan/rss-parser/issues/90

    opened by feimosi 9
  • ERROR TypeError: rss_parser_dist_rss_parser_min_js__WEBPACK_IMPORTED_MODULE_3__.RSSParser is not a constructor

    ERROR TypeError: rss_parser_dist_rss_parser_min_js__WEBPACK_IMPORTED_MODULE_3__.RSSParser is not a constructor

    I am using rss-parser in my Angular project and in .ts file i am writing below code and inside ngOnInit() my code is written i am getting error

    ERROR TypeError: rss_parser_dist_rss_parser_min_js__WEBPACK_IMPORTED_MODULE_3__.RSSParser is not a constructor

    import { RSSParser } from 'rss-parser/dist/rss-parser.min.js'; ngOnInit() { const CORS_PROXY = "https://cors-anywhere.herokuapp.com/"

    let parser = new RSSParser(); parser.parseURL(CORS_PROXY + 'https://www.reddit.com/.rss', function(err, feed) { console.log(feed.title); feed.items.forEach(function(entry) { console.log(entry.title + ':' + entry.link); }) }) } Thanks in Advance

    opened by anshulsinha1101 8
  • [Improved] Fixing crash when rss feed has no attributes in <rss> tag

    [Improved] Fixing crash when rss feed has no attributes in tag

    This PR implements the same code as of https://github.com/bobby-brennan/rss-parser/pull/65 from @ricardoekm , with some improvements:

    • Slight difference at https://github.com/bobby-brennan/rss-parser/pull/65/commits/83600cf6c5d94e90ade667aa2c5e688e815f4cb8
    • Another bugfix resulting from missing result.rss.$ at parser.js at line 152
    • The mentioned RSS causing the crash was added to a new test (Travis is already passing)

    Anyways, thanks @ricardoekm for already providing the codefix (I was trying to parse the same feed), so my contribution is mostly providing the passing test. @bobby-brennan you should check you're confortable with the way we assume RSS 0.9 in case of missing metadata. I'd assume RSS 2.0, but @ricardoekm implemented as 0.9 and I went with it.

    opened by fmalk 8
  • Sometimes a HTML page is served back ; Specify user agent?

    Sometimes a HTML page is served back ; Specify user agent?

    Hi ;

    This library is wonderful, and works like a charm. But sometimes, the data returned by the server is a HTML page, when the same feed is actually viewable in a browser, for example this one:

    http://www.jesusandmo.net/comic/feed/

    Or this one :

    https://www.blendernation.com/feed/

    So I was wondering if there was some way to control the user agent to test if I can get the feed anyway... Maybe on the request side?

    opened by yPhil-gh 8
  • Encoding special characters (ISO 639-1)

    Encoding special characters (ISO 639-1)

    Hello,

    I use rss-parser on some feeds in the Serbian language, which has several special characters, like: Š, Č, Ć, Ž. All of these are (in rss-parser 2.10.1) replaced with \ufffd.

    Is there any way encoding can be improved to cover these (latin-extended, ISO 639-1 codes) characters? Same would apply to several other languages - Slovenian, Croatian, Bosnian, etc.

    I love the simplicity of use, despite the lack of async/await support :) but I will have to find an alternative if I can't solve this encoding issue.

    opened by ruzicic 8
  • No Use with Angular

    No Use with Angular

    The Parser seems to have missing libs to get the data by its own. Code:

    `import { Component, OnInit } from '@angular/core'; import * as Parser from "rss-parser";

    @Component({ selector: 'app-blog', templateUrl: './blog.component.html', styleUrls: ['./blog.component.scss'] }) export class BlogComponent implements OnInit {

    feed:any;

    constructor() { }

    ngOnInit() { let parser = new Parser();

    parser.parseURL('https://blog.my-site.de/feed/')
      .then((resp) => {
        this.feed = resp;
    
        console.log("blog feed", resp, this.feed);
    
      });
    

    }

    } `

    On compile now there seems to some missing dependencies: `WARNING in ./node_modules/xml2js/node_modules/sax/lib/sax.js Module not found: Error: Can't resolve 'stream' in 'C:\Users\gregor\dev\projects \my-site\git\my-site\node_modules\xml2js\node_modules\sax\lib'

    ERROR in ./node_modules/rss-parser/lib/parser.js Module not found: Error: Can't resolve 'http' in 'C:\Users\gregor\dev\projects\my-site\git\my-site\node_modules\rss-parser\lib' ERROR in ./node_modules/rss-parser/lib/parser.js Module not found: Error: Can't resolve 'https' in 'C:\Users\gregor\dev\projects
    my-site\git\my-site\node_modules\rss-parser\lib' ERROR in ./node_modules/xml2js/lib/parser.js Module not found: Error: Can't resolve 'timers' in 'C:\Users\gregor\dev\projects \my-site\git\my-site\node_modules\xml2js\lib' i ?wdm?: Failed to compile. `

    NPM dont tell me any missing dependencies.

    What and How do I need to add to make it run?

    opened by Madtek 7
  • Not getting newest item

    Not getting newest item

    Hi, Im making a Discord bot that automaticly posts when there is a csgo update. I made it so it checks every minute if there is an update. but for some reason the parser just will not get the latest update. When trying the same code in Npm RunKit it does give the latest item. here is a link to what should work LINK. I really do not know what I am doing wrong.

    opened by yous00 7
  • fix(types): fix export of utility types

    fix(types): fix export of utility types

    Creates a namespace in order to properly support exporting utility types.

    Also changed the const export into a class, since it is more clear that way imo.

    Should resolve the discussion in #93 in a non-breaking way.

    Sorry about the excessive formatting changes (removing semicolons and such) it was how my editor was set up and I'm to tired to fix it right now. If it's important, let me know and I'll change it when I've gotten some sleep.

    opened by Maistho 7
  • How can I limit the data from the rss on NextJS?

    How can I limit the data from the rss on NextJS?

    I'm building a Feed Reader using NextJS and I'm getting this error in the console when I build the app. I'm listing only 10-12 feeds from the website. Is there any way I can limit the parser to only 10?

    image

    opened by kulterryan 0
  • Socket remains open after a timeout

    Socket remains open after a timeout

    Node v18.12.1, [email protected]. I am scraping a number of RSS feeds using rss-parser. A Nasdaq feed is invariably giving a timeout after 10 seconds, which is the configured time:

    Could not read https://www.nasdaq.com/feed/rssoutbound?category=Commodities: Request timed out after 10000ms
    

    The feed can be read without issues on a browser so I guess it is limited by user-agent on the server side. Anyway, my program does not terminate properly, and keeps the process open after everything else has been closed. Running it with wtfnode yields the following information:

    ^C[WTF Node?] open handles:
    - File descriptors: (note: stdio always exists)
      - fd 2 (tty) (stdio)
      - fd 1 (tty) (stdio)
    - Sockets:
      - 192.168.1.5:41910 -> 23.214.214.41:443
    

    As it happens, 23.214.214.41 is (not coincidentally) the IP address of the Nasdaq Akamai endpoint:

     $ ping www.nasdaq.com
    PING e6982.dsca.akamaiedge.net (23.214.214.41) 56(84) bytes of data.
    

    It appears that rss-parser is not closing the socket properly after a timeout. Any ideas?

    opened by alexfernandez 0
  • add build-related files and dirs to .npmignore file

    add build-related files and dirs to .npmignore file

    The current release includes a bunch of things that are only relevant for the build process, rather than being part of the code when used as a dependency in a project. Some things that might be good to add to the npmignore file:

    • the .github directory
    • the build directory
    • the webpack config file
    • the Travis config file
    • The Bower config file

    (In an ideal world, the dist folder would also be ignored with a separate @rss-parser/browser dependency that folks can use if they need a browser version, but that's far more work to set up so a bit unreasonable to ask for =)

    opened by Pomax 0
  • ReadMe.Remove non-working Typescript code that is very confusing.

    ReadMe.Remove non-working Typescript code that is very confusing.

    You should never, ever, copy and paste demo code and it doesn't compile. I write compilers, I've read RSS feeds for decades, but I can't figure out what you're code is even doing. You don't explain what 'baz' is, why I would need it. I understand that I can remove the non-working code and it will run and then maybe I'll figure out what you're talking about, but I can't really that when the code doesn't compile. How do I parse multiple RSS feeds? What is a Custom feed? Is that different than a regular feed? How is a custom feed different than a regular feed? The naming conventions here suck really bad. As an expert programmer, I should be able to look at your code and understand what does what, but I can't do that when you use generic placeholders and don't explain your nomiclature. When you use placeholders like Foo, Bar, they are supposed to be when you only require a generic placeholder. When you are dealing with concrete examples, you need to use ConcretePlaceholders. What does 'foo' mean?

    opened by CookingWithCale 0
  • Convert item.title with html tags to html

    Convert item.title with html tags to html

    I have desingned if helps a function that convert an item with html subtags to html

    use: extract(item.title);

    function extract(item, tag = '') {
        if(typeof item === 'object') {
            if(Array.isArray(item)) {
                let content = '';
                for(const i in item) {
                    content = `${content} ${extract(item[i], tag)}`;
                }
                while(content[0] === ' ')
                    content = content.substring(1);
                return content;
            } else {
                let attr = '';
                let content = '';
                for(const i in item) {
                    if(i === '$') {
                        for(const j in item[i]) {
                            const value = item[i][j];
                            attr = `${attr} ${j}="${value}"`;
                        };
                    } else if(i === '_') {
                        content = `${content} ${item[i]}`;
                    } else {
                        content = `${content} ${extract(item[i], i)}`;
                    }
                }
                while(content[0] === ' ')
                    content = content.substring(1);
                
                if(tag !== '')
                    return `<${tag}${attr}>${content}</${tag}>`;
                else
                    return content;
            }
        } else if(typeof item === 'string') {
            if (tag !== '')
                return `<${tag}>${item}</${tag}>`;
            else
                return `${item}`;
        }
    }
    
    
    opened by dogia 0
Owner
Robert Brennan
Robert Brennan
Feeds is a simple Revolt bot that delivers RSS feeds to your channels.

Feeds Feeds is a simple Revolt bot that delivers RSS feeds to your text channels. You can invite it here. Feeds are refreshed once per minute, and if

Jan 3 Dec 5, 2022
Subscribe to rss feeds from anywhere, receive notifications from anywhere.

INK RSS 管理订阅,接收通知 示例网页 · 示例群组 · 报告Bug 介绍 特点 项目背景 TODO 注意事项 部署 额外附赠 使用建议 调查 贡献 作者 协议 介绍 INK RSS 提供及时且多样的 rss 通知服务,借助现有的接口你可以在任意位置订阅,并使用任意方式接收通知,并且所有服务均

null 253 Dec 28, 2022
GitHub Advisory Database RSS Feeds.

github-advisory-database-rss RSS Feeds for GitHub Advisory Database. Usage Visit https://azu.github.io/github-advisory-database-rss/ Subscribe RSS Fee

azu 7 Aug 10, 2022
Twitter RSS (.xml) Feed Scraper Without Developer Authentication

Twitter RSS Feed Scraper Without Authentication Command-line application using Node.js that scrapes XML feeds from Nitter, the free and open source al

Jason Vu 4 Jun 15, 2022
A music NFT experience. Turning pain into art.

Music NFTs - Catalog Factory Curation as a Public Good Official submission for Zora Hackathon at ETH Global. music nfts + Zora V3. All minted music nf

Erick Martinez Jr. 13 Dec 10, 2022
Grupprojekt för kurserna 'Javascript med Ramverk' och 'Agil Utveckling'

JavaScript-med-Ramverk-Laboration-3 Grupprojektet för kurserna Javascript med Ramverk och Agil Utveckling. Utvecklingsguide För information om hur utv

Svante Jonsson IT-Högskolan 3 May 18, 2022
Small (fragile) script for migrating comments from dev.to posts to Wordpress format (WXR/XML)

dev-to-wxr Small (fragile) script for migrating comments from dev.to posts to Wordpress format (WXR/XML). Useful for importing in tools like disqus. U

Fahad Hossain 2 Jan 29, 2022
Hemsida för personer i Sverige som kan och vill erbjuda boende till människor på flykt

Getting Started with Create React App This project was bootstrapped with Create React App. Available Scripts In the project directory, you can run: np

null 4 May 3, 2022
A-Frame components for smooth locomotion and snap turning

A-Frame locomotion A collection of A-Frame components, systems and primitives that enable all sorts of locomotion in VR. It't built to be modular, fle

Noeri Huisman 18 Sep 1, 2022
Kurs-repo för kursen Webbserver och Databaser

Webbserver och databaser This repository is meant for CME students to access exercises and codealongs that happen throughout the course. I hope you wi

null 14 Jan 3, 2023
mior - Merge into one RSS

mior Merge into one RSS mior is a lightweight web service to filter and merge multiple RSS feeds into one. It provides a pure web-based, responsive us

Eric Fu 29 Nov 6, 2022
✏️ A small jQuery extension to turn a static HTML table into an editable one. For quickly populating a small table with JSON data, letting the user modify it with validation, and then getting JSON data back out.

jquery-editable-table A small jQuery extension to turn an HTML table editable for fast data entry and validation Demo ?? https://jsfiddle.net/torrobin

Tor 7 Jul 31, 2022
A small javascript DOM manipulation library based on Jquery's syntax. Acts as a small utility library with the most common functions.

Quantdom JS Quantdom is a very small (about 600 bytes when ran through terser & gzipped) dom danipulation library that uuses a Jquery like syntax and

Sean McQuaid 7 Aug 16, 2022
toXML - Pure JavaScript XML Writer

toXML - Pure JavaScript XML Writer Live Demo: https://kawanet.github.io/from-xml/ FEATURES Simple: single writer function toXML() which returns XML st

Yusuke Kawasaki 5 Apr 1, 2022
A light microservice serving Atom 1.0 Feeds for MusicThread threads

MusicThread Web Feeds A light microservice to serve Atom 1.0 Feeds for MusicThread. People use web feeds for following updates to specific threads via

Brushed Type 4 Jun 15, 2022
Decentralised Oracle Network for Subjective Data Feeds (testnet).

deOracle.xyz deOracle.xyz is a decentralised P2P oracle platform with a cross-chain reputation system for digital identities. Our goal is to bring rel

DeOracle.xyz 2 Oct 28, 2022
Utilities for auto-translating the Tera DataCenter based on XML files

xml-dc-translator Requires latest version of node.js, download here: https://nodejs.org/. Utility for auto-translating the Tera DataCenter based on XM

JKQ 6 Sep 6, 2022
Create beautiful interactive stories using Sutori formtted XML.

Sutori Studio An IDE for creating beautiful interactive stories powered by sutori-js. This project is still in an early state, and has a number of kno

Sutori Project 4 Jul 4, 2022
rss github discussions api

rgd RSS - GitHub Discussions API npm install -g rgd # or npm install -D rgd Usage: rgd Options: --owner --repo --token: generate token -> http

Len C... 6 Jul 11, 2022