slack_mrkdwn 1.0.0 → 2.2.1

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 (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/slack_mrkdwn.rb +168 -18
  3. metadata +17 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d57a2dbe717ff391670a6f4c35a5c421437a0867c59813268ddaaa83be29d3da
4
- data.tar.gz: 494d619b848b736f3956a3c62e2cc41ab73fd7048274939bdf1b16f5256dd49c
3
+ metadata.gz: 6db671a28f9f0c8c3e77012cea38905cf27003c8fdc4243ff5664b3836bd4821
4
+ data.tar.gz: 4ff4a22b0d87b506f73d8d6319a3f324be804788d4d49b32f3959dd304c203a7
5
5
  SHA512:
6
- metadata.gz: 20ae648f95d1db327693ec757c53597e189dfa8de5891b937a073210952d4c60035233694dc7cdfdf49c5fd5f3ea584add6ef8d39eae946ffd09eacdbfbb8a20
7
- data.tar.gz: 26415a1578e7aaeafb680cade122b4d684a7749c677f721ad8138e3f996cf136e0c69ba2c1b1d4790b16a9bd9c64a21f0db93ce800ea5eb0bcc43c5a43e1517f
6
+ metadata.gz: 296704690f4465026227dddb26a61484416c7f3fc6fa62210402c06cd012ff9d721d21901671943f2e045abf320f4227b025b3ea93dd16f18af2d0e67f1732ac
7
+ data.tar.gz: a68a10db9e03a24d0de7a75c23b99f4ca43eeb9a3ddef30dff615683b1faec3b6626632118b8ef8726fdb5f5b448e287e294c81d51ccc9b9476632e48b63471e
@@ -1,18 +1,168 @@
1
- module SlackMrkdwn
2
- def self.from(markdown)
3
- markdown
4
- .gsub('&', '&amp;').gsub('<', '&lt;').gsub('>', '&gt;') # Encode Slack restricted characters
5
- .gsub(/\*(.*?)\*/, '_\1_') # Emphasis
6
- .gsub(/\*{2}(.+?)\*{2}/, '*\1*').gsub(/_{2}(.+?)_{2}/, '*\1*') # Strong emphasis
7
- .gsub(/~{2}(.+?)~{2}/, '~\1~') # Strike-through
8
- .gsub(/^\#{1,6} (.+?)$/, '*\1*').gsub(/(.*?)\n^=+$/, '*\1*').gsub(/(.*?)\n^-+$/, '*\1*') # Headings
9
- .gsub(/`{3}\w*(.*?)`{3}/m, '```\1```') # Codeblock
10
- .gsub(/^ +/, '\t') # Leading spaces
11
- .gsub(/^((?:\\t)*?)[\*\+-] (.+)/, '\1- \2') # Unordered lists
12
- .gsub(/\[(.+?)\]\((.+?)(?: .*?)?\)/, '<\2|\1>') # Classic link
13
- .gsub(/\[(.+?)\]\[(.+?)\]/) { |m| markdown.match?(/\[#{$2}\]: (.+)/i) ? ("|#{$1}>".prepend(/\[#{$2}\]: (.+)/i.match(markdown) { |n| "<#{$1}" })) : "[#{$1}][#{$2}]" } # Reference-style links
14
- .gsub(/\[(.+?)\]/) { |m| markdown.match?(/\[#{$1}\]: (.+)/i) ? ("|#{$1}>".prepend(/\[#{$1}\]: (.+)/i.match(markdown) { |n| "<#{$1}" })) : "[#{$1}]" } # Reference-style - Text only links
15
- .gsub(/\^<.+?|.+?>: .+/, '') # Remove link references
16
- .strip
17
- end
18
- end
1
+ # frozen_string_literal: true
2
+ require 'redcarpet'
3
+
4
+ class SlackMrkdwn < Redcarpet::Render::Base
5
+ class << self
6
+ def from(markdown)
7
+ renderer = SlackMrkdwn.new
8
+ Redcarpet::Markdown.new(renderer, strikethrough: true, underline: true, fenced_code_blocks: true).render(markdown)
9
+ end
10
+ end
11
+
12
+ # Methods where the first argument is the text content
13
+ [
14
+ # block-level calls
15
+ :block_html,
16
+
17
+ :autolink,
18
+ :raw_html,
19
+
20
+ :table, :table_row, :table_cell,
21
+
22
+ :superscript, :highlight,
23
+
24
+ # footnotes
25
+ :footnotes, :footnote_def, :footnote_ref,
26
+
27
+ :hrule,
28
+
29
+ # low level rendering
30
+ :entity, :normal_text,
31
+
32
+ :doc_header, :doc_footer,
33
+ ].each do |method|
34
+ define_method method do |*args|
35
+ args.first
36
+ end
37
+ end
38
+
39
+ # Encode Slack restricted characters
40
+ def preprocess(content)
41
+ content.gsub('&', '&amp;').gsub('<', '&lt;').gsub('>', '&gt;')
42
+ end
43
+
44
+ def postprocess(content)
45
+ content.rstrip
46
+ end
47
+
48
+ # ~~strikethrough~~
49
+ def strikethrough(content)
50
+ "~#{content}~"
51
+ end
52
+
53
+ # _italic_
54
+ def underline(content)
55
+ "_#{content}_"
56
+ end
57
+
58
+ # *italic*
59
+ def emphasis(content)
60
+ "_#{content}_"
61
+ end
62
+
63
+ # **bold**
64
+ def double_emphasis(content)
65
+ "*#{content}*"
66
+ end
67
+
68
+ # ***bold and italic***
69
+ def triple_emphasis(content)
70
+ "*_#{content}_*"
71
+ end
72
+
73
+ # ``` code block ```
74
+ def block_code(content, _language)
75
+ "```\n#{content}```\n\n"
76
+ end
77
+
78
+ # > quote
79
+ def block_quote(content)
80
+ "&gt; #{content}"
81
+ end
82
+
83
+ # `code`
84
+ def codespan(content)
85
+ "`#{content}`"
86
+ end
87
+
88
+ # links
89
+ def link(link, _title, content)
90
+ "<#{link}|#{content}>"
91
+ end
92
+
93
+ # list. Called when all list items have been consumed
94
+ def list(entries, style)
95
+ entries = format_list(entries, style)
96
+ remember_last_list_entries(entries)
97
+ entries
98
+ end
99
+
100
+ # list item
101
+ def list_item(entry, _style)
102
+ if @last_entries && entry.end_with?(@last_entries)
103
+ entry = indent_list_items(entry)
104
+ @last_entries = nil
105
+ end
106
+ entry
107
+ end
108
+
109
+ # ![](image)
110
+ def image(link, _title, _content)
111
+ link
112
+ end
113
+
114
+ def paragraph(text)
115
+ pre_spacing = @last_entries ? "\n" : nil
116
+ clear_last_list_entries
117
+ "#{pre_spacing}#{text}\n\n"
118
+ end
119
+
120
+ # # Header
121
+ def header(text, _header_level)
122
+ "*#{text}*\n"
123
+ end
124
+
125
+ def linebreak()
126
+ "\n"
127
+ end
128
+
129
+ private
130
+
131
+ def format_list(entries, style)
132
+ case style
133
+ when :ordered
134
+ number_list(entries)
135
+ when :unordered
136
+ add_dashes(entries)
137
+ end
138
+ end
139
+
140
+ def add_dashes(entries)
141
+ entries.gsub(/^(\S+.*)$/, '- \1')
142
+ end
143
+
144
+ def number_list(entries)
145
+ count = 0
146
+ entries.gsub(/^(\S+.*)$/) do
147
+ match = Regexp.last_match
148
+ count += 1
149
+ "#{count}. #{match[0]}"
150
+ end
151
+ end
152
+
153
+ def remember_last_list_entries(entries)
154
+ @last_entries = entries
155
+ end
156
+
157
+ def clear_last_list_entries
158
+ @last_entries = nil
159
+ end
160
+
161
+ def nest_list_entries(entries)
162
+ entries.gsub(/^(.+)$/, ' \1')
163
+ end
164
+
165
+ def indent_list_items(entry)
166
+ entry.gsub(@last_entries, nest_list_entries(@last_entries))
167
+ end
168
+ end
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: slack_mrkdwn
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 2.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Simon Cousineau
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-08-12 00:00:00.000000000 Z
11
+ date: 2019-08-25 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: redcarpet
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 3.5.1
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 3.5.1
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: bundler
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -71,7 +85,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
71
85
  requirements:
72
86
  - - ">="
73
87
  - !ruby/object:Gem::Version
74
- version: 2.4.6
88
+ version: 1.9.2
75
89
  required_rubygems_version: !ruby/object:Gem::Requirement
76
90
  requirements:
77
91
  - - ">="