pluto 0.8.5 → 0.8.6

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -197,6 +197,15 @@ For more samples, see [`nytimes.yml`](https://github.com/feedreader/pluto.sample
197
197
  [`beer.yml`](https://github.com/feedreader/pluto.samples/blob/master/beer.yml),
198
198
  [`football.yml`](https://github.com/feedreader/pluto.samples/blob/master/football.yml).
199
199
 
200
+
201
+ ## Template Packs
202
+
203
+ - Blank - default templates; [more »](https://github.com/feedreader/pluto.blank)
204
+ - News - 'river of news' style templates; [more »](https://github.com/feedreader/pluto.news)
205
+ - Top - Popurl-style templates; [more »](https://github.com/feedreader/pluto.top)
206
+ - Classic - Planet Planet-Style templates; [more »](https://github.com/feedreader/pluto.classic)
207
+
208
+
200
209
  ## Install
201
210
 
202
211
  Just install the gem:
@@ -222,7 +231,7 @@ Planet Mars by Sam Ruby [(Site)](https://github.com/rubys/mars) - first draft o
222
231
 
223
232
  ### Python
224
233
 
225
- Planet Planet by Scott James Remnant n Jeff Waugh [(Site)](http://www.planetplanet.org) - uses Mark Pilgrim's universal feed parser (RDF, RSS and Atom) and Tomas Styblo's templating engine; last release version 2.0 in 2006
234
+ Planet Planet by Scott James Remnant ann Jeff Waugh [(Site)](http://www.planetplanet.org) - uses Mark Pilgrim's universal feed parser (RDF, RSS and Atom) and Tomas Styblo's templating engine; last release version 2.0 in 2006
226
235
 
227
236
  Planet Venus by Sam Ruby [(Site)](https://github.com/rubys/venus) - cleaned up Planet Planet code; last change in 2010
228
237
 
data/lib/pluto/fetcher.rb CHANGED
@@ -13,14 +13,48 @@ class Fetcher
13
13
  def debug?() @debug || false; end
14
14
 
15
15
 
16
+ def fetch_feed( url )
17
+ response = @worker.get( url )
18
+
19
+ if debug?
20
+ puts "http status #{response.code} #{response.message}"
21
+
22
+ puts "http header - etag: #{response.header['etag']} - #{response.header['etag'].class.name}"
23
+ puts "http header - last-modified: #{response.header['last-modified']} - #{response.header['last-modified'].class.name}"
24
+ end
25
+
26
+ xml = response.body
27
+
28
+ ###
29
+ # NB: Net::HTTP will NOT set encoding UTF-8 etc.
30
+ # will mostly be ASCII
31
+ # - try to change encoding to UTF-8 ourselves
32
+ logger.debug "xml.encoding.name (before): #{xml.encoding.name}"
33
+
34
+ #####
35
+ # NB: ASCII-8BIT == BINARY == Encoding Unknown; Raw Bytes Here
36
+
37
+ ## NB:
38
+ # for now "hardcoded" to utf8 - what else can we do?
39
+ # - note: force_encoding will NOT change the chars only change the assumed encoding w/o translation
40
+ xml = xml.force_encoding( Encoding::UTF_8 )
41
+ logger.debug "xml.encoding.name (after): #{xml.encoding.name}"
42
+
43
+ xml
44
+ end
45
+
46
+
16
47
  def feed_by_rec( feed_rec )
48
+ # simple feed fetcher; use for debugging (only/mostly)
49
+ # -- will NOT change db records in any way
50
+
17
51
  feed_url = feed_rec.feed_url
18
52
  feed_key = feed_rec.key
19
-
53
+
20
54
  feed_xml = fetch_feed( feed_url )
21
55
 
22
56
  logger.debug "feed_xml:"
23
- logger.debug feed_xml[ 0..300 ] # get first 300 chars
57
+ logger.debug feed_xml[ 0..500 ] # get first 500 chars
24
58
 
25
59
  # if opts.verbose? # also write a copy to disk
26
60
  if debug?
@@ -41,16 +75,43 @@ class Fetcher
41
75
  end
42
76
 
43
77
 
44
- def fetch_feed( url )
45
- ### fix: use worker.get( url ) # check http response code etc.
78
+ def feed_by_rec_if_modified( feed_rec ) # try smart http update; will update db records
79
+ feed_url = feed_rec.feed_url
80
+ feed_key = feed_rec.key
81
+
82
+ ### todo/fix:
83
+ ## add if available http_etag machinery for smarter updates
84
+ ## and http_last_modified headers
85
+ ## and brute force body_old == body_new etc.
86
+
87
+ response = @worker.get( feed_url )
88
+
89
+ feed_fetched = Time.now
90
+
91
+ if response.code != '200' # note Net::HTTP response.code is a string in ruby
92
+
93
+ puts "*** error: fetching feed '#{feed_key}' - HTTP status #{response.code} #{response.message}"
94
+
95
+ feed_attribs = {
96
+ http_code: response.code.to_i,
97
+ http_etag: nil,
98
+ http_last_modified: nil,
99
+ body: nil,
100
+ fetched: feed_fetched
101
+ }
102
+ feed_rec.update_attributes!( feed_attribs )
103
+ return nil # sorry; no feed for parsing available
104
+ end
105
+
46
106
 
47
- xml = @worker.read( url )
107
+ puts "OK - fetching feed '#{feed_key}' - HTTP status #{response.code} #{response.message}"
48
108
 
109
+ feed_xml = response.body
49
110
  ###
50
111
  # NB: Net::HTTP will NOT set encoding UTF-8 etc.
51
112
  # will mostly be ASCII
52
113
  # - try to change encoding to UTF-8 ourselves
53
- logger.debug "xml.encoding.name (before): #{xml.encoding.name}"
114
+ logger.debug "feed_xml.encoding.name (before): #{feed_xml.encoding.name}"
54
115
 
55
116
  #####
56
117
  # NB: ASCII-8BIT == BINARY == Encoding Unknown; Raw Bytes Here
@@ -58,10 +119,35 @@ class Fetcher
58
119
  ## NB:
59
120
  # for now "hardcoded" to utf8 - what else can we do?
60
121
  # - note: force_encoding will NOT change the chars only change the assumed encoding w/o translation
61
- xml = xml.force_encoding( Encoding::UTF_8 )
62
- logger.debug "xml.encoding.name (after): #{xml.encoding.name}"
122
+ feed_xml = feed_xml.force_encoding( Encoding::UTF_8 )
123
+ logger.debug "feed_xml.encoding.name (after): #{feed_xml.encoding.name}"
124
+
125
+ feed_attribs = {
126
+ http_code: response.code.to_i,
127
+ http_etag: response.header[ 'etag' ],
128
+ http_last_modified: response.header[ 'last-modified' ],
129
+ body: feed_xml,
130
+ fetched: feed_fetched
131
+ }
132
+
133
+ if debug?
134
+ puts "http header - etag: #{response.header['etag']} - #{response.header['etag'].class.name}"
135
+ puts "http header - last-modified: #{response.header['last-modified']} - #{response.header['last-modified'].class.name}"
136
+ end
63
137
 
64
- xml
138
+ feed_rec.update_attributes!( feed_attribs )
139
+
140
+ logger.debug "feed_xml:"
141
+ logger.debug feed_xml[ 0..300 ] # get first 300 chars
142
+
143
+ puts "Before parsing feed >#{feed_key}<..."
144
+
145
+ ### move to feedutils
146
+ ### logger.debug "using stdlib RSS::VERSION #{RSS::VERSION}"
147
+
148
+ ## fix/todo: check for feed.nil? -> error parsing!!!
149
+ # or throw exception
150
+ feed = FeedUtils::Parser.parse( feed_xml )
65
151
  end
66
152
 
67
153
  end # class Fetcher
@@ -15,9 +15,9 @@ class Feed < ActiveRecord::Base
15
15
  # note: order by first non-null datetime field
16
16
  # coalesce - supported by sqlite (yes), postgres (yes)
17
17
 
18
- # note: if not published_at,touched_at or built_at use hardcoded 1911-01-01 for now
19
- ## order( "coalesce(published_at,touched_at,built_at,'1911-01-01') desc" )
20
- order( "coalesce(latest_published_at,'1911-01-01') desc" )
18
+ # note: if not published, touched or built use hardcoded 1971-01-01 for now
19
+ ## order( "coalesce(published,touched,built,'1971-01-01') desc" )
20
+ order( "coalesce(last_published,'1971-01-01') desc" )
21
21
  end
22
22
 
23
23
  ##################################
@@ -27,6 +27,12 @@ class Feed < ActiveRecord::Base
27
27
  def link() url; end # alias for url
28
28
  def feed() feed_url; end # alias for feed_url
29
29
 
30
+ def last_published_at() last_published; end # legay attrib reader - depreciated - remove!!
31
+ def fetched_at() fetched; end # legay attrib reader - depreciated - remove!!
32
+ def published_at() published; end # legay attrib reader - depreciated - remove!!
33
+ def touched_at() touched; end # legay attrib reader - depreciated - remove!!
34
+ def built_at() built; end # legay attrib reader - depreciated - remove!!
35
+
30
36
 
31
37
  def url?() read_attribute(:url).present?; end
32
38
  def title?() read_attribute(:title).present?; end
@@ -39,20 +45,74 @@ class Feed < ActiveRecord::Base
39
45
  def feed_url() read_attribute_w_fallbacks( :feed_url, :auto_feed_url ); end
40
46
 
41
47
 
42
- def published_at?() read_attribute(:published_at).present?; end
43
- def touched_at?() read_attribute(:touched_at).present?; end
48
+ def published?() read_attribute(:published).present?; end
49
+ def touched?() read_attribute(:touched).present?; end
50
+
44
51
 
45
- def published_at
52
+ def published
46
53
  ## todo/fix: use a new name - do NOT squeeze convenience lookup into existing
47
54
  # db backed attribute
48
55
 
49
56
  read_attribute_w_fallbacks(
50
- :published_at, # try touched_at (aka updated (ATOM))
51
- :touched_at, # try build_at (aka lastBuildDate (RSS))
52
- :built_at
57
+ :published,
58
+ :touched, # try touched (aka updated (ATOM))
59
+ :built # try build (aka lastBuildDate (RSS))
53
60
  )
54
61
  end
55
62
 
63
+
64
+ def debug=(value) @debug = value; end
65
+ def debug?() @debug || false; end
66
+
67
+ def save_from_struct!( data )
68
+
69
+ update_from_struct!( data )
70
+
71
+ data.items.each do |item|
72
+
73
+ item_rec = Item.find_by_guid( item.guid )
74
+ if item_rec.nil?
75
+ item_rec = Item.new
76
+ puts "** NEW | #{item.title}"
77
+ else
78
+ ## todo: check if any attribs changed
79
+ puts "UPDATE | #{item.title}"
80
+ end
81
+
82
+ item_rec.debug = debug? ? true : false # pass along debug flag
83
+ item_rec.update_from_struct!( self, item )
84
+
85
+ end # each item
86
+ end
87
+
88
+
89
+ def update_from_struct!( data )
90
+ feed_attribs = {
91
+ format: data.format,
92
+ published: data.published? ? data.published : nil,
93
+ touched: data.updated? ? data.updated : nil,
94
+ built: data.built? ? data.built : nil,
95
+ summary: data.summary? ? data.summary : nil,
96
+ ### todo/fix: add/use
97
+ # auto_title: ???,
98
+ # auto_url: ???,
99
+ # auto_feed_url: ???,
100
+ auto_title2: data.title2? ? data.title2 : nil,
101
+ generator: data.generator
102
+ }
103
+
104
+ if debug?
105
+ ## puts "*** dump feed_attribs:"
106
+ ## pp feed_attribs
107
+ puts "*** dump feed_attribs w/ class types:"
108
+ feed_attribs.each do |key,value|
109
+ puts " #{key}: >#{value}< : #{value.class.name}"
110
+ end
111
+ end
112
+
113
+ update_attributes!( feed_attribs )
114
+ end
115
+
56
116
  end # class Feed
57
117
 
58
118
 
@@ -14,27 +14,63 @@ class Item < ActiveRecord::Base
14
14
  def description() summary; end # alias for summary -- also add descr shortcut??
15
15
  def link() url; end # alias for url
16
16
 
17
+ def fetched_at() fetched; end # legay attrib reader - depreciated - remove!!
18
+ def published_at() published; end # legay attrib reader - depreciated - remove!!
19
+ def touched_at() touched; end # legay attrib reader - depreciated - remove!!
20
+
17
21
 
18
22
  def self.latest
19
23
  # note: order by first non-null datetime field
20
24
  # coalesce - supported by sqlite (yes), postgres (yes)
21
25
 
22
- # note: if not published_at,touched_at or built_at use hardcoded 1911-01-01 for now
23
- order( "coalesce(published_at,touched_at,'1911-01-01') desc" )
26
+ # note: if not published,touched or built_at use hardcoded 1971-01-01 for now
27
+ order( "coalesce(published,touched,'1971-01-01') desc" )
24
28
  end
25
29
 
26
- def published_at?() read_attribute(:published_at).present?; end
30
+ def published?() read_attribute(:published).present?; end
27
31
 
28
- def published_at
32
+ def published
29
33
  ## todo/fix: use a new name - do NOT squeeze convenience lookup into existing
30
34
  # db backed attribute
31
35
 
32
36
  read_attribute_w_fallbacks(
33
- :published_at,
34
- :touched_at # try touched_at (aka updated)
37
+ :published,
38
+ :touched # try touched (aka updated RSS/ATOM)
35
39
  )
36
40
  end
37
41
 
42
+
43
+
44
+ def debug=(value) @debug = value; end
45
+ def debug?() @debug || false; end
46
+
47
+ def update_from_struct!( feed_rec, data )
48
+ ## check: new item/record? not saved? add guid
49
+ # otherwise do not add guid - why? why not?
50
+
51
+ item_attribs = {
52
+ guid: data.guid, # todo: only add for new records???
53
+ title: data.title,
54
+ url: data.url,
55
+ summary: data.summary? ? data.summary : nil,
56
+ content: data.content? ? data.content : nil,
57
+ published: data.published? ? data.published : nil,
58
+ touched: data.updated? ? data.updated : nil,
59
+ feed_id: feed_rec.id, # add feed_id fk_ref
60
+ fetched: feed_rec.fetched
61
+ }
62
+
63
+ if debug?
64
+ puts "*** dump item_attribs w/ class types:"
65
+ item_attribs.each do |key,value|
66
+ next if [:summary,:content].include?( key ) # skip summary n content
67
+ puts " #{key}: >#{value}< : #{value.class.name}"
68
+ end
69
+ end
70
+
71
+ update_attributes!( item_attribs )
72
+ end
73
+
38
74
  end # class Item
39
75
 
40
76
 
@@ -11,6 +11,7 @@ class Site < ActiveRecord::Base
11
11
  ##################################
12
12
  # attribute reader aliases
13
13
  def name() title; end # alias for title
14
+ def fetched_at() fetched; end # - legacy attrib reader -- remove!!!
14
15
 
15
16
  end
16
17
 
@@ -8,16 +8,16 @@ class ItemCursor
8
8
  end
9
9
 
10
10
  def each
11
- last_published_at = Time.local( 1911, 1, 1 )
11
+ last_published = Time.local( 1971, 1, 1 )
12
12
  last_feed_id = -1 ## todo: use feed_key instead of id?? why? why not??
13
13
 
14
14
  @items.each do |item|
15
15
 
16
- item_published_at = item.published_at # cache published_at value ref
16
+ item_published = item.published # cache published value ref
17
17
 
18
- if last_published_at.year == item_published_at.year &&
19
- last_published_at.month == item_published_at.month &&
20
- last_published_at.day == item_published_at.day
18
+ if last_published.year == item_published.year &&
19
+ last_published.month == item_published.month &&
20
+ last_published.day == item_published.day
21
21
  new_date = false
22
22
  else
23
23
  new_date = true
@@ -31,8 +31,8 @@ class ItemCursor
31
31
 
32
32
  yield( item, new_date, new_feed )
33
33
 
34
- last_published_at = item.published_at
35
- last_feed_id = item.feed.id
34
+ last_published = item.published
35
+ last_feed_id = item.feed.id
36
36
  end
37
37
  end # method each
38
38
 
@@ -25,18 +25,23 @@ class Refresher
25
25
  Action.create!( title: 'update feeds' )
26
26
 
27
27
  #####
28
- # -- update fetched_at timestamps for all sites
29
- feeds_fetched_at = Time.now
28
+ # -- update fetched timestamps for all sites
29
+ feeds_fetched = Time.now
30
30
  Site.all.each do |site|
31
- site.fetched_at = feeds_fetched_at
31
+ site.fetched = feeds_fetched
32
32
  site.save!
33
33
  end
34
34
 
35
35
  Feed.all.each do |feed_rec|
36
36
 
37
- feed = @worker.feed_by_rec( feed_rec )
37
+ feed = @worker.feed_by_rec_if_modified( feed_rec )
38
+
39
+ # on error or if http-not modified etc. skip update/processing
40
+ next if feed.nil?
38
41
 
39
- feed_fetched_at = Time.now
42
+ ## fix/todo: reload feed_red - fetched date updated etc.
43
+ ## check if needed for access to fetched date
44
+
40
45
 
41
46
  ## todo/check: move feed_rec update to the end (after item updates??)
42
47
 
@@ -51,79 +56,21 @@ class Refresher
51
56
  #
52
57
  # move to_datetime to feedutils!! if it works
53
58
  ## todo: move this comments to feedutils??
54
-
55
-
56
- feed_attribs = {
57
- fetched_at: feed_fetched_at,
58
- format: feed.format,
59
- published_at: feed.published? ? feed.published : nil,
60
- touched_at: feed.updated? ? feed.updated : nil,
61
- built_at: feed.built? ? feed.built : nil,
62
- summary: feed.summary? ? feed.summary : nil,
63
- ### todo/fix: add/use
64
- # auto_title: ???,
65
- # auto_url: ???,
66
- # auto_feed_url: ???,
67
- auto_title2: feed.title2? ? feed.title2 : nil,
68
- generator: feed.generator
69
- }
70
-
71
- if debug?
72
- ## puts "*** dump feed_attribs:"
73
- ## pp feed_attribs
74
- puts "*** dump feed_attribs w/ class types:"
75
- feed_attribs.each do |key,value|
76
- puts " #{key}: >#{value}< : #{value.class.name}"
77
- end
78
- end
79
-
80
- feed_rec.update_attributes!( feed_attribs )
81
59
 
82
60
 
83
- feed.items.each do |item|
84
-
85
- item_attribs = {
86
- fetched_at: feed_fetched_at,
87
- title: item.title,
88
- url: item.url,
89
- summary: item.summary? ? item.summary : nil,
90
- content: item.content? ? item.content : nil,
91
- published_at: item.published? ? item.published : nil,
92
- touched_at: item.updated? ? item.updated : nil,
93
- feed_id: feed_rec.id # add feed_id fk_ref
94
- }
95
-
96
- if debug?
97
- puts "*** dump item_attribs w/ class types:"
98
- item_attribs.each do |key,value|
99
- next if [:summary,:content].include?( key ) # skip summary n content
100
- puts " #{key}: >#{value}< : #{value.class.name}"
101
- end
102
- end
103
-
104
-
105
- rec = Item.find_by_guid( item.guid )
106
- if rec.nil?
107
- rec = Item.new
108
- item_attribs[ :guid ] = item.guid
109
- puts "** NEW | #{item.title}"
110
- else
111
- ## todo: check if any attribs changed
112
- puts "UPDATE | #{item.title}"
113
- end
61
+ feed_rec.debug = debug? ? true : false # pass along debug flag
62
+ ## fix/todo: pass debug flag as opts - debug: true|false !!!!!!
63
+ feed_rec.save_from_struct!( feed ) # todo: find a better name - why? why not??
114
64
 
115
- rec.update_attributes!( item_attribs )
116
- end # each item
117
65
 
118
- # update cached value latest published_at for item
119
- item_recs = feed_rec.items.latest.limit(1).all
120
- unless item_recs.empty?
121
- if item_recs[0].published_at?
122
- feed_rec.latest_published_at = item_recs[0].published_at
123
- else # try touched_at
124
- feed_rec.latest_published_at = item_recs[0].touched_at
66
+ # update cached value last published for item
67
+ last_item_rec = feed_rec.items.latest.limit(1).first # note limit(1) will return relation/arrar - use first to get first element or nil from ary
68
+ if last_item_rec.present?
69
+ if last_item_rec.published?
70
+ feed_rec.update_attributes!( last_published: last_item_rec.published )
71
+ else # try touched
72
+ feed_rec.update_attributes!( last_published: last_item_rec.touched )
125
73
  end
126
- feed_rec.save!
127
74
  end
128
75
 
129
76
  end # each feed
data/lib/pluto/schema.rb CHANGED
@@ -7,7 +7,7 @@ class CreateDb < ActiveRecord::Migration
7
7
  create_table :sites do |t|
8
8
  t.string :title, :null => false # e.g Planet Ruby, Planet JavaScript, etc.
9
9
  t.string :key, :null => false # e.g. ruby, js, etc.
10
- t.datetime :fetched_at # last fetched/checked date -- make not null ??
10
+ t.datetime :fetched # last fetched/checked date -- make not null ??
11
11
 
12
12
  t.timestamps # created_at, updated_at
13
13
  end
@@ -35,17 +35,30 @@ class CreateDb < ActiveRecord::Migration
35
35
 
36
36
  t.string :generator # feed generator (e.g. wordpress, etc.) from feed
37
37
 
38
- t.datetime :published_at # from feed published(atom)+ pubDate(rss)
39
- t.datetime :built_at # from feed lastBuiltDate(rss)
40
- t.datetime :touched_at # from feed updated(atom)
38
+ t.datetime :published # from feed published(atom)+ pubDate(rss)
39
+ t.datetime :built # from feed lastBuiltDate(rss)
40
+ t.datetime :touched # from feed updated(atom)
41
+
42
+ ############
43
+ # filters
44
+ t.string :includes # regex
45
+ t.string :excludes # regex
46
+ # todo: add generic filter list e.g. t.string :filters (comma,pipe or space separated method names?)
41
47
 
42
48
  # -- our own (meta) fields
43
- t.datetime :latest_published_at # cache latest item published_at
49
+ t.datetime :last_published # cache last (latest) published for items
44
50
 
45
51
  t.string :key, :null => false
46
52
  t.string :format # e.g. atom (1.0), rss 2.0, rss 0.7 etc.
47
- t.string :etag # last etag
48
- t.datetime :fetched_at # last fetched/checked date
53
+
54
+ t.integer :http_code # last http status code e.g. 200,404,etc.
55
+ t.string :http_etag # last http header etag
56
+ t.datetime :http_last_modified # last http header last-modified
57
+
58
+ t.text :body # last http response body (complete feed!)
59
+
60
+ t.datetime :fetched # last fetched/checked date
61
+
49
62
  t.timestamps # created_at, updated_at
50
63
  end
51
64
 
@@ -56,15 +69,15 @@ class CreateDb < ActiveRecord::Migration
56
69
  t.text :summary # e.g. description (rss), summary (atom)
57
70
  t.text :content
58
71
 
59
- t.datetime :published_at # from feed (published) + pubDate(rss)
60
- t.datetime :touched_at # from feed updated (atom)
72
+ t.datetime :published # from feed (published) + pubDate(rss)
73
+ t.datetime :touched # from feed updated (atom)
61
74
 
62
75
  ## todo: add :last_updated_at ?? (NOTE: updated_at already take by auto-timestamps)
63
76
  t.references :feed, :null => false
64
77
 
65
- t.datetime :fetched_at # last fetched/check date
78
+ t.datetime :fetched # last fetched/check date
66
79
  t.timestamps # created_at, updated_at
67
-
80
+
68
81
  ## t.string :author
69
82
  ## todo: add author/authors, category/categories
70
83
  end
@@ -54,12 +54,16 @@ class Subscriber
54
54
  feed_key = key.to_s.dup
55
55
  feed_hash = value
56
56
 
57
- # todo: use title from feed?
57
+ # todo/fix: use title from feed?
58
+ # e.g. fill up auto_title, auto_url, etc.
59
+
58
60
  feed_attribs = {
59
61
  feed_url: feed_hash[ 'feed' ] || feed_hash[ 'feed_url' ],
60
62
  url: feed_hash[ 'link' ] || feed_hash[ 'url' ],
61
63
  title: feed_hash[ 'title' ] || feed_hash[ 'name' ],
62
- title2: feed_hash[ 'title2' ]
64
+ title2: feed_hash[ 'title2' ],
65
+ includes: feed_hash[ 'includes' ] || feed_hash[ 'include' ],
66
+ excludes: feed_hash[ 'excludes' ] || feed_hash[ 'exclude' ]
63
67
  }
64
68
 
65
69
  puts "Updating feed subscription >#{feed_key}< - >#{feed_attribs[:feed_url]}<..."
@@ -5,16 +5,16 @@ module Pluto
5
5
 
6
6
  module TemplateHelper
7
7
 
8
- def strip_tags( hy )
8
+ def strip_tags( ht )
9
9
  ### tobe done
10
10
  ## strip markup tags; return plain text
11
- hy.gsub( /<[^>]+>/, '' )
11
+ ht.gsub( /<[^>]+>/, '' )
12
12
  end
13
13
 
14
14
 
15
- def whitelist( hy, tags, opts={} )
15
+ def whitelist( ht, tags, opts={} )
16
16
 
17
- # note: assumes properly escaped <> in hy/hypertext
17
+ # note: assumes properly escaped <> in ht/hypertext
18
18
 
19
19
  ###############################################
20
20
  # step one - save whitelisted tags use ‹tag›
@@ -25,38 +25,38 @@ module TemplateHelper
25
25
 
26
26
  # convert xml-style empty tags to simple html emtpty tags
27
27
  # e.g. <br/> or <br /> becomses <br>
28
- hy = hy.gsub( /<(#{tag})\s*\/>/i ) { |_| "‹#{$1.downcase}›" } # eg. <br /> or <br/> becomes ‹br›
28
+ ht = ht.gsub( /<(#{tag})\s*\/>/i ) { |_| "‹#{$1.downcase}›" } # eg. <br /> or <br/> becomes ‹br›
29
29
 
30
30
  # make sure we won't swall <br> for <b> for example, thus use \s+ before [^>]
31
- hy = hy.gsub( /<(#{tag})(\s+[^>]*)?>/i ) { |_| "‹#{$1.downcase}›" } # opening tag <p>
32
- hy = hy.gsub( /<\/(#{tag})\s*>/i ) { |_| "‹/#{$1.downcase}›" } # closing tag e.g. </p>
31
+ ht = ht.gsub( /<(#{tag})(\s+[^>]*)?>/i ) { |_| "‹#{$1.downcase}›" } # opening tag <p>
32
+ ht = ht.gsub( /<\/(#{tag})\s*>/i ) { |_| "‹/#{$1.downcase}›" } # closing tag e.g. </p>
33
33
  end
34
34
 
35
35
  ############################
36
36
  # step two - clean tags
37
37
 
38
38
  # strip images - special treatment for debugging
39
- hy = hy.gsub( /<img[^>]*>/i, '♦' ) # for debugging use black diamond e.g. ♦
40
- hy = hy.gsub( /<\/img>/i, '' ) # should not exists
39
+ ht = ht.gsub( /<img[^>]*>/i, '♦' ) # for debugging use black diamond e.g. ♦
40
+ ht = ht.gsub( /<\/img>/i, '' ) # should not exists
41
41
 
42
42
  # strip all remaining tags
43
- hy = hy.gsub( /<[^>]+>/, '' )
43
+ ht = ht.gsub( /<[^>]+>/, '' )
44
44
 
45
- pp hy # fix: debugging indo - remove
45
+ pp ht # fix: debugging indo - remove
46
46
 
47
47
  ############################################
48
48
  # step three - restore whitelisted tags
49
49
 
50
- return hy if opts[:skip_restore].present? # skip step 3 for debugging
50
+ return ht if opts[:skip_restore].present? # skip step 3 for debugging
51
51
 
52
52
  tags.each do |tag|
53
- # hy = hy.gsub( /‹(#{tag})›/, "<\1>" ) # opening tag e.g. <p>
54
- # hy = hy.gsub( /‹\/(#{tag})›/, "<\/\1>" ) # closing tag e.g. </p>
55
- hy = hy.gsub( /‹(#{tag})›/ ) { |_| "<#{$1}>" }
56
- hy = hy.gsub( /‹\/(#{tag})›/ ) { |_| "<\/#{$1}>" } # closing tag e.g. </p>
53
+ # ht = ht.gsub( /‹(#{tag})›/, "<\1>" ) # opening tag e.g. <p>
54
+ # ht = ht.gsub( /‹\/(#{tag})›/, "<\/\1>" ) # closing tag e.g. </p>
55
+ ht = ht.gsub( /‹(#{tag})›/ ) { |_| "<#{$1}>" }
56
+ ht = ht.gsub( /‹\/(#{tag})›/ ) { |_| "<\/#{$1}>" } # closing tag e.g. </p>
57
57
  end
58
58
 
59
- hy
59
+ ht
60
60
  end # method whitelist
61
61
 
62
62
 
@@ -95,37 +95,37 @@ module TemplateHelper
95
95
 
96
96
 
97
97
 
98
- def textify( hy, opts={} ) # hy -> hypertext
98
+ def textify( ht, opts={} ) # ht -> hypertext
99
99
  ## turn into text
100
100
  # todo: add options for
101
101
  # keep links, images, lists (?too), code, codeblocks
102
102
 
103
- hy = whitelist( hy, [:br, :p, :ul, :ol, :li, :pre, :code, :blockquote, :q, :cite], opts )
103
+ ht = whitelist( ht, [:br, :p, :ul, :ol, :li, :pre, :code, :blockquote, :q, :cite], opts )
104
104
 
105
105
  # strip bold
106
- # hy = hy.gsub( /<b[^>]*>/, '**' ) # fix: will also swallow bxxx tags - add b space
107
- # hy = hy.gsub( /<\/b>/, '**' )
106
+ # ht = ht.gsub( /<b[^>]*>/, '**' ) # fix: will also swallow bxxx tags - add b space
107
+ # ht = ht.gsub( /<\/b>/, '**' )
108
108
 
109
109
  # strip em
110
- # hy = hy.gsub( /<em[^>]*>/, '__' )
111
- # hy = hy.gsub( /<\/em>/, '__' )
110
+ # ht = ht.gsub( /<em[^>]*>/, '__' )
111
+ # ht = ht.gsub( /<\/em>/, '__' )
112
112
 
113
113
  # clean (prettify) literal urls (strip protocoll)
114
- hy = hy.gsub( /(http|https):\/\//, '' )
114
+ ht = ht.gsub( /(http|https):\/\//, '' )
115
115
 
116
- # hy = hy.gsub( /&nbsp;/, ' ' )
116
+ # ht = ht.gsub( /&nbsp;/, ' ' )
117
117
 
118
118
  # # try to cleanup whitespaces
119
119
  # # -- keep no more than two spaces
120
- # hy = hy.gsub( /[ \t]{3,}/, ' ' )
120
+ # ht = ht.gsub( /[ \t]{3,}/, ' ' )
121
121
  # # -- keep no more than two new lines
122
- # hy = hy.gsub( /\n{2,}/m, "\n\n" )
122
+ # ht = ht.gsub( /\n{2,}/m, "\n\n" )
123
123
  # # -- remove all trailing spaces
124
- # hy = hy.gsub( /[ \t\n]+$/m, '' )
124
+ # ht = ht.gsub( /[ \t\n]+$/m, '' )
125
125
  # # -- remove all leading spaces
126
- # hy = hy.gsub( /^[ \t\n]+/m, '' )
126
+ # ht = ht.gsub( /^[ \t\n]+/m, '' )
127
127
 
128
- hy
128
+ ht
129
129
  end
130
130
 
131
131
 
data/lib/pluto/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
 
2
2
  module Pluto
3
- VERSION = '0.8.5'
3
+ VERSION = '0.8.6'
4
4
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pluto
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.5
4
+ version: 0.8.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-10-02 00:00:00.000000000 Z
12
+ date: 2013-10-04 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: pakman
16
- requirement: &80642240 !ruby/object:Gem::Requirement
16
+ requirement: &75090920 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0.5'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *80642240
24
+ version_requirements: *75090920
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: fetcher
27
- requirement: &80642000 !ruby/object:Gem::Requirement
27
+ requirement: &75090620 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0.3'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *80642000
35
+ version_requirements: *75090620
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: logutils
38
- requirement: &80641710 !ruby/object:Gem::Requirement
38
+ requirement: &75090350 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0.6'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *80641710
46
+ version_requirements: *75090350
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: feedutils
49
- requirement: &80641470 !ruby/object:Gem::Requirement
49
+ requirement: &75090050 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: 0.3.2
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *80641470
57
+ version_requirements: *75090050
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: props
60
- requirement: &80641170 !ruby/object:Gem::Requirement
60
+ requirement: &75089760 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: 1.0.2
66
66
  type: :runtime
67
67
  prerelease: false
68
- version_requirements: *80641170
68
+ version_requirements: *75089760
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: textutils
71
- requirement: &80640910 !ruby/object:Gem::Requirement
71
+ requirement: &75089460 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: 0.6.8
77
77
  type: :runtime
78
78
  prerelease: false
79
- version_requirements: *80640910
79
+ version_requirements: *75089460
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: gli
82
- requirement: &80640610 !ruby/object:Gem::Requirement
82
+ requirement: &75089160 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ! '>='
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: 2.5.6
88
88
  type: :runtime
89
89
  prerelease: false
90
- version_requirements: *80640610
90
+ version_requirements: *75089160
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: rdoc
93
- requirement: &80640330 !ruby/object:Gem::Requirement
93
+ requirement: &75088910 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ~>
@@ -98,10 +98,10 @@ dependencies:
98
98
  version: '3.10'
99
99
  type: :development
100
100
  prerelease: false
101
- version_requirements: *80640330
101
+ version_requirements: *75088910
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: hoe
104
- requirement: &80640060 !ruby/object:Gem::Requirement
104
+ requirement: &75088620 !ruby/object:Gem::Requirement
105
105
  none: false
106
106
  requirements:
107
107
  - - ~>
@@ -109,7 +109,7 @@ dependencies:
109
109
  version: '3.3'
110
110
  type: :development
111
111
  prerelease: false
112
- version_requirements: *80640060
112
+ version_requirements: *75088620
113
113
  description: pluto - Another Planet Generator (Lets You Build Web Pages from Published
114
114
  Web Feeds)
115
115
  email: feedreader@googlegroups.com