nanoant-sinatra-hat 0.0.2 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/VERSION +1 -1
- data/lib/rack/gettext_reloader.rb +8 -7
- data/lib/sinatra-hat.rb +153 -0
- metadata +2 -5
- data/lib/gettext/date.rb +0 -80
- data/lib/sinatra-hat/string_permalink.rb +0 -7
- data/lib/sinatra-hat/utils.rb +0 -164
    
        data/VERSION
    CHANGED
    
    | @@ -1 +1 @@ | |
| 1 | 
            -
            0.0. | 
| 1 | 
            +
            0.0.3
         | 
| @@ -1,9 +1,10 @@ | |
| 1 1 | 
             
            module GetText
         | 
| 2 2 | 
             
              class Reloader < ::Rack::Reloader
         | 
| 3 | 
            -
                def initialize(app, cooldown | 
| 4 | 
            -
                  @ | 
| 5 | 
            -
                  @ | 
| 6 | 
            -
                  @ | 
| 3 | 
            +
                def initialize(app, path, cooldown=10)
         | 
| 4 | 
            +
                  @path = path
         | 
| 5 | 
            +
                  @po = Dir.glob(File.join(@path, '**', '*.po'))
         | 
| 6 | 
            +
                  @mo = Dir.glob(File.join(@path, '**', '*.mo'))
         | 
| 7 | 
            +
                  @pot = File.join(@path, 'rbigg.pot') # Used for locking
         | 
| 7 8 | 
             
                  # If there are not translations, give up
         | 
| 8 9 | 
             
                  cooldown = nil unless @po && @mo && @po.size > 0 && @mo.size > 0
         | 
| 9 10 | 
             
                  super(app, cooldown, Stat)
         | 
| @@ -28,12 +29,12 @@ module GetText | |
| 28 29 | 
             
                        found, mstat = safe_stat(@mo.first)
         | 
| 29 30 | 
             
                        if found && mstat && mstat.mtime == stat.mtime
         | 
| 30 31 | 
             
                          require 'gettext/tools'
         | 
| 31 | 
            -
                          Dir.chdir  | 
| 32 | 
            -
                            GetText.create_mofiles(:po_root => ' | 
| 32 | 
            +
                          Dir.chdir @path do
         | 
| 33 | 
            +
                            GetText.create_mofiles(:po_root => '.', :mo_root => '.')
         | 
| 33 34 | 
             
                          end
         | 
| 34 35 | 
             
                        end
         | 
| 35 36 | 
             
                        # Reload whole translation
         | 
| 36 | 
            -
                        FastGettext.add_text_domain(FastGettext.text_domain, :path =>  | 
| 37 | 
            +
                        FastGettext.add_text_domain(FastGettext.text_domain, :path => @path)
         | 
| 37 38 | 
             
                        FastGettext.current_cache = {}
         | 
| 38 39 | 
             
                      end
         | 
| 39 40 | 
             
                    end
         | 
    
        data/lib/sinatra-hat.rb
    CHANGED
    
    | @@ -0,0 +1,153 @@ | |
| 1 | 
            +
            # encoding: utf-8
         | 
| 2 | 
            +
            require 'iconv'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            class Integer
         | 
| 5 | 
            +
              def minute
         | 
| 6 | 
            +
                self * 60
         | 
| 7 | 
            +
              end
         | 
| 8 | 
            +
              alias minutes minute
         | 
| 9 | 
            +
              def hour
         | 
| 10 | 
            +
                minute * 60
         | 
| 11 | 
            +
              end
         | 
| 12 | 
            +
              alias hours hour
         | 
| 13 | 
            +
              def day
         | 
| 14 | 
            +
                hour * 24 
         | 
| 15 | 
            +
              end
         | 
| 16 | 
            +
              alias days day
         | 
| 17 | 
            +
              def week
         | 
| 18 | 
            +
                day * 7
         | 
| 19 | 
            +
              end
         | 
| 20 | 
            +
              alias weeks week
         | 
| 21 | 
            +
              def month
         | 
| 22 | 
            +
                day * 30
         | 
| 23 | 
            +
              end
         | 
| 24 | 
            +
              alias months month
         | 
| 25 | 
            +
              def year
         | 
| 26 | 
            +
                day * 365
         | 
| 27 | 
            +
              end
         | 
| 28 | 
            +
              alias years year
         | 
| 29 | 
            +
              def ago
         | 
| 30 | 
            +
                Time.now - self
         | 
| 31 | 
            +
              end
         | 
| 32 | 
            +
            end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
            class Time
         | 
| 35 | 
            +
              def year_start
         | 
| 36 | 
            +
                d = (self - (month-1).months - (day-1).days - hour.hours - min.minutes - sec)
         | 
| 37 | 
            +
                d - (d.day-1).days - d.hour.hours - d.min.minutes - d.sec
         | 
| 38 | 
            +
              end
         | 
| 39 | 
            +
              def month_start
         | 
| 40 | 
            +
                self - (day-1).days - hour.hours - min.minutes - sec
         | 
| 41 | 
            +
              end
         | 
| 42 | 
            +
              def week_start
         | 
| 43 | 
            +
                self - ((wday + 6) % 7).days - hour.hours - min.minutes - sec
         | 
| 44 | 
            +
              end
         | 
| 45 | 
            +
              def midnight
         | 
| 46 | 
            +
                self - hour.hours - min.minutes - sec
         | 
| 47 | 
            +
              end
         | 
| 48 | 
            +
              def noon
         | 
| 49 | 
            +
                midnight + 12.hours
         | 
| 50 | 
            +
              end
         | 
| 51 | 
            +
            end
         | 
| 52 | 
            +
             | 
| 53 | 
            +
            class String
         | 
| 54 | 
            +
              def mail_utf8_subject
         | 
| 55 | 
            +
                # 4.2 http://tools.ietf.org/html/rfc2047
         | 
| 56 | 
            +
                '=?UTF-8?Q?'+(self.chomp.gsub(/[^ !-<>-^`-~]/){|m| m.unpack('C*').map{|c| '=%02X' % c}.join}.gsub(/\s/, '_'))+'?='
         | 
| 57 | 
            +
              end
         | 
| 58 | 
            +
              def cdata
         | 
| 59 | 
            +
                "<![CDATA[#{self.gsub(/\]\]>/,']]]]><![CDATA[>')}]]>"
         | 
| 60 | 
            +
              end
         | 
| 61 | 
            +
              def md5
         | 
| 62 | 
            +
                hash = Digest::MD5.new
         | 
| 63 | 
            +
                hash << self
         | 
| 64 | 
            +
                hash.hexdigest
         | 
| 65 | 
            +
              end
         | 
| 66 | 
            +
              def sha1
         | 
| 67 | 
            +
                hash = Digest::SHA1.new
         | 
| 68 | 
            +
                hash << self
         | 
| 69 | 
            +
                hash.hexdigest
         | 
| 70 | 
            +
              end
         | 
| 71 | 
            +
              # This is Pligg style password hash
         | 
| 72 | 
            +
              def pwdhash(salt=nil)
         | 
| 73 | 
            +
                salt = String.random_password.md5 if salt.nil?
         | 
| 74 | 
            +
                salt = salt[0..8]
         | 
| 75 | 
            +
                salt+(salt+self).sha1
         | 
| 76 | 
            +
              end
         | 
| 77 | 
            +
              def excerpt(chars=nil)
         | 
| 78 | 
            +
                first = split(/(?:\n\r?){2,}/)[0] || ""
         | 
| 79 | 
            +
                return first if chars.nil?
         | 
| 80 | 
            +
                words = first.split(' ')
         | 
| 81 | 
            +
                pos, count = words.inject([0, 0]) do |c, v|
         | 
| 82 | 
            +
                  c[1] + v.length < chars ? [c[0] + 1, c[1] + v.length] : c
         | 
| 83 | 
            +
                end
         | 
| 84 | 
            +
                words[0..pos].join(' ') + ((pos == words.size) ? '' : '…')
         | 
| 85 | 
            +
              end
         | 
| 86 | 
            +
              def utf8_length
         | 
| 87 | 
            +
                unpack('U*').length
         | 
| 88 | 
            +
              end
         | 
| 89 | 
            +
              def pad(other, extra=0)
         | 
| 90 | 
            +
                padding = other.utf8_length - utf8_length
         | 
| 91 | 
            +
                padding = 0 if padding < 0
         | 
| 92 | 
            +
                ' ' * (padding+extra) + self
         | 
| 93 | 
            +
              end
         | 
| 94 | 
            +
              def self.random_password(length=9, strength=0)
         | 
| 95 | 
            +
                vowels      = 'aeuy'
         | 
| 96 | 
            +
                consonants  = 'bdghjmnpqrstvz'
         | 
| 97 | 
            +
                consonants += 'BDGHJLMNPQRSTVWXZ' if strength & 1 != 0
         | 
| 98 | 
            +
                vowels     += 'AEUY'              if strength & 2 != 0
         | 
| 99 | 
            +
                consonants += '23456789'          if strength & 4 != 0
         | 
| 100 | 
            +
                consonants += '@#$%'              if strength & 8 != 0
         | 
| 101 | 
            +
                password = '';
         | 
| 102 | 
            +
                alt = rand(2)
         | 
| 103 | 
            +
                length.times do
         | 
| 104 | 
            +
                  password += consonants[rand(consonants.size - 1)].chr if alt != 0
         | 
| 105 | 
            +
                  password += vowels[rand(vowels.size - 1)].chr         if alt == 0
         | 
| 106 | 
            +
                  alt = 1 - alt
         | 
| 107 | 
            +
                end
         | 
| 108 | 
            +
                password
         | 
| 109 | 
            +
              end
         | 
| 110 | 
            +
              def comma_split
         | 
| 111 | 
            +
                CSV.parse_line(gsub(/"\s+,/,'",').gsub(/,\s+"/,',"')).collect{|t| t.strip unless t.nil?}.delete_if{|t| t.nil? || t.empty?}
         | 
| 112 | 
            +
              end
         | 
| 113 | 
            +
              # http://gist.github.com/93045
         | 
| 114 | 
            +
              def to_permalink
         | 
| 115 | 
            +
                Iconv.iconv('ascii//translit//IGNORE', 'utf-8', self).first.gsub("'", "").gsub(/[^\x00-\x7F]+/, '').gsub(/[^a-zA-Z0-9-]+/, '-').gsub(/--+/, '-').gsub(/^-/, '').gsub(/-$/, '').downcase
         | 
| 116 | 
            +
              end
         | 
| 117 | 
            +
            end
         | 
| 118 | 
            +
             | 
| 119 | 
            +
            class Array
         | 
| 120 | 
            +
              def comma_join
         | 
| 121 | 
            +
                map{|v| s = v.gsub!(/,/,',') || v.gsub!(/"/,'""'); s ? '"'+v+'"' : v}.join(', ')
         | 
| 122 | 
            +
              end
         | 
| 123 | 
            +
            end
         | 
| 124 | 
            +
             | 
| 125 | 
            +
            if defined? Rack
         | 
| 126 | 
            +
              class Rack::Request
         | 
| 127 | 
            +
                def url(path=nil)
         | 
| 128 | 
            +
                  url = scheme + "://"
         | 
| 129 | 
            +
                  url << host
         | 
| 130 | 
            +
                  if scheme == "https" && port != 443 ||
         | 
| 131 | 
            +
                    scheme == "http" && port != 80
         | 
| 132 | 
            +
                    url << ":#{port}"
         | 
| 133 | 
            +
                  end
         | 
| 134 | 
            +
                  url << (path ? path : fullpath)
         | 
| 135 | 
            +
                  url
         | 
| 136 | 
            +
                end
         | 
| 137 | 
            +
              end
         | 
| 138 | 
            +
            end
         | 
| 139 | 
            +
             | 
| 140 | 
            +
            def silence_warnings
         | 
| 141 | 
            +
              old_verbose, $VERBOSE = $VERBOSE, nil
         | 
| 142 | 
            +
              yield
         | 
| 143 | 
            +
            ensure
         | 
| 144 | 
            +
              $VERBOSE = old_verbose
         | 
| 145 | 
            +
            end
         | 
| 146 | 
            +
             | 
| 147 | 
            +
            if RUBY_VERSION < "1.9.0"
         | 
| 148 | 
            +
              class Symbol
         | 
| 149 | 
            +
               def to_proc
         | 
| 150 | 
            +
                 proc { |obj, *args| obj.send(self, *args) }
         | 
| 151 | 
            +
               end
         | 
| 152 | 
            +
              end
         | 
| 153 | 
            +
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification 
         | 
| 2 2 | 
             
            name: nanoant-sinatra-hat
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version 
         | 
| 4 | 
            -
              version: 0.0. | 
| 4 | 
            +
              version: 0.0.3
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors: 
         | 
| 7 7 | 
             
            - Adam Strzelecki
         | 
| @@ -9,7 +9,7 @@ autorequire: | |
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 11 |  | 
| 12 | 
            -
            date: 2009-07- | 
| 12 | 
            +
            date: 2009-07-10 00:00:00 -07:00
         | 
| 13 13 | 
             
            default_executable: 
         | 
| 14 14 | 
             
            dependencies: []
         | 
| 15 15 |  | 
| @@ -26,7 +26,6 @@ files: | |
| 26 26 | 
             
            - README.markdown
         | 
| 27 27 | 
             
            - Rakefile
         | 
| 28 28 | 
             
            - VERSION
         | 
| 29 | 
            -
            - lib/gettext/date.rb
         | 
| 30 29 | 
             
            - lib/gettext/haml.rb
         | 
| 31 30 | 
             
            - lib/gettext/haml_parser.rb
         | 
| 32 31 | 
             
            - lib/gettext/ruby19_fix.rb
         | 
| @@ -34,8 +33,6 @@ files: | |
| 34 33 | 
             
            - lib/rack/gettext_reloader.rb
         | 
| 35 34 | 
             
            - lib/sequel/utf8_fix.rb
         | 
| 36 35 | 
             
            - lib/sinatra-hat.rb
         | 
| 37 | 
            -
            - lib/sinatra-hat/string_permalink.rb
         | 
| 38 | 
            -
            - lib/sinatra-hat/utils.rb
         | 
| 39 36 | 
             
            - lib/sinatra/reloader.rb
         | 
| 40 37 | 
             
            - lib/sinatra/template_cache.rb
         | 
| 41 38 | 
             
            - test/sinatra-hat_test.rb
         | 
    
        data/lib/gettext/date.rb
    DELETED
    
    | @@ -1,80 +0,0 @@ | |
| 1 | 
            -
            class Date
         | 
| 2 | 
            -
              silence_warnings do
         | 
| 3 | 
            -
                MONTHNAMES = [nil,
         | 
| 4 | 
            -
                  N_('January'),
         | 
| 5 | 
            -
                  N_('February'),
         | 
| 6 | 
            -
                  N_('March'),
         | 
| 7 | 
            -
                  N_('April'),
         | 
| 8 | 
            -
                  N_('May'),
         | 
| 9 | 
            -
                  N_('June'),
         | 
| 10 | 
            -
                  N_('July'),
         | 
| 11 | 
            -
                  N_('August'),
         | 
| 12 | 
            -
                  N_('September'),
         | 
| 13 | 
            -
                  N_('October'),
         | 
| 14 | 
            -
                  N_('November'),
         | 
| 15 | 
            -
                  N_('December')]
         | 
| 16 | 
            -
             | 
| 17 | 
            -
                BASE_MONTHNAMES = [nil,
         | 
| 18 | 
            -
                  N_('b|January'),
         | 
| 19 | 
            -
                  N_('b|February'),
         | 
| 20 | 
            -
                  N_('b|March'),
         | 
| 21 | 
            -
                  N_('b|April'),
         | 
| 22 | 
            -
                  N_('b|May'),
         | 
| 23 | 
            -
                  N_('b|June'),
         | 
| 24 | 
            -
                  N_('b|July'),
         | 
| 25 | 
            -
                  N_('b|August'),
         | 
| 26 | 
            -
                  N_('b|September'),
         | 
| 27 | 
            -
                  N_('b|October'),
         | 
| 28 | 
            -
                  N_('b|November'),
         | 
| 29 | 
            -
                  N_('b|December')]
         | 
| 30 | 
            -
             | 
| 31 | 
            -
                DAYNAMES = [
         | 
| 32 | 
            -
                  N_('Sunday'),
         | 
| 33 | 
            -
                  N_('Monday'),
         | 
| 34 | 
            -
                  N_('Tuesday'),
         | 
| 35 | 
            -
                  N_('Wednesday'),
         | 
| 36 | 
            -
                  N_('Thursday'),
         | 
| 37 | 
            -
                  N_('Friday'),
         | 
| 38 | 
            -
                  N_('Saturday')]
         | 
| 39 | 
            -
             | 
| 40 | 
            -
                ABBR_MONTHNAMES = [nil,
         | 
| 41 | 
            -
                  N_('Jan'),
         | 
| 42 | 
            -
                  N_('Feb'),
         | 
| 43 | 
            -
                  N_('Mar'),
         | 
| 44 | 
            -
                  N_('Apr'),
         | 
| 45 | 
            -
                  N_('May'),
         | 
| 46 | 
            -
                  N_('Jun'),
         | 
| 47 | 
            -
                  N_('Jul'),
         | 
| 48 | 
            -
                  N_('Aug'),
         | 
| 49 | 
            -
                  N_('Sep'),
         | 
| 50 | 
            -
                  N_('Oct'),
         | 
| 51 | 
            -
                  N_('Nov'),
         | 
| 52 | 
            -
                  N_('Dec')]
         | 
| 53 | 
            -
             | 
| 54 | 
            -
                ABBR_DAYNAMES = [
         | 
| 55 | 
            -
                  N_('Sun'),
         | 
| 56 | 
            -
                  N_('Mon'),
         | 
| 57 | 
            -
                  N_('Tue'),
         | 
| 58 | 
            -
                  N_('Wed'),
         | 
| 59 | 
            -
                  N_('Thu'),
         | 
| 60 | 
            -
                  N_('Fri'),
         | 
| 61 | 
            -
                  N_('Sat')]
         | 
| 62 | 
            -
              end
         | 
| 63 | 
            -
            end
         | 
| 64 | 
            -
             | 
| 65 | 
            -
            class Time
         | 
| 66 | 
            -
              alias :strftime_nolocale :strftime
         | 
| 67 | 
            -
             | 
| 68 | 
            -
              def strftime_gettext(format)
         | 
| 69 | 
            -
                format = format.dup
         | 
| 70 | 
            -
                format.gsub!(/%a/, _(Date::ABBR_DAYNAMES[self.wday]))
         | 
| 71 | 
            -
                format.gsub!(/%A/, _(Date::DAYNAMES[self.wday]))
         | 
| 72 | 
            -
                format.gsub!(/%b/, _(Date::ABBR_MONTHNAMES[self.mon]))
         | 
| 73 | 
            -
                format.gsub!(/%B/, _(Date::MONTHNAMES[self.mon]))
         | 
| 74 | 
            -
                self.strftime_nolocale(format)
         | 
| 75 | 
            -
              end
         | 
| 76 | 
            -
             | 
| 77 | 
            -
              def to_s
         | 
| 78 | 
            -
                strftime_gettext _('%I:%M %p, %A, %B %d, %Y')
         | 
| 79 | 
            -
              end
         | 
| 80 | 
            -
            end
         | 
| @@ -1,7 +0,0 @@ | |
| 1 | 
            -
            # http://gist.github.com/93045
         | 
| 2 | 
            -
            require 'iconv'
         | 
| 3 | 
            -
            class String
         | 
| 4 | 
            -
              def to_permalink
         | 
| 5 | 
            -
                Iconv.iconv('ascii//translit//IGNORE', 'utf-8', self).first.gsub("'", "").gsub(/[^\x00-\x7F]+/, '').gsub(/[^a-zA-Z0-9-]+/, '-').gsub(/--+/, '-').gsub(/^-/, '').gsub(/-$/, '').downcase
         | 
| 6 | 
            -
              end
         | 
| 7 | 
            -
            end
         | 
    
        data/lib/sinatra-hat/utils.rb
    DELETED
    
    | @@ -1,164 +0,0 @@ | |
| 1 | 
            -
            # encoding: utf-8
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            class Integer
         | 
| 4 | 
            -
              def minute
         | 
| 5 | 
            -
                self * 60
         | 
| 6 | 
            -
              end
         | 
| 7 | 
            -
              alias minutes minute
         | 
| 8 | 
            -
              def hour
         | 
| 9 | 
            -
                minute * 60
         | 
| 10 | 
            -
              end
         | 
| 11 | 
            -
              alias hours hour
         | 
| 12 | 
            -
              def day
         | 
| 13 | 
            -
                hour * 24 
         | 
| 14 | 
            -
              end
         | 
| 15 | 
            -
              alias days day
         | 
| 16 | 
            -
              def week
         | 
| 17 | 
            -
                day * 7
         | 
| 18 | 
            -
              end
         | 
| 19 | 
            -
              alias weeks week
         | 
| 20 | 
            -
              def month
         | 
| 21 | 
            -
                day * 30
         | 
| 22 | 
            -
              end
         | 
| 23 | 
            -
              alias months month
         | 
| 24 | 
            -
              def year
         | 
| 25 | 
            -
                day * 365
         | 
| 26 | 
            -
              end
         | 
| 27 | 
            -
              alias years year
         | 
| 28 | 
            -
              def ago
         | 
| 29 | 
            -
                Time.now - self
         | 
| 30 | 
            -
              end
         | 
| 31 | 
            -
            end
         | 
| 32 | 
            -
             | 
| 33 | 
            -
            class Time
         | 
| 34 | 
            -
              def year_start
         | 
| 35 | 
            -
                d = (self - (month-1).months - (day-1).days - hour.hours - min.minutes - sec)
         | 
| 36 | 
            -
                d - (d.day-1).days - d.hour.hours - d.min.minutes - d.sec
         | 
| 37 | 
            -
              end
         | 
| 38 | 
            -
              def month_start
         | 
| 39 | 
            -
                self - (day-1).days - hour.hours - min.minutes - sec
         | 
| 40 | 
            -
              end
         | 
| 41 | 
            -
              def week_start
         | 
| 42 | 
            -
                self - ((wday + 6) % 7).days - hour.hours - min.minutes - sec
         | 
| 43 | 
            -
              end
         | 
| 44 | 
            -
              def midnight
         | 
| 45 | 
            -
                self - hour.hours - min.minutes - sec
         | 
| 46 | 
            -
              end
         | 
| 47 | 
            -
              def noon
         | 
| 48 | 
            -
                midnight + 12.hours
         | 
| 49 | 
            -
              end
         | 
| 50 | 
            -
              def ago
         | 
| 51 | 
            -
                s = (Time.now - self).round
         | 
| 52 | 
            -
                if (m = s.div(60)) > 0
         | 
| 53 | 
            -
                  if (h = m.div(60)) > 0
         | 
| 54 | 
            -
                    if (d = h.div(24)) > 0
         | 
| 55 | 
            -
                      "#{d} " + n_('day', 'days', d)
         | 
| 56 | 
            -
                    else
         | 
| 57 | 
            -
                      "#{h} " + n_('hour', 'hours', h)
         | 
| 58 | 
            -
                    end
         | 
| 59 | 
            -
                  else
         | 
| 60 | 
            -
                    "#{m} " + n_('minute', 'minutes', m)
         | 
| 61 | 
            -
                  end
         | 
| 62 | 
            -
                else
         | 
| 63 | 
            -
                  "#{s} " + n_('second', 'seconds', s)
         | 
| 64 | 
            -
                end
         | 
| 65 | 
            -
              end
         | 
| 66 | 
            -
            end
         | 
| 67 | 
            -
             | 
| 68 | 
            -
            class String
         | 
| 69 | 
            -
              def mail_utf8_subject
         | 
| 70 | 
            -
                # 4.2 http://tools.ietf.org/html/rfc2047
         | 
| 71 | 
            -
                '=?UTF-8?Q?'+(self.chomp.gsub(/[^ !-<>-^`-~]/){|m| m.unpack('C*').map{|c| '=%02X' % c}.join}.gsub(/\s/, '_'))+'?='
         | 
| 72 | 
            -
              end
         | 
| 73 | 
            -
              def cdata
         | 
| 74 | 
            -
                "<![CDATA[#{self.gsub(/\]\]>/,']]]]><![CDATA[>')}]]>"
         | 
| 75 | 
            -
              end
         | 
| 76 | 
            -
              def md5
         | 
| 77 | 
            -
                hash = Digest::MD5.new
         | 
| 78 | 
            -
                hash << self
         | 
| 79 | 
            -
                hash.hexdigest
         | 
| 80 | 
            -
              end
         | 
| 81 | 
            -
              def sha1
         | 
| 82 | 
            -
                hash = Digest::SHA1.new
         | 
| 83 | 
            -
                hash << self
         | 
| 84 | 
            -
                hash.hexdigest
         | 
| 85 | 
            -
              end
         | 
| 86 | 
            -
              # This is Pligg style password hash
         | 
| 87 | 
            -
              def pwdhash(salt=nil)
         | 
| 88 | 
            -
                salt = String.random_password.md5 if salt.nil?
         | 
| 89 | 
            -
                salt = salt[0..8]
         | 
| 90 | 
            -
                salt+(salt+self).sha1
         | 
| 91 | 
            -
              end
         | 
| 92 | 
            -
              def excerpt(chars=nil)
         | 
| 93 | 
            -
                first = split(/(?:\n\r?){2,}/)[0] || ""
         | 
| 94 | 
            -
                return first if chars.nil?
         | 
| 95 | 
            -
                words = first.split(' ')
         | 
| 96 | 
            -
                pos, count = words.inject([0, 0]) do |c, v|
         | 
| 97 | 
            -
                  c[1] + v.length < chars ? [c[0] + 1, c[1] + v.length] : c
         | 
| 98 | 
            -
                end
         | 
| 99 | 
            -
                words[0..pos].join(' ') + ((pos == words.size) ? '' : '…')
         | 
| 100 | 
            -
              end
         | 
| 101 | 
            -
              def utf8_length
         | 
| 102 | 
            -
                unpack('U*').length
         | 
| 103 | 
            -
              end
         | 
| 104 | 
            -
              def pad(other, extra=0)
         | 
| 105 | 
            -
                padding = other.utf8_length - utf8_length
         | 
| 106 | 
            -
                padding = 0 if padding < 0
         | 
| 107 | 
            -
                ' ' * (padding+extra) + self
         | 
| 108 | 
            -
              end
         | 
| 109 | 
            -
              def self.random_password(length=9, strength=0)
         | 
| 110 | 
            -
                vowels      = 'aeuy'
         | 
| 111 | 
            -
                consonants  = 'bdghjmnpqrstvz'
         | 
| 112 | 
            -
                consonants += 'BDGHJLMNPQRSTVWXZ' if strength & 1 != 0
         | 
| 113 | 
            -
                vowels     += 'AEUY'              if strength & 2 != 0
         | 
| 114 | 
            -
                consonants += '23456789'          if strength & 4 != 0
         | 
| 115 | 
            -
                consonants += '@#$%'              if strength & 8 != 0
         | 
| 116 | 
            -
                password = '';
         | 
| 117 | 
            -
                alt = rand(2)
         | 
| 118 | 
            -
                length.times do
         | 
| 119 | 
            -
                  password += consonants[rand(consonants.size - 1)].chr if alt != 0
         | 
| 120 | 
            -
                  password += vowels[rand(vowels.size - 1)].chr         if alt == 0
         | 
| 121 | 
            -
                  alt = 1 - alt
         | 
| 122 | 
            -
                end
         | 
| 123 | 
            -
                password
         | 
| 124 | 
            -
              end
         | 
| 125 | 
            -
              def comma_split
         | 
| 126 | 
            -
                CSV.parse_line(gsub(/"\s+,/,'",').gsub(/,\s+"/,',"')).collect{|t| t.strip unless t.nil?}.delete_if{|t| t.nil? || t.empty?}
         | 
| 127 | 
            -
              end
         | 
| 128 | 
            -
            end
         | 
| 129 | 
            -
             | 
| 130 | 
            -
            class Array
         | 
| 131 | 
            -
              def comma_join
         | 
| 132 | 
            -
                map{|v| s = v.gsub!(/,/,',') || v.gsub!(/"/,'""'); s ? '"'+v+'"' : v}.join(', ')
         | 
| 133 | 
            -
              end
         | 
| 134 | 
            -
            end
         | 
| 135 | 
            -
             | 
| 136 | 
            -
            if defined? Rack
         | 
| 137 | 
            -
              class Rack::Request
         | 
| 138 | 
            -
                def url(path=nil)
         | 
| 139 | 
            -
                  url = scheme + "://"
         | 
| 140 | 
            -
                  url << host
         | 
| 141 | 
            -
                  if scheme == "https" && port != 443 ||
         | 
| 142 | 
            -
                    scheme == "http" && port != 80
         | 
| 143 | 
            -
                    url << ":#{port}"
         | 
| 144 | 
            -
                  end
         | 
| 145 | 
            -
                  url << (path ? path : fullpath)
         | 
| 146 | 
            -
                  url
         | 
| 147 | 
            -
                end
         | 
| 148 | 
            -
              end
         | 
| 149 | 
            -
            end
         | 
| 150 | 
            -
             | 
| 151 | 
            -
            def silence_warnings
         | 
| 152 | 
            -
              old_verbose, $VERBOSE = $VERBOSE, nil
         | 
| 153 | 
            -
              yield
         | 
| 154 | 
            -
            ensure
         | 
| 155 | 
            -
              $VERBOSE = old_verbose
         | 
| 156 | 
            -
            end
         | 
| 157 | 
            -
             | 
| 158 | 
            -
            if RUBY_VERSION < "1.9.0"
         | 
| 159 | 
            -
              class Symbol
         | 
| 160 | 
            -
               def to_proc
         | 
| 161 | 
            -
                 proc { |obj, *args| obj.send(self, *args) }
         | 
| 162 | 
            -
               end
         | 
| 163 | 
            -
              end
         | 
| 164 | 
            -
            end
         |