reverse_markdown 0.4.7 → 0.5.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.
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