feedtxt 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 08b6aa5f6093d99cc013764f924c5a1845b8b3f0
4
- data.tar.gz: ae29161c8ffab020ca196d58dd55cdd0f823308c
3
+ metadata.gz: e298ca3389877938c8ded1a08b327480ebbf79f4
4
+ data.tar.gz: 1fbea9a04efc18cf21d6286092bb113e616ae20b
5
5
  SHA512:
6
- metadata.gz: fa7f505525df6950631f8789b44a52d8216573e52b32e6f452f6448c561adc4339ba5f760101e5451543945722d06bff9392655023d62c6242e7507772787814
7
- data.tar.gz: 49dfd5b5c1f2747b47c0ef45bdb9580cae8ea745c0a3bc75fce88d5108415b15f92601d5b629bed7fbf75b4cc7bb8901ef1fad1c68e7a11b25c30b88eb3c35fd
6
+ metadata.gz: f103a0b967f89c60a589622c899e03c9b17d05f4e7f726cba66d2712a82cbea07ee39c5319419f093bb8a6f321bbe8920669464c904623d145251917edc2293e
7
+ data.tar.gz: 4cdd5559ea35fe6b85e28d27fe461c884bd9e2689778b756ffc9b099bc15d6215648e329d3d862e876f976a4bad731639bfa334b374f58b89182bb748423c695
data/Manifest.txt CHANGED
@@ -8,5 +8,5 @@ lib/feedtxt/version.rb
8
8
  test/feeds/spec/example.yaml.txt
9
9
  test/feeds/spec/podcast.yaml.txt
10
10
  test/helper.rb
11
- test/test_version.rb
11
+ test/test_scanner.rb
12
12
  test/test_yaml.rb
data/README.md CHANGED
@@ -10,8 +10,8 @@
10
10
 
11
11
  ## Usage
12
12
 
13
- Use `Feedtxt::Parser.parse` to read / parse feeds in text (using the Feed.TXT)
14
- format.
13
+ Use `Feedtxt.parse` to read / parse feeds in text using the Feed.TXT
14
+ format also known as RSS (Really Simple Sharing) 5.0 ;-).
15
15
  The parse method will return an array:
16
16
 
17
17
  ```
@@ -52,7 +52,7 @@ Hello, world!
52
52
  <<<|
53
53
  TXT
54
54
 
55
- feed = Feedtxt::Parser.parse( text )
55
+ feed = Feedtxt.parse( text )
56
56
  pp feed
57
57
  ```
58
58
 
@@ -148,7 +148,7 @@ He lives on [Bainbridge Island][3], a quick ferry ride from Seattle.
148
148
  <<<|
149
149
  TXT
150
150
 
151
- feed = Feedtxt::Parser.parse( text )
151
+ feed = Feedtxt.parse( text )
152
152
  pp feed
153
153
  ```
154
154
 
data/Rakefile CHANGED
@@ -5,7 +5,7 @@ Hoe.spec 'feedtxt' do
5
5
 
6
6
  self.version = Feedtxt::VERSION
7
7
 
8
- self.summary = "feedtxt - reads Feed.TXT - feeds in text (unicode) - publish & share posts, articles, podcasts, 'n' more"
8
+ self.summary = "feedtxt - reads Feed.TXT a.k.a. RSS (Really Simple Sharing) 5.0 ;-) - feeds in text (unicode) - publish & share posts, articles, podcasts, 'n' more"
9
9
  self.description = summary
10
10
 
11
11
  self.urls = ['https://github.com/feedtxt/feedtxt']
data/lib/feedtxt.rb CHANGED
@@ -3,6 +3,7 @@
3
3
 
4
4
  # core and stdlibs
5
5
 
6
+ require 'strscan' ## StringScanner
6
7
  require 'json'
7
8
  require 'yaml'
8
9
  require 'date'
@@ -10,6 +11,7 @@ require 'time'
10
11
  require 'pp'
11
12
 
12
13
 
14
+
13
15
  # 3rd party gems/libs
14
16
  require 'logutils'
15
17
 
@@ -21,5 +23,16 @@ require 'feedtxt/parser'
21
23
 
22
24
 
23
25
 
26
+ ## add shortcut / alias e.g.
27
+ ## lets you use:
28
+ ## Feedtxt.parse instead of Feedtxt::Parser.parse
29
+ module Feedtxt
30
+ def self.parse( text, opts={} )
31
+ Parser.parse( text, )
32
+ end
33
+ end
34
+
35
+
36
+
24
37
  # say hello
25
38
  puts Feedtxt.banner if $DEBUG || (defined?($RUBYLIBS_DEBUG) && $RUBYLIBS_DEBUG)
@@ -20,47 +20,56 @@ class Parser
20
20
 
21
21
 
22
22
 
23
- FEED_BEGIN_RX = %r{^\|>>>$}
24
- FEED_END_RX = %r{^<<<\|$}
25
- FEED_NEXT_RX = %r{^</>$} ## pass 1: split/break up blocks
26
- FEED_META_RX = %r{^---$} ## pass 2: break up item into metadata and content block
23
+ ## note:
24
+ ## regex excape pipe: | to \|
25
+ ## \\ needs to get escaped twice e.g. (\\ becomes \)
26
+ ## e.g. |>>> or |>>>>>
27
+ FEED_BEGIN = %{^[ ]*\\|>>>+[ ]*$} ## note: allow leading n trailing spaces; allow 3 or more brackets
28
+ ## e.g. <<<| or <<<<<<|
29
+ FEED_END = %{^[ ]*<<<+\\|[ ]*$} ## note: allow leading n trailing spaces; allow 3 or more brackets
30
+
31
+ ## e.g.</> or <<</>>>
32
+ FEED_NEXT = %{^[ ]*<+/>+[ ]*$} ## pass 1: split/break up blocks
33
+ ## e.g. --- or -----
34
+ FEED_META = %{^[ ]*---+[ ]*$} ## pass 2: break up item into metadata and content block
35
+
27
36
 
28
37
 
29
38
  def parse
30
39
 
31
40
  ## find start marker e.g. |>>>
32
- ## todo: use regex - allow three or more >>>>>> or <<<<<<
33
- ## todo: allow spaces before and after
41
+ ## use regex - allow three or more >>>>>> or <<<<<<
42
+ ## allow spaces before and after
34
43
 
44
+ s = StringScanner.new( @text )
35
45
 
36
- ## todo/fix:
37
- ## use index-like finder return posbeg and posend!!!
38
- ## regex is not fixed length/width; we need to know the length
39
- ## check what is the best way? use regex match or something???
46
+ prolog = s.scan_until( /(?=#{FEED_BEGIN})/ )
47
+ ## pp prolog
40
48
 
41
- posbeg = @text.index( FEED_BEGIN_RX )
42
- if posbeg.nil?
49
+ feed_begin = s.scan( /#{FEED_BEGIN}/ )
50
+ if feed_begin.empty? ## use blank? why? why not??
43
51
  ## nothing found return empty array for now; return nil - why? why not?
44
52
  puts "warn !!! no begin marker found e.g. |>>>"
45
53
  return []
46
54
  end
47
55
 
48
- posend = @text.index( FEED_END_RX, posbeg )
49
- if posend.nil?
56
+
57
+ buf = s.scan_until( /(?=#{FEED_END})/ )
58
+ buf = buf.strip # remove leading and trailing whitespace
59
+
60
+ feed_end = s.scan( /#{FEED_END}/ )
61
+ if feed_end.empty? ## use blank? why? why not??
50
62
  ## nothing found return empty array for now; return nil - why? why not?
51
63
  puts "warn !!! no end marker found e.g. <<<|"
52
64
  return []
53
65
  end
54
66
 
55
- ## cutoff - get text between begin and end marker
56
- buf = @text[ posbeg+4...posend ].strip
57
- ## pp buf
58
67
 
59
68
  ####
60
69
  ## pass 1: split blocks by </>
61
- ### todo: allow <<<</>>>>
70
+ ### note: allows <<<</>>>>
62
71
 
63
- blocks = buf.split( FEED_NEXT_RX )
72
+ blocks = buf.split( /#{FEED_NEXT}/ )
64
73
  ## pp blocks
65
74
 
66
75
  ## 1st block is feed meta data
@@ -72,13 +81,17 @@ class Parser
72
81
  ### note: do NOT use split e.g.--- is used by markdown
73
82
  ## only search for first --- to split (all others get ignored)
74
83
  ## todo: make three dashes --- (3) not hard-coded (allow more)
75
- posmeta = block.index( FEED_META_RX )
76
- item = []
77
- item[0] = block[0...posmeta].strip
78
- item[1] = block[posmeta+3..-1].strip
79
84
 
80
- item_metadata = YAML.load( item[0] )
81
- item_content = item[1]
85
+ s2 = StringScanner.new( block )
86
+
87
+ item_metadata = s2.scan_until( /(?=#{FEED_META})/ )
88
+ item_metadata = item_metadata.strip # remove leading and trailing whitespace
89
+ item_metadata = YAML.load( item_metadata ) ## convert to hash with yaml
90
+
91
+ feed_meta = s2.scan( /#{FEED_META}/ )
92
+
93
+ item_content = s2.rest
94
+ item_content = item_content.strip # remove leading and trailing whitespace
82
95
 
83
96
  feed_items << [item_metadata, item_content]
84
97
  end
@@ -88,4 +101,5 @@ class Parser
88
101
 
89
102
 
90
103
  end # class Parser
104
+
91
105
  end # module Feedtxt
@@ -3,7 +3,7 @@
3
3
  module Feedtxt
4
4
 
5
5
  MAJOR = 0
6
- MINOR = 1
6
+ MINOR = 2
7
7
  PATCH = 0
8
8
  VERSION = [MAJOR,MINOR,PATCH].join('.')
9
9
 
@@ -0,0 +1,56 @@
1
+ ###
2
+ # to run use
3
+ # ruby -I ./lib -I ./test test/test_scanner.rb
4
+ # or better
5
+ # rake test
6
+
7
+ require 'helper'
8
+
9
+
10
+ class TestScanner < MiniTest::Test
11
+
12
+ ## note:
13
+ ## regex excape pipe: | to \|
14
+ ## note: \\ needs to get escaped twice e.g. (\\ becomes \)
15
+ FEED_BEGIN = %{^[ ]*\\|>>>+[ ]*$}
16
+ FEED_END = %{^[ ]*<<<+\\|[ ]*$}
17
+
18
+ def test_scan
19
+
20
+ text =<<TXT
21
+ bla bla bla
22
+ |>>>
23
+ title: "My Example Feed"
24
+ home_page_url: "https://example.org/"
25
+ feed_url: "https://example.org/feed.txt"
26
+ </>
27
+ id: "2"
28
+ url: "https://example.org/second-item"
29
+ ---
30
+ This is a second item.
31
+ </>
32
+ id: "1"
33
+ url: "https://example.org/initial-post"
34
+ ---
35
+ Hello, world!
36
+ <<<|
37
+ TXT
38
+
39
+ s = StringScanner.new( text )
40
+
41
+ prolog = s.scan_until( /(?=#{FEED_BEGIN})/ )
42
+ pp prolog
43
+
44
+ feed_begin = s.scan( /#{FEED_BEGIN}/ )
45
+ assert_equal '|>>>', feed_begin
46
+
47
+ body = s.scan_until( /(?=#{FEED_END})/ )
48
+ pp body
49
+
50
+ feed_end = s.scan( /#{FEED_END}/ )
51
+ assert_equal '<<<|', feed_end
52
+
53
+ assert true
54
+ end
55
+
56
+ end # class TestScanner
data/test/test_yaml.rb CHANGED
@@ -14,11 +14,6 @@ class TestYaml < MiniTest::Test
14
14
  text = read_text( 'spec/example.yaml' )
15
15
  pp text
16
16
 
17
- feed = Feedtxt::Parser.parse( text )
18
- pp feed
19
-
20
- ## pp feed.to_json
21
-
22
17
  exp = [
23
18
  {"title"=>"My Example Feed",
24
19
  "home_page_url"=>"https://example.org/",
@@ -32,8 +27,8 @@ class TestYaml < MiniTest::Test
32
27
  "Hello, world!"
33
28
  ]]]
34
29
 
35
-
36
- assert_equal exp, feed
30
+ assert_equal exp, Feedtxt::Parser.parse( text )
31
+ assert_equal exp, Feedtxt.parse( text ) ## try shortcut alias too
37
32
  end
38
33
 
39
34
  def test_podcast
@@ -41,11 +36,6 @@ class TestYaml < MiniTest::Test
41
36
  text = read_text( 'spec/podcast.yaml' )
42
37
  pp text
43
38
 
44
- feed = Feedtxt::Parser.parse( text )
45
- pp feed
46
-
47
- ## pp feed.to_json
48
-
49
39
  exp =[{"comment"=>
50
40
  "This is a podcast feed. You can add this feed to your podcast client using the following URL: http://therecord.co/feed.json",
51
41
  "title"=>"The Record",
@@ -65,7 +55,8 @@ class TestYaml < MiniTest::Test
65
55
  "duration_in_seconds"=>6629}]},
66
56
  "Chris has worked at [Adobe][1] and as a founder of Rogue Sheep, which won an Apple Design Award for Postage.\nChris's new company is Aged & Distilled with Guy English - which shipped [Napkin](2),\na Mac app for visual collaboration. Chris is also the co-host of The Record.\nHe lives on [Bainbridge Island][3], a quick ferry ride from Seattle.\n\n[1]: http://adobe.com/\n[2]: http://aged-and-distilled.com/napkin/\n[3]: http://www.ci.bainbridge-isl.wa.us/"]]]
67
57
 
68
- assert_equal exp, feed
58
+ assert_equal exp, Feedtxt::Parser.parse( text )
59
+ assert_equal exp, Feedtxt.parse( text ) ## try shortcut alias too
69
60
  end
70
61
 
71
62
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: feedtxt
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gerald Bauer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-06-11 00:00:00.000000000 Z
11
+ date: 2017-06-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rdoc
@@ -38,8 +38,8 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '3.15'
41
- description: feedtxt - reads Feed.TXT - feeds in text (unicode) - publish & share
42
- posts, articles, podcasts, 'n' more
41
+ description: feedtxt - reads Feed.TXT a.k.a. RSS (Really Simple Sharing) 5.0 ;-) -
42
+ feeds in text (unicode) - publish & share posts, articles, podcasts, 'n' more
43
43
  email: wwwmake@googlegroups.com
44
44
  executables: []
45
45
  extensions: []
@@ -58,7 +58,7 @@ files:
58
58
  - test/feeds/spec/example.yaml.txt
59
59
  - test/feeds/spec/podcast.yaml.txt
60
60
  - test/helper.rb
61
- - test/test_version.rb
61
+ - test/test_scanner.rb
62
62
  - test/test_yaml.rb
63
63
  homepage: https://github.com/feedtxt/feedtxt
64
64
  licenses:
@@ -85,6 +85,6 @@ rubyforge_project:
85
85
  rubygems_version: 2.6.7
86
86
  signing_key:
87
87
  specification_version: 4
88
- summary: feedtxt - reads Feed.TXT - feeds in text (unicode) - publish & share posts,
89
- articles, podcasts, 'n' more
88
+ summary: feedtxt - reads Feed.TXT a.k.a. RSS (Really Simple Sharing) 5.0 ;-) - feeds
89
+ in text (unicode) - publish & share posts, articles, podcasts, 'n' more
90
90
  test_files: []
data/test/test_version.rb DELETED
@@ -1,19 +0,0 @@
1
- ###
2
- # to run use
3
- # ruby -I ./lib -I ./test test/test_version.rb
4
- # or better
5
- # rake test
6
-
7
- require 'helper'
8
-
9
-
10
- class TestVersion < MiniTest::Test
11
-
12
- def test_version
13
-
14
- puts "Feedtxt: #{Feedtxt::VERSION}"
15
-
16
- assert true
17
- end
18
-
19
- end # class TestVersion