123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225 |
- class String
- def message_quote
- quote = split("\n")
- body_quote = ''
- quote.each do |line|
- body_quote = body_quote + '> ' + line + "\n"
- end
- body_quote
- end
- def word_wrap(*args)
- options = args.extract_options!
- unless args.blank?
- options[:line_width] = args[0] || 82
- end
- options.reverse_merge!(line_width: 82)
- 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
- =begin
- filename = 'Some::Module'.to_filename
- returns
- 'some/module'
- =end
- def to_filename
- camel_cased_word = "#{self}" # rubocop:disable Style/UnneededInterpolation
- camel_cased_word.gsub(/::/, '/')
- .gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
- .gsub(/([a-z\d])([A-Z])/, '\1_\2')
- .tr('-', '_').downcase
- end
- =begin
- filename = 'some/module.rb'.to_classname
- returns
- 'Some::Module'
- =end
- def to_classname
- camel_cased_word = "#{self}" # rubocop:disable Style/UnneededInterpolation
- camel_cased_word.gsub!(/\.rb$/, '')
- camel_cased_word.split('/').map(&:camelize).join('::')
- end
- # 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
- return self if Rails.application.config.db_4bytes_utf8
- each_char.select {|c|
- if c.bytes.count > 3
- Rails.logger.warn "strip out 4 bytes utf8 chars '#{c}' of '#{self}'"
- next
- end
- c
- }
- .join('')
- end
- =begin
- text = html_string.html2text
- returns
- 'string with text only'
- =end
- def html2text(string_only = false)
- string = "#{self}" # rubocop:disable Style/UnneededInterpolation
- # 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?
- string = string.chars.select(&:valid_encoding?).join
- end
- # find <a href=....> and replace it with [x]
- link_list = ''
- counter = 0
- if !string_only
- string.gsub!( /<a\s.*?href=("|')(.+?)("|').*?>/ix ) {
- link = $2
- counter = counter + 1
- link_list += "[#{counter}] #{link}\n"
- "[#{counter}] "
- }
- end
- # remove style tags with content
- string.gsub!( %r{<style(|\s.+?)>(.+?)</style>}im, '')
- # remove empty lines
- string.gsub!( /^\s*/m, '' )
- # pre/code handling 1/2
- string.gsub!( %r{<pre>(.+?)</pre>}m ) { |placeholder|
- placeholder = placeholder.gsub(/\n/, '###BR###')
- }
- string.gsub!( %r{<code>(.+?)</code>}m ) { |placeholder|
- placeholder = placeholder.gsub(/\n/, '###BR###')
- }
- # insert spaces on [A-z]\n[A-z]
- string.gsub!( /([A-z])\n([A-z])/m, '\1 \2' )
- # remove all new lines
- string.gsub!(/(\n\r|\r\r\n|\r\n|\n)/, '')
- # blockquote handling
- string.gsub!( %r{<blockquote(| [^>]*)>(.+?)</blockquote>}m ) {
- "\n" + $2.html2text(true).gsub(/^(.*)$/, '> \1') + "\n"
- }
- # pre/code handling 2/2
- string.gsub!(/###BR###/, "\n" )
- # add counting
- string.gsub!(/<li(| [^>]*)>/i, "\n* ")
- # add hr
- string.gsub!(%r{<hr(|/| [^>]*)>}i, "\n___\n")
- # add h\d
- string.gsub!(%r{</h\d>}i, "\n")
- # add new lines
- string.gsub!( %r{</div><div(|\s.+?)>}im, "\n" )
- string.gsub!( %r{</p><p(|\s.+?)>}im, "\n" )
- string.gsub!( %r{<(div|p|pre|br|table|h)(|/| [^>]*)>}i, "\n" )
- string.gsub!( %r{</(tr|p|br|div)(|\s.+?)>}i, "\n" )
- string.gsub!( %r{</td>}i, ' ' )
- # strip all other tags
- string.gsub!( /\<.+?\>/, '' )
- # replace multiple spaces with one
- string.gsub!(/ /, ' ')
- # try HTMLEntities, if it fails on invalid signes, use manual way
- begin
- coder = HTMLEntities.new
- string = coder.decode(string)
- rescue
- # strip all & < > "
- string.gsub!( '&', '&' )
- string.gsub!( '<', '<' )
- string.gsub!( '>', '>' )
- string.gsub!( '"', '"' )
- string.gsub!( ' ', ' ' )
- # encode html entities like "–"
- string.gsub!( /(&\#(\d+);?)/x ) {
- $2.chr
- }
- # encode html entities like "d;"
- string.gsub!( /(&\#[xX]([0-9a-fA-F]+);?)/x ) {
- chr_orig = $1
- hex = $2.hex
- if hex
- chr = hex.chr
- if chr
- chr_orig = chr
- else
- chr_orig
- end
- else
- chr_orig
- end
- # check valid encoding
- begin
- if !chr_orig.encode('UTF-8').valid_encoding?
- chr_orig = '?'
- end
- rescue
- chr_orig = '?'
- end
- chr_orig
- }
- end
- # remove tailing empty spaces
- string.gsub!(/\s+\n$/, "\n")
- # remove multiple empty lines
- string.gsub!(/\n\n\n/, "\n\n")
- string.strip!
- # add extracted links
- if link_list != ''
- string += "\n\n\n" + link_list
- end
- string.strip
- end
- =begin
- html = text_string.text2html
- =end
- def text2html
- text = CGI.escapeHTML(self)
- text.gsub!(/\n/, '<br>')
- text.chomp
- end
- end
|