reverse_markdown 0.4.7 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.travis.yml +2 -3
  4. data/LICENSE +13 -0
  5. data/README.md +69 -30
  6. data/bin/reverse_markdown +1 -1
  7. data/lib/reverse_markdown/cleaner.rb +66 -0
  8. data/lib/reverse_markdown/config.rb +20 -0
  9. data/lib/reverse_markdown/converters/a.rb +19 -0
  10. data/lib/reverse_markdown/converters/base.rb +24 -0
  11. data/lib/reverse_markdown/converters/blockquote.rb +13 -0
  12. data/lib/reverse_markdown/converters/br.rb +11 -0
  13. data/lib/reverse_markdown/converters/code.rb +11 -0
  14. data/lib/reverse_markdown/converters/div.rb +11 -0
  15. data/lib/reverse_markdown/converters/dump.rb +9 -0
  16. data/lib/reverse_markdown/converters/em.rb +21 -0
  17. data/lib/reverse_markdown/converters/h.rb +17 -0
  18. data/lib/reverse_markdown/converters/hr.rb +11 -0
  19. data/lib/reverse_markdown/converters/img.rb +14 -0
  20. data/lib/reverse_markdown/converters/li.rb +28 -0
  21. data/lib/reverse_markdown/converters/ol.rb +12 -0
  22. data/lib/reverse_markdown/converters/p.rb +11 -0
  23. data/lib/reverse_markdown/converters/pass_through.rb +14 -0
  24. data/lib/reverse_markdown/converters/pre.rb +17 -0
  25. data/lib/reverse_markdown/converters/strong.rb +21 -0
  26. data/lib/reverse_markdown/converters/table.rb +11 -0
  27. data/lib/reverse_markdown/converters/td.rb +13 -0
  28. data/lib/reverse_markdown/converters/text.rb +30 -0
  29. data/lib/reverse_markdown/converters/tr.rb +21 -0
  30. data/lib/reverse_markdown/converters.rb +22 -0
  31. data/lib/reverse_markdown/errors.rb +6 -2
  32. data/lib/reverse_markdown/version.rb +1 -1
  33. data/lib/reverse_markdown.rb +40 -8
  34. data/reverse_markdown.gemspec +3 -1
  35. data/spec/assets/lists.html +24 -0
  36. data/spec/assets/unknown_tags.html +9 -0
  37. data/spec/components/anchors_spec.rb +5 -5
  38. data/spec/components/basic_spec.rb +5 -5
  39. data/spec/components/code_spec.rb +5 -5
  40. data/spec/components/escapables_spec.rb +3 -3
  41. data/spec/components/from_the_wild_spec.rb +5 -5
  42. data/spec/components/html_fragment_spec.rb +2 -2
  43. data/spec/components/lists_spec.rb +18 -7
  44. data/spec/components/paragraphs_spec.rb +2 -2
  45. data/spec/components/quotation_spec.rb +5 -5
  46. data/spec/components/tables_spec.rb +2 -2
  47. data/spec/components/unknown_tags_spec.rb +21 -0
  48. data/spec/html_to_markdown_to_html_spec.rb +1 -2
  49. data/spec/lib/reverse_markdown/cleaner_spec.rb +76 -0
  50. data/spec/lib/reverse_markdown/converters/blockquote_spec.rb +18 -0
  51. data/spec/lib/reverse_markdown/converters/br_spec.rb +9 -0
  52. data/spec/lib/reverse_markdown_spec.rb +37 -0
  53. data/spec/spec_helper.rb +9 -1
  54. metadata +83 -24
  55. data/License-MIT +0 -7
  56. data/lib/reverse_markdown/mapper.rb +0 -241
  57. data/spec/mapper_spec.rb +0 -63
  58. data/spec/reverse_markdown_spec.rb +0 -18
@@ -0,0 +1,22 @@
1
+ module ReverseMarkdown
2
+ module Converters
3
+ def self.register(tag_name, converter)
4
+ @@converters ||= {}
5
+ @@converters[tag_name.to_sym] = converter
6
+ end
7
+
8
+ def self.lookup(tag_name)
9
+ @@converters[tag_name.to_sym] or default_converter(tag_name)
10
+ end
11
+
12
+ private
13
+
14
+ def self.default_converter(tag_name)
15
+ if ReverseMarkdown.config.ignore_unknown_tags
16
+ ReverseMarkdown::Converters::Dump.new
17
+ else
18
+ raise UnknownTagError, "unknown tag: #{tag_name}"
19
+ end
20
+ end
21
+ end
22
+ end
@@ -1,3 +1,7 @@
1
1
  module ReverseMarkdown
2
- class ParserError < StandardError; end
3
- end
2
+ class Error < StandardError
3
+ end
4
+
5
+ class UnknownTagError < Error
6
+ end
7
+ end
@@ -1,3 +1,3 @@
1
1
  module ReverseMarkdown
2
- VERSION = "0.4.7"
2
+ VERSION = "0.5.0"
3
3
  end
@@ -1,24 +1,56 @@
1
1
  require 'digest'
2
+ require 'nokogiri'
2
3
  require 'reverse_markdown/version'
3
- require 'reverse_markdown/mapper'
4
4
  require 'reverse_markdown/errors'
5
- require 'nokogiri'
5
+ require 'reverse_markdown/cleaner'
6
+ require 'reverse_markdown/config'
7
+ require 'reverse_markdown/converters'
8
+ require 'reverse_markdown/converters/base'
9
+ require 'reverse_markdown/converters/a'
10
+ require 'reverse_markdown/converters/blockquote'
11
+ require 'reverse_markdown/converters/br'
12
+ require 'reverse_markdown/converters/code'
13
+ require 'reverse_markdown/converters/div'
14
+ require 'reverse_markdown/converters/dump'
15
+ require 'reverse_markdown/converters/em'
16
+ require 'reverse_markdown/converters/h'
17
+ require 'reverse_markdown/converters/hr'
18
+ require 'reverse_markdown/converters/img'
19
+ require 'reverse_markdown/converters/li'
20
+ require 'reverse_markdown/converters/ol'
21
+ require 'reverse_markdown/converters/p'
22
+ require 'reverse_markdown/converters/pass_through'
23
+ require 'reverse_markdown/converters/pre'
24
+ require 'reverse_markdown/converters/strong'
25
+ require 'reverse_markdown/converters/table'
26
+ require 'reverse_markdown/converters/td'
27
+ require 'reverse_markdown/converters/tr'
28
+ require 'reverse_markdown/converters/text'
6
29
 
7
30
  module ReverseMarkdown
8
31
 
9
- def self.parse(input, opts={})
32
+ def self.convert(input, options = {})
10
33
  root = case input
11
34
  when String then Nokogiri::HTML(input).root
12
35
  when Nokogiri::XML::Document then input.root
13
36
  when Nokogiri::XML::Node then input
14
37
  end
15
38
 
16
- ReverseMarkdown::Mapper.new(opts).process_root(root)
39
+ root or return ''
40
+ config.apply(options)
41
+ result = ReverseMarkdown::Converters.lookup(root.name).convert(root)
42
+ config.reset
43
+ cleaner.tidy(result)
17
44
  end
18
45
 
19
- # 2012/08/11 joe: possibly deprecate in favour of #parse
20
- class << self
21
- alias parse_string parse
22
- alias parse_element parse
46
+ def self.config
47
+ @config ||= Config.new
48
+ yield @config if block_given?
49
+ @config
23
50
  end
51
+
52
+ def self.cleaner
53
+ @cleaner ||= Cleaner.new
54
+ end
55
+
24
56
  end
@@ -8,7 +8,7 @@ Gem::Specification.new do |s|
8
8
  s.authors = ["Johannes Opper"]
9
9
  s.email = ["xijo@gmx.de"]
10
10
  s.homepage = "http://github.com/xijo/reverse_markdown"
11
- s.summary = %q{Transform html code into markdown.}
11
+ s.summary = %q{Convert html code into markdown.}
12
12
  s.description = %q{Map simple html back into markdown, e.g. if you want to import existing html data in your application.}
13
13
 
14
14
  s.rubyforge_project = "reverse_markdown"
@@ -24,4 +24,6 @@ Gem::Specification.new do |s|
24
24
  s.add_development_dependency 'simplecov'
25
25
  s.add_development_dependency 'rake'
26
26
  s.add_development_dependency 'redcarpet'
27
+ s.add_development_dependency 'byebug'
28
+ s.add_development_dependency 'codeclimate-test-reporter'
27
29
  end
@@ -52,5 +52,29 @@
52
52
  <li><p>li 2, p 1</p></li>
53
53
  </ul>
54
54
 
55
+ <ol>
56
+ <li>
57
+ one
58
+ <ol>
59
+ <li>one one</li>
60
+ <li>one two</li>
61
+ </ol>
62
+ </li>
63
+ <li>
64
+ two
65
+ <ol>
66
+ <li>
67
+ two one
68
+ <ol>
69
+ <li>two one one</li>
70
+ <li>two one two</li>
71
+ </ol>
72
+ </li>
73
+ <li>two two</li>
74
+ </ol>
75
+ </li>
76
+ <li>three</li>
77
+ </ol>
78
+
55
79
  </body>
56
80
  </html>
@@ -0,0 +1,9 @@
1
+ <html>
2
+ <body>
3
+ <p>
4
+ <foo>
5
+ <bar>Foo with bar</bar>
6
+ </foo>
7
+ </p>
8
+ </body>
9
+ </html>
@@ -1,13 +1,13 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe ReverseMarkdown::Mapper do
3
+ describe ReverseMarkdown do
4
4
 
5
5
  let(:input) { File.read('spec/assets/anchors.html') }
6
6
  let(:document) { Nokogiri::HTML(input) }
7
- subject { ReverseMarkdown.parse_string(input) }
7
+ subject { ReverseMarkdown.convert(input) }
8
8
 
9
9
  it { should include ' [Foobar](http://foobar.com) ' }
10
- it { should include ' [Fubar](http://foobar.com "f***** up beyond all recognition") ' }
10
+ it { should include ' [Fubar](http://foobar.com "f\*\*\*\*\* up beyond all recognition") ' }
11
11
  it { should include ' [**Strong foobar**](http://strong.foobar.com) ' }
12
12
 
13
13
  it { should include ' ![](http://foobar.com/logo.png) ' }
@@ -18,9 +18,9 @@ describe ReverseMarkdown::Mapper do
18
18
 
19
19
  context "links to ignore" do
20
20
  it { should include ' ignore anchor tags with no link text ' }
21
- it { should include ' not ignore [ ![An Image](image.png) ](foo.html) anchor tags with images' }
21
+ it { should include ' not ignore [![An Image](image.png)](foo.html) anchor tags with images' }
22
22
  it { should include ' pass through the text of internal jumplinks without treating them as links ' }
23
23
  it { should include ' pass through the text of anchor tags with no href without treating them as links ' }
24
24
  end
25
25
 
26
- end
26
+ end
@@ -1,10 +1,10 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe ReverseMarkdown::Mapper do
3
+ describe ReverseMarkdown do
4
4
 
5
5
  let(:input) { File.read('spec/assets/basic.html') }
6
6
  let(:document) { Nokogiri::HTML(input) }
7
- subject { ReverseMarkdown.parse_string(input) }
7
+ subject { ReverseMarkdown.convert(input) }
8
8
 
9
9
  it { should match /plain text ?\n/ }
10
10
  it { should match /# h1\n/ }
@@ -25,7 +25,7 @@ describe ReverseMarkdown::Mapper do
25
25
  it { should match /before and after strong tags containing whitespace/ }
26
26
  it { should match /\*\*double strong tags\*\*/ }
27
27
  it { should match /\*\*double strong tags in p tag\*\*/ }
28
- it { should match /before \*\* double strong tags containing whitespace \*\* after/ }
28
+ it { should match /before \*\*double strong tags containing whitespace\*\* after/ }
29
29
 
30
30
  it { should match /_i tag content_/ }
31
31
  it { should match /\*\*b tag content\*\*/ }
@@ -33,7 +33,7 @@ describe ReverseMarkdown::Mapper do
33
33
  it { should match /br tags become double space followed by newline \n/ }
34
34
  #it { should match /br tags XXX \n/ }
35
35
 
36
- it { should match /\nbefore hr ?\n\* \* \*\n ?after hr\n/ }
36
+ it { should match /before hr \n\* \* \*\n after hr/ }
37
37
 
38
38
  it { should match /section 1\n ?\nsection 2/ }
39
- end
39
+ end
@@ -1,24 +1,24 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe ReverseMarkdown::Mapper do
3
+ describe ReverseMarkdown do
4
4
 
5
5
  let(:input) { File.read('spec/assets/code.html') }
6
6
  let(:document) { Nokogiri::HTML(input) }
7
- subject { ReverseMarkdown.parse_string(input) }
7
+ subject { ReverseMarkdown.convert(input) }
8
8
 
9
9
  it { should match /inline `code` block/ }
10
10
  it { should match /\ var this\;\n this\.is/ }
11
11
  it { should match /block"\)\n console/ }
12
12
 
13
13
  context "with github style code blocks" do
14
- subject { ReverseMarkdown.parse_string(input, :github_style_code_blocks => true) }
14
+ subject { ReverseMarkdown.convert(input, github_flavored: true) }
15
15
  it { should match /inline `code` block/ }
16
16
  it { should match /```\nvar this\;\nthis/ }
17
- it { should match /it is"\) ?\n\t\n```/ }
17
+ it { should match /it is"\) ?\n```/ }
18
18
  end
19
19
 
20
20
  context "code with indentation" do
21
- subject { ReverseMarkdown.parse_string(input) }
21
+ subject { ReverseMarkdown.convert(input) }
22
22
  it { should match(/^ tell application "Foo"\n/) }
23
23
  it { should match(/^ beep\n/) }
24
24
  it { should match(/^ end tell\n/) }
@@ -1,10 +1,10 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe ReverseMarkdown::Mapper do
3
+ describe ReverseMarkdown do
4
4
 
5
5
  let(:input) { File.read('spec/assets/escapables.html') }
6
6
  let(:document) { Nokogiri::HTML(input) }
7
- subject { ReverseMarkdown.parse_string(input) }
7
+ subject { ReverseMarkdown.convert(input) }
8
8
 
9
9
  context "multiple asterisks" do
10
10
  it { should include ' \*\*two asterisks\*\* ' }
@@ -19,4 +19,4 @@ describe ReverseMarkdown::Mapper do
19
19
  context "underscores within words in code blocks" do
20
20
  it { should include ' var theoretical_max_infin = 1.0;' }
21
21
  end
22
- end
22
+ end
@@ -1,16 +1,16 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe ReverseMarkdown::Mapper do
3
+ describe ReverseMarkdown do
4
4
 
5
5
  let(:input) { File.read('spec/assets/from_the_wild.html') }
6
6
  let(:document) { Nokogiri::HTML(input) }
7
- subject { ReverseMarkdown.parse_string(input) }
7
+ subject { ReverseMarkdown.convert(input) }
8
8
 
9
9
  it "should make sense of strong-crazy markup (as seen in the wild)" do
10
10
  subject.should ==
11
11
  '** .' + " \n" +
12
- '\*\*\* intentcast ** : logo design' + " \n" +
13
- '** . **'
12
+ ' \*\*\* intentcast ** : logo design' + " \n" +
13
+ "**.**\n\n"
14
14
  end
15
15
 
16
- end
16
+ end
@@ -1,10 +1,10 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe ReverseMarkdown::Mapper do
3
+ describe ReverseMarkdown do
4
4
 
5
5
  let(:input) { File.read('spec/assets/html_fragment.html') }
6
6
  let(:document) { Nokogiri::HTML(input) }
7
- subject { ReverseMarkdown.parse_string(input) }
7
+ subject { ReverseMarkdown.convert(input) }
8
8
 
9
9
  it { should == "naked text 1\n\nparagraph text\n\nnaked text 2" }
10
10
  end
@@ -1,10 +1,10 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe ReverseMarkdown::Mapper do
3
+ describe ReverseMarkdown do
4
4
 
5
5
  let(:input) { File.read('spec/assets/lists.html') }
6
6
  let(:document) { Nokogiri::HTML(input) }
7
- subject { ReverseMarkdown.parse_string(input) }
7
+ subject { ReverseMarkdown.convert(input) }
8
8
 
9
9
  it { should match /\n- unordered list entry\n/ }
10
10
  it { should match /\n- unordered list entry 2\n/ }
@@ -22,10 +22,10 @@ describe ReverseMarkdown::Mapper do
22
22
  end
23
23
 
24
24
  context "nested list with lots of whitespace" do
25
- it { should match /\n- item wa\n/ }
26
- it { should match /\n- item wb\n/ }
27
- it { should match /\n {2}- item wbb\n/ }
28
- it { should match /\n {2}- item wbc\n/ }
25
+ it { should match /\n- item wa \n/ }
26
+ it { should match /\n- item wb \n/ }
27
+ it { should match /\n - item wbb \n/ }
28
+ it { should match /\n - item wbc \n/ }
29
29
  end
30
30
 
31
31
  context "lists containing links" do
@@ -42,4 +42,15 @@ describe ReverseMarkdown::Mapper do
42
42
  xit { should match /\n- li 1, p 1\n\n- li 1, p 2\n/ }
43
43
  end
44
44
 
45
- end
45
+ context 'it produces correct numbering' do
46
+ it { should include "1. one" }
47
+ it { should include " 1. one one" }
48
+ it { should include " 2. one two" }
49
+ it { should include "2. two" }
50
+ it { should include " 1. two one" }
51
+ it { should include " 1. two one one" }
52
+ it { should include " 2. two one two" }
53
+ it { should include " 2. two two" }
54
+ it { should include "3. three" }
55
+ end
56
+ end
@@ -1,10 +1,10 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe ReverseMarkdown::Mapper do
3
+ describe ReverseMarkdown do
4
4
 
5
5
  let(:input) { File.read('spec/assets/paragraphs.html') }
6
6
  let(:document) { Nokogiri::HTML(input) }
7
- subject { ReverseMarkdown.parse_string(input) }
7
+ subject { ReverseMarkdown.convert(input) }
8
8
 
9
9
  it { should_not start_with "\n\n" }
10
10
  it { should start_with "First content\n\nSecond content\n\n" }
@@ -1,12 +1,12 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe ReverseMarkdown::Mapper do
3
+ describe ReverseMarkdown do
4
4
 
5
5
  let(:input) { File.read('spec/assets/quotation.html') }
6
6
  let(:document) { Nokogiri::HTML(input) }
7
- subject { ReverseMarkdown.parse_string(input) }
7
+ subject { ReverseMarkdown.convert(input) }
8
8
 
9
- it { should include "\n Block of code" }
10
- it { should include "\n> First quoted paragraph\n\n> Second quoted paragraph" }
9
+ it { should match /^ Block of code$/ }
10
+ it { should include "\n> First quoted paragraph\n> \n> Second quoted paragraph" }
11
11
 
12
- end
12
+ end
@@ -1,10 +1,10 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe ReverseMarkdown::Mapper do
3
+ describe ReverseMarkdown do
4
4
 
5
5
  let(:input) { File.read('spec/assets/tables.html') }
6
6
  let(:document) { Nokogiri::HTML(input) }
7
- subject { ReverseMarkdown.parse_string(input) }
7
+ subject { ReverseMarkdown.convert(input) }
8
8
 
9
9
  it { should match /\n\| header 1 \| header 2 \| header 3 \|\n\| --- \| --- \| --- \|\n/ }
10
10
  it { should match /\n\| data 1-1 \| data 2-1 \| data 3-1 \|\n/ }
@@ -0,0 +1,21 @@
1
+ require 'spec_helper'
2
+
3
+ describe ReverseMarkdown do
4
+
5
+ let(:input) { File.read('spec/assets/unknown_tags.html') }
6
+ let(:document) { Nokogiri::HTML(input) }
7
+ let(:result) { ReverseMarkdown.convert(input) }
8
+
9
+ context 'with ignore_unknown_tags enabled' do
10
+ before { ReverseMarkdown.config.ignore_unknown_tags = true }
11
+
12
+ it { result.should include "<foo><bar>Foo with bar</bar></foo>" }
13
+ end
14
+
15
+ context 'with ignore_unknown_tags disabled' do
16
+ before { ReverseMarkdown.config.ignore_unknown_tags = false }
17
+
18
+ it { expect { result }.to raise_error(ReverseMarkdown::UnknownTagError) }
19
+ end
20
+ end
21
+
@@ -12,7 +12,7 @@ describe 'Round trip: HTML to markdown (via reverse_markdown) to HTML (via redca
12
12
  end
13
13
 
14
14
  def html2markdown2html(orig_html)
15
- markdown = ReverseMarkdown.parse_string orig_html
15
+ markdown = ReverseMarkdown.convert orig_html
16
16
  new_html = Redcarpet::Markdown.new(Redcarpet::Render::HTML).render(markdown)
17
17
  new_html
18
18
  end
@@ -60,7 +60,6 @@ describe 'Round trip: HTML to markdown (via reverse_markdown) to HTML (via redca
60
60
  end
61
61
 
62
62
  it "should preserve links inside <strong> tags" do
63
- pending
64
63
  roundtrip_should_preserve(%{<p><strong><a href="/wiki/Western_philosophy" title="Western philosophy">Western philosophy</a></strong></p>})
65
64
  end
66
65
 
@@ -0,0 +1,76 @@
1
+ require 'spec_helper'
2
+
3
+ describe ReverseMarkdown::Cleaner do
4
+ let(:cleaner) { ReverseMarkdown::Cleaner.new }
5
+
6
+ describe '#remove_newlines' do
7
+ it 'removes more than 2 subsequent newlines' do
8
+ result = cleaner.remove_newlines("foo\n\n\nbar")
9
+ result.should eq "foo\n\nbar"
10
+ end
11
+
12
+ it 'skips single and double newlines' do
13
+ result = cleaner.remove_newlines("foo\nbar\n\nbaz")
14
+ result.should eq "foo\nbar\n\nbaz"
15
+ end
16
+ end
17
+
18
+ describe '#remove_inner_whitespaces' do
19
+ it 'removes duplicate whitespaces from the string' do
20
+ result = cleaner.remove_inner_whitespaces('foo bar')
21
+ result.should eq "foo bar"
22
+ end
23
+
24
+ it 'performs changes for multiple lines' do
25
+ result = cleaner.remove_inner_whitespaces("foo bar\nbar foo")
26
+ result.should eq "foo bar\nbar foo"
27
+ end
28
+
29
+ it 'keeps leading whitespaces' do
30
+ result = cleaner.remove_inner_whitespaces(" foo bar\n bar foo")
31
+ result.should eq " foo bar\n bar foo"
32
+ end
33
+
34
+ it 'keeps trailing whitespaces' do
35
+ result = cleaner.remove_inner_whitespaces("foo \n")
36
+ result.should eq "foo \n"
37
+ end
38
+
39
+ it 'keeps trailing newlines' do
40
+ result = cleaner.remove_inner_whitespaces("foo\n")
41
+ result.should eq "foo\n"
42
+ end
43
+
44
+ it 'removes tabs as well' do
45
+ result = cleaner.remove_inner_whitespaces("foo\t \tbar")
46
+ result.should eq "foo bar"
47
+ end
48
+ end
49
+
50
+ describe '#clean_tag_borders' do
51
+ it 'removes not needed whitespaces from strong tags' do
52
+ input = "foo ** foobar ** bar"
53
+ result = cleaner.clean_tag_borders(input)
54
+ result.should eq "foo **foobar** bar"
55
+ end
56
+
57
+ it 'remotes leading or trailing whitespaces independently' do
58
+ input = "1 **fat ** 2 ** fat** 3"
59
+ result = cleaner.clean_tag_borders(input)
60
+ result.should eq "1 **fat** 2 **fat** 3"
61
+ end
62
+
63
+ it 'adds whitespaces if there are none' do
64
+ input = "1**fat**2"
65
+ result = cleaner.clean_tag_borders(input)
66
+ result.should eq "1 **fat** 2"
67
+ end
68
+
69
+ it 'cleans italic stuff as well' do
70
+ input = "1 __italic __ 2 __ italic__ 3__italic __4"
71
+ result = cleaner.clean_tag_borders(input)
72
+ result.should eq "1 __italic__ 2 __italic__ 3 __italic__ 4"
73
+ end
74
+ end
75
+
76
+ end
@@ -0,0 +1,18 @@
1
+ require 'spec_helper'
2
+
3
+ describe ReverseMarkdown::Converters::Blockquote do
4
+
5
+ let(:converter) { ReverseMarkdown::Converters::Blockquote.new }
6
+
7
+ it 'converts nested elements as well' do
8
+ input = Nokogiri::XML.parse("<blockquote><ul><li>foo</li></ul></blockquote>").root
9
+ result = converter.convert(input)
10
+ result.should eq "> - foo"
11
+ end
12
+
13
+ it 'can deal with paragraphs inside' do
14
+ input = Nokogiri::XML.parse("<blockquote><p>Some text.</p><p>Some more text.</p></blockquote>").root
15
+ result = converter.convert(input)
16
+ result.should eq "> Some text.\n> \n> Some more text."
17
+ end
18
+ end
@@ -0,0 +1,9 @@
1
+ require 'spec_helper'
2
+
3
+ describe ReverseMarkdown::Converters::Br do
4
+ let(:converter) { ReverseMarkdown::Converters::Br.new }
5
+
6
+ it 'just converts into two spaces and a newline' do
7
+ converter.convert(:anything).should eq " \n"
8
+ end
9
+ end
@@ -0,0 +1,37 @@
1
+ require 'spec_helper'
2
+
3
+ describe ReverseMarkdown do
4
+ let(:input) { File.read('spec/assets/minimum.html') }
5
+ let(:document) { Nokogiri::HTML(input) }
6
+
7
+ it "parses nokogiri documents" do
8
+ lambda { ReverseMarkdown.convert(document) }.should_not raise_error
9
+ end
10
+
11
+ it "parses nokogiri elements" do
12
+ lambda { ReverseMarkdown.convert(document.root) }.should_not raise_error
13
+ end
14
+
15
+ it "parses string input" do
16
+ lambda { ReverseMarkdown.convert(input) }.should_not raise_error
17
+ end
18
+
19
+ it "behaves in a sane way when root element is nil" do
20
+ ReverseMarkdown.convert(nil).should == ''
21
+ end
22
+
23
+ describe '#config' do
24
+ it 'stores a given configuration option' do
25
+ ReverseMarkdown.config.github_flavored = true
26
+ ReverseMarkdown.config.github_flavored.should be_true
27
+ end
28
+
29
+ it 'can be used as a block configurator as well' do
30
+ ReverseMarkdown.config do |config|
31
+ config.github_flavored.should be_false
32
+ config.github_flavored = true
33
+ end
34
+ ReverseMarkdown.config.github_flavored.should be_true
35
+ end
36
+ end
37
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,4 +1,8 @@
1
+ require 'codeclimate-test-reporter'
2
+ CodeClimate::TestReporter.start
3
+
1
4
  require 'simplecov'
5
+ require 'byebug'
2
6
 
3
7
  SimpleCov.adapters.define 'gem' do
4
8
  add_filter '/spec/'
@@ -11,4 +15,8 @@ require 'reverse_markdown'
11
15
 
12
16
  RSpec.configure do |config|
13
17
  config.color_enabled = true
14
- end
18
+
19
+ config.after(:each) do
20
+ ReverseMarkdown.config.reset
21
+ end
22
+ end