# frozen_string_literal: true
require_dependency 'pretty_text'
# A very simple formatter for imported emails
class EmailCook
def self.url_regexp
@url_regexp ||= /((?:https?:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.])(?:[^\s()<>]+|\([^\s()<>]+\))+(?:\([^\s()<>]+\)|[^`!()\[\]{};:'".,<>?«»“”‘’\s]))/
end
def self.raw_regexp
@raw_regexp ||= /^\[plaintext\]$\n(.*)\n^\[\/plaintext\]$(?:\s^\[attachments\]$\n(.*)\n^\[\/attachments\]$)?(?:\s^\[elided\]$\n(.*)\n^\[\/elided\]$)?/m
end
def initialize(raw)
@raw = raw
@body, @attachment_html, @elided = @raw.scan(EmailCook.raw_regexp).first
end
def add_quote(result, buffer)
if buffer.present?
return if buffer =~ /\A(
)+\z$/
result << "
#{buffer}" end end def link_string!(line, unescaped_line) unescaped_line = unescaped_line.strip unescaped_line.scan(EmailCook.url_regexp).each do |m| url = m[0] if unescaped_line == url # this could be oneboxed val = %|#{url}| else val = %|#{url}| end line.gsub!(url, val) end end def htmlify(text) result = +"" quote_buffer = +"" in_text = false in_quote = false text.each_line do |line| # replace indentation with non-breaking spaces line.sub!(/^\s{2,}/) { |s| "\u00A0" * s.length } if line =~ /^\s*>/ in_quote = true line.sub!(/^[\s>]*/, '') unescaped_line = line line = CGI.escapeHTML(line) link_string!(line, unescaped_line) quote_buffer << line << "