2013-09-20 06:29:09 +00:00
|
|
|
class String
|
|
|
|
def message_quote
|
2015-05-07 12:10:38 +00:00
|
|
|
quote = split("\n")
|
2013-09-20 06:29:09 +00:00
|
|
|
body_quote = ''
|
|
|
|
quote.each do |line|
|
|
|
|
body_quote = body_quote + '> ' + line + "\n"
|
|
|
|
end
|
|
|
|
body_quote
|
|
|
|
end
|
2015-05-07 10:27:12 +00:00
|
|
|
|
2013-09-20 06:29:09 +00:00
|
|
|
def word_wrap(*args)
|
|
|
|
options = args.extract_options!
|
|
|
|
unless args.blank?
|
|
|
|
options[:line_width] = args[0] || 82
|
|
|
|
end
|
2015-04-27 13:42:53 +00:00
|
|
|
options.reverse_merge!(line_width: 82)
|
2013-09-20 06:29:09 +00:00
|
|
|
|
|
|
|
lines = self
|
|
|
|
lines.split("\n").collect do |line|
|
|
|
|
line.length > options[:line_width] ? line.gsub(/(.{1,#{options[:line_width]}})(\s+|$)/, "\\1\n").strip : line
|
|
|
|
end * "\n"
|
|
|
|
end
|
2015-01-09 13:17:34 +00:00
|
|
|
|
|
|
|
=begin
|
|
|
|
|
|
|
|
filename = 'Some::Module'.to_filename
|
|
|
|
|
|
|
|
returns
|
|
|
|
'some/module'
|
|
|
|
|
|
|
|
=end
|
|
|
|
|
2013-10-07 07:00:26 +00:00
|
|
|
def to_filename
|
2016-01-15 19:40:29 +00:00
|
|
|
camel_cased_word = "#{self}" # rubocop:disable Style/UnneededInterpolation
|
2015-12-16 21:47:10 +00:00
|
|
|
camel_cased_word.gsub(/::/, '/')
|
2016-01-15 17:22:57 +00:00
|
|
|
.gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
|
|
|
|
.gsub(/([a-z\d])([A-Z])/, '\1_\2')
|
|
|
|
.tr('-', '_').downcase
|
2013-10-07 07:00:26 +00:00
|
|
|
end
|
2014-06-01 08:29:58 +00:00
|
|
|
|
2015-06-30 14:45:03 +00:00
|
|
|
=begin
|
|
|
|
|
|
|
|
filename = 'some/module.rb'.to_classname
|
|
|
|
|
|
|
|
returns
|
|
|
|
'Some::Module'
|
|
|
|
|
|
|
|
=end
|
|
|
|
|
|
|
|
def to_classname
|
2016-01-15 19:40:29 +00:00
|
|
|
camel_cased_word = "#{self}" # rubocop:disable Style/UnneededInterpolation
|
2015-06-30 14:45:03 +00:00
|
|
|
camel_cased_word.gsub!(/\.rb$/, '')
|
|
|
|
camel_cased_word.split('/').map(&:camelize).join('::')
|
|
|
|
end
|
|
|
|
|
2014-06-01 08:29:58 +00:00
|
|
|
# because of mysql inno_db limitations, strip 4 bytes utf8 chars (e. g. emojis)
|
|
|
|
# unfortunaly UTF8mb4 will raise other limitaions of max varchar and lower index sizes
|
|
|
|
# More details: http://pjambet.github.io/blog/emojis-and-mysql/
|
|
|
|
def utf8_to_3bytesutf8
|
2016-01-19 22:30:23 +00:00
|
|
|
return self if Rails.application.config.db_4bytes_utf8
|
2016-06-30 20:04:48 +00:00
|
|
|
each_char.select { |c|
|
2014-06-01 08:29:58 +00:00
|
|
|
if c.bytes.count > 3
|
2015-07-03 15:18:01 +00:00
|
|
|
Rails.logger.warn "strip out 4 bytes utf8 chars '#{c}' of '#{self}'"
|
2014-06-01 08:29:58 +00:00
|
|
|
next
|
|
|
|
end
|
|
|
|
c
|
|
|
|
}
|
2016-01-15 17:22:57 +00:00
|
|
|
.join('')
|
2014-06-01 08:29:58 +00:00
|
|
|
end
|
2014-12-27 15:25:58 +00:00
|
|
|
|
|
|
|
=begin
|
|
|
|
|
|
|
|
text = html_string.html2text
|
|
|
|
|
2015-01-09 13:17:34 +00:00
|
|
|
returns
|
|
|
|
|
2015-09-02 07:14:48 +00:00
|
|
|
'string with text only'
|
2015-01-09 13:17:34 +00:00
|
|
|
|
2014-12-27 15:25:58 +00:00
|
|
|
=end
|
|
|
|
|
2016-06-21 15:14:15 +00:00
|
|
|
def html2text(string_only = false, strict = false)
|
2016-01-15 19:40:29 +00:00
|
|
|
string = "#{self}" # rubocop:disable Style/UnneededInterpolation
|
2015-01-08 14:27:44 +00:00
|
|
|
|
|
|
|
# in case of invalid encodeing, strip invalid chars
|
|
|
|
# see also test/fixtures/mail21.box
|
|
|
|
# note: string.encode!('UTF-8', 'UTF-8', :invalid => :replace, :replace => '?') was not detecting invalid chars
|
|
|
|
if !string.valid_encoding?
|
2015-05-07 10:25:16 +00:00
|
|
|
string = string.chars.select(&:valid_encoding?).join
|
2014-12-27 15:25:58 +00:00
|
|
|
end
|
|
|
|
|
2016-06-22 14:39:20 +00:00
|
|
|
# remove html comments
|
|
|
|
string.gsub!(/<!--.+?-->/m, '')
|
|
|
|
|
2015-01-08 14:27:44 +00:00
|
|
|
# find <a href=....> and replace it with [x]
|
|
|
|
link_list = ''
|
|
|
|
counter = 0
|
2015-09-02 07:14:48 +00:00
|
|
|
if !string_only
|
2016-06-27 23:32:17 +00:00
|
|
|
string.gsub!(/<a[[:space:]].*?href=("|')(.+?)("|').*?>/ix) {
|
2015-09-02 07:14:48 +00:00
|
|
|
link = $2
|
2016-01-15 17:22:57 +00:00
|
|
|
counter = counter + 1
|
2015-09-02 07:14:48 +00:00
|
|
|
link_list += "[#{counter}] #{link}\n"
|
|
|
|
"[#{counter}] "
|
|
|
|
}
|
2016-06-21 15:14:15 +00:00
|
|
|
else
|
2016-06-30 20:04:48 +00:00
|
|
|
string.gsub!(%r{<a[[:space:]]+(|\S+[[:space:]]+)href=("|')(.+?)("|')([[:space:]]*|[[:space:]]+[^>]*)>(.+?)<[[:space:]]*/a[[:space:]]*>}mxi) { |_placeholder|
|
2016-06-27 23:32:17 +00:00
|
|
|
link = $3
|
|
|
|
text = $6
|
|
|
|
text.gsub!(/\<.+?\>/, '')
|
|
|
|
|
|
|
|
link_compare = link.dup
|
|
|
|
if !link_compare.empty?
|
2016-06-21 15:14:15 +00:00
|
|
|
link.strip!
|
2016-06-27 23:32:17 +00:00
|
|
|
link_compare.strip!
|
|
|
|
link_compare.downcase!
|
|
|
|
link_compare.sub!(%r{/$}, '')
|
2016-06-21 15:14:15 +00:00
|
|
|
end
|
2016-06-27 23:32:17 +00:00
|
|
|
text_compare = text.dup
|
|
|
|
if !text_compare.empty?
|
2016-06-21 15:14:15 +00:00
|
|
|
text.strip!
|
2016-06-27 23:32:17 +00:00
|
|
|
text_compare.strip!
|
|
|
|
text_compare.downcase!
|
|
|
|
text_compare.sub!(%r{/$}, '')
|
2016-06-21 15:14:15 +00:00
|
|
|
end
|
2016-06-27 23:32:17 +00:00
|
|
|
placeholder = if !link_compare.empty? && text_compare.empty?
|
2016-06-21 15:14:15 +00:00
|
|
|
link
|
2016-06-27 23:32:17 +00:00
|
|
|
elsif link_compare.empty? && !text_compare.empty?
|
2016-06-21 15:14:15 +00:00
|
|
|
text
|
2016-06-27 23:32:17 +00:00
|
|
|
elsif link_compare && link_compare =~ /^mailto/i
|
2016-06-21 15:14:15 +00:00
|
|
|
text
|
2016-06-27 23:32:17 +00:00
|
|
|
elsif !link_compare.empty? && !text_compare.empty? && (link_compare == text_compare || link_compare == "mailto:#{text}".downcase || link_compare == "http://#{text}".downcase)
|
|
|
|
"######LINKEXT:#{link}/TEXT:#{text}######"
|
|
|
|
elsif text !~ /^http/
|
|
|
|
"#{text} (######LINKRAW:#{link}######)"
|
2016-06-21 15:14:15 +00:00
|
|
|
else
|
2016-06-27 23:32:17 +00:00
|
|
|
"#{link} (######LINKRAW:#{text}######)"
|
2016-06-21 15:14:15 +00:00
|
|
|
end
|
|
|
|
}
|
2015-09-02 07:14:48 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
# remove style tags with content
|
2016-06-27 23:32:17 +00:00
|
|
|
string.gsub!(%r{<style(|[[:space:]].+?)>(.+?)</style>}im, '')
|
2016-06-03 13:25:06 +00:00
|
|
|
|
2015-01-08 14:27:44 +00:00
|
|
|
# remove empty lines
|
2016-06-22 12:55:23 +00:00
|
|
|
string.gsub!(/^[[:space:]]*/m, '')
|
2016-06-21 15:14:15 +00:00
|
|
|
if strict
|
2016-06-27 23:32:17 +00:00
|
|
|
string.gsub!(%r{< [[:space:]]* (/*) [[:space:]]* (b|i|ul|ol|li|u|h1|h2|h3|hr) ([[:space:]]*|[[:space:]]+[^>]*) >}mxi, '######\1\2######')
|
2016-06-21 15:14:15 +00:00
|
|
|
end
|
2015-01-08 14:27:44 +00:00
|
|
|
|
|
|
|
# pre/code handling 1/2
|
2016-06-03 13:25:06 +00:00
|
|
|
string.gsub!(%r{<pre>(.+?)</pre>}m) { |placeholder|
|
2015-04-27 13:20:16 +00:00
|
|
|
placeholder = placeholder.gsub(/\n/, '###BR###')
|
2015-01-08 14:27:44 +00:00
|
|
|
}
|
2016-06-03 13:25:06 +00:00
|
|
|
string.gsub!(%r{<code>(.+?)</code>}m) { |placeholder|
|
2015-04-27 13:20:16 +00:00
|
|
|
placeholder = placeholder.gsub(/\n/, '###BR###')
|
2015-01-08 14:27:44 +00:00
|
|
|
}
|
|
|
|
|
2016-01-13 22:27:34 +00:00
|
|
|
# insert spaces on [A-z]\n[A-z]
|
2016-06-22 12:55:23 +00:00
|
|
|
string.gsub!(/([A-z])[[:space:]]([A-z])/m, '\1 \2')
|
2016-01-13 22:27:34 +00:00
|
|
|
|
2015-01-08 14:27:44 +00:00
|
|
|
# remove all new lines
|
2015-09-02 07:14:48 +00:00
|
|
|
string.gsub!(/(\n\r|\r\r\n|\r\n|\n)/, '')
|
|
|
|
|
|
|
|
# blockquote handling
|
2016-06-03 13:25:06 +00:00
|
|
|
string.gsub!(%r{<blockquote(| [^>]*)>(.+?)</blockquote>}m) {
|
2015-09-02 07:26:40 +00:00
|
|
|
"\n" + $2.html2text(true).gsub(/^(.*)$/, '> \1') + "\n"
|
2015-09-02 07:14:48 +00:00
|
|
|
}
|
2015-01-08 14:27:44 +00:00
|
|
|
|
|
|
|
# pre/code handling 2/2
|
2016-06-03 13:25:06 +00:00
|
|
|
string.gsub!(/###BR###/, "\n")
|
2015-01-08 14:27:44 +00:00
|
|
|
|
|
|
|
# add counting
|
|
|
|
string.gsub!(/<li(| [^>]*)>/i, "\n* ")
|
|
|
|
|
|
|
|
# add hr
|
2015-09-02 07:14:48 +00:00
|
|
|
string.gsub!(%r{<hr(|/| [^>]*)>}i, "\n___\n")
|
|
|
|
|
|
|
|
# add h\d
|
|
|
|
string.gsub!(%r{</h\d>}i, "\n")
|
2015-01-08 14:27:44 +00:00
|
|
|
|
|
|
|
# add new lines
|
2016-06-27 23:32:17 +00:00
|
|
|
string.gsub!(%r{</div><div(|[[:space:]].+?)>}im, "\n")
|
|
|
|
string.gsub!(%r{</p><p(|[[:space:]].+?)>}im, "\n")
|
2016-06-21 15:14:15 +00:00
|
|
|
string.gsub!(%r{<(div|p|pre|br|table|tr|h)(|/| [^>]*)>}i, "\n")
|
2016-06-27 23:32:17 +00:00
|
|
|
string.gsub!(%r{</(p|br|div)(|[[:space:]].+?)>}i, "\n")
|
2016-06-03 13:25:06 +00:00
|
|
|
string.gsub!(%r{</td>}i, ' ')
|
2015-01-08 14:27:44 +00:00
|
|
|
|
|
|
|
# strip all other tags
|
2016-06-03 13:25:06 +00:00
|
|
|
string.gsub!(/\<.+?\>/, '')
|
2015-01-08 14:27:44 +00:00
|
|
|
|
2015-09-14 23:27:14 +00:00
|
|
|
# replace multiple spaces with one
|
2015-09-02 07:14:48 +00:00
|
|
|
string.gsub!(/ /, ' ')
|
|
|
|
|
2016-06-27 23:32:17 +00:00
|
|
|
# add hyperlinks
|
|
|
|
if strict
|
2016-06-30 20:04:48 +00:00
|
|
|
string.gsub!(%r{([[:space:]])((http|https|ftp|tel)://.+?|(www..+?))([[:space:]]|\.[[:space:]]|,[[:space:]])}mxi) { |_placeholder|
|
2016-06-27 23:32:17 +00:00
|
|
|
pre = $1
|
|
|
|
content = $2
|
|
|
|
post = $5
|
|
|
|
if content =~ /^www/i
|
|
|
|
content = "http://#{content}"
|
|
|
|
end
|
|
|
|
placeholder = if content =~ /^(http|https|ftp|tel)/i
|
|
|
|
"#{pre}######LINKRAW:#{content}#######{post}"
|
|
|
|
else
|
|
|
|
"#{pre}#{content}#{post}"
|
|
|
|
end
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
2016-02-03 13:33:03 +00:00
|
|
|
# try HTMLEntities, if it fails on invalid signes, use manual way
|
|
|
|
begin
|
|
|
|
coder = HTMLEntities.new
|
|
|
|
string = coder.decode(string)
|
|
|
|
rescue
|
|
|
|
|
|
|
|
# strip all & < > "
|
2016-06-03 13:25:06 +00:00
|
|
|
string.gsub!('&', '&')
|
|
|
|
string.gsub!('<', '<')
|
|
|
|
string.gsub!('>', '>')
|
|
|
|
string.gsub!('"', '"')
|
|
|
|
string.gsub!(' ', ' ')
|
2016-02-03 13:33:03 +00:00
|
|
|
|
|
|
|
# encode html entities like "–"
|
2016-06-03 13:25:06 +00:00
|
|
|
string.gsub!(/(&\#(\d+);?)/x) {
|
2016-02-03 13:33:03 +00:00
|
|
|
$2.chr
|
|
|
|
}
|
2015-01-08 14:27:44 +00:00
|
|
|
|
2016-02-03 13:33:03 +00:00
|
|
|
# encode html entities like "d;"
|
2016-06-03 13:25:06 +00:00
|
|
|
string.gsub!(/(&\#[xX]([0-9a-fA-F]+);?)/x) {
|
2016-02-03 13:33:03 +00:00
|
|
|
chr_orig = $1
|
|
|
|
hex = $2.hex
|
|
|
|
if hex
|
|
|
|
chr = hex.chr
|
|
|
|
if chr
|
|
|
|
chr_orig = chr
|
|
|
|
else
|
|
|
|
chr_orig
|
|
|
|
end
|
2015-01-08 14:27:44 +00:00
|
|
|
else
|
|
|
|
chr_orig
|
|
|
|
end
|
|
|
|
|
2016-02-03 13:33:03 +00:00
|
|
|
# check valid encoding
|
|
|
|
begin
|
|
|
|
if !chr_orig.encode('UTF-8').valid_encoding?
|
|
|
|
chr_orig = '?'
|
|
|
|
end
|
|
|
|
rescue
|
2015-01-08 14:27:44 +00:00
|
|
|
chr_orig = '?'
|
|
|
|
end
|
2016-02-03 13:33:03 +00:00
|
|
|
chr_orig
|
|
|
|
}
|
|
|
|
end
|
2015-01-08 14:27:44 +00:00
|
|
|
|
|
|
|
# remove tailing empty spaces
|
2016-06-22 12:55:23 +00:00
|
|
|
string.gsub!(/[[:blank:]]+$/, '')
|
2015-09-02 07:14:48 +00:00
|
|
|
|
2016-06-22 13:11:22 +00:00
|
|
|
# remove double multiple empty lines
|
2016-06-24 12:08:15 +00:00
|
|
|
string.gsub!(/\n\n\n+/, "\n\n")
|
2016-06-22 13:11:22 +00:00
|
|
|
|
2015-01-08 14:27:44 +00:00
|
|
|
# add extracted links
|
|
|
|
if link_list != ''
|
2015-09-02 07:14:48 +00:00
|
|
|
string += "\n\n\n" + link_list
|
2014-12-27 15:25:58 +00:00
|
|
|
end
|
2015-01-08 14:27:44 +00:00
|
|
|
|
2016-06-22 12:55:23 +00:00
|
|
|
# remove double multiple empty lines
|
2016-06-24 12:08:15 +00:00
|
|
|
string.gsub!(/\n\n\n+/, "\n\n")
|
2016-06-22 12:55:23 +00:00
|
|
|
|
2015-01-08 14:27:44 +00:00
|
|
|
string.strip
|
2014-12-27 15:25:58 +00:00
|
|
|
end
|
2015-01-03 22:53:07 +00:00
|
|
|
|
|
|
|
=begin
|
|
|
|
|
|
|
|
html = text_string.text2html
|
|
|
|
|
|
|
|
=end
|
|
|
|
|
|
|
|
def text2html
|
2016-01-15 19:40:29 +00:00
|
|
|
text = CGI.escapeHTML(self)
|
2015-01-03 22:53:07 +00:00
|
|
|
text.gsub!(/\n/, '<br>')
|
|
|
|
text.chomp
|
|
|
|
end
|
|
|
|
|
2016-06-21 15:14:15 +00:00
|
|
|
=begin
|
|
|
|
|
|
|
|
html = text_string.text2html
|
|
|
|
|
|
|
|
=end
|
|
|
|
|
2017-03-10 06:49:01 +00:00
|
|
|
def html2html_strict
|
|
|
|
string = "#{self}" # rubocop:disable Style/UnneededInterpolation
|
|
|
|
string = HtmlSanitizer.cleanup(string).strip
|
|
|
|
string = HtmlSanitizer.strict(string, true).strip
|
|
|
|
|
|
|
|
# as fallback, use html2text and text2html
|
|
|
|
if string.blank?
|
|
|
|
string = html2text.text2html
|
|
|
|
string.signature_identify('text')
|
|
|
|
marker_template = '<span class="js-signatureMarker"></span>'
|
|
|
|
string.sub!(/######SIGNATURE_MARKER######/, marker_template)
|
|
|
|
string.gsub!(/######SIGNATURE_MARKER######/, '')
|
|
|
|
return string.chomp
|
|
|
|
end
|
|
|
|
|
|
|
|
#string.gsub!(/<p>[[:space:]]+<\/p><p>[[:space:]]+<\/p>/m, '<p> </p>')
|
|
|
|
string.gsub!(%r{<p>[[:space:]]+</p>\n<p>[[:space:]]+</p>}im, '<p> </p>')
|
|
|
|
string.gsub!(%r{<div>[[:space:]]+</div>\n<div>[[:space:]]+</div>}im, '<div> </div>')
|
|
|
|
string.gsub!(/<br>[[:space:]]?<br>[[:space:]]?<br>/im, '<br><br>')
|
|
|
|
string.gsub!(/<br>[[:space:]]?<br>[[:space:]]?<br>/im, '<br><br>')
|
|
|
|
string.gsub!(/<br>[[:space:]]?<br>[[:space:]]?<br>/im, '<br><br>')
|
|
|
|
string.gsub!(%r{<br/>[[:space:]]?<br/>[[:space:]]?<br/>}im, '<br/><br/>')
|
|
|
|
string.gsub!(%r{<br/>[[:space:]]?<br/>[[:space:]]?<br/>}im, '<br/><br/>')
|
|
|
|
string.gsub!(%r{<br/>[[:space:]]?<br/>[[:space:]]?<br/>}im, '<br/><br/>')
|
|
|
|
string.gsub!(%r{<p>[[:space:]]+</p>}im, '<p> </p>')
|
|
|
|
|
|
|
|
string.signature_identify('html')
|
|
|
|
|
2016-06-28 20:49:38 +00:00
|
|
|
marker_template = '<span class="js-signatureMarker"></span>'
|
|
|
|
string.sub!(/######SIGNATURE_MARKER######/, marker_template)
|
|
|
|
string.gsub!(/######SIGNATURE_MARKER######/, '')
|
2016-06-21 15:14:15 +00:00
|
|
|
string.chomp
|
|
|
|
end
|
|
|
|
|
2017-03-10 06:49:01 +00:00
|
|
|
def signature_identify(type = 'text', force = false)
|
2016-06-28 20:49:38 +00:00
|
|
|
string = self
|
|
|
|
|
2017-03-10 06:49:01 +00:00
|
|
|
marker = '######SIGNATURE_MARKER######'
|
|
|
|
|
|
|
|
if type == 'html'
|
|
|
|
map = [
|
|
|
|
'<br(|\/)>[[:space:]]*(--|__)',
|
|
|
|
'<\/div>[[:space:]]*(--|__)',
|
|
|
|
'<p>[[:space:]]*(--|__)',
|
|
|
|
'(<br(|\/)>|<p>|<div>)[[:space:]]*<b>(Von|From|De|от|Z|Od|Ze|Fra|Van|Mistä|Από|Dal|から|Из|од|iz|Från|จาก|з|Từ):[[:space:]]*</b>',
|
|
|
|
'<br>[[:space:]]*<br>[[:space:]]*(Von|From|De|от|Z|Od|Ze|Fra|Van|Mistä|Από|Dal|から|Из|од|iz|Från|จาก|з|Từ):[[:space:]]+',
|
|
|
|
'<blockquote(|.+?)>[[:space:]]*<div>[[:space:]]*(On|Am)',
|
|
|
|
]
|
|
|
|
map.each { |regexp|
|
|
|
|
string.sub!(/#{regexp}/m) { |placeholder|
|
|
|
|
placeholder = "#{marker}#{placeholder}"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return string
|
|
|
|
end
|
|
|
|
|
2016-06-28 20:49:38 +00:00
|
|
|
# if we do have less then 10 lines and less then 300 chars ignore this
|
|
|
|
if !force
|
|
|
|
lines = string.split("\n")
|
|
|
|
return if lines.count < 10 && string.length < 300
|
|
|
|
end
|
|
|
|
|
2017-01-16 14:12:06 +00:00
|
|
|
# search for signature separator "--\n"
|
2016-06-28 20:49:38 +00:00
|
|
|
string.sub!(/^\s{0,2}--\s{0,2}$/) { |placeholder|
|
|
|
|
placeholder = "#{marker}#{placeholder}"
|
|
|
|
}
|
|
|
|
|
|
|
|
map = {}
|
|
|
|
# Apple Mail
|
|
|
|
# On 01/04/15 10:55, Bob Smith wrote:
|
|
|
|
map['apple-en'] = '^(On)[[:space:]].{6,20}[[:space:]].{3,10}[[:space:]].{1,250}[[:space:]](wrote):'
|
|
|
|
|
|
|
|
# Am 03.04.2015 um 20:58 schrieb Martin Edenhofer <me@znuny.ink>:
|
|
|
|
map['apple-de'] = '^(Am)[[:space:]].{6,20}[[:space:]](um)[[:space:]].{3,10}[[:space:]](schrieb)[[:space:]].{1,250}:'
|
|
|
|
|
|
|
|
# Thunderbird
|
|
|
|
# Am 04.03.2015 um 12:47 schrieb Alf Aardvark:
|
|
|
|
map['thunderbird-de'] = '^(Am)[[:space:]].{6,20}[[:space:]](um)[[:space:]].{3,10}[[:space:]](schrieb)[[:space:]].{1,250}:'
|
|
|
|
|
|
|
|
# Thunderbird default - http://kb.mozillazine.org/Reply_header_settings
|
|
|
|
# On 01-01-2007 11:00 AM, Alf Aardvark wrote:
|
|
|
|
map['thunderbird-en-default'] = '^(On)[[:space:]].{6,20}[[:space:]].{3,10},[[:space:]].{1,250}(wrote):'
|
|
|
|
|
|
|
|
# http://kb.mozillazine.org/Reply_header_settings
|
|
|
|
# Alf Aardvark wrote, on 01-01-2007 11:00 AM:
|
|
|
|
map['thunderbird-en'] = '^.{1,250}[[:space:]](wrote),[[:space:]]on[[:space:]].{3,20}:'
|
|
|
|
|
|
|
|
# otrs
|
|
|
|
# 25.02.2015 10:26 - edv hotline wrote:
|
|
|
|
# 25.02.2015 10:26 - edv hotline schrieb:
|
|
|
|
map['otrs-en-de'] = '^.{6,10}[[:space:]].{3,10}[[:space:]]-[[:space:]].{1,250}[[:space:]](wrote|schrieb):'
|
|
|
|
|
|
|
|
# Ms
|
|
|
|
# rubocop:disable Style/AsciiComments
|
|
|
|
# From: Martin Edenhofer via Znuny Support [mailto:support@znuny.inc]
|
|
|
|
# Send: Donnerstag, 2. April 2015 10:00
|
|
|
|
# To/Cc/Bcc: xxx
|
|
|
|
# Subject: xxx
|
|
|
|
# - or -
|
|
|
|
# From: xxx
|
|
|
|
# To/Cc/Bcc: xxx
|
|
|
|
# Date: 01.04.2015 12:41
|
|
|
|
# Subject: xxx
|
|
|
|
# - or -
|
|
|
|
# De : xxx
|
|
|
|
# À/?/?: xxx
|
|
|
|
# Envoyé : mercredi 29 avril 2015 17:31
|
|
|
|
# Objet : xxx
|
|
|
|
# rubocop:enable Style/AsciiComments
|
|
|
|
|
|
|
|
# en/de/fr | sometimes ms adds a space to "xx : value"
|
2017-03-10 06:49:01 +00:00
|
|
|
map['ms-en-de-fr_from'] = '^(Von|From|De|от|Z|Od|Ze|Fra|Van|Mistä|Από|Dal|から|Из|од|iz|Från|จาก|з|Từ)( ?):[[:space:]].+?'
|
2016-06-28 20:49:38 +00:00
|
|
|
map['ms-en-de-fr_from_html'] = "\n######b######(From|Von|De)([[:space:]]?):([[:space:]]?)(######\/b######)[[:space:]].+?"
|
|
|
|
|
|
|
|
# word 14
|
|
|
|
# edv hotline wrote:
|
|
|
|
# edv hotline schrieb:
|
|
|
|
#map['word-en-de'] = "[^#{marker}].{1,250}\s(wrote|schrieb):"
|
|
|
|
|
2016-06-30 20:04:48 +00:00
|
|
|
map.each { |_key, regexp|
|
2017-03-10 06:49:01 +00:00
|
|
|
begin
|
|
|
|
string.sub!(/#{regexp}/) { |placeholder|
|
|
|
|
placeholder = "#{marker}#{placeholder}"
|
|
|
|
}
|
|
|
|
rescue
|
|
|
|
# regexp was not possible because of some string encoding issue, use next
|
|
|
|
Rails.logger.debug "Invalid string/charset combination with regexp #{regexp} in string"
|
|
|
|
end
|
2016-06-28 20:49:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
string
|
|
|
|
end
|
2015-04-27 14:15:29 +00:00
|
|
|
end
|