kyanite 0.3.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
|