stringex 2.5.2 → 2.6.0
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/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
|