aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdam Cigánek <adam.ciganek@gmail.com>2008-09-12 14:45:11 +0200
committerMichael Koziarski <michael@koziarski.com>2008-09-23 08:08:21 +0200
commita4f2ba8fb3c46ef9f7e31725849efdcb1a22c72d (patch)
tree7213d54c6b58397392c697e3f9e15d53a889ee77
parent961e2b861096c67573f3ddd2c9e55bb0658d6d88 (diff)
downloadrails-a4f2ba8fb3c46ef9f7e31725849efdcb1a22c72d.tar.gz
rails-a4f2ba8fb3c46ef9f7e31725849efdcb1a22c72d.tar.bz2
rails-a4f2ba8fb3c46ef9f7e31725849efdcb1a22c72d.zip
Modified ActiveSupport::Inflector#parameterize with code from slugalizer (http://github.com/henrik/slugalizer)
Handles trailing and leading slashes, and squashes repeated separators into a single character. Signed-off-by: Michael Koziarski <michael@koziarski.com> [#1034 state:committed]
-rw-r--r--activesupport/lib/active_support/inflector.rb16
-rw-r--r--activesupport/test/inflector_test.rb6
-rw-r--r--activesupport/test/inflector_test_cases.rb5
3 files changed, 21 insertions, 6 deletions
diff --git a/activesupport/lib/active_support/inflector.rb b/activesupport/lib/active_support/inflector.rb
index b2046f26de..89a93f4a5f 100644
--- a/activesupport/lib/active_support/inflector.rb
+++ b/activesupport/lib/active_support/inflector.rb
@@ -240,9 +240,9 @@ module ActiveSupport
def demodulize(class_name_in_module)
class_name_in_module.to_s.gsub(/^.*::/, '')
end
-
+
# Replaces special characters in a string so that it may be used as part of a 'pretty' URL.
- #
+ #
# ==== Examples
#
# class Person
@@ -250,14 +250,20 @@ module ActiveSupport
# "#{id}-#{name.parameterize}"
# end
# end
- #
+ #
# @person = Person.find(1)
# # => #<Person id: 1, name: "Donald E. Knuth">
- #
+ #
# <%= link_to(@person.name, person_path %>
# # => <a href="/person/1-donald-e-knuth">Donald E. Knuth</a>
def parameterize(string, sep = '-')
- string.mb_chars.normalize(:kd).to_s.gsub(/[^\x00-\x7F]+/, '').gsub(/[^a-z0-9_\-]+/i, sep).downcase
+ re_sep = Regexp.escape(sep)
+ string.mb_chars.normalize(:kd). # Decompose accented characters
+ gsub(/[^\x00-\x7F]+/, ''). # Remove anything non-ASCII entirely (e.g. diacritics).
+ gsub(/[^a-z0-9\-_\+]+/i, sep). # Turn unwanted chars into the separator.
+ squeeze(sep). # No more than one of the separator in a row.
+ gsub(/^#{re_sep}|#{re_sep}$/i, ''). # Remove leading/trailing separator.
+ downcase
end
# Create the name of a table like Rails does for models to table names. This method
diff --git a/activesupport/test/inflector_test.rb b/activesupport/test/inflector_test.rb
index f304844e82..d30852c013 100644
--- a/activesupport/test/inflector_test.rb
+++ b/activesupport/test/inflector_test.rb
@@ -104,6 +104,12 @@ class InflectorTest < Test::Unit::TestCase
end
end
+ def test_parameterize_with_custom_separator
+ StringToParameterized.each do |some_string, parameterized_string|
+ assert_equal(parameterized_string.gsub('-', '_'), ActiveSupport::Inflector.parameterize(some_string, '_'))
+ end
+ end
+
def test_classify
ClassNameToTableName.each do |class_name, table_name|
assert_equal(class_name, ActiveSupport::Inflector.classify(table_name))
diff --git a/activesupport/test/inflector_test_cases.rb b/activesupport/test/inflector_test_cases.rb
index 8057809dbd..fc7a35f859 100644
--- a/activesupport/test/inflector_test_cases.rb
+++ b/activesupport/test/inflector_test_cases.rb
@@ -147,7 +147,10 @@ module InflectorTestCases
"Random text with *(bad)* characters" => "random-text-with-bad-characters",
"Malmö" => "malmo",
"Garçons" => "garcons",
- "Allow_Under_Scores" => "allow_under_scores"
+ "Allow_Under_Scores" => "allow_under_scores",
+ "Trailing bad characters!@#" => "trailing-bad-characters",
+ "!@#Leading bad characters" => "leading-bad-characters",
+ "Squeeze separators" => "squeeze-separators"
}
UnderscoreToHuman = {