Class: Banzai::Filter::ImageLinkFilter

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

Overview

HTML filter that wraps links around inline images.

Instance Method Summary collapse

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.


14
15
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
46
47
# File 'lib/banzai/filter/image_link_filter.rb', line 14

def call
  doc.xpath('descendant-or-self::img[not(ancestor::a)]').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 = if link_replaces_image
                      img['alt'] || img['data-src'] || img['src']
                    else
                      img.clone
                    end

    img.replace(link)
  end

  doc
end