├── LICENSE.md
├── README.md
├── awesome-feeds
├── FORMATS.md
├── METADATA.md
├── README.md
└── TIMELINE.md
├── feedfilter
├── .gitignore
├── CHANGELOG.md
├── Manifest.txt
├── README.md
├── Rakefile
├── config
│ ├── feedburner.txt
│ └── feedflare.txt
├── lib
│ ├── feedfilter.rb
│ └── feedfilter
│ │ ├── ads.rb
│ │ ├── includes.rb
│ │ └── version.rb
└── test
│ ├── helper.rb
│ ├── test_ads.rb
│ ├── test_ads_all.rb
│ └── test_includes.rb
├── feedfinder
├── .gitignore
├── CHANGELOG.md
├── Manifest.txt
├── README.md
├── Rakefile
└── lib
│ ├── feedfinder.rb
│ └── feedfinder
│ └── version.rb
├── feedparser
├── .gitignore
├── CHANGELOG.md
├── Manifest.txt
├── NOTES.md
├── README.md
├── Rakefile
├── attic
│ ├── atom_v03.rb
│ ├── feed.rb
│ ├── item.rb
│ ├── test_atom_from_file.rb
│ └── test_atom_v03.rb
├── feed-models.png
├── lib
│ ├── feedparser.rb
│ └── feedparser
│ │ ├── attachment.rb
│ │ ├── author.rb
│ │ ├── builder
│ │ ├── atom.rb
│ │ ├── json.rb
│ │ ├── microformats.rb
│ │ └── rss.rb
│ │ ├── feed.rb
│ │ ├── generator.rb
│ │ ├── item.rb
│ │ ├── parser.rb
│ │ ├── tag.rb
│ │ ├── thumbnail.rb
│ │ └── version.rb
├── sandbox
│ ├── dumps
│ │ ├── intertwingly.atom.xml
│ │ ├── nostarch.rss2.xml
│ │ └── rubyonrails.atom.xml
│ ├── testatom.rb
│ ├── testpp.rb
│ └── testrss.rb
└── test
│ ├── helper.rb
│ ├── media_rss_example.txt
│ ├── test_atom_live.rb
│ ├── test_attachments_live.rb
│ ├── test_dates.rb
│ ├── test_microformats.rb
│ └── test_rss_live.rb
├── feeds
├── NOTES.md
├── README.md
├── Rakefile
├── books
│ ├── nostarch.rss
│ ├── oreilly.feedburner.atom
│ └── pragprog.rss
├── comics
│ ├── xkcd.atom
│ └── xkcd.rss
├── misc
│ ├── byparker.json
│ ├── daringfireball.atom
│ ├── daringfireball.json
│ ├── googlegroups.atom
│ ├── googlegroups2.atom
│ ├── headius.atom
│ ├── indie-blog.html
│ ├── inessential.json
│ ├── intertwingly.atom
│ ├── jsonfeed.json
│ ├── lambdatheultimate.rss
│ ├── learnenough.feedburner.atom
│ ├── ongoing.atom
│ ├── railstutorial.feedburner.atom
│ ├── rubyflow.feedburner.rss
│ ├── rubymine.feedburner.rss
│ ├── rubyonrails.atom
│ ├── scripting.rss
│ └── sitepoint.rss
├── news
│ ├── guardian-facebook.rss
│ ├── guardian-naomi-klein.rss
│ ├── guardian-world.rss
│ ├── nytimes-blogs-bits.rss
│ ├── nytimes-paul-krugman.rss
│ ├── nytimes-tech.rss
│ ├── nytimes-thomas-l-friedman.rss
│ ├── nytimes.rss
│ ├── washingtonpost-blogs-innovations.rss
│ ├── washingtonpost-politics.rss
│ └── washingtonpost-world.rss
├── osm
│ ├── blog.openstreetmap.rss
│ ├── blogs.openstreetmap.rss
│ └── mapbox.rss
├── spec
│ ├── atom
│ │ ├── author.atom
│ │ ├── authors.atom
│ │ └── categories.atom
│ ├── json
│ │ ├── example.json
│ │ ├── microblog.json
│ │ └── tags.json
│ ├── microformats
│ │ └── hentry.html
│ └── rss
│ │ ├── author.rss
│ │ ├── categories.rss
│ │ └── creator.rss
└── test
│ ├── helper.rb
│ └── test_feeds.rb
├── feedtxt.specs
├── README.md
└── _includes
│ └── header.html
├── feedtxt
├── .gitignore
├── HISTORY.md
├── Manifest.txt
├── README.md
├── Rakefile
├── lib
│ ├── feedtxt.rb
│ └── feedtxt
│ │ ├── parser.rb
│ │ ├── parser
│ │ ├── ini.rb
│ │ ├── json.rb
│ │ └── yaml.rb
│ │ └── version.rb
└── test
│ ├── feeds
│ └── spec
│ │ ├── example.ini.txt
│ │ ├── example.json.txt
│ │ ├── example.yaml.txt
│ │ ├── podcast.ini.txt
│ │ ├── podcast.json.txt
│ │ └── podcast.yaml.txt
│ ├── helper.rb
│ ├── test_ini.rb
│ ├── test_json.rb
│ ├── test_scanner.rb
│ └── test_yaml.rb
└── hyperdata
├── .gitignore
├── CHANGELOG.md
├── Manifest.txt
├── README.md
├── Rakefile
├── lib
├── hyperdata.rb
└── hyperdata
│ ├── builder
│ └── article.rb
│ ├── feed.rb
│ ├── item.rb
│ ├── parser.rb
│ └── version.rb
├── sandbox
└── dumps
│ ├── article.html.txt
│ └── o-item.html.txt
└── test
├── feeds
└── spec
│ ├── article.html
│ └── o
│ └── item.html
├── helper.rb
├── test_article.rb
└── test_version.rb
/LICENSE.md:
--------------------------------------------------------------------------------
1 | CC0 1.0 Universal
2 |
3 | Statement of Purpose
4 |
5 | The laws of most jurisdictions throughout the world automatically confer
6 | exclusive Copyright and Related Rights (defined below) upon the creator and
7 | subsequent owner(s) (each and all, an "owner") of an original work of
8 | authorship and/or a database (each, a "Work").
9 |
10 | Certain owners wish to permanently relinquish those rights to a Work for the
11 | purpose of contributing to a commons of creative, cultural and scientific
12 | works ("Commons") that the public can reliably and without fear of later
13 | claims of infringement build upon, modify, incorporate in other works, reuse
14 | and redistribute as freely as possible in any form whatsoever and for any
15 | purposes, including without limitation commercial purposes. These owners may
16 | contribute to the Commons to promote the ideal of a free culture and the
17 | further production of creative, cultural and scientific works, or to gain
18 | reputation or greater distribution for their Work in part through the use and
19 | efforts of others.
20 |
21 | For these and/or other purposes and motivations, and without any expectation
22 | of additional consideration or compensation, the person associating CC0 with a
23 | Work (the "Affirmer"), to the extent that he or she is an owner of Copyright
24 | and Related Rights in the Work, voluntarily elects to apply CC0 to the Work
25 | and publicly distribute the Work under its terms, with knowledge of his or her
26 | Copyright and Related Rights in the Work and the meaning and intended legal
27 | effect of CC0 on those rights.
28 |
29 | 1. Copyright and Related Rights. A Work made available under CC0 may be
30 | protected by copyright and related or neighboring rights ("Copyright and
31 | Related Rights"). Copyright and Related Rights include, but are not limited
32 | to, the following:
33 |
34 | i. the right to reproduce, adapt, distribute, perform, display, communicate,
35 | and translate a Work;
36 |
37 | ii. moral rights retained by the original author(s) and/or performer(s);
38 |
39 | iii. publicity and privacy rights pertaining to a person's image or likeness
40 | depicted in a Work;
41 |
42 | iv. rights protecting against unfair competition in regards to a Work,
43 | subject to the limitations in paragraph 4(a), below;
44 |
45 | v. rights protecting the extraction, dissemination, use and reuse of data in
46 | a Work;
47 |
48 | vi. database rights (such as those arising under Directive 96/9/EC of the
49 | European Parliament and of the Council of 11 March 1996 on the legal
50 | protection of databases, and under any national implementation thereof,
51 | including any amended or successor version of such directive); and
52 |
53 | vii. other similar, equivalent or corresponding rights throughout the world
54 | based on applicable law or treaty, and any national implementations thereof.
55 |
56 | 2. Waiver. To the greatest extent permitted by, but not in contravention of,
57 | applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and
58 | unconditionally waives, abandons, and surrenders all of Affirmer's Copyright
59 | and Related Rights and associated claims and causes of action, whether now
60 | known or unknown (including existing as well as future claims and causes of
61 | action), in the Work (i) in all territories worldwide, (ii) for the maximum
62 | duration provided by applicable law or treaty (including future time
63 | extensions), (iii) in any current or future medium and for any number of
64 | copies, and (iv) for any purpose whatsoever, including without limitation
65 | commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes
66 | the Waiver for the benefit of each member of the public at large and to the
67 | detriment of Affirmer's heirs and successors, fully intending that such Waiver
68 | shall not be subject to revocation, rescission, cancellation, termination, or
69 | any other legal or equitable action to disrupt the quiet enjoyment of the Work
70 | by the public as contemplated by Affirmer's express Statement of Purpose.
71 |
72 | 3. Public License Fallback. Should any part of the Waiver for any reason be
73 | judged legally invalid or ineffective under applicable law, then the Waiver
74 | shall be preserved to the maximum extent permitted taking into account
75 | Affirmer's express Statement of Purpose. In addition, to the extent the Waiver
76 | is so judged Affirmer hereby grants to each affected person a royalty-free,
77 | non transferable, non sublicensable, non exclusive, irrevocable and
78 | unconditional license to exercise Affirmer's Copyright and Related Rights in
79 | the Work (i) in all territories worldwide, (ii) for the maximum duration
80 | provided by applicable law or treaty (including future time extensions), (iii)
81 | in any current or future medium and for any number of copies, and (iv) for any
82 | purpose whatsoever, including without limitation commercial, advertising or
83 | promotional purposes (the "License"). The License shall be deemed effective as
84 | of the date CC0 was applied by Affirmer to the Work. Should any part of the
85 | License for any reason be judged legally invalid or ineffective under
86 | applicable law, such partial invalidity or ineffectiveness shall not
87 | invalidate the remainder of the License, and in such case Affirmer hereby
88 | affirms that he or she will not (i) exercise any of his or her remaining
89 | Copyright and Related Rights in the Work or (ii) assert any associated claims
90 | and causes of action with respect to the Work, in either case contrary to
91 | Affirmer's express Statement of Purpose.
92 |
93 | 4. Limitations and Disclaimers.
94 |
95 | a. No trademark or patent rights held by Affirmer are waived, abandoned,
96 | surrendered, licensed or otherwise affected by this document.
97 |
98 | b. Affirmer offers the Work as-is and makes no representations or warranties
99 | of any kind concerning the Work, express, implied, statutory or otherwise,
100 | including without limitation warranties of title, merchantability, fitness
101 | for a particular purpose, non infringement, or the absence of latent or
102 | other defects, accuracy, or the present or absence of errors, whether or not
103 | discoverable, all to the greatest extent permissible under applicable law.
104 |
105 | c. Affirmer disclaims responsibility for clearing rights of other persons
106 | that may apply to the Work or any use thereof, including without limitation
107 | any person's Copyright and Related Rights in the Work. Further, Affirmer
108 | disclaims responsibility for obtaining any necessary consents, permissions
109 | or other rights required for any use of the Work.
110 |
111 | d. Affirmer understands and acknowledges that Creative Commons is not a
112 | party to this document and has no duty or obligation with respect to this
113 | CC0 or use of the Work.
114 |
115 | For more information, please see
116 |
117 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # (Universal) Web Feed Parser And Normalizer (Atom, RSS, JSON Feed, Feed.TXT, Feed.HTML, HTML w/ Microformats e.g. h-entry, Etc.) And More
2 |
3 |
4 | Gem Familiy
5 |
6 | [**feedparser**](feedparser) - web feed parser and normalizer (Atom, RSS, JSON Feed, HTML h-entry, etc.)
7 |
8 | [**feedfilter**](feedfilter) - feed filter and rules for easy (re)use
9 |
10 | [**feedtxt**](feedtxt) - reads Feed.TXT - feeds in text (unicode) - publish & share posts, articles, podcasts, 'n' more
11 |
12 |
13 |
14 |
15 | More
16 |
17 | [**feeds**](feeds) - tests, tests, tests - feeds (in Atom, RSS, JSON Feed, HTML h-entry, etc.) with test assertions
18 |
19 | [**awesome-feeds**](awesome-feeds) - a collection of awesome feeds (formats, readers, services & tools, templates 'n' more) - JSON Feed, RSS, Atom, HTML w/ Microformats, Feed.TXT
20 |
21 |
--------------------------------------------------------------------------------
/awesome-feeds/FORMATS.md:
--------------------------------------------------------------------------------
1 |
2 | # Awesome Feeds > Formats
3 |
4 |
5 | Note: (†) used for historic formats (no longer in use or obsolete or were just experimental)
6 |
7 |
8 | ## RSS "Family"
9 |
10 |
11 | ### RSS 0.9 (†) (RDF Site Summary)
12 |
13 | by Netscape
14 |
15 |
16 | ### RDF / RSS 1.0 (†) (RDF Site Summary)
17 |
18 | by rdf-dev-group
19 |
20 |
21 | ### RSS 2.0, 0.92 (†), 0.91 (†) (Really Simple Syndication)
22 |
23 | by Dave Winer (DW) - formerly UserLand
24 |
25 | #### RSS.js / RSS.json / RSS-in-JSON / RSS-in-JS by Dave Winer
26 |
27 | See [`rssjs.org`](http://rssjs.org).
28 |
29 | - [RSS-in-JSON is a feed format](https://github.com/scripting/Scripting-News/blob/master/rss-in-json/README.md) by Dave Winer, June 2017
30 |
31 |
32 | ### RSS 3.0 (†)
33 |
34 | by Aaron Swartz
35 |
36 | See [RSS 3.0](http://www.aaronsw.com/2002/rss30), 2002
37 |
38 | - [The Road to RSS 3.0](http://www.aaronsw.com/weblog/000574) by Aaron Swartz, September 2002
39 |
40 | Plain Text with key value pairs and multi-line values with indentation.
41 |
42 |
43 |
44 | ### RSS 5.0 (Really Simple, Stupid or Really Simple Sharing)
45 |
46 | See Feed.TXT
47 |
48 |
49 | ### More RSS
50 |
51 | - [RSS @ Wikipedia](https://en.wikipedia.org/wiki/RSS)
52 |
53 |
54 | ## Atom
55 |
56 | - [Atom (standard) @ Wikipedia](https://en.wikipedia.org/wiki/Atom_(standard))
57 |
58 |
59 |
60 | ## JSON Formats
61 |
62 | ### JSON Feed
63 |
64 | See [`jsonfeed.org`](https://jsonfeed.org).
65 |
66 | ### Activity Streams
67 |
68 | See [`activitystrea.ms`](http://activitystrea.ms)
69 |
70 | - [Activity_Streams (format) @ Wikipedia](https://en.wikipedia.org/wiki/Activity_Streams_(format))
71 |
72 | ### Collection+JSON
73 |
74 | See [Collection+JSON - Hypermedia Type](http://amundsen.com/media-types/collection/)
75 |
76 | Collection+JSON is a JSON-based read/write hypermedia-type designed to support management and querying of simple collections. It is similar to the The Atom Syndication Format (RFC4287) and the The Atom Publishing Protocol (RFC5023) . However, Collection+JSON defines both the format and the semantics in a single media type. It also includes support for Query Templates and expanded write support through the use of a Write Template.
77 |
78 |
79 |
80 |
81 | ## YAML Feed (†)
82 |
83 | - [YAMLFeed @ Indie Web](https://indieweb.org/YAMLFeed) (twitter: [yamlfeed](https://twitter.com/yamlfeed)) - Launched as a "practical" lulz joke - keep the formats wars (eg. rss vs atom) alive (e.g. now json vs yaml).
84 |
85 |
86 | ## Microformats
87 |
88 | ### Microformats V1 hentry/hatom
89 |
90 | ### Microformats V2 h-entry/h-feed
91 |
92 |
93 |
94 | ## Feed.TXT
95 |
96 | See [Feed.TXT](https://feedtxt.github.io).
97 |
98 | A Free Feeds Format in Plain Text w/ Structured Meta Data
99 |
100 |
101 |
102 |
103 | ## More
104 |
105 |
--------------------------------------------------------------------------------
/awesome-feeds/METADATA.md:
--------------------------------------------------------------------------------
1 |
2 | # Awesome Feeds > Meta Data
3 |
4 | How many ways to add
5 |
6 | - Author
7 | - Title
8 | - Date
9 |
10 | Let's count ;-)
11 |
12 |
13 |
14 | ## Person / People
15 |
16 | - **creator** -- Dublin Core Meta Data
17 | - **publisher** -- Dublin Core Meta Data
18 | - **author** -- RSS 2.0, Atom, JSON Feed
19 | - **contributor** -- Atom
20 | - **managingEditor** -- RSS 2.0 Channel
21 | - **webMaster** -- RSS 2.0 Channel
22 |
23 |
24 | ## Dates
25 |
26 | - **published** -- Atom
27 | - **pubDate** -- RSS 2.0
28 | - **date_published** -- JSON Feed
29 | - **date** -- Dublin Core Meta Data
30 | - **updated** -- Atom
31 | - **date_modified** -- JSON Feed
32 | - **lastBuildDate** -- RSS 2.0 Channel
33 |
34 |
35 | ## Title
36 |
37 | - **title** -- Atom / RSS 2.0 / JSON Feed
38 | - **name**
39 |
40 |
41 | _2nd Level Title_
42 |
43 | - **subtitle** -- Atom
44 | - **tagline**
45 |
46 |
47 | ## Summary
48 |
49 | - **summary** -- Atom / JSON Feed
50 | - **description** -- RSS 2.0
51 | - **abstract**
52 | - **excerpt**
53 |
54 |
55 | ## Content
56 |
57 | - **content** -- Atom (Defaults to Text!), RSS Yahoo! Search (Media) Extension
58 | - **content type="text|html|xhtml"** -- Atom (Defaults to Text!)
59 | - **content_text** -- JSON Feed
60 | - **content_html** -- JSON Feed
61 | - **content:encoded** -- RDF Content Module
62 |
63 |
64 |
65 | ## Tags / Categories
66 |
67 | - **category** -- RSS 2.0
68 | - **category term=** -- Atom
69 | - **tags[]** -- JSON Feed
70 | - **keywords**
71 |
72 | _Scheme_
73 |
74 | - **scheme** -- Atom
75 | - **domain** -- RSS 2.0
76 |
77 |
78 | ## Link
79 |
80 | - **url** -- JSON Feed
81 | - **link** -- RSS 2.0
82 | - **link href=** -- Atom
83 |
84 |
85 | _More Links_
86 |
87 | - **home_page_url** -- JSON Feed (site url)
88 | - **feed_url** -- JSON Feed (feed url)
89 | - **link href= rel="self"** -- Atom (feed url)
90 | - **link href= rel="alternate"** -- Atom (site url)
91 |
92 |
93 | ## ID
94 |
95 | - **id** -- Atom, JSON Feed
96 | - **guid** -- RSS 2.0
97 | - **permalink**
98 |
99 |
100 | ## Attachments
101 |
102 | - **attachments[] url=** -- JSON Feed
103 | - **enclosure url=** -- RSS 2.0
104 | - **link href= rel="enclosure"** -- Atom
105 |
106 | _Examples_
107 |
108 | JSON Feed:
109 |
110 | ``` json
111 | "attachments": [
112 | {
113 | "url": "http://therecord.co/downloads/The-Record-sp1e1-ChrisParrish.m4a",
114 | "mime_type": "audio/x-m4a",
115 | "size_in_bytes": 89970236,
116 | "duration_in_seconds": 6629
117 | }
118 | ]
119 | ```
120 |
121 | RSS 2.0:
122 |
123 | ``` xml
124 |
127 | ```
128 |
129 | Atom:
130 |
131 | ``` xml
132 |
137 |
142 | ```
143 |
144 |
145 | ## More - What's Missing?
146 |
147 | - add banner image for item / entry?
148 | - add image / cover for feed / channel?
149 | - add (fav)icon for feed / channel?
150 | - add language ?
151 | - add expired yes/no or with date?
152 |
153 |
--------------------------------------------------------------------------------
/awesome-feeds/README.md:
--------------------------------------------------------------------------------
1 |
2 | JSON Feed • RSS • Atom • HTML w/ Microformats • Feed.TXT
3 |
4 |
5 | # Awesome Feeds
6 |
7 | A collection of awesome feeds (formats, readers, services & tools, templates 'n' more).
8 |
9 | #### _Contributions welcome. Anything missing? Send in a pull request. Thanks._
10 |
11 |
12 |
13 | [Formats](#formats) •
14 | [Parsers](#parsers) •
15 | [Filters](#filters) •
16 | [Converters](#converters) •
17 | [Readers](#readers) •
18 | [Facebook & Co](#facebook--co)
19 |
20 |
21 |
22 | ## Formats
23 |
24 | _JSON, XML, HTML, YAML, TXT & Friends_
25 |
26 | [JSON Feed](#json-feed) •
27 | [Atom](#atom) •
28 | [RSS](#rss) •
29 | [HTML Microformats](#html-microformats) •
30 | [Feed.TXT](#feedtxt)
31 |
32 |
33 | ### JSON Feed
34 |
35 | - [**jsonfeed.org**](https://jsonfeed.org) (twitter: [jsonfeed](https://twitter.com/jsonfeed)) - JSON Feed Project Site
36 | - [**Spec V1 @ JSON Feed**](https://jsonfeed.org/version/1) - Official Specifiaton Version 1.0 - in plain english (yeah!); May 2017
37 | - [**Code @ JSON Feed**](https://jsonfeed.org/code) - JSON Feed Templates, Plugins, Parser, Scripts & More
38 |
39 |
40 | **More**
41 |
42 | - [**Awesome JSON Feed**](https://github.com/rmlewisuk/awesome-json-feed)
43 |
44 |
45 | ### Atom
46 |
47 | _Atom Syndication & Friends_
48 |
49 | - [**Atom Syndication Spec**](https://tools.ietf.org/html/rfc4287), December 2005
50 |
51 |
52 | ### RSS
53 |
54 | _Really Simple Syndication & Friends_
55 |
56 | - [**RSS 2.0 Spec**](http://cyber.harvard.edu/rss/rss.html), July 2003
57 |
58 |
59 | ### HTML Microformats
60 |
61 | - [**h-feed Living Spec**](http://microformats.org/wiki/h-feed)
62 | - [**h-entry Living Spec**](http://microformats.org/wiki/h-entry)
63 |
64 |
65 | ### Feed.TXT
66 |
67 | - [**Feed.TXT**](https://feedtxt.github.io) (github: [feedtxt](https://github.com/feedtxt)) - Feed.TXT Project Site
68 |
69 |
70 |
71 | ## Parsers
72 |
73 | _Universal Feed Parser & Normalizer_
74 |
75 | **Ruby**
76 |
77 | - [**feedparser**](https://github.com/feedparser/feedparser) (gem: [feedparser](https://rubygems.org/gems/feedparser)) - universal feed parser and normalizer (supports Atom, RSS, JSON, HTML, TXT etc.)
78 |
79 |
80 |
81 | ## Filters
82 |
83 | **Ruby**
84 |
85 | - [**feedfilter**](https://github.com/feedparser/feedfilter) (gem: [feedfilter](https://rubygems.org/gems/feedfilter)) - feed filter and rules for easy (re)use e.g. strip ads etc.
86 |
87 |
88 |
89 | ## Converters
90 |
91 | - [**feed2json**](https://feed2json.org) (github: [appsattic/feed2json.org](https://github.com/appsattic/feed2json.org)) - convert rss or atom to json feed
92 |
93 |
94 | ## Readers
95 |
96 | **JavaScript**
97 |
98 | - [**JSON Feed Viewer**](https://json-feed-viewer.herokuapp.com) (github: [maximevaillancourt/json-feed-viewer](https://github.com/maximevaillancourt/json-feed-viewer)) - browse through the showcased feeds, or enter a feed url
99 | - [**feeds React Sample**](https://github.com/playhtml/feeds/tree/master/react) - simple feeds news reader sample w/ React and JSON feed
100 |
101 | ## Facebook & Co
102 |
103 | _Let's build the next thousands facebooks & co news feeds and readers. Join the free & open web and read & share your posts & updates with feeds._
104 |
105 | - [**Fuck Facebook**](https://daringfireball.net/2017/06/fuck_facebook) by John Gruber, June 2017
106 | - [**Why I can't/won't point to Facebook blog posts**](http://scripting.com/2017/05/31.html#a110526) by Dave Winer, May 2017
107 |
108 |
109 |
110 | ## Open Web & Friends
111 |
112 | _What's the open web? Why care about the future of online news & publishing?_
113 |
114 | > Seriously guys, nobody gives a shit about the open web. Only your clique.
115 | >
116 | > -- [Joe Hewitt, June 2017](https://twitter.com/joehewitt/status/870363197580038144)
117 |
118 | - [**Introducing AltPlatform & our manifesto for the Open Web**](http://altplatform.org/2017/05/30/open-web-manifesto/) by Richard MacManus, May 2017
119 |
120 |
121 | ## Meta
122 |
123 | **License**
124 |
125 | 
126 |
127 | The awesome list is dedicated to the public domain. Use it as you please with no restrictions whatsoever.
128 |
129 | **Questions? Comments?**
130 |
131 | Post them to the [wwwmake forum](http://groups.google.com/group/wwwmake). Thanks!
132 |
--------------------------------------------------------------------------------
/awesome-feeds/TIMELINE.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | # Awesome Feeds > History > Timeline
4 |
5 |
6 | ## 2017
7 |
8 | **June** Feed.TXT introduced.
9 |
10 | RSS-in-JS (re)launched by Dave Winer.
11 |
12 |
13 | **May** JSON Feed introduced by
14 |
15 |
16 |
17 | ## 2004
18 |
19 | ## 2003
20 |
21 | ## 2002
22 |
23 | RSS 3.0 introduced by Aaron Swartz. Removed XML, namespaces, etc.
24 |
25 |
26 | ## 2000
27 |
28 |
29 | ## 1996
30 |
31 | Meta Content Framework (MCF) developed by Ramanathan V. Guha and others in Apple Computer's Advanced Technology Group.
32 |
--------------------------------------------------------------------------------
/feedfilter/.gitignore:
--------------------------------------------------------------------------------
1 | *.gem
2 | *.rbc
3 | .bundle
4 | .config
5 | coverage
6 | InstalledFiles
7 | lib/bundler/man
8 | pkg
9 | rdoc
10 | spec/reports
11 | test/tmp
12 | test/version_tmp
13 | tmp
14 |
15 | # YARD artifacts
16 | .yardoc
17 | _yardoc
18 | doc/
19 |
20 |
21 |
--------------------------------------------------------------------------------
/feedfilter/CHANGELOG.md:
--------------------------------------------------------------------------------
1 |
2 | ### 0.0.1 / 2015-01-08
3 |
4 | * Everything is new. First release
5 |
6 |
--------------------------------------------------------------------------------
/feedfilter/Manifest.txt:
--------------------------------------------------------------------------------
1 | HISTORY.md
2 | Manifest.txt
3 | README.md
4 | Rakefile
5 | config/feedburner.txt
6 | config/feedflare.txt
7 | lib/feedfilter.rb
8 | lib/feedfilter/ads.rb
9 | lib/feedfilter/includes.rb
10 | lib/feedfilter/version.rb
11 | test/helper.rb
12 | test/test_ads.rb
13 | test/test_ads_all.rb
14 | test/test_includes.rb
15 |
--------------------------------------------------------------------------------
/feedfilter/README.md:
--------------------------------------------------------------------------------
1 | # feedfilter gem - feed filter and rules for easy (re)use
2 |
3 | * home :: [github.com/feedparser/feedfilter](https://github.com/feedparser/feedfilter)
4 | * bugs :: [github.com/feedparser/feedfilter/issues](https://github.com/feedparser/feedfilter/issues)
5 | * gem :: [rubygems.org/gems/feedfilter](https://rubygems.org/gems/feedfilter)
6 | * rdoc :: [rubydoc.info/gems/feedfilter](http://rubydoc.info/gems/feedfilter)
7 | * forum :: [groups.google.com/group/wwwmake](http://groups.google.com/group/wwwmake)
8 |
9 |
10 | ## Usage
11 |
12 |
13 | ### `strip_ads` (in `AdsFilter` module)
14 |
15 | ```
16 | require 'feedfilter'
17 |
18 | include FeedFilter::AdsFilter # lets us use strip_ads
19 |
20 |
21 | before_snippet =<
23 |
24 |
25 |
26 |
27 | EOS
28 |
29 |
30 | snippet = strip_ads( before_snippet )
31 |
32 | puts snippet
33 | ```
34 |
35 |
36 | ### Use Text Patterns (Regex) for Filters
37 |
38 | Ads Example:
39 |
40 | ```
41 | FEEDFLARE_ADS = %r{
42 |
', feed.items[0].content_html
43 | assert_equal 'Blah blah blah', feed.items[0].content_text
44 | assert_equal 'Microformats are amazing', feed.items[0].title
45 | assert_equal 'In which I extoll the virtues of using microformats.', feed.items[0].summary
46 | assert_equal DateTime.new( 2013, 6, 13, 12, 0, 0 ).utc, feed.items[0].published
47 |
48 | assert_equal 'W. Developer', feed.items[0].authors[0].name
49 | end
50 |
51 |
52 | end # class TestMicroformats
53 |
--------------------------------------------------------------------------------
/feedparser/test/test_rss_live.rb:
--------------------------------------------------------------------------------
1 | ###
2 | # to run use
3 | # ruby -I ./lib -I ./test test/test_rss_live.rb
4 | # or better
5 | # rake test
6 |
7 | require 'helper'
8 |
9 | class TestRssLive < Minitest::Test
10 |
11 |
12 | def test_rubyflow
13 | feed = fetch_and_parse_feed( 'http://feeds.feedburner.com/Rubyflow?format=xml' )
14 |
15 | assert_equal 'rss 2.0', feed.format
16 | end
17 |
18 | def test_sitepointruby
19 | feed = fetch_and_parse_feed( 'http://www.sitepoint.com/ruby/feed/' )
20 |
21 | assert_equal 'rss 2.0', feed.format
22 | end
23 |
24 | def test_lambdatheultimate
25 | ## check - has no item.guid - will use item.link for guid
26 | feed = fetch_and_parse_feed( 'http://lambda-the-ultimate.org/rss.xml' )
27 |
28 | assert_equal 'rss 2.0', feed.format
29 | end
30 |
31 | def test_rubymine
32 | # includes item/content:encoded
33 | feed = fetch_and_parse_feed( 'http://feeds.feedburner.com/jetbrains_rubymine?format=xml' )
34 |
35 | assert_equal 'rss 2.0', feed.format
36 | end
37 |
38 | end
39 |
--------------------------------------------------------------------------------
/feeds/NOTES.md:
--------------------------------------------------------------------------------
1 | # Notes
2 |
3 |
4 | ## Todos
5 |
6 | in news/wahingtionpost-lbogs.innovations.rss:
7 |
8 | check:
9 |
10 | ```
11 | assert in ./news/washingtonpost-blogs-innovations.rss: feed.items[0].title == "Google's AlphaGo beats the world's best Go player - again".
12 | --- expected
13 | +++ actual
14 | @@ -1,2 +1,2 @@
15 | # encoding: UTF-8
16 | -"Google\u2019s AlphaGo beats the world\u2019s best Go player - again"
17 | +"Google\u2019s AlphaGo beats the world\u2019s best Go player \u2014 again"
18 |
19 | ## feed.items[0].title: Google’s AlphaGo beats the world’s best Go player — again
20 |
21 | => fix reader - do NOT (auto-)convert dashes!!!!!!
22 | ```
23 |
24 |
25 | add support for multi-line with (preserved) newlines:
26 |
27 | ```
28 |
30 |
31 |
32 |
33 | AI: 2, Humanity: 0. A computer designed by Google researchers has beaten the world’s top Go player for the second game in a row, capturing the best-of-three match in Wuzhen, China, and confirming AI’s supremacy in what many consider as one of humanity’s most complex boardgames. Ke Jie, a 19-year old Go grandmaster, began the […]]]>
34 | ```
35 |
36 |
37 | ---
38 |
39 | in news/nytimes.rss
40 |
41 | check
42 |
43 | ```
44 | ## todo: how to check for empty description - use empty string (or use nil) ???
45 | ##
46 | >>> pp feed.description
47 | ```
48 |
--------------------------------------------------------------------------------
/feeds/README.md:
--------------------------------------------------------------------------------
1 |
2 | # Tests, Tests, Tests
3 |
4 | Feeds (in Atom, RSS, JSON Feed, HTML h-entry, etc.) with Test Assertions.
5 |
6 |
7 | ## Usage
8 |
9 | How does it work?
10 |
11 | Use the triple-dash (e.g. `---`) on its own line to separate
12 | the feed source from all test assertions. Example:
13 |
14 |
15 | ```
16 | {
17 | "version": "https://jsonfeed.org/version/1",
18 | "title": "JSON Feed",
19 | "description": "JSON Feed is a pragmatic syndication format for blogs, microblogs, and other time-based content.",
20 | "home_page_url": "https://jsonfeed.org/",
21 | "feed_url": "https://jsonfeed.org/feed.json",
22 | "user_comment": "This feed allows you to read the posts...",
23 | "favicon": "https://jsonfeed.org/graphics/icon.png",
24 | "author": {
25 | "name": "Brent Simmons and Manton Reece"
26 | },
27 | "items": [
28 | {
29 | "id": "https://jsonfeed.org/2017/05/17/announcing_json_feed",
30 | "url": "https://jsonfeed.org/2017/05/17/announcing_json_feed",
31 | "title": "Announcing JSON Feed",
32 | "content_html": "
We — Manton Reece and Brent Simmons — have noticed that JSON has become the developers’ choice for APIs,...",
33 | "date_published": "2017-05-17T08:02:12-07:00"
34 | }
35 | ]
36 | }
37 |
38 | ---
39 |
40 | feed.format: json
41 | feed.title: JSON Feed
42 | feed.url: https://jsonfeed.org/
43 | feed.feed_url: https://jsonfeed.org/feed.json
44 | feed.summary: JSON Feed is a pragmatic syndication format for blogs, microblogs, and other time-based content.
45 |
46 | feed.authors[0].name: Brent Simmons and Manton Reece
47 |
48 | feed.items[0].title: Announcing JSON Feed
49 | feed.items[0].url: https://jsonfeed.org/2017/05/17/announcing_json_feed
50 | feed.items[0].id: https://jsonfeed.org/2017/05/17/announcing_json_feed
51 | feed.items[0].published_local: >>> DateTime.new( 2017, 5, 17, 8, 2, 12, '-7' )
52 | feed.items[0].published: >>> DateTime.new( 2017, 5, 17, 8, 2, 12, '-7' ).utc
53 | ```
54 |
55 |
56 | ## Run Tests
57 |
58 | Use
59 |
60 | ```
61 | ruby -I ./test test/test_feeds.rb
62 | ```
63 |
64 | to run selected / individual test or to run
65 | all tests
66 |
67 | ```
68 | rake # or
69 | rake test
70 | ```
71 |
72 |
73 | Resulting in:
74 |
75 | ```
76 | reading ./spec/rss/creator.rss ...
77 | [debug] using stdlib rss/0.2.7
78 | [debug] Parsing feed in xml...
79 | [debug] feed.class=RSS::Rss
80 | [debug] rss | feed.version >2.0<
81 | [debug] rss | feed.title >Test Dublin Core< : String
82 | [debug] rss | feed.description => summary >< : String
83 | [debug] rss | feed.lastBuildDate => updated >Mon, 29 May 2017 20:51:30 +0200< : Time
84 | [debug] rss | feed.pubDate => published >< : NilClass
85 | eval assert_equal %{Peter Baker}, feed.items[0].authors[0].to_s
86 | eval assert_equal %{Peter Baker}, feed.items[0].author.text
87 | eval assert_equal %{Peter Baker}, feed.items[0].author.to_s
88 | eval assert_equal nil, feed.items[0].author.email
89 | ...
90 |
91 | Finished in 5.104933s, 0.1959 runs/s, 79.1391 assertions/s.
92 |
93 | 1 runs, 404 assertions, 0 failures, 0 errors, 0 skips
94 | ```
95 |
--------------------------------------------------------------------------------
/feeds/Rakefile:
--------------------------------------------------------------------------------
1 | ###
2 | ## use TestTask from Rake for setting up testing
3 | ## see https://docs.ruby-lang.org/en/2.1.0/Rake/TestTask.html
4 |
5 | require 'rake/testtask'
6 |
7 | Rake::TestTask.new do |t|
8 | t.test_files = FileList['test/**/test_*.rb']
9 | t.libs = ['test'] ## (auto-)add to load path
10 | end
11 |
12 |
13 | task :default => :test
14 |
--------------------------------------------------------------------------------
/feeds/books/pragprog.rss:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 |
8 | Pragmatic Bookshelf
9 | https://pragprog.com/
10 | Up-to-date information about the Pragmatic Bookshelf
11 | en-us
12 | Sat, 27 May 2017 17:18:55 +0000
13 |
14 | Python Testing with pytest
15 | <div id="cms-content">
16 |
17 | </div>
18 |
19 | Tue, 23 May 2017 18:35:00 +0000
20 | http://pragprog.com/news/python-testing-with-pytest?3639225
21 | http://pragprog.com/news/python-testing-with-pytest
22 | news
23 |
24 |
25 | Agile Web Development with Rails 5.1, Upgrade Details
26 | <div id="cms-content">
27 |
28 | </div>
29 |
30 | Wed, 10 May 2017 14:32:55 +0000
31 | http://pragprog.com/news/agile-web-development-with-rails-5-1-upgrade-details?3629250
32 | http://pragprog.com/news/agile-web-development-with-rails-5-1-upgrade-details
33 | news
34 |
35 |
36 | Surprise Sale: 40% Off this week only
37 | <div id="cms-content">
38 |
39 | </div>
40 |
41 | Wed, 26 Apr 2017 13:20:02 +0000
42 | http://pragprog.com/news/surprise-sale-40-off-this-week-only?3619134
43 | http://pragprog.com/news/surprise-sale-40-off-this-week-only
44 | news
45 |
46 |
47 | Now in print: iOS 10 SDK Development: Creating iPhone and iPad Apps with Swift
48 | <div id="cms-content">
49 |
50 | </div>
51 |
52 | Tue, 28 Mar 2017 13:54:09 +0000
53 | http://pragprog.com/news/now-in-print-ios-10-sdk-development-creating-iphone-and-ipad-apps-with-swift?3607075
54 | http://pragprog.com/news/now-in-print-ios-10-sdk-development-creating-iphone-and-ipad-apps-with-swift
55 | news
56 |
57 |
58 | Functional Web Development with Elixir, OTP, and Phoenix
59 | <div id="cms-content">
60 |
61 | </div>
62 |
63 | Tue, 21 Mar 2017 14:48:25 +0000
64 | http://pragprog.com/news/functional-web-development-with-elixir-otp-and-phoenix?3602607
65 | http://pragprog.com/news/functional-web-development-with-elixir-otp-and-phoenix
66 | news
67 |
68 |
69 | A Common-Sense Guide to Data Structures and Algorithms
70 | <div id="cms-content">
71 |
72 | </div>
73 |
74 | Tue, 14 Mar 2017 17:32:21 +0000
75 | http://pragprog.com/news/a-common-sense-guide-to-data-structures-and-algorithms?3600282
76 | http://pragprog.com/news/a-common-sense-guide-to-data-structures-and-algorithms
77 | news
78 |
79 |
80 | Design It! From Programmer to Software Architect
81 | <div id="cms-content">
82 |
83 | </div>
84 |
85 | Wed, 08 Mar 2017 14:30:18 +0000
86 | http://pragprog.com/news/design-it-from-programmer-to-software-architect?3597202
87 | http://pragprog.com/news/design-it-from-programmer-to-software-architect
88 | news
89 |
90 |
91 | Programming Elixir 1.3 in print
92 | <div id="cms-content">
93 |
94 | </div>
95 |
96 | Sun, 19 Feb 2017 14:35:41 +0000
97 | http://pragprog.com/news/programming-elixir-1-3-in-print?3593675
98 | http://pragprog.com/news/programming-elixir-1-3-in-print
99 | news
100 |
101 |
102 | The Cucumber Book, Second Edition for Rails 5
103 | <div id="cms-content">
104 |
105 | </div>
106 |
107 | Sun, 19 Feb 2017 14:31:11 +0000
108 | http://pragprog.com/news/the-cucumber-book-second-edition-for-rails-5?3593671
109 | http://pragprog.com/news/the-cucumber-book-second-edition-for-rails-5
110 | news
111 |
112 |
113 | Practical Vim for Vim 8 and Core Data for Swift 3
114 | <div id="cms-content">
115 |
116 | </div>
117 |
118 | Sun, 19 Feb 2017 14:29:19 +0000
119 | http://pragprog.com/news/practical-vim-for-vim-8-and-core-data-for-swift-3?3593667
120 | http://pragprog.com/news/practical-vim-for-vim-8-and-core-data-for-swift-3
121 | news
122 |
123 |
124 |
125 |
126 | ---
127 |
128 | feed.format: rss 2.0
129 | feed.title: Pragmatic Bookshelf
130 | feed.url: https://pragprog.com/
131 | feed.description: Up-to-date information about the Pragmatic Bookshelf
132 | feed.published: >>> DateTime.new( 2017, 5, 27, 17, 18, 55 )
133 |
134 |
135 | feed.items.size: >>> 10
136 |
137 | feed.items[0].title: Python Testing with pytest
138 | feed.items[0].url: http://pragprog.com/news/python-testing-with-pytest
139 | feed.items[0].guid: http://pragprog.com/news/python-testing-with-pytest?3639225
140 | feed.items[0].published: >>> DateTime.new( 2017, 5, 23, 18, 35 )
141 |
142 | feed.items[1].title: Agile Web Development with Rails 5.1, Upgrade Details
143 | feed.items[1].url: http://pragprog.com/news/agile-web-development-with-rails-5-1-upgrade-details
144 | feed.items[1].guid: http://pragprog.com/news/agile-web-development-with-rails-5-1-upgrade-details?3629250
145 | feed.items[1].published: >>> DateTime.new( 2017, 5, 10, 14, 32, 55 )
146 |
147 |
148 | >>> pp feed.items[0].description
149 |
--------------------------------------------------------------------------------
/feeds/comics/xkcd.atom:
--------------------------------------------------------------------------------
1 |
2 |
3 | xkcd.com
4 |
5 | https://xkcd.com/
6 | 2017-05-22T00:00:00Z
7 |
8 | Genetic Testing Results
9 |
10 | 2017-05-22T00:00:00Z
11 | https://xkcd.com/1840/
12 | <img src="https://imgs.xkcd.com/comics/genetic_testing_results.png" title="That's very exciting! The bad news is that it's a risk factor for a lot of things." alt="That's very exciting! The bad news is that it's a risk factor for a lot of things." />
13 |
14 |
15 | Doctor Visit
16 |
17 | 2017-05-19T00:00:00Z
18 | https://xkcd.com/1839/
19 | <img src="https://imgs.xkcd.com/comics/doctor_visit.png" title="According to these blood tests, you're like 30% cereal." alt="According to these blood tests, you're like 30% cereal." />
20 |
21 |
22 | Machine Learning
23 |
24 | 2017-05-17T00:00:00Z
25 | https://xkcd.com/1838/
26 | <img src="https://imgs.xkcd.com/comics/machine_learning.png" title="The pile gets soaked with data and starts to get mushy over time, so it's technically recurrent." alt="The pile gets soaked with data and starts to get mushy over time, so it's technically recurrent." />
27 |
28 |
29 | Rental Car
30 |
31 | 2017-05-15T00:00:00Z
32 | https://xkcd.com/1837/
33 | <img src="https://imgs.xkcd.com/comics/rental_car.png" title="Technically, both cars are haunted, but the murder ghosts can't stand listening to the broken GPS for more than a few minutes." alt="Technically, both cars are haunted, but the murder ghosts can't stand listening to the broken GPS for more than a few minutes." />
34 |
35 |
36 |
37 | ---
38 |
39 | feed.format: atom
40 | feed.title: xkcd.com
41 | feed.url: https://xkcd.com/
42 | feed.updated: >>> DateTime.new( 2017, 5, 22 )
43 | feed.items.size: >>> 4
44 |
45 | feed.items[0].title: Genetic Testing Results
46 | feed.items[0].url: https://xkcd.com/1840/
47 | feed.items[0].guid: https://xkcd.com/1840/
48 | feed.items[0].updated: >>> DateTime.new( 2017, 5, 22 )
49 |
--------------------------------------------------------------------------------
/feeds/comics/xkcd.rss:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | xkcd.com
5 | https://xkcd.com/
6 | xkcd.com: A webcomic of romance and math humor.
7 | en
8 |
9 | Genetic Testing Results
10 | https://xkcd.com/1840/
11 | <img src="https://imgs.xkcd.com/comics/genetic_testing_results.png" title="That's very exciting! The bad news is that it's a risk factor for a lot of things." alt="That's very exciting! The bad news is that it's a risk factor for a lot of things." />
12 | Mon, 22 May 2017 04:00:00 -0000
13 | https://xkcd.com/1840/
14 |
15 |
16 | Doctor Visit
17 | https://xkcd.com/1839/
18 | <img src="https://imgs.xkcd.com/comics/doctor_visit.png" title="According to these blood tests, you're like 30% cereal." alt="According to these blood tests, you're like 30% cereal." />
19 | Fri, 19 May 2017 04:00:00 -0000
20 | https://xkcd.com/1839/
21 |
22 |
23 | Machine Learning
24 | https://xkcd.com/1838/
25 | <img src="https://imgs.xkcd.com/comics/machine_learning.png" title="The pile gets soaked with data and starts to get mushy over time, so it's technically recurrent." alt="The pile gets soaked with data and starts to get mushy over time, so it's technically recurrent." />
26 | Wed, 17 May 2017 04:00:00 -0000
27 | https://xkcd.com/1838/
28 |
29 |
30 | Rental Car
31 | https://xkcd.com/1837/
32 | <img src="https://imgs.xkcd.com/comics/rental_car.png" title="Technically, both cars are haunted, but the murder ghosts can't stand listening to the broken GPS for more than a few minutes." alt="Technically, both cars are haunted, but the murder ghosts can't stand listening to the broken GPS for more than a few minutes." />
33 | Mon, 15 May 2017 04:00:00 -0000
34 | https://xkcd.com/1837/
35 |
36 |
37 |
38 |
39 | ---
40 |
41 | feed.format: rss 2.0
42 | feed.title: xkcd.com
43 | feed.description: xkcd.com: A webcomic of romance and math humor.
44 | feed.url: https://xkcd.com/
45 | feed.items.size: >>> 4
46 |
47 | feed.items[0].title: Genetic Testing Results
48 | feed.items[0].url: https://xkcd.com/1840/
49 | feed.items[0].guid: https://xkcd.com/1840/
50 | feed.items[0].published: >>> DateTime.new( 2017, 5, 22, 4, 0 )
51 | feed.items[0].description:
52 |
53 |
54 | feed.items[1].title: Doctor Visit
55 | feed.items[1].url: https://xkcd.com/1839/
56 | feed.items[1].guid: https://xkcd.com/1839/
57 | feed.items[1].published: >>> DateTime.new( 2017, 5, 19, 4, 0 )
58 |
59 | >>> pp feed.items[0].description
60 |
--------------------------------------------------------------------------------
/feeds/misc/googlegroups.atom:
--------------------------------------------------------------------------------
1 |
2 | https://groups.google.com/d/forum/beerdb
3 | Open Beer & Brewery Database (beer.db)
4 | Free open public domain beer database & schema (beer.db) for use in any (programming) language (e.g. uses plain text fixtures/data sets). Questions? Comments?
5 |
6 |
7 | Google Groups
8 |
9 |
10 | Joe Sixpack
11 |
12 | 2014-12-17T11:54:43Z
13 | https://groups.google.com/d/topic/beerdb/KpQOUDYJ3J8
14 |
15 | Planet Beer (Austria, Belgium) - Feeds Incl. Craft Fest Wien, Beer-A-Day, proBier n Friends
16 | Hello, I've started putting together a planet site for beer, that is, Planet Beer [1]. The first feed lists include: - Austria [2] - Belgium [3] You're welcome and invited to suggest new countries and feeds. Cheers. Prost. [1] http://planetbeer.herokuapp.com [2] http://github.com/openbeer/planet/blob/master/
17 |
18 |
19 |
20 | ---
21 |
22 | feed.format: atom
23 | feed.title: Open Beer & Brewery Database (beer.db)
24 | feed.url: https://groups.google.com/d/forum/beerdb
25 |
26 | feed.generator.name: Google Groups
27 |
28 | feed.items[0].title: Planet Beer (Austria, Belgium) - Feeds Incl. Craft Fest Wien, Beer-A-Day, proBier n Friends
29 | feed.items[0].url: https://groups.google.com/d/topic/beerdb/KpQOUDYJ3J8
30 |
31 |
32 | ### todo: fix: & => & -> always assume plain text? (by default) - auto-escape xml entities??
33 | feed.summary: Free open public domain beer database & schema (beer.db) for use in any (programming) language (e.g. uses plain text fixtures/data sets). Questions? Comments?
34 |
35 | ### todo: add check for datetime (use to_s ??)
36 | ## feed.updated.to_s: 2014-12-31T15:33:00+00:00
37 | ## feed.items[0].to_s: 2014-12-31T15:33:00+00:00
38 |
--------------------------------------------------------------------------------
/feeds/misc/googlegroups2.atom:
--------------------------------------------------------------------------------
1 |
2 | https://groups.google.com/d/forum/beerdb
3 | Open Beer & Brewery Database (beer.db)
4 | Free open public domain beer database & schema (beer.db) for use in any (programming) language (e.g. uses plain text fixtures/data sets). Questions? Comments?
5 |
6 |
7 |
8 | Google Groups (w/ leading n trailing newlines stripped)
9 |
10 |
11 |
12 | Joe Sixpack
13 |
14 | 2014-12-17T11:54:43Z
15 | https://groups.google.com/d/topic/beerdb/KpQOUDYJ3J8
16 |
17 | Planet Beer (Austria, Belgium) - Feeds Incl. Craft Fest Wien, Beer-A-Day, proBier n Friends
18 | Hello, I've started putting together a planet site for beer, that is, Planet Beer [1]. The first feed lists include: - Austria [2] - Belgium [3] You're welcome and invited to suggest new countries and feeds. Cheers. Prost. [1] http://planetbeer.herokuapp.com [2] http://github.com/openbeer/planet/blob/master/
19 |
20 |
21 |
22 | ---
23 |
24 | feed.format: atom
25 | feed.url: https://groups.google.com/d/forum/beerdb
26 |
27 | feed.generator.name: Google Groups (w/ leading n trailing newlines stripped)
28 |
--------------------------------------------------------------------------------
/feeds/misc/jsonfeed.json:
--------------------------------------------------------------------------------
1 | {
2 | "version": "https://jsonfeed.org/version/1",
3 | "title": "JSON Feed",
4 | "description": "JSON Feed is a pragmatic syndication format for blogs, microblogs, and other time-based content.",
5 | "home_page_url": "https://jsonfeed.org/",
6 | "feed_url": "https://jsonfeed.org/feed.json",
7 | "user_comment": "This feed allows you to read the posts from this site in any feed reader that supports the JSON Feed format. To add this feed to your reader, copy the following URL — https://jsonfeed.org/feed.json — and add it your reader.",
8 | "favicon": "https://jsonfeed.org/graphics/icon.png",
9 | "author": {
10 | "name": "Brent Simmons and Manton Reece"
11 | },
12 | "items": [
13 | {
14 | "id": "https://jsonfeed.org/2017/05/17/announcing_json_feed",
15 | "url": "https://jsonfeed.org/2017/05/17/announcing_json_feed",
16 | "title": "Announcing JSON Feed",
17 | "content_html": "
We — Manton Reece and Brent Simmons — have noticed that JSON has become the developers’ choice for APIs, and that developers will often go out of their way to avoid XML. JSON is simpler to read and write, and it’s less prone to bugs.
\n\n
So we developed JSON Feed, a format similar to RSS and Atom but in JSON. It reflects the lessons learned from our years of work reading and publishing feeds.
\n\n
See the spec. It’s at version 1, which may be the only version ever needed. If future versions are needed, version 1 feeds will still be valid feeds.
\n\n
Notes
\n\n
We have a WordPress plugin and, coming soon, a JSON Feed Parser for Swift. As more code is written, by us and others, we’ll update the code page.
This website — the Markdown files and supporting resources — is up on GitHub, and you’re welcome to comment there.
\n\n
This website is also a blog, and you can subscribe to the RSS feed or the JSON feed (if your reader supports it).
\n\n
We worked with a number of people on this over the course of several months. We list them, and thank them, at the bottom of the spec. But — most importantly — Craig Hockenberry spent a little time making it look pretty. :)
",
18 | "date_published": "2017-05-17T08:02:12-07:00"
19 | }
20 | ]
21 | }
22 |
23 | ---
24 |
25 | feed.format: json
26 | feed.title: JSON Feed
27 | feed.url: https://jsonfeed.org/
28 | feed.feed_url: https://jsonfeed.org/feed.json
29 | feed.summary: JSON Feed is a pragmatic syndication format for blogs, microblogs, and other time-based content.
30 |
31 | feed.authors[0].name: Brent Simmons and Manton Reece
32 |
33 |
34 | feed.items[0].title: Announcing JSON Feed
35 | feed.items[0].url: https://jsonfeed.org/2017/05/17/announcing_json_feed
36 | feed.items[0].id: https://jsonfeed.org/2017/05/17/announcing_json_feed
37 | feed.items[0].published: >>> DateTime.new( 2017, 5, 17, 8, 2, 12, '-7' ).utc
38 |
--------------------------------------------------------------------------------
/feeds/news/nytimes-paul-krugman.rss:
--------------------------------------------------------------------------------
1 |
2 |
3 | 60
4 | Paul Krugman
5 | https://www.nytimes.com/column/paul-krugman
6 | Paul Krugman, a New York Times Op-Ed columnist, writes about macroeconomics, trade, health care, social policy and politics. In 2008, he received the Nobel Prize in Economics.
7 | Copyright 2017 The New York Times Company
8 | en-us
9 |
10 | Trump’s Energy, Low and Dirty
11 | https://www.nytimes.com/2017/05/29/opinion/trump-g-7-summit-energy.html
12 | Risking the planet to keep a lie alive.
13 | By PAUL KRUGMAN
14 | Mon, 29 May 2017 03:21:09 -0500
15 |
16 |
17 | It’s All About Trump’s Contempt
18 | https://www.nytimes.com/2017/05/26/opinion/trumpcare-cbo-federal-budget.html
19 | His budget and health plan show he despises his voters. Will they notice?
20 | By PAUL KRUGMAN
21 | Fri, 26 May 2017 03:21:23 -0500
22 |
23 |
24 | The Unfreeing of American Workers
25 | https://www.nytimes.com/2017/05/22/opinion/american-workers-noncompete-agreements.html
26 | Creeping along the real road to serfdom.
27 | By PAUL KRUGMAN
28 | Mon, 22 May 2017 03:21:10 -0500
29 |
30 |
31 | What’s the Matter With Republicans?
32 | https://www.nytimes.com/2017/05/19/opinion/whats-the-matter-with-republicans.html
33 | We need to understand what made Trump possible.
34 | By PAUL KRUGMAN
35 | Fri, 19 May 2017 03:21:08 -0500
36 |
37 |
38 | The Priming of Mr. Donald Trump
39 | https://www.nytimes.com/2017/05/15/opinion/trump-tax-cuts-deficit.html
40 | He’s not the only one with fiscal fantasies.
41 | By PAUL KRUGMAN
42 | Mon, 15 May 2017 03:21:15 -0500
43 |
44 |
45 | Judas, Tax Cuts and the Great Betrayal
46 | https://www.nytimes.com/2017/05/12/opinion/judas-tax-cuts-and-the-great-betrayal.html
47 | The Republican response to Trump’s cover-up will live in infamy forever.
48 | By PAUL KRUGMAN
49 | Fri, 12 May 2017 03:22:04 -0500
50 |
51 |
52 | Republicans Party Like It’s 1984https://www.nytimes.com/2017/05/08/opinion/republicans-party-like-its-1984.htmlMaking policy by lying about everything.By PAUL KRUGMANMon, 08 May 2017 03:21:24 -0500
53 |
54 | What’s the Matter With Europe?https://www.nytimes.com/2017/05/05/opinion/european-union-france-election.htmlLe Pen must be beaten, but then what?By PAUL KRUGMANFri, 05 May 2017 03:21:24 -0500
55 |
56 | On the Power of Being Awfulhttps://www.nytimes.com/2017/05/01/opinion/donald-trump-on-the-power-of-being-awful.htmlTrump supporters will never admit they were wrong.By PAUL KRUGMANMon, 01 May 2017 03:21:16 -0500
57 |
58 | Living in the Trump Zonehttps://www.nytimes.com/2017/04/28/opinion/living-in-the-trump-zone.htmlWe’re in a place and time where childish petulance drives policy.By PAUL KRUGMANFri, 28 Apr 2017 03:21:22 -0500
59 |
60 |
61 |
62 | ---
63 |
64 | feed.format: rss 2.0
65 | feed.title: Paul Krugman
66 | feed.url: https://www.nytimes.com/column/paul-krugman
67 | feed.description: Paul Krugman, a New York Times Op-Ed columnist, writes about macroeconomics, trade, health care, social policy and politics. In 2008, he received the Nobel Prize in Economics.
68 |
69 | feed.items[0].title: Trump’s Energy, Low and Dirty
70 | feed.items[0].url: https://www.nytimes.com/2017/05/29/opinion/trump-g-7-summit-energy.html
71 | feed.items[0].description: Risking the planet to keep a lie alive.
72 | feed.items[0].author.text: By PAUL KRUGMAN
73 | feed.items[0].published: >>> DateTime.new( 2017, 5, 29, 3, 21, 9, '-5').utc
74 |
75 | feed.items[1].title: It’s All About Trump’s Contempt
76 | feed.items[1].url: https://www.nytimes.com/2017/05/26/opinion/trumpcare-cbo-federal-budget.html
77 | feed.items[1].description: His budget and health plan show he despises his voters. Will they notice?
78 | feed.items[1].author.text: By PAUL KRUGMAN
79 | feed.items[1].published: >>> DateTime.new( 2017, 5, 26, 3, 21,23, '-5').utc
80 |
--------------------------------------------------------------------------------
/feeds/news/nytimes-thomas-l-friedman.rss:
--------------------------------------------------------------------------------
1 |
2 |
3 | 60
4 | Thomas L. Friedman
5 | https://www.nytimes.com/column/thomas-l-friedman
6 | Thomas L. Friedman, a New York Times Op-Ed columnist, writes about foreign affairs, globalization and technology.
7 | Copyright 2017 The New York Times Company
8 | en-us
9 |
10 | A Road Trip Through Rusting and Rising America
11 | https://www.nytimes.com/2017/05/24/opinion/rusting-and-rising-america.html
12 | The comeback of distressed and lost communities is the story of Bill Clinton’s America, not Donald Trump’s.
13 | By THOMAS L. FRIEDMAN
14 | Wed, 24 May 2017 03:21:08 -0500
15 |
16 |
17 | It’s Chicken or Fish
18 | https://www.nytimes.com/2017/05/16/opinion/trump-republicans-2018-elections.html
19 | Elected Republicans won’t stand up to Trump’s abuse of power, like his asking James Comey to halt the Flynn-Russia inquiry. So now you have a choice.
20 | By THOMAS L. FRIEDMAN
21 | Tue, 16 May 2017 19:41:47 -0500
22 |
23 |
24 | Owning Your Own Future
25 | https://www.nytimes.com/2017/05/10/opinion/owning-your-own-future.html
26 | Stop learning and you could find yourself without a job.
27 | By THOMAS L. FRIEDMAN
28 | Wed, 10 May 2017 03:21:01 -0500
29 |
30 |
31 | Trump: Crazy Like a Fox, or Just Crazy?
32 | https://www.nytimes.com/2017/05/03/opinion/trump-crazy-like-a-fox-or-just-crazy.html
33 | The president’s remarks about his first 100 days have been simply bizarre.
34 | By THOMAS L. FRIEDMAN
35 | Wed, 03 May 2017 03:21:08 -0500
36 |
37 |
38 | On a Par 5 in Dubai, Good Humor and a Respite From All Things Trump
39 | https://www.nytimes.com/2017/04/26/opinion/on-a-par-5-in-dubai-good-humor-and-a-respite-from-all-things-trump.html
40 | Oh, and there’s this yogi with a flowing white beard and golf clothes.
41 | By THOMAS L. FRIEDMAN
42 | Wed, 26 Apr 2017 03:21:15 -0500
43 |
44 |
45 | Coal Museum Sees the Future; Trump Doesn’t
46 | https://www.nytimes.com/2017/04/19/opinion/coal-museum-sees-the-future-trump-doesnt.html
47 | The president is focused on prolonging a dying industry rather than on renewable energy, which is making the country stronger without him.
48 | By THOMAS L. FRIEDMAN
49 | Wed, 19 Apr 2017 03:21:23 -0500
50 |
51 |
52 | Why Is Trump Fighting ISIS in Syria?
53 | https://www.nytimes.com/2017/04/12/opinion/why-is-trump-fighting-isis-in-syria.html
54 | A strategy built on territory won’t ultimately eliminate the terrorist group.
55 | By THOMAS L. FRIEDMAN
56 | Wed, 12 Apr 2017 03:21:13 -0500
57 |
58 |
59 | President Trump’s Real-World Syria Lesson
60 | https://www.nytimes.com/2017/04/05/opinion/president-trumps-real-world-syria-lesson.html
61 | Doing nothing shouldn’t be an option.
62 | By THOMAS L. FRIEDMAN
63 | Wed, 05 Apr 2017 03:21:22 -0500
64 |
65 |
66 | Trump Is a Chinese Agent
67 | https://www.nytimes.com/2017/03/29/opinion/trump-is-a-chinese-agent.html
68 | Ignoring climate change and the benefits of clean energy only helps a rival.
69 | By THOMAS L. FRIEDMAN
70 | Wed, 29 Mar 2017 03:21:26 -0500
71 |
72 |
73 | Calling On a Few Good Men
74 | https://www.nytimes.com/2017/03/22/opinion/calling-on-a-few-good-men.html
75 | An open letter to the adults in the Trump administration with the most integrity.
76 | By THOMAS L. FRIEDMAN
77 | Wed, 22 Mar 2017 03:21:26 -0500
78 |
79 |
80 |
81 |
82 | ---
83 |
84 | feed.format: rss 2.0
85 | feed.title: Thomas L. Friedman
86 | feed.url: https://www.nytimes.com/column/thomas-l-friedman
87 | feed.description: Thomas L. Friedman, a New York Times Op-Ed columnist, writes about foreign affairs, globalization and technology.
88 |
89 | feed.items[0].title: A Road Trip Through Rusting and Rising America
90 | feed.items[0].url: https://www.nytimes.com/2017/05/24/opinion/rusting-and-rising-america.html
91 | feed.items[0].description: [[
92 | The comeback of distressed and lost communities is the story of Bill Clinton’s America, not Donald Trump’s. ]]
93 | feed.items[0].author.text: By THOMAS L. FRIEDMAN
94 | feed.items[0].published: >>> DateTime.new( 2017, 5, 24, 3, 21, 8, '-5' ).utc
95 |
96 | feed.items[1].title: It’s Chicken or Fish
97 | feed.items[1].url: https://www.nytimes.com/2017/05/16/opinion/trump-republicans-2018-elections.html
98 | feed.items[1].description: [[
99 | Elected Republicans won’t stand up to Trump’s abuse of power,
100 | like his asking James Comey to halt the Flynn-Russia inquiry. So now you have a choice. ]]
101 | feed.items[1].author.text: By THOMAS L. FRIEDMAN
102 | feed.items[1].published: >>> DateTime.new( 2017, 5, 16, 19, 41, 47, '-5' ).utc
103 |
104 | feed.items[2].title: Owning Your Own Future
105 | feed.items[2].url: https://www.nytimes.com/2017/05/10/opinion/owning-your-own-future.html
106 | feed.items[2].description: Stop learning and you could find yourself without a job.
107 |
--------------------------------------------------------------------------------
/feeds/spec/atom/author.atom:
--------------------------------------------------------------------------------
1 |
2 |
3 | Test Author
4 |
5 |
6 | http://example.com
7 | 2017-05-23T19:36:44Z
8 |
9 | John Jay Gruber
10 | http://example.com/
11 |
12 |
13 |
14 | Feedbin, Too
15 |
16 | tag:daringfireball.net,2017:/linked//6.33732
17 | 2017-05-23T18:50:36Z
18 | 2017-05-23T19:03:33Z
19 |
20 | Max Gruber Jun.
21 | http://example.com/
22 |
23 |
24 | Ben Ubois, announcing support for JSON Feed in Feedbin...
25 |
26 |
27 |
28 |
29 | ---
30 |
31 | feed.authors.size: >>> 1
32 | feed.authors[0].name: John Jay Gruber
33 | feed.authors[0].url: http://example.com/
34 | feed.authors[0].email: >>> nil
35 |
36 | feed.author.name: John Jay Gruber
37 | feed.author.url: http://example.com/
38 | feed.author.email: >>> nil
39 |
40 |
41 | feed.items[0].authors.size: >>> 1
42 | feed.items[0].authors[0].name: Max Gruber Jun.
43 | feed.items[0].authors[0].url: http://example.com/
44 | feed.items[0].authors[0].email: >>> nil
45 |
46 | feed.items[0].author.name: Max Gruber Jun.
47 | feed.items[0].author.url: http://example.com/
48 | feed.items[0].author.email: >>> nil
49 |
--------------------------------------------------------------------------------
/feeds/spec/atom/authors.atom:
--------------------------------------------------------------------------------
1 |
2 |
3 | Test Author
4 |
5 |
6 | http://example.com
7 | 2017-05-23T19:36:44Z
8 |
9 | John Jay Gruber
10 | http://example.com/
11 |
12 |
13 | Frank Huber
14 | http://example.com/frank/
15 |
16 |
17 |
18 | Feedbin, Too
19 |
20 | tag:daringfireball.net,2017:/linked//6.33732
21 | 2017-05-23T18:50:36Z
22 | 2017-05-23T19:03:33Z
23 |
24 | Max Gruber Jun.
25 | http://example.com/
26 |
27 |
28 | Frank Huber
29 | http://example.com/frank/
30 | frank@example.com
31 |
32 |
33 | George Imker
34 | http://example.com/george/
35 |
36 |
37 | Ben Ubois, announcing support for JSON Feed in Feedbin...
38 |
39 |
40 |
41 |
42 | ---
43 |
44 | feed.authors.size: >>> 2
45 | feed.authors[0].name: John Jay Gruber
46 | feed.authors[0].url: http://example.com/
47 | feed.authors[0].email: >>> nil
48 | feed.authors[1].name: Frank Huber
49 | feed.authors[1].url: http://example.com/frank/
50 |
51 | feed.author.name: John Jay Gruber
52 | feed.author.url: http://example.com/
53 | feed.author.email: >>> nil
54 |
55 |
56 |
57 | feed.items[0].authors.size: >>> 3
58 | feed.items[0].authors[0].name: Max Gruber Jun.
59 | feed.items[0].authors[0].url: http://example.com/
60 | feed.items[0].authors[0].email: >>> nil
61 | feed.items[0].authors[1].name: Frank Huber
62 | feed.items[0].authors[1].url: http://example.com/frank/
63 | feed.items[0].authors[1].email: frank@example.com
64 | feed.items[0].authors[2].name: George Imker
65 | feed.items[0].authors[2].url: http://example.com/george/
66 | feed.items[0].authors[2].email: >>> nil
67 |
68 | feed.items[0].author.name: Max Gruber Jun.
69 | feed.items[0].author.url: http://example.com/
70 | feed.items[0].author.email: >>> nil
71 |
--------------------------------------------------------------------------------
/feeds/spec/atom/categories.atom:
--------------------------------------------------------------------------------
1 |
2 |
3 | Test Categories
4 |
5 |
6 | http://example.com
7 | 2017-05-23T19:36:44Z
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 | Rock Surprise
25 |
26 | https://www.tbray.org/ongoing/When/201x/2017/05/20/Rock-Surprise
27 | 2017-05-20T12:00:00-07:00
28 | 2017-05-21T11:13:00-07:00
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 | On a recent Saturday we accidentally took in two very
38 | different pop-music concerts...
39 |
40 |
41 |
42 |
43 | ---
44 |
45 | feed.tags.size: >>> 12
46 | feed.tags[0].name: jruby
47 | feed.tags[1].name: ruby
48 | feed.tags[2].name: java
49 | feed.tags[3].name: rails
50 | feed.tags[4].name: invokedynamic
51 | feed.tags[5].name: jvm
52 | feed.tags[6].name: application bundle
53 | feed.tags[7].name: compilation
54 | feed.tags[8].name: compiler
55 | feed.tags[9].name: dynamic dispatch
56 | feed.tags[10].name: dynamic languages
57 | feed.tags[11].name: ruby 2.0
58 |
59 |
60 | feed.items[0].tags.size: >>> 5
61 | feed.items[0].tags[0].name: Arts/Music
62 | feed.items[0].tags[0].scheme: https://www.tbray.org/ongoing/What/
63 | feed.items[0].tags[1].name: Arts
64 | feed.items[0].tags[2].name: Music
65 | feed.items[0].tags[3].name: Arts/Photos
66 | feed.items[0].tags[4].name: Photos
67 |
--------------------------------------------------------------------------------
/feeds/spec/json/example.json:
--------------------------------------------------------------------------------
1 | {
2 | "version": "https://jsonfeed.org/version/1",
3 | "title": "My Example Feed",
4 | "home_page_url": "https://example.org/",
5 | "feed_url": "https://example.org/feed.json",
6 | "items": [
7 | {
8 | "id": "2",
9 | "content_text": "This is a second item.",
10 | "url": "https://example.org/second-item"
11 | },
12 | {
13 | "id": "1",
14 | "content_html": "
In which I extoll the virtues of using microformats.
10 |
11 |
12 |
Blah blah blah
13 |
14 |
15 |
--------------------------------------------------------------------------------
/feeds/spec/rss/author.rss:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Test Author
5 | http://example.com/
6 |
7 | Mon, 29 May 2017 18:51:30 GMT
8 | Matt Flegenheimer Jr.
9 | Matt Flegenheimer Sr.
10 |
11 | Jared Kushner’s Role Is Tested as Russia Case Grows
12 | https://www.nytimes.com/2017/05/28/us/kushner-trump-relationship-russia-investigation.html?partner=rss&emc=rss
13 | https://www.nytimes.com/2017/05/28/us/kushner-trump-relationship-russia-investigation.html
14 | Mon, 29 May 2017 01:23:57 GMT
15 | Peter Baker
16 |
17 |
18 |
19 |
20 | ---
21 |
22 | feed.authors.size: >>> 2
23 | feed.authors[0].text: Matt Flegenheimer Jr.
24 | feed.authors[0].to_s: Matt Flegenheimer Jr.
25 | feed.authors[0].email: >>> nil
26 | feed.authors[1].text: Matt Flegenheimer Sr.
27 | feed.authors[1].to_s: Matt Flegenheimer Sr.
28 |
29 | feed.author.text: Matt Flegenheimer Jr.
30 | feed.author.to_s: Matt Flegenheimer Jr.
31 | feed.author.email: >>> nil
32 |
33 |
34 | feed.items[0].authors.size: >>> 1
35 | feed.items[0].authors[0].text: Peter Baker
36 | feed.items[0].authors[0].to_s: Peter Baker
37 | feed.items[0].authors[0].email: >>> nil
38 |
39 | feed.items[0].author.text: Peter Baker
40 | feed.items[0].author.to_s: Peter Baker
41 | feed.items[0].author.email: >>> nil
42 |
--------------------------------------------------------------------------------
/feeds/spec/rss/categories.rss:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Test Categories
5 | http://example.com
6 |
7 | Mon, 29 May 2017 18:51:30 GMT
8 | United States Politics and Government
9 | Social Media
10 | News and News Media
11 |
12 |
13 | Jared Kushner’s Role Is Tested as Russia Case Grows
14 | https://www.nytimes.com/2017/05/28/us/kushner-trump-relationship-russia-investigation.html?partner=rss&emc=rss
15 | https://www.nytimes.com/2017/05/28/us/kushner-trump-relationship-russia-investigation.html
16 | It is unclear how Jared Kushner’s high-profile woes will affect his hard-won partnership with his father-in-law, perhaps the most stable in an often unstable White House.
17 | Mon, 29 May 2017 01:23:57 GMT
18 | Presidents and Presidency (US)
19 | Appointments and Executive Changes
20 | United States
21 | Jared Kushner
22 | Donald J. Trump
23 |
24 |
25 |
26 | Reported Talks by Jared Kushner With Russia Would Be ‘Good Thing,’ Trump Official Says
27 | https://www.nytimes.com/2017/05/28/us/politics/trump-returns-to-us-and-to-berating-newsmedia-on-twitter.html?partner=rss&emc=rss
28 | https://www.nytimes.com/2017/05/28/us/politics/trump-returns-to-us-and-to-berating-newsmedia-on-twitter.html
29 | John F. Kelly, the homeland security secretary, played down reports of a back channel. The president, meanwhile, resumed using Twitter as a weapon.
30 | Sun, 28 May 2017 16:57:05 GMT
31 | Trump, Donald J
32 | United States Politics and Government
33 | Social Media
34 | News and News Media
35 | Twitter
36 |
37 |
38 |
39 |
40 | ---
41 |
42 | feed.tags.size: >>> 3
43 | feed.tags[0].name: United States Politics and Government
44 | feed.tags[0].domain: http://www.nytimes.com/namespaces/keywords/des
45 | feed.tags[1].name: Social Media
46 | feed.tags[2].name: News and News Media
47 |
48 |
49 | feed.items[0].tags.size: >>> 5
50 | feed.items[0].tags[0].name: Presidents and Presidency (US)
51 | feed.items[0].tags[0].domain: http://www.nytimes.com/namespaces/keywords/mdes
52 | feed.items[0].tags[1].name: Appointments and Executive Changes
53 | feed.items[0].tags[2].name: United States
54 | feed.items[0].tags[3].name: Jared Kushner
55 | feed.items[0].tags[4].name: Donald J. Trump
56 |
57 |
58 | feed.items[1].tags.size: >>> 5
59 | feed.items[1].tags[0].name: Trump, Donald J
60 | feed.items[1].tags[0].domain: http://www.nytimes.com/namespaces/keywords/nyt_per
61 | feed.items[1].tags[1].name: United States Politics and Government
62 | feed.items[1].tags[2].name: Social Media
63 | feed.items[1].tags[3].name: News and News Media
64 | feed.items[1].tags[4].name: Twitter
65 |
--------------------------------------------------------------------------------
/feeds/spec/rss/creator.rss:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Test Dublin Core
5 | http://example.com/
6 |
7 | Mon, 29 May 2017 18:51:30 GMT
8 | Matt Flegenheimer
9 |
10 | Jared Kushner’s Role Is Tested as Russia Case Grows
11 | https://www.nytimes.com/2017/05/28/us/kushner-trump-relationship-russia-investigation.html?partner=rss&emc=rss
12 | https://www.nytimes.com/2017/05/28/us/kushner-trump-relationship-russia-investigation.html
13 | Mon, 29 May 2017 01:23:57 GMT
14 | Peter Baker
15 |
16 |
17 |
18 |
19 | ---
20 |
21 | feed.authors.size: >>> 1
22 | feed.authors[0].text: Matt Flegenheimer
23 | feed.authors[0].to_s: Matt Flegenheimer
24 | feed.authors[0].email: >>> nil
25 |
26 | feed.author.text: Matt Flegenheimer
27 | feed.author.to_s: Matt Flegenheimer
28 | feed.author.email: >>> nil
29 |
30 |
31 | feed.items[0].authors.size: >>> 1
32 | feed.items[0].authors[0].text: Peter Baker
33 | feed.items[0].authors[0].to_s: Peter Baker
34 | feed.items[0].authors[0].email: >>> nil
35 |
36 | feed.items[0].author.text: Peter Baker
37 | feed.items[0].author.to_s: Peter Baker
38 | feed.items[0].author.email: >>> nil
39 |
--------------------------------------------------------------------------------
/feeds/test/helper.rb:
--------------------------------------------------------------------------------
1 | # encoding: utf-8
2 |
3 |
4 | require 'logutils'
5 | require 'textutils'
6 |
7 | # note: for now use "packaged" version in gem
8 | # (not the source in ../feedparser/lib)
9 | require 'feedparser'
10 |
11 | # note: add microformats support (optional)
12 | require 'microformats'
13 |
14 |
15 |
16 | require 'minitest/autorun'
17 |
18 |
19 | LogUtils::Logger.root.level = :debug
20 |
21 |
22 |
23 | def walk(root, &block)
24 | Dir.foreach(root) do |name|
25 | ## puts "name: #{name}"
26 | path = File.join(root, name)
27 |
28 | if name == '.' || name == '..'
29 | next
30 | elsif File.directory?( path )
31 |
32 | ## note: skip .git !!
33 | ## test folder with ruby test scripts
34 | next if ['.git', 'test'].include?( name )
35 |
36 | puts "** directory: #{path}/"
37 | walk( path, &block )
38 | else
39 | puts " #{name}"
40 | block.call( path ) ## same as yield( path )
41 | end
42 | end
43 | end
44 |
45 |
46 | ## add custom assert
47 | module MiniTest
48 | class Test
49 |
50 |
51 | ## note:
52 | ## regex excape bracket: [ to \[
53 | ## \\ needs to get escaped twice e.g. (\\ becomes \)
54 | TXT_BEGIN = "\\[\\["
55 | TXT_END = "\\]\\]"
56 |
57 |
58 | def assert_feed( text, tests, opts={} )
59 |
60 |
61 | name = opts[:name] || ''
62 |
63 |
64 | feed = FeedParser::Parser.parse( text )
65 |
66 | ##################################################
67 | ## pass 1: remove blank lines & comment lines
68 |
69 | lines = []
70 |
71 | tests.each_line do |line|
72 | line = line.strip
73 |
74 | if line.start_with? '#'
75 | next ## skip comment lines too
76 | end
77 |
78 |
79 | if line == '__END__'
80 | break ## support end of file marker (skip/ignore all lines after __END__)
81 | end
82 |
83 | lines << line
84 | end
85 |
86 |
87 | #########################################
88 | ## pass 2: "fold" multi-line items
89 | ## e.g.
90 | ## feed.items[0].description: [[
91 | ## In the United States, the social media giant has been an advocate of equal treatment of all Internet content.
92 | ## In India, regulators who share that belief have effectively blocked a free Facebook service.
93 | ## ]]
94 | ## becomes =>:
95 | ## feed.items[0].description: In the United States, the social media giant has been an advocate of equal treatment of all Internet content. In India, regulators who share that belief have effectively blocked a free Facebook service.
96 | ##
97 |
98 | ##
99 | ## use [[> (instead of just [[) to mark string as to preserve newlines
100 | ## or [[| |]] (two brackets with pipe??) or [[[ ]]] (three brackets) - why? why not?
101 | ## or use python style """ and """" - why? why not?
102 |
103 |
104 | #######
105 | ## note: preserve blank lines in multi-line "verbatim" items
106 | ##
107 |
108 | lines_ii = []
109 | buf = ''
110 | inside_txt = false
111 |
112 | lines.each do |line|
113 |
114 | if inside_txt == false
115 |
116 | if line =~ /#{TXT_BEGIN}/
117 | s = StringScanner.new( line )
118 | expr = s.scan_until( /(?=#{TXT_BEGIN})/ )
119 | _ = s.scan( /#{TXT_BEGIN}/ )
120 | value = s.rest
121 |
122 | buf = '' # reset
123 | buf << expr.strip # add expresion before TXT_BEGIN
124 |
125 | if value.nil? || value.strip.empty?
126 | # add nothing ;-)
127 | else
128 | buf << ' '
129 | buf << value.strip
130 | end
131 | inside_txt = true
132 | else
133 | if line =~ /^[ \t]*$/
134 | next ## skip blank lines (NOT in "verbatim" multi-line string blocks)
135 | end
136 |
137 | lines_ii << line # copy as is 1:1
138 | end
139 | else ## inside_txt == true
140 | if line =~ /#{TXT_END}/
141 | s = StringScanner.new( line )
142 | value = s.scan_until( /(?=#{TXT_END})/ )
143 | _ = s.scan( /#{TXT_END}/ )
144 | _ = s.rest
145 |
146 | if value.strip.empty?
147 | # add nothing ;-)
148 | else
149 | buf << ' '
150 | buf << value.strip
151 | end
152 | lines_ii << buf ## add "folded" line
153 | inside_txt = false
154 | else
155 | if line.strip.empty?
156 | ## empty lines get skipped for now => add support for mode with preserved newlines why? why not???
157 | else
158 | buf << " " ## note: newline converter to just one space
159 | buf << line.strip
160 | end
161 | end
162 | end
163 | end # each lines
164 |
165 |
166 |
167 | #########################################
168 | ## pass 3: eval asserts, finally ;-)
169 |
170 | lines_ii.each do |line|
171 |
172 | if line.start_with? '>>>'
173 | ## for debugging allow "custom" code e.g. >>> pp feed.items[0].summary etc.
174 | code = line[3..-1].strip
175 | msg = "eval in #{name}: >>> #{code}"
176 | else
177 | pos = line.index(':') ## assume first colon (:) is separator
178 | expr = line[0...pos].strip ## NOTE: do NOT include colon (thus, use tree dots ...)
179 | value = line[pos+1..-1].strip
180 |
181 | ## for ruby code use |> or >> or >>> or => or $ or | or RUN or ????
182 | ## otherwise assume "literal" string
183 |
184 | if value.start_with? '>>>'
185 | value = value[3..-1].strip
186 | msg = "assert in #{name}: >>> #{expr} == #{value}"
187 |
188 | if value == 'nil'
189 | code = "assert_nil #{expr}, %{#{msg}}" ## note: use assert_nil for nils
190 | else
191 | code = "assert_equal #{value}, #{expr}, %{#{msg}}"
192 | end
193 | else # assume value is a "plain" string
194 | ## note use %{ } so value can include quotes ('') etc.
195 | msg = %{assert in #{name}: #{expr} == "#{value}"}
196 | code = "assert_equal %{#{value}}, #{expr}, %{#{msg}}"
197 | end
198 | end
199 |
200 | puts msg
201 | eval( code )
202 | end # each line
203 | end
204 |
205 | end
206 | end # module MiniTest
207 |
--------------------------------------------------------------------------------
/feeds/test/test_feeds.rb:
--------------------------------------------------------------------------------
1 | # encoding: utf-8
2 |
3 | ###
4 | # to run use
5 | # ruby -I ./test test/test_feeds.rb
6 | # or better
7 | # rake test
8 |
9 | require 'helper'
10 |
11 |
12 | class TestFeeds < MiniTest::Test
13 |
14 | def test_all
15 | walk_feeds( '.' )
16 |
17 | ## parse_feeds( './news/guardian*' )
18 | ## parse_feeds( './news/nytimes-blogs*' )
19 | end # method test_all
20 |
21 |
22 |
23 | private
24 |
25 | def walk_feeds( root='.' )
26 | walk( root ) do |path|
27 |
28 | ## note: skip README, Rakefile etc.
29 | ## check for extensions
30 | extname = File.extname( path ) # note: includes dot e.g. .json etc.
31 | next unless ['.json', '.html', '.xml', '.rss', '.rss2', '.atom'].include?( extname )
32 |
33 | parse_feed( path )
34 | end
35 | end # walk_feeds
36 |
37 |
38 | def parse_feeds( pattern )
39 | files = Dir.glob( pattern )
40 | files.each do |path|
41 | puts " #{path}"
42 | parse_feed( path )
43 | end
44 | end
45 |
46 |
47 | def parse_feed( path )
48 | puts " reading #{path} ..."
49 |
50 | b = BlockReader.from_file( path ).read
51 |
52 | ## puts " [debug] block.size: #{b.size}"
53 | text = b[0] ## block I: feed source text (xml, json, html, etc.)
54 | tests = b[1] ## block II: test assert source
55 |
56 | if tests.nil?
57 | puts "!!!! test asserts missing in #{path} !!!"
58 | ## exit 1
59 | else
60 | assert_feed( text, tests, name: path )
61 | end
62 | end
63 |
64 | end # class TestFeeds
65 |
--------------------------------------------------------------------------------
/feedtxt.specs/README.md:
--------------------------------------------------------------------------------
1 |
2 | {% include header.html %}
3 |
4 |
7 |
8 | # Feed.TXT - A Free Feeds Format in Plain Text w/ Structured Meta Data
9 |
10 |
11 | What's Feed.TXT? Let's start with an example from the JSON Feed spec:
12 |
13 | ```json
14 | {
15 | "version": "https://jsonfeed.org/version/1",
16 | "title": "My Example Feed",
17 | "home_page_url": "https://example.org/",
18 | "feed_url": "https://example.org/feed.json",
19 | "items": [
20 | {
21 | "id": "2",
22 | "content_text": "This is a second item.",
23 | "url": "https://example.org/second-item"
24 | },
25 | {
26 | "id": "1",
27 | "content_html": "
Hello, world!
",
28 | "url": "https://example.org/initial-post"
29 | }
30 | ]
31 | }
32 | ```
33 |
34 | Simple, isn't it? Let's try just text:
35 |
36 | ```
37 | |>>>
38 | title: My Example Feed
39 | home_page_url: https://example.org/
40 | feed_url: https://example.org/feed.txt
41 | >
42 | id: 2
43 | url: https://example.org/second-item
44 | ---
45 | This is a second item.
46 | >
47 | id: 1
48 | url: https://example.org/initial-post
49 | ---
50 | Hello, world!
51 | <<<|
52 | ```
53 |
54 | Are you serious, really? Let's try another example from the JSON Feed spec:
55 |
56 | ```json
57 | {
58 | "version": "https://jsonfeed.org/version/1",
59 | "user_comment": "This is a podcast feed. You can add this feed to your podcast client using the following URL: http://therecord.co/feed.json",
60 | "title": "The Record",
61 | "home_page_url": "http://therecord.co/",
62 | "feed_url": "http://therecord.co/feed.json",
63 | "items": [
64 | {
65 | "id": "http://therecord.co/chris-parrish",
66 | "title": "Special #1 - Chris Parrish",
67 | "url": "http://therecord.co/chris-parrish",
68 | "content_text": "Chris has worked at Adobe and as a founder of Rogue Sheep, which won an Apple Design Award for Postage. Chris’s new company is Aged & Distilled with Guy English — which shipped Napkin, a Mac app for visual collaboration. Chris is also the co-host of The Record. He lives on Bainbridge Island, a quick ferry ride from Seattle.",
69 | "content_html": "Chris has worked at Adobe and as a founder of Rogue Sheep, which won an Apple Design Award for Postage. Chris’s new company is Aged & Distilled with Guy English — which shipped Napkin, a Mac app for visual collaboration. Chris is also the co-host of The Record. He lives on Bainbridge Island, a quick ferry ride from Seattle.",
70 | "summary": "Brent interviews Chris Parrish, co-host of The Record and one-half of Aged & Distilled.",
71 | "date_published": "2014-05-09T14:04:00-07:00",
72 | "attachments": [
73 | {
74 | "url": "http://therecord.co/downloads/The-Record-sp1e1-ChrisParrish.m4a",
75 | "mime_type": "audio/x-m4a",
76 | "size_in_bytes": 89970236,
77 | "duration_in_seconds": 6629
78 | }
79 | ]
80 | }
81 | ]
82 | }
83 | ```
84 |
85 | Yes, the world's 1st podcasting feed in plain text ;-) Let's try:
86 |
87 | ```
88 | |>>>
89 | comment: This is a podcast feed. You can add this feed to your podcast client using the following URL: http://therecord.co/feed.json
90 | title: The Record
91 | home_page_url: http://therecord.co/
92 | feed_url: http://therecord.co/feed.txt
93 | >
94 | id: http://therecord.co/chris-parrish
95 | title: Special #1 - Chris Parrish
96 | url: http://therecord.co/chris-parrish
97 | summary: Brent interviews Chris Parrish, co-host of The Record and one-half of Aged & Distilled.
98 | published: 2014-05-09T14:04:00-07:00
99 | attachments:
100 | - url: http://therecord.co/downloads/The-Record-sp1e1-ChrisParrish.m4a
101 | mime_type: audio/x-m4a
102 | size_in_bytes: 89970236
103 | duration_in_seconds: 6629
104 | ---
105 | Chris has worked at [Adobe][1] and as a founder of Rogue Sheep, which won an Apple Design Award for Postage.
106 | Chris's new company is Aged & Distilled with Guy English — which shipped [Napkin](2),
107 | a Mac app for visual collaboration. Chris is also the co-host of The Record.
108 | He lives on [Bainbridge Island][3], a quick ferry ride from Seattle.
109 |
110 | [1]: http://adobe.com/
111 | [2]: http://aged-and-distilled.com/napkin/
112 | [3]: http://www.ci.bainbridge-isl.wa.us/
113 | <<<|
114 | ```
115 |
116 |
117 | ## Spec(ification) - How does it work?
118 |
119 | A Feed.txt starts with a meta data block for the feed in YAML format
120 | followed by a list of items. Items start with a meta data block followed by the text
121 | using the markdown formatting conventions for structured text (headings, lists, tables, etc.) and
122 | hyperlinks. That's it.
123 |
124 |
125 | ### Dividers - Begin / Next / End
126 |
127 | Use `|>>>` to begin a Feed.txt feed. Note you use three or more `>>>` open brackets e.g.
128 | `|>>>>>>>>>>>>` also works.
129 |
130 | Use `<<<|` to end a Feed.txt feed. Again note you can use three or more `<<<` closing brackets e.g.
131 | `<<<<<<<|` also works.
132 |
133 | Use `>` to break up items. That's it.
134 |
135 |
136 |
137 |
138 | ## Use JSON / JSON5 / HJSON / SON for Strucutured Meta Data - |{ }|
139 |
140 | As an alternative you can use human JSON for meta data blocks. Let's try:
141 |
142 | ```
143 | |{
144 | title: "My Example Feed"
145 | home_page_url: "https://example.org/"
146 | feed_url: "https://example.org/feed.txt"
147 | }/{
148 | id: "2"
149 | url: "https://example.org/second-item"
150 | }
151 | This is a second item.
152 | }/{
153 | id: "1"
154 | url: "https://example.org/initial-post"
155 | }
156 | Hello, world!
157 | }|
158 | ```
159 |
160 | Are you joking? Don't, like the more human JSON style. Let's retry in "classic" JSON:
161 |
162 | ```
163 | |{
164 | "title": "My Example Feed",
165 | "home_page_url": "https://example.org/",
166 | "feed_url": "https://example.org/feed.txt"
167 | }/{
168 | "id": "2",
169 | "url": "https://example.org/second-item"
170 | }
171 | This is a second item.
172 | }/{
173 | "id": "1",
174 | "url": "https://example.org/initial-post"
175 | }
176 | Hello, world!
177 | }|
178 | ```
179 |
180 | ### Dividers - Begin / Next / End (JSON Edition)
181 |
182 | Change `|>>>` to `|{` to begin a Feed.txt feed. Note you use one or more `{` open curly brackets e.g. `|{%raw%}{{{{{%endraw%}` also works.
183 |
184 | Change `<<<|` to `}|` to end a Feed.txt feed. Again note you can use one or more `}` closing brackets e.g. `{%raw%}}}}}{%endraw%}|` also works.
185 |
186 | Change `>` to `}/{` to break up items. That's it.
187 |
188 |
189 | Sorry, there's no XML alternative ;-)
190 |
191 |
192 | ## License
193 |
194 | The Feed.TXT format and conventions are dedicated to the public domain.
195 | Use it as you please with no restrictions whatsoever.
196 |
197 | ## Questions? Comments?
198 |
199 | Send them along to the [wwwmake mailing list/forum](http://groups.google.com/group/wwwmake). Thanks.
200 |
201 |
202 |
203 |
204 | Brought to you by [Manuscripts](https://github.com/manuscripts) and friends. You might also like [Bib.TXT](http://bibtxt.github.io) ;-).
205 |
206 |
207 |
208 |
209 |
--------------------------------------------------------------------------------
/feedtxt.specs/_includes/header.html:
--------------------------------------------------------------------------------
1 |
In which I extoll the virtues of using microformats.
22 |
23 |
24 |
Blah blah blah
25 |
26 |
27 | ```
28 |
29 | Let's try to make it simpler and easier. Why in 2017 still (re)use `class` for microformats / microdata?
30 | Let's use `o` for object types / structs / scopes and `x` for (object) props / property keys:
31 |
32 | ``` html
33 |
34 |
In which I extoll the virtues of using microformats.
39 |
40 |
41 |
Blah blah blah
42 |
43 |
44 | ```
45 |
46 | Why `o` and `x`? and not let's say `p` and `q`? The idea is to use letters that are not already used in single-letter tags
47 | and that are easy to remember - think: tic-tac-toe-like ;-)
48 |
49 |
50 | Parsed to JSON resulting in:
51 |
52 | ``` json
53 | {
54 | "title": "Microformats are amazing",
55 | "author": "W. Developer",
56 | "card": { "name": "W. Developer",
57 | "url": "http://example.com"
58 | },
59 | "published": "2013-06-13 12:00:00",
60 | "summary": "In which I extoll the virtues of using microformats.",
61 | "content": "
Blah blah blah
"
62 | }
63 |
64 | ```
65 |
66 | ### Shortcuts / Alternatives
67 |
68 | #### Use hfeed / hitem / hcard
69 |
70 | As an alternative you can use `hfeed` or `feed` (for `o=feed`), `hitem` or `item` (for `o=item`),
71 | `hcard` or `item` (for `o=card`) shortcuts. Let's (re)try:
72 |
73 | ``` html
74 |
75 |
In which I extoll the virtues of using microformats.
80 |
81 |
82 |
Blah blah blah
83 |
84 |
85 | ```
86 |
87 |
88 | #### Use "predefined" convention over configuration structures
89 |
90 | As an alternative you can use the "recommend" predefined convention over configuration
91 | structure. Let's (re)try:
92 |
93 | ``` html
94 |
95 |