babosa 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,8 +1,13 @@
1
1
  # Babosa
2
2
 
3
- Babosa is a library for creating slugs. It is an extraction and improvement of
4
- the string code from [FriendlyId](http://github.com/norman/friendly_id),
5
- intended to help developers create similar libraries and plugins.
3
+ Babosa is a library for creating human-friendly identifiers. Its primary
4
+ intended purpose is for creating URL slugs, but can also be useful for
5
+ normalizing and sanitizing data.
6
+
7
+ It is an extraction and improvement of the string code from
8
+ [FriendlyId](http://github.com/norman/friendly_id). I have released this as a
9
+ separate library to help developers who want to create libraries similar to
10
+ FriendlyId.
6
11
 
7
12
  ## Features / Usage
8
13
 
@@ -15,8 +20,8 @@ intended to help developers create similar libraries and plugins.
15
20
  "Jürgen Müller".to_slug.approximate_ascii.to_s #=> "Jurgen Muller"
16
21
  "Jürgen Müller".to_slug.approximate_ascii(:german).to_s #=> "Juergen Mueller"
17
22
 
18
- Currently, only German, Spanish and Serbian are supported. I'll gladly accept
19
- contributions and support more languages.
23
+ Supported language currently include Danish, German, Serbian and Spanish. I'll
24
+ gladly accept contributions and support more languages.
20
25
 
21
26
  ### Non-ASCII removal
22
27
 
@@ -41,17 +46,47 @@ whose length is limited by bytes rather than UTF-8 characters.
41
46
 
42
47
  "Gölcük, Turkey".to_slug.normalize.to_s #=> "golcuk-turkey"
43
48
 
49
+ ### Other stuff
50
+
51
+ Babosa can also generate strings for Ruby method names. (Yes, Ruby 1.9 can use UTF-8 chars
52
+ in method names, but you may not want to):
53
+
54
+
55
+ "this is a method".to_slug.to_ruby_method! #=> this_is_a_method
56
+ "über cool stuff!".to_slug.to_ruby_method! #=> uber_cool_stuff!
57
+
58
+ # You can also disallow trailing punctuation chars
59
+ "über cool stuff!".to_slug.to_ruby_method(false) #=> uber_cool_stuff
60
+
61
+
62
+ You can add not only transliterations, but expansions for some characters if you want:
63
+
64
+ Babosa::Characters.add_approximations(:user, {
65
+ "0" => "oh",
66
+ "1" => "one",
67
+ "2" => "two",
68
+ "3" => "three",
69
+ "." => " dot "
70
+ })
71
+ "Web 2.0".to_slug.normalize!(:transliterations => :user) #=> "web-two-dot-oh"
44
72
 
45
73
  ### UTF-8 support
46
74
 
47
75
  Babosa has no hard dependencies, but if you have either the Unicode or
48
76
  ActiveSupport gems installed and required prior to requiring "babosa", these
49
77
  will be used to perform upcasing and downcasing on UTF-8 strings. On JRuby 1.5
50
- and above, Java's native Unicode support will be used.
78
+ and above, Java's native Unicode support will be used instead. Unless you're on
79
+ JRuby, which already has excellent support for Unicode via Java's Standard
80
+ Library, I recommend using the Unicode gem because it's the fastest Ruby
81
+ Unicode library available.
51
82
 
52
83
  If none of these libraries are available, Babosa falls back to a simple module
53
- which supports only Unicode strings only with Latin characters. I recommend
54
- using the Unicode gem where possible since it's a C extension and is very fast.
84
+ which only supports Latin characters.
85
+
86
+ This default module is fast and can do very naive Unicode composition to ensure
87
+ that, for example, "é" will always be composed to a single codepoint rather
88
+ than an "e" and a "´" - making it safe to use as a hash key. But seriously -
89
+ save yourself the headache and install a real Unicode library.
55
90
 
56
91
 
57
92
  ### Rails 3
@@ -59,15 +94,17 @@ using the Unicode gem where possible since it's a C extension and is very fast.
59
94
  Most of Babosa's functionality is already present in Active Support/Rails 3.
60
95
  Babosa exists primarily to support non-Rails applications, and Rails apps prior
61
96
  to 3.0. Most of the code here was originally written for FriendlyId. Several
62
- things, like tidy_bytes and ASCII transliteration, were later added to Rails and I18N.
97
+ things, like `tidy_bytes` and ASCII transliteration, were later added to Rails
98
+ and I18N.
63
99
 
64
100
  Babosa differs from ActiveSupport primarily in that it supports non-Latin
65
- strings by default. If you are considering using Babosa with Rails 3, you should first
66
- take a look at Active Support's
101
+ strings by default, and has per-locale ASCII transliterations already baked-in. If
102
+ you are considering using Babosa with Rails 3, you should first take a look at
103
+ Active Support's
67
104
  [transliterate](http://edgeapi.rubyonrails.org/classes/ActiveSupport/Inflector.html#M000565)
68
105
  and
69
106
  [parameterize](http://edgeapi.rubyonrails.org/classes/ActiveSupport/Inflector.html#M000566)
70
- because it's very likely they already do what you need.
107
+ because it may already do what you need.
71
108
 
72
109
  ### More info
73
110
 
@@ -81,8 +118,8 @@ Babosa can be installed via Rubygems:
81
118
 
82
119
  You can get the source code from its [Github repository](http://github.com/norman/babosa).
83
120
 
84
- Babosa is tested to be compatible with Ruby 1.8.6-1.9.2, JRuby 1.4-1.5,
85
- Rubinius 1.0, and is probably compatible with other Rubies as well.
121
+ Babosa is tested to be compatible with Ruby 1.8.6-1.9.2, JRuby 1.4-1.5, and
122
+ Rubinius 1.0.x. It's probably compatible with other Rubies as well.
86
123
 
87
124
  ## Reporting bugs
88
125
 
@@ -99,11 +136,13 @@ Please use Babosa's [Github issue tracker](http://github.com/norman/babosa/issue
99
136
 
100
137
  ## Contributors
101
138
 
139
+ * [Molte Emil Strange Andersen](http://github.com/molte) - Danish support
102
140
  * [Milan Dobrota](http://github.com/milandobrota) - Serbian support
103
141
 
104
142
 
105
143
  ## Changelog
106
144
 
145
+ * 0.2.0 - Added support for Danish. Added method to generate Ruby identifiers. Improved performance.
107
146
  * 0.1.1 - Added support for Serbian.
108
147
  * 0.1.0 - Initial extraction from FriendlyId.
109
148
 
@@ -111,12 +150,12 @@ Please use Babosa's [Github issue tracker](http://github.com/norman/babosa/issue
111
150
 
112
151
  Copyright (c) 2010 Norman Clarke
113
152
 
114
- Permission is hereby granted, free of charge, to any person obtaining a copy
115
- of this software and associated documentation files (the "Software"), to deal
116
- in the Software without restriction, including without limitation the rights
117
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
118
- copies of the Software, and to permit persons to whom the Software is
119
- furnished to do so, subject to the following conditions:
153
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
154
+ this software and associated documentation files (the "Software"), to deal in
155
+ the Software without restriction, including without limitation the rights to
156
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
157
+ of the Software, and to permit persons to whom the Software is furnished to do
158
+ so, subject to the following conditions:
120
159
 
121
160
  The above copyright notice and this permission notice shall be included in all
122
161
  copies or substantial portions of the Software.
data/Rakefile CHANGED
@@ -1,3 +1,5 @@
1
+ require "rubygems"
2
+ require "bundler/setup"
1
3
  require "rake/testtask"
2
4
  require "rake/clean"
3
5
  require "rake/gempackagetask"
data/init.rb CHANGED
@@ -1,3 +1,3 @@
1
- $LOAD_PATH << File.expand_path("../lib", __FILE__)
2
- $LOAD_PATH.uniq!
1
+ require "rubygems"
2
+ require "bundler/setup"
3
3
  require "babosa"
@@ -5,9 +5,10 @@ module Babosa
5
5
  end
6
6
 
7
7
  class String
8
- def to_slug
9
- Babosa::SlugString.new self
8
+ def to_identifier
9
+ Babosa::Identifier.new self
10
10
  end
11
+ alias to_slug to_identifier
11
12
 
12
13
  # Compatibility with 1.8.6
13
14
  if !public_method_defined? :bytesize
@@ -19,4 +20,4 @@ end
19
20
 
20
21
  require "babosa/characters"
21
22
  require "babosa/utf8/proxy"
22
- require "babosa/slug_string"
23
+ require "babosa/identifier"
@@ -26,21 +26,23 @@ module Babosa
26
26
  # @param [#to_sym] name The name of the approximations to add.
27
27
  # @param Hash hash The approximations to add.
28
28
  def add_approximations(name, hash)
29
- @approximations ||= {}
30
- @approximations[name.to_sym] = hash.inject({}) do |memo, object|
29
+ approximations = @approximations ? @approximations.dup : {}
30
+ approximations[name.to_sym] = hash.inject({}) do |memo, object|
31
31
  key = object[0].unpack("U").shift
32
32
  value = object[1].unpack("C*")
33
33
  memo[key] = value.length == 1 ? value[0] : value
34
34
  memo
35
- end
35
+ end.freeze
36
+ @approximations = approximations.freeze
36
37
  end
37
38
 
38
- add_approximations :spanish, "ñ" => "ni"
39
- add_approximations :german, "ä" => "ae", "ö" => "oe", "ü" => "ue"
39
+ add_approximations :danish, "æ" => "ae", "ø" => "oe", "å" => "aa", "Ø" => "Oe", "Å" => "Aa"
40
+ add_approximations :german, "ä" => "ae", "ö" => "oe", "ü" => "ue", "Ä" => "Ae", "Ö" => "Oe", "Ü" => "Ue"
40
41
  add_approximations :serbian, "Ð" => "Dj", "đ" => "dj" ,"Č" => "Ch", "č" => "ch", "Š" => "Sh", "š" => "sh"
42
+ add_approximations :spanish, "ñ" => "ni", "Ñ" => "Ni"
41
43
  add_approximations :latin, {
42
44
  "À" => "A", "Á" => "A", "Â" => "A", "Ã" => "A", "Ä" => "A", "Å" => "A",
43
- "Æ" => "AE", "Ç" => "C", "È" => "E", "É" => "E", "Ê" => "E", "Ë" => "E",
45
+ "Æ" => "Ae", "Ç" => "C", "È" => "E", "É" => "E", "Ê" => "E", "Ë" => "E",
44
46
  "Ì" => "I", "Í" => "I", "Î" => "I", "Ï" => "I", "Ð" => "D", "Ñ" => "N",
45
47
  "Ò" => "O", "Ó" => "O", "Ô" => "O", "Õ" => "O", "Ö" => "O", "Ø" => "O",
46
48
  "Ù" => "U", "Ú" => "U", "Û" => "U", "Ü" => "U", "Ý" => "Y", "Þ" => "Th",
@@ -57,11 +59,11 @@ module Babosa
57
59
  "Ĝ" => "G", "ĝ" => "g", "Ğ" => "G", "ğ" => "g", "Ġ" => "G", "ġ" => "g",
58
60
  "Ģ" => "G", "ģ" => "g", "Ĥ" => "H", "ĥ" => "h", "Ħ" => "H", "ħ" => "h",
59
61
  "Ĩ" => "I", "ĩ" => "i", "Ī" => "I", "ī" => "i", "Ĭ" => "I", "ĭ" => "i",
60
- "Į" => "I", "į" => "i", "İ" => "I", "ı" => "i", "IJ" => "IJ", "ij" => "ij",
62
+ "Į" => "I", "į" => "i", "İ" => "I", "ı" => "i", "IJ" => "Ij", "ij" => "ij",
61
63
  "Ĵ" => "J", "ĵ" => "j", "Ķ" => "K", "ķ" => "k", "ĸ" => "k", "Ĺ" => "L",
62
64
  "ĺ" => "l", "Ļ" => "L", "ļ" => "l", "Ľ" => "L", "ľ" => "l", "Ŀ" => "L",
63
65
  "ŀ" => "l", "Ł" => "L", "ł" => "l", "Ń" => "N", "ń" => "n", "Ņ" => "N",
64
- "ņ" => "n", "Ň" => "N", "ň" => "n", "ʼn" => "n", "Ŋ" => "NG", "ŋ" => "ng",
66
+ "ņ" => "n", "Ň" => "N", "ň" => "n", "ʼn" => "n", "Ŋ" => "Ng", "ŋ" => "ng",
65
67
  "Ō" => "O", "ō" => "o", "Ŏ" => "O", "ŏ" => "o", "Ő" => "O", "ő" => "o",
66
68
  "Œ" => "OE", "œ" => "oe", "Ŕ" => "R", "ŕ" => "r", "Ŗ" => "R", "ŗ" => "r",
67
69
  "Ř" => "R", "ř" => "r", "Ś" => "S", "ś" => "s", "Ŝ" => "S", "ŝ" => "s",
@@ -1,25 +1,24 @@
1
1
  # encoding: utf-8
2
-
3
2
  module Babosa
4
3
 
5
4
  # This class provides some string-manipulation methods specific to slugs.
6
5
  #
7
6
  # Note that this class includes many "bang methods" such as {#clean!} and
8
7
  # {#normalize!} that perform actions on the string in-place. Each of these
9
- # methods has a corresponding "bangless" method (i.e., +SlugString#clean!+
10
- # and +SlugString#clean+) which does not appear in the documentation because
8
+ # methods has a corresponding "bangless" method (i.e., +Identifier#clean!+
9
+ # and +Identifier#clean+) which does not appear in the documentation because
11
10
  # it is generated dynamically.
12
11
  #
13
12
  # All of the bang methods return an instance of String, while the bangless
14
- # versions return an instance of Babosa::SlugString, so that calls to methods
13
+ # versions return an instance of Babosa::Identifier, so that calls to methods
15
14
  # specific to this class can be chained:
16
15
  #
17
- # string = SlugString.new("hello world")
18
- # string.with_dashes! # => "hello-world"
19
- # string.with_dashes # => <Babosa::SlugString:0x000001013e1590 @wrapped_string="hello-world">
16
+ # string = Identifier.new("hello world")
17
+ # string.with_separators! # => "hello-world"
18
+ # string.with_separators # => <Babosa::Identifier:0x000001013e1590 @wrapped_string="hello-world">
20
19
  #
21
20
  # @see http://www.utf8-chartable.de/unicode-utf8-table.pl?utf8=dec Unicode character table
22
- class SlugString
21
+ class Identifier
23
22
 
24
23
  attr_reader :wrapped_string
25
24
  alias to_s wrapped_string
@@ -50,7 +49,7 @@ module Babosa
50
49
  @wrapped_string.__send__(symbol, *args, &block)
51
50
  end
52
51
 
53
- # @param string [#to_s] The string to use as the basis of the SlugString.
52
+ # @param string [#to_s] The string to use as the basis of the Identifier.
54
53
  def initialize(string)
55
54
  @wrapped_string = string.to_s
56
55
  tidy_bytes!
@@ -61,21 +60,21 @@ module Babosa
61
60
  # characters that are Roman-alphabet characters + diacritics. Non-letter
62
61
  # characters are left unmodified.
63
62
  #
64
- # string = SlugString.new "Łódź, Poland"
65
- # string.approximate_ascii # => "Lodz, Poland"
66
- # string = SlugString.new "日本"
67
- # string.approximate_ascii # => "日本"
63
+ # string = Identifier.new "Łódź, Poland"
64
+ # string.transliterate # => "Lodz, Poland"
65
+ # string = Identifier.new "日本"
66
+ # string.transliterate # => "日本"
68
67
  #
69
68
  # You can pass any key(s) from +Characters.approximations+ as arguments. This allows
70
- # for contextual approximations. By default; +:spanish+ and +:german+ are
71
- # provided:
69
+ # for contextual approximations. Danish, German, Serbian and Spanish are currently
70
+ # supported.
72
71
  #
73
- # string = SlugString.new "Jürgen Müller"
74
- # string.approximate_ascii # => "Jurgen Muller"
75
- # string.approximate_ascii :german # => "Juergen Mueller"
76
- # string = SlugString.new "¡Feliz año!"
77
- # string.approximate_ascii # => "¡Feliz ano!"
78
- # string.approximate_ascii :spanish # => "¡Feliz anio!"
72
+ # string = Identifier.new "Jürgen Müller"
73
+ # string.transliterate # => "Jurgen Muller"
74
+ # string.transliterate :german # => "Juergen Mueller"
75
+ # string = Identifier.new "¡Feliz año!"
76
+ # string.transliterate # => "¡Feliz ano!"
77
+ # string.transliterate :spanish # => "¡Feliz anio!"
79
78
  #
80
79
  # You can modify the built-in approximations, or add your own:
81
80
  #
@@ -85,13 +84,17 @@ module Babosa
85
84
  # Notice that this method does not simply convert to ASCII; if you want
86
85
  # to remove non-ASCII characters such as "¡" and "¿", use {#to_ascii!}:
87
86
  #
88
- # string.approximate_ascii!(:spanish) # => "¡Feliz anio!"
89
- # string.to_ascii! # => "Feliz anio!"
87
+ # string.transliterate!(:spanish) # => "¡Feliz anio!"
88
+ # string.transliterate! # => "Feliz anio!"
90
89
  # @param *args <Symbol>
91
90
  # @return String
92
- def approximate_ascii!(overrides = {})
93
- overrides = Characters.approximations[overrides] if overrides.kind_of? Symbol
94
- @wrapped_string = unpack("U*").map { |char| approx_char(char, overrides) }.flatten.pack("U*")
91
+ def transliterate!(transliterations = {})
92
+ if transliterations.kind_of? Symbol
93
+ transliterations = Characters.approximations[transliterations]
94
+ else
95
+ transliterations ||= {}
96
+ end
97
+ @wrapped_string = unpack("U*").map { |char| approx_char(char, transliterations) }.flatten.pack("U*")
95
98
  end
96
99
 
97
100
  # Converts dashes to spaces, removes leading and trailing spaces, and
@@ -108,22 +111,47 @@ module Babosa
108
111
  @wrapped_string = (unpack("U*") - Characters.strippable).pack("U*")
109
112
  end
110
113
 
111
- # Normalize the string for use as a slug. Note that in this context,
114
+ # Normalize the string for use as a URL slug. Note that in this context,
112
115
  # +normalize+ means, strip, remove non-letters/numbers, downcasing,
113
116
  # truncating to 255 bytes and converting whitespace to dashes.
114
- # @param Boolean ascii If true, approximate ASCII and then remove any non-ASCII characters.
117
+ # @param Options
115
118
  # @return String
116
- def normalize!(ascii = false)
117
- if ascii
118
- approximate_ascii!
119
- to_ascii!
119
+ def normalize!(options = nil)
120
+ # Handle deprecated usage
121
+ if options == true
122
+ warn "#normalize! now takes a hash of options rather than a boolean"
123
+ options = default_normalize_options.merge(:to_ascii => true)
124
+ else
125
+ options = default_normalize_options.merge(options || {})
126
+ end
127
+ if options[:transliterate]
128
+ transliterate!(*options[:transliterations])
120
129
  end
130
+ to_ascii! if options[:to_ascii]
121
131
  clean!
122
132
  word_chars!
123
133
  clean!
124
134
  downcase!
125
- truncate_bytes!(255)
126
- with_dashes!
135
+ truncate_bytes!(options[:max_length])
136
+ with_separators!(options[:separator])
137
+ end
138
+
139
+ # Normalize a string so that it can safely be used as a Ruby method name.
140
+ def to_ruby_method!(allow_bangs = true)
141
+ leader, trailer = @wrapped_string.strip.scan(/\A(.+)(.)\z/).flatten
142
+ if allow_bangs
143
+ trailer.downcase.gsub!(/[^a-z0-9!=\\\\?]/, '')
144
+ else
145
+ trailer.downcase.gsub!(/[^a-z0-9]/, '')
146
+ end
147
+ id = leader.to_identifier
148
+ id.transliterate!
149
+ id.to_ascii!
150
+ id.clean!
151
+ id.word_chars!
152
+ id.clean!
153
+ @wrapped_string = id.to_s + trailer
154
+ with_separators!("_")
127
155
  end
128
156
 
129
157
  # Delete any non-ascii characters.
@@ -134,7 +162,7 @@ module Babosa
134
162
 
135
163
  # Truncate the string to +max+ characters.
136
164
  # @example
137
- # "üéøá".to_slug.truncate(3) #=> "üéø"
165
+ # "üéøá".to_identifier.truncate(3) #=> "üéø"
138
166
  # @return String
139
167
  def truncate!(max)
140
168
  @wrapped_string = unpack("U*")[0...max].pack("U*")
@@ -145,7 +173,7 @@ module Babosa
145
173
  # byte length. The resulting string may be less than +max+ if the string must
146
174
  # be truncated at a multibyte character boundary.
147
175
  # @example
148
- # "üéøá".to_slug.truncate_bytes(3) #=> "ü"
176
+ # "üéøá".to_identifier.truncate_bytes(3) #=> "ü"
149
177
  # @return String
150
178
  def truncate_bytes!(max)
151
179
  return @wrapped_string if @wrapped_string.bytesize <= max
@@ -164,8 +192,8 @@ module Babosa
164
192
 
165
193
  # Replaces whitespace with dashes ("-").
166
194
  # @return String
167
- def with_dashes!
168
- @wrapped_string = @wrapped_string.gsub(/\s/u, "-")
195
+ def with_separators!(char = "-")
196
+ @wrapped_string = @wrapped_string.gsub(/\s/u, char)
169
197
  end
170
198
 
171
199
  # Perform UTF-8 sensitive upcasing.
@@ -193,31 +221,46 @@ module Babosa
193
221
  @wrapped_string = @@utf8_proxy.tidy_bytes(@wrapped_string)
194
222
  end
195
223
 
196
- %w[approximate_ascii clean downcase word_chars normalize normalize_utf8
197
- tidy_bytes to_ascii truncate truncate_bytes upcase with_dashes].each do |method|
198
- class_eval(<<-EOM)
224
+ %w[transliterate clean downcase word_chars normalize normalize_utf8
225
+ tidy_bytes to_ascii truncate truncate_bytes upcase with_separators].each do |method|
226
+ class_eval(<<-EOM, __FILE__, __LINE__ +1)
199
227
  def #{method}(*args)
200
228
  send_to_new_instance(:#{method}!, *args)
201
229
  end
202
230
  EOM
203
231
  end
204
232
 
205
- def to_slug
233
+ def to_identifier
206
234
  self
207
235
  end
208
236
 
237
+ # The default options for {#normalize!}. Override to set your own defaults.
238
+ def default_normalize_options
239
+ {:transliterate => true, :max_length => 255, :separator => "-"}
240
+ end
241
+
242
+ alias approximate_ascii transliterate
243
+ alias approximate_ascii! transliterate!
244
+ alias with_dashes with_separators
245
+ alias with_dashes! with_separators!
246
+ alias to_slug to_identifier
247
+
209
248
  private
210
249
 
211
250
  # Look up the character's approximation in the configured maps.
212
- def approx_char(char, overrides = {})
213
- overrides[char] or Characters.approximations[:latin][char] or char
251
+ def approx_char(char, transliterations = {})
252
+ transliterations[char] or Characters.approximations[:latin][char] or char
214
253
  end
215
254
 
216
255
  # Used as the basis of the bangless methods.
217
256
  def send_to_new_instance(*args)
218
- string = SlugString.new self
219
- string.send(*args)
220
- string
257
+ id = Identifier.allocate
258
+ id.instance_variable_set :@wrapped_string, to_s
259
+ id.send(*args)
260
+ id
221
261
  end
222
262
  end
263
+
264
+ # Identifier is aliased as SlugString to support older versions of FriendlyId.
265
+ SlugString = Identifier
223
266
  end
@@ -1,5 +1,5 @@
1
1
  module Babosa
2
2
  module Version
3
- STRING = "0.1.1"
3
+ STRING = "0.2.0"
4
4
  end
5
5
  end
@@ -1,11 +1,8 @@
1
1
  # encoding: utf-8
2
2
  $KCODE = 'UTF8' if RUBY_VERSION < '1.9'
3
- $LOAD_PATH << File.expand_path("../../lib", __FILE__)
4
- $LOAD_PATH.uniq!
5
3
 
6
4
  require "rubygems"
7
- require "bundler"
8
- Bundler.setup
5
+ require "bundler/setup"
9
6
  require "test/unit"
10
7
  require "babosa"
11
8
 
@@ -106,7 +103,11 @@ class BabosaTest < Test::Unit::TestCase
106
103
  end
107
104
 
108
105
  test "should do special approximations for German" do
109
- assert_equal "Juergen", "Jürgen".to_slug.approximate_ascii!(:german)
106
+ {
107
+ "Jürgen" => "Juergen",
108
+ "böse" => "boese",
109
+ "Männer" => "Maenner"
110
+ }.each {|given, expected| assert_equal expected, given.to_slug.approximate_ascii!(:german)}
110
111
  end
111
112
 
112
113
  test "should do special approximations for Spanish" do
@@ -114,7 +115,21 @@ class BabosaTest < Test::Unit::TestCase
114
115
  end
115
116
 
116
117
  test "should do special approximations for Serbian" do
117
- assert_equal "Indjija", "Inđija".to_slug.approximate_ascii!(:serbian)
118
+ {
119
+ "Ðorđe" => "Djordje",
120
+ "Inđija" => "Indjija",
121
+ "Četiri" => "Chetiri",
122
+ "četiri" => "chetiri",
123
+ "Škola" => "Shkola",
124
+ "škola" => "shkola"
125
+ }.each {|given, expected| assert_equal expected, given.to_slug.approximate_ascii!(:serbian)}
126
+ end
127
+
128
+ test "should do special approximations for Danish" do
129
+ {
130
+ "Ærøskøbing" => "Aeroeskoebing",
131
+ "Årslev" => "Aarslev"
132
+ }.each {|given, expected| assert_equal expected, given.to_slug.approximate_ascii!(:danish)}
118
133
  end
119
134
 
120
135
  test "should work with non roman chars" do
@@ -156,9 +171,19 @@ class BabosaTest < Test::Unit::TestCase
156
171
  assert_equal " a bc ".bytesize, " a bc ".to_slug.with_dashes.bytesize
157
172
  end
158
173
 
159
- test "normalize! with ascii should approximate and strip non ascii" do
174
+ test "normalize! with ascii option should approximate and strip non ascii" do
160
175
  ss = "カタカナ: katakana is über cool".to_slug
161
- assert_equal "katakana-is-uber-cool", ss.normalize!(true)
176
+ assert_equal "katakana-is-uber-cool", ss.normalize!(:to_ascii => true)
162
177
  end
163
178
 
179
+ test "normalize should use transliterations" do
180
+ assert_equal "juergen", "Jürgen".to_slug.normalize(:transliterations => :german).to_s
181
+ end
182
+
183
+ test "should get a string suitable for use as a ruby method" do
184
+ assert_equal "hello_world?", "¿¿¿hello... world???".to_slug.to_ruby_method!
185
+ assert_equal "katakana_is_uber_cool", "カタカナ: katakana is über cool".to_slug.to_ruby_method!
186
+ assert_equal "katakana_is_uber_cool!", "カタカナ: katakana is über cool!".to_slug.to_ruby_method!
187
+ assert_equal "katakana_is_uber_cool", "カタカナ: katakana is über cool".to_slug.to_ruby_method!(false)
188
+ end
164
189
  end
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
- - 1
8
- - 1
9
- version: 0.1.1
7
+ - 2
8
+ - 0
9
+ version: 0.2.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Norman Clarke
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-08-09 00:00:00 -03:00
17
+ date: 2010-08-30 00:00:00 -03:00
18
18
  default_executable:
19
19
  dependencies: []
20
20
 
@@ -28,7 +28,7 @@ extra_rdoc_files: []
28
28
 
29
29
  files:
30
30
  - lib/babosa/characters.rb
31
- - lib/babosa/slug_string.rb
31
+ - lib/babosa/identifier.rb
32
32
  - lib/babosa/utf8/active_support_proxy.rb
33
33
  - lib/babosa/utf8/dumb_proxy.rb
34
34
  - lib/babosa/utf8/java_proxy.rb
@@ -56,6 +56,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
56
56
  requirements:
57
57
  - - ">="
58
58
  - !ruby/object:Gem::Version
59
+ hash: 1210160351012131207
59
60
  segments:
60
61
  - 0
61
62
  version: "0"
@@ -64,6 +65,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
64
65
  requirements:
65
66
  - - ">="
66
67
  - !ruby/object:Gem::Version
68
+ hash: 1210160351012131207
67
69
  segments:
68
70
  - 0
69
71
  version: "0"