titlecase 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README +37 -0
- data/lib/titlecase.rb +36 -0
- data/spec/examples.yaml +45 -0
- data/spec/titlecase_spec.rb +20 -0
- data/titlecase.gemspec +12 -0
- metadata +59 -0
data/README
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
Ruby String Extensions To Add Title Case Support
|
2
|
+
================================================
|
3
|
+
|
4
|
+
A set of methods added onto the String class to allow easy title casing of strings.
|
5
|
+
|
6
|
+
This extension is available as a gem via GitHub:
|
7
|
+
|
8
|
+
$ sudo gem install samsouder-titlecase --source=http://gems.github.com
|
9
|
+
|
10
|
+
Usage:
|
11
|
+
|
12
|
+
require 'rubygems'
|
13
|
+
require 'titlecase'
|
14
|
+
|
15
|
+
puts "this is a test".titlecase
|
16
|
+
|
17
|
+
Derived from the rules set by John Gruber at <http://daringfireball.net/2008/05/title_case>. I also derived my test cases from his set. If you find any edge cases, please feel free to add them to the examples.yaml file.
|
18
|
+
|
19
|
+
Rules from John Gruber:
|
20
|
+
-----------------------
|
21
|
+
- capitalize each word
|
22
|
+
- downcase each of the small_words
|
23
|
+
- words with capitals after the first character are left alone
|
24
|
+
- words with periods are left alone
|
25
|
+
- first and last word always capitalized
|
26
|
+
- small words after colons are capitalized
|
27
|
+
|
28
|
+
Sam Souder <samsouder@gmail.com>
|
29
|
+
Created May 22, 2008
|
30
|
+
|
31
|
+
Perl version created by:
|
32
|
+
|
33
|
+
John Gruber
|
34
|
+
http://daringfireball.net/
|
35
|
+
May 10 2008
|
36
|
+
|
37
|
+
License: http://www.opensource.org/licenses/mit-license.php
|
data/lib/titlecase.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
class String
|
2
|
+
def titlecase
|
3
|
+
small_words = %w(a an and as at but by en for if in of on or the to v v. via vs vs.)
|
4
|
+
|
5
|
+
x = split(" ").map do |word|
|
6
|
+
# note: word could contain non-word characters!
|
7
|
+
# downcase all small_words, capitalize the rest
|
8
|
+
small_words.include?(word.gsub(/\W/, "").downcase) ? word.downcase! : word.smart_capitalize!
|
9
|
+
word
|
10
|
+
end
|
11
|
+
# capitalize first and last words
|
12
|
+
x.first.to_s.smart_capitalize!
|
13
|
+
x.last.to_s.smart_capitalize!
|
14
|
+
# small words after colons are capitalized
|
15
|
+
x.join(" ").gsub(/:\s?(\W*#{small_words.join("|")}\W*)\s/) { ": #{$1.smart_capitalize} " }
|
16
|
+
end
|
17
|
+
|
18
|
+
def titlecase!
|
19
|
+
replace(titlecase)
|
20
|
+
end
|
21
|
+
|
22
|
+
def smart_capitalize
|
23
|
+
# ignore any leading crazy characters and capitalize the first real character
|
24
|
+
if self =~ /^['"\(\[']*([a-z])/
|
25
|
+
i = index($1)
|
26
|
+
x = self[i,self.length]
|
27
|
+
# word with capitals and periods mid-word are left alone
|
28
|
+
self[i,1] = self[i,1].upcase unless x =~ /[A-Z]/ or x =~ /\.\w+/
|
29
|
+
end
|
30
|
+
self
|
31
|
+
end
|
32
|
+
|
33
|
+
def smart_capitalize!
|
34
|
+
replace(smart_capitalize)
|
35
|
+
end
|
36
|
+
end
|
data/spec/examples.yaml
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
should_pass:
|
2
|
+
- example: | Q&A with Steve Jobs: 'That's what happens in technology'
|
3
|
+
expect: | Q&A With Steve Jobs: 'That's What Happens in Technology'
|
4
|
+
- example: | what is AT&T's problem?
|
5
|
+
expect: | What Is AT&T's Problem?
|
6
|
+
- example: | Apple deal with AT&T falls through
|
7
|
+
expect: | Apple Deal With AT&T Falls Through
|
8
|
+
- example: | this v that
|
9
|
+
expect: | This v That
|
10
|
+
- example: | this vs that
|
11
|
+
expect: | This vs That
|
12
|
+
- example: | this v. that
|
13
|
+
expect: | This v. That
|
14
|
+
- example: | this vs. that
|
15
|
+
expect: | This vs. That
|
16
|
+
- example: | The SEC's Apple probe: what you need to know
|
17
|
+
expect: | The SEC's Apple Probe: What You Need to Know
|
18
|
+
- example: | 'by the way, small word at the start but within quotes.'
|
19
|
+
expect: | 'By the Way, Small Word at the Start but Within Quotes.'
|
20
|
+
- example: | small word at end is nothing to be afraid of
|
21
|
+
expect: | Small Word at End Is Nothing to Be Afraid Of
|
22
|
+
- example: | Starting Sub-Phrase with a small word: a trick, perhaps?
|
23
|
+
expect: | Starting Sub-Phrase With a Small Word: A Trick, Perhaps?
|
24
|
+
- example: | Sub-Phrase With a Small Word in Quotes: 'a trick, perhaps?'
|
25
|
+
expect: | Sub-Phrase With a Small Word in Quotes: 'A Trick, Perhaps?'
|
26
|
+
- example: | Sub-Phrase With a Small Word in Quotes: "a trick, perhaps?"
|
27
|
+
expect: | Sub-Phrase With a Small Word in Quotes: "A Trick, Perhaps?"
|
28
|
+
- example: | "nothing to be afraid of?"
|
29
|
+
expect: | "Nothing to Be Afraid Of?"
|
30
|
+
- example: | a thing
|
31
|
+
expect: | A Thing
|
32
|
+
- example: | 2lmc Spool: 'Gruber on OmniFocus and Vapo(u)rware'
|
33
|
+
expect: | 2lmc Spool: 'Gruber on OmniFocus and Vapo(u)rware'
|
34
|
+
- example: | a complex thing
|
35
|
+
expect: | A Complex Thing
|
36
|
+
- example: | de.licio.us: the new hotness?
|
37
|
+
expect: | de.licio.us: The New Hotness?
|
38
|
+
- example: | introducing: de.licio.us bookmarks
|
39
|
+
expect: | Introducing: de.licio.us Bookmarks
|
40
|
+
- example: | i end in a period.
|
41
|
+
expect: | I End in a Period.
|
42
|
+
- example: | this is a test.com!?
|
43
|
+
expect: | This Is a test.com!?
|
44
|
+
- example: |
|
45
|
+
expect: |
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), *%w[../lib/titlecase.rb])
|
2
|
+
require "yaml"
|
3
|
+
|
4
|
+
describe String do
|
5
|
+
File.open(File.join(File.dirname(__FILE__), *%w[examples.yaml])) do |file|
|
6
|
+
examples = YAML.load(file)
|
7
|
+
examples["should_pass"].each do |e|
|
8
|
+
it "should be the expected value (#{e["expect"]})" do
|
9
|
+
e["example"].titlecase.should == e["expect"]
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
# Ensure the self-modifying version works correctly
|
15
|
+
it "should self-modify the original value in place" do
|
16
|
+
string = 'a complex thing'
|
17
|
+
string.titlecase!
|
18
|
+
string.should == 'A Complex Thing'
|
19
|
+
end
|
20
|
+
end
|
data/titlecase.gemspec
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = "titlecase"
|
3
|
+
s.version = "0.1.0"
|
4
|
+
s.date = "2008-05-23"
|
5
|
+
s.summary = "String methods to properly title case a headline."
|
6
|
+
s.email = "samsouder@gmail.com"
|
7
|
+
s.homepage = "http://github.com/samsouder/titlecase"
|
8
|
+
s.description = "titlecase is a set of methods on the Ruby String class to add title casing support as seen on Daring Fireball <http://daringfireball.net/2008/05/title_case>."
|
9
|
+
s.authors = ["Samuel Souder"]
|
10
|
+
s.files = ["README", "titlecase.gemspec", "lib/titlecase.rb", "spec/examples.yaml", "spec/titlecase_spec.rb"]
|
11
|
+
s.has_rdoc = false
|
12
|
+
end
|
metadata
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: titlecase
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Samuel Souder
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2008-05-23 00:00:00 -05:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description: titlecase is a set of methods on the Ruby String class to add title casing support as seen on Daring Fireball <http://daringfireball.net/2008/05/title_case>.
|
17
|
+
email: samsouder@gmail.com
|
18
|
+
executables: []
|
19
|
+
|
20
|
+
extensions: []
|
21
|
+
|
22
|
+
extra_rdoc_files: []
|
23
|
+
|
24
|
+
files:
|
25
|
+
- README
|
26
|
+
- titlecase.gemspec
|
27
|
+
- lib/titlecase.rb
|
28
|
+
- spec/examples.yaml
|
29
|
+
- spec/titlecase_spec.rb
|
30
|
+
has_rdoc: true
|
31
|
+
homepage: http://github.com/samsouder/titlecase
|
32
|
+
licenses: []
|
33
|
+
|
34
|
+
post_install_message:
|
35
|
+
rdoc_options: []
|
36
|
+
|
37
|
+
require_paths:
|
38
|
+
- lib
|
39
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: "0"
|
44
|
+
version:
|
45
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - ">="
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: "0"
|
50
|
+
version:
|
51
|
+
requirements: []
|
52
|
+
|
53
|
+
rubyforge_project:
|
54
|
+
rubygems_version: 1.3.5
|
55
|
+
signing_key:
|
56
|
+
specification_version: 3
|
57
|
+
summary: String methods to properly title case a headline.
|
58
|
+
test_files: []
|
59
|
+
|