stringex 2.5.2 → 2.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +2 -1
- data/README.rdoc +12 -3
- data/VERSION +1 -1
- data/lib/stringex.rb +1 -2
- data/lib/stringex/acts_as_url/adapter/base.rb +10 -2
- data/lib/stringex/core_ext.rb +10 -0
- data/lib/stringex/localization/backend/i18n.rb +6 -1
- data/lib/stringex/localization/conversion_expressions.rb +3 -0
- data/lib/stringex/localization/converter.rb +7 -3
- data/lib/stringex/string_extensions.rb +14 -7
- data/lib/stringex/unidecoder.rb +9 -6
- data/lib/stringex/unidecoder_data/x03.yml +2 -2
- data/locales/fr.yml +72 -0
- data/locales/nb.yml +76 -0
- data/locales/no.yml +76 -0
- data/stringex.gemspec +14 -6
- data/test/unit/acts_as_url_integration_test.rb +13 -0
- data/test/unit/localization/fr_test.rb +118 -0
- data/test/unit/localization_test.rb +5 -2
- data/test/unit/string_extensions_test.rb +13 -1
- data/test/unit/unicode_point_suite/basic_greek_test.rb +1 -1
- data/test/unit/unidecoder_test.rb +2 -1
- metadata +23 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c133692ec8d93e4edd5ebf1893f754ef004c0251
|
4
|
+
data.tar.gz: 0d77e8620e72837829c13a31235bcce1fd807aa6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 33867f2f5c28f26ddc8f07f00d35eb8137dcdc6369ba75d0f69a90909fdd7cb57daa6a22f5cbd684e3a9dd3477f0b28bc7637bd0818c14fbff6cac740c1ace2d
|
7
|
+
data.tar.gz: 4223f8aed6061234a7c2d9b0dcc6dd2408ddda98897ef2dc88efd7d19037d24c52b4c6824a804cf22c0101246025640bc6053e9bfb84339a6070880f567a7582
|
data/Gemfile
CHANGED
@@ -27,7 +27,8 @@ group :development do
|
|
27
27
|
gem 'travis-lint', '1.7.0'
|
28
28
|
# Can I state that I really dislike camelcased gem names?
|
29
29
|
gem 'RedCloth', '4.2.9'
|
30
|
-
gem 'sqlite3', '1.3.
|
30
|
+
gem 'sqlite3', '1.3.10'
|
31
|
+
gem 'test-unit', '3.0.9'
|
31
32
|
|
32
33
|
if activerecord?
|
33
34
|
gem 'activerecord', '4.0.3'
|
data/README.rdoc
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
= Stringex {<img src="https://codeclimate.com/github/rsl/stringex.png" />}[https://codeclimate.com/github/rsl/stringex] {<img src="https://travis-ci.org/rsl/stringex.png?branch=master" alt="Build Status" />}[https://travis-ci.org/rsl/stringex]
|
1
|
+
= Stringex {<img src="https://codeclimate.com/github/rsl/stringex.png" />}[https://codeclimate.com/github/rsl/stringex] {<img src="https://travis-ci.org/rsl/stringex.png?branch=master" alt="Build Status" />}[https://travis-ci.org/rsl/stringex] {<img src="https://badge.fury.io/rb/stringex.svg" alt="Gem Version" />}[http://badge.fury.io/rb/stringex]
|
2
2
|
|
3
3
|
Some [hopefully] useful extensions to Ruby's String class. It is made up of three libraries: ActsAsUrl, Unidecoder, and StringExtensions.
|
4
4
|
|
@@ -34,7 +34,7 @@ which will populate the <tt>url</tt> attribute on the object with the converted
|
|
34
34
|
<tt>:blacklist</tt>:: List of urls that should not be allowed. Default is <tt>%w{new}</tt> [which avoids confusion
|
35
35
|
on urls like <tt>/documents/new</tt>].
|
36
36
|
<tt>:blacklist_policy</tt>:: Proc or lambda defining new naming behavior when blacklisted urls are encountered.
|
37
|
-
Default converts <tt>/documents/new</tt> to
|
37
|
+
Default converts <tt>/documents/new</tt> to <tt>/documents/new-document</tt>.
|
38
38
|
|
39
39
|
|
40
40
|
In order to use the generated url attribute, you will probably want to override <tt>to_param</tt> like so, in your Model:
|
@@ -85,7 +85,16 @@ Note: No offense is intended to the author[s] of whatever plugins might produce
|
|
85
85
|
|
86
86
|
This library converts Unicode [and accented ASCII] characters to their plain-text ASCII equivalents. This is a port of Perl's Unidecode and provides eminently superior and more reliable results than Iconv. (Seriously, Iconv... A plague on both your houses! [sic])
|
87
87
|
|
88
|
-
You
|
88
|
+
You may require only the unidecoder (and its dependent localization) via
|
89
|
+
|
90
|
+
require "stringex/unidecoder"
|
91
|
+
|
92
|
+
You probably won't ever need to run Unidecoder by itself. Thus, you probably would want to add String#to_ascii which wraps all of Unidecoder's functionality, by requiring:
|
93
|
+
|
94
|
+
require "stringex/core_ext"
|
95
|
+
|
96
|
+
For anyone interested, details of the implementation can be read about in the original implementation of Text::Unidecode[http://interglacial.com/~sburke/tpj/as_html/tpj22.html]. Extensive examples can be found in the tests.
|
97
|
+
|
89
98
|
|
90
99
|
== StringExtensions
|
91
100
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.
|
1
|
+
2.6.0
|
data/lib/stringex.rb
CHANGED
@@ -8,8 +8,7 @@ require 'stringex/unidecoder'
|
|
8
8
|
require 'stringex/acts_as_url'
|
9
9
|
require 'stringex/version'
|
10
10
|
|
11
|
-
|
12
|
-
String.send :extend, Stringex::StringExtensions::PublicClassMethods
|
11
|
+
require 'stringex/core_ext'
|
13
12
|
|
14
13
|
Stringex::ActsAsUrl::Adapter.load_available
|
15
14
|
|
@@ -119,14 +119,22 @@ module Stringex
|
|
119
119
|
end
|
120
120
|
|
121
121
|
def handle_duplicate_url!
|
122
|
-
return if
|
122
|
+
return if !url_taken?(base_url)
|
123
123
|
n = 1
|
124
|
-
while
|
124
|
+
while url_taken?(duplicate_for_base_url(n))
|
125
125
|
n = n.succ
|
126
126
|
end
|
127
127
|
write_url_attribute duplicate_for_base_url(n)
|
128
128
|
end
|
129
129
|
|
130
|
+
def url_taken?(url)
|
131
|
+
if settings.url_taken_method
|
132
|
+
instance.send(settings.url_taken_method, url)
|
133
|
+
else
|
134
|
+
url_owners.any?{|owner| url_attribute_for(owner) == url}
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
130
138
|
def handle_url!
|
131
139
|
self.base_url = instance.send(settings.url_attribute)
|
132
140
|
modify_base_url if is_blank?(base_url) || !settings.only_when_blank
|
@@ -0,0 +1,10 @@
|
|
1
|
+
Stringex = Module.new unless defined?(Stringex)
|
2
|
+
ensure_module_defined = ->(base, module_name){
|
3
|
+
base.const_set(module_name, Module.new) unless base.const_defined?(module_name)
|
4
|
+
}
|
5
|
+
ensure_module_defined[Stringex, :StringExtensions]
|
6
|
+
ensure_module_defined[Stringex::StringExtensions, :PublicInstanceMethods]
|
7
|
+
ensure_module_defined[Stringex::StringExtensions, :PublicClassMethods]
|
8
|
+
|
9
|
+
String.send :include, Stringex::StringExtensions::PublicInstanceMethods
|
10
|
+
String.send :extend, Stringex::StringExtensions::PublicClassMethods
|
@@ -5,6 +5,11 @@ module Stringex
|
|
5
5
|
LOAD_PATH_BASE = File.join(File.expand_path(File.dirname(__FILE__)), '..', '..', '..', '..', 'locales')
|
6
6
|
|
7
7
|
class << self
|
8
|
+
def reset!
|
9
|
+
super
|
10
|
+
::I18n.reload! if defined?(::I18n) && ::I18n.respond_to?(:reload!)
|
11
|
+
end
|
12
|
+
|
8
13
|
def locale
|
9
14
|
@locale || ::I18n.locale
|
10
15
|
end
|
@@ -59,7 +64,7 @@ module Stringex
|
|
59
64
|
def ensure_locales_enforced_or_not
|
60
65
|
return unless ::I18n.respond_to?(:enforce_available_locales)
|
61
66
|
# Allow users to have set this to false manually but default to true
|
62
|
-
return
|
67
|
+
return unless ::I18n.enforce_available_locales == nil
|
63
68
|
::I18n.enforce_available_locales = ::I18n.available_locales != []
|
64
69
|
end
|
65
70
|
end
|
@@ -103,6 +103,8 @@ module Stringex
|
|
103
103
|
/…/ => "...",
|
104
104
|
}
|
105
105
|
|
106
|
+
UNREADABLE_CONTROL_CHARACTERS = /[[:cntrl:]]/
|
107
|
+
|
106
108
|
# Ordered by denominator then numerator of the value
|
107
109
|
VULGAR_FRACTIONS = {
|
108
110
|
:half => /(½|½|½)/,
|
@@ -138,6 +140,7 @@ module Stringex
|
|
138
140
|
html_entities
|
139
141
|
html_tag
|
140
142
|
smart_punctuation
|
143
|
+
unreadable_control_characters
|
141
144
|
vulgar_fractions
|
142
145
|
whitespace
|
143
146
|
}.each do |conversion_type|
|
@@ -59,7 +59,11 @@ module Stringex
|
|
59
59
|
end
|
60
60
|
end
|
61
61
|
|
62
|
-
|
62
|
+
protected
|
63
|
+
|
64
|
+
def unreadable_control_characters
|
65
|
+
string.gsub! expressions.unreadable_control_characters, ''
|
66
|
+
end
|
63
67
|
|
64
68
|
def abbreviations
|
65
69
|
string.gsub! expressions.abbreviation do |x|
|
@@ -107,7 +111,7 @@ module Stringex
|
|
107
111
|
end
|
108
112
|
end
|
109
113
|
|
110
|
-
|
114
|
+
private
|
111
115
|
|
112
116
|
def expressions
|
113
117
|
ConversionExpressions
|
@@ -122,4 +126,4 @@ module Stringex
|
|
122
126
|
end
|
123
127
|
end
|
124
128
|
end
|
125
|
-
end
|
129
|
+
end
|
@@ -93,18 +93,24 @@ module Stringex
|
|
93
93
|
end
|
94
94
|
end
|
95
95
|
|
96
|
+
def convert_unreadable_control_characters
|
97
|
+
stringex_convert do
|
98
|
+
translate! :unreadable_control_characters
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
96
102
|
# Returns the string limited in size to the value of limit.
|
97
|
-
def limit(limit = nil, truncate_words = true)
|
103
|
+
def limit(limit = nil, truncate_words = true, whitespace_replacement_token = "-")
|
98
104
|
if limit.nil?
|
99
105
|
self
|
100
106
|
else
|
101
|
-
truncate_words == false ? self.whole_word_limit(limit) : self[0...limit]
|
107
|
+
truncate_words == false ? self.whole_word_limit(limit, whitespace_replacement_token) : self[0...limit]
|
102
108
|
end
|
103
109
|
end
|
104
110
|
|
105
|
-
def whole_word_limit(limit)
|
111
|
+
def whole_word_limit(limit, whitespace_replacement_token = "-")
|
106
112
|
whole_words = []
|
107
|
-
words = self.split(
|
113
|
+
words = self.split(whitespace_replacement_token)
|
108
114
|
|
109
115
|
words.each do |word|
|
110
116
|
if word.size > limit
|
@@ -115,7 +121,7 @@ module Stringex
|
|
115
121
|
end
|
116
122
|
end
|
117
123
|
|
118
|
-
whole_words.join(
|
124
|
+
whole_words.join(whitespace_replacement_token)
|
119
125
|
end
|
120
126
|
|
121
127
|
|
@@ -126,6 +132,7 @@ module Stringex
|
|
126
132
|
convert_smart_punctuation.
|
127
133
|
convert_accented_html_entities.
|
128
134
|
convert_vulgar_fractions.
|
135
|
+
convert_unreadable_control_characters.
|
129
136
|
convert_miscellaneous_html_entities.
|
130
137
|
convert_miscellaneous_characters(options).
|
131
138
|
to_ascii.
|
@@ -187,8 +194,8 @@ module Stringex
|
|
187
194
|
whitespace_replacement_token = options[:replace_whitespace_with]
|
188
195
|
dummy = remove_formatting(options).
|
189
196
|
replace_whitespace(whitespace_replacement_token).
|
190
|
-
collapse(
|
191
|
-
limit(options[:limit], options[:truncate_words])
|
197
|
+
collapse(whitespace_replacement_token).
|
198
|
+
limit(options[:limit], options[:truncate_words], whitespace_replacement_token)
|
192
199
|
dummy.downcase! unless options[:force_downcase] == false
|
193
200
|
dummy
|
194
201
|
end
|
data/lib/stringex/unidecoder.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
|
3
3
|
require 'yaml'
|
4
|
+
require 'stringex/localization'
|
4
5
|
|
5
6
|
module Stringex
|
6
7
|
module Unidecoder
|
@@ -68,12 +69,14 @@ module Stringex
|
|
68
69
|
end
|
69
70
|
|
70
71
|
module Stringex
|
71
|
-
module StringExtensions
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
72
|
+
module StringExtensions
|
73
|
+
module PublicInstanceMethods
|
74
|
+
# Returns string with its UTF-8 characters transliterated to ASCII ones. Example:
|
75
|
+
#
|
76
|
+
# "⠋⠗⠁⠝⠉⠑".to_ascii #=> "france"
|
77
|
+
def to_ascii
|
78
|
+
Stringex::Unidecoder.decode(self)
|
79
|
+
end
|
77
80
|
end
|
78
81
|
end
|
79
82
|
end
|
data/locales/fr.yml
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
# NOTE: Some translation keys make use of matches from regular expressions
|
2
|
+
# to manipulate whitespace and order. Please consult the source code for
|
3
|
+
# Stringex::Localization::ConversionExpressions to see what those
|
4
|
+
# regular expressions look like if you need to manipulate the order
|
5
|
+
# differently than the usage below.
|
6
|
+
fr:
|
7
|
+
stringex:
|
8
|
+
characters:
|
9
|
+
and: et
|
10
|
+
at: arobase
|
11
|
+
divide: divisé par
|
12
|
+
degrees: degrés
|
13
|
+
dot: \1 point \2
|
14
|
+
ellipsis: point point point
|
15
|
+
equals: égal
|
16
|
+
number: numéro
|
17
|
+
percent: pourcent
|
18
|
+
plus: plus
|
19
|
+
slash: slash
|
20
|
+
star: étoile
|
21
|
+
currencies:
|
22
|
+
generic: \1 livres
|
23
|
+
dollars: \1 dollars
|
24
|
+
dollars_cents: \1 dollars \2 cents
|
25
|
+
pounds: \1 livres
|
26
|
+
pounds_pence: \1 livres \2 pennies
|
27
|
+
euros: \1 euros
|
28
|
+
euros_cents: \1 euros \2 cents
|
29
|
+
yen: \1 yen
|
30
|
+
reais: \1 reais
|
31
|
+
reais_cents: \1 reais \2 cents
|
32
|
+
html_entities:
|
33
|
+
amp: et
|
34
|
+
cent: " cents"
|
35
|
+
copy: (c)
|
36
|
+
deg: " degrés "
|
37
|
+
divide: " divisé par "
|
38
|
+
double_quote: '"'
|
39
|
+
ellipsis: "..."
|
40
|
+
en_dash: "-"
|
41
|
+
em_dash: "--"
|
42
|
+
frac14: un quart
|
43
|
+
frac12: un demi
|
44
|
+
frac34: trois quarts
|
45
|
+
gt: ">"
|
46
|
+
lt: <
|
47
|
+
nbsp: " "
|
48
|
+
pound: " livres "
|
49
|
+
reg: (r)
|
50
|
+
single_quote: "'"
|
51
|
+
times: x
|
52
|
+
trade: (tm)
|
53
|
+
yen: " yen "
|
54
|
+
vulgar_fractions:
|
55
|
+
half: un demi
|
56
|
+
one_third: un tiers
|
57
|
+
two_thirds: deux tiers
|
58
|
+
one_fourth: un quart
|
59
|
+
three_fourths: trois quarts
|
60
|
+
one_fifth: un cinquième
|
61
|
+
two_fifths: deux cinquièmes
|
62
|
+
three_fifths: trois cinquièmes
|
63
|
+
four_fifths: quatre cinquièmes
|
64
|
+
one_sixth: un sixième
|
65
|
+
five_sixths: cinq sixièmes
|
66
|
+
one_eighth: un huitième
|
67
|
+
three_eighths: trois huitièmes
|
68
|
+
five_eighths: cinq huitièmes
|
69
|
+
seven_eighths: sept huitièmes
|
70
|
+
transliterations:
|
71
|
+
é: e
|
72
|
+
è: e
|
data/locales/nb.yml
ADDED
@@ -0,0 +1,76 @@
|
|
1
|
+
# NOTE: Some translation keys make use of matches from regular expressions
|
2
|
+
# to manipulate whitespace and order. Please consult the source code for
|
3
|
+
# Stringex::Localization::ConversionExpressions to see what those
|
4
|
+
# regular expressions look like if you need to manipulate the order
|
5
|
+
# differently than the usage below.
|
6
|
+
nb:
|
7
|
+
stringex:
|
8
|
+
characters:
|
9
|
+
and: og
|
10
|
+
at: krøllalfa
|
11
|
+
divide: delt på
|
12
|
+
degrees: grader
|
13
|
+
dot: \1 dot \2
|
14
|
+
ellipsis: prikk prikk prikk
|
15
|
+
equals: er lik
|
16
|
+
number: nummer
|
17
|
+
percent: prosent
|
18
|
+
plus: pluss
|
19
|
+
slash: skråstrek
|
20
|
+
star: stjerne
|
21
|
+
currencies:
|
22
|
+
generic: \1 kroner
|
23
|
+
dollars: \1 dollar
|
24
|
+
dollars_cents: \1 dollar \2 cent
|
25
|
+
pounds: \1 pund
|
26
|
+
pounds_pence: \1 pund \2 pence
|
27
|
+
euros: \1 euro
|
28
|
+
euros_cents: \1 euro \2 cent
|
29
|
+
yen: \1 yen
|
30
|
+
reais: \1 reais
|
31
|
+
reais_cents: \1 reais \2 cent
|
32
|
+
html_entities:
|
33
|
+
amp: og
|
34
|
+
cent: " cents"
|
35
|
+
copy: (c)
|
36
|
+
deg: " grader "
|
37
|
+
divide: " delt på "
|
38
|
+
double_quote: '"'
|
39
|
+
ellipsis: "..."
|
40
|
+
en_dash: "-"
|
41
|
+
em_dash: "--"
|
42
|
+
frac14: en fjerdedel
|
43
|
+
frac12: halv
|
44
|
+
frac34: tre fjerdedeler
|
45
|
+
gt: ">"
|
46
|
+
lt: <
|
47
|
+
nbsp: " "
|
48
|
+
pound: " pund "
|
49
|
+
reg: (r)
|
50
|
+
single_quote: "'"
|
51
|
+
times: x
|
52
|
+
trade: (tm)
|
53
|
+
yen: " yen "
|
54
|
+
vulgar_fractions:
|
55
|
+
half: halv
|
56
|
+
one_third: en tredjedel
|
57
|
+
two_thirds: to tredjedeler
|
58
|
+
one_fourth: en fjerdedel
|
59
|
+
three_fourths: tre fjerdedeler
|
60
|
+
one_fifth: en femtedel
|
61
|
+
two_fifths: to femtedeler
|
62
|
+
three_fifths: tre femtedeler
|
63
|
+
four_fifths: fire femtedeler
|
64
|
+
one_sixth: en sjettedel
|
65
|
+
five_sixths: fem sjettedeler
|
66
|
+
one_eighth: en åttendel
|
67
|
+
three_eighths: tre åttendeler
|
68
|
+
five_eighths: fem åttendeler
|
69
|
+
seven_eighths: sju åttendeler
|
70
|
+
transliterations:
|
71
|
+
Å: AA
|
72
|
+
Æ: AE
|
73
|
+
Ø: OE
|
74
|
+
å: aa
|
75
|
+
æ: ae
|
76
|
+
ø: oe
|
data/locales/no.yml
ADDED
@@ -0,0 +1,76 @@
|
|
1
|
+
# NOTE: Some translation keys make use of matches from regular expressions
|
2
|
+
# to manipulate whitespace and order. Please consult the source code for
|
3
|
+
# Stringex::Localization::ConversionExpressions to see what those
|
4
|
+
# regular expressions look like if you need to manipulate the order
|
5
|
+
# differently than the usage below.
|
6
|
+
'no':
|
7
|
+
stringex:
|
8
|
+
characters:
|
9
|
+
and: og
|
10
|
+
at: krøllalfa
|
11
|
+
divide: delt på
|
12
|
+
degrees: grader
|
13
|
+
dot: \1 dot \2
|
14
|
+
ellipsis: prikk prikk prikk
|
15
|
+
equals: er lik
|
16
|
+
number: nummer
|
17
|
+
percent: prosent
|
18
|
+
plus: pluss
|
19
|
+
slash: skråstrek
|
20
|
+
star: stjerne
|
21
|
+
currencies:
|
22
|
+
generic: \1 kroner
|
23
|
+
dollars: \1 dollar
|
24
|
+
dollars_cents: \1 dollar \2 cent
|
25
|
+
pounds: \1 pund
|
26
|
+
pounds_pence: \1 pund \2 pence
|
27
|
+
euros: \1 euro
|
28
|
+
euros_cents: \1 euro \2 cent
|
29
|
+
yen: \1 yen
|
30
|
+
reais: \1 reais
|
31
|
+
reais_cents: \1 reais \2 cent
|
32
|
+
html_entities:
|
33
|
+
amp: og
|
34
|
+
cent: " cents"
|
35
|
+
copy: (c)
|
36
|
+
deg: " grader "
|
37
|
+
divide: " delt på "
|
38
|
+
double_quote: '"'
|
39
|
+
ellipsis: "..."
|
40
|
+
en_dash: "-"
|
41
|
+
em_dash: "--"
|
42
|
+
frac14: en fjerdedel
|
43
|
+
frac12: halv
|
44
|
+
frac34: tre fjerdedeler
|
45
|
+
gt: ">"
|
46
|
+
lt: <
|
47
|
+
nbsp: " "
|
48
|
+
pound: " pund "
|
49
|
+
reg: (r)
|
50
|
+
single_quote: "'"
|
51
|
+
times: x
|
52
|
+
trade: (tm)
|
53
|
+
yen: " yen "
|
54
|
+
vulgar_fractions:
|
55
|
+
half: halv
|
56
|
+
one_third: en tredjedel
|
57
|
+
two_thirds: to tredjedeler
|
58
|
+
one_fourth: en fjerdedel
|
59
|
+
three_fourths: tre fjerdedeler
|
60
|
+
one_fifth: en femtedel
|
61
|
+
two_fifths: to femtedeler
|
62
|
+
three_fifths: tre femtedeler
|
63
|
+
four_fifths: fire femtedeler
|
64
|
+
one_sixth: en sjettedel
|
65
|
+
five_sixths: fem sjettedeler
|
66
|
+
one_eighth: en åttendel
|
67
|
+
three_eighths: tre åttendeler
|
68
|
+
five_eighths: fem åttendeler
|
69
|
+
seven_eighths: sju åttendeler
|
70
|
+
transliterations:
|
71
|
+
Å: AA
|
72
|
+
Æ: AE
|
73
|
+
Ø: OE
|
74
|
+
å: aa
|
75
|
+
æ: ae
|
76
|
+
ø: oe
|
data/stringex.gemspec
CHANGED
@@ -2,16 +2,16 @@
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
3
|
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
|
-
# stub: stringex 2.
|
5
|
+
# stub: stringex 2.6.0 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = "stringex"
|
9
|
-
s.version = "2.
|
9
|
+
s.version = "2.6.0"
|
10
10
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
12
12
|
s.require_paths = ["lib"]
|
13
13
|
s.authors = ["Russell Norris"]
|
14
|
-
s.date = "
|
14
|
+
s.date = "2016-01-29"
|
15
15
|
s.description = "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]."
|
16
16
|
s.email = "rsl@luckysneaks.com"
|
17
17
|
s.extra_rdoc_files = [
|
@@ -38,6 +38,7 @@ Gem::Specification.new do |s|
|
|
38
38
|
"lib/stringex/configuration/configurator.rb",
|
39
39
|
"lib/stringex/configuration/string_extensions.rb",
|
40
40
|
"lib/stringex/configuration_lite.rb",
|
41
|
+
"lib/stringex/core_ext.rb",
|
41
42
|
"lib/stringex/localization.rb",
|
42
43
|
"lib/stringex/localization/backend/base.rb",
|
43
44
|
"lib/stringex/localization/backend/i18n.rb",
|
@@ -233,7 +234,10 @@ Gem::Specification.new do |s|
|
|
233
234
|
"locales/da.yml",
|
234
235
|
"locales/de.yml",
|
235
236
|
"locales/en.yml",
|
237
|
+
"locales/fr.yml",
|
238
|
+
"locales/nb.yml",
|
236
239
|
"locales/nl.yml",
|
240
|
+
"locales/no.yml",
|
237
241
|
"locales/pl.yml",
|
238
242
|
"locales/pt-BR.yml",
|
239
243
|
"locales/ru.yml",
|
@@ -250,6 +254,7 @@ Gem::Specification.new do |s|
|
|
250
254
|
"test/unit/localization/de_test.rb",
|
251
255
|
"test/unit/localization/default_test.rb",
|
252
256
|
"test/unit/localization/en_test.rb",
|
257
|
+
"test/unit/localization/fr_test.rb",
|
253
258
|
"test/unit/localization/nl_test.rb",
|
254
259
|
"test/unit/localization/pl_test.rb",
|
255
260
|
"test/unit/localization/pt_br_test.rb",
|
@@ -280,14 +285,16 @@ Gem::Specification.new do |s|
|
|
280
285
|
s.add_development_dependency(%q<jeweler>, ["= 2.0.1"])
|
281
286
|
s.add_development_dependency(%q<travis-lint>, ["= 1.7.0"])
|
282
287
|
s.add_development_dependency(%q<RedCloth>, ["= 4.2.9"])
|
283
|
-
s.add_development_dependency(%q<sqlite3>, ["= 1.3.
|
288
|
+
s.add_development_dependency(%q<sqlite3>, ["= 1.3.10"])
|
289
|
+
s.add_development_dependency(%q<test-unit>, ["= 3.0.9"])
|
284
290
|
s.add_development_dependency(%q<activerecord>, ["= 4.0.3"])
|
285
291
|
s.add_development_dependency(%q<i18n>, ["= 0.6.9"])
|
286
292
|
else
|
287
293
|
s.add_dependency(%q<jeweler>, ["= 2.0.1"])
|
288
294
|
s.add_dependency(%q<travis-lint>, ["= 1.7.0"])
|
289
295
|
s.add_dependency(%q<RedCloth>, ["= 4.2.9"])
|
290
|
-
s.add_dependency(%q<sqlite3>, ["= 1.3.
|
296
|
+
s.add_dependency(%q<sqlite3>, ["= 1.3.10"])
|
297
|
+
s.add_dependency(%q<test-unit>, ["= 3.0.9"])
|
291
298
|
s.add_dependency(%q<activerecord>, ["= 4.0.3"])
|
292
299
|
s.add_dependency(%q<i18n>, ["= 0.6.9"])
|
293
300
|
end
|
@@ -295,7 +302,8 @@ Gem::Specification.new do |s|
|
|
295
302
|
s.add_dependency(%q<jeweler>, ["= 2.0.1"])
|
296
303
|
s.add_dependency(%q<travis-lint>, ["= 1.7.0"])
|
297
304
|
s.add_dependency(%q<RedCloth>, ["= 4.2.9"])
|
298
|
-
s.add_dependency(%q<sqlite3>, ["= 1.3.
|
305
|
+
s.add_dependency(%q<sqlite3>, ["= 1.3.10"])
|
306
|
+
s.add_dependency(%q<test-unit>, ["= 3.0.9"])
|
299
307
|
s.add_dependency(%q<activerecord>, ["= 4.0.3"])
|
300
308
|
s.add_dependency(%q<i18n>, ["= 0.6.9"])
|
301
309
|
end
|
@@ -376,4 +376,17 @@ class ActsAsUrlIntegrationTest < Test::Unit::TestCase
|
|
376
376
|
@doc = Document.create(:title => "title with many whole words")
|
377
377
|
assert_equal 'title-with-many', @doc.url
|
378
378
|
end
|
379
|
+
|
380
|
+
def test_should_allow_overriding_url_taken_method
|
381
|
+
Document.class_eval do
|
382
|
+
acts_as_url :title, :url_taken_method => :url_taken?
|
383
|
+
|
384
|
+
def url_taken?(url)
|
385
|
+
["unique", "unique-1", "unique-2"].include?(url)
|
386
|
+
end
|
387
|
+
end
|
388
|
+
|
389
|
+
@doc = Document.create(:title => "unique")
|
390
|
+
assert_equal "unique-3", @doc.url
|
391
|
+
end
|
379
392
|
end
|
@@ -0,0 +1,118 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
require 'i18n'
|
5
|
+
require 'stringex'
|
6
|
+
|
7
|
+
class FrenchYAMLLocalizationTest < Test::Unit::TestCase
|
8
|
+
def setup
|
9
|
+
Stringex::Localization.reset!
|
10
|
+
Stringex::Localization.backend = :i18n
|
11
|
+
Stringex::Localization.backend.load_translations :fr
|
12
|
+
Stringex::Localization.locale = :fr
|
13
|
+
end
|
14
|
+
|
15
|
+
{
|
16
|
+
"foo & bar" => "foo et bar",
|
17
|
+
"AT&T" => "AT et T",
|
18
|
+
"99° est normal" => "99 degrés est normal",
|
19
|
+
"4 ÷ 2 is 2" => "4 divisé par 2 is 2",
|
20
|
+
"webcrawler.com" => "webcrawler point com",
|
21
|
+
"Well..." => "Well point point point",
|
22
|
+
"x=1" => "x égal 1",
|
23
|
+
"a #2 pencil" => "a numéro 2 pencil",
|
24
|
+
"100%" => "100 pourcent",
|
25
|
+
"cost+tax" => "cost plus tax",
|
26
|
+
"batman/robin fan fiction" => "batman slash robin fan fiction",
|
27
|
+
"dial *69" => "dial étoile 69",
|
28
|
+
" i leave whitespace on ends unchanged " => " i leave whitespace on ends unchanged "
|
29
|
+
}.each do |original, converted|
|
30
|
+
define_method "test_character_conversion: '#{original}'" do
|
31
|
+
assert_equal converted, original.convert_miscellaneous_characters
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
{
|
36
|
+
"¤20" => "20 livres",
|
37
|
+
"$100" => "100 dollars",
|
38
|
+
"$19.99" => "19 dollars 99 cents",
|
39
|
+
"£100" => "100 livres",
|
40
|
+
"£19.99" => "19 livres 99 pennies",
|
41
|
+
"€100" => "100 euros",
|
42
|
+
"€19.99" => "19 euros 99 cents",
|
43
|
+
"¥1000" => "1000 yen"
|
44
|
+
}.each do |original, converted|
|
45
|
+
define_method "test_currency_conversion: '#{original}'" do
|
46
|
+
assert_equal converted, original.convert_miscellaneous_characters
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
{
|
51
|
+
"Tea & Sympathy" => "Tea et Sympathy",
|
52
|
+
"10¢" => "10 cents",
|
53
|
+
"©2000" => "(c)2000",
|
54
|
+
"98° is fine" => "98 degrés is fine",
|
55
|
+
"10÷5" => "10 divisé par 5",
|
56
|
+
""quoted"" => '"quoted"',
|
57
|
+
"to be continued…" => "to be continued...",
|
58
|
+
"2000–2004" => "2000-2004",
|
59
|
+
"I wish—oh, never mind" => "I wish--oh, never mind",
|
60
|
+
"½ ounce of gold" => "un demi ounce of gold",
|
61
|
+
"1 et ¼ d'once de platinium" => "1 et un quart d'once de platinium",
|
62
|
+
"9 et ¾ d'once de platinium" => "9 et trois quarts d'once de platinium",
|
63
|
+
"3>2" => "3>2",
|
64
|
+
"2<3" => "2<3",
|
65
|
+
"two words" => "two words",
|
66
|
+
"£100" => "livres 100",
|
67
|
+
"Walmart®" => "Walmart(r)",
|
68
|
+
"'single quoted'" => "'single quoted'",
|
69
|
+
"2×4" => "2x4",
|
70
|
+
"Programming™" => "Programming(tm)",
|
71
|
+
"¥20000" => "yen 20000",
|
72
|
+
" i leave whitespace on ends unchanged " => " i leave whitespace on ends unchanged "
|
73
|
+
}.each do |original, converted|
|
74
|
+
define_method "test_html_entity_conversion: '#{original}'" do
|
75
|
+
assert_equal converted, original.convert_miscellaneous_html_entities
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
{
|
80
|
+
"½" => "un demi",
|
81
|
+
"½" => "un demi",
|
82
|
+
"½" => "un demi",
|
83
|
+
"⅓" => "un tiers",
|
84
|
+
"⅓" => "un tiers",
|
85
|
+
"⅔" => "deux tiers",
|
86
|
+
"⅔" => "deux tiers",
|
87
|
+
"¼" => "un quart",
|
88
|
+
"¼" => "un quart",
|
89
|
+
"¼" => "un quart",
|
90
|
+
"¾" => "trois quarts",
|
91
|
+
"¾" => "trois quarts",
|
92
|
+
"¾" => "trois quarts",
|
93
|
+
"⅕" => "un cinquième",
|
94
|
+
"⅕" => "un cinquième",
|
95
|
+
"⅖" => "deux cinquièmes",
|
96
|
+
"⅖" => "deux cinquièmes",
|
97
|
+
"⅗" => "trois cinquièmes",
|
98
|
+
"⅗" => "trois cinquièmes",
|
99
|
+
"⅘" => "quatre cinquièmes",
|
100
|
+
"⅘" => "quatre cinquièmes",
|
101
|
+
"⅙" => "un sixième",
|
102
|
+
"⅙" => "un sixième",
|
103
|
+
"⅚" => "cinq sixièmes",
|
104
|
+
"⅚" => "cinq sixièmes",
|
105
|
+
"⅛" => "un huitième",
|
106
|
+
"⅛" => "un huitième",
|
107
|
+
"⅜" => "trois huitièmes",
|
108
|
+
"⅜" => "trois huitièmes",
|
109
|
+
"⅝" => "cinq huitièmes",
|
110
|
+
"⅝" => "cinq huitièmes",
|
111
|
+
"⅞" => "sept huitièmes",
|
112
|
+
"⅞" => "sept huitièmes"
|
113
|
+
}.each do |original, converted|
|
114
|
+
define_method "test_vulgar_fractions_conversion: #{original}" do
|
115
|
+
assert_equal converted, original.convert_vulgar_fractions
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
@@ -144,13 +144,16 @@ class LocalizationTest < Test::Unit::TestCase
|
|
144
144
|
end
|
145
145
|
end
|
146
146
|
|
147
|
-
def
|
147
|
+
def test_enforce_available_locales_default
|
148
|
+
return unless I18n.respond_to?(:enforce_available_locales)
|
148
149
|
Stringex::Localization.backend = :i18n
|
150
|
+
assert_not_nil I18n.enforce_available_locales
|
149
151
|
'Some String'.to_url
|
150
|
-
|
152
|
+
assert_not_nil I18n.enforce_available_locales
|
151
153
|
end
|
152
154
|
|
153
155
|
def test_respects_user_enforce_available_locales_setting
|
156
|
+
return unless I18n.respond_to?(:enforce_available_locales)
|
154
157
|
Stringex::Localization.backend = :i18n
|
155
158
|
I18n.enforce_available_locales = false
|
156
159
|
'Some String'.to_url
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# encoding:
|
1
|
+
# encoding: utf-8
|
2
2
|
|
3
3
|
require "test_helper"
|
4
4
|
require "stringex"
|
@@ -118,6 +118,10 @@ class StringExtensionsTest < Test::Unit::TestCase
|
|
118
118
|
assert_equal "under_scores", "Under Scores".to_url(:replace_whitespace_with => "_")
|
119
119
|
end
|
120
120
|
|
121
|
+
def test_to_url_with_alternate_whitespace_replacement_and_with_limit_and_with_truncate_words_disabled
|
122
|
+
assert_equal "i_am_much", "I am much too long".to_url(:replace_whitespace_with => "_", :limit => 12, :truncate_words => false)
|
123
|
+
end
|
124
|
+
|
121
125
|
def test_remove_formatting
|
122
126
|
{
|
123
127
|
"<p>This has 100% too much <em>formatting</em></p>" =>
|
@@ -280,6 +284,14 @@ class StringExtensionsTest < Test::Unit::TestCase
|
|
280
284
|
end
|
281
285
|
end
|
282
286
|
|
287
|
+
def test_remove_nonreadable_characters
|
288
|
+
cases = { "Jörg Immendor\u0014. Les théâtres" => "jorg-immendor-les-theatres",
|
289
|
+
}
|
290
|
+
cases.each do |plain, converted|
|
291
|
+
assert_equal converted, plain.to_url
|
292
|
+
end
|
293
|
+
end
|
294
|
+
|
283
295
|
if defined?(RedCloth)
|
284
296
|
def test_to_html
|
285
297
|
{
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
|
3
3
|
require "test_helper"
|
4
|
-
require "stringex"
|
4
|
+
require "stringex/unidecoder"
|
5
5
|
|
6
6
|
class UnidecoderTest < Test::Unit::TestCase
|
7
7
|
# Silly phrases courtesy of Frank da Cruz
|
@@ -61,6 +61,7 @@ class UnidecoderTest < Test::Unit::TestCase
|
|
61
61
|
end
|
62
62
|
|
63
63
|
def test_to_ascii
|
64
|
+
require "stringex/core_ext"
|
64
65
|
DONT_CONVERT.each do |ascii|
|
65
66
|
assert_equal ascii, ascii.to_ascii
|
66
67
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: stringex
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Russell Norris
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-01-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: jeweler
|
@@ -58,14 +58,28 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - '='
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: 1.3.
|
61
|
+
version: 1.3.10
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - '='
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: 1.3.
|
68
|
+
version: 1.3.10
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: test-unit
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - '='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 3.0.9
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - '='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 3.0.9
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
84
|
name: activerecord
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -124,6 +138,7 @@ files:
|
|
124
138
|
- lib/stringex/configuration/configurator.rb
|
125
139
|
- lib/stringex/configuration/string_extensions.rb
|
126
140
|
- lib/stringex/configuration_lite.rb
|
141
|
+
- lib/stringex/core_ext.rb
|
127
142
|
- lib/stringex/localization.rb
|
128
143
|
- lib/stringex/localization/backend/base.rb
|
129
144
|
- lib/stringex/localization/backend/i18n.rb
|
@@ -319,7 +334,10 @@ files:
|
|
319
334
|
- locales/da.yml
|
320
335
|
- locales/de.yml
|
321
336
|
- locales/en.yml
|
337
|
+
- locales/fr.yml
|
338
|
+
- locales/nb.yml
|
322
339
|
- locales/nl.yml
|
340
|
+
- locales/no.yml
|
323
341
|
- locales/pl.yml
|
324
342
|
- locales/pt-BR.yml
|
325
343
|
- locales/ru.yml
|
@@ -336,6 +354,7 @@ files:
|
|
336
354
|
- test/unit/localization/de_test.rb
|
337
355
|
- test/unit/localization/default_test.rb
|
338
356
|
- test/unit/localization/en_test.rb
|
357
|
+
- test/unit/localization/fr_test.rb
|
339
358
|
- test/unit/localization/nl_test.rb
|
340
359
|
- test/unit/localization/pl_test.rb
|
341
360
|
- test/unit/localization/pt_br_test.rb
|