bookie 0.0.3 → 0.0.4
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/CHANGELOG.md +5 -0
- data/doc/markdown_syntax.pdf +0 -0
- data/examples/preformatted.rb +11 -0
- data/examples/simple_emitters.rb +6 -5
- data/lib/bookie/document.rb +2 -2
- data/lib/bookie/emitters.rb +35 -16
- data/lib/bookie/parser.rb +51 -9
- data/lib/bookie/version.rb +1 -1
- data/test/fixtures/preformatted_blocks.md +39 -0
- data/test/units/parser_test.rb +11 -1
- metadata +5 -2
data/CHANGELOG.md
CHANGED
@@ -14,3 +14,8 @@ anything else.
|
|
14
14
|
Added some basic emitters for PDF and HTML paragraphs. Note these are proofs of
|
15
15
|
concept ONLY, not meant for practical use. See examples/simple_emitters.rb to
|
16
16
|
see how they're used.
|
17
|
+
|
18
|
+
## 0.0.4 (2011.04.24)
|
19
|
+
|
20
|
+
Removed HTML emitter for now. Expanded parser and PDF emitter to support
|
21
|
+
preformatted text. See examples/preformatted.rb for to see how it works.
|
Binary file
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require_relative "../lib/bookie"
|
2
|
+
Prawn.debug = true
|
3
|
+
|
4
|
+
file = "#{File.dirname(__FILE__)}/../test/fixtures/preformatted_blocks.md"
|
5
|
+
|
6
|
+
pdf_document = Bookie::Document.new(file, Bookie::Emitters::PDF.new)
|
7
|
+
|
8
|
+
File.open("output.pdf", "w") do |f|
|
9
|
+
f << pdf_document.render(header: "Practicing Ruby: Issue #1",
|
10
|
+
title: "Ruby's Method Lookup Path")
|
11
|
+
end
|
data/examples/simple_emitters.rb
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
require_relative "../lib/bookie"
|
2
2
|
Prawn.debug = true
|
3
3
|
|
4
|
-
|
4
|
+
file = "#{File.dirname(__FILE__)}/../test/fixtures/multi_paragraph_document.md"
|
5
5
|
|
6
|
-
|
7
|
-
File.open("output.html", "w") { |f| f << html_document.render }
|
6
|
+
pdf_document = Bookie::Document.new(file, Bookie::Emitters::PDF.new)
|
8
7
|
|
9
|
-
|
10
|
-
|
8
|
+
File.open("output.pdf", "w") do |f|
|
9
|
+
f << pdf_document.render(header: "Majestic Sea Creature Blog",
|
10
|
+
title: "Why does RbMU exist?")
|
11
|
+
end
|
data/lib/bookie/document.rb
CHANGED
data/lib/bookie/emitters.rb
CHANGED
@@ -3,20 +3,8 @@ module Bookie
|
|
3
3
|
class Null
|
4
4
|
def build_paragraph(paragraph)
|
5
5
|
end
|
6
|
-
end
|
7
|
-
|
8
|
-
class HTML
|
9
|
-
|
10
|
-
def initialize
|
11
|
-
@output = ""
|
12
|
-
end
|
13
|
-
|
14
|
-
def build_paragraph(paragraph)
|
15
|
-
@output << "<p>#{paragraph.children.first}</p>"
|
16
|
-
end
|
17
6
|
|
18
|
-
def
|
19
|
-
"<html><body>#{@output}</body></html>"
|
7
|
+
def build_raw_text(paragraphs)
|
20
8
|
end
|
21
9
|
end
|
22
10
|
|
@@ -25,18 +13,49 @@ module Bookie
|
|
25
13
|
|
26
14
|
def initialize
|
27
15
|
@document = new_prawn_document
|
16
|
+
@document.extend(Prawn::Measurements)
|
28
17
|
@paragraphs = []
|
29
18
|
end
|
30
19
|
|
31
20
|
def build_paragraph(paragraph)
|
32
|
-
@paragraphs << paragraph.children.first.
|
21
|
+
@paragraphs << { text: paragraph.children.first.strip }
|
33
22
|
end
|
34
23
|
|
35
|
-
def
|
36
|
-
|
24
|
+
def build_raw_text(raw_text)
|
25
|
+
sanitized_text = raw_text.children.first.
|
26
|
+
gsub(" ", Prawn::Text::NBSP).strip
|
27
|
+
|
28
|
+
@paragraphs << { text: sanitized_text,
|
29
|
+
font: "Courier",
|
30
|
+
size: 8 }
|
31
|
+
end
|
32
|
+
|
33
|
+
def render(params)
|
34
|
+
render_header(params)
|
35
|
+
|
36
|
+
# there needs to be a better way
|
37
|
+
@paragraphs = @paragraphs.reduce([]) { |s,r| s + [r, { text: "\n\n" }] }
|
38
|
+
@paragraphs.pop
|
39
|
+
|
40
|
+
@document.formatted_text(@paragraphs, align: :justify, size: 10)
|
37
41
|
@document.render
|
38
42
|
end
|
39
43
|
|
44
|
+
def render_header(params)
|
45
|
+
@document.instance_eval do
|
46
|
+
text "<b>#{params[:header]}</b>",
|
47
|
+
size: 12, align: :right, inline_format: true
|
48
|
+
stroke_horizontal_rule
|
49
|
+
|
50
|
+
move_down in2pt(0.1)
|
51
|
+
|
52
|
+
text "<b>#{params[:title]}</b>",
|
53
|
+
size: 18, align: :right, inline_format: true
|
54
|
+
|
55
|
+
move_down in2pt(1.25)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
40
59
|
private
|
41
60
|
|
42
61
|
def new_prawn_document
|
data/lib/bookie/parser.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
module Bookie
|
2
|
-
ContentTree
|
3
|
-
Paragraph
|
2
|
+
ContentTree = Struct.new(:children)
|
3
|
+
Paragraph = Struct.new(:children)
|
4
|
+
RawText = Struct.new(:children)
|
4
5
|
|
5
6
|
class Parser
|
6
7
|
def self.parse(contents, emitter=Bookie::Emitters::Null.new)
|
@@ -15,19 +16,60 @@ module Bookie
|
|
15
16
|
generate_document_tree(contents)
|
16
17
|
end
|
17
18
|
|
18
|
-
def
|
19
|
-
contents.
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
19
|
+
def extract_paragraph(contents)
|
20
|
+
paragraph = Paragraph.new([contents.gsub(/\s+/," ")])
|
21
|
+
@emitter.build_paragraph(paragraph)
|
22
|
+
document_tree.children << paragraph
|
23
|
+
end
|
24
|
+
|
25
|
+
def extract_raw_text(contents)
|
26
|
+
raw_text = RawText.new([contents])
|
27
|
+
@emitter.build_raw_text(raw_text)
|
28
|
+
document_tree.children << raw_text
|
24
29
|
end
|
25
30
|
|
26
31
|
private
|
27
32
|
|
28
33
|
def generate_document_tree(contents)
|
29
34
|
@document_tree = ContentTree.new([])
|
30
|
-
|
35
|
+
|
36
|
+
lines = contents.lines.to_a
|
37
|
+
mode = nil
|
38
|
+
|
39
|
+
until lines.empty?
|
40
|
+
line = lines.shift
|
41
|
+
case
|
42
|
+
when mode == nil
|
43
|
+
if line[/^ {4,}/]
|
44
|
+
mode = :raw
|
45
|
+
chunk = line[4..-1]
|
46
|
+
else
|
47
|
+
mode = :paragraph
|
48
|
+
chunk = line
|
49
|
+
end
|
50
|
+
when mode == :raw
|
51
|
+
chunk << (line.chomp.empty? ? "\n" : line[4..-1].to_s)
|
52
|
+
|
53
|
+
if lines.first =~ /^ {0,3}\S/
|
54
|
+
mode = nil
|
55
|
+
extract_raw_text(chunk)
|
56
|
+
end
|
57
|
+
when mode == :paragraph
|
58
|
+
if line.chomp.empty?
|
59
|
+
mode = nil
|
60
|
+
extract_paragraph(chunk)
|
61
|
+
else
|
62
|
+
chunk << line
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
case mode
|
68
|
+
when :paragraph
|
69
|
+
extract_paragraph(chunk)
|
70
|
+
when :raw
|
71
|
+
extract_raw_text(chunk)
|
72
|
+
end
|
31
73
|
end
|
32
74
|
end
|
33
75
|
end
|
data/lib/bookie/version.rb
CHANGED
@@ -0,0 +1,39 @@
|
|
1
|
+
I decided to start off this newsletter with one of the most basic but
|
2
|
+
essential pieces of knowledge you can have about Ruby's object model:
|
3
|
+
the way it looks up methods. Let's do a little exploration by working
|
4
|
+
through a few examples.
|
5
|
+
|
6
|
+
Below we have a simple report class who's job is to perform some basic
|
7
|
+
data manipulations and then produce some text output.
|
8
|
+
|
9
|
+
class Report
|
10
|
+
def initialize(ledger)
|
11
|
+
@balance = ledger.inject(0) { |sum, (k,v)| sum + v }
|
12
|
+
@credits, @debits = ledger.partition { |k,v| v > 0 }
|
13
|
+
end
|
14
|
+
|
15
|
+
attr_reader :credits, :debits, :balance
|
16
|
+
|
17
|
+
def formatted_output
|
18
|
+
"Current Balance: #{balance}\n\n" +
|
19
|
+
"Credits:\n\n#{formatted_line_items(credits)}\n\n" +
|
20
|
+
"Debits:\n\n#{formatted_line_items(debits)}"
|
21
|
+
end
|
22
|
+
|
23
|
+
def formatted_line_items(items)
|
24
|
+
items.map { |k, v| "#{k}: #{'%.2f' % v.abs}" }.join("\n")
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
The following code demonstrates how we'd make use of this newly created class.
|
29
|
+
|
30
|
+
ledger = [ ["Deposit Check #123", 500.15],
|
31
|
+
["Fancy Shoes", -200.25],
|
32
|
+
["Fancy Hat", -54.40],
|
33
|
+
["ATM Deposit", 1200.00],
|
34
|
+
["Kitteh Litteh", -5.00] ]
|
35
|
+
|
36
|
+
report = Report.new(ledger)
|
37
|
+
puts report.formatted_output
|
38
|
+
|
39
|
+
Amazing, right? (Yadda... yadda.. yadda)
|
data/test/units/parser_test.rb
CHANGED
@@ -5,7 +5,8 @@ context "A Parser" do
|
|
5
5
|
sample_text = File.read(fixture("multi_paragraph_document.md"))
|
6
6
|
|
7
7
|
# NOTE: Is this the behavior we'd expect?
|
8
|
-
sample_paragraph_text = File.read(fixture("single_paragraph.md"))
|
8
|
+
sample_paragraph_text = File.read(fixture("single_paragraph.md"))
|
9
|
+
.gsub(/\s+/," ")
|
9
10
|
|
10
11
|
tree = Bookie::Parser.parse(sample_text)
|
11
12
|
|
@@ -16,4 +17,13 @@ context "A Parser" do
|
|
16
17
|
|
17
18
|
assert_equal sample_paragraph_text, actual_paragraph_text
|
18
19
|
end
|
20
|
+
|
21
|
+
test "should know about preformatted text" do
|
22
|
+
sample_text = File.read(fixture("preformatted_blocks.md"))
|
23
|
+
|
24
|
+
tree = Bookie::Parser.parse(sample_text)
|
25
|
+
|
26
|
+
assert_equal 7, tree.children.length
|
27
|
+
end
|
28
|
+
|
19
29
|
end
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: bookie
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.0.
|
5
|
+
version: 0.0.4
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Gregory Brown
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-04-
|
13
|
+
date: 2011-04-24 00:00:00 -04:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
@@ -40,12 +40,15 @@ files:
|
|
40
40
|
- lib/bookie/version.rb
|
41
41
|
- lib/bookie.rb
|
42
42
|
- test/fixtures/multi_paragraph_document.md
|
43
|
+
- test/fixtures/preformatted_blocks.md
|
43
44
|
- test/fixtures/single_paragraph.md
|
44
45
|
- test/suite.rb
|
45
46
|
- test/test_helper.rb
|
46
47
|
- test/units/document_test.rb
|
47
48
|
- test/units/parser_test.rb
|
49
|
+
- examples/preformatted.rb
|
48
50
|
- examples/simple_emitters.rb
|
51
|
+
- doc/markdown_syntax.pdf
|
49
52
|
- GPLv3
|
50
53
|
- README.md
|
51
54
|
- CHANGELOG.md
|