Class: Banzai::Filter::ImageLinkFilter

Inherits:
HTML::Pipeline::Filter
  • Object
show all
Includes:
Concerns::PipelineTimingCheck
Defined in:
lib/banzai/filter/image_link_filter.rb

Overview

HTML filter that wraps links around inline images.

Constant Summary

Constants included from Concerns::PipelineTimingCheck

Concerns::PipelineTimingCheck::MAX_PIPELINE_SECONDS

Instance Method Summary collapse

Methods included from Concerns::PipelineTimingCheck

#exceeded_pipeline_max?

Instance Method Details

#callObject

Find every image that isn’t already wrapped in an a tag, create a new node (a link to the image source), copy the image as a child of the anchor, and then replace the img with the link-wrapped version.

If link_replaces_image context parameter is provided, the image is going to be replaced with a link to an image.



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/banzai/filter/image_link_filter.rb', line 16

def call
  doc.xpath('descendant-or-self::img[not(ancestor::a) and not(@data-src = "")]').each do |img|
    link_replaces_image = !!context[:link_replaces_image]
    html_class = link_replaces_image ? 'with-attachment-icon' : 'no-attachment-icon'

    link = doc.document.create_element(
      'a',
      class: html_class,
      href: img['data-src'] || img['src'],
      target: '_blank',
      rel: 'noopener noreferrer'
    )

    # make sure the original non-proxied src carries over to the link
    link['data-canonical-src'] = img['data-canonical-src'] if img['data-canonical-src']

    if img['data-diagram'] && img['data-diagram-src']
      link['data-diagram'] = img['data-diagram']
      link['data-diagram-src'] = img['data-diagram-src']
      img.remove_attribute('data-diagram')
      img.remove_attribute('data-diagram-src')
    end

    link.children = link_replaces_image ? link_children(img) : img.clone

    img.replace(link)
  end

  doc
end