diff --git a/lib/banzai/filter_array.rb b/lib/banzai/filter_array.rb new file mode 100644 index 0000000000000000000000000000000000000000..77835a14027f3772c77eebfd3f0f53cffc28fe28 --- /dev/null +++ b/lib/banzai/filter_array.rb @@ -0,0 +1,27 @@ +module Banzai + class FilterArray < Array + # Insert a value immediately after another value + # + # If the preceding value does not exist, the new value is added to the end + # of the Array. + def insert_after(after_value, value) + i = index(after_value) || length - 1 + + insert(i + 1, value) + end + + # Insert a value immediately before another value + # + # If the succeeding value does not exist, the new value is added to the + # beginning of the Array. + def insert_before(before_value, value) + i = index(before_value) || -1 + + if i < 0 + unshift(value) + else + insert(i, value) + end + end + end +end diff --git a/lib/banzai/pipeline/base_pipeline.rb b/lib/banzai/pipeline/base_pipeline.rb index db5177db7b367949dd9220f3a6b345d8bda30dea..f60966c3c0f479320ef6c5547e30bb3e32e31d56 100644 --- a/lib/banzai/pipeline/base_pipeline.rb +++ b/lib/banzai/pipeline/base_pipeline.rb @@ -4,7 +4,7 @@ module Banzai module Pipeline class BasePipeline def self.filters - [] + FilterArray[] end def self.transform_context(context) diff --git a/lib/banzai/pipeline/broadcast_message_pipeline.rb b/lib/banzai/pipeline/broadcast_message_pipeline.rb index 4bb85e24c3809d73b9397b6d7a448bb201dfb94a..adc09c8afbd881d2935da5bb93dfc5c1068a2d80 100644 --- a/lib/banzai/pipeline/broadcast_message_pipeline.rb +++ b/lib/banzai/pipeline/broadcast_message_pipeline.rb @@ -2,7 +2,7 @@ module Banzai module Pipeline class BroadcastMessagePipeline < DescriptionPipeline def self.filters - @filters ||= [ + @filters ||= FilterArray[ Filter::MarkdownFilter, Filter::SanitizationFilter, diff --git a/lib/banzai/pipeline/combined_pipeline.rb b/lib/banzai/pipeline/combined_pipeline.rb index 9485199132ecd83bdfb961164a5cb6eb0b2c4f1c..60190f8d9dd5194162b11268aa27c767fd49f10b 100644 --- a/lib/banzai/pipeline/combined_pipeline.rb +++ b/lib/banzai/pipeline/combined_pipeline.rb @@ -10,7 +10,7 @@ module Banzai end def self.filters - pipelines.flat_map(&:filters) + FilterArray.new(pipelines.flat_map(&:filters)) end def self.transform_context(context) diff --git a/lib/banzai/pipeline/gfm_pipeline.rb b/lib/banzai/pipeline/gfm_pipeline.rb index b7a38ea8427db200621e42bf76fa182938cc275e..8cd4b50e65ab6da2ed7e62a41b69a553e5f3b0dd 100644 --- a/lib/banzai/pipeline/gfm_pipeline.rb +++ b/lib/banzai/pipeline/gfm_pipeline.rb @@ -2,7 +2,7 @@ module Banzai module Pipeline class GfmPipeline < BasePipeline def self.filters - @filters ||= [ + @filters ||= FilterArray[ Filter::SyntaxHighlightFilter, Filter::SanitizationFilter, diff --git a/lib/banzai/pipeline/plain_markdown_pipeline.rb b/lib/banzai/pipeline/plain_markdown_pipeline.rb index 3fbc681457ba86481f62301b162f45f6becd4d11..3f45db21869f144ce0c83c2aab6e29568c6d1998 100644 --- a/lib/banzai/pipeline/plain_markdown_pipeline.rb +++ b/lib/banzai/pipeline/plain_markdown_pipeline.rb @@ -2,7 +2,7 @@ module Banzai module Pipeline class PlainMarkdownPipeline < BasePipeline def self.filters - [ + FilterArray[ Filter::MarkdownFilter ] end diff --git a/lib/banzai/pipeline/post_process_pipeline.rb b/lib/banzai/pipeline/post_process_pipeline.rb index bd338c045f3628be91894b93b0f753d84282a4e8..ecff094b1e57adea317402a12cb88536023c89ec 100644 --- a/lib/banzai/pipeline/post_process_pipeline.rb +++ b/lib/banzai/pipeline/post_process_pipeline.rb @@ -2,7 +2,7 @@ module Banzai module Pipeline class PostProcessPipeline < BasePipeline def self.filters - [ + FilterArray[ Filter::RelativeLinkFilter, Filter::RedactorFilter ] diff --git a/lib/banzai/pipeline/reference_extraction_pipeline.rb b/lib/banzai/pipeline/reference_extraction_pipeline.rb index eaddccd30a5e53517f96b798bd193738a990b92a..919998380e4a0ee6a02b618bcfe3230042745357 100644 --- a/lib/banzai/pipeline/reference_extraction_pipeline.rb +++ b/lib/banzai/pipeline/reference_extraction_pipeline.rb @@ -2,7 +2,7 @@ module Banzai module Pipeline class ReferenceExtractionPipeline < BasePipeline def self.filters - [ + FilterArray[ Filter::ReferenceGathererFilter ] end diff --git a/lib/banzai/pipeline/single_line_pipeline.rb b/lib/banzai/pipeline/single_line_pipeline.rb index 8b84ab401df1e585807d538fde837a1a3ffe978b..ba2555df98d596c9794ca7f15c59694926b8a08c 100644 --- a/lib/banzai/pipeline/single_line_pipeline.rb +++ b/lib/banzai/pipeline/single_line_pipeline.rb @@ -2,7 +2,7 @@ module Banzai module Pipeline class SingleLinePipeline < GfmPipeline def self.filters - @filters ||= [ + @filters ||= FilterArray[ Filter::SanitizationFilter, Filter::EmojiFilter, diff --git a/lib/banzai/pipeline/wiki_pipeline.rb b/lib/banzai/pipeline/wiki_pipeline.rb index bc2bf1119710f8d649be0cc2d6f44d365ca714f4..9b4ff0f0f803f20e457509910c102581b5b7e042 100644 --- a/lib/banzai/pipeline/wiki_pipeline.rb +++ b/lib/banzai/pipeline/wiki_pipeline.rb @@ -4,11 +4,8 @@ module Banzai module Pipeline class WikiPipeline < FullPipeline def self.filters - @filters ||= begin - filters = super - toc = filters.index(Filter::TableOfContentsFilter) - filters.insert(toc + 1, Filter::GollumTagsFilter) - end + @filters ||= super.insert_after(Filter::TableOfContentsFilter, + Filter::GollumTagsFilter) end end end diff --git a/spec/lib/banzai/filter_array_spec.rb b/spec/lib/banzai/filter_array_spec.rb new file mode 100644 index 0000000000000000000000000000000000000000..ea84005e7f869c4fc6acd42cde6d3d30af29377a --- /dev/null +++ b/spec/lib/banzai/filter_array_spec.rb @@ -0,0 +1,39 @@ +require 'spec_helper' + +describe Banzai::FilterArray do + describe '#insert_after' do + it 'inserts an element after a provided element' do + filters = described_class.new(%w(a b c)) + + filters.insert_after('b', '1') + + expect(filters).to eq %w(a b 1 c) + end + + it 'inserts an element at the end when the provided element does not exist' do + filters = described_class.new(%w(a b c)) + + filters.insert_after('d', '1') + + expect(filters).to eq %w(a b c 1) + end + end + + describe '#insert_before' do + it 'inserts an element before a provided element' do + filters = described_class.new(%w(a b c)) + + filters.insert_before('b', '1') + + expect(filters).to eq %w(a 1 b c) + end + + it 'inserts an element at the beginning when the provided element does not exist' do + filters = described_class.new(%w(a b c)) + + filters.insert_before('d', '1') + + expect(filters).to eq %w(1 a b c) + end + end +end