Skip to content

Commit e35f5b9

Browse files
committed
Make sure every filter can work with context
1 parent 6f51e52 commit e35f5b9

File tree

7 files changed

+56
-8
lines changed

7 files changed

+56
-8
lines changed

lib/html_pipeline.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ def call(text, context: {}, result: {})
160160
instrument("call_text_filters.html_pipeline", payload) do
161161
result[:output] =
162162
@text_filters.inject(text) do |doc, filter|
163-
perform_filter(filter, doc, context: context, result: result)
163+
perform_filter(filter, doc, context: (filter.context || {}).merge(context), result: result)
164164
end
165165
end
166166
end
@@ -171,7 +171,7 @@ def call(text, context: {}, result: {})
171171
text
172172
else
173173
instrument("call_convert_filter.html_pipeline", payload) do
174-
html = @convert_filter.call(text, context: context)
174+
html = @convert_filter.call(text, context: (@convert_filter.context || {}).merge(context))
175175
end
176176
end
177177

lib/html_pipeline/convert_filter/markdown_filter.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
HTMLPipeline.require_dependency("commonmarker", "MarkdownFilter")
44

55
class HTMLPipeline
6-
class ConvertFilter
6+
class ConvertFilter < Filter
77
# HTML Filter that converts Markdown text into HTML.
88
#
99
# Context options:

lib/html_pipeline/filter.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ class HTMLPipeline
1616
# Each filter may define additional options and output values. See the class
1717
# docs for more info.
1818
class Filter
19+
attr_accessor :context
20+
1921
class InvalidDocumentException < StandardError; end
2022

2123
def initialize(context: {}, result: {})

lib/html_pipeline/node_filter.rb

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44

55
class HTMLPipeline
66
class NodeFilter < Filter
7-
attr_accessor :context
8-
97
def initialize(context: {}, result: {})
108
super(context: context, result: {})
119
send(:after_initialize) if respond_to?(:after_initialize)

test/html_pipeline/node_filter/table_of_contents_filter_test.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ def test_anchors_and_list_are_added_properly
2828
def test_custom_anchor_html_added_properly
2929
orig = %(# Ice cube)
3030
expected = %(<h1><a href="#ice-cube" aria-hidden="true" id="ice-cube" class="anchor">#</a>Ice cube</h1>)
31-
pipeline = HTMLPipeline.new(convert_filter: HTMLPipeline::ConvertFilter::MarkdownFilter, node_filters: [
31+
pipeline = HTMLPipeline.new(convert_filter: HTMLPipeline::ConvertFilter::MarkdownFilter.new, node_filters: [
3232
TocFilter.new(context: { anchor_html: "#" }),
3333
])
3434
result = pipeline.call(orig)

test/html_pipeline_test.rb

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ def test_context_is_carried_over_in_call
134134
assert_equal("<p><strong>yeH</strong>! I <em>think</em> <a href=\"/gjtorikian\">@gjtorikian</a> is <del>great</del>!</p>", result)
135135

136136
context = {
137-
no_bolding: false,
137+
bolded: false,
138138
markdown: { extension: { strikethrough: false } },
139139
base_url: "http://your-domain.com",
140140
}
@@ -146,4 +146,52 @@ def test_context_is_carried_over_in_call
146146
# - mentions are linked
147147
assert_equal("<p>yeH! I <em>think</em> <a href=\"http://your-domain.com/gjtorikian\">@gjtorikian</a> is ~great~!</p>", result_with_context)
148148
end
149+
150+
def test_text_filter_instance_context_is_carried_over_in_call
151+
text = "yeH! I _think_ <marquee>@gjtorikian is ~great~</marquee>!"
152+
153+
pipeline = HTMLPipeline.new(
154+
text_filters: [YehBolderFilter.new(context: { bolded: false })],
155+
convert_filter: HTMLPipeline::ConvertFilter::MarkdownFilter.new,
156+
node_filters: [HTMLPipeline::NodeFilter::MentionFilter.new],
157+
)
158+
159+
result = pipeline.call(text)[:output]
160+
161+
# note:
162+
# - yeH is not bolded due to previous context
163+
assert_equal("<p>yeH! I <em>think</em> <a href=\"/gjtorikian\">@gjtorikian</a> is <del>great</del>!</p>", result)
164+
end
165+
166+
def test_convert_filter_instance_context_is_carried_over_in_call
167+
text = "yeH! I _think_ <marquee>@gjtorikian is ~great~</marquee>!"
168+
169+
pipeline = HTMLPipeline.new(
170+
text_filters: [YehBolderFilter.new],
171+
convert_filter: HTMLPipeline::ConvertFilter::MarkdownFilter.new(context: { extension: { strikethrough: false } }),
172+
node_filters: [HTMLPipeline::NodeFilter::MentionFilter.new],
173+
)
174+
175+
result = pipeline.call(text)[:output]
176+
177+
# note:
178+
# - strikethroughs are not rendered due to previous context
179+
assert_equal("<p><strong>yeH</strong>! I <em>think</em> <a href=\"/gjtorikian\">@gjtorikian</a> is <del>great</del>!</p>", result)
180+
end
181+
182+
def test_node_filter_instance_context_is_carried_over_in_call
183+
text = "yeH! I _think_ <marquee>@gjtorikian is ~great~</marquee>!"
184+
185+
pipeline = HTMLPipeline.new(
186+
text_filters: [YehBolderFilter.new],
187+
convert_filter: HTMLPipeline::ConvertFilter::MarkdownFilter.new,
188+
node_filters: [HTMLPipeline::NodeFilter::MentionFilter.new(context: { base_url: "http://your-domain.com" })],
189+
)
190+
191+
result = pipeline.call(text)[:output]
192+
193+
# note:
194+
# - mentions are linked
195+
assert_equal("<p><strong>yeH</strong>! I <em>think</em> <a href=\"http://your-domain.com/gjtorikian\">@gjtorikian</a> is <del>great</del>!</p>", result)
196+
end
149197
end

test/test_helper.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,6 @@ def call(input, context: {}, result: {})
2525
# bolds any instance of the word yeH
2626
class YehBolderFilter < HTMLPipeline::TextFilter
2727
def call(input, context: {}, result: {})
28-
input.gsub("yeH", "**yeH**") unless context[:no_bolding] == false
28+
input.gsub("yeH", "**yeH**") unless context[:bolded] == false
2929
end
3030
end

0 commit comments

Comments
 (0)