summaryrefslogtreecommitdiff
path: root/lib/banzai/filter/base_relative_link_filter.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/banzai/filter/base_relative_link_filter.rb')
-rw-r--r--lib/banzai/filter/base_relative_link_filter.rb33
1 files changed, 20 insertions, 13 deletions
diff --git a/lib/banzai/filter/base_relative_link_filter.rb b/lib/banzai/filter/base_relative_link_filter.rb
index fd526df4c48..84a6e18e77b 100644
--- a/lib/banzai/filter/base_relative_link_filter.rb
+++ b/lib/banzai/filter/base_relative_link_filter.rb
@@ -10,19 +10,16 @@ module Banzai
protected
def linkable_attributes
- strong_memoize(:linkable_attributes) do
- attrs = []
-
- attrs += doc.search('a:not(.gfm)').map do |el|
- el.attribute('href')
- end
-
- attrs += doc.search('img:not(.gfm), video:not(.gfm), audio:not(.gfm)').flat_map do |el|
- [el.attribute('src'), el.attribute('data-src')]
- end
-
- attrs.reject do |attr|
- attr.blank? || attr.value.start_with?('//')
+ if Feature.enabled?(:optimize_linkable_attributes, project, default_enabled: :yaml)
+ # Nokorigi Nodeset#search performs badly for documents with many nodes
+ #
+ # Here we store fetched attributes in the shared variable "result"
+ # This variable is passed through the chain of filters and can be
+ # accessed by them
+ result[:linkable_attributes] ||= fetch_linkable_attributes
+ else
+ strong_memoize(:linkable_attributes) do
+ fetch_linkable_attributes
end
end
end
@@ -40,6 +37,16 @@ module Banzai
def unescape_and_scrub_uri(uri)
Addressable::URI.unescape(uri).scrub.delete("\0")
end
+
+ def fetch_linkable_attributes
+ attrs = []
+
+ attrs += doc.search('a:not(.gfm), img:not(.gfm), video:not(.gfm), audio:not(.gfm)').flat_map do |el|
+ [el.attribute('href'), el.attribute('src'), el.attribute('data-src')]
+ end
+
+ attrs.reject { |attr| attr.blank? || attr.value.start_with?('//') }
+ end
end
end
end