pricecut 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. data/lib/pricecut/elements/a.rb +12 -0
  2. data/lib/pricecut/elements/blockquote.rb +9 -0
  3. data/lib/pricecut/elements/element.rb +28 -0
  4. data/lib/pricecut/elements/em.rb +12 -0
  5. data/lib/pricecut/elements/h1.rb +9 -0
  6. data/lib/pricecut/elements/h2.rb +9 -0
  7. data/lib/pricecut/elements/h3.rb +9 -0
  8. data/lib/pricecut/elements/h4.rb +9 -0
  9. data/lib/pricecut/elements/h5.rb +9 -0
  10. data/lib/pricecut/elements/h6.rb +9 -0
  11. data/lib/pricecut/elements/img.rb +12 -0
  12. data/lib/pricecut/elements/li.rb +14 -0
  13. data/lib/pricecut/elements/ol.rb +12 -0
  14. data/lib/pricecut/elements/p.rb +11 -0
  15. data/lib/pricecut/elements/strong.rb +12 -0
  16. data/lib/pricecut/elements/text.rb +9 -0
  17. data/lib/pricecut/markdown_visitor.rb +31 -0
  18. data/lib/pricecut/version.rb +1 -1
  19. data/lib/pricecut.rb +22 -3
  20. data/pricecut.gemspec +4 -0
  21. data/spec/pricecut/elements/a_spec.rb +20 -0
  22. data/spec/pricecut/elements/blockquote_spec.rb +20 -0
  23. data/spec/pricecut/elements/element_spec.rb +43 -0
  24. data/spec/pricecut/elements/em_spec.rb +20 -0
  25. data/spec/pricecut/elements/h1_spec.rb +20 -0
  26. data/spec/pricecut/elements/h2_spec.rb +20 -0
  27. data/spec/pricecut/elements/h3_spec.rb +20 -0
  28. data/spec/pricecut/elements/h4_spec.rb +20 -0
  29. data/spec/pricecut/elements/h5_spec.rb +20 -0
  30. data/spec/pricecut/elements/h6_spec.rb +20 -0
  31. data/spec/pricecut/elements/img_spec.rb +20 -0
  32. data/spec/pricecut/elements/li_spec.rb +36 -0
  33. data/spec/pricecut/elements/ol_spec.rb +20 -0
  34. data/spec/pricecut/elements/p_spec.rb +20 -0
  35. data/spec/pricecut/elements/strong_spec.rb +20 -0
  36. data/spec/pricecut/elements/text_spec.rb +20 -0
  37. data/spec/pricecut/markdown_visitor_spec.rb +81 -0
  38. data/spec/pricecut/pricecut_spec.rb +57 -0
  39. data/spec/spec_helper.rb +13 -0
  40. metadata +82 -5
@@ -0,0 +1,12 @@
1
+ module Pricecut
2
+ module Elements
3
+ class A < Element
4
+ def output!
5
+ text = node.text
6
+ href = node["href"]
7
+
8
+ p "[#{ text }](#{ href })"
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,9 @@
1
+ module Pricecut
2
+ module Elements
3
+ class Blockquote < Element
4
+ def output!
5
+ p "> "; yield_children
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,28 @@
1
+ module Pricecut
2
+ module Elements
3
+ class Element
4
+ attr_accessor :visitor, :node
5
+
6
+ def initialize(visitor, node)
7
+ @visitor = visitor
8
+ @node = node
9
+ end
10
+
11
+ def append_newline
12
+ append_output("\n")
13
+ end
14
+
15
+ alias_method :eol, :append_newline
16
+
17
+ def append_output(text)
18
+ visitor.append_output(text)
19
+ end
20
+
21
+ alias_method :p, :append_output
22
+
23
+ def yield_children
24
+ visitor.visit_children(node)
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,12 @@
1
+ module Pricecut
2
+ module Elements
3
+ class Em < Element
4
+ def output!
5
+ p "_"; yield_children; p "_"
6
+ end
7
+ end
8
+
9
+ # <i> tag is the same as <em>
10
+ class I < Em; end
11
+ end
12
+ end
@@ -0,0 +1,9 @@
1
+ module Pricecut
2
+ module Elements
3
+ class H1 < Element
4
+ def output!
5
+ p "# "; yield_children; p " #"; eol
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Pricecut
2
+ module Elements
3
+ class H2 < Element
4
+ def output!
5
+ p "## "; yield_children; p " ##"; eol
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Pricecut
2
+ module Elements
3
+ class H3 < Element
4
+ def output!
5
+ p "### "; yield_children; p " ###"; eol
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Pricecut
2
+ module Elements
3
+ class H4 < Element
4
+ def output!
5
+ p "#### "; yield_children; p " ####"; eol
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Pricecut
2
+ module Elements
3
+ class H5 < Element
4
+ def output!
5
+ p "##### "; yield_children; p " #####"; eol
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Pricecut
2
+ module Elements
3
+ class H6 < Element
4
+ def output!
5
+ p "###### "; yield_children; p " ######"; eol
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,12 @@
1
+ module Pricecut
2
+ module Elements
3
+ class Img < Element
4
+ def output!
5
+ alt = node["alt"]
6
+ src = node["src"]
7
+
8
+ p "![#{ alt }](#{ src })"
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,14 @@
1
+ module Pricecut
2
+ module Elements
3
+ class Li < Element
4
+ def output!
5
+ case node.parent.name
6
+ when "ol"
7
+ p "1. "; yield_children; eol
8
+ when "ul"
9
+ p "- "; yield_children; eol
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,12 @@
1
+ module Pricecut
2
+ module Elements
3
+ class Ol < Element
4
+ def output!
5
+ eol; yield_children; eol
6
+ end
7
+ end
8
+
9
+ # <ol> and <ul> act the same, the differences are in <li>
10
+ class Ul < Ol; end
11
+ end
12
+ end
@@ -0,0 +1,11 @@
1
+ module Pricecut
2
+ module Elements
3
+ class P < Element
4
+ def output!
5
+ yield_children; eol
6
+ end
7
+ end
8
+
9
+ class Div < P; end
10
+ end
11
+ end
@@ -0,0 +1,12 @@
1
+ module Pricecut
2
+ module Elements
3
+ class Strong < Element
4
+ def output!
5
+ p "**"; yield_children; p "**"
6
+ end
7
+ end
8
+
9
+ # <b> tag is the same as <strong>
10
+ class B < Strong; end
11
+ end
12
+ end
@@ -0,0 +1,9 @@
1
+ module Pricecut
2
+ module Elements
3
+ class Text < Element
4
+ def output!
5
+ p node.text.strip
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,31 @@
1
+ require "nokogiri"
2
+
3
+ module Pricecut
4
+ class MarkdownVisitor
5
+ attr_reader :output
6
+
7
+ def initialize
8
+ @output = ""
9
+ end
10
+
11
+ def visit(node)
12
+ begin
13
+ element = Pricecut::Elements.const_get(node.name.capitalize)
14
+ element.new(self, node).output!
15
+ rescue NameError
16
+ # Unsupported element, continue visiting children.
17
+ visit_children(node)
18
+ end
19
+
20
+ self
21
+ end
22
+
23
+ def append_output(string)
24
+ @output << string
25
+ end
26
+
27
+ def visit_children(node)
28
+ node.children.each {|child| child.accept(self) }
29
+ end
30
+ end
31
+ end
@@ -1,3 +1,3 @@
1
1
  module Pricecut
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
data/lib/pricecut.rb CHANGED
@@ -1,5 +1,24 @@
1
- require "pricecut/version"
1
+ require "pricecut/markdown_visitor"
2
+ require "pricecut/elements/element"
3
+ require "pricecut/elements/strong"
4
+ require "pricecut/elements/em"
5
+ require "pricecut/elements/ol"
6
+ require "pricecut/elements/li"
7
+ require "pricecut/elements/p"
8
+ require "pricecut/elements/img"
9
+ require "pricecut/elements/blockquote"
10
+ require "pricecut/elements/h1"
11
+ require "pricecut/elements/h2"
12
+ require "pricecut/elements/h3"
13
+ require "pricecut/elements/h4"
14
+ require "pricecut/elements/h5"
15
+ require "pricecut/elements/h6"
16
+ require "pricecut/elements/text"
17
+ require "pricecut/elements/a"
2
18
 
3
19
  module Pricecut
4
- # Your code goes here...
5
- end
20
+ def self.parse(html)
21
+ root = Nokogiri::HTML::DocumentFragment.parse(html)
22
+ MarkdownVisitor.new.visit(root).output
23
+ end
24
+ end
data/pricecut.gemspec CHANGED
@@ -14,4 +14,8 @@ Gem::Specification.new do |gem|
14
14
  gem.name = "pricecut"
15
15
  gem.require_paths = ["lib"]
16
16
  gem.version = Pricecut::VERSION
17
+
18
+ gem.add_runtime_dependency "nokogiri"
19
+
20
+ gem.add_development_dependency "rspec"
17
21
  end
@@ -0,0 +1,20 @@
1
+ require "spec_helper"
2
+ require "pricecut"
3
+
4
+ describe Pricecut::Elements::A do
5
+ let(:visitor) { Pricecut::MarkdownVisitor.new }
6
+
7
+ let(:root) do
8
+ parse %<<a href="http://example.com">Example</a>>
9
+ end
10
+
11
+ subject { described_class.new(visitor, root) }
12
+
13
+ describe "#output!" do
14
+ it "appends a Markdown link to the output" do
15
+ subject.output!
16
+
17
+ visitor.output.should eq("[Example](http://example.com)")
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,20 @@
1
+ require "spec_helper"
2
+ require "pricecut"
3
+
4
+ describe Pricecut::Elements::Blockquote do
5
+ let(:visitor) { Pricecut::MarkdownVisitor.new }
6
+
7
+ let(:root) do
8
+ parse %<<blockquote>Blockquote</blockquote>>
9
+ end
10
+
11
+ subject { described_class.new(visitor, root) }
12
+
13
+ describe "#output!" do
14
+ it "appends a Markdown blockquote to the output" do
15
+ subject.output!
16
+
17
+ visitor.output.should eq("> Blockquote")
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,43 @@
1
+ require "spec_helper"
2
+ require "pricecut"
3
+
4
+ describe Pricecut::Elements::Element do
5
+ let(:visitor) { Pricecut::MarkdownVisitor.new }
6
+ let(:node) { parse "<strong><em>I am strongly emphasized.</em></strong>" }
7
+
8
+ subject { described_class.new(visitor, node) }
9
+
10
+ describe "#initialize" do
11
+ it "initializes the visitor" do
12
+ subject.visitor.should be(visitor)
13
+ end
14
+
15
+ it "initializes the node" do
16
+ subject.node.should be(node)
17
+ end
18
+ end
19
+
20
+ describe "#append_newline" do
21
+ it "appends a newline to the output" do
22
+ subject.append_newline
23
+
24
+ visitor.output.should eq("\n")
25
+ end
26
+ end
27
+
28
+ describe "#append_output" do
29
+ it "appends output to the output" do
30
+ subject.append_output("Output")
31
+
32
+ visitor.output.should eq("Output")
33
+ end
34
+ end
35
+
36
+ describe "#yield_children" do
37
+ it "writes the output of the child nodes to the output" do
38
+ subject.yield_children
39
+
40
+ visitor.output.should eq("_I am strongly emphasized._")
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,20 @@
1
+ require "spec_helper"
2
+ require "pricecut"
3
+
4
+ describe Pricecut::Elements::Em do
5
+ let(:visitor) { Pricecut::MarkdownVisitor.new }
6
+
7
+ let(:root) do
8
+ parse %<<em>Emphasized.</em>>
9
+ end
10
+
11
+ subject { described_class.new(visitor, root) }
12
+
13
+ describe "#output!" do
14
+ it "appends a Markdown emphasis to the output" do
15
+ subject.output!
16
+
17
+ visitor.output.should eq("_Emphasized._")
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,20 @@
1
+ require "spec_helper"
2
+ require "pricecut"
3
+
4
+ describe Pricecut::Elements::H1 do
5
+ let(:visitor) { Pricecut::MarkdownVisitor.new }
6
+
7
+ let(:root) do
8
+ parse %<<h1>Heading</h1>>
9
+ end
10
+
11
+ subject { described_class.new(visitor, root) }
12
+
13
+ describe "#output!" do
14
+ it "appends a Markdown header with newline to the output" do
15
+ subject.output!
16
+
17
+ visitor.output.should eq("# Heading #\n")
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,20 @@
1
+ require "spec_helper"
2
+ require "pricecut"
3
+
4
+ describe Pricecut::Elements::H2 do
5
+ let(:visitor) { Pricecut::MarkdownVisitor.new }
6
+
7
+ let(:root) do
8
+ parse %<<h2>Heading</h2>>
9
+ end
10
+
11
+ subject { described_class.new(visitor, root) }
12
+
13
+ describe "#output!" do
14
+ it "appends a Markdown header with newline to the output" do
15
+ subject.output!
16
+
17
+ visitor.output.should eq("## Heading ##\n")
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,20 @@
1
+ require "spec_helper"
2
+ require "pricecut"
3
+
4
+ describe Pricecut::Elements::H3 do
5
+ let(:visitor) { Pricecut::MarkdownVisitor.new }
6
+
7
+ let(:root) do
8
+ parse %<<h3>Heading</h3>>
9
+ end
10
+
11
+ subject { described_class.new(visitor, root) }
12
+
13
+ describe "#output!" do
14
+ it "appends a Markdown header with newline to the output" do
15
+ subject.output!
16
+
17
+ visitor.output.should eq("### Heading ###\n")
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,20 @@
1
+ require "spec_helper"
2
+ require "pricecut"
3
+
4
+ describe Pricecut::Elements::H4 do
5
+ let(:visitor) { Pricecut::MarkdownVisitor.new }
6
+
7
+ let(:root) do
8
+ parse %<<h4>Heading</h4>>
9
+ end
10
+
11
+ subject { described_class.new(visitor, root) }
12
+
13
+ describe "#output!" do
14
+ it "appends a Markdown header with newline to the output" do
15
+ subject.output!
16
+
17
+ visitor.output.should eq("#### Heading ####\n")
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,20 @@
1
+ require "spec_helper"
2
+ require "pricecut"
3
+
4
+ describe Pricecut::Elements::H5 do
5
+ let(:visitor) { Pricecut::MarkdownVisitor.new }
6
+
7
+ let(:root) do
8
+ parse %<<h5>Heading</h5>>
9
+ end
10
+
11
+ subject { described_class.new(visitor, root) }
12
+
13
+ describe "#output!" do
14
+ it "appends a Markdown header with newline to the output" do
15
+ subject.output!
16
+
17
+ visitor.output.should eq("##### Heading #####\n")
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,20 @@
1
+ require "spec_helper"
2
+ require "pricecut"
3
+
4
+ describe Pricecut::Elements::H6 do
5
+ let(:visitor) { Pricecut::MarkdownVisitor.new }
6
+
7
+ let(:root) do
8
+ parse %<<h6>Heading</h6>>
9
+ end
10
+
11
+ subject { described_class.new(visitor, root) }
12
+
13
+ describe "#output!" do
14
+ it "appends a Markdown header with newline to the output" do
15
+ subject.output!
16
+
17
+ visitor.output.should eq("###### Heading ######\n")
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,20 @@
1
+ require "spec_helper"
2
+ require "pricecut"
3
+
4
+ describe Pricecut::Elements::Img do
5
+ let(:visitor) { Pricecut::MarkdownVisitor.new }
6
+
7
+ let(:root) do
8
+ parse %<<img alt="Image" src="image.png" />>
9
+ end
10
+
11
+ subject { described_class.new(visitor, root) }
12
+
13
+ describe "#output!" do
14
+ it "appends a Markdown image to the output" do
15
+ subject.output!
16
+
17
+ visitor.output.should eq("![Image](image.png)")
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,36 @@
1
+ require "spec_helper"
2
+ require "pricecut"
3
+
4
+ describe Pricecut::Elements::Li do
5
+ describe "#output" do
6
+ let(:visitor) { Pricecut::MarkdownVisitor.new }
7
+
8
+ subject { described_class.new(visitor, root) }
9
+
10
+ describe "when in an ordered list" do
11
+ let(:root) do
12
+ # We need to grab the first child to grab the <li>.
13
+ parse(%<<ol><li>Ordered List<li></ol>>).children.first
14
+ end
15
+
16
+ it "appends a Markdown ordered list item with newline to the output" do
17
+ subject.output!
18
+
19
+ visitor.output.should eq("1. Ordered List\n")
20
+ end
21
+ end
22
+
23
+ describe "when in an unordered list" do
24
+ let(:root) do
25
+ # We need to grab the first child to grab the <li>.
26
+ parse(%<<ul><li>Unordered List<li></ul>>).children.first
27
+ end
28
+
29
+ it "appends a Markdown ordered list item with newline to the output" do
30
+ subject.output!
31
+
32
+ visitor.output.should eq("- Unordered List\n")
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,20 @@
1
+ require "spec_helper"
2
+ require "pricecut"
3
+
4
+ describe Pricecut::Elements::Ol do
5
+ let(:visitor) { Pricecut::MarkdownVisitor.new }
6
+
7
+ let(:root) do
8
+ parse %<<ol>Ordered List.</ol>>
9
+ end
10
+
11
+ subject { described_class.new(visitor, root) }
12
+
13
+ describe "#output!" do
14
+ it "appends a newline wrapped list to the output" do
15
+ subject.output!
16
+
17
+ visitor.output.should eq("\nOrdered List.\n")
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,20 @@
1
+ require "spec_helper"
2
+ require "pricecut"
3
+
4
+ describe Pricecut::Elements::P do
5
+ let(:visitor) { Pricecut::MarkdownVisitor.new }
6
+
7
+ let(:root) do
8
+ parse %<<p>Paragraph.</p>>
9
+ end
10
+
11
+ subject { described_class.new(visitor, root) }
12
+
13
+ describe "#output!" do
14
+ it "appends the text and a newline to the output" do
15
+ subject.output!
16
+
17
+ visitor.output.should eq("Paragraph.\n")
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,20 @@
1
+ require "spec_helper"
2
+ require "pricecut"
3
+
4
+ describe Pricecut::Elements::Strong do
5
+ let(:visitor) { Pricecut::MarkdownVisitor.new }
6
+
7
+ let(:root) do
8
+ parse %<<strong>Strong.</strong>>
9
+ end
10
+
11
+ subject { described_class.new(visitor, root) }
12
+
13
+ describe "#output!" do
14
+ it "appends a Markdown strong to the output" do
15
+ subject.output!
16
+
17
+ visitor.output.should eq("**Strong.**")
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,20 @@
1
+ require "spec_helper"
2
+ require "pricecut"
3
+
4
+ describe Pricecut::Elements::Text do
5
+ let(:visitor) { Pricecut::MarkdownVisitor.new }
6
+
7
+ let(:root) do
8
+ parse %<\n\nText.\n\n>
9
+ end
10
+
11
+ subject { described_class.new(visitor, root) }
12
+
13
+ describe "#output!" do
14
+ it "appends the whitespace-stripped text to the output" do
15
+ subject.output!
16
+
17
+ visitor.output.should eq("Text.")
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,81 @@
1
+ require "spec_helper"
2
+ require "pricecut"
3
+
4
+ describe Pricecut::MarkdownVisitor do
5
+ describe "#initialize" do
6
+ it "initializes the output" do
7
+ described_class.new.output.should_not be_nil
8
+ end
9
+ end
10
+
11
+ describe "#visit" do
12
+ let(:node) { parse "<test><strong>Test</strong></test>" }
13
+
14
+ describe "with supported element" do
15
+ before do
16
+ # Define the element class so that
17
+ # it is supported.
18
+ # Maps to a <test> element.
19
+ module Pricecut
20
+ module Elements
21
+ class Test < Element
22
+ def output!
23
+ p "?? "; yield_children; p " ??"
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+
30
+ it "writes the output of the element to output" do
31
+ subject.visit(node)
32
+
33
+ subject.output.should eq("?? **Test** ??")
34
+ end
35
+ end
36
+
37
+ describe "with unsupported element" do
38
+ before do
39
+ # Remove Test from the supported elements
40
+ Pricecut::Elements.send(:remove_const, "Test")
41
+ end
42
+ it "skips the unsupported element" do
43
+ subject.visit(node)
44
+
45
+ subject.output.should eq("**Test**")
46
+ end
47
+ end
48
+ end
49
+
50
+ describe "#append_output" do
51
+ it "appends text to the output" do
52
+ subject.append_output("Output")
53
+
54
+ subject.output.should eq("Output")
55
+ end
56
+ end
57
+
58
+ describe "#visit_children" do
59
+ before do
60
+ class Node
61
+ attr_reader :visited
62
+
63
+ def accept(visitor)
64
+ @visited = true
65
+ end
66
+
67
+ def children
68
+ @children ||= (1..3).map { Node.new }
69
+ end
70
+ end
71
+ end
72
+
73
+ let(:node) { Node.new }
74
+
75
+ it "visits the children of the node" do
76
+ subject.visit_children(node)
77
+
78
+ node.children.all?(&:visited).should be_true
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,57 @@
1
+ require "pricecut"
2
+
3
+ describe Pricecut do
4
+ describe ".parse" do
5
+ it "parses HTML into Markdown" do
6
+ html = <<-HTML.unindent
7
+ <h1>H1</h1>
8
+ <h2>H2</h2>
9
+ <h3>H3</h3>
10
+ <h4>H4</h4>
11
+ <h5>H5</h5>
12
+ <h6>H6</h6>
13
+
14
+ <p>Paragraph</p>
15
+
16
+ <ol><li>This is an ordered list.</li></ol>
17
+
18
+ <ul><li>This is an unordered list.</li></ul>
19
+
20
+ <p><em>This is emphasized.</em></p>
21
+ <p><i>This is italic.</em></p>
22
+
23
+ <p><strong>This is strong.</strong></p>
24
+ <p><b>This is bold.</b></p>
25
+
26
+ <blockquote><p>This is a blockquote.</p></blockquote>
27
+
28
+ <p><img alt="Image" src="image.png" /></p>
29
+
30
+ <p><a href="http://example.com">Example</a></p>
31
+ HTML
32
+
33
+ Pricecut.parse(html).should eq <<-MARKDOWN.unindent
34
+ # H1 #
35
+ ## H2 ##
36
+ ### H3 ###
37
+ #### H4 ####
38
+ ##### H5 #####
39
+ ###### H6 ######
40
+ Paragraph
41
+
42
+ 1. This is an ordered list.
43
+
44
+
45
+ - This is an unordered list.
46
+
47
+ _This is emphasized._
48
+ _This is italic._
49
+ **This is strong.**
50
+ **This is bold.**
51
+ > This is a blockquote.
52
+ ![Image](image.png)
53
+ [Example](http://example.com)
54
+ MARKDOWN
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,13 @@
1
+ def parse(html)
2
+ Nokogiri::HTML::DocumentFragment.parse(html).children.first
3
+ end
4
+
5
+ class String
6
+ # Strip leading whitespace from each line that is the same as the
7
+ # amount of whitespace on the first line of the string.
8
+ # Leaves _additional_ indentation on later lines intact.
9
+ # @see http://stackoverflow.com/q/3772864
10
+ def unindent
11
+ gsub /^#{self[/\A\s*/]}/, ''
12
+ end
13
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pricecut
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,7 +10,29 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
  date: 2012-06-11 00:00:00.000000000 Z
13
- dependencies: []
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: nokogiri
16
+ requirement: &70324877374400 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *70324877374400
25
+ - !ruby/object:Gem::Dependency
26
+ name: rspec
27
+ requirement: &70324877373980 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: *70324877373980
14
36
  description: Pricecut takes your HTML and marks it down.
15
37
  email:
16
38
  - adam@adamtanner.org
@@ -24,8 +46,44 @@ files:
24
46
  - README.md
25
47
  - Rakefile
26
48
  - lib/pricecut.rb
49
+ - lib/pricecut/elements/a.rb
50
+ - lib/pricecut/elements/blockquote.rb
51
+ - lib/pricecut/elements/element.rb
52
+ - lib/pricecut/elements/em.rb
53
+ - lib/pricecut/elements/h1.rb
54
+ - lib/pricecut/elements/h2.rb
55
+ - lib/pricecut/elements/h3.rb
56
+ - lib/pricecut/elements/h4.rb
57
+ - lib/pricecut/elements/h5.rb
58
+ - lib/pricecut/elements/h6.rb
59
+ - lib/pricecut/elements/img.rb
60
+ - lib/pricecut/elements/li.rb
61
+ - lib/pricecut/elements/ol.rb
62
+ - lib/pricecut/elements/p.rb
63
+ - lib/pricecut/elements/strong.rb
64
+ - lib/pricecut/elements/text.rb
65
+ - lib/pricecut/markdown_visitor.rb
27
66
  - lib/pricecut/version.rb
28
67
  - pricecut.gemspec
68
+ - spec/pricecut/elements/a_spec.rb
69
+ - spec/pricecut/elements/blockquote_spec.rb
70
+ - spec/pricecut/elements/element_spec.rb
71
+ - spec/pricecut/elements/em_spec.rb
72
+ - spec/pricecut/elements/h1_spec.rb
73
+ - spec/pricecut/elements/h2_spec.rb
74
+ - spec/pricecut/elements/h3_spec.rb
75
+ - spec/pricecut/elements/h4_spec.rb
76
+ - spec/pricecut/elements/h5_spec.rb
77
+ - spec/pricecut/elements/h6_spec.rb
78
+ - spec/pricecut/elements/img_spec.rb
79
+ - spec/pricecut/elements/li_spec.rb
80
+ - spec/pricecut/elements/ol_spec.rb
81
+ - spec/pricecut/elements/p_spec.rb
82
+ - spec/pricecut/elements/strong_spec.rb
83
+ - spec/pricecut/elements/text_spec.rb
84
+ - spec/pricecut/markdown_visitor_spec.rb
85
+ - spec/pricecut/pricecut_spec.rb
86
+ - spec/spec_helper.rb
29
87
  homepage: ''
30
88
  licenses: []
31
89
  post_install_message:
@@ -40,7 +98,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
40
98
  version: '0'
41
99
  segments:
42
100
  - 0
43
- hash: -4071648089060975588
101
+ hash: -2120063507989546998
44
102
  required_rubygems_version: !ruby/object:Gem::Requirement
45
103
  none: false
46
104
  requirements:
@@ -49,11 +107,30 @@ required_rubygems_version: !ruby/object:Gem::Requirement
49
107
  version: '0'
50
108
  segments:
51
109
  - 0
52
- hash: -4071648089060975588
110
+ hash: -2120063507989546998
53
111
  requirements: []
54
112
  rubyforge_project:
55
113
  rubygems_version: 1.8.7
56
114
  signing_key:
57
115
  specification_version: 3
58
116
  summary: Pricecut takes your HTML and marks it down.
59
- test_files: []
117
+ test_files:
118
+ - spec/pricecut/elements/a_spec.rb
119
+ - spec/pricecut/elements/blockquote_spec.rb
120
+ - spec/pricecut/elements/element_spec.rb
121
+ - spec/pricecut/elements/em_spec.rb
122
+ - spec/pricecut/elements/h1_spec.rb
123
+ - spec/pricecut/elements/h2_spec.rb
124
+ - spec/pricecut/elements/h3_spec.rb
125
+ - spec/pricecut/elements/h4_spec.rb
126
+ - spec/pricecut/elements/h5_spec.rb
127
+ - spec/pricecut/elements/h6_spec.rb
128
+ - spec/pricecut/elements/img_spec.rb
129
+ - spec/pricecut/elements/li_spec.rb
130
+ - spec/pricecut/elements/ol_spec.rb
131
+ - spec/pricecut/elements/p_spec.rb
132
+ - spec/pricecut/elements/strong_spec.rb
133
+ - spec/pricecut/elements/text_spec.rb
134
+ - spec/pricecut/markdown_visitor_spec.rb
135
+ - spec/pricecut/pricecut_spec.rb
136
+ - spec/spec_helper.rb