reverse_markdown 1.2.0 → 2.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 69b75c5dec924f267e5861ed24edafa23a8bb12f3e03cd7068e00ae19406424b
4
- data.tar.gz: d53a1f8630a532183b491e982250a3bb175d9ed84188103535255e27ff8d39a7
3
+ metadata.gz: cffa2a16f5ad4187cb23a2e6a1015121b943f1c83a688308cf0a480ec15d3c49
4
+ data.tar.gz: 6941ad7c07005ff4d5c115fd894ee2a0cf40a09367833268f4c55c018f30263a
5
5
  SHA512:
6
- metadata.gz: '02949ddc3b08f23f07148bbda7e00a07214d3bc423ec880284c938e30fa872e305ca66fe2b1a9af796c5225dc935fa06c4e19f4085c75d5eaa0b0023eca45961'
7
- data.tar.gz: 7c58e5b6fc0560de0e3ef879685db3a8d8f541b07d471b7747492e9918a40334d84a66fcc1c8f76bff061990c661c9b53730e994b435aab28e634ff12cfd6968
6
+ metadata.gz: 620ce03beae7238accdc6836e025dc7b19fe308a7bcbcd7143dc7472d09e7d25758a3f6c2080d5d75e60fee662bc87ab200f177b5b6f41fa5958bde4b569a49e
7
+ data.tar.gz: ea69f20a1e70e4f41d6024502af362351ccaf6ec8936b4dcadc2414202e994cdf8ddf08ebbd829c0722c373bbe7e87a223c3c913bf6d845be9308ef418f3be75
data/.travis.yml CHANGED
@@ -1,23 +1,17 @@
1
- # before_install:
2
- # - gem install bundler
1
+ language: ruby
2
+ cache: bundler
3
3
 
4
4
  rvm:
5
- - 1.9.3
6
- - 2.0.0
7
- - 2.1.0
8
- - 2.1.5
9
- - 2.2.0
10
- - 2.2.4
11
- - 2.2.5
12
- - 2.3.0
13
- - 2.3.1
14
- - 2.4.2
15
- - 2.5.3
16
- - 2.6.2
5
+ - 2.0
6
+ - 2.1
7
+ - 2.2
8
+ - 2.3
9
+ - 2.4
10
+ - 2.5
11
+ - 2.6
12
+ - 2.7
17
13
  - jruby-9.2.8.0
18
14
 
19
- script: "bundle exec rake spec"
20
-
21
15
  notifications:
22
16
  disabled: false
23
17
  recipients:
data/CHANGELOG.md CHANGED
@@ -1,6 +1,23 @@
1
1
  # Change Log
2
2
  All notable changes to this project will be documented in this file.
3
3
 
4
+ ## 2.1.1 - October 2021
5
+ - Fixes unintentional newline characters within lists with paragraphs, thanks @diogoosorio, see #93
6
+ - Lets \n to be present in <pre> tag. solves #77 #78, thanks @shivabhusal
7
+
8
+ ## 2.1.0 - May 2020
9
+ - Add support for `figure` tags, see #86, thanks @anshul78
10
+
11
+ ## 2.0.0 - March 2020
12
+ - BREAKING: Dropped support for ruby 1.9.3
13
+ - Add support for `details` and `summary` tags, see #85
14
+
15
+ ## 1.4.0 – January 2020
16
+ - BREAKING: jump links will no longer be ignored but treated as links, see #82
17
+
18
+ ## 1.3.0 - September 2019
19
+ - Add support for `s` HTML tag, thanks @fauno
20
+
4
21
  ## 1.2.0 - August 2019
5
22
  - Handle windows `\r\n` within text blocks, thanks for reporting @krisdigital
6
23
  - Handle paragraphs in `li` tags, thanks @gstamp
data/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Transform html into markdown. Useful for example if you want to import html into your markdown based application.
4
4
 
5
- [![Build Status](https://secure.travis-ci.org/xijo/reverse_markdown.png?branch=master)](https://travis-ci.org/xijo/reverse_markdown) [![Gem Version](https://badge.fury.io/rb/reverse_markdown.png)](http://badge.fury.io/rb/reverse_markdown) [![Code Climate](https://codeclimate.com/github/xijo/reverse_markdown.png)](https://codeclimate.com/github/xijo/reverse_markdown) [![Code Climate](https://codeclimate.com/github/xijo/reverse_markdown/coverage.png)](https://codeclimate.com/github/xijo/reverse_markdown)
5
+ [![Build Status](https://secure.travis-ci.org/xijo/reverse_markdown.svg?branch=master)](https://travis-ci.org/xijo/reverse_markdown) [![Gem Version](https://badge.fury.io/rb/reverse_markdown.svg)](http://badge.fury.io/rb/reverse_markdown) [![Code Climate](https://codeclimate.com/github/xijo/reverse_markdown.svg)](https://codeclimate.com/github/xijo/reverse_markdown) [![Code Climate](https://codeclimate.com/github/xijo/reverse_markdown/coverage.png)](https://codeclimate.com/github/xijo/reverse_markdown)
6
6
 
7
7
  ## Changelog
8
8
 
@@ -11,7 +11,7 @@ See [Change Log](CHANGELOG.md)
11
11
  ## Requirements
12
12
 
13
13
  1. [Nokogiri](http://nokogiri.org/)
14
- 2. Ruby 1.9.3 or higher
14
+ 2. Ruby 2.0.0 or higher
15
15
 
16
16
  ## Installation
17
17
 
@@ -29,7 +29,7 @@ gem 'reverse_markdown'
29
29
 
30
30
  ## Features
31
31
 
32
- - Supports all the established html tags like `h1`, `h2`, `h3`, `h4`, `h5`, `h6`, `p`, `em`, `strong`, `i`, `b`, `blockquote`, `code`, `img`, `a`, `hr`, `li`, `ol`, `ul`, `table`, `tr`, `th`, `td`, `br`
32
+ - Supports all the established html tags like `h1`, `h2`, `h3`, `h4`, `h5`, `h6`, `p`, `em`, `strong`, `i`, `b`, `blockquote`, `code`, `img`, `a`, `hr`, `li`, `ol`, `ul`, `table`, `tr`, `th`, `td`, `br`, `figure`
33
33
  - Module based - if you miss a tag, just add it
34
34
  - Can deal with nested lists
35
35
  - Inline and block code is supported
data/Rakefile CHANGED
@@ -10,5 +10,5 @@ task :default => :spec
10
10
 
11
11
  desc 'Open an irb session preloaded with this library'
12
12
  task :console do
13
- sh 'irb -rubygems -I lib -r reverse_markdown.rb'
13
+ sh 'irb -I lib -r reverse_markdown.rb'
14
14
  end
@@ -59,6 +59,11 @@ module ReverseMarkdown
59
59
  string.gsub(/(\*\*|~~|__)\s([\.!\?'"])/, "\\1".strip + "\\2")
60
60
  end
61
61
 
62
+ def force_encoding(string)
63
+ ReverseMarkdown.config.force_encoding or return string
64
+ string.encode('UTF-8', 'binary', invalid: :replace, undef: :replace, replace: '')
65
+ end
66
+
62
67
  private
63
68
 
64
69
  def preserve_border_whitespaces(string, options = {}, &block)
@@ -1,10 +1,11 @@
1
1
  module ReverseMarkdown
2
2
  class Config
3
- attr_accessor :unknown_tags, :github_flavored, :tag_border
3
+ attr_writer :unknown_tags, :github_flavored, :tag_border, :force_encoding
4
4
 
5
5
  def initialize
6
6
  @unknown_tags = :pass_through
7
7
  @github_flavored = false
8
+ @force_encoding = false
8
9
  @em_delimiter = '_'.freeze
9
10
  @strong_delimiter = '**'.freeze
10
11
  @inline_options = {}
@@ -29,5 +30,9 @@ module ReverseMarkdown
29
30
  def tag_border
30
31
  @inline_options[:tag_border] || @tag_border
31
32
  end
33
+
34
+ def force_encoding
35
+ @inline_options[:force_encoding] || @force_encoding
36
+ end
32
37
  end
33
38
  end
@@ -6,7 +6,7 @@ module ReverseMarkdown
6
6
  href = node['href']
7
7
  title = extract_title(node)
8
8
 
9
- if href.to_s.start_with?('#') || href.to_s.empty? || name.empty?
9
+ if href.to_s.empty? || name.empty?
10
10
  name
11
11
  else
12
12
  link = "[#{name}](#{href}#{title})"
@@ -20,6 +20,7 @@ module ReverseMarkdown
20
20
  end
21
21
 
22
22
  register :strike, Del.new
23
+ register :s, Del.new
23
24
  register :del, Del.new
24
25
  end
25
26
  end
@@ -0,0 +1,25 @@
1
+ module ReverseMarkdown
2
+ module Converters
3
+ class Details < Base
4
+ def convert(node, state = {})
5
+ content = treat_children(node, state.merge(already_processed: true))
6
+ if disabled? || content.strip.empty? || state[:already_processed]
7
+ content
8
+ else
9
+ "##{content}"
10
+ end
11
+ end
12
+
13
+ def enabled?
14
+ ReverseMarkdown.config.github_flavored
15
+ end
16
+
17
+ def disabled?
18
+ !enabled?
19
+ end
20
+ end
21
+
22
+ register :details, Details.new
23
+ register :summary, Details.new
24
+ end
25
+ end
@@ -0,0 +1,15 @@
1
+ module ReverseMarkdown
2
+ module Converters
3
+ class FigCaption < Base
4
+ def convert(node, state = {})
5
+ if node.text.strip.empty?
6
+ ""
7
+ else
8
+ "\n" << "_#{node.text.strip}_" << "\n"
9
+ end
10
+ end
11
+ end
12
+
13
+ register :figcaption, FigCaption.new
14
+ end
15
+ end
@@ -0,0 +1,12 @@
1
+ module ReverseMarkdown
2
+ module Converters
3
+ class Figure < Base
4
+ def convert(node, state = {})
5
+ content = treat_children(node, state)
6
+ "\n#{content.strip}\n"
7
+ end
8
+ end
9
+
10
+ register :figure, Figure.new
11
+ end
12
+ end
@@ -2,8 +2,8 @@ module ReverseMarkdown
2
2
  module Converters
3
3
  class Li < Base
4
4
  def convert(node, state = {})
5
- contains_child_paragraph = node.children.first ? node.children.first.name == 'p' : false
6
- content_node = contains_child_paragraph ? node.children.first : node
5
+ contains_child_paragraph = node.first_element_child ? node.first_element_child.name == 'p' : false
6
+ content_node = contains_child_paragraph ? node.first_element_child : node
7
7
  content = treat_children(content_node, state)
8
8
  indentation = indentation_from(state)
9
9
  prefix = prefix_for(node)
@@ -15,8 +15,8 @@ module ReverseMarkdown
15
15
  # Override #treat as proposed in https://github.com/xijo/reverse_markdown/pull/69
16
16
  def treat(node, state)
17
17
  case node.name
18
- when 'code'
19
- node.text
18
+ when 'code', 'text'
19
+ node.text.strip
20
20
  when 'br'
21
21
  "\n"
22
22
  else
@@ -1,3 +1,3 @@
1
1
  module ReverseMarkdown
2
- VERSION = '1.2.0'
2
+ VERSION = '2.1.1'
3
3
  end
@@ -1,4 +1,3 @@
1
- require 'digest'
2
1
  require 'nokogiri'
3
2
  require 'reverse_markdown/version'
4
3
  require 'reverse_markdown/errors'
@@ -14,7 +13,10 @@ require 'reverse_markdown/converters/code'
14
13
  require 'reverse_markdown/converters/del'
15
14
  require 'reverse_markdown/converters/div'
16
15
  require 'reverse_markdown/converters/drop'
16
+ require 'reverse_markdown/converters/details'
17
17
  require 'reverse_markdown/converters/em'
18
+ require 'reverse_markdown/converters/figcaption'
19
+ require 'reverse_markdown/converters/figure'
18
20
  require 'reverse_markdown/converters/h'
19
21
  require 'reverse_markdown/converters/hr'
20
22
  require 'reverse_markdown/converters/ignore'
@@ -33,15 +35,17 @@ require 'reverse_markdown/converters/tr'
33
35
  module ReverseMarkdown
34
36
 
35
37
  def self.convert(input, options = {})
36
- root = case input
37
- when String then Nokogiri::HTML(input).root
38
- when Nokogiri::XML::Document then input.root
39
- when Nokogiri::XML::Node then input
40
- end
38
+ config.with(options) do
39
+ input = cleaner.force_encoding(input.to_s)
41
40
 
42
- root or return ''
41
+ root = case input
42
+ when String then Nokogiri::HTML(input).root
43
+ when Nokogiri::XML::Document then input.root
44
+ when Nokogiri::XML::Node then input
45
+ end
46
+
47
+ root or return ''
43
48
 
44
- config.with(options) do
45
49
  result = ReverseMarkdown::Converters.lookup(root.name).convert(root)
46
50
  cleaner.tidy(result)
47
51
  end
@@ -11,7 +11,6 @@ Gem::Specification.new do |s|
11
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
  s.licenses = ["WTFPL"]
14
- s.rubyforge_project = "reverse_markdown"
15
14
 
16
15
  s.files = `git ls-files`.split("\n")
17
16
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
@@ -24,6 +23,6 @@ Gem::Specification.new do |s|
24
23
  s.add_development_dependency 'simplecov'
25
24
  s.add_development_dependency 'rake'
26
25
  s.add_development_dependency 'kramdown'
27
- # s.add_development_dependency 'byebug'
26
+ s.add_development_dependency 'byebug'
28
27
  s.add_development_dependency 'codeclimate-test-reporter'
29
28
  end
@@ -44,6 +44,8 @@
44
44
  </li>
45
45
  </ul>
46
46
 
47
+ <ul><li> <p>I don't want to cleanup after the party!</p> </li></ul>
48
+
47
49
  <ul>
48
50
  <li>
49
51
  <p>li 1, p 1</p>
@@ -20,7 +20,7 @@ describe ReverseMarkdown do
20
20
  context "links to ignore" do
21
21
  it { is_expected.to include ' ignore anchor tags with no link text ' }
22
22
  it { is_expected.to include ' not ignore [![An Image](image.png)](foo.html) anchor tags with images' }
23
- it { is_expected.to include ' pass through the text of internal jumplinks without treating them as links ' }
23
+ it { is_expected.to include ' pass through the text of [internal jumplinks](#content) without treating them as links ' }
24
24
  it { is_expected.to include ' pass through the text of anchor tags with no href without treating them as links ' }
25
25
  end
26
26
 
@@ -35,7 +35,8 @@ describe ReverseMarkdown do
35
35
  end
36
36
 
37
37
  context "lists containing embedded <p> tags" do
38
- xit { is_expected.to match /\n- I want to have a party at my house!\n/ }
38
+ it { is_expected.to match /\n- I want to have a party at my house!\n/ }
39
+ it { is_expected.to match /\n- I don't want to cleanup after the party!\n/ }
39
40
  end
40
41
 
41
42
  context "list item containing multiple <p> tags" do
@@ -1,7 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe ReverseMarkdown do
4
-
5
4
  let(:input) { File.read('spec/assets/paragraphs.html') }
6
5
  let(:document) { Nokogiri::HTML(input) }
7
6
  subject { ReverseMarkdown.convert(input) }
@@ -1,12 +1,10 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe ReverseMarkdown do
4
-
5
4
  let(:input) { File.read('spec/assets/quotation.html') }
6
5
  let(:document) { Nokogiri::HTML(input) }
7
6
  subject { ReverseMarkdown.convert(input) }
8
7
 
9
8
  it { is_expected.to match /^ Block of code$/ }
10
9
  it { is_expected.to include "\n> First quoted paragraph\n> \n> Second quoted paragraph" }
11
-
12
10
  end
@@ -11,6 +11,11 @@ describe ReverseMarkdown::Converters::Del do
11
11
  expect(converter.convert(input)).to eq '~~deldeldel~~'
12
12
  end
13
13
 
14
+ it 'converts the input as expected' do
15
+ input = node_for('<s>strike that</s>')
16
+ expect(converter.convert(input)).to eq '~~strike that~~'
17
+ end
18
+
14
19
  it 'skips empty tags' do
15
20
  input = node_for('<del></del>')
16
21
  expect(converter.convert(input)).to eq ''
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+
3
+ describe ReverseMarkdown::Converters::Details do
4
+ let(:converter) { ReverseMarkdown::Converters::Details.new }
5
+
6
+ context 'for standard markdown' do
7
+ before { ReverseMarkdown.config.github_flavored = false }
8
+
9
+ it 'handles details tags correctly' do
10
+ node = node_for("<details>foo</details>")
11
+ expect(converter.convert(node)).to include "foo"
12
+ end
13
+ end
14
+
15
+ context 'for github_flavored markdown' do
16
+ before { ReverseMarkdown.config.github_flavored = true }
17
+
18
+ it 'handles details tags correctly' do
19
+ node = node_for("<details>foo</details>")
20
+ expect(converter.convert(node)).to include "#foo"
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,17 @@
1
+ require 'spec_helper'
2
+
3
+ describe ReverseMarkdown::Converters::Figure do
4
+
5
+ let(:converter) { ReverseMarkdown::Converters::Figure.new }
6
+
7
+ it 'handles figure tags with figcaption correctly' do
8
+ node = node_for("<figure><img src='image.jpg' alt='img_alt'><figcaption>Figure Caption</figcaption></figure>")
9
+ expect(converter.convert(node)).to eq "\n![img_alt](image.jpg)\n_Figure Caption_\n"
10
+ end
11
+
12
+ it 'handles figure tags without figcaption correctly' do
13
+ node = node_for("<figure><img src='image.jpg' alt='img_alt'></figure>")
14
+ expect(converter.convert(node)).to eq "\n![img_alt](image.jpg)\n"
15
+ end
16
+
17
+ end
@@ -12,10 +12,15 @@ describe ReverseMarkdown::Converters::Pre do
12
12
  expect(converter.convert(node)).to include " puts foo\n"
13
13
  end
14
14
 
15
- it 'preserves new lines' do
15
+ it 'preserves new lines as <br>' do
16
16
  node = node_for("<pre>one<br>two<br>three</pre>")
17
17
  expect(converter.convert(node)).to include "\n\n one\n two\n three\n\n"
18
18
  end
19
+
20
+ it 'preserves new lines as <br> and \n' do
21
+ node = node_for("<pre>one\ntwo\nthree<br>four</pre>")
22
+ expect(converter.convert(node)).to include "\n\n one\n two\n three\n four\n\n"
23
+ end
19
24
 
20
25
  it 'handles code tags correctly' do
21
26
  node = node_for("<pre><code>foobar</code></pre>")
@@ -41,6 +46,11 @@ describe ReverseMarkdown::Converters::Pre do
41
46
  expect(converter.convert(node)).to include "```\nfoo\nbar\n```"
42
47
  end
43
48
 
49
+ it 'preserves new lines as <br> and \n' do
50
+ node = node_for("<pre>one\ntwo\nthree<br>four</pre>")
51
+ expect(converter.convert(node)).to include "```\none\ntwo\nthree\nfour\n```"
52
+ end
53
+
44
54
  it 'handles code tags correctly' do
45
55
  node = node_for("<pre><code>foobar</code></pre>")
46
56
  expect(converter.convert(node)).to include "```\nfoobar\n```"
@@ -33,5 +33,15 @@ describe ReverseMarkdown do
33
33
  end
34
34
  expect(ReverseMarkdown.config.github_flavored).to eq true
35
35
  end
36
+
37
+ describe 'force_encoding option', jruby: :exclude do
38
+ it 'raises invalid byte sequence in UTF-8 exception' do
39
+ expect { ReverseMarkdown.convert("hi \255") }.to raise_error(ArgumentError)
40
+ end
41
+
42
+ it 'handles invalid byte sequence if option is set' do
43
+ expect(ReverseMarkdown.convert("hi \255", force_encoding: true)).to eq "hi\n\n"
44
+ end
45
+ end
36
46
  end
37
47
  end
data/spec/spec_helper.rb CHANGED
@@ -14,6 +14,14 @@ RSpec.configure do |config|
14
14
  config.after(:each) do
15
15
  ReverseMarkdown.instance_variable_set(:@config, nil)
16
16
  end
17
+
18
+ config.around(jruby: :exclude) do |example|
19
+ if RUBY_ENGINE == 'jruby'
20
+ example.metadata[:skip] = true
21
+ else
22
+ example.call
23
+ end
24
+ end
17
25
  end
18
26
 
19
27
  def node_for(html)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: reverse_markdown
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 2.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Johannes Opper
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-08-22 00:00:00.000000000 Z
11
+ date: 2021-10-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri
@@ -80,6 +80,20 @@ dependencies:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: byebug
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: codeclimate-test-reporter
85
99
  requirement: !ruby/object:Gem::Requirement
@@ -123,9 +137,12 @@ files:
123
137
  - lib/reverse_markdown/converters/bypass.rb
124
138
  - lib/reverse_markdown/converters/code.rb
125
139
  - lib/reverse_markdown/converters/del.rb
140
+ - lib/reverse_markdown/converters/details.rb
126
141
  - lib/reverse_markdown/converters/div.rb
127
142
  - lib/reverse_markdown/converters/drop.rb
128
143
  - lib/reverse_markdown/converters/em.rb
144
+ - lib/reverse_markdown/converters/figcaption.rb
145
+ - lib/reverse_markdown/converters/figure.rb
129
146
  - lib/reverse_markdown/converters/h.rb
130
147
  - lib/reverse_markdown/converters/hr.rb
131
148
  - lib/reverse_markdown/converters/ignore.rb
@@ -173,6 +190,8 @@ files:
173
190
  - spec/lib/reverse_markdown/converters/blockquote_spec.rb
174
191
  - spec/lib/reverse_markdown/converters/br_spec.rb
175
192
  - spec/lib/reverse_markdown/converters/del_spec.rb
193
+ - spec/lib/reverse_markdown/converters/details_spec.rb
194
+ - spec/lib/reverse_markdown/converters/figure_spec.rb
176
195
  - spec/lib/reverse_markdown/converters/li_spec.rb
177
196
  - spec/lib/reverse_markdown/converters/pre_spec.rb
178
197
  - spec/lib/reverse_markdown/converters/strong_spec.rb
@@ -199,7 +218,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
199
218
  - !ruby/object:Gem::Version
200
219
  version: '0'
201
220
  requirements: []
202
- rubygems_version: 3.0.3
221
+ rubygems_version: 3.1.4
203
222
  signing_key:
204
223
  specification_version: 4
205
224
  summary: Convert html code into markdown.
@@ -234,6 +253,8 @@ test_files:
234
253
  - spec/lib/reverse_markdown/converters/blockquote_spec.rb
235
254
  - spec/lib/reverse_markdown/converters/br_spec.rb
236
255
  - spec/lib/reverse_markdown/converters/del_spec.rb
256
+ - spec/lib/reverse_markdown/converters/details_spec.rb
257
+ - spec/lib/reverse_markdown/converters/figure_spec.rb
237
258
  - spec/lib/reverse_markdown/converters/li_spec.rb
238
259
  - spec/lib/reverse_markdown/converters/pre_spec.rb
239
260
  - spec/lib/reverse_markdown/converters/strong_spec.rb