html-pipeline-mrkdwn 0.1.10 → 0.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a719d28f9a177bf2309038577b5fa5ca0fde8becbe75596bb6c802b836a92f00
4
- data.tar.gz: 1a7233f84889b309b7e32517ff302327507c577c19dfd5b0a655dab73738fe75
3
+ metadata.gz: 9547e478a23018b8b15dce6d5c1546172c1fc1c69dd42935e40c32d528c5cf4a
4
+ data.tar.gz: 4e8d92217071e0c78c2426ca887f7f6522e4c25f72afeb0c5689fbc340f28ae8
5
5
  SHA512:
6
- metadata.gz: 5ebe821d1f8aa9216bf46b10d1c1bc91f09d5561131896f6eb60817e53949aa5c222aa84617b6f69653042d2f6ed046f408388b94f8f373c29b5a10e2fc93cc3
7
- data.tar.gz: 7e4836e583e4f76a845a0c21bed986947242dcd2938db8446ae11d3af03b56eec9249992d23d7922a03076c05e1b005b7e1184c870bb4753fdfa0cacb47c35b9
6
+ metadata.gz: 286afc3419b578befe9da101d992acc0f63b32b3e7169f7a3ba687a6a28cba4e39adf7650e692c696238f95d457d36e7a20f224a4dfcd69066fcd9b355b00574
7
+ data.tar.gz: bcd82b1de9518d162aa088ecbf8f89266d2ef3124ebe98d14a8de4c85a759549ca2fc864f6df11c2c4675d9123afa9e0cd26dd2c1b7cafe68a595ece70e535c1
@@ -0,0 +1,3 @@
1
+ require_relative "../../mrkdwn"
2
+
3
+ PIPELINE = HTML::Pipeline.new [ HTML::Pipeline::PlainTextInputFilter, HTML::Pipeline::Mrkdwn ]
@@ -12,6 +12,8 @@ module HTML
12
12
  # :slack_channels - a hash of Slack channel ids and channel names
13
13
  # :slack_users - a hash of Slack user or bot ids and display names
14
14
  class Mrkdwn < Filter
15
+ attr_reader :large_emoji
16
+
15
17
  MULTILINE_CODE_PATTERN = /```(.+?)```/m.freeze
16
18
 
17
19
  CODE_PATTERN = /`(?=\S)(.+?)(?<=\S)`/.freeze
@@ -33,7 +35,11 @@ module HTML
33
35
 
34
36
  LINE_BREAK_PATTERN = /\n/.freeze
35
37
 
36
- EMOJI_PATTERN = /:([\w+-_]+):/.freeze
38
+ EMOJI_PATTERN = /:([\w+-_]+?):/.freeze
39
+
40
+ EMOJI_AND_WHITESPACE_PATTERN = /(?::[\w+-_]+?:|\s)+/.freeze
41
+
42
+ NON_CAPTURING_EMOJI_PATTERN = /:[\w+-_]+?:/.freeze
37
43
 
38
44
  STYLE_PATTERN = /
39
45
  ([`*_~])
@@ -57,16 +63,23 @@ module HTML
57
63
  def initialize(doc, context = nil, result = nil)
58
64
  super
59
65
 
60
- @emoji_image_tag = ->(emoji) { "<img src=\"#{emoji.image_filename}\" alt=\"#{emoji.name}\" class=\"emoji\">" }
61
- @slack_channels = {}
62
- @slack_users = {}
66
+ default_emoji_image_tag = ->(emoji) { "<img src=\"#{emoji.image_filename}\" alt=\"#{emoji.name}\" class=\"emoji\">" }
63
67
 
64
- @emoji_image_tag = @context[:emoji_image_tag] if @context[:emoji_image_tag]
65
- @slack_channels = @context[:slack_channels] if @context[:slack_channels]
66
- @slack_users = @context[:slack_users] if @context[:slack_users]
68
+ @emoji_image_tag = @context[:emoji_image_tag] || default_emoji_image_tag
69
+ @large_emoji_image_tag = @context[:large_emoji_image_tag] || @emoji_image_tag
70
+ @large_emoji_class = @context[:large_emoji_class] || "emoji-lg"
71
+ @slack_channels = @context[:slack_channels] || {}
72
+ @slack_users = @context[:slack_users] || {}
67
73
  end
68
74
 
69
75
  def call
76
+ div = doc.at_css("div")
77
+
78
+ if wants_large_emoji?(div.content)
79
+ @large_emoji = true
80
+ div.add_class(@large_emoji_class)
81
+ end
82
+
70
83
  ELEMENTS.each do |element, includes|
71
84
  process_text_nodes(includes) { |content| call_filter(element, content) }
72
85
  end
@@ -80,6 +93,11 @@ module HTML
80
93
  "context[:emoji_image_tag] should return a Proc that takes an Emoji object as in the 'gemoji' gem."
81
94
  end
82
95
 
96
+ if context[:large_emoji_image_tag] && !context[:large_emoji_image_tag].is_a?(Proc)
97
+ raise ArgumentError,
98
+ "context[:large_emoji_image_tag] should return a Proc that takes an Emoji object as in the 'gemoji' gem."
99
+ end
100
+
83
101
  if context[:slack_channels] && !context[:slack_channels].is_a?(Hash)
84
102
  raise ArgumentError,
85
103
  "context[:slack_channels] should return a Hash whose keys are Slack channel ids and values are their names."
@@ -184,7 +202,15 @@ module HTML
184
202
  emoji = Emoji.find_by_alias(Regexp.last_match[1])
185
203
 
186
204
  if emoji
187
- emoji.raw || @emoji_image_tag.call(emoji) || match
205
+ if emoji.custom?
206
+ if @large_emoji
207
+ @large_emoji_image_tag.call(emoji)
208
+ else
209
+ @emoji_image_tag.call(emoji)
210
+ end
211
+ else
212
+ emoji.raw
213
+ end
188
214
  else
189
215
  match
190
216
  end
@@ -212,6 +238,22 @@ module HTML
212
238
  end
213
239
  end
214
240
  end
241
+
242
+ private
243
+
244
+ def only_emoji_and_whitespace?(string)
245
+ matchdata = EMOJI_AND_WHITESPACE_PATTERN.match(string)
246
+
247
+ matchdata && matchdata[0] == string
248
+ end
249
+
250
+ def emoji_count(string)
251
+ string.scan(NON_CAPTURING_EMOJI_PATTERN).size
252
+ end
253
+
254
+ def wants_large_emoji?(string)
255
+ only_emoji_and_whitespace?(string) && emoji_count(string).between?(1, 23)
256
+ end
215
257
  end
216
258
  end
217
259
  end
@@ -5,7 +5,7 @@ require "html/pipeline"
5
5
  module HTML
6
6
  class Pipeline
7
7
  class Mrkdwn < Filter
8
- VERSION = "0.1.10"
8
+ VERSION = "0.2.0"
9
9
  end
10
10
  end
11
11
  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.10
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jason Gorst
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-10-29 00:00:00.000000000 Z
11
+ date: 2024-10-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: escape_utils
@@ -138,6 +138,7 @@ files:
138
138
  - Rakefile
139
139
  - bin/mrkdwn
140
140
  - lib/html/pipeline/mrkdwn.rb
141
+ - lib/html/pipeline/mrkdwn/helpers/pipeline.rb
141
142
  - lib/html/pipeline/mrkdwn/mrkdwn_filter.rb
142
143
  - lib/html/pipeline/mrkdwn/version.rb
143
144
  homepage: https://github.com/jasongorst/html-pipeline-mrkdwn