reverse_markdown 0.8.2 → 1.0.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 (38) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +9 -0
  3. data/README.md +7 -0
  4. data/bin/reverse_markdown +10 -0
  5. data/lib/reverse_markdown/cleaner.rb +3 -3
  6. data/lib/reverse_markdown/config.rb +8 -3
  7. data/lib/reverse_markdown/converters/a.rb +2 -2
  8. data/lib/reverse_markdown/converters/base.rb +4 -4
  9. data/lib/reverse_markdown/converters/blockquote.rb +2 -2
  10. data/lib/reverse_markdown/converters/br.rb +1 -1
  11. data/lib/reverse_markdown/converters/bypass.rb +2 -2
  12. data/lib/reverse_markdown/converters/code.rb +1 -1
  13. data/lib/reverse_markdown/converters/del.rb +3 -7
  14. data/lib/reverse_markdown/converters/div.rb +2 -2
  15. data/lib/reverse_markdown/converters/drop.rb +1 -1
  16. data/lib/reverse_markdown/converters/em.rb +3 -7
  17. data/lib/reverse_markdown/converters/h.rb +2 -2
  18. data/lib/reverse_markdown/converters/hr.rb +1 -1
  19. data/lib/reverse_markdown/converters/ignore.rb +1 -1
  20. data/lib/reverse_markdown/converters/img.rb +1 -1
  21. data/lib/reverse_markdown/converters/li.rb +5 -5
  22. data/lib/reverse_markdown/converters/ol.rb +3 -2
  23. data/lib/reverse_markdown/converters/p.rb +2 -2
  24. data/lib/reverse_markdown/converters/pass_through.rb +1 -1
  25. data/lib/reverse_markdown/converters/pre.rb +1 -1
  26. data/lib/reverse_markdown/converters/strong.rb +3 -7
  27. data/lib/reverse_markdown/converters/table.rb +2 -2
  28. data/lib/reverse_markdown/converters/td.rb +2 -2
  29. data/lib/reverse_markdown/converters/text.rb +8 -1
  30. data/lib/reverse_markdown/converters/tr.rb +2 -2
  31. data/lib/reverse_markdown/version.rb +1 -1
  32. data/spec/assets/basic.html +4 -4
  33. data/spec/components/basic_spec.rb +4 -4
  34. data/spec/lib/reverse_markdown/cleaner_spec.rb +90 -40
  35. data/spec/lib/reverse_markdown/converters/strong_spec.rb +1 -1
  36. data/spec/lib/reverse_markdown/converters/text_spec.rb +6 -0
  37. data/spec/lib/reverse_markdown/converters_spec.rb +2 -2
  38. metadata +4 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 883820fb93f917bc937cd5c12963f3482a0e808f
4
- data.tar.gz: a02eedd1b8ab8d3e115947e55d72e6f559577e47
3
+ metadata.gz: 950a3b8b3c2243b54c3d30a202e97c8084245a7e
4
+ data.tar.gz: 4c1c739b0e2b0aa7979e37d229697ac34eb98319
5
5
  SHA512:
6
- metadata.gz: 8a03b2214708c5bf1a56d76d9ce944f4b3a7ea76f0f00657c6873d3b25617122b2376b685980f7f149894274a617aedb01cd7d5952e518db737d406c1579a89a
7
- data.tar.gz: 91371fc841d5b46cbb99a6af813ce404702ceffe0b46403f5eb61bc579609c00ade300dc174cc68b982e7a3f18b05c4a2a28abb4f7b7a8c0bf4132bdbdef3d0c
6
+ metadata.gz: bc484226804f23f87509417538b7cdfa3b74a862f02ab4a7846f8cec9ab0c33f808b7d4ae206ce02710f7a81f861e8c00e2acc141ff73c974a4d8fbbf6fa5be2
7
+ data.tar.gz: 5facbab6c8082d32ac0928d56d940f0153a7e0fae26b90f55aa1c0ae4ee0d35f789f436015a33ed6360e496ebf2b125676ce874b850e2dfefeadf8c571f8ffc4
data/CHANGELOG.md CHANGED
@@ -1,6 +1,15 @@
1
1
  # Change Log
2
2
  All notable changes to this project will be documented in this file.
3
3
 
4
+ ## 1.0.0 - Nov 2015
5
+ ### Changes
6
+ - BREAKING: Parsing was significantly improved, thanks @craig-day (#60)
7
+ Please update your custom converters to accept and use the state hash, for
8
+ examples look into exisiting standard converters.
9
+ - Use OptionParser for command line options, thanks @grmartin (#55)
10
+ - Tag border behavior is now configurable with the `tag_border` option, thanks @faheemmughal (#59)
11
+ - Preserve > and < from original markup, thanks @willglynn (#58)
12
+
4
13
  ## 0.8.2 - May 2015
5
14
  ### Changes
6
15
  - Don't add whitespaces in links and images if they contain underscores
data/README.md CHANGED
@@ -67,6 +67,9 @@ The following options are available:
67
67
  - `bypass` - Ignore the unknown tag but try to convert its content
68
68
  - `raise` - Raise an error to let you know
69
69
  - `github_flavored` (default `false`) - use [github flavored markdown](https://help.github.com/articles/github-flavored-markdown) (yet only code blocks are supported)
70
+ - `tag_border` (default `' '`) - how to handle tag borders. valid options are:
71
+ - `' '` - Add whitespace if there is none at tag borders.
72
+ - `''` - Do not not add whitespace.
70
73
 
71
74
  ### As options
72
75
 
@@ -84,6 +87,7 @@ Or configure it block style on a initializer level. These configurations will la
84
87
  ReverseMarkdown.config do |config|
85
88
  config.unknown_tags = :bypass
86
89
  config.github_flavored = true
90
+ config.tag_border = ''
87
91
  end
88
92
  ```
89
93
 
@@ -108,3 +112,6 @@ Thanks to all [contributors](https://github.com/xijo/reverse_markdown/graphs/con
108
112
  - [danschultzer](https://github.com/danschultzer) Dan Schultzer
109
113
  - [Benjamin-Dobell](https://github.com/Benjamin-Dobell) Benjamin Dobell
110
114
  - [schkovich](https://github.com/schkovich) Goran Miskovic
115
+ - [craig-day](https://github.com/craig-day) Craig Day
116
+ - [grmartin](https://github.com/grmartin) Glenn R. Martin
117
+ - [willglynn](https://github.com/willglynn) Will Glynn
data/bin/reverse_markdown CHANGED
@@ -2,4 +2,14 @@
2
2
  # Usage: reverse_markdown [FILE]...
3
3
  # Usage: cat FILE | reverse_markdown
4
4
  require 'reverse_markdown'
5
+ require 'optparse'
6
+
7
+ options = {}
8
+ OptionParser.new do |opts|
9
+ opts.banner = "Usage: reverse_markdown [options] <file>"
10
+
11
+ opts.on('-u', '--unknown_tags [pass_through, drop, bypass, raise]', 'Unknown tag handling (default: pass_through)') { |v| ReverseMarkdown.config.unknown_tags = v }
12
+ opts.on('-g', '--github_flavored bool', 'use github flavored markdown (default: false)') { |v| ReverseMarkdown.config.github_flavored = v }
13
+ end.parse!
14
+
5
15
  puts ReverseMarkdown.convert(ARGF.read)
@@ -31,19 +31,19 @@ module ReverseMarkdown
31
31
  # Same for underscores and brackets.
32
32
  def clean_tag_borders(string)
33
33
  result = string.gsub(/\s?\*{2,}.*?\*{2,}\s?/) do |match|
34
- preserve_border_whitespaces(match, default_border: ' ') do
34
+ preserve_border_whitespaces(match, default_border: ReverseMarkdown.config.tag_border) do
35
35
  match.strip.sub('** ', '**').sub(' **', '**')
36
36
  end
37
37
  end
38
38
 
39
39
  result = result.gsub(/\s?\_{2,}.*?\_{2,}\s?/) do |match|
40
- preserve_border_whitespaces(match, default_border: ' ') do
40
+ preserve_border_whitespaces(match, default_border: ReverseMarkdown.config.tag_border) do
41
41
  match.strip.sub('__ ', '__').sub(' __', '__')
42
42
  end
43
43
  end
44
44
 
45
45
  result = result.gsub(/\s?~{2,}.*?~{2,}\s?/) do |match|
46
- preserve_border_whitespaces(match, default_border: ' ') do
46
+ preserve_border_whitespaces(match, default_border: ReverseMarkdown.config.tag_border) do
47
47
  match.strip.sub('~~ ', '~~').sub(' ~~', '~~')
48
48
  end
49
49
  end
@@ -1,13 +1,14 @@
1
1
  module ReverseMarkdown
2
2
  class Config
3
- attr_accessor :unknown_tags, :github_flavored
3
+ attr_accessor :unknown_tags, :github_flavored, :tag_border
4
4
 
5
5
  def initialize
6
6
  @unknown_tags = :pass_through
7
7
  @github_flavored = false
8
- @em_delimiter = '_'
9
- @strong_delimiter = '**'
8
+ @em_delimiter = '_'.freeze
9
+ @strong_delimiter = '**'.freeze
10
10
  @inline_options = {}
11
+ @tag_border = ' '.freeze
11
12
  end
12
13
 
13
14
  def with(options = {})
@@ -24,5 +25,9 @@ module ReverseMarkdown
24
25
  def github_flavored
25
26
  @inline_options[:github_flavored] || @github_flavored
26
27
  end
28
+
29
+ def tag_border
30
+ @inline_options[:tag_border] || @tag_border
31
+ end
27
32
  end
28
33
  end
@@ -1,8 +1,8 @@
1
1
  module ReverseMarkdown
2
2
  module Converters
3
3
  class A < Base
4
- def convert(node)
5
- name = treat_children(node)
4
+ def convert(node, state = {})
5
+ name = treat_children(node, state)
6
6
  href = node['href']
7
7
  title = extract_title(node)
8
8
 
@@ -1,14 +1,14 @@
1
1
  module ReverseMarkdown
2
2
  module Converters
3
3
  class Base
4
- def treat_children(node)
4
+ def treat_children(node, state)
5
5
  node.children.inject('') do |memo, child|
6
- memo << treat(child)
6
+ memo << treat(child, state)
7
7
  end
8
8
  end
9
9
 
10
- def treat(node)
11
- ReverseMarkdown::Converters.lookup(node.name).convert(node)
10
+ def treat(node, state)
11
+ ReverseMarkdown::Converters.lookup(node.name).convert(node, state)
12
12
  end
13
13
 
14
14
  def escape_keychars(string)
@@ -1,8 +1,8 @@
1
1
  module ReverseMarkdown
2
2
  module Converters
3
3
  class Blockquote < Base
4
- def convert(node)
5
- content = treat_children(node).strip
4
+ def convert(node, state = {})
5
+ content = treat_children(node, state).strip
6
6
  content = ReverseMarkdown.cleaner.remove_newlines(content)
7
7
  '> ' << content.lines.to_a.join('> ')
8
8
  end
@@ -1,7 +1,7 @@
1
1
  module ReverseMarkdown
2
2
  module Converters
3
3
  class Br < Base
4
- def convert(node)
4
+ def convert(node, state = {})
5
5
  " \n"
6
6
  end
7
7
  end
@@ -1,8 +1,8 @@
1
1
  module ReverseMarkdown
2
2
  module Converters
3
3
  class Bypass < Base
4
- def convert(node)
5
- treat_children(node)
4
+ def convert(node, state = {})
5
+ treat_children(node, state)
6
6
  end
7
7
  end
8
8
 
@@ -1,7 +1,7 @@
1
1
  module ReverseMarkdown
2
2
  module Converters
3
3
  class Code < Base
4
- def convert(node)
4
+ def convert(node, state = {})
5
5
  "`#{node.text}`"
6
6
  end
7
7
  end
@@ -1,9 +1,9 @@
1
1
  module ReverseMarkdown
2
2
  module Converters
3
3
  class Del < Base
4
- def convert(node)
5
- content = treat_children(node)
6
- if disabled? || content.strip.empty? || already_crossed_out?(node)
4
+ def convert(node, state = {})
5
+ content = treat_children(node, state.merge(already_crossed_out: true))
6
+ if disabled? || content.strip.empty? || state[:already_crossed_out]
7
7
  content
8
8
  else
9
9
  "~~#{content}~~"
@@ -17,10 +17,6 @@ module ReverseMarkdown
17
17
  def disabled?
18
18
  !enabled?
19
19
  end
20
-
21
- def already_crossed_out?(node)
22
- node.ancestors('del').size > 0 || node.ancestors('strike').size > 0
23
- end
24
20
  end
25
21
 
26
22
  register :strike, Del.new
@@ -1,8 +1,8 @@
1
1
  module ReverseMarkdown
2
2
  module Converters
3
3
  class Div < Base
4
- def convert(node)
5
- "\n" << treat_children(node) << "\n"
4
+ def convert(node, state = {})
5
+ "\n" << treat_children(node, state) << "\n"
6
6
  end
7
7
  end
8
8
 
@@ -1,7 +1,7 @@
1
1
  module ReverseMarkdown
2
2
  module Converters
3
3
  class Drop < Base
4
- def convert(node)
4
+ def convert(node, state = {})
5
5
  ''
6
6
  end
7
7
  end
@@ -1,18 +1,14 @@
1
1
  module ReverseMarkdown
2
2
  module Converters
3
3
  class Em < Base
4
- def convert(node)
5
- content = treat_children(node)
6
- if content.strip.empty? || already_italic?(node)
4
+ def convert(node, state = {})
5
+ content = treat_children(node, state.merge(already_italic: true))
6
+ if content.strip.empty? || state[:already_italic]
7
7
  content
8
8
  else
9
9
  "#{content[/^\s*/]}_#{content.strip}_#{content[/\s*$/]}"
10
10
  end
11
11
  end
12
-
13
- def already_italic?(node)
14
- node.ancestors('italic').size > 0 || node.ancestors('em').size > 0
15
- end
16
12
  end
17
13
 
18
14
  register :em, Em.new
@@ -1,9 +1,9 @@
1
1
  module ReverseMarkdown
2
2
  module Converters
3
3
  class H < Base
4
- def convert(node)
4
+ def convert(node, state = {})
5
5
  prefix = '#' * node.name[/\d/].to_i
6
- ["\n", prefix, ' ', treat_children(node), "\n"].join
6
+ ["\n", prefix, ' ', treat_children(node, state), "\n"].join
7
7
  end
8
8
  end
9
9
 
@@ -1,7 +1,7 @@
1
1
  module ReverseMarkdown
2
2
  module Converters
3
3
  class Hr < Base
4
- def convert(node)
4
+ def convert(node, state = {})
5
5
  "\n* * *\n"
6
6
  end
7
7
  end
@@ -1,7 +1,7 @@
1
1
  module ReverseMarkdown
2
2
  module Converters
3
3
  class Ignore < Base
4
- def convert(node)
4
+ def convert(node, state = {})
5
5
  '' # noop
6
6
  end
7
7
  end
@@ -1,7 +1,7 @@
1
1
  module ReverseMarkdown
2
2
  module Converters
3
3
  class Img < Base
4
- def convert(node)
4
+ def convert(node, state = {})
5
5
  alt = node['alt']
6
6
  src = node['src']
7
7
  title = extract_title(node)
@@ -1,9 +1,9 @@
1
1
  module ReverseMarkdown
2
2
  module Converters
3
3
  class Li < Base
4
- def convert(node)
5
- content = treat_children(node)
6
- indentation = indentation_for(node)
4
+ def convert(node, state = {})
5
+ content = treat_children(node, state)
6
+ indentation = indentation_from(state)
7
7
  prefix = prefix_for(node)
8
8
  "#{indentation}#{prefix}#{content.chomp}\n"
9
9
  end
@@ -17,8 +17,8 @@ module ReverseMarkdown
17
17
  end
18
18
  end
19
19
 
20
- def indentation_for(node)
21
- length = node.ancestors('ol').size + node.ancestors('ul').size
20
+ def indentation_from(state)
21
+ length = state.fetch(:ol_count, 0)
22
22
  ' ' * [length - 1, 0].max
23
23
  end
24
24
  end
@@ -1,8 +1,9 @@
1
1
  module ReverseMarkdown
2
2
  module Converters
3
3
  class Ol < Base
4
- def convert(node)
5
- "\n" << treat_children(node)
4
+ def convert(node, state = {})
5
+ ol_count = state.fetch(:ol_count, 0) + 1
6
+ "\n" << treat_children(node, state.merge(ol_count: ol_count))
6
7
  end
7
8
  end
8
9
 
@@ -1,8 +1,8 @@
1
1
  module ReverseMarkdown
2
2
  module Converters
3
3
  class P < Base
4
- def convert(node)
5
- "\n\n" << treat_children(node).strip << "\n\n"
4
+ def convert(node, state = {})
5
+ "\n\n" << treat_children(node, state).strip << "\n\n"
6
6
  end
7
7
  end
8
8
 
@@ -1,7 +1,7 @@
1
1
  module ReverseMarkdown
2
2
  module Converters
3
3
  class PassThrough < Base
4
- def convert(node)
4
+ def convert(node, state = {})
5
5
  node.to_s
6
6
  end
7
7
  end
@@ -1,7 +1,7 @@
1
1
  module ReverseMarkdown
2
2
  module Converters
3
3
  class Pre < Base
4
- def convert(node)
4
+ def convert(node, state = {})
5
5
  if ReverseMarkdown.config.github_flavored
6
6
  "\n```#{language(node)}\n" << node.text.strip << "\n```\n"
7
7
  else
@@ -1,18 +1,14 @@
1
1
  module ReverseMarkdown
2
2
  module Converters
3
3
  class Strong < Base
4
- def convert(node)
5
- content = treat_children(node)
6
- if content.strip.empty? || already_strong?(node)
4
+ def convert(node, state = {})
5
+ content = treat_children(node, state.merge(already_strong: true))
6
+ if content.strip.empty? || state[:already_strong]
7
7
  content
8
8
  else
9
9
  "#{content[/^\s*/]}**#{content.strip}**#{content[/\s*$/]}"
10
10
  end
11
11
  end
12
-
13
- def already_strong?(node)
14
- node.ancestors('strong').size > 0 || node.ancestors('b').size > 0
15
- end
16
12
  end
17
13
 
18
14
  register :strong, Strong.new
@@ -1,8 +1,8 @@
1
1
  module ReverseMarkdown
2
2
  module Converters
3
3
  class Table < Base
4
- def convert(node)
5
- "\n\n" << treat_children(node) << "\n"
4
+ def convert(node, state = {})
5
+ "\n\n" << treat_children(node, state) << "\n"
6
6
  end
7
7
  end
8
8
 
@@ -1,8 +1,8 @@
1
1
  module ReverseMarkdown
2
2
  module Converters
3
3
  class Td < Base
4
- def convert(node)
5
- content = treat_children(node)
4
+ def convert(node, state = {})
5
+ content = treat_children(node, state)
6
6
  " #{content} |"
7
7
  end
8
8
  end
@@ -29,12 +29,19 @@ module ReverseMarkdown
29
29
  text = remove_inner_newlines(text)
30
30
  text = escape_keychars(text)
31
31
 
32
- preserve_keychars_within_backticks(text)
32
+ text = preserve_keychars_within_backticks(text)
33
+ text = preserve_tags(text)
34
+
35
+ text
33
36
  end
34
37
 
35
38
  def preserve_nbsp(text)
36
39
  text.gsub(/\u00A0/, "&nbsp;")
37
40
  end
41
+
42
+ def preserve_tags(text)
43
+ text.gsub(/[<>]/, '>' => '\>', '<' => '\<')
44
+ end
38
45
 
39
46
  def remove_border_newlines(text)
40
47
  text.gsub(/\A\n+/, '').gsub(/\n+\z/, '')
@@ -1,8 +1,8 @@
1
1
  module ReverseMarkdown
2
2
  module Converters
3
3
  class Tr < Base
4
- def convert(node)
5
- content = treat_children(node).rstrip
4
+ def convert(node, state = {})
5
+ content = treat_children(node, state).rstrip
6
6
  result = "|#{content}\n"
7
7
  table_header_row?(node) ? result + underline_for(node) : result
8
8
  end
@@ -1,3 +1,3 @@
1
1
  module ReverseMarkdown
2
- VERSION = "0.8.2"
2
+ VERSION = '1.0.0'
3
3
  end
@@ -14,8 +14,8 @@
14
14
  before <em> <em> <br /> </em> </em> and after em tags containing whitespace
15
15
  <em><em>double em tags</em></em>
16
16
  <p><em><em>double em tags in p tag</em></em></p>
17
- <em> em with leading and trailing </em>whitespace
18
- <em>
17
+ a<em> em with leading and trailing </em>whitespace
18
+ a<em>
19
19
  em with extra leading and trailing
20
20
  </em>whitespace
21
21
 
@@ -31,8 +31,8 @@
31
31
  double strong tags containing whitespace
32
32
  </strong>
33
33
  </strong> after
34
- <strong> strong with leading and trailing </strong>whitespace
35
- <strong>
34
+ a<strong> strong with leading and trailing </strong>whitespace
35
+ a<strong>
36
36
  strong with extra leading and trailing
37
37
  </strong>whitespace
38
38
 
@@ -19,8 +19,8 @@ describe ReverseMarkdown do
19
19
  it { is_expected.to match /before and after em tags containing whitespace/ }
20
20
  it { is_expected.to match /_double em tags_/ }
21
21
  it { is_expected.to match /_double em tags in p tag_/ }
22
- it { is_expected.to match /_em with leading and trailing_ whitespace/ }
23
- it { is_expected.to match /_em with extra leading and trailing_ whitespace/ }
22
+ it { is_expected.to match /a _em with leading and trailing_ whitespace/ }
23
+ it { is_expected.to match /a _em with extra leading and trailing_ whitespace/ }
24
24
 
25
25
  it { is_expected.to match /\*\*strong tag content\*\*/ }
26
26
  it { is_expected.to match /before and after empty strong tags/ }
@@ -28,8 +28,8 @@ describe ReverseMarkdown do
28
28
  it { is_expected.to match /\*\*double strong tags\*\*/ }
29
29
  it { is_expected.to match /\*\*double strong tags in p tag\*\*/ }
30
30
  it { is_expected.to match /before \*\*double strong tags containing whitespace\*\* after/ }
31
- it { is_expected.to match /\*\*strong with leading and trailing\*\* whitespace/ }
32
- it { is_expected.to match /\*\*strong with extra leading and trailing\*\* whitespace/ }
31
+ it { is_expected.to match /a \*\*strong with leading and trailing\*\* whitespace/ }
32
+ it { is_expected.to match /a \*\*strong with extra leading and trailing\*\* whitespace/ }
33
33
 
34
34
  it { is_expected.to match /_i tag content_/ }
35
35
  it { is_expected.to match /\*\*b tag content\*\*/ }
@@ -61,46 +61,96 @@ describe ReverseMarkdown::Cleaner do
61
61
  end
62
62
 
63
63
  describe '#clean_tag_borders' do
64
- it 'removes not needed whitespaces from strong tags' do
65
- input = "foo ** foobar ** bar"
66
- result = cleaner.clean_tag_borders(input)
67
- expect(result).to eq "foo **foobar** bar"
68
- end
69
-
70
- it 'remotes leading or trailing whitespaces independently' do
71
- input = "1 **fat ** 2 ** fat** 3"
72
- result = cleaner.clean_tag_borders(input)
73
- expect(result).to eq "1 **fat** 2 **fat** 3"
74
- end
75
-
76
- it 'adds whitespaces if there are none' do
77
- input = "1**fat**2"
78
- result = cleaner.clean_tag_borders(input)
79
- expect(result).to eq "1 **fat** 2"
80
- end
81
-
82
- it "doesn't add whitespaces to underscore'ed elements if they are part of links" do
83
- input = "![im__age](sou__rce)"
84
- result = cleaner.clean_tag_borders(input)
85
- expect(result).to eq "![im__age](sou__rce)"
86
- end
87
-
88
- it "still cleans up whitespaces that aren't inside a link" do
89
- input = "now __italic __with following [under__scored](link)"
90
- result = cleaner.clean_tag_borders(input)
91
- expect(result).to eq "now __italic__ with following [under__scored](link)"
92
- end
93
-
94
- it 'cleans italic stuff as well' do
95
- input = "1 __italic __ 2 __ italic__ 3__italic __4"
96
- result = cleaner.clean_tag_borders(input)
97
- expect(result).to eq "1 __italic__ 2 __italic__ 3 __italic__ 4"
98
- end
99
-
100
- it 'cleans strikethrough stuff as well' do
101
- input = "1 ~~italic ~~ 2 ~~ italic~~ 3~~italic ~~4"
102
- result = cleaner.clean_tag_borders(input)
103
- expect(result).to eq "1 ~~italic~~ 2 ~~italic~~ 3 ~~italic~~ 4"
64
+ context 'with default_border is set to space' do
65
+ before { ReverseMarkdown.config.tag_border = ' ' }
66
+
67
+ it 'removes not needed whitespaces from strong tags' do
68
+ input = "foo ** foobar ** bar"
69
+ result = cleaner.clean_tag_borders(input)
70
+ expect(result).to eq "foo **foobar** bar"
71
+ end
72
+
73
+ it 'remotes leading or trailing whitespaces independently' do
74
+ input = "1 **fat ** 2 ** fat** 3"
75
+ result = cleaner.clean_tag_borders(input)
76
+ expect(result).to eq "1 **fat** 2 **fat** 3"
77
+ end
78
+
79
+ it 'adds whitespaces if there are none' do
80
+ input = "1**fat**2"
81
+ result = cleaner.clean_tag_borders(input)
82
+ expect(result).to eq "1 **fat** 2"
83
+ end
84
+
85
+ it "doesn't add whitespaces to underscore'ed elements if they are part of links" do
86
+ input = "![im__age](sou__rce)"
87
+ result = cleaner.clean_tag_borders(input)
88
+ expect(result).to eq "![im__age](sou__rce)"
89
+ end
90
+
91
+ it "still cleans up whitespaces that aren't inside a link" do
92
+ input = "now __italic __with following [under__scored](link)"
93
+ result = cleaner.clean_tag_borders(input)
94
+ expect(result).to eq "now __italic__ with following [under__scored](link)"
95
+ end
96
+
97
+ it 'cleans italic stuff as well' do
98
+ input = "1 __italic __ 2 __ italic__ 3__italic __4"
99
+ result = cleaner.clean_tag_borders(input)
100
+ expect(result).to eq "1 __italic__ 2 __italic__ 3 __italic__ 4"
101
+ end
102
+
103
+ it 'cleans strikethrough stuff as well' do
104
+ input = "1 ~~italic ~~ 2 ~~ italic~~ 3~~italic ~~4"
105
+ result = cleaner.clean_tag_borders(input)
106
+ expect(result).to eq "1 ~~italic~~ 2 ~~italic~~ 3 ~~italic~~ 4"
107
+ end
108
+ end
109
+
110
+ context 'with default_border set to no space' do
111
+ before { ReverseMarkdown.config.tag_border = '' }
112
+
113
+ it 'removes not needed whitespaces from strong tags' do
114
+ input = "foo ** foobar ** bar"
115
+ result = cleaner.clean_tag_borders(input)
116
+ expect(result).to eq "foo **foobar** bar"
117
+ end
118
+
119
+ it 'remotes leading or trailing whitespaces independently' do
120
+ input = "1 **fat ** 2 ** fat** 3"
121
+ result = cleaner.clean_tag_borders(input)
122
+ expect(result).to eq "1 **fat** 2 **fat** 3"
123
+ end
124
+
125
+ it 'adds whitespaces if there are none' do
126
+ input = "1**fat**2"
127
+ result = cleaner.clean_tag_borders(input)
128
+ expect(result).to eq "1**fat**2"
129
+ end
130
+
131
+ it "doesn't add whitespaces to underscore'ed elements if they are part of links" do
132
+ input = "![im__age](sou__rce)"
133
+ result = cleaner.clean_tag_borders(input)
134
+ expect(result).to eq "![im__age](sou__rce)"
135
+ end
136
+
137
+ it "still cleans up whitespaces that aren't inside a link" do
138
+ input = "now __italic __with following [under__scored](link)"
139
+ result = cleaner.clean_tag_borders(input)
140
+ expect(result).to eq "now __italic__with following [under__scored](link)"
141
+ end
142
+
143
+ it 'cleans italic stuff as well' do
144
+ input = "1 __italic __ 2 __ italic__ 3__italic __4"
145
+ result = cleaner.clean_tag_borders(input)
146
+ expect(result).to eq "1 __italic__ 2 __italic__ 3__italic__4"
147
+ end
148
+
149
+ it 'cleans strikethrough stuff as well' do
150
+ input = "1 ~~italic ~~ 2 ~~ italic~~ 3~~italic ~~4"
151
+ result = cleaner.clean_tag_borders(input)
152
+ expect(result).to eq "1 ~~italic~~ 2 ~~italic~~ 3~~italic~~4"
153
+ end
104
154
  end
105
155
  end
106
156
 
@@ -10,7 +10,7 @@ describe ReverseMarkdown::Converters::Strong do
10
10
 
11
11
  it 'returns just the content if the strong tag is nested in another strong' do
12
12
  input = node_for('<strong><strong>foo</strong></strong>')
13
- expect(converter.convert(input.children.first)).to eq 'foo'
13
+ expect(converter.convert(input.children.first, already_strong: true)).to eq 'foo'
14
14
  end
15
15
 
16
16
  it 'moves border whitespaces outside of the delimiters tag' do
@@ -28,6 +28,12 @@ describe ReverseMarkdown::Converters::Text do
28
28
  expect(result).to eq "foo&nbsp;bar &nbsp;"
29
29
  end
30
30
 
31
+ it 'keeps escaped HTML-ish characters' do
32
+ input = node_for("<p>&lt;foo&gt;</p>")
33
+ result = converter.convert(input)
34
+ expect(result).to eq '\<foo\>'
35
+ end
36
+
31
37
  context 'within backticks' do
32
38
  it "preserves single underscores" do
33
39
  input = node_for("<p>`foo_bar`</p>")
@@ -6,13 +6,13 @@ describe ReverseMarkdown::Converters do
6
6
 
7
7
  describe '.register and .unregister' do
8
8
  it 'adds a converter mapping to the list' do
9
- expect { converters.lookup(:foo) }.to raise_error
9
+ expect { converters.lookup(:foo) }.to raise_error ReverseMarkdown::UnknownTagError
10
10
 
11
11
  converters.register :foo, :foobar
12
12
  expect(converters.lookup(:foo)).to eq :foobar
13
13
 
14
14
  converters.unregister :foo
15
- expect { converters.lookup(:foo) }.to raise_error
15
+ expect { converters.lookup(:foo) }.to raise_error ReverseMarkdown::UnknownTagError
16
16
  end
17
17
  end
18
18
 
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: 0.8.2
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Johannes Opper
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-05-09 00:00:00.000000000 Z
11
+ date: 2015-11-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri
@@ -199,7 +199,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
199
199
  version: '0'
200
200
  requirements: []
201
201
  rubyforge_project: reverse_markdown
202
- rubygems_version: 2.2.2
202
+ rubygems_version: 2.4.8
203
203
  signing_key:
204
204
  specification_version: 4
205
205
  summary: Convert html code into markdown.
@@ -241,3 +241,4 @@ test_files:
241
241
  - spec/lib/reverse_markdown/converters_spec.rb
242
242
  - spec/lib/reverse_markdown_spec.rb
243
243
  - spec/spec_helper.rb
244
+ has_rdoc: