kyanite 0.3.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/0 start all Tests.bat +23 -0
- data/History.txt +4 -0
- data/License.txt +21 -0
- data/Manifest.txt +88 -0
- data/PostInstall.txt +4 -0
- data/README.txt +48 -0
- data/Rakefile.rb +79 -0
- data/init.rb +2 -0
- data/lib/kyanite.rb +39 -0
- data/lib/kyanite/array.rb +5 -0
- data/lib/kyanite/array/array.rb +172 -0
- data/lib/kyanite/array/array2.rb +140 -0
- data/lib/kyanite/array/matrix2.rb +120 -0
- data/lib/kyanite/array_of_enumerables.rb +2 -0
- data/lib/kyanite/array_of_numerics.rb +2 -0
- data/lib/kyanite/array_of_strings.rb +2 -0
- data/lib/kyanite/basics.rb +60 -0
- data/lib/kyanite/dictionary.rb +116 -0
- data/lib/kyanite/enumerable.rb +7 -0
- data/lib/kyanite/enumerable/enumerable_enumerables.rb +70 -0
- data/lib/kyanite/enumerable/enumerable_numerics.rb +171 -0
- data/lib/kyanite/enumerable/enumerable_strings.rb +58 -0
- data/lib/kyanite/enumerable/structure.rb +170 -0
- data/lib/kyanite/general.rb +8 -0
- data/lib/kyanite/general/callerutils.rb +128 -0
- data/lib/kyanite/general/classutils.rb +246 -0
- data/lib/kyanite/general/kernel.rb +105 -0
- data/lib/kyanite/general/nil.rb +64 -0
- data/lib/kyanite/general/object.rb +86 -0
- data/lib/kyanite/general/true_false.rb +65 -0
- data/lib/kyanite/general/undoable.rb +24 -0
- data/lib/kyanite/hash.rb +170 -0
- data/lib/kyanite/matrix2.rb +2 -0
- data/lib/kyanite/nil.rb +3 -0
- data/lib/kyanite/numeric.rb +4 -0
- data/lib/kyanite/numeric/float.rb +26 -0
- data/lib/kyanite/numeric/integer.rb +34 -0
- data/lib/kyanite/numeric/numeric.rb +45 -0
- data/lib/kyanite/operation.rb +5 -0
- data/lib/kyanite/operation/call_tracker.rb +69 -0
- data/lib/kyanite/operation/rake.rb +101 -0
- data/lib/kyanite/operation/regexp.rb +23 -0
- data/lib/kyanite/operation/unit_test.rb +53 -0
- data/lib/kyanite/optimizer.rb +119 -0
- data/lib/kyanite/rake.rb +2 -0
- data/lib/kyanite/range.rb +54 -0
- data/lib/kyanite/set.rb +219 -0
- data/lib/kyanite/smart_load_path.rb +2 -0
- data/lib/kyanite/string.rb +13 -0
- data/lib/kyanite/string/cast.rb +104 -0
- data/lib/kyanite/string/chars.rb +184 -0
- data/lib/kyanite/string/chars_const.rb +190 -0
- data/lib/kyanite/string/diff.rb +78 -0
- data/lib/kyanite/string/div.rb +19 -0
- data/lib/kyanite/string/include.rb +43 -0
- data/lib/kyanite/string/list.rb +84 -0
- data/lib/kyanite/string/mgsub.rb +35 -0
- data/lib/kyanite/string/nested.rb +253 -0
- data/lib/kyanite/string/random.rb +69 -0
- data/lib/kyanite/string/split.rb +136 -0
- data/lib/kyanite/symbol.rb +19 -0
- data/lib/kyanite/tree.rb +99 -0
- data/lib/kyanite/undoable.rb +2 -0
- data/lib/kyanite/unit_test.rb +2 -0
- data/test/_start_all.rb +17 -0
- data/test/array/test_array.rb +106 -0
- data/test/array/test_matrix2.rb +162 -0
- data/test/enumerable/test_enumerable_enumerables.rb +46 -0
- data/test/enumerable/test_enumerable_numerics.rb +93 -0
- data/test/enumerable/test_enumerable_strings.rb +22 -0
- data/test/enumerable/test_structure.rb +220 -0
- data/test/general/test_classutils.rb +45 -0
- data/test/general/test_nil.rb +44 -0
- data/test/general/test_object.rb +49 -0
- data/test/general/test_true_false.rb +28 -0
- data/test/numeric/test_numeric_integer.rb +28 -0
- data/test/string/test_cast.rb +108 -0
- data/test/string/test_chars.rb +255 -0
- data/test/string/test_diff.rb +95 -0
- data/test/string/test_list.rb +141 -0
- data/test/string/test_nested.rb +361 -0
- data/test/string/test_split.rb +187 -0
- data/test/test_dictionary.rb +128 -0
- data/test/test_hash.rb +59 -0
- data/test/test_optimizer.rb +150 -0
- data/test/test_range.rb +41 -0
- data/test/test_set.rb +210 -0
- data/test/test_tree.rb +94 -0
- metadata +217 -0
data/lib/kyanite/rake.rb
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
|
2
|
+
require 'facets/range/combine'
|
3
|
+
require 'facets/range/within'
|
4
|
+
require 'kyanite/enumerable' # is_collection? ist f�r Ranges false
|
5
|
+
|
6
|
+
|
7
|
+
# Aus Facets eingef�gt:
|
8
|
+
# * umbrella(r)
|
9
|
+
# * within?
|
10
|
+
# * combine(r)
|
11
|
+
#
|
12
|
+
class Range
|
13
|
+
|
14
|
+
# Invertiert den Range, mit dem ein Ausschnitt eines Strings oder eines Arrays bestimmt wird.
|
15
|
+
# Liefert einen Range, mit dem der inverse Teil des Strings ausgew�hlt werden kann.
|
16
|
+
# Beispiele siehe TestKyaniteRange.
|
17
|
+
#
|
18
|
+
def invert_index
|
19
|
+
|
20
|
+
# hinteren Teil ausgeben
|
21
|
+
if first == 0
|
22
|
+
return (1..0) if last == -1 # leer
|
23
|
+
return (last+1..-1) # hinterer Teil
|
24
|
+
|
25
|
+
# vorderen Teil ausgeben
|
26
|
+
else
|
27
|
+
return (0..first-1) if last == -1 # vorderer Teil
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
# �u�ere Teile ausgeben
|
32
|
+
return [(first..-1).invert_index, (0..last).invert_index]
|
33
|
+
end # def
|
34
|
+
|
35
|
+
|
36
|
+
|
37
|
+
end # class
|
38
|
+
|
39
|
+
|
40
|
+
|
41
|
+
|
42
|
+
|
43
|
+
class NilClass
|
44
|
+
def invert_index; nil; end
|
45
|
+
def umbrella(*a); nil; end
|
46
|
+
def combine(*a); nil; end
|
47
|
+
def within?(*a); nil; end
|
48
|
+
end
|
49
|
+
|
50
|
+
|
51
|
+
|
52
|
+
|
53
|
+
|
54
|
+
|
data/lib/kyanite/set.rb
ADDED
@@ -0,0 +1,219 @@
|
|
1
|
+
|
2
|
+
require 'set'
|
3
|
+
require 'kyanite/enumerable' # is_collection?
|
4
|
+
require 'kyanite/general/kernel' # silence_warnings
|
5
|
+
require 'kyanite/dictionary' # Geordneter Hash
|
6
|
+
require 'kyanite/symbol' # damit man auch Symbols aufnehmen kann
|
7
|
+
require 'kyanite/hash' # Korrektur der Methoden hash und eql?
|
8
|
+
|
9
|
+
|
10
|
+
# Set OrderedSet SortedSet Array
|
11
|
+
#
|
12
|
+
# = Unterschiede der verschiedenen Set-Klassen
|
13
|
+
# * Ein {Set}[http://www.ruby-doc.org/core/classes/Set.html] ist ungeordnet.
|
14
|
+
# Beispiele: TestKyaniteSet#test_set
|
15
|
+
# * Ein OrderedSet ist geordnet, es behält die ursprüngliche Reihenfolge, wird aber nicht kontinuierlich neu sortiert.
|
16
|
+
# Es sei denn, man sorgt dafür mit Dictionary#order_by
|
17
|
+
# Beispiele: TestKyaniteSet#test_ordered_set
|
18
|
+
# * Ein {SortedSet}[http://www.ruby-doc.org/core/classes/SortedSet.html] ist geordnet und sortiert. Es behält immer die Sortierung.
|
19
|
+
# Beispiele: TestKyaniteSet#test_sorted_set
|
20
|
+
#
|
21
|
+
class Set
|
22
|
+
|
23
|
+
# Fügt das Element an das Set an.
|
24
|
+
def push(elt)
|
25
|
+
self << elt
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
# Vergleichsoperator, Standardsortierung: Size
|
30
|
+
def <=>(other)
|
31
|
+
self.size <=> other.size
|
32
|
+
end
|
33
|
+
|
34
|
+
# def hash_raw
|
35
|
+
# @hash
|
36
|
+
# end
|
37
|
+
|
38
|
+
# Liefert irgendein Element.
|
39
|
+
def first
|
40
|
+
@hash.each do |key, value|
|
41
|
+
return key
|
42
|
+
end
|
43
|
+
end #def
|
44
|
+
|
45
|
+
|
46
|
+
# Liefert irgendein anderes Element.
|
47
|
+
def last
|
48
|
+
first = nil
|
49
|
+
@hash.each do |key, value|
|
50
|
+
if first.nil?
|
51
|
+
first = key
|
52
|
+
next
|
53
|
+
else
|
54
|
+
return key
|
55
|
+
end #if
|
56
|
+
end #do
|
57
|
+
end #def
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
|
62
|
+
# Set OrderedSet SortedSet Array
|
63
|
+
#
|
64
|
+
# Ein OrderedSet ist geordnet, es behält die ursprüngliche Reihenfolge, wird aber nicht kontinuierlich neu sortiert.
|
65
|
+
# Es sei denn, man sorgt dafür mit Dictionary#order_by
|
66
|
+
#
|
67
|
+
class OrderedSet < Set
|
68
|
+
|
69
|
+
def initialize(enum = nil, &block) # :yields: o
|
70
|
+
@hash ||= Dictionary.new
|
71
|
+
enum.nil? and return
|
72
|
+
if block
|
73
|
+
enum.each { |o| add(block[o]) }
|
74
|
+
else
|
75
|
+
merge(enum)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
|
80
|
+
# Liefert das n-te Element.
|
81
|
+
def [](index)
|
82
|
+
@hash.order[index]
|
83
|
+
end
|
84
|
+
|
85
|
+
|
86
|
+
def zugrundeliegendes_dictionary # :nodoc:
|
87
|
+
@hash
|
88
|
+
end
|
89
|
+
|
90
|
+
# Liefert ein entsprechendes Array.
|
91
|
+
# Diese Methode ist schnell. Es muss nichts umgeformt werden. Andere Methoden können also gerne auf to_a basieren.
|
92
|
+
def to_a
|
93
|
+
@hash.order
|
94
|
+
end
|
95
|
+
|
96
|
+
|
97
|
+
def ==(other)
|
98
|
+
silence_warnings do
|
99
|
+
self.to_a.to_set == other.to_a.to_set
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
# Wie Array#index
|
104
|
+
def index(object)
|
105
|
+
self.to_a.index(object)
|
106
|
+
end
|
107
|
+
|
108
|
+
def each
|
109
|
+
to_a.each { |e| yield( e ) }
|
110
|
+
self
|
111
|
+
end
|
112
|
+
|
113
|
+
def order_by( &block )
|
114
|
+
@hash.order_by( &block )
|
115
|
+
end
|
116
|
+
|
117
|
+
def first
|
118
|
+
self[0]
|
119
|
+
end
|
120
|
+
|
121
|
+
def last
|
122
|
+
self[-1]
|
123
|
+
end
|
124
|
+
|
125
|
+
|
126
|
+
|
127
|
+
end # class
|
128
|
+
|
129
|
+
|
130
|
+
# Set OrderedSet SortedSet Array
|
131
|
+
#
|
132
|
+
# Ein {SortedSet}[http://www.ruby-doc.org/core/classes/SortedSet.html] ist geordnet und sortiert. Es behält immer die Sortierung.
|
133
|
+
# Beispiele: TestKyaniteSet#test_sorted_set
|
134
|
+
#
|
135
|
+
class SortedSet
|
136
|
+
|
137
|
+
# Liefert das n-te Element.
|
138
|
+
# ineffizient!!
|
139
|
+
def [](index)
|
140
|
+
self.to_a[index]
|
141
|
+
end
|
142
|
+
|
143
|
+
def first
|
144
|
+
self[0]
|
145
|
+
end
|
146
|
+
|
147
|
+
def last
|
148
|
+
self[-1]
|
149
|
+
end
|
150
|
+
|
151
|
+
# das war mal auskommentiert, wird aber von nat_lang gebraucht
|
152
|
+
def unshift(e) # :nodoc:
|
153
|
+
self << e
|
154
|
+
end
|
155
|
+
|
156
|
+
def to_sorted_set
|
157
|
+
self
|
158
|
+
end
|
159
|
+
|
160
|
+
end # class
|
161
|
+
|
162
|
+
|
163
|
+
|
164
|
+
|
165
|
+
|
166
|
+
class Array
|
167
|
+
|
168
|
+
# Liefert ein OrderedSet, das dem Array entspricht.
|
169
|
+
# Übersicht über die verschiedenen Set-Klassen siehe Set.
|
170
|
+
# Tests siehe TestKyaniteSet#test_ordered_set
|
171
|
+
def to_ordered_set
|
172
|
+
OrderedSet.new(self)
|
173
|
+
end
|
174
|
+
|
175
|
+
# Liefert ein SortedSet, das dem Array entspricht.
|
176
|
+
# Übersicht über die verschiedenen Set-Klassen siehe Set.
|
177
|
+
# Tests siehe TestKyaniteSet#test_sorted_set
|
178
|
+
def to_sorted_set
|
179
|
+
SortedSet.new(self)
|
180
|
+
end
|
181
|
+
|
182
|
+
|
183
|
+
end # class
|
184
|
+
|
185
|
+
|
186
|
+
|
187
|
+
|
188
|
+
class NilClass
|
189
|
+
def to_set; Set.new; end
|
190
|
+
def to_sorted_set; SortedSet.new; end
|
191
|
+
def to_ordered_set; OrderedSet.new; end
|
192
|
+
end
|
193
|
+
|
194
|
+
|
195
|
+
class Object
|
196
|
+
def to_set; Set.new([self]); end
|
197
|
+
end
|
198
|
+
|
199
|
+
|
200
|
+
# ==================================================================================
|
201
|
+
# Ausprobieren
|
202
|
+
#
|
203
|
+
if $0 == __FILE__
|
204
|
+
|
205
|
+
require 'perception'
|
206
|
+
test = [:a, :b, :c].to_ordered_set
|
207
|
+
see :test # .inspect_see
|
208
|
+
see_pp test
|
209
|
+
seee.process_print( test, :method => :pp )
|
210
|
+
see :test# .inspect_see
|
211
|
+
|
212
|
+
end
|
213
|
+
|
214
|
+
|
215
|
+
|
216
|
+
|
217
|
+
|
218
|
+
|
219
|
+
|
@@ -0,0 +1,13 @@
|
|
1
|
+
|
2
|
+
require 'kyanite/enumerable'
|
3
|
+
|
4
|
+
require 'kyanite/string/cast'
|
5
|
+
require 'kyanite/string/chars'
|
6
|
+
require 'kyanite/string/diff'
|
7
|
+
require 'kyanite/string/div'
|
8
|
+
require 'kyanite/string/include'
|
9
|
+
require 'kyanite/string/list'
|
10
|
+
require 'kyanite/string/mgsub'
|
11
|
+
require 'kyanite/string/nested'
|
12
|
+
require 'kyanite/string/random'
|
13
|
+
require 'kyanite/string/split'
|
@@ -0,0 +1,104 @@
|
|
1
|
+
|
2
|
+
require 'kyanite/numeric/integer'
|
3
|
+
|
4
|
+
|
5
|
+
class String
|
6
|
+
|
7
|
+
# ---------------------------------------------------------------------------------------------------------------------------------
|
8
|
+
# :section: Umwandeln
|
9
|
+
# Siehe auch KlippsteinMail::String#to_email_address und KlippsteinMail::String#to_domain
|
10
|
+
|
11
|
+
|
12
|
+
|
13
|
+
# Wandelt einen String in den plausibelsten Identifier um:
|
14
|
+
# self.strip.to_integer_optional
|
15
|
+
#
|
16
|
+
# Tests & Beispiele siehe TestString#test_to_identifier
|
17
|
+
def to_identifier
|
18
|
+
self.strip.to_integer_optional
|
19
|
+
end
|
20
|
+
|
21
|
+
|
22
|
+
# Wandelt einen String in einen Integer, auch dann, wenn die Zahl hinten angehängt wurde.
|
23
|
+
# Im Gegensatz zu to_i wird nil zurückgegeben, wenn keine Zahl drin war.
|
24
|
+
#
|
25
|
+
# Beispiele & Tests siehe TestString#test_to_integer
|
26
|
+
def to_integer
|
27
|
+
return nil unless self =~ /\d/
|
28
|
+
firsttry = self.to_i
|
29
|
+
return firsttry if firsttry != 0
|
30
|
+
return self.scan(/\d+/)[0].to_i
|
31
|
+
end
|
32
|
+
|
33
|
+
|
34
|
+
# Wandelt einen String in einen Integer.
|
35
|
+
# Im Gegensatz zu to_i wird self zurückgegeben, wenn der String nicht mit einer Zahl beginnt.
|
36
|
+
# Leere Strings werden in NIL umgewandelt.
|
37
|
+
#
|
38
|
+
# Beispiele & Tests siehe TestString#test_to_integer_optional
|
39
|
+
def to_integer_optional
|
40
|
+
return nil if self.empty?
|
41
|
+
return self unless (self =~ /^\d/ || self =~ /^-\d/ )
|
42
|
+
return self.to_i
|
43
|
+
end
|
44
|
+
|
45
|
+
|
46
|
+
def to_nil
|
47
|
+
return self unless self.empty?
|
48
|
+
nil
|
49
|
+
end
|
50
|
+
|
51
|
+
|
52
|
+
|
53
|
+
|
54
|
+
unless defined? HEX_CHARS
|
55
|
+
HEX_CHARS = '0123456789abcdef'.freeze
|
56
|
+
end
|
57
|
+
|
58
|
+
def to_x
|
59
|
+
hex = ''
|
60
|
+
each_byte { |byte|
|
61
|
+
# To get a hex representation for a char we just utilize
|
62
|
+
# the quotient and the remainder of division by base 16.
|
63
|
+
q, r = byte.divmod(16)
|
64
|
+
hex << HEX_CHARS[q] << HEX_CHARS[r]
|
65
|
+
}
|
66
|
+
hex
|
67
|
+
end
|
68
|
+
|
69
|
+
|
70
|
+
def from_x
|
71
|
+
str, q, first = '', 0, false
|
72
|
+
each_byte { |byte|
|
73
|
+
# Our hex chars are 2 bytes wide, so we have to keep track
|
74
|
+
# of whether it's the first or the second of the two.
|
75
|
+
#
|
76
|
+
# NOTE: inject with each_slice(2) would be a natural fit,
|
77
|
+
# but it's kind of slow...
|
78
|
+
if first = !first
|
79
|
+
q = HEX_CHARS.index(byte)
|
80
|
+
else
|
81
|
+
# Now we got both parts, so let's do the
|
82
|
+
# inverse of divmod(16): q * 16 + r
|
83
|
+
str << q * 16 + HEX_CHARS.index(byte)
|
84
|
+
end
|
85
|
+
}
|
86
|
+
str
|
87
|
+
end
|
88
|
+
|
89
|
+
|
90
|
+
end
|
91
|
+
|
92
|
+
|
93
|
+
class NilClass
|
94
|
+
def to_identifier; nil; end
|
95
|
+
def to_integer; nil; end
|
96
|
+
def to_integer_optional; nil; end
|
97
|
+
def to_nil(*a); nil; end
|
98
|
+
def to_x; nil; end
|
99
|
+
def from_x; nil; end
|
100
|
+
end
|
101
|
+
|
102
|
+
|
103
|
+
|
104
|
+
|
@@ -0,0 +1,184 @@
|
|
1
|
+
|
2
|
+
# Multibyte-Unterstützung von ActiveSupport
|
3
|
+
$KCODE = 'UTF8'
|
4
|
+
require 'active_support'
|
5
|
+
|
6
|
+
# reicht aber noch nicht, damit funktioniert tr noch nicht.
|
7
|
+
# Hier hilft jcode.
|
8
|
+
require 'jcode'
|
9
|
+
|
10
|
+
require 'kyanite/string/mgsub'
|
11
|
+
require 'kyanite/string/chars_const'
|
12
|
+
|
13
|
+
|
14
|
+
unless defined? MYSQL_REPLACES
|
15
|
+
MYSQL_REPLACES = [
|
16
|
+
[/ä/, 'a'],
|
17
|
+
[/ö/, 'o'],
|
18
|
+
[/ü/, 'u'],
|
19
|
+
[/Ä/, 'a'],
|
20
|
+
[/Ö/, 'o'],
|
21
|
+
[/Ü/, 'u'],
|
22
|
+
[/ss/, 'ß'],
|
23
|
+
[/SS/, 'ß']
|
24
|
+
]
|
25
|
+
end
|
26
|
+
|
27
|
+
|
28
|
+
|
29
|
+
|
30
|
+
|
31
|
+
|
32
|
+
class String
|
33
|
+
|
34
|
+
# ---------------------------------------------------------------------------------------------------------------------------------
|
35
|
+
# :section: clear / format text
|
36
|
+
#
|
37
|
+
|
38
|
+
# Reduziert den String auf ein Base94-Encoding.
|
39
|
+
# * Wandelt àáâăäãāåạąæảấầắằÀÁÂĂÄÃĀÅẠĄÆẢẤẦẮẰ usw. in aaaaaaaaaaaaaaaaAAAAAAAAAAAAAAAA usw. um
|
40
|
+
# * entfernt anschließend alle Nicht-Asciizeichen
|
41
|
+
# * entfernt außerdem alle nichtdruckbaren Asciizeichen
|
42
|
+
# * Vorsicht: Newlines werden auch entfernt
|
43
|
+
#
|
44
|
+
#
|
45
|
+
# Tests & Beispiele siehe TestKyaniteStringClear
|
46
|
+
def reduce94( options={} )
|
47
|
+
dup.reduce94!
|
48
|
+
end
|
49
|
+
|
50
|
+
def reduce94!( options={} )
|
51
|
+
self.tr!(TR_FULL, TR_REDUCED)
|
52
|
+
self.delete!('^ -~')
|
53
|
+
self
|
54
|
+
end
|
55
|
+
|
56
|
+
# Reduziert den String auf ein Base53-Encoding,
|
57
|
+
# bestehend aus Großbuchstaben, Minuszeichen und zu Kleinbuchstaben umgeformten Sonderzeichen.
|
58
|
+
# Alle reduzierten Zeichen sind aber *klein*, streng genommen handelt es sich also um ein Base52-Encoding.
|
59
|
+
# Wandelt z.B. àáâăäãāåạąæảấầắằÀÁÂĂÄÃĀÅẠĄÆẢẤẦẮẰ usw. in aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa usw. um.
|
60
|
+
#
|
61
|
+
#
|
62
|
+
# Tests & Beispiele siehe TestKyaniteStringClear
|
63
|
+
def reduce53( options={} )
|
64
|
+
dup.reduce53!(options)
|
65
|
+
end
|
66
|
+
|
67
|
+
|
68
|
+
def reduce53!( options={} )
|
69
|
+
if options[:camelcase]
|
70
|
+
self.gsub!(/([A-Z]+)([A-Z][a-z])/,'\1-\2')
|
71
|
+
self.gsub!(/([a-z\d])([A-Z])/,'\1-\2')
|
72
|
+
end
|
73
|
+
self.tr!('abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')
|
74
|
+
self.gsub!( 'ß', options[:german_sz] ) if options[:german_sz]
|
75
|
+
self.tr!(TR_FULL, TR_REDUCED.downcase)
|
76
|
+
unless options[:space]
|
77
|
+
self.delete!('^- A-Za-z')
|
78
|
+
else
|
79
|
+
self.tr!('^- A-Za-z', ' ')
|
80
|
+
end
|
81
|
+
self.gsub!(/-+/, ' ')
|
82
|
+
self.gsub!(/\s+/, ' ')
|
83
|
+
self.strip!
|
84
|
+
self.gsub!(/ /, '-')
|
85
|
+
self
|
86
|
+
end
|
87
|
+
|
88
|
+
|
89
|
+
|
90
|
+
|
91
|
+
# Formt einen String so um, dass man auch mit utf8_general_ci verglichene Strings wiedererkennen kann
|
92
|
+
#
|
93
|
+
# Tests & Beispiele siehe TestKyaniteStringClear
|
94
|
+
def mysqlize
|
95
|
+
self.mb_chars.tidy_bytes.mgsub(MYSQL_REPLACES).downcase.to_s
|
96
|
+
end
|
97
|
+
|
98
|
+
|
99
|
+
|
100
|
+
# macht die nötigen Korrekturen für EmailAddress und Domain.
|
101
|
+
#
|
102
|
+
# Tests & Beispiele siehe TestKyaniteStringClear
|
103
|
+
# def strip_downcase_iconv
|
104
|
+
#to #from
|
105
|
+
# Iconv.new('iso-8859-1','utf-8').iconv(self.strip.downcase2)
|
106
|
+
# rescue
|
107
|
+
# self.strip.downcase2
|
108
|
+
# end
|
109
|
+
|
110
|
+
|
111
|
+
|
112
|
+
# ---------------------------------------------------------------------------------------------------------------------------------
|
113
|
+
# :section: Groß- und Kleinschreibung
|
114
|
+
#
|
115
|
+
|
116
|
+
# Ein Überschreiben von downcase führt in Kombination mit ActiveSupport zu seltsamen Ergebnissen!
|
117
|
+
def downcase2
|
118
|
+
self.tr(TR_UPCASE, TR_DOWNCASE).downcase
|
119
|
+
end
|
120
|
+
|
121
|
+
def downcase2!
|
122
|
+
self.tr!(TR_UPCASE, TR_DOWNCASE).downcase!
|
123
|
+
end
|
124
|
+
|
125
|
+
|
126
|
+
# Ein Überschreiben von upcase führt in Kombination mit ActiveSupport zu seltsamen Ergebnissen!
|
127
|
+
def upcase2
|
128
|
+
self.tr(TR_DOWNCASE, TR_UPCASE).upcase
|
129
|
+
end
|
130
|
+
|
131
|
+
def upcase2!
|
132
|
+
self.tr!(TR_DOWNCASE, TR_UPCASE).upcase!
|
133
|
+
end
|
134
|
+
|
135
|
+
|
136
|
+
# Erster Buchstabe groß?
|
137
|
+
def capitalized?
|
138
|
+
self =~ TR_UPCASE_ALL_REGEXP
|
139
|
+
end
|
140
|
+
|
141
|
+
def upcase?
|
142
|
+
(self == self.upcase)
|
143
|
+
end
|
144
|
+
|
145
|
+
def downcase?
|
146
|
+
(self == self.upcase)
|
147
|
+
end
|
148
|
+
|
149
|
+
end
|
150
|
+
|
151
|
+
|
152
|
+
|
153
|
+
|
154
|
+
|
155
|
+
class NilClass
|
156
|
+
def reduce94; nil; end
|
157
|
+
def reduce94!; nil; end
|
158
|
+
def reduce53; nil; end
|
159
|
+
def reduce53!; nil; end
|
160
|
+
def capitalized?; false; end
|
161
|
+
def downcase2; nil; end
|
162
|
+
def downcase2!; nil; end
|
163
|
+
def mysqlize; nil; end
|
164
|
+
# def strip_downcase_iconv; nil; end
|
165
|
+
def upcase2; nil; end
|
166
|
+
def upcase2!; nil; end
|
167
|
+
end
|
168
|
+
|
169
|
+
|
170
|
+
# -----------------------------------------------------------------------------------------
|
171
|
+
# Ausprobieren
|
172
|
+
#
|
173
|
+
if $0 == __FILE__ then
|
174
|
+
|
175
|
+
require 'perception'
|
176
|
+
|
177
|
+
see 'Höllo'.reduce53
|
178
|
+
|
179
|
+
|
180
|
+
|
181
|
+
end
|
182
|
+
|
183
|
+
|
184
|
+
|