klipbook 0.2.1 → 0.3.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.
- data/klipbook.gemspec +2 -2
- data/lib/klipbook/book_summary.erb +5 -1
- data/lib/klipbook/book_summary.rb +2 -1
- data/lib/klipbook/cli.rb +2 -1
- data/lib/klipbook/clippings_parser.rb +17 -1
- data/lib/klipbook/runner.rb +2 -2
- data/lib/klipbook/version.rb +1 -1
- data/spec/lib/klipbook/clippings_parser_spec.rb +32 -0
- metadata +31 -31
data/klipbook.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "klipbook"
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.3.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Ray Grasso"]
|
12
|
-
s.date = "2011-12-
|
12
|
+
s.date = "2011-12-29"
|
13
13
|
s.description = "Process your Kindle clippings file to generate a nicely formatted compilation of the clippings of the books you've read"
|
14
14
|
s.email = "ray.grasso@gmail.com"
|
15
15
|
s.executables = ["klipbook"]
|
@@ -83,7 +83,11 @@
|
|
83
83
|
<p>
|
84
84
|
<%= ERB::Util.html_escape(clipping.text) %>
|
85
85
|
</p>
|
86
|
-
<footer
|
86
|
+
<footer>
|
87
|
+
<%= clipping.type %>
|
88
|
+
<% if include_pages && clipping.page %> on page <%= clipping.page %><% end %>
|
89
|
+
<% if clipping.location %> @ loc <%= clipping.location %><% end %>
|
90
|
+
</footer>
|
87
91
|
</li>
|
88
92
|
<% end %>
|
89
93
|
<% end %>
|
data/lib/klipbook/cli.rb
CHANGED
@@ -16,6 +16,7 @@ module Klipbook
|
|
16
16
|
end
|
17
17
|
|
18
18
|
desc 'summarise CLIPPINGS_FILE BOOK_NUMBER OUTPUT_FILE', 'Output an html summary of the clippings for a book'
|
19
|
+
method_option :include_pages, :aliases => '-p', :desc => 'Include page numbers in output when available'
|
19
20
|
def summarise(clippings_file=nil, book_number=nil, output_file=nil)
|
20
21
|
if (clippings_file.nil? or book_number.nil? or output_file.nil?)
|
21
22
|
puts 'Please provide a CLIPPINGS_FILE, BOOK_NUMBER, and OUTPUT_FILE'
|
@@ -26,7 +27,7 @@ module Klipbook
|
|
26
27
|
|
27
28
|
book_number = book_number.to_i
|
28
29
|
|
29
|
-
Klipbook::Runner.new(clippings_file).print_book_summary(book_number, File.open(output_file, 'w'))
|
30
|
+
Klipbook::Runner.new(clippings_file).print_book_summary(book_number, File.open(output_file, 'w'), options)
|
30
31
|
end
|
31
32
|
|
32
33
|
map '-v' => :version
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
1
3
|
module Klipbook
|
2
4
|
class ClippingsParser
|
3
5
|
def extract_clippings_from(file_text)
|
@@ -29,15 +31,20 @@ module Klipbook
|
|
29
31
|
author: extract_author(title_line),
|
30
32
|
type: extract_type(metadata),
|
31
33
|
location: extract_location(metadata),
|
34
|
+
page: extract_page(metadata),
|
32
35
|
added_on: extract_added_date(metadata),
|
33
36
|
text: extract_text(text_lines)
|
34
37
|
}
|
35
38
|
end
|
36
39
|
|
40
|
+
def strip_control_characters(file_text)
|
41
|
+
file_text.gsub("\r", '').gsub("\xef\xbb\xbf", '')
|
42
|
+
end
|
43
|
+
|
37
44
|
private
|
38
45
|
|
39
46
|
def clippings_text_from(file_text)
|
40
|
-
file_text
|
47
|
+
strip_control_characters(file_text).split('==========')
|
41
48
|
end
|
42
49
|
|
43
50
|
def valid_metadata?(metadata)
|
@@ -75,6 +82,15 @@ module Klipbook
|
|
75
82
|
location.to_i
|
76
83
|
end
|
77
84
|
|
85
|
+
def extract_page(metadata)
|
86
|
+
match = metadata.scan(/Page (\d+)/)
|
87
|
+
|
88
|
+
return nil if match.empty?
|
89
|
+
|
90
|
+
location = match.first.first
|
91
|
+
location.to_i
|
92
|
+
end
|
93
|
+
|
78
94
|
def extract_text(text_lines)
|
79
95
|
text_lines.join('').rstrip
|
80
96
|
end
|
data/lib/klipbook/runner.rb
CHANGED
@@ -16,14 +16,14 @@ module Klipbook
|
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
|
-
def print_book_summary(book_number, output)
|
19
|
+
def print_book_summary(book_number, output, options={})
|
20
20
|
if book_number < 1 or book_number > @clippings_file.books.length
|
21
21
|
$stderr.puts "Sorry but you must specify a book index between 1 and #{@clippings_file.books.length}"
|
22
22
|
return
|
23
23
|
end
|
24
24
|
|
25
25
|
book_summary = @clippings_file.books[book_number - 1]
|
26
|
-
output.write book_summary.as_html
|
26
|
+
output.write book_summary.as_html(options)
|
27
27
|
end
|
28
28
|
end
|
29
29
|
end
|
data/lib/klipbook/version.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
|
3
5
|
describe Klipbook::ClippingsParser do
|
@@ -246,6 +248,10 @@ describe Klipbook::ClippingsParser do
|
|
246
248
|
subject[:location].should == 1858
|
247
249
|
end
|
248
250
|
|
251
|
+
it 'extracts the page number' do
|
252
|
+
subject[:page].should == 171
|
253
|
+
end
|
254
|
+
|
249
255
|
it 'extracts the date' do
|
250
256
|
subject[:added_on].should == 'Thursday, April 21, 2011, 07:31 AM'
|
251
257
|
end
|
@@ -264,6 +270,10 @@ describe Klipbook::ClippingsParser do
|
|
264
270
|
subject[:location].should == 1858
|
265
271
|
end
|
266
272
|
|
273
|
+
it 'extracts the page number' do
|
274
|
+
subject[:page].should == 171
|
275
|
+
end
|
276
|
+
|
267
277
|
it 'extracts the date' do
|
268
278
|
subject[:added_on].should == 'Thursday, April 21, 2011, 07:31 AM'
|
269
279
|
end
|
@@ -281,6 +291,10 @@ describe Klipbook::ClippingsParser do
|
|
281
291
|
subject[:location].should be_nil
|
282
292
|
end
|
283
293
|
|
294
|
+
it 'extracts the page number' do
|
295
|
+
subject[:page].should == 9
|
296
|
+
end
|
297
|
+
|
284
298
|
it 'extracts the date' do
|
285
299
|
subject[:added_on].should == 'Thursday, April 21, 2011, 07:31 AM'
|
286
300
|
end
|
@@ -298,6 +312,10 @@ describe Klipbook::ClippingsParser do
|
|
298
312
|
subject[:location].should be_nil
|
299
313
|
end
|
300
314
|
|
315
|
+
it 'extracts the page number' do
|
316
|
+
subject[:page].should == 9
|
317
|
+
end
|
318
|
+
|
301
319
|
it 'extracts the date' do
|
302
320
|
subject[:added_on].should == 'Thursday, April 21, 2011, 07:31 AM'
|
303
321
|
end
|
@@ -330,6 +348,20 @@ describe Klipbook::ClippingsParser do
|
|
330
348
|
Klipbook::Clipping.should have_received.new.with(attributes)
|
331
349
|
end
|
332
350
|
end
|
351
|
+
|
352
|
+
describe "#strip_control_characters" do
|
353
|
+
let(:it) { Klipbook::ClippingsParser.new }
|
354
|
+
|
355
|
+
it "removes all carriage return characters" do
|
356
|
+
processed_text = it.strip_control_characters("An example \r clippings text\r")
|
357
|
+
processed_text.should_not include("\r")
|
358
|
+
end
|
359
|
+
|
360
|
+
it "removes all Unicode byte order marks" do
|
361
|
+
processed_text = it.strip_control_characters("An example \xef\xbb\xbf clippings text\xef\xbb\xbf")
|
362
|
+
processed_text.should_not include("\xef\xbb\xbf")
|
363
|
+
end
|
364
|
+
end
|
333
365
|
end
|
334
366
|
|
335
367
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: klipbook
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
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: 2011-12-
|
12
|
+
date: 2011-12-29 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: thor
|
16
|
-
requirement: &
|
16
|
+
requirement: &70207424507480 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70207424507480
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: rspec
|
27
|
-
requirement: &
|
27
|
+
requirement: &70207424506920 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70207424506920
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: rr
|
38
|
-
requirement: &
|
38
|
+
requirement: &70207424506400 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70207424506400
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: bundler
|
49
|
-
requirement: &
|
49
|
+
requirement: &70207424505840 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70207424505840
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: jeweler
|
60
|
-
requirement: &
|
60
|
+
requirement: &70207424505300 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ~>
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: 1.6.4
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *70207424505300
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: rcov
|
71
|
-
requirement: &
|
71
|
+
requirement: &70207424504540 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ! '>='
|
@@ -76,10 +76,10 @@ dependencies:
|
|
76
76
|
version: '0'
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *70207424504540
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: cucumber
|
82
|
-
requirement: &
|
82
|
+
requirement: &70207424502720 !ruby/object:Gem::Requirement
|
83
83
|
none: false
|
84
84
|
requirements:
|
85
85
|
- - ! '>='
|
@@ -87,10 +87,10 @@ dependencies:
|
|
87
87
|
version: '0'
|
88
88
|
type: :development
|
89
89
|
prerelease: false
|
90
|
-
version_requirements: *
|
90
|
+
version_requirements: *70207424502720
|
91
91
|
- !ruby/object:Gem::Dependency
|
92
92
|
name: guard
|
93
|
-
requirement: &
|
93
|
+
requirement: &70207424500680 !ruby/object:Gem::Requirement
|
94
94
|
none: false
|
95
95
|
requirements:
|
96
96
|
- - ! '>='
|
@@ -98,10 +98,10 @@ dependencies:
|
|
98
98
|
version: '0'
|
99
99
|
type: :development
|
100
100
|
prerelease: false
|
101
|
-
version_requirements: *
|
101
|
+
version_requirements: *70207424500680
|
102
102
|
- !ruby/object:Gem::Dependency
|
103
103
|
name: guard-rspec
|
104
|
-
requirement: &
|
104
|
+
requirement: &70207424499260 !ruby/object:Gem::Requirement
|
105
105
|
none: false
|
106
106
|
requirements:
|
107
107
|
- - ! '>='
|
@@ -109,10 +109,10 @@ dependencies:
|
|
109
109
|
version: '0'
|
110
110
|
type: :development
|
111
111
|
prerelease: false
|
112
|
-
version_requirements: *
|
112
|
+
version_requirements: *70207424499260
|
113
113
|
- !ruby/object:Gem::Dependency
|
114
114
|
name: guard-cucumber
|
115
|
-
requirement: &
|
115
|
+
requirement: &70207424498260 !ruby/object:Gem::Requirement
|
116
116
|
none: false
|
117
117
|
requirements:
|
118
118
|
- - ! '>='
|
@@ -120,10 +120,10 @@ dependencies:
|
|
120
120
|
version: '0'
|
121
121
|
type: :development
|
122
122
|
prerelease: false
|
123
|
-
version_requirements: *
|
123
|
+
version_requirements: *70207424498260
|
124
124
|
- !ruby/object:Gem::Dependency
|
125
125
|
name: rb-inotify
|
126
|
-
requirement: &
|
126
|
+
requirement: &70207424497200 !ruby/object:Gem::Requirement
|
127
127
|
none: false
|
128
128
|
requirements:
|
129
129
|
- - ! '>='
|
@@ -131,10 +131,10 @@ dependencies:
|
|
131
131
|
version: '0'
|
132
132
|
type: :development
|
133
133
|
prerelease: false
|
134
|
-
version_requirements: *
|
134
|
+
version_requirements: *70207424497200
|
135
135
|
- !ruby/object:Gem::Dependency
|
136
136
|
name: rb-fsevent
|
137
|
-
requirement: &
|
137
|
+
requirement: &70207424494680 !ruby/object:Gem::Requirement
|
138
138
|
none: false
|
139
139
|
requirements:
|
140
140
|
- - ! '>='
|
@@ -142,10 +142,10 @@ dependencies:
|
|
142
142
|
version: '0'
|
143
143
|
type: :development
|
144
144
|
prerelease: false
|
145
|
-
version_requirements: *
|
145
|
+
version_requirements: *70207424494680
|
146
146
|
- !ruby/object:Gem::Dependency
|
147
147
|
name: rb-fchange
|
148
|
-
requirement: &
|
148
|
+
requirement: &70207424492080 !ruby/object:Gem::Requirement
|
149
149
|
none: false
|
150
150
|
requirements:
|
151
151
|
- - ! '>='
|
@@ -153,10 +153,10 @@ dependencies:
|
|
153
153
|
version: '0'
|
154
154
|
type: :development
|
155
155
|
prerelease: false
|
156
|
-
version_requirements: *
|
156
|
+
version_requirements: *70207424492080
|
157
157
|
- !ruby/object:Gem::Dependency
|
158
158
|
name: growl_notify
|
159
|
-
requirement: &
|
159
|
+
requirement: &70207424489100 !ruby/object:Gem::Requirement
|
160
160
|
none: false
|
161
161
|
requirements:
|
162
162
|
- - ! '>='
|
@@ -164,7 +164,7 @@ dependencies:
|
|
164
164
|
version: '0'
|
165
165
|
type: :development
|
166
166
|
prerelease: false
|
167
|
-
version_requirements: *
|
167
|
+
version_requirements: *70207424489100
|
168
168
|
description: Process your Kindle clippings file to generate a nicely formatted compilation
|
169
169
|
of the clippings of the books you've read
|
170
170
|
email: ray.grasso@gmail.com
|
@@ -224,7 +224,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
224
224
|
version: '0'
|
225
225
|
segments:
|
226
226
|
- 0
|
227
|
-
hash:
|
227
|
+
hash: 3834565430235223789
|
228
228
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
229
229
|
none: false
|
230
230
|
requirements:
|