motion-html-pipeline 0.2 → 0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +2 -1
- data/lib/motion-html-pipeline.rb +4 -2
- data/lib/motion-html-pipeline/document_fragment.rb +3 -1
- data/lib/motion-html-pipeline/pipeline.rb +1 -2
- data/lib/motion-html-pipeline/pipeline/absolute_source_filter.rb +2 -0
- data/lib/motion-html-pipeline/pipeline/body_content.rb +2 -0
- data/lib/motion-html-pipeline/pipeline/disabled/@mention_filter.rb +2 -0
- data/lib/motion-html-pipeline/pipeline/disabled/@team_mention_filter.rb +99 -0
- data/lib/motion-html-pipeline/pipeline/disabled/autolink_filter.rb +2 -0
- data/lib/motion-html-pipeline/pipeline/disabled/camo_filter.rb +2 -0
- data/lib/motion-html-pipeline/pipeline/disabled/email_reply_filter.rb +2 -0
- data/lib/motion-html-pipeline/pipeline/disabled/emoji_filter.rb +2 -0
- data/lib/motion-html-pipeline/pipeline/disabled/markdown_filter.rb +25 -6
- data/lib/motion-html-pipeline/pipeline/disabled/plain_text_input_filter.rb +2 -0
- data/lib/motion-html-pipeline/pipeline/disabled/sanitization_filter.rb +2 -0
- data/lib/motion-html-pipeline/pipeline/disabled/syntax_highlight_filter.rb +17 -11
- data/lib/motion-html-pipeline/pipeline/disabled/toc_filter.rb +3 -1
- data/lib/motion-html-pipeline/pipeline/filter.rb +2 -0
- data/lib/motion-html-pipeline/pipeline/https_filter.rb +2 -0
- data/lib/motion-html-pipeline/pipeline/image_filter.rb +2 -0
- data/lib/motion-html-pipeline/pipeline/image_max_width_filter.rb +2 -0
- data/lib/motion-html-pipeline/pipeline/text_filter.rb +2 -0
- data/lib/motion-html-pipeline/pipeline/version.rb +3 -1
- data/spec/motion-html-pipeline/_helpers/mock_instumentation_service.rb +2 -0
- data/spec/motion-html-pipeline/pipeline/absolute_source_filter_spec.rb +2 -0
- data/spec/motion-html-pipeline/pipeline/disabled/auto_link_filter_spec.rb +2 -0
- data/spec/motion-html-pipeline/pipeline/disabled/camo_filter_spec.rb +2 -0
- data/spec/motion-html-pipeline/pipeline/disabled/email_reply_filter_spec.rb +2 -0
- data/spec/motion-html-pipeline/pipeline/disabled/emoji_filter_spec.rb +2 -0
- data/spec/motion-html-pipeline/pipeline/disabled/markdown_filter_spec.rb +64 -7
- data/spec/motion-html-pipeline/pipeline/disabled/mention_filter_test.rb +214 -0
- data/spec/motion-html-pipeline/pipeline/disabled/plain_text_input_filter_spec.rb +2 -0
- data/spec/motion-html-pipeline/pipeline/disabled/sanitization_filter_spec.rb +2 -0
- data/spec/motion-html-pipeline/pipeline/disabled/syntax_highlighting_filter_spec.rb +3 -0
- data/spec/motion-html-pipeline/pipeline/disabled/team_mention_filter_test.rb +202 -0
- data/spec/motion-html-pipeline/pipeline/disabled/toc_filter_spec.rb +2 -0
- data/spec/motion-html-pipeline/pipeline/https_filter_spec.rb +2 -0
- data/spec/motion-html-pipeline/pipeline/image_filter_spec.rb +2 -0
- data/spec/motion-html-pipeline/pipeline/image_max_width_filter_spec.rb +2 -0
- data/spec/motion-html-pipeline/pipeline_spec.rb +3 -1
- data/spec/spec_helper.rb +2 -0
- metadata +8 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a2bf83e4abe0c69678a81a1861cbb829ec6899410f07436f934c708d595b4a94
|
4
|
+
data.tar.gz: abfafa964af397acada8022caa80579e8114d41f382dc26ac5f462b4dddad88a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '048abc1ca29f81a1c54395eee5ab57ab07905c76ed38801846fab5c1e25ec6799cd9aa546d4850d8fae30bca6a85aae30422b2c39f562aecb7d709a26021f86e'
|
7
|
+
data.tar.gz: d2e83504949146542b7ac984758587dade9cfb2d2895ca824ecd45aec5816db70aeee5039333450a85b7b484bea506624d72500cc5257077fec3451df74f5814
|
data/README.md
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
[![Gem Version](https://badge.fury.io/rb/motion-html-pipeline.svg)](http://badge.fury.io/rb/motion-html-pipeline)
|
4
4
|
[![Build Status](https://travis-ci.org/digitalmoksha/motion-html-pipeline.svg?branch=master)](https://travis-ci.org/digitalmoksha/motion-html-pipeline)
|
5
5
|
|
6
|
-
_This gem is a port of the [`html-pipeline` gem](https://github.com/jch/html-pipeline) to RubyMotion, for use on iOS and macOS. Currently synced with `html-pipeline` release [`v.2.
|
6
|
+
_This gem is a port of the [`html-pipeline` gem](https://github.com/jch/html-pipeline) to RubyMotion, for use on iOS and macOS. Currently synced with `html-pipeline` release [`v.2.12.3`](https://github.com/jch/html-pipeline/releases/tag/v2.12.3)_
|
7
7
|
|
8
8
|
GitHub HTML processing filters and utilities. This module includes a small
|
9
9
|
framework for defining DOM based content filters and applying them to user
|
@@ -164,6 +164,7 @@ EmojiPipeline = Pipeline.new [
|
|
164
164
|
Several of the standard filters, such as `AutolinkFilter` and `EmojiFilter`, are initially disabled, as they rely on other Ruby gems that don't have RubyMotion equivalents. Please feel free to submit a pull request that enables any of them.
|
165
165
|
|
166
166
|
* `MentionFilter` - replace `@user` mentions with links
|
167
|
+
* `TeamMentionFilter` - replace `@org/team` mentions with links
|
167
168
|
* `AutolinkFilter` - auto_linking urls in HTML
|
168
169
|
* `CamoFilter` - replace http image urls with [camo-fied](https://github.com/atmos/camo) https versions
|
169
170
|
* `EmailReplyFilter` - util filter for working with emails
|
data/lib/motion-html-pipeline.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
unless defined?(Motion::Project::Config)
|
2
4
|
raise "This file must be required within a RubyMotion project Rakefile."
|
3
5
|
end
|
@@ -9,6 +11,6 @@ Motion::Project::App.setup do |app|
|
|
9
11
|
app.files.unshift(Dir.glob(File.join(lib_dir_path, "motion-html-pipeline/**/*.rb")))
|
10
12
|
|
11
13
|
app.pods do
|
12
|
-
pod 'HTMLKit', '~>
|
14
|
+
pod 'HTMLKit', '~> 3.1'
|
13
15
|
end
|
14
|
-
end
|
16
|
+
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# require 'set'
|
4
|
+
#
|
5
|
+
# module MotionHTMLPipeline
|
6
|
+
# class Pipeline
|
7
|
+
# # HTML filter that replaces @org/team mentions with links. Mentions within
|
8
|
+
# # <pre>, <code>, <a>, <style>, and <script> elements are ignored.
|
9
|
+
# #
|
10
|
+
# # Context options:
|
11
|
+
# # :base_url - Used to construct links to team profile pages for each
|
12
|
+
# # mention.
|
13
|
+
# # :team_pattern - Used to provide a custom regular expression to
|
14
|
+
# # identify team names
|
15
|
+
# #
|
16
|
+
# class TeamMentionFilter < Filter
|
17
|
+
# # Public: Find @org/team mentions in text. See
|
18
|
+
# # TeamMentionFilter#team_mention_link_filter.
|
19
|
+
# #
|
20
|
+
# # TeamMentionFilter.mentioned_teams_in(text) do |match, org, team|
|
21
|
+
# # "<a href=...>#{team}</a>"
|
22
|
+
# # end
|
23
|
+
# #
|
24
|
+
# # text - String text to search.
|
25
|
+
# #
|
26
|
+
# # Yields the String match, org name, and team name. The yield's
|
27
|
+
# # return replaces the match in the original text.
|
28
|
+
# #
|
29
|
+
# # Returns a String replaced with the return of the block.
|
30
|
+
# def self.mentioned_teams_in(text, team_pattern = TeamPattern)
|
31
|
+
# text.gsub team_pattern do |match|
|
32
|
+
# org = $1
|
33
|
+
# team = $2
|
34
|
+
# yield match, org, team
|
35
|
+
# end
|
36
|
+
# end
|
37
|
+
#
|
38
|
+
# # Default pattern used to extract team names from text. The value can be
|
39
|
+
# # overridden by providing the team_pattern variable in the context. To
|
40
|
+
# # properly link the mention, should be in the format of /@(1)\/(2)/.
|
41
|
+
# TeamPattern = /
|
42
|
+
# (?<=^|\W) # beginning of string or non-word char
|
43
|
+
# @([a-z0-9][a-z0-9-]*) # @organization
|
44
|
+
# \/ # dividing slash
|
45
|
+
# ([a-z0-9][a-z0-9\-_]*) # team
|
46
|
+
# \b
|
47
|
+
# /ix
|
48
|
+
#
|
49
|
+
# # Don't look for mentions in text nodes that are children of these elements
|
50
|
+
# IGNORE_PARENTS = %w[pre code a style script].to_set
|
51
|
+
#
|
52
|
+
# def call
|
53
|
+
# result[:mentioned_teams] ||= []
|
54
|
+
#
|
55
|
+
# doc.search('.//text()').each do |node|
|
56
|
+
# content = node.to_html
|
57
|
+
# next unless content.include?('@')
|
58
|
+
# next if has_ancestor?(node, IGNORE_PARENTS)
|
59
|
+
# html = mention_link_filter(content, base_url, team_pattern)
|
60
|
+
# next if html == content
|
61
|
+
# node.replace(html)
|
62
|
+
# end
|
63
|
+
# doc
|
64
|
+
# end
|
65
|
+
#
|
66
|
+
# def team_pattern
|
67
|
+
# context[:team_pattern] || TeamPattern
|
68
|
+
# end
|
69
|
+
#
|
70
|
+
# # Replace @org/team mentions in text with links to the mentioned team's
|
71
|
+
# # page.
|
72
|
+
# #
|
73
|
+
# # text - String text to replace @mention team names in.
|
74
|
+
# # base_url - The base URL used to construct team page URLs.
|
75
|
+
# # team_pattern - Regular expression used to identify teams in text
|
76
|
+
# #
|
77
|
+
# # Returns a string with @team mentions replaced with links. All links have a
|
78
|
+
# # 'team-mention' class name attached for styling.
|
79
|
+
# def mention_link_filter(text, _base_url = '/', team_pattern = TeamPattern)
|
80
|
+
# self.class.mentioned_teams_in(text, team_pattern) do |match, org, team|
|
81
|
+
# link = link_to_mentioned_team(org, team)
|
82
|
+
#
|
83
|
+
# link ? match.sub("@#{org}/#{team}", link) : match
|
84
|
+
# end
|
85
|
+
# end
|
86
|
+
#
|
87
|
+
# def link_to_mentioned_team(org, team)
|
88
|
+
# result[:mentioned_teams] |= [team]
|
89
|
+
#
|
90
|
+
# url = base_url.dup
|
91
|
+
# url << '/' unless url =~ /[\/~]\z/
|
92
|
+
#
|
93
|
+
# "<a href='#{url << org}/#{team}' class='team-mention'>" \
|
94
|
+
# "@#{org}/#{team}" \
|
95
|
+
# '</a>'
|
96
|
+
# end
|
97
|
+
# end
|
98
|
+
# end
|
99
|
+
# end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# MotionHTMLPipeline::Pipeline.require_dependency('commonmarker', 'MarkdownFilter')
|
2
4
|
#
|
3
5
|
# module MotionHTMLPipeline
|
@@ -9,10 +11,12 @@
|
|
9
11
|
# # Context options:
|
10
12
|
# # :gfm => false Disable GFM line-end processing
|
11
13
|
# # :commonmarker_extensions => [ :table, :strikethrough,
|
12
|
-
# # :tagfilter, :autolink ]
|
14
|
+
# # :tagfilter, :autolink ] Commonmarker extensions to include
|
13
15
|
# #
|
14
16
|
# # This filter does not write any additional information to the context hash.
|
15
17
|
# class MarkdownFilter < TextFilter
|
18
|
+
# DEFAULT_COMMONMARKER_EXTENSIONS = %i[table strikethrough tagfilter autolink].freeze
|
19
|
+
#
|
16
20
|
# def initialize(text, context = nil, result = nil)
|
17
21
|
# super text, context, result
|
18
22
|
# @text = @text.delete "\r"
|
@@ -21,14 +25,29 @@
|
|
21
25
|
# # Convert Markdown to HTML using the best available implementation
|
22
26
|
# # and convert into a DocumentFragment.
|
23
27
|
# def call
|
24
|
-
# options = [:GITHUB_PRE_LANG]
|
25
|
-
# options << :HARDBREAKS if context[:gfm] != false
|
26
|
-
# options << :UNSAFE if context[:unsafe]
|
27
28
|
# extensions = context.fetch(
|
28
29
|
# :commonmarker_extensions,
|
29
|
-
#
|
30
|
+
# DEFAULT_COMMONMARKER_EXTENSIONS
|
30
31
|
# )
|
31
|
-
# html =
|
32
|
+
# html = if (renderer = context[:commonmarker_renderer])
|
33
|
+
# unless renderer < CommonMarker::HtmlRenderer
|
34
|
+
# raise ArgumentError, "`commonmark_renderer` must be derived from `CommonMarker::HtmlRenderer`"
|
35
|
+
# end
|
36
|
+
# parse_options = :DEFAULT
|
37
|
+
# parse_options = [:UNSAFE] if context[:unsafe]
|
38
|
+
#
|
39
|
+
# render_options = [:GITHUB_PRE_LANG]
|
40
|
+
# render_options << :HARDBREAKS if context[:gfm] != false
|
41
|
+
# render_options = [:UNSAFE] if context[:unsafe]
|
42
|
+
#
|
43
|
+
# doc = CommonMarker.render_doc(@text, parse_options, extensions)
|
44
|
+
# renderer.new(options: render_options, extensions: extensions).render(doc)
|
45
|
+
# else
|
46
|
+
# options = [:GITHUB_PRE_LANG]
|
47
|
+
# options << :HARDBREAKS if context[:gfm] != false
|
48
|
+
# options << :UNSAFE if context[:unsafe]
|
49
|
+
# CommonMarker.render_html(@text, options, extensions)
|
50
|
+
# end
|
32
51
|
# html.rstrip!
|
33
52
|
# html
|
34
53
|
# end
|
@@ -1,9 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# MotionHTMLPipeline::Pipeline.require_dependency('rouge', 'SyntaxHighlightFilter')
|
2
4
|
#
|
3
5
|
# module MotionHTMLPipeline
|
4
6
|
# class Pipeline
|
5
|
-
# # HTML Filter that syntax highlights code blocks
|
6
|
-
# #
|
7
|
+
# # HTML Filter that syntax highlights text inside code blocks.
|
8
|
+
# #
|
9
|
+
# # Context options:
|
10
|
+
# #
|
11
|
+
# # :highlight => String represents the language to pick lexer. Defaults to empty string.
|
12
|
+
# # :scope => String represents the class attribute adds to pre element after.
|
13
|
+
# # Defaults to "highlight highlight-css" if highlights a css code block.
|
14
|
+
# #
|
15
|
+
# # This filter does not write any additional information to the context hash.
|
7
16
|
# class SyntaxHighlightFilter < Filter
|
8
17
|
# def initialize(*args)
|
9
18
|
# super(*args)
|
@@ -15,23 +24,20 @@
|
|
15
24
|
# default = context[:highlight] && context[:highlight].to_s
|
16
25
|
# next unless lang = node['lang'] || default
|
17
26
|
# next unless lexer = lexer_for(lang)
|
18
|
-
# text = node.inner_text
|
19
27
|
#
|
20
|
-
#
|
28
|
+
# text = node.inner_text
|
29
|
+
# html = highlight_with_timeout_handling(text, lexer)
|
21
30
|
# next if html.nil?
|
22
31
|
#
|
23
32
|
# node.inner_html = html
|
24
|
-
#
|
25
|
-
#
|
26
|
-
# klass = [klass, scope].compact.join ' '
|
27
|
-
#
|
28
|
-
# node['class'] = klass
|
33
|
+
# scope = context.fetch(:scope) { 'highlight' }
|
34
|
+
# node['class'] = "#{scope} #{scope}-#{lang}"
|
29
35
|
# end
|
30
36
|
# doc
|
31
37
|
# end
|
32
38
|
#
|
33
|
-
# def highlight_with_timeout_handling(text,
|
34
|
-
# Rouge.highlight(text,
|
39
|
+
# def highlight_with_timeout_handling(text, lexer)
|
40
|
+
# Rouge.highlight(text, lexer, @formatter)
|
35
41
|
# rescue Timeout::Error => _
|
36
42
|
# nil
|
37
43
|
# end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# MotionHTMLPipeline::Pipeline.require_dependency('escape_utils', 'TableOfContentsFilter')
|
2
4
|
#
|
3
5
|
# module MotionHTMLPipeline
|
@@ -33,7 +35,7 @@
|
|
33
35
|
# end
|
34
36
|
#
|
35
37
|
# def call
|
36
|
-
# result[:toc] = ''
|
38
|
+
# result[:toc] = String.new('')
|
37
39
|
#
|
38
40
|
# headers = Hash.new(0)
|
39
41
|
# doc.css('h1, h2, h3, h4, h5, h6').each do |node|
|
@@ -1,19 +1,41 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# describe 'MotionHTMLPipeline::Pipeline::MarkdownFilterTest' do
|
2
4
|
# MarkdownFilter = MotionHTMLPipeline::Pipeline::MarkdownFilter
|
3
5
|
#
|
6
|
+
# class CustomRenderer < CommonMarker::HtmlRenderer
|
7
|
+
# def header(node)
|
8
|
+
# block do
|
9
|
+
# text = node.first_child.string_content
|
10
|
+
# level = node.header_level
|
11
|
+
# out("{level: #{level}, text: #{text}}")
|
12
|
+
# super
|
13
|
+
# end
|
14
|
+
# end
|
15
|
+
# end
|
16
|
+
#
|
4
17
|
# def setup
|
5
18
|
# @haiku =
|
6
19
|
# "Pointing at the moon\n" \
|
7
|
-
#
|
8
|
-
#
|
20
|
+
# "Reminded of simple things\n" \
|
21
|
+
# 'Moments matter most'
|
9
22
|
# @links =
|
10
23
|
# 'See http://example.org/ for more info'
|
11
24
|
# @code =
|
12
25
|
# "```\n" \
|
13
|
-
#
|
14
|
-
#
|
15
|
-
#
|
16
|
-
#
|
26
|
+
# 'def hello()' \
|
27
|
+
# " 'world'" \
|
28
|
+
# 'end' \
|
29
|
+
# '```'
|
30
|
+
# @header = <<~DOC
|
31
|
+
# # Words
|
32
|
+
#
|
33
|
+
# Some words
|
34
|
+
#
|
35
|
+
# ## Words
|
36
|
+
#
|
37
|
+
# More words?
|
38
|
+
# DOC
|
17
39
|
# end
|
18
40
|
#
|
19
41
|
# def test_fails_when_given_a_documentfragment
|
@@ -59,6 +81,42 @@
|
|
59
81
|
# doc = MarkdownFilter.new(iframe, commonmarker_extensions: [], unsafe: true).call
|
60
82
|
# assert_equal(doc, iframe)
|
61
83
|
# end
|
84
|
+
#
|
85
|
+
# def test_bogus_renderer
|
86
|
+
# assert_raises ArgumentError do
|
87
|
+
# MarkdownFilter.to_document(@haiku, commonmarker_renderer: 23)
|
88
|
+
# end
|
89
|
+
# end
|
90
|
+
#
|
91
|
+
# def test_legitimate_renderer
|
92
|
+
# results = MarkdownFilter.new(@header, commonmarker_renderer: CustomRenderer).call
|
93
|
+
# expected = <<~DOC
|
94
|
+
# {level: 1, text: Words}
|
95
|
+
# <h1>Words</h1>
|
96
|
+
# <p>Some words</p>
|
97
|
+
# {level: 2, text: Words}
|
98
|
+
# <h2>Words</h2>
|
99
|
+
# <p>More words?</p>
|
100
|
+
# DOC
|
101
|
+
#
|
102
|
+
# assert_equal results, expected.chomp
|
103
|
+
# end
|
104
|
+
#
|
105
|
+
# def test_without_tagfilter
|
106
|
+
# extensions = HTML::Pipeline::MarkdownFilter::DEFAULT_COMMONMARKER_EXTENSIONS - [:tagfilter]
|
107
|
+
# script = '<script>foobar</script>'
|
108
|
+
# results = MarkdownFilter.new(script, unsafe: true, commonmarker_extensions: extensions).call
|
109
|
+
#
|
110
|
+
# assert_equal results, script
|
111
|
+
# end
|
112
|
+
#
|
113
|
+
# def test_legitimate_custom_renderer_without_tagfilter
|
114
|
+
# extensions = HTML::Pipeline::MarkdownFilter::DEFAULT_COMMONMARKER_EXTENSIONS - [:tagfilter]
|
115
|
+
# script = '<script>foobar</script>'
|
116
|
+
# results = MarkdownFilter.new(script, unsafe: true, commonmarker_extensions: extensions, commonmarker_renderer: CustomRenderer).call
|
117
|
+
#
|
118
|
+
# assert_equal results, script
|
119
|
+
# end
|
62
120
|
# end
|
63
121
|
#
|
64
122
|
# class GFMTest < Minitest::Test
|
@@ -109,4 +167,3 @@
|
|
109
167
|
# assert_equal "<ul>\n<li>foo</li>\n<li>bar</li>\n</ul>",
|
110
168
|
# gfm("* foo\n* bar")
|
111
169
|
# end
|
112
|
-
# end
|
@@ -0,0 +1,214 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# require 'test_helper'
|
4
|
+
|
5
|
+
# describe 'MotionHTMLPipeline::Pipeline::MentionFilterTest' do
|
6
|
+
# def filter(html, base_url = '/', info_url = nil, username_pattern = nil)
|
7
|
+
# HTML::Pipeline::MentionFilter.call(html, base_url: base_url, info_url: info_url, username_pattern: username_pattern)
|
8
|
+
# end
|
9
|
+
#
|
10
|
+
# def test_filtering_a_documentfragment
|
11
|
+
# body = '<p>@kneath: check it out.</p>'
|
12
|
+
# doc = Nokogiri::HTML::DocumentFragment.parse(body)
|
13
|
+
#
|
14
|
+
# res = filter(doc, '/')
|
15
|
+
# assert_same doc, res
|
16
|
+
#
|
17
|
+
# link = '<a href="/kneath" class="user-mention">@kneath</a>'
|
18
|
+
# assert_equal "<p>#{link}: check it out.</p>",
|
19
|
+
# res.to_html
|
20
|
+
# end
|
21
|
+
#
|
22
|
+
# def test_filtering_plain_text
|
23
|
+
# body = '<p>@kneath: check it out.</p>'
|
24
|
+
# res = filter(body, '/')
|
25
|
+
#
|
26
|
+
# link = '<a href="/kneath" class="user-mention">@kneath</a>'
|
27
|
+
# assert_equal "<p>#{link}: check it out.</p>",
|
28
|
+
# res.to_html
|
29
|
+
# end
|
30
|
+
#
|
31
|
+
# def test_not_replacing_mentions_in_pre_tags
|
32
|
+
# body = '<pre>@kneath: okay</pre>'
|
33
|
+
# assert_equal body, filter(body).to_html
|
34
|
+
# end
|
35
|
+
#
|
36
|
+
# def test_not_replacing_mentions_in_code_tags
|
37
|
+
# body = '<p><code>@kneath:</code> okay</p>'
|
38
|
+
# assert_equal body, filter(body).to_html
|
39
|
+
# end
|
40
|
+
#
|
41
|
+
# def test_not_replacing_mentions_in_style_tags
|
42
|
+
# body = '<style>@media (min-width: 768px) { color: red; }</style>'
|
43
|
+
# assert_equal body, filter(body).to_html
|
44
|
+
# end
|
45
|
+
#
|
46
|
+
# def test_not_replacing_mentions_in_links
|
47
|
+
# body = '<p><a>@kneath</a> okay</p>'
|
48
|
+
# assert_equal body, filter(body).to_html
|
49
|
+
# end
|
50
|
+
#
|
51
|
+
# def test_entity_encoding_and_whatnot
|
52
|
+
# body = "<p>@kneath what's up</p>"
|
53
|
+
# link = '<a href="/kneath" class="user-mention">@kneath</a>'
|
54
|
+
# assert_equal "<p>#{link} what's up</p>", filter(body, '/').to_html
|
55
|
+
# end
|
56
|
+
#
|
57
|
+
# def test_html_injection
|
58
|
+
# body = '<p>@kneath <script>alert(0)</script></p>'
|
59
|
+
# link = '<a href="/kneath" class="user-mention">@kneath</a>'
|
60
|
+
# assert_equal "<p>#{link} <script>alert(0)</script></p>",
|
61
|
+
# filter(body, '/').to_html
|
62
|
+
# end
|
63
|
+
#
|
64
|
+
# def test_links_to_nothing_when_no_info_url_given
|
65
|
+
# body = '<p>How do I @mention someone?</p>'
|
66
|
+
# assert_equal '<p>How do I @mention someone?</p>',
|
67
|
+
# filter(body, '/').to_html
|
68
|
+
# end
|
69
|
+
#
|
70
|
+
# def test_links_to_more_info_when_info_url_given
|
71
|
+
# body = '<p>How do I @mention someone?</p>'
|
72
|
+
# link = '<a href="https://github.com/blog/821" class="user-mention">@mention</a>'
|
73
|
+
# assert_equal "<p>How do I #{link} someone?</p>",
|
74
|
+
# filter(body, '/', 'https://github.com/blog/821').to_html
|
75
|
+
# end
|
76
|
+
#
|
77
|
+
# def test_base_url_slash
|
78
|
+
# body = '<p>Hi, @jch!</p>'
|
79
|
+
# link = '<a href="/jch" class="user-mention">@jch</a>'
|
80
|
+
# assert_equal "<p>Hi, #{link}!</p>",
|
81
|
+
# filter(body, '/').to_html
|
82
|
+
# end
|
83
|
+
#
|
84
|
+
# def test_base_url_under_custom_route
|
85
|
+
# body = '<p>Hi, @jch!</p>'
|
86
|
+
# link = '<a href="/userprofile/jch" class="user-mention">@jch</a>'
|
87
|
+
# assert_equal "<p>Hi, #{link}!</p>",
|
88
|
+
# filter(body, '/userprofile').to_html
|
89
|
+
# end
|
90
|
+
#
|
91
|
+
# def test_base_url_slash_with_tilde
|
92
|
+
# body = '<p>Hi, @jch!</p>'
|
93
|
+
# link = '<a href="/~jch" class="user-mention">@jch</a>'
|
94
|
+
# assert_equal "<p>Hi, #{link}!</p>",
|
95
|
+
# filter(body, '/~').to_html
|
96
|
+
# end
|
97
|
+
#
|
98
|
+
# MarkdownPipeline =
|
99
|
+
# HTML::Pipeline.new [
|
100
|
+
# HTML::Pipeline::MarkdownFilter,
|
101
|
+
# HTML::Pipeline::MentionFilter
|
102
|
+
# ]
|
103
|
+
#
|
104
|
+
# def mentioned_usernames
|
105
|
+
# result = {}
|
106
|
+
# MarkdownPipeline.call(@body, {}, result)
|
107
|
+
# result[:mentioned_usernames]
|
108
|
+
# end
|
109
|
+
#
|
110
|
+
# def test_matches_usernames_in_body
|
111
|
+
# @body = '@test how are you?'
|
112
|
+
# assert_equal %w[test], mentioned_usernames
|
113
|
+
# end
|
114
|
+
#
|
115
|
+
# def test_matches_usernames_with_dashes
|
116
|
+
# @body = 'hi @some-user'
|
117
|
+
# assert_equal %w[some-user], mentioned_usernames
|
118
|
+
# end
|
119
|
+
#
|
120
|
+
# def test_matches_usernames_followed_by_a_single_dot
|
121
|
+
# @body = 'okay @some-user.'
|
122
|
+
# assert_equal %w[some-user], mentioned_usernames
|
123
|
+
# end
|
124
|
+
#
|
125
|
+
# def test_matches_usernames_followed_by_multiple_dots
|
126
|
+
# @body = 'okay @some-user...'
|
127
|
+
# assert_equal %w[some-user], mentioned_usernames
|
128
|
+
# end
|
129
|
+
#
|
130
|
+
# def test_does_not_match_email_addresses
|
131
|
+
# @body = 'aman@tmm1.net'
|
132
|
+
# assert_equal [], mentioned_usernames
|
133
|
+
# end
|
134
|
+
#
|
135
|
+
# def test_does_not_match_domain_name_looking_things
|
136
|
+
# @body = 'we need a @github.com email'
|
137
|
+
# assert_equal [], mentioned_usernames
|
138
|
+
# end
|
139
|
+
#
|
140
|
+
# def test_does_not_match_organization_team_mentions
|
141
|
+
# @body = 'we need to @github/enterprise know'
|
142
|
+
# assert_equal [], mentioned_usernames
|
143
|
+
# end
|
144
|
+
#
|
145
|
+
# def test_matches_colon_suffixed_names
|
146
|
+
# @body = '@tmm1: what do you think?'
|
147
|
+
# assert_equal %w[tmm1], mentioned_usernames
|
148
|
+
# end
|
149
|
+
#
|
150
|
+
# def test_matches_list_of_names
|
151
|
+
# @body = '@defunkt @atmos @kneath'
|
152
|
+
# assert_equal %w[defunkt atmos kneath], mentioned_usernames
|
153
|
+
# end
|
154
|
+
#
|
155
|
+
# def test_matches_list_of_names_with_commas
|
156
|
+
# @body = '/cc @defunkt, @atmos, @kneath'
|
157
|
+
# assert_equal %w[defunkt atmos kneath], mentioned_usernames
|
158
|
+
# end
|
159
|
+
#
|
160
|
+
# def test_matches_inside_brackets
|
161
|
+
# @body = '(@mislav) and [@rtomayko]'
|
162
|
+
# assert_equal %w[mislav rtomayko], mentioned_usernames
|
163
|
+
# end
|
164
|
+
#
|
165
|
+
# def test_doesnt_ignore_invalid_users
|
166
|
+
# @body = '@defunkt @mojombo and @somedude'
|
167
|
+
# assert_equal %w[defunkt mojombo somedude], mentioned_usernames
|
168
|
+
# end
|
169
|
+
#
|
170
|
+
# def test_returns_distinct_set
|
171
|
+
# @body = '/cc @defunkt, @atmos, @kneath, @defunkt, @defunkt'
|
172
|
+
# assert_equal %w[defunkt atmos kneath], mentioned_usernames
|
173
|
+
# end
|
174
|
+
#
|
175
|
+
# def test_does_not_match_inline_code_block_with_multiple_code_blocks
|
176
|
+
# @body = "something\n\n`/cc @defunkt @atmos @kneath` `/cc @atmos/atmos`"
|
177
|
+
# assert_equal %w[], mentioned_usernames
|
178
|
+
# end
|
179
|
+
#
|
180
|
+
# def test_mention_at_end_of_parenthetical_sentence
|
181
|
+
# @body = "(We're talking 'bout @ymendel.)"
|
182
|
+
# assert_equal %w[ymendel], mentioned_usernames
|
183
|
+
# end
|
184
|
+
#
|
185
|
+
# def test_username_pattern_can_be_customized
|
186
|
+
# body = '<p>@_abc: test.</p>'
|
187
|
+
# doc = Nokogiri::HTML::DocumentFragment.parse(body)
|
188
|
+
#
|
189
|
+
# res = filter(doc, '/', nil, /(_[a-z]{3})/)
|
190
|
+
#
|
191
|
+
# link = '<a href="/_abc" class="user-mention">@_abc</a>'
|
192
|
+
# assert_equal "<p>#{link}: test.</p>",
|
193
|
+
# res.to_html
|
194
|
+
# end
|
195
|
+
#
|
196
|
+
# def test_filter_does_not_create_a_new_object_for_default_username_pattern
|
197
|
+
# body = '<div>@test</div>'
|
198
|
+
# doc = Nokogiri::HTML::DocumentFragment.parse(body)
|
199
|
+
#
|
200
|
+
# filter(doc.clone, '/', nil)
|
201
|
+
# pattern_count = HTML::Pipeline::MentionFilter::MentionPatterns.length
|
202
|
+
# filter(doc.clone, '/', nil)
|
203
|
+
#
|
204
|
+
# assert_equal pattern_count, HTML::Pipeline::MentionFilter::MentionPatterns.length
|
205
|
+
# filter(doc.clone, '/', nil, /test/)
|
206
|
+
# assert_equal pattern_count + 1, HTML::Pipeline::MentionFilter::MentionPatterns.length
|
207
|
+
# end
|
208
|
+
#
|
209
|
+
# def test_mention_link_filter
|
210
|
+
# filter = HTML::Pipeline::MentionFilter.new nil
|
211
|
+
# expected = "<a href='/hubot' class='user-mention'>@hubot</a>"
|
212
|
+
# assert_equal expected, filter.mention_link_filter('@hubot')
|
213
|
+
# end
|
214
|
+
# end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# describe 'MotionHTMLPipeline::Pipeline::SyntaxHighlightFilterTest' do
|
2
4
|
# SyntaxHighlightFilter = MotionHTMLPipeline::Pipeline::SyntaxHighlightFilter
|
3
5
|
#
|
@@ -6,6 +8,7 @@
|
|
6
8
|
# '<pre>hello</pre>', highlight: 'coffeescript'
|
7
9
|
#
|
8
10
|
# doc = filter.call
|
11
|
+
# assert !doc.css('.highlight').empty?
|
9
12
|
# assert !doc.css('.highlight-coffeescript').empty?
|
10
13
|
# end
|
11
14
|
#
|
@@ -0,0 +1,202 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# require 'test_helper'
|
4
|
+
|
5
|
+
# describe 'MotionHTMLPipeline::Pipeline::TeamMentionFilterTest' do
|
6
|
+
# def filter(html, base_url = '/', team_pattern = nil)
|
7
|
+
# HTML::Pipeline::TeamMentionFilter.call(html, base_url: base_url, team_pattern: team_pattern)
|
8
|
+
# end
|
9
|
+
#
|
10
|
+
# def test_filtering_plain_text
|
11
|
+
# body = '<p>@github/team: check it out.</p>'
|
12
|
+
# res = filter(body, '/')
|
13
|
+
#
|
14
|
+
# link = '<a href="/github/team" class="team-mention">@github/team</a>'
|
15
|
+
# assert_equal "<p>#{link}: check it out.</p>",
|
16
|
+
# res.to_html
|
17
|
+
# end
|
18
|
+
#
|
19
|
+
# def test_filtering_a_documentfragment
|
20
|
+
# body = '<p>@github/team: check it out.</p>'
|
21
|
+
# doc = Nokogiri::HTML::DocumentFragment.parse(body)
|
22
|
+
#
|
23
|
+
# res = filter(doc, '/')
|
24
|
+
# assert_same doc, res
|
25
|
+
#
|
26
|
+
# link = '<a href="/github/team" class="team-mention">@github/team</a>'
|
27
|
+
# assert_equal "<p>#{link}: check it out.</p>",
|
28
|
+
# res.to_html
|
29
|
+
# end
|
30
|
+
#
|
31
|
+
# def test_not_replacing_mentions_in_pre_tags
|
32
|
+
# body = '<pre>@github/team: okay</pre>'
|
33
|
+
# assert_equal body, filter(body).to_html
|
34
|
+
# end
|
35
|
+
#
|
36
|
+
# def test_not_replacing_mentions_in_code_tags
|
37
|
+
# body = '<p><code>@github/team:</code> okay</p>'
|
38
|
+
# assert_equal body, filter(body).to_html
|
39
|
+
# end
|
40
|
+
#
|
41
|
+
# def test_not_replacing_mentions_in_style_tags
|
42
|
+
# body = '<style>@github/team (min-width: 768px) { color: red; }</style>'
|
43
|
+
# assert_equal body, filter(body).to_html
|
44
|
+
# end
|
45
|
+
#
|
46
|
+
# def test_not_replacing_mentions_in_links
|
47
|
+
# body = '<p><a>@github/team</a> okay</p>'
|
48
|
+
# assert_equal body, filter(body).to_html
|
49
|
+
# end
|
50
|
+
#
|
51
|
+
# def test_entity_encoding_and_whatnot
|
52
|
+
# body = "<p>@github/team what's up</p>"
|
53
|
+
# link = '<a href="/github/team" class="team-mention">@github/team</a>'
|
54
|
+
# assert_equal "<p>#{link} what's up</p>", filter(body, '/').to_html
|
55
|
+
# end
|
56
|
+
#
|
57
|
+
# def test_html_injection
|
58
|
+
# body = '<p>@github/team <script>alert(0)</script></p>'
|
59
|
+
# link = '<a href="/github/team" class="team-mention">@github/team</a>'
|
60
|
+
# assert_equal "<p>#{link} <script>alert(0)</script></p>",
|
61
|
+
# filter(body, '/').to_html
|
62
|
+
# end
|
63
|
+
#
|
64
|
+
# def test_links_to_nothing_with_user_mention
|
65
|
+
# body = '<p>Hi, @kneath</p>'
|
66
|
+
# assert_equal '<p>Hi, @kneath</p>',
|
67
|
+
# filter(body, '/').to_html
|
68
|
+
# end
|
69
|
+
#
|
70
|
+
# def test_base_url_slash
|
71
|
+
# body = '<p>Hi, @github/team!</p>'
|
72
|
+
# link = '<a href="/github/team" class="team-mention">@github/team</a>'
|
73
|
+
# assert_equal "<p>Hi, #{link}!</p>",
|
74
|
+
# filter(body, '/').to_html
|
75
|
+
# end
|
76
|
+
#
|
77
|
+
# def test_base_url_under_custom_route
|
78
|
+
# body = '<p>Hi, @org/team!</p>'
|
79
|
+
# link = '<a href="www.github.com/org/team" class="team-mention">@org/team</a>'
|
80
|
+
# assert_equal "<p>Hi, #{link}!</p>",
|
81
|
+
# filter(body, 'www.github.com').to_html
|
82
|
+
# end
|
83
|
+
#
|
84
|
+
# def test_base_url_slash_with_tilde
|
85
|
+
# body = '<p>Hi, @github/team!</p>'
|
86
|
+
# link = '<a href="/~github/team" class="team-mention">@github/team</a>'
|
87
|
+
# assert_equal "<p>Hi, #{link}!</p>",
|
88
|
+
# filter(body, '/~').to_html
|
89
|
+
# end
|
90
|
+
#
|
91
|
+
# def test_multiple_team_mentions
|
92
|
+
# body = '<p>Hi, @github/whale and @github/donut!</p>'
|
93
|
+
# link_whale = '<a href="/github/whale" class="team-mention">@github/whale</a>'
|
94
|
+
# link_donut = '<a href="/github/donut" class="team-mention">@github/donut</a>'
|
95
|
+
# assert_equal "<p>Hi, #{link_whale} and #{link_donut}!</p>",
|
96
|
+
# filter(body).to_html
|
97
|
+
# end
|
98
|
+
#
|
99
|
+
# MarkdownPipeline =
|
100
|
+
# HTML::Pipeline.new [
|
101
|
+
# HTML::Pipeline::MarkdownFilter,
|
102
|
+
# HTML::Pipeline::TeamMentionFilter
|
103
|
+
# ]
|
104
|
+
#
|
105
|
+
# def mentioned_teams
|
106
|
+
# result = {}
|
107
|
+
# MarkdownPipeline.call(@body, {}, result)
|
108
|
+
# result[:mentioned_teams]
|
109
|
+
# end
|
110
|
+
#
|
111
|
+
# def test_matches_teams_in_body
|
112
|
+
# @body = '@test/team how are you?'
|
113
|
+
# assert_equal %w[team], mentioned_teams
|
114
|
+
# end
|
115
|
+
#
|
116
|
+
# def test_matches_orgs_with_dashes
|
117
|
+
# @body = 'hi @some-org/team'
|
118
|
+
# assert_equal %w[team], mentioned_teams
|
119
|
+
# end
|
120
|
+
#
|
121
|
+
# def test_matches_teams_with_dashes
|
122
|
+
# @body = 'hi @github/some-team'
|
123
|
+
# assert_equal %w[some-team], mentioned_teams
|
124
|
+
# end
|
125
|
+
#
|
126
|
+
# def test_matches_teams_followed_by_a_single_dot
|
127
|
+
# @body = 'okay @github/team.'
|
128
|
+
# assert_equal %w[team], mentioned_teams
|
129
|
+
# end
|
130
|
+
#
|
131
|
+
# def test_matches_teams_followed_by_multiple_dots
|
132
|
+
# @body = 'okay @github/team...'
|
133
|
+
# assert_equal %w[team], mentioned_teams
|
134
|
+
# end
|
135
|
+
#
|
136
|
+
# def test_does_not_match_email_addresses
|
137
|
+
# @body = 'aman@tmm1.net'
|
138
|
+
# assert_equal [], mentioned_teams
|
139
|
+
# end
|
140
|
+
#
|
141
|
+
# def test_does_not_match_domain_name_looking_things
|
142
|
+
# @body = 'we need a @github.com email'
|
143
|
+
# assert_equal [], mentioned_teams
|
144
|
+
# end
|
145
|
+
#
|
146
|
+
# def test_does_not_match_user_mentions
|
147
|
+
# @body = 'we need to @enterprise know'
|
148
|
+
# assert_equal [], mentioned_teams
|
149
|
+
# end
|
150
|
+
#
|
151
|
+
# def test_matches_colon_suffixed_team_names
|
152
|
+
# @body = '@github/team: what do you think?'
|
153
|
+
# assert_equal %w[team], mentioned_teams
|
154
|
+
# end
|
155
|
+
#
|
156
|
+
# def test_matches_list_of_teams
|
157
|
+
# @body = '@github/whale @github/donut @github/green'
|
158
|
+
# assert_equal %w[whale donut green], mentioned_teams
|
159
|
+
# end
|
160
|
+
#
|
161
|
+
# def test_matches_list_of_teams_with_commas
|
162
|
+
# @body = '/cc @github/whale, @github/donut, @github/green'
|
163
|
+
# assert_equal %w[whale donut green], mentioned_teams
|
164
|
+
# end
|
165
|
+
#
|
166
|
+
# def test_matches_inside_brackets
|
167
|
+
# @body = '(@github/whale) and [@github/donut]'
|
168
|
+
# assert_equal %w[whale donut], mentioned_teams
|
169
|
+
# end
|
170
|
+
#
|
171
|
+
# def test_returns_distinct_set
|
172
|
+
# @body = '/cc @github/whale, @github/donut, @github/whale, @github/whale'
|
173
|
+
# assert_equal %w[whale donut], mentioned_teams
|
174
|
+
# end
|
175
|
+
#
|
176
|
+
# def test_does_not_match_inline_code_block_with_multiple_code_blocks
|
177
|
+
# @body = "something\n\n`/cc @github/whale @github/donut @github/green` `/cc @donut/donut`"
|
178
|
+
# assert_equal %w[], mentioned_teams
|
179
|
+
# end
|
180
|
+
#
|
181
|
+
# def test_mention_at_end_of_parenthetical_sentence
|
182
|
+
# @body = "(We're talking 'bout @some-org/some-team.)"
|
183
|
+
# assert_equal %w[some-team], mentioned_teams
|
184
|
+
# end
|
185
|
+
#
|
186
|
+
# def test_team_pattern_can_be_customized
|
187
|
+
# body = '<p>@_abc/XYZ: test</p>'
|
188
|
+
# doc = Nokogiri::HTML::DocumentFragment.parse(body)
|
189
|
+
#
|
190
|
+
# res = filter(doc, '/', /@(_[a-z]{3})\/([A-Z]{3})/)
|
191
|
+
#
|
192
|
+
# link = '<a href="/_abc/XYZ" class="team-mention">@_abc/XYZ</a>'
|
193
|
+
# assert_equal "<p>#{link}: test</p>",
|
194
|
+
# res.to_html
|
195
|
+
# end
|
196
|
+
#
|
197
|
+
# def test_mention_link_filter
|
198
|
+
# filter = HTML::Pipeline::TeamMentionFilter.new nil
|
199
|
+
# expected = "<a href='/bot/hubot' class='team-mention'>@bot/hubot</a>"
|
200
|
+
# assert_equal expected, filter.mention_link_filter('@bot/hubot')
|
201
|
+
# end
|
202
|
+
# end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: motion-html-pipeline
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0.
|
4
|
+
version: '0.3'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryan Tomayko
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date:
|
14
|
+
date: 2020-04-11 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: motion-cocoapods
|
@@ -72,6 +72,7 @@ files:
|
|
72
72
|
- lib/motion-html-pipeline/pipeline/absolute_source_filter.rb
|
73
73
|
- lib/motion-html-pipeline/pipeline/body_content.rb
|
74
74
|
- lib/motion-html-pipeline/pipeline/disabled/@mention_filter.rb
|
75
|
+
- lib/motion-html-pipeline/pipeline/disabled/@team_mention_filter.rb
|
75
76
|
- lib/motion-html-pipeline/pipeline/disabled/autolink_filter.rb
|
76
77
|
- lib/motion-html-pipeline/pipeline/disabled/camo_filter.rb
|
77
78
|
- lib/motion-html-pipeline/pipeline/disabled/email_reply_filter.rb
|
@@ -94,9 +95,11 @@ files:
|
|
94
95
|
- spec/motion-html-pipeline/pipeline/disabled/email_reply_filter_spec.rb
|
95
96
|
- spec/motion-html-pipeline/pipeline/disabled/emoji_filter_spec.rb
|
96
97
|
- spec/motion-html-pipeline/pipeline/disabled/markdown_filter_spec.rb
|
98
|
+
- spec/motion-html-pipeline/pipeline/disabled/mention_filter_test.rb
|
97
99
|
- spec/motion-html-pipeline/pipeline/disabled/plain_text_input_filter_spec.rb
|
98
100
|
- spec/motion-html-pipeline/pipeline/disabled/sanitization_filter_spec.rb
|
99
101
|
- spec/motion-html-pipeline/pipeline/disabled/syntax_highlighting_filter_spec.rb
|
102
|
+
- spec/motion-html-pipeline/pipeline/disabled/team_mention_filter_test.rb
|
100
103
|
- spec/motion-html-pipeline/pipeline/disabled/toc_filter_spec.rb
|
101
104
|
- spec/motion-html-pipeline/pipeline/https_filter_spec.rb
|
102
105
|
- spec/motion-html-pipeline/pipeline/image_filter_spec.rb
|
@@ -122,8 +125,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
122
125
|
- !ruby/object:Gem::Version
|
123
126
|
version: '0'
|
124
127
|
requirements: []
|
125
|
-
|
126
|
-
rubygems_version: 2.7.6
|
128
|
+
rubygems_version: 3.0.6
|
127
129
|
signing_key:
|
128
130
|
specification_version: 4
|
129
131
|
summary: Helpers for processing content through a chain of filters (RubyMotion version,
|
@@ -137,11 +139,13 @@ test_files:
|
|
137
139
|
- spec/motion-html-pipeline/pipeline/disabled/camo_filter_spec.rb
|
138
140
|
- spec/motion-html-pipeline/pipeline/disabled/emoji_filter_spec.rb
|
139
141
|
- spec/motion-html-pipeline/pipeline/disabled/email_reply_filter_spec.rb
|
142
|
+
- spec/motion-html-pipeline/pipeline/disabled/mention_filter_test.rb
|
140
143
|
- spec/motion-html-pipeline/pipeline/disabled/toc_filter_spec.rb
|
141
144
|
- spec/motion-html-pipeline/pipeline/disabled/sanitization_filter_spec.rb
|
142
145
|
- spec/motion-html-pipeline/pipeline/disabled/syntax_highlighting_filter_spec.rb
|
143
146
|
- spec/motion-html-pipeline/pipeline/disabled/markdown_filter_spec.rb
|
144
147
|
- spec/motion-html-pipeline/pipeline/disabled/auto_link_filter_spec.rb
|
145
148
|
- spec/motion-html-pipeline/pipeline/disabled/plain_text_input_filter_spec.rb
|
149
|
+
- spec/motion-html-pipeline/pipeline/disabled/team_mention_filter_test.rb
|
146
150
|
- spec/motion-html-pipeline/_helpers/mock_instumentation_service.rb
|
147
151
|
- spec/motion-html-pipeline/pipeline_spec.rb
|