class String

Public Instance Methods

grubercase() click to toggle source
# File lib/gruber-case.rb, line 5
def grubercase
  small_words = %w( a an and as at but by en for if in of on or the to v[.]? via vs[.]? )
  small_re = small_words.join('|')

  line = ""
  self.split(/( [:.;?!][ ] | (?:[ ]|^)["“] )/x).each do |s|
  
    s.gsub!(/ \b( [[:alpha:]] [[:lower:].'’]* )\b /x) do |w|
      # Skip words with inline dots, e.g. "del.icio.us" or "example.com"
      (w =~ / [[:alpha:]] [.] [[:alpha:]] /x) ? w : w.capitalize
    end #gsub!
  
    # Lowercase our list of small words:
    s.gsub!(/\b(#{small_re})\b/io) { |w| w.downcase }
  
    # If the first word in the title is a small word, then capitalize it:
    s.gsub!(/\A([[:punct:]]*)(#{small_re})\b/io) { |w| $1 + $2.capitalize }
  
    # If the last word in the title is a small word, then capitalize it:
    s.gsub!(/\b(#{small_re})([[:punct:]]*)\Z/io) { |w| $1.capitalize + $2 }
  
    # Append current substring to output
    line += s
  
  end #each

  # Special Cases:
  line.gsub!(/ V(s?)\. /, ' v\1. ')               # "v." and "vs."
  line.gsub!(/(['’])S\b/, '\1s')                  # 'S (otherwise you get "the SEC'S decision")
  line.gsub!(/\b(AT&T|Q&A)\b/i) { |w| w.upcase }  # "AT&T" and "Q&A", which get tripped up by
                                                  # self-contained small words "at" and "a"

  line
  end
namecase() click to toggle source
# File lib/gruber-case.rb, line 40
def namecase
  small_words = ["'s", "'t", "aan", "aan 't", "aan de", "aan den", "aan der", "aan het", "al", "auf", "aus", "bij", "bij 't", "bij de", "bij den", "bij het", "boven d'", "d'", "da[s]?", "dalla", "de", "de die", "de die le", "de l'", "de la", "de las", "de le", "de van der", "del", "della", "den", "der", "des", "di", "do[s]?", "el", "het", "in", "in 't", "in de", "in den", "in der", "in het", "onder", "onder 't", "onder de", "onder den", "onder het", "op", "op 't", "op de", "op den", "op der", "op gen", "op het", "op ten", "over", "over 't", "over de", "over den", "over het", "saint", "st", "ste", "te", "ten", "ter", "tot", "uijt", "uijt 't", "uijt de", "uijt den", "uijt het", "uijt te de", "uijt ten", "uit", "uit 't", "uit de", "uit den", "uit het", "uit te de", "uit ten", "van 't", "van de", "van de l'", "van den", "van der", "van gen", "van het", "van la", "van ter", "van van de", "vander", "ver", "voor", "voor de", "voor den", "voor in 't"]
  small_re = small_words.join('|')
  s = self.split(" ").map do |word| 
    result = word.split("-").map(&:capitalize).join("-")
    result.upcase! if result =~ /([a-z]\.){1,3}/i
    result
  end.join(" ")
  s.gsub!(/['’]\w/io) { |w| w.upcase }
  s.gsub!(/(\s(#{small_re})\s)/io) { |w| w.downcase }
  s
end