msgtrail 0.9.3 → 0.9.4
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -0
- data/lib/msgtrail/publish.rb +1 -0
- data/lib/msgtrail/renderers.rb +8 -4
- data/lib/msgtrail/titlecase.rb +82 -0
- data/lib/msgtrail/version.rb +1 -1
- metadata +3 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 37b3e65f039cda9ff376bbea5476a4e2ed3f867cf65cf7454366280d433b587e
         | 
| 4 | 
            +
              data.tar.gz: 3cec58c5e959057b87d17ad66453e96beb4b6c87efae0b78472992e4f626b6a6
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 10141e2815729de2799466e5e8b02b7b5ee9960ba87f327bf76f83aae02ae14cc715ba940f9e67d6d2444d8f06b85187600f2b126f215e86a485b6804ad8593b
         | 
| 7 | 
            +
              data.tar.gz: 72503d1dec88d0794977667838591c2b923d0aaefca49765e9af750e79f5dccc3b879f1be68b5d139ff07c108c01cdf6bb286ee014cdba509bf27b77b3237f2a
         | 
    
        data/CHANGELOG.md
    CHANGED
    
    
    
        data/lib/msgtrail/publish.rb
    CHANGED
    
    
    
        data/lib/msgtrail/renderers.rb
    CHANGED
    
    | @@ -1,9 +1,5 @@ | |
| 1 1 | 
             
            module RenderHelper
         | 
| 2 2 |  | 
| 3 | 
            -
              def now_as_rfc3339
         | 
| 4 | 
            -
                DateTime.now.rfc3339
         | 
| 5 | 
            -
              end
         | 
| 6 | 
            -
             | 
| 7 3 | 
             
              def as_rfc3339(published, updated = nil)
         | 
| 8 4 | 
             
                updated.nil? ? datestamp = published : datestamp = updated
         | 
| 9 5 | 
             
                ymd = datestamp[:date].split(/\D/).map(&:to_i)
         | 
| @@ -11,6 +7,14 @@ module RenderHelper | |
| 11 7 | 
             
                DateTime.new(ymd[0], ymd[1], ymd[2], hm[0], hm[1], 0, datestamp[:utc_offset]).rfc3339
         | 
| 12 8 | 
             
              end
         | 
| 13 9 |  | 
| 10 | 
            +
              def now_as_rfc3339
         | 
| 11 | 
            +
                DateTime.now.rfc3339
         | 
| 12 | 
            +
              end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
              def titlecase(word)
         | 
| 15 | 
            +
                Msgtrail::Titlecase.titlecase(word)
         | 
| 16 | 
            +
              end
         | 
| 17 | 
            +
             | 
| 14 18 | 
             
              def xml_safe(str)
         | 
| 15 19 | 
             
                str.gsub("&", "&").gsub("<", "<").gsub(">", ">").gsub("\"", """).gsub("'", "'")
         | 
| 16 20 | 
             
              end
         | 
| @@ -0,0 +1,82 @@ | |
| 1 | 
            +
            module Msgtrail
         | 
| 2 | 
            +
              class Titlecase
         | 
| 3 | 
            +
             | 
| 4 | 
            +
                SMALL_WORDS = [
         | 
| 5 | 
            +
                  /\Aa(nd|n|s|t)?\z/,
         | 
| 6 | 
            +
                  /\Ab(ut|y)\z/,
         | 
| 7 | 
            +
                  /\Aen\z/,
         | 
| 8 | 
            +
                  /\Afor\z/,
         | 
| 9 | 
            +
                  /\Ai(f|n)\z/,
         | 
| 10 | 
            +
                  /\Ao(f|n|r)\z/,
         | 
| 11 | 
            +
                  /\At(he|o)\z/,
         | 
| 12 | 
            +
                  /\Avs?\.?\z/
         | 
| 13 | 
            +
                ].freeze
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                RE = Regexp.new('\b(a(nd|n|s|t)?|b(ut|y)|en|for|i(f|n)|o(f|n|r)|t(he|o)|vs?\.?)\b').freeze
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                def self.is_small_word?(word)
         | 
| 18 | 
            +
                  !RE.match(word).nil?
         | 
| 19 | 
            +
                end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                # "__foo" => "__Foo"
         | 
| 22 | 
            +
                def self.upcase_first_real_letter(word)
         | 
| 23 | 
            +
                  word.sub(/[a-zA-Z0-9]/, &:upcase)
         | 
| 24 | 
            +
                end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                # step-by-step => Step-by-Step
         | 
| 27 | 
            +
                def self.upcase_word_with_dashes(word)
         | 
| 28 | 
            +
                  word.split('-').map { |part| is_small_word?(part) ? part : part.capitalize }.join("-")
         | 
| 29 | 
            +
                end
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                # before/after => Before/After
         | 
| 32 | 
            +
                def self.upcase_word_with_slashes(word)
         | 
| 33 | 
            +
                  word.split('/').map { |part| part.capitalize }.join('/')
         | 
| 34 | 
            +
                end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                def self.titlecase(str)
         | 
| 37 | 
            +
                  return if (str || '').strip.empty?
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                  # Downcase an all-upcase sentence
         | 
| 40 | 
            +
                  str.downcase! if str.scan(/[A-Z]|\s|\W/).length == str.length
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                  # Replace tabs by single space
         | 
| 43 | 
            +
                  # Replace weird spaces by regular space
         | 
| 44 | 
            +
                  # Split sentence at space boundaries
         | 
| 45 | 
            +
                  word_arr = str.gsub(/\t/, ' ').gsub("\u{2011}", ' ').split(' ')
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                  # Initialize operand array
         | 
| 48 | 
            +
                  operand_arr = Array.new(word_arr.size, :nop)
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                  word_arr.each_with_index do |word, idx|
         | 
| 51 | 
            +
                    # Don't capitalize small words...
         | 
| 52 | 
            +
                    # ... unless it's first word
         | 
| 53 | 
            +
                    # ... unless it's last word
         | 
| 54 | 
            +
                    # ... unless word is preceded by word ending with colon
         | 
| 55 | 
            +
                    operand_arr[idx] = :do_not_upcase  if idx != 0 && idx != word_arr.size - 1 && is_small_word?(word) && word_arr[idx - 1][-1] != ':'
         | 
| 56 | 
            +
                    # Don't simply capitalize first letter if word starts with (, _, ', or "
         | 
| 57 | 
            +
                    operand_arr[idx] = :upcase_later   if word[0].match(/\(|_|'|"/)
         | 
| 58 | 
            +
                    # Capitalize first letter and letters preceded by -
         | 
| 59 | 
            +
                    operand_arr[idx] = :upcase_dashed  if word.count('-') > 0
         | 
| 60 | 
            +
                    # Capitalize letters preceded by / inside word
         | 
| 61 | 
            +
                    operand_arr[idx] = :upcase_slashed if word[1..].count('/') > 0
         | 
| 62 | 
            +
                    # Don't capitalize word if it starts with /
         | 
| 63 | 
            +
                    operand_arr[idx] = :do_not_upcase  if word[0] == '/'
         | 
| 64 | 
            +
                    # Don't capitalize URLs
         | 
| 65 | 
            +
                    operand_arr[idx] = :do_not_upcase  if word.match(/https?:\/\//i)
         | 
| 66 | 
            +
                    # Don't capitalize words containing capitals besides first letter
         | 
| 67 | 
            +
                    # Don't capitalize words containing dots inside word
         | 
| 68 | 
            +
                    operand_arr[idx] = :do_not_upcase  if word[1..].match(/[A-Z]/) || word[1..-3].match(/\.|&/)
         | 
| 69 | 
            +
                  end
         | 
| 70 | 
            +
             | 
| 71 | 
            +
                  word_arr.each_with_index do |word, idx|
         | 
| 72 | 
            +
                    word_arr[idx] = upcase_first_real_letter(word) if operand_arr[idx] == :upcase_later
         | 
| 73 | 
            +
                    word_arr[idx] = upcase_word_with_dashes(word)  if operand_arr[idx] == :upcase_dashed
         | 
| 74 | 
            +
                    word_arr[idx] = upcase_word_with_slashes(word) if operand_arr[idx] == :upcase_slashed
         | 
| 75 | 
            +
                    word_arr[idx] = word.capitalize                if operand_arr[idx] == :nop
         | 
| 76 | 
            +
                  end
         | 
| 77 | 
            +
             | 
| 78 | 
            +
                  return word_arr.join(' ')
         | 
| 79 | 
            +
                end
         | 
| 80 | 
            +
             | 
| 81 | 
            +
              end
         | 
| 82 | 
            +
            end
         | 
    
        data/lib/msgtrail/version.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: msgtrail
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.9. | 
| 4 | 
            +
              version: 0.9.4
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Erik van Eykelen
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: exe
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2019-05- | 
| 11 | 
            +
            date: 2019-05-25 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: bundler
         | 
| @@ -148,6 +148,7 @@ files: | |
| 148 148 | 
             
            - lib/msgtrail/renderers.rb
         | 
| 149 149 | 
             
            - lib/msgtrail/site.rb
         | 
| 150 150 | 
             
            - lib/msgtrail/slug.rb
         | 
| 151 | 
            +
            - lib/msgtrail/titlecase.rb
         | 
| 151 152 | 
             
            - lib/msgtrail/twitter.rb
         | 
| 152 153 | 
             
            - lib/msgtrail/version.rb
         | 
| 153 154 | 
             
            - msgtrail.gemspec
         |