mnin-stringex 1.1.1
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/MIT-LICENSE +20 -0
- data/README.rdoc +76 -0
- data/Rakefile +257 -0
- data/init.rb +1 -0
- data/lib/lucky_sneaks/acts_as_url.rb +90 -0
- data/lib/lucky_sneaks/string_extensions.rb +198 -0
- data/lib/lucky_sneaks/unidecoder.rb +61 -0
- data/lib/lucky_sneaks/unidecoder_data/x00.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x01.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x02.yml +256 -0
- data/lib/lucky_sneaks/unidecoder_data/x03.yml +256 -0
- data/lib/lucky_sneaks/unidecoder_data/x04.yml +256 -0
- data/lib/lucky_sneaks/unidecoder_data/x05.yml +256 -0
- data/lib/lucky_sneaks/unidecoder_data/x06.yml +256 -0
- data/lib/lucky_sneaks/unidecoder_data/x07.yml +256 -0
- data/lib/lucky_sneaks/unidecoder_data/x09.yml +256 -0
- data/lib/lucky_sneaks/unidecoder_data/x0a.yml +256 -0
- data/lib/lucky_sneaks/unidecoder_data/x0b.yml +256 -0
- data/lib/lucky_sneaks/unidecoder_data/x0c.yml +256 -0
- data/lib/lucky_sneaks/unidecoder_data/x0d.yml +256 -0
- data/lib/lucky_sneaks/unidecoder_data/x0e.yml +256 -0
- data/lib/lucky_sneaks/unidecoder_data/x0f.yml +256 -0
- data/lib/lucky_sneaks/unidecoder_data/x10.yml +256 -0
- data/lib/lucky_sneaks/unidecoder_data/x11.yml +256 -0
- data/lib/lucky_sneaks/unidecoder_data/x12.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x13.yml +256 -0
- data/lib/lucky_sneaks/unidecoder_data/x14.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x15.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x16.yml +256 -0
- data/lib/lucky_sneaks/unidecoder_data/x17.yml +256 -0
- data/lib/lucky_sneaks/unidecoder_data/x18.yml +256 -0
- data/lib/lucky_sneaks/unidecoder_data/x1e.yml +256 -0
- data/lib/lucky_sneaks/unidecoder_data/x1f.yml +256 -0
- data/lib/lucky_sneaks/unidecoder_data/x20.yml +256 -0
- data/lib/lucky_sneaks/unidecoder_data/x21.yml +256 -0
- data/lib/lucky_sneaks/unidecoder_data/x22.yml +256 -0
- data/lib/lucky_sneaks/unidecoder_data/x23.yml +256 -0
- data/lib/lucky_sneaks/unidecoder_data/x24.yml +256 -0
- data/lib/lucky_sneaks/unidecoder_data/x25.yml +256 -0
- data/lib/lucky_sneaks/unidecoder_data/x26.yml +256 -0
- data/lib/lucky_sneaks/unidecoder_data/x27.yml +256 -0
- data/lib/lucky_sneaks/unidecoder_data/x28.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x2e.yml +256 -0
- data/lib/lucky_sneaks/unidecoder_data/x2f.yml +256 -0
- data/lib/lucky_sneaks/unidecoder_data/x30.yml +256 -0
- data/lib/lucky_sneaks/unidecoder_data/x31.yml +256 -0
- data/lib/lucky_sneaks/unidecoder_data/x32.yml +256 -0
- data/lib/lucky_sneaks/unidecoder_data/x33.yml +256 -0
- data/lib/lucky_sneaks/unidecoder_data/x4d.yml +256 -0
- data/lib/lucky_sneaks/unidecoder_data/x4e.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x4f.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x50.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x51.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x52.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x53.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x54.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x55.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x56.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x57.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x58.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x59.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x5a.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x5b.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x5c.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x5d.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x5e.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x5f.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x60.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x61.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x62.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x63.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x64.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x65.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x66.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x67.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x68.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x69.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x6a.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x6b.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x6c.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x6d.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x6e.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x6f.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x70.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x71.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x72.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x73.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x74.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x75.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x76.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x77.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x78.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x79.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x7a.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x7b.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x7c.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x7d.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x7e.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x7f.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x80.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x81.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x82.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x83.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x84.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x85.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x86.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x87.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x88.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x89.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x8a.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x8b.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x8c.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x8d.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x8e.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x8f.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x90.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x91.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x92.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x93.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x94.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x95.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x96.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x97.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x98.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x99.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x9a.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x9b.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x9c.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x9d.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x9e.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/x9f.yml +256 -0
- data/lib/lucky_sneaks/unidecoder_data/xa0.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/xa1.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/xa2.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/xa3.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/xa4.yml +256 -0
- data/lib/lucky_sneaks/unidecoder_data/xac.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/xad.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/xae.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/xaf.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/xb0.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/xb1.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/xb2.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/xb3.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/xb4.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/xb5.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/xb6.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/xb7.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/xb8.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/xb9.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/xba.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/xbb.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/xbc.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/xbd.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/xbe.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/xbf.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/xc0.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/xc1.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/xc2.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/xc3.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/xc4.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/xc5.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/xc6.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/xc7.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/xc8.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/xc9.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/xca.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/xcb.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/xcc.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/xcd.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/xce.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/xcf.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/xd0.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/xd1.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/xd2.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/xd3.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/xd4.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/xd5.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/xd6.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/xd7.yml +256 -0
- data/lib/lucky_sneaks/unidecoder_data/xf9.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/xfa.yml +256 -0
- data/lib/lucky_sneaks/unidecoder_data/xfb.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/xfc.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/xfd.yml +256 -0
- data/lib/lucky_sneaks/unidecoder_data/xfe.yml +257 -0
- data/lib/lucky_sneaks/unidecoder_data/xff.yml +257 -0
- data/lib/stringex.rb +9 -0
- data/stringex.gemspec +231 -0
- data/test/acts_as_url_test.rb +206 -0
- data/test/string_extensions_test.rb +160 -0
- data/test/unidecoder_test.rb +92 -0
- metadata +251 -0
data/lib/stringex.rb
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
require 'lucky_sneaks/string_extensions'
|
2
|
+
require 'lucky_sneaks/unidecoder'
|
3
|
+
|
4
|
+
String.send :include, LuckySneaks::StringExtensions
|
5
|
+
|
6
|
+
if defined?(ActiveRecord)
|
7
|
+
require 'lucky_sneaks/acts_as_url'
|
8
|
+
ActiveRecord::Base.send :include, LuckySneaks::ActsAsUrl
|
9
|
+
end
|
data/stringex.gemspec
ADDED
@@ -0,0 +1,231 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run `rake gemspec`
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{mnin-stringex}
|
8
|
+
s.version = "1.1.1"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Russell Norris", 'Martin Wilhelmi']
|
12
|
+
s.date = %q{2010-01-14}
|
13
|
+
s.description = %q{Some [hopefully] useful extensions to Ruby’s String class. Stringex is made up of three libraries: ActsAsUrl [permalink solution with better character translation], Unidecoder [Unicode to Ascii transliteration], and StringExtensions [miscellaneous helper methods for the String class].}
|
14
|
+
s.email = %q{rsl@luckysneaks.com}
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"MIT-LICENSE",
|
17
|
+
"README.rdoc"
|
18
|
+
]
|
19
|
+
s.files = [
|
20
|
+
"MIT-LICENSE",
|
21
|
+
"README.rdoc",
|
22
|
+
"Rakefile",
|
23
|
+
"init.rb",
|
24
|
+
"lib/lucky_sneaks/acts_as_url.rb",
|
25
|
+
"lib/lucky_sneaks/string_extensions.rb",
|
26
|
+
"lib/lucky_sneaks/unidecoder.rb",
|
27
|
+
"lib/lucky_sneaks/unidecoder_data/x00.yml",
|
28
|
+
"lib/lucky_sneaks/unidecoder_data/x01.yml",
|
29
|
+
"lib/lucky_sneaks/unidecoder_data/x02.yml",
|
30
|
+
"lib/lucky_sneaks/unidecoder_data/x03.yml",
|
31
|
+
"lib/lucky_sneaks/unidecoder_data/x04.yml",
|
32
|
+
"lib/lucky_sneaks/unidecoder_data/x05.yml",
|
33
|
+
"lib/lucky_sneaks/unidecoder_data/x06.yml",
|
34
|
+
"lib/lucky_sneaks/unidecoder_data/x07.yml",
|
35
|
+
"lib/lucky_sneaks/unidecoder_data/x09.yml",
|
36
|
+
"lib/lucky_sneaks/unidecoder_data/x0a.yml",
|
37
|
+
"lib/lucky_sneaks/unidecoder_data/x0b.yml",
|
38
|
+
"lib/lucky_sneaks/unidecoder_data/x0c.yml",
|
39
|
+
"lib/lucky_sneaks/unidecoder_data/x0d.yml",
|
40
|
+
"lib/lucky_sneaks/unidecoder_data/x0e.yml",
|
41
|
+
"lib/lucky_sneaks/unidecoder_data/x0f.yml",
|
42
|
+
"lib/lucky_sneaks/unidecoder_data/x10.yml",
|
43
|
+
"lib/lucky_sneaks/unidecoder_data/x11.yml",
|
44
|
+
"lib/lucky_sneaks/unidecoder_data/x12.yml",
|
45
|
+
"lib/lucky_sneaks/unidecoder_data/x13.yml",
|
46
|
+
"lib/lucky_sneaks/unidecoder_data/x14.yml",
|
47
|
+
"lib/lucky_sneaks/unidecoder_data/x15.yml",
|
48
|
+
"lib/lucky_sneaks/unidecoder_data/x16.yml",
|
49
|
+
"lib/lucky_sneaks/unidecoder_data/x17.yml",
|
50
|
+
"lib/lucky_sneaks/unidecoder_data/x18.yml",
|
51
|
+
"lib/lucky_sneaks/unidecoder_data/x1e.yml",
|
52
|
+
"lib/lucky_sneaks/unidecoder_data/x1f.yml",
|
53
|
+
"lib/lucky_sneaks/unidecoder_data/x20.yml",
|
54
|
+
"lib/lucky_sneaks/unidecoder_data/x21.yml",
|
55
|
+
"lib/lucky_sneaks/unidecoder_data/x22.yml",
|
56
|
+
"lib/lucky_sneaks/unidecoder_data/x23.yml",
|
57
|
+
"lib/lucky_sneaks/unidecoder_data/x24.yml",
|
58
|
+
"lib/lucky_sneaks/unidecoder_data/x25.yml",
|
59
|
+
"lib/lucky_sneaks/unidecoder_data/x26.yml",
|
60
|
+
"lib/lucky_sneaks/unidecoder_data/x27.yml",
|
61
|
+
"lib/lucky_sneaks/unidecoder_data/x28.yml",
|
62
|
+
"lib/lucky_sneaks/unidecoder_data/x2e.yml",
|
63
|
+
"lib/lucky_sneaks/unidecoder_data/x2f.yml",
|
64
|
+
"lib/lucky_sneaks/unidecoder_data/x30.yml",
|
65
|
+
"lib/lucky_sneaks/unidecoder_data/x31.yml",
|
66
|
+
"lib/lucky_sneaks/unidecoder_data/x32.yml",
|
67
|
+
"lib/lucky_sneaks/unidecoder_data/x33.yml",
|
68
|
+
"lib/lucky_sneaks/unidecoder_data/x4d.yml",
|
69
|
+
"lib/lucky_sneaks/unidecoder_data/x4e.yml",
|
70
|
+
"lib/lucky_sneaks/unidecoder_data/x4f.yml",
|
71
|
+
"lib/lucky_sneaks/unidecoder_data/x50.yml",
|
72
|
+
"lib/lucky_sneaks/unidecoder_data/x51.yml",
|
73
|
+
"lib/lucky_sneaks/unidecoder_data/x52.yml",
|
74
|
+
"lib/lucky_sneaks/unidecoder_data/x53.yml",
|
75
|
+
"lib/lucky_sneaks/unidecoder_data/x54.yml",
|
76
|
+
"lib/lucky_sneaks/unidecoder_data/x55.yml",
|
77
|
+
"lib/lucky_sneaks/unidecoder_data/x56.yml",
|
78
|
+
"lib/lucky_sneaks/unidecoder_data/x57.yml",
|
79
|
+
"lib/lucky_sneaks/unidecoder_data/x58.yml",
|
80
|
+
"lib/lucky_sneaks/unidecoder_data/x59.yml",
|
81
|
+
"lib/lucky_sneaks/unidecoder_data/x5a.yml",
|
82
|
+
"lib/lucky_sneaks/unidecoder_data/x5b.yml",
|
83
|
+
"lib/lucky_sneaks/unidecoder_data/x5c.yml",
|
84
|
+
"lib/lucky_sneaks/unidecoder_data/x5d.yml",
|
85
|
+
"lib/lucky_sneaks/unidecoder_data/x5e.yml",
|
86
|
+
"lib/lucky_sneaks/unidecoder_data/x5f.yml",
|
87
|
+
"lib/lucky_sneaks/unidecoder_data/x60.yml",
|
88
|
+
"lib/lucky_sneaks/unidecoder_data/x61.yml",
|
89
|
+
"lib/lucky_sneaks/unidecoder_data/x62.yml",
|
90
|
+
"lib/lucky_sneaks/unidecoder_data/x63.yml",
|
91
|
+
"lib/lucky_sneaks/unidecoder_data/x64.yml",
|
92
|
+
"lib/lucky_sneaks/unidecoder_data/x65.yml",
|
93
|
+
"lib/lucky_sneaks/unidecoder_data/x66.yml",
|
94
|
+
"lib/lucky_sneaks/unidecoder_data/x67.yml",
|
95
|
+
"lib/lucky_sneaks/unidecoder_data/x68.yml",
|
96
|
+
"lib/lucky_sneaks/unidecoder_data/x69.yml",
|
97
|
+
"lib/lucky_sneaks/unidecoder_data/x6a.yml",
|
98
|
+
"lib/lucky_sneaks/unidecoder_data/x6b.yml",
|
99
|
+
"lib/lucky_sneaks/unidecoder_data/x6c.yml",
|
100
|
+
"lib/lucky_sneaks/unidecoder_data/x6d.yml",
|
101
|
+
"lib/lucky_sneaks/unidecoder_data/x6e.yml",
|
102
|
+
"lib/lucky_sneaks/unidecoder_data/x6f.yml",
|
103
|
+
"lib/lucky_sneaks/unidecoder_data/x70.yml",
|
104
|
+
"lib/lucky_sneaks/unidecoder_data/x71.yml",
|
105
|
+
"lib/lucky_sneaks/unidecoder_data/x72.yml",
|
106
|
+
"lib/lucky_sneaks/unidecoder_data/x73.yml",
|
107
|
+
"lib/lucky_sneaks/unidecoder_data/x74.yml",
|
108
|
+
"lib/lucky_sneaks/unidecoder_data/x75.yml",
|
109
|
+
"lib/lucky_sneaks/unidecoder_data/x76.yml",
|
110
|
+
"lib/lucky_sneaks/unidecoder_data/x77.yml",
|
111
|
+
"lib/lucky_sneaks/unidecoder_data/x78.yml",
|
112
|
+
"lib/lucky_sneaks/unidecoder_data/x79.yml",
|
113
|
+
"lib/lucky_sneaks/unidecoder_data/x7a.yml",
|
114
|
+
"lib/lucky_sneaks/unidecoder_data/x7b.yml",
|
115
|
+
"lib/lucky_sneaks/unidecoder_data/x7c.yml",
|
116
|
+
"lib/lucky_sneaks/unidecoder_data/x7d.yml",
|
117
|
+
"lib/lucky_sneaks/unidecoder_data/x7e.yml",
|
118
|
+
"lib/lucky_sneaks/unidecoder_data/x7f.yml",
|
119
|
+
"lib/lucky_sneaks/unidecoder_data/x80.yml",
|
120
|
+
"lib/lucky_sneaks/unidecoder_data/x81.yml",
|
121
|
+
"lib/lucky_sneaks/unidecoder_data/x82.yml",
|
122
|
+
"lib/lucky_sneaks/unidecoder_data/x83.yml",
|
123
|
+
"lib/lucky_sneaks/unidecoder_data/x84.yml",
|
124
|
+
"lib/lucky_sneaks/unidecoder_data/x85.yml",
|
125
|
+
"lib/lucky_sneaks/unidecoder_data/x86.yml",
|
126
|
+
"lib/lucky_sneaks/unidecoder_data/x87.yml",
|
127
|
+
"lib/lucky_sneaks/unidecoder_data/x88.yml",
|
128
|
+
"lib/lucky_sneaks/unidecoder_data/x89.yml",
|
129
|
+
"lib/lucky_sneaks/unidecoder_data/x8a.yml",
|
130
|
+
"lib/lucky_sneaks/unidecoder_data/x8b.yml",
|
131
|
+
"lib/lucky_sneaks/unidecoder_data/x8c.yml",
|
132
|
+
"lib/lucky_sneaks/unidecoder_data/x8d.yml",
|
133
|
+
"lib/lucky_sneaks/unidecoder_data/x8e.yml",
|
134
|
+
"lib/lucky_sneaks/unidecoder_data/x8f.yml",
|
135
|
+
"lib/lucky_sneaks/unidecoder_data/x90.yml",
|
136
|
+
"lib/lucky_sneaks/unidecoder_data/x91.yml",
|
137
|
+
"lib/lucky_sneaks/unidecoder_data/x92.yml",
|
138
|
+
"lib/lucky_sneaks/unidecoder_data/x93.yml",
|
139
|
+
"lib/lucky_sneaks/unidecoder_data/x94.yml",
|
140
|
+
"lib/lucky_sneaks/unidecoder_data/x95.yml",
|
141
|
+
"lib/lucky_sneaks/unidecoder_data/x96.yml",
|
142
|
+
"lib/lucky_sneaks/unidecoder_data/x97.yml",
|
143
|
+
"lib/lucky_sneaks/unidecoder_data/x98.yml",
|
144
|
+
"lib/lucky_sneaks/unidecoder_data/x99.yml",
|
145
|
+
"lib/lucky_sneaks/unidecoder_data/x9a.yml",
|
146
|
+
"lib/lucky_sneaks/unidecoder_data/x9b.yml",
|
147
|
+
"lib/lucky_sneaks/unidecoder_data/x9c.yml",
|
148
|
+
"lib/lucky_sneaks/unidecoder_data/x9d.yml",
|
149
|
+
"lib/lucky_sneaks/unidecoder_data/x9e.yml",
|
150
|
+
"lib/lucky_sneaks/unidecoder_data/x9f.yml",
|
151
|
+
"lib/lucky_sneaks/unidecoder_data/xa0.yml",
|
152
|
+
"lib/lucky_sneaks/unidecoder_data/xa1.yml",
|
153
|
+
"lib/lucky_sneaks/unidecoder_data/xa2.yml",
|
154
|
+
"lib/lucky_sneaks/unidecoder_data/xa3.yml",
|
155
|
+
"lib/lucky_sneaks/unidecoder_data/xa4.yml",
|
156
|
+
"lib/lucky_sneaks/unidecoder_data/xac.yml",
|
157
|
+
"lib/lucky_sneaks/unidecoder_data/xad.yml",
|
158
|
+
"lib/lucky_sneaks/unidecoder_data/xae.yml",
|
159
|
+
"lib/lucky_sneaks/unidecoder_data/xaf.yml",
|
160
|
+
"lib/lucky_sneaks/unidecoder_data/xb0.yml",
|
161
|
+
"lib/lucky_sneaks/unidecoder_data/xb1.yml",
|
162
|
+
"lib/lucky_sneaks/unidecoder_data/xb2.yml",
|
163
|
+
"lib/lucky_sneaks/unidecoder_data/xb3.yml",
|
164
|
+
"lib/lucky_sneaks/unidecoder_data/xb4.yml",
|
165
|
+
"lib/lucky_sneaks/unidecoder_data/xb5.yml",
|
166
|
+
"lib/lucky_sneaks/unidecoder_data/xb6.yml",
|
167
|
+
"lib/lucky_sneaks/unidecoder_data/xb7.yml",
|
168
|
+
"lib/lucky_sneaks/unidecoder_data/xb8.yml",
|
169
|
+
"lib/lucky_sneaks/unidecoder_data/xb9.yml",
|
170
|
+
"lib/lucky_sneaks/unidecoder_data/xba.yml",
|
171
|
+
"lib/lucky_sneaks/unidecoder_data/xbb.yml",
|
172
|
+
"lib/lucky_sneaks/unidecoder_data/xbc.yml",
|
173
|
+
"lib/lucky_sneaks/unidecoder_data/xbd.yml",
|
174
|
+
"lib/lucky_sneaks/unidecoder_data/xbe.yml",
|
175
|
+
"lib/lucky_sneaks/unidecoder_data/xbf.yml",
|
176
|
+
"lib/lucky_sneaks/unidecoder_data/xc0.yml",
|
177
|
+
"lib/lucky_sneaks/unidecoder_data/xc1.yml",
|
178
|
+
"lib/lucky_sneaks/unidecoder_data/xc2.yml",
|
179
|
+
"lib/lucky_sneaks/unidecoder_data/xc3.yml",
|
180
|
+
"lib/lucky_sneaks/unidecoder_data/xc4.yml",
|
181
|
+
"lib/lucky_sneaks/unidecoder_data/xc5.yml",
|
182
|
+
"lib/lucky_sneaks/unidecoder_data/xc6.yml",
|
183
|
+
"lib/lucky_sneaks/unidecoder_data/xc7.yml",
|
184
|
+
"lib/lucky_sneaks/unidecoder_data/xc8.yml",
|
185
|
+
"lib/lucky_sneaks/unidecoder_data/xc9.yml",
|
186
|
+
"lib/lucky_sneaks/unidecoder_data/xca.yml",
|
187
|
+
"lib/lucky_sneaks/unidecoder_data/xcb.yml",
|
188
|
+
"lib/lucky_sneaks/unidecoder_data/xcc.yml",
|
189
|
+
"lib/lucky_sneaks/unidecoder_data/xcd.yml",
|
190
|
+
"lib/lucky_sneaks/unidecoder_data/xce.yml",
|
191
|
+
"lib/lucky_sneaks/unidecoder_data/xcf.yml",
|
192
|
+
"lib/lucky_sneaks/unidecoder_data/xd0.yml",
|
193
|
+
"lib/lucky_sneaks/unidecoder_data/xd1.yml",
|
194
|
+
"lib/lucky_sneaks/unidecoder_data/xd2.yml",
|
195
|
+
"lib/lucky_sneaks/unidecoder_data/xd3.yml",
|
196
|
+
"lib/lucky_sneaks/unidecoder_data/xd4.yml",
|
197
|
+
"lib/lucky_sneaks/unidecoder_data/xd5.yml",
|
198
|
+
"lib/lucky_sneaks/unidecoder_data/xd6.yml",
|
199
|
+
"lib/lucky_sneaks/unidecoder_data/xd7.yml",
|
200
|
+
"lib/lucky_sneaks/unidecoder_data/xf9.yml",
|
201
|
+
"lib/lucky_sneaks/unidecoder_data/xfa.yml",
|
202
|
+
"lib/lucky_sneaks/unidecoder_data/xfb.yml",
|
203
|
+
"lib/lucky_sneaks/unidecoder_data/xfc.yml",
|
204
|
+
"lib/lucky_sneaks/unidecoder_data/xfd.yml",
|
205
|
+
"lib/lucky_sneaks/unidecoder_data/xfe.yml",
|
206
|
+
"lib/lucky_sneaks/unidecoder_data/xff.yml",
|
207
|
+
"lib/stringex.rb",
|
208
|
+
"stringex.gemspec"
|
209
|
+
]
|
210
|
+
s.homepage = %q{http://github.com/mnin/stringex}
|
211
|
+
s.rdoc_options = ["--main", "README.rdoc", "--charset", "utf-8", "--line-numbers"]
|
212
|
+
s.require_paths = ["lib"]
|
213
|
+
s.rubyforge_project = %q{stringex}
|
214
|
+
s.rubygems_version = %q{1.3.5}
|
215
|
+
s.summary = %q{Some [hopefully] useful extensions to Ruby’s String class}
|
216
|
+
s.test_files = [
|
217
|
+
"test/acts_as_url_test.rb",
|
218
|
+
"test/string_extensions_test.rb",
|
219
|
+
"test/unidecoder_test.rb"
|
220
|
+
]
|
221
|
+
|
222
|
+
if s.respond_to? :specification_version then
|
223
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
224
|
+
s.specification_version = 3
|
225
|
+
|
226
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
227
|
+
else
|
228
|
+
end
|
229
|
+
else
|
230
|
+
end
|
231
|
+
end
|
@@ -0,0 +1,206 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
|
3
|
+
begin
|
4
|
+
require File.dirname(__FILE__) + '/../../../config/environment'
|
5
|
+
rescue LoadError
|
6
|
+
require 'rubygems'
|
7
|
+
gem 'activerecord'
|
8
|
+
require 'active_record'
|
9
|
+
|
10
|
+
RAILS_ROOT = File.dirname(__FILE__)
|
11
|
+
$: << File.join(File.dirname(__FILE__), '../lib')
|
12
|
+
end
|
13
|
+
|
14
|
+
require File.join(File.dirname(__FILE__), '../init')
|
15
|
+
|
16
|
+
ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => "acts_as_url.sqlite3")
|
17
|
+
|
18
|
+
ActiveRecord::Migration.verbose = false
|
19
|
+
ActiveRecord::Schema.define(:version => 1) do
|
20
|
+
create_table :documents, :force => true do |t|
|
21
|
+
t.string :title, :url, :other
|
22
|
+
end
|
23
|
+
|
24
|
+
create_table :updateuments, :force => true do |t|
|
25
|
+
t.string :title, :url, :other
|
26
|
+
end
|
27
|
+
|
28
|
+
create_table :mocuments, :force => true do |t|
|
29
|
+
t.string :title, :url, :other
|
30
|
+
end
|
31
|
+
|
32
|
+
create_table :permuments, :force => true do |t|
|
33
|
+
t.string :title, :permalink, :other
|
34
|
+
end
|
35
|
+
|
36
|
+
create_table :procuments, :force => true do |t|
|
37
|
+
t.string :title, :url, :other
|
38
|
+
end
|
39
|
+
|
40
|
+
create_table :blankuments, :force => true do |t|
|
41
|
+
t.string :title, :url, :other
|
42
|
+
end
|
43
|
+
|
44
|
+
create_table :duplicateuments, :force => true do |t|
|
45
|
+
t.string :title, :url, :other
|
46
|
+
end
|
47
|
+
end
|
48
|
+
ActiveRecord::Migration.verbose = true
|
49
|
+
|
50
|
+
class Document < ActiveRecord::Base
|
51
|
+
acts_as_url :title
|
52
|
+
end
|
53
|
+
|
54
|
+
class Updateument < ActiveRecord::Base
|
55
|
+
acts_as_url :title, :sync_url => true
|
56
|
+
end
|
57
|
+
|
58
|
+
class Mocument < ActiveRecord::Base
|
59
|
+
acts_as_url :title, :scope => :other, :sync_url => true
|
60
|
+
end
|
61
|
+
|
62
|
+
class Permument < ActiveRecord::Base
|
63
|
+
acts_as_url :title, :url_attribute => :permalink
|
64
|
+
end
|
65
|
+
|
66
|
+
class Procument < ActiveRecord::Base
|
67
|
+
acts_as_url :non_attribute_method
|
68
|
+
|
69
|
+
def non_attribute_method
|
70
|
+
"#{title} got massaged"
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
class Blankument < ActiveRecord::Base
|
75
|
+
acts_as_url :title, :only_when_blank => true
|
76
|
+
end
|
77
|
+
|
78
|
+
class Duplicateument < ActiveRecord::Base
|
79
|
+
acts_as_url :title, :duplicate_count_separator => "---"
|
80
|
+
end
|
81
|
+
|
82
|
+
class ActsAsUrlTest < Test::Unit::TestCase
|
83
|
+
def test_should_create_url
|
84
|
+
@doc = Document.create(:title => "Let's Make a Test Title, <em>Okay</em>?")
|
85
|
+
assert_equal "lets-make-a-test-title-okay", @doc.url
|
86
|
+
end
|
87
|
+
|
88
|
+
def test_should_create_unique_url
|
89
|
+
@doc = Document.create!(:title => "Unique")
|
90
|
+
@other_doc = Document.create!(:title => "Unique")
|
91
|
+
assert_equal "unique-1", @other_doc.url
|
92
|
+
end
|
93
|
+
|
94
|
+
def test_should_not_succ_on_repeated_saves
|
95
|
+
@doc = Document.new(:title => "Continuous or Constant")
|
96
|
+
5.times do
|
97
|
+
@doc.save!
|
98
|
+
assert_equal "continuous-or-constant", @doc.url
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def test_should_create_unique_url_and_not_clobber_if_another_exists
|
103
|
+
@doc = Updateument.create!(:title => "Unique")
|
104
|
+
@other_doc = Updateument.create!(:title => "Unique")
|
105
|
+
@doc.update_attributes :other => "foo"
|
106
|
+
|
107
|
+
@doc2 = Document.create!(:title => "twonique")
|
108
|
+
@other_doc2 = Document.create!(:title => "twonique")
|
109
|
+
@doc2.update_attributes(:other => "foo")
|
110
|
+
|
111
|
+
assert_equal "unique", @doc.url
|
112
|
+
assert_equal "foo", @doc.other
|
113
|
+
assert_equal "unique-1", @other_doc.url
|
114
|
+
|
115
|
+
assert_equal "twonique", @doc2.url
|
116
|
+
assert_equal "foo", @doc2.other
|
117
|
+
assert_equal "twonique-1", @other_doc2.url
|
118
|
+
end
|
119
|
+
|
120
|
+
def test_should_create_unique_url_when_partial_url_already_exists
|
121
|
+
@doc = Document.create!(:title => "House Farms")
|
122
|
+
@other_doc = Document.create!(:title => "House Farm")
|
123
|
+
|
124
|
+
assert_equal "house-farms", @doc.url
|
125
|
+
assert_equal "house-farm", @other_doc.url
|
126
|
+
end
|
127
|
+
|
128
|
+
def test_should_scope_uniqueness
|
129
|
+
@moc = Mocument.create!(:title => "Mocumentary", :other => "I dunno why but I don't care if I'm unique")
|
130
|
+
@other_moc = Mocument.create!(:title => "Mocumentary")
|
131
|
+
assert_equal @moc.url, @other_moc.url
|
132
|
+
end
|
133
|
+
|
134
|
+
def test_should_still_create_unique_if_in_same_scope
|
135
|
+
@moc = Mocument.create!(:title => "Mocumentary", :other => "Suddenly, I care if I'm unique")
|
136
|
+
@other_moc = Mocument.create!(:title => "Mocumentary", :other => "Suddenly, I care if I'm unique")
|
137
|
+
assert_not_equal @moc.url, @other_moc.url
|
138
|
+
end
|
139
|
+
|
140
|
+
def test_should_use_alternate_field_name
|
141
|
+
@perm = Permument.create!(:title => "Anything at This Point")
|
142
|
+
assert_equal "anything-at-this-point", @perm.permalink
|
143
|
+
end
|
144
|
+
|
145
|
+
def test_should_not_update_url_by_default
|
146
|
+
@doc = Document.create!(:title => "Stable as Stone")
|
147
|
+
@original_url = @doc.url
|
148
|
+
@doc.update_attributes :title => "New Unstable Madness"
|
149
|
+
assert_equal @original_url, @doc.url
|
150
|
+
end
|
151
|
+
|
152
|
+
def test_should_update_url_if_asked
|
153
|
+
@moc = Mocument.create!(:title => "Original")
|
154
|
+
@original_url = @moc.url
|
155
|
+
@moc.update_attributes :title => "New and Improved"
|
156
|
+
assert_not_equal @original_url, @moc.url
|
157
|
+
end
|
158
|
+
|
159
|
+
def test_should_update_url_only_when_blank_if_asked
|
160
|
+
@original_url = 'the-url-of-concrete'
|
161
|
+
@blank = Blankument.create!(:title => "Stable as Stone", :url => @original_url)
|
162
|
+
assert_equal @original_url, @blank.url
|
163
|
+
@blank = Blankument.create!(:title => "Stable as Stone")
|
164
|
+
assert_equal 'stable-as-stone', @blank.url
|
165
|
+
end
|
166
|
+
|
167
|
+
def test_should_mass_initialize_urls
|
168
|
+
@doc_1 = Document.create!(:title => "Initial")
|
169
|
+
@doc_2 = Document.create!(:title => "Subsequent")
|
170
|
+
@doc_1.update_attribute :url, nil
|
171
|
+
@doc_2.update_attribute :url, nil
|
172
|
+
assert_nil @doc_1.url
|
173
|
+
assert_nil @doc_2.url
|
174
|
+
Document.initialize_urls
|
175
|
+
@doc_1.reload
|
176
|
+
@doc_2.reload
|
177
|
+
assert_equal "initial", @doc_1.url
|
178
|
+
assert_equal "subsequent", @doc_2.url
|
179
|
+
end
|
180
|
+
|
181
|
+
def test_should_mass_initialize_urls_with_custom_url_attribute
|
182
|
+
@doc_1 = Permument.create!(:title => "Initial")
|
183
|
+
@doc_2 = Permument.create!(:title => "Subsequent")
|
184
|
+
@doc_1.update_attribute :permalink, nil
|
185
|
+
@doc_2.update_attribute :permalink, nil
|
186
|
+
assert_nil @doc_1.permalink
|
187
|
+
assert_nil @doc_2.permalink
|
188
|
+
Permument.initialize_urls
|
189
|
+
@doc_1.reload
|
190
|
+
@doc_2.reload
|
191
|
+
assert_equal "initial", @doc_1.permalink
|
192
|
+
assert_equal "subsequent", @doc_2.permalink
|
193
|
+
end
|
194
|
+
|
195
|
+
def test_should_utilize_block_if_given
|
196
|
+
@doc = Procument.create!(:title => "Title String")
|
197
|
+
assert_equal "title-string-got-massaged", @doc.url
|
198
|
+
end
|
199
|
+
|
200
|
+
def test_should_create_unique_with_custom_duplicate_count_separator
|
201
|
+
@doc = Duplicateument.create!(:title => "Unique")
|
202
|
+
@other_doc = Duplicateument.create!(:title => "Unique")
|
203
|
+
assert_equal "unique", @doc.url
|
204
|
+
assert_equal "unique---1", @other_doc.url
|
205
|
+
end
|
206
|
+
end
|
@@ -0,0 +1,160 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require "test/unit"
|
4
|
+
|
5
|
+
$: << File.join(File.dirname(__FILE__), '../lib')
|
6
|
+
require File.join(File.dirname(__FILE__), "../init")
|
7
|
+
|
8
|
+
class StringExtensionsTest < Test::Unit::TestCase
|
9
|
+
def test_to_html
|
10
|
+
require "rubygems"
|
11
|
+
require "RedCloth"
|
12
|
+
{
|
13
|
+
"h1. A Solution" => "<h1>A Solution</h1>",
|
14
|
+
"I hated wrapping textilize around a string.\n\nIt always felt dirty." =>
|
15
|
+
"<p>I hated wrapping textilize around a string.</p>\n<p>It always felt dirty.</p>",
|
16
|
+
"I think _this_ is awesome" => "<p>I think <em>this</em> is awesome</p>",
|
17
|
+
"Um... _*really*_, man" => "<p>Um… <em><strong>really</strong></em>, man</p>"
|
18
|
+
}.each do |plain, html|
|
19
|
+
assert_equal html, plain.to_html
|
20
|
+
end
|
21
|
+
rescue LoadError
|
22
|
+
puts "\n>> Could not load RedCloth. String#to_html was not tested.\n>> Please gem install RedCloth if you'd like to use this functionality."
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_to_html_lite
|
26
|
+
require "rubygems"
|
27
|
+
require "RedCloth"
|
28
|
+
{
|
29
|
+
"I have no pee on me" => "I have no pee on me",
|
30
|
+
"But I _do_ get Textile!" => "But I <em>do</em> get Textile!"
|
31
|
+
}.each do |plain, html|
|
32
|
+
assert_equal html, plain.to_html(:lite)
|
33
|
+
end
|
34
|
+
rescue LoadError
|
35
|
+
puts "\n>> Could not load RedCloth. String#to_html (with :lite argument) was not tested.\n>> Please gem install RedCloth if you'd like to use this functionality."
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_to_url
|
39
|
+
{
|
40
|
+
"<p>This has 100% too much <em>formatting</em></p>" =>
|
41
|
+
"this-has-100-percent-too-much-formatting",
|
42
|
+
"Tea & crumpets & <strong>crêpes</strong> for me!" =>
|
43
|
+
"tea-and-crumpets-and-crepes-for-me",
|
44
|
+
"The Suspense... Is... Killing Me" =>
|
45
|
+
"the-suspense-dot-dot-dot-is-dot-dot-dot-killing-me",
|
46
|
+
"How to use attr_accessible and attr_protected" =>
|
47
|
+
"how-to-use-attr-accessible-and-attr-protected",
|
48
|
+
"I'm just making sure there's nothing wrong with things!" =>
|
49
|
+
"im-just-making-sure-theres-nothing-wrong-with-things",
|
50
|
+
"Umlaute hätten wir außerdem gern deutsch übersetzt." =>
|
51
|
+
"umlaute-haetten-wir-ausserdem-gern-deutsch-uebersetzt"
|
52
|
+
}.each do |html, plain|
|
53
|
+
assert_equal plain, html.to_url
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_remove_formatting
|
58
|
+
{
|
59
|
+
"<p>This has 100% too much <em>formatting</em></p>" =>
|
60
|
+
"This has 100 percent too much formatting",
|
61
|
+
"Tea & crumpets & <strong>crêpes</strong> for me!" =>
|
62
|
+
"Tea and crumpets and crepes for me"
|
63
|
+
}.each do |html, plain|
|
64
|
+
assert_equal plain, html.remove_formatting
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def test_strip_html_tags
|
69
|
+
{
|
70
|
+
"<h1><em>This</em> is good but <strong>that</strong> is better</h1>" =>
|
71
|
+
"This is good but that is better",
|
72
|
+
"<p>This is invalid XHTML but valid HTML, right?" =>
|
73
|
+
"This is invalid XHTML but valid HTML, right?",
|
74
|
+
"<p class='foo'>Everything goes!</p>" => "Everything goes!",
|
75
|
+
"<ol>This is completely invalid and just plain wrong</p>" =>
|
76
|
+
"This is completely invalid and just plain wrong"
|
77
|
+
}.each do |html, plain|
|
78
|
+
assert_equal plain, html.strip_html_tags
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def test_convert_accented_entities
|
83
|
+
{
|
84
|
+
"å" => "a",
|
85
|
+
"è" => "e",
|
86
|
+
"î" => "i",
|
87
|
+
"Ø" => "O",
|
88
|
+
"ü" => "u",
|
89
|
+
"Ñ" => "N",
|
90
|
+
"ç" => "c"
|
91
|
+
}.each do |entitied, plain|
|
92
|
+
assert_equal plain, entitied.convert_accented_entities
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def test_convert_german_umlauts
|
97
|
+
{
|
98
|
+
"Ä" => "ae",
|
99
|
+
"Ö" => "oe",
|
100
|
+
"Ü" => "ue",
|
101
|
+
"ä" => "ae",
|
102
|
+
"ö" => "oe",
|
103
|
+
"ü" => "ue",
|
104
|
+
"ß" => "ss"
|
105
|
+
}.each do |entitied, plain|
|
106
|
+
assert_equal plain, entitied.convert_german_umlauts
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
def test_convert_misc_entities
|
111
|
+
{
|
112
|
+
"America™" => "America(tm)",
|
113
|
+
"Tea & Sympathy" => "Tea and Sympathy",
|
114
|
+
"To be continued…" => "To be continued...",
|
115
|
+
"Foo Bar" => "Foo Bar",
|
116
|
+
"100£" => "100 pound",
|
117
|
+
"½ a dollar" => "half a dollar",
|
118
|
+
"35°" => "35 degrees"
|
119
|
+
}.each do |entitied, plain|
|
120
|
+
assert_equal plain, entitied.convert_misc_entities
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
def test_convert_misc_characters
|
125
|
+
{
|
126
|
+
"Foo & bar make foobar" => "Foo and bar make foobar",
|
127
|
+
"Breakdown #9" => "Breakdown number 9",
|
128
|
+
"foo@bar.com" => "foo at bar dot com",
|
129
|
+
"100% of yr love" => "100 percent of yr love",
|
130
|
+
"Kisses are $3.25 each" => "Kisses are 3 dollars 25 cents each",
|
131
|
+
"That CD is £3.25 plus tax" => "That CD is 3 pounds 25 pence plus tax",
|
132
|
+
"This CD is ¥1000 instead" => "This CD is 1000 yen instead"
|
133
|
+
}.each do |misc, plain|
|
134
|
+
assert_equal plain, misc.convert_misc_characters
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
def test_replace_whitespace
|
139
|
+
{
|
140
|
+
"this has too much space" => "this has too much space",
|
141
|
+
"\t\tThis is merely formatted with superfluous whitespace\n" =>
|
142
|
+
" This is merely formatted with superfluous whitespace "
|
143
|
+
}.each do |whitespaced, plain|
|
144
|
+
assert_equal plain, whitespaced.replace_whitespace
|
145
|
+
end
|
146
|
+
|
147
|
+
assert_equal "now-with-more-hyphens", "now with more hyphens".replace_whitespace("-")
|
148
|
+
end
|
149
|
+
|
150
|
+
def test_collapse
|
151
|
+
{
|
152
|
+
"too much space" => "too much space",
|
153
|
+
" at the beginning" => "at the beginning"
|
154
|
+
}.each do |uncollapsed, plain|
|
155
|
+
assert_equal plain, uncollapsed.collapse
|
156
|
+
end
|
157
|
+
|
158
|
+
assert_equal "now-with-hyphens", "----now---------with-hyphens--------".collapse("-")
|
159
|
+
end
|
160
|
+
end
|