summaryrefslogtreecommitdiff
path: root/lib/banzai/filter/service_desk_upload_link_filter.rb
blob: 9f26dfb8ae5c375c7166c365a54a85b67f6d9f73 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
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
# frozen_string_literal: true

module Banzai
  module Filter
    # HTML filter for service desk emails.
    # Context options:
    #   :replace_upload_links
    class ServiceDeskUploadLinkFilter < BaseRelativeLinkFilter
      def call
        return doc unless context[:uploads_as_attachments].present?

        linkable_attributes.reject! do |attr|
          replace_upload_link(attr)
        end

        doc
      end

      protected

      def replace_upload_link(html_attr)
        return unless html_attr.name == 'href'
        return unless html_attr.value.start_with?('/uploads/')

        secret, filename_in_link = html_attr.value.scan(FileUploader::DYNAMIC_PATH_PATTERN).first
        return unless context[:uploads_as_attachments].include?("#{secret}/#{filename_in_link}")

        parent = html_attr.parent
        filename_in_text = parent.text
        final_filename = if filename_in_link != filename_in_text
                           "#{filename_in_text} (#{filename_in_link})"
                         else
                           filename_in_text
                         end

        final_element = Nokogiri::HTML::DocumentFragment.parse("<strong>#{final_filename}</strong>")
        parent.replace(final_element)
      end
    end
  end
end