discourse/lib/slug.rb

39 lines
1.1 KiB
Ruby
Raw Normal View History

2013-02-06 03:16:51 +08:00
# encoding: utf-8
module Slug
2015-04-13 22:50:41 +08:00
def self.for(string, default = 'topic')
slug = case SiteSetting.slug_generation_method.to_sym
when :ascii then self.ascii_generator(string)
when :encoded then self.encoded_generator(string)
when :none then self.none_generator(string)
end
# Reject slugs that only contain numbers, because they would be indistinguishable from id's.
slug = (slug =~ /[^\d]/ ? slug : '')
slug.blank? ? default : slug
end
private
def self.ascii_generator(string)
string.gsub("'", "")
.parameterize
.gsub("_", "-")
2013-02-06 03:16:51 +08:00
end
2015-04-13 22:50:41 +08:00
def self.encoded_generator(string)
# This generator will sanitize almost all special characters,
# including reserved characters from RFC3986.
# See also URI::REGEXP::PATTERN.
string.strip
.gsub(/\s+/, '-')
.gsub(/[:\/\?#\[\]@!\$&'\(\)\*\+,;=_\.~%\\`^\s|\{\}"<>]+/, '') # :/?#[]@!$&'()*+,;=_.~%\`^|{}"<>
.gsub(/\A-+|-+\z/, '') # remove possible trailing and preceding dashes
.squeeze('-') # squeeze continuous dashes to prettify slug
2015-04-13 22:50:41 +08:00
end
def self.none_generator(string)
''
end
2013-02-06 03:16:51 +08:00
end