html-pipeline-mrkdwn 0.1.1 → 0.1.2

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: 4ad0900208b414c9ced728620e5d70ed8cf87c671fdca162101e501c7baf77b2
4
- data.tar.gz: 10733b0cd8eb46d37972de8897c7b91777ad914896241f9d2c507e8d0c95083b
3
+ metadata.gz: 0eb17fa9037f2b2f46094838495825879431ed801420ba13e955e2bf4e90cbd6
4
+ data.tar.gz: 46d2ac462fe75c75c1c0713173f2cb5f5c37867765297ea83b027dd01d4e9229
5
5
  SHA512:
6
- metadata.gz: 6a289fe1ea454df57d75b65049d036367c5d11fa03db0319f40ee9076a59e166247ae84131baf9c9a3361de2af8b1de1e9a3ec92db56c4345c8416f0888b915f
7
- data.tar.gz: 014ea4fbdd0af2ff0ab69316ba4fa6e1307d82e6bfdeceb42871091523c3d03dcd715a6e3bc4f0af407173d1434fa2a30913d429d8a6f36bfa1820524a16c8ec
6
+ metadata.gz: 319aa1921131f6809f05c1e3f2c7cb99f9cea546ff55f9d271ff29e154efa2830dce043599f8baad59f967f1ab19d3dc142fc811c5c735c2f0b00374ebf05afb
7
+ data.tar.gz: 6abbef7d6514383fc052009c0b29831b8fb054478790a16ed047375fe1a24acd012501538c689775f5933bbf39953cb515b15e7573b4384faa5c0540235057e2
data/CHANGELOG.md CHANGED
@@ -1,3 +1,14 @@
1
+ # Changelog
2
+
3
+ ## [0.1.2] - 2022-12-26
4
+
5
+ - Split out code filter and apply after multiline code filter
6
+ - Add a command line interface as bin/mrkdwn
7
+
8
+ ## [0.1.1] - 2022-12-25
9
+
10
+ - Move mention and link filters before line break filter
11
+
1
12
  ## [0.1.0] - 2022-12-24
2
13
 
3
14
  - Initial release
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- html-pipeline-mrkdwn (0.1.1)
4
+ html-pipeline-mrkdwn (0.1.2)
5
5
  escape_utils (~> 1.3.0)
6
6
  gemoji (~> 4.0.1)
7
7
  html-pipeline (~> 2.14.3)
@@ -25,8 +25,10 @@ GEM
25
25
  i18n (1.12.0)
26
26
  concurrent-ruby (~> 1.0)
27
27
  json (2.6.3)
28
+ mini_portile2 (2.8.1)
28
29
  minitest (5.16.3)
29
- nokogiri (1.13.10-arm64-darwin)
30
+ nokogiri (1.13.10)
31
+ mini_portile2 (~> 2.8.0)
30
32
  racc (~> 1.4)
31
33
  parallel (1.22.1)
32
34
  parser (3.1.3.0)
@@ -76,4 +78,4 @@ DEPENDENCIES
76
78
  rubocop (~> 1.21)
77
79
 
78
80
  BUNDLED WITH
79
- 2.3.26
81
+ 2.4.1
data/bin/mrkdwn ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require "bundler/setup"
5
+ require_relative "../pipeline"
6
+
7
+ puts PIPELINE.to_html ARGV.shift
@@ -15,11 +15,9 @@ module HTML
15
15
  class Mrkdwn < Filter
16
16
  MULTILINE_CODE_PATTERN = /```(.+?)```/m.freeze
17
17
 
18
- BLOCKQUOTE_PATTERN = /(^&gt;[^\n]*\n?)+/.freeze
19
-
20
- LINE_BREAK_PATTERN = /\n/.freeze
18
+ CODE_PATTERN = /`(?=\S)(.+?)(?<=\S)`/.freeze
21
19
 
22
- EMOJI_PATTERN = /:([\w+-]+):/.freeze
20
+ BLOCKQUOTE_PATTERN = /(^&gt;[^\n]*\n?)+/.freeze
23
21
 
24
22
  MENTION_PATTERN = /
25
23
  &lt;
@@ -34,6 +32,10 @@ module HTML
34
32
  &gt;
35
33
  /x.freeze
36
34
 
35
+ LINE_BREAK_PATTERN = /\n/.freeze
36
+
37
+ EMOJI_PATTERN = /:([\w+-]+):/.freeze
38
+
37
39
  STYLE_PATTERN = /
38
40
  ([`*_~])
39
41
  (?=\S)(.+?)(?<=\S)
@@ -44,18 +46,19 @@ module HTML
44
46
 
45
47
  ELEMENTS = {
46
48
  multiline_code: %w[```],
49
+ code: %w[`],
47
50
  blockquote: %w[&gt;],
48
51
  mention: %w[@ # !],
49
52
  link: %w[&lt;],
50
53
  line_break: %W[\n \r\n],
51
54
  emoji: %w[:],
52
- style: %w[` * _ ~]
55
+ style: %w[* _ ~]
53
56
  }.freeze
54
57
 
55
58
  def initialize(doc, context = nil, result = nil)
56
59
  super(doc, context, result)
57
60
 
58
- @emoji_image_tag = ->(emoji) { emoji }
61
+ @emoji_image_tag = ->(emoji) { "<img src=\"#{emoji.image_filename}\" alt=\"#{emoji.name}\" class=\"emoji\">" }
59
62
  @slack_channels = {}
60
63
  @slack_users = {}
61
64
 
@@ -104,8 +107,8 @@ module HTML
104
107
  end
105
108
  end
106
109
 
107
- def call_filter(sym, content)
108
- method = "#{sym}_filter".to_sym
110
+ def call_filter(filter_name, content)
111
+ method = "#{filter_name}_filter".to_sym
109
112
  send method, content
110
113
  end
111
114
 
@@ -117,6 +120,18 @@ module HTML
117
120
  end
118
121
  end
119
122
 
123
+ def code_filter(content)
124
+ content.gsub CODE_PATTERN do |match|
125
+ text = Regexp.last_match[1]
126
+
127
+ if text&.match(/\A[`]+\Z/) # ignore runs of backquotes
128
+ match
129
+ else
130
+ "<code>#{text}</code>"
131
+ end
132
+ end
133
+ end
134
+
120
135
  def blockquote_filter(content)
121
136
  content.gsub BLOCKQUOTE_PATTERN do
122
137
  text = Regexp.last_match[0].chomp
@@ -126,35 +141,19 @@ module HTML
126
141
  end
127
142
  end
128
143
 
129
- def line_break_filter(content)
130
- content.gsub(LINE_BREAK_PATTERN, "<br>")
131
- end
132
-
133
- def emoji_filter(content)
134
- content.gsub(EMOJI_PATTERN) do |match|
135
- emoji = Emoji.find_by_alias(Regexp.last_match[1])
136
-
137
- if emoji
138
- emoji.raw || context.dig(:emoji_image_tag)&.call(emoji) || match
139
- else
140
- match
141
- end
142
- end
143
- end
144
-
145
144
  def mention_filter(content)
146
145
  content.gsub MENTION_PATTERN do |match|
147
146
  mention = Regexp.last_match[1]
148
147
 
149
148
  (text, klass, prefix) =
150
149
  case mention
151
- when /\A#(C.+)\Z/ # slack channel
150
+ when /\A#(C.+)\Z/ # slack channels
152
151
  [context.dig(:slack_channels, Regexp.last_match[1]) || Regexp.last_match[1], "channel", "#"]
153
152
 
154
- when /\A@([UB].+)\Z/ # slack user or bot
153
+ when /\A@([UB].+)\Z/ # slack users or bots
155
154
  [context.dig(:slack_users, Regexp.last_match[1]) || Regexp.last_match[1], "user", "@"]
156
155
 
157
- when /\A!(here|channel|everyone)\Z/ # special mention
156
+ when /\A!(here|channel|everyone)\Z/ # special mentions
158
157
  [Regexp.last_match[1], "mention", "@"]
159
158
  else
160
159
  nil
@@ -177,17 +176,31 @@ module HTML
177
176
  end
178
177
  end
179
178
 
179
+ def line_break_filter(content)
180
+ content.gsub(LINE_BREAK_PATTERN, "<br>")
181
+ end
182
+
183
+ def emoji_filter(content)
184
+ content.gsub(EMOJI_PATTERN) do |match|
185
+ emoji = Emoji.find_by_alias(Regexp.last_match[1])
186
+
187
+ if emoji
188
+ emoji.raw || context.dig(:emoji_image_tag)&.call(emoji) || match
189
+ else
190
+ match
191
+ end
192
+ end
193
+ end
194
+
180
195
  def style_filter(content)
181
196
  content.gsub STYLE_PATTERN do |match|
182
197
  style = Regexp.last_match[1]
183
198
  text = Regexp.last_match[2]
184
199
 
185
- if text&.match(/\A[#{style}]+\Z/) # ignore runs of repeated style characters
200
+ if text&.match(/\A[#{style}]+\Z/) # ignore runs of style delimiters
186
201
  match
187
202
  else
188
203
  case style
189
- when "`"
190
- "<code>#{text}</code>"
191
204
  when "*"
192
205
  "<strong>#{style_filter(text)}</strong>"
193
206
  when "_"
@@ -3,7 +3,7 @@
3
3
  module HTML
4
4
  class Pipeline
5
5
  class Mrkdwn < Filter
6
- VERSION = "0.1.1"
6
+ VERSION = "0.1.2"
7
7
  end
8
8
  end
9
9
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: html-pipeline-mrkdwn
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jason Gorst
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-12-26 00:00:00.000000000 Z
11
+ date: 2022-12-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: escape_utils
@@ -68,7 +68,8 @@ dependencies:
68
68
  version: 3.12.0
69
69
  description: An HTML::Pipeline filter for Slack's mrkdwn markup language.
70
70
  email: jason.gorst@me.com
71
- executables: []
71
+ executables:
72
+ - mrkdwn
72
73
  extensions: []
73
74
  extra_rdoc_files: []
74
75
  files:
@@ -81,6 +82,7 @@ files:
81
82
  - LICENSE.txt
82
83
  - README.md
83
84
  - Rakefile
85
+ - bin/mrkdwn
84
86
  - lib/html/pipeline/mrkdwn.rb
85
87
  - lib/html/pipeline/mrkdwn/mrkdwn_filter.rb
86
88
  - lib/html/pipeline/mrkdwn/version.rb
@@ -107,7 +109,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
107
109
  - !ruby/object:Gem::Version
108
110
  version: '0'
109
111
  requirements: []
110
- rubygems_version: 3.3.26
112
+ rubygems_version: 3.4.1
111
113
  signing_key:
112
114
  specification_version: 4
113
115
  summary: An HTML::Pipeline filter for Slack's mrkdwn markup language.