123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159 |
- "use strict";
- var __extends = (this && this.__extends) || (function () {
- var extendStatics = function (d, b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
- function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
- };
- return function (d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- })();
- var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
- };
- var __importStar = (this && this.__importStar) || function (mod) {
- if (mod && mod.__esModule) return mod;
- var result = {};
- if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
- result["default"] = mod;
- return result;
- };
- Object.defineProperty(exports, "__esModule", { value: true });
- var domhandler_1 = __importDefault(require("domhandler"));
- var DomUtils = __importStar(require("domutils"));
- var Parser_1 = require("./Parser");
- //TODO: Consume data as it is coming in
- var FeedHandler = /** @class */ (function (_super) {
- __extends(FeedHandler, _super);
- /**
- *
- * @param callback
- * @param options
- */
- function FeedHandler(callback, options) {
- var _this = this;
- if (typeof callback === "object" && callback !== null) {
- callback = undefined;
- options = callback;
- }
- _this = _super.call(this, callback, options) || this;
- return _this;
- }
- FeedHandler.prototype.onend = function () {
- var feed = {};
- var feedRoot = getOneElement(isValidFeed, this.dom);
- if (feedRoot) {
- if (feedRoot.name === "feed") {
- var childs = feedRoot.children;
- feed.type = "atom";
- addConditionally(feed, "id", "id", childs);
- addConditionally(feed, "title", "title", childs);
- var href = getAttribute("href", getOneElement("link", childs));
- if (href) {
- feed.link = href;
- }
- addConditionally(feed, "description", "subtitle", childs);
- var updated = fetch("updated", childs);
- if (updated) {
- feed.updated = new Date(updated);
- }
- addConditionally(feed, "author", "email", childs, true);
- feed.items = getElements("entry", childs).map(function (item) {
- var entry = {};
- var children = item.children;
- addConditionally(entry, "id", "id", children);
- addConditionally(entry, "title", "title", children);
- var href = getAttribute("href", getOneElement("link", children));
- if (href) {
- entry.link = href;
- }
- var description = fetch("summary", children) ||
- fetch("content", children);
- if (description) {
- entry.description = description;
- }
- var pubDate = fetch("updated", children);
- if (pubDate) {
- entry.pubDate = new Date(pubDate);
- }
- return entry;
- });
- }
- else {
- var childs = getOneElement("channel", feedRoot.children)
- .children;
- feed.type = feedRoot.name.substr(0, 3);
- feed.id = "";
- addConditionally(feed, "title", "title", childs);
- addConditionally(feed, "link", "link", childs);
- addConditionally(feed, "description", "description", childs);
- var updated = fetch("lastBuildDate", childs);
- if (updated) {
- feed.updated = new Date(updated);
- }
- addConditionally(feed, "author", "managingEditor", childs, true);
- feed.items = getElements("item", feedRoot.children).map(function (item) {
- var entry = {};
- var children = item.children;
- addConditionally(entry, "id", "guid", children);
- addConditionally(entry, "title", "title", children);
- addConditionally(entry, "link", "link", children);
- addConditionally(entry, "description", "description", children);
- var pubDate = fetch("pubDate", children);
- if (pubDate)
- entry.pubDate = new Date(pubDate);
- return entry;
- });
- }
- }
- this.feed = feed;
- this.handleCallback(feedRoot ? null : Error("couldn't find root of feed"));
- };
- return FeedHandler;
- }(domhandler_1.default));
- exports.FeedHandler = FeedHandler;
- function getElements(what, where) {
- return DomUtils.getElementsByTagName(what, where, true);
- }
- function getOneElement(what, where) {
- return DomUtils.getElementsByTagName(what, where, true, 1)[0];
- }
- function fetch(what, where, recurse) {
- if (recurse === void 0) { recurse = false; }
- return DomUtils.getText(DomUtils.getElementsByTagName(what, where, recurse, 1)).trim();
- }
- function getAttribute(name, elem) {
- if (!elem) {
- return null;
- }
- var attribs = elem.attribs;
- return attribs[name];
- }
- function addConditionally(obj, prop, what, where, recurse) {
- if (recurse === void 0) { recurse = false; }
- var tmp = fetch(what, where, recurse);
- // @ts-ignore
- if (tmp)
- obj[prop] = tmp;
- }
- function isValidFeed(value) {
- return value === "rss" || value === "feed" || value === "rdf:RDF";
- }
- var defaultOptions = { xmlMode: true };
- /**
- * Parse a feed.
- *
- * @param feed The feed that should be parsed, as a string.
- * @param options Optionally, options for parsing. When using this option, you probably want to set `xmlMode` to `true`.
- */
- function parseFeed(feed, options) {
- if (options === void 0) { options = defaultOptions; }
- var handler = new FeedHandler(options);
- new Parser_1.Parser(handler, options).end(feed);
- return handler.feed;
- }
- exports.parseFeed = parseFeed;
|