reverse_markdown 0.8.2 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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: