# frozen_string_literal: true module HtmlToPlainTextInterceptor module_function def delivering_email(message) process(message) end def previewing_email(message) process(message) end def process(message) return message unless html_part(message) return message if message.text_part add_text_part(message) message end def add_text_part(message) html = html_part(message).decoded text = HtmlToPlainText.call(html) text_part = Mail::Part.new do content_type 'text/plain; charset=UTF-8' body text end if pure_html_message?(message) message.body = nil message.content_type = 'multipart/alternative' message.add_part(text_part) message.add_part(Mail::Part.new do content_type 'text/html; charset=UTF-8' body html end) else alternative = Mail::Part.new(content_type: 'multipart/alternative') alternative.add_part(text_part) alternative.add_part(message.html_part) replace_part(message.parts, message.html_part, alternative) end end def pure_html_message?(message) message.content_type.to_s.include?('text/html') end def html_part(message) pure_html_message?(message) ? message : message.html_part end def replace_part(parts, old_part, new_part) if (index = parts.index(old_part)) parts[index] = new_part else parts.each do |part| replace_part(part.parts, old_part, new_part) if part.respond_to?(:parts) end end end end