stringex 1.3.0 → 1.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/README.rdoc +35 -22
- data/Rakefile +2 -2
- data/lib/stringex.rb +5 -5
- data/stringex.gemspec +3 -186
- data/test/unidecoder_test.rb +4 -4
- metadata +5 -188
- data/lib/lucky_sneaks/acts_as_url.rb +0 -105
- data/lib/lucky_sneaks/string_extensions.rb +0 -196
- data/lib/lucky_sneaks/unidecoder.rb +0 -62
- data/lib/lucky_sneaks/unidecoder_data/x00.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x01.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x02.yml +0 -256
- data/lib/lucky_sneaks/unidecoder_data/x03.yml +0 -256
- data/lib/lucky_sneaks/unidecoder_data/x04.yml +0 -256
- data/lib/lucky_sneaks/unidecoder_data/x05.yml +0 -256
- data/lib/lucky_sneaks/unidecoder_data/x06.yml +0 -256
- data/lib/lucky_sneaks/unidecoder_data/x07.yml +0 -256
- data/lib/lucky_sneaks/unidecoder_data/x09.yml +0 -256
- data/lib/lucky_sneaks/unidecoder_data/x0a.yml +0 -256
- data/lib/lucky_sneaks/unidecoder_data/x0b.yml +0 -256
- data/lib/lucky_sneaks/unidecoder_data/x0c.yml +0 -256
- data/lib/lucky_sneaks/unidecoder_data/x0d.yml +0 -256
- data/lib/lucky_sneaks/unidecoder_data/x0e.yml +0 -256
- data/lib/lucky_sneaks/unidecoder_data/x0f.yml +0 -256
- data/lib/lucky_sneaks/unidecoder_data/x10.yml +0 -256
- data/lib/lucky_sneaks/unidecoder_data/x11.yml +0 -256
- data/lib/lucky_sneaks/unidecoder_data/x12.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x13.yml +0 -256
- data/lib/lucky_sneaks/unidecoder_data/x14.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x15.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x16.yml +0 -256
- data/lib/lucky_sneaks/unidecoder_data/x17.yml +0 -256
- data/lib/lucky_sneaks/unidecoder_data/x18.yml +0 -256
- data/lib/lucky_sneaks/unidecoder_data/x1e.yml +0 -256
- data/lib/lucky_sneaks/unidecoder_data/x1f.yml +0 -256
- data/lib/lucky_sneaks/unidecoder_data/x20.yml +0 -256
- data/lib/lucky_sneaks/unidecoder_data/x21.yml +0 -256
- data/lib/lucky_sneaks/unidecoder_data/x22.yml +0 -256
- data/lib/lucky_sneaks/unidecoder_data/x23.yml +0 -256
- data/lib/lucky_sneaks/unidecoder_data/x24.yml +0 -256
- data/lib/lucky_sneaks/unidecoder_data/x25.yml +0 -256
- data/lib/lucky_sneaks/unidecoder_data/x26.yml +0 -256
- data/lib/lucky_sneaks/unidecoder_data/x27.yml +0 -256
- data/lib/lucky_sneaks/unidecoder_data/x28.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x2e.yml +0 -256
- data/lib/lucky_sneaks/unidecoder_data/x2f.yml +0 -256
- data/lib/lucky_sneaks/unidecoder_data/x30.yml +0 -256
- data/lib/lucky_sneaks/unidecoder_data/x31.yml +0 -256
- data/lib/lucky_sneaks/unidecoder_data/x32.yml +0 -256
- data/lib/lucky_sneaks/unidecoder_data/x33.yml +0 -256
- data/lib/lucky_sneaks/unidecoder_data/x4d.yml +0 -256
- data/lib/lucky_sneaks/unidecoder_data/x4e.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x4f.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x50.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x51.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x52.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x53.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x54.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x55.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x56.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x57.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x58.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x59.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x5a.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x5b.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x5c.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x5d.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x5e.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x5f.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x60.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x61.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x62.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x63.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x64.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x65.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x66.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x67.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x68.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x69.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x6a.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x6b.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x6c.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x6d.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x6e.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x6f.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x70.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x71.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x72.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x73.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x74.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x75.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x76.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x77.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x78.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x79.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x7a.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x7b.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x7c.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x7d.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x7e.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x7f.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x80.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x81.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x82.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x83.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x84.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x85.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x86.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x87.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x88.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x89.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x8a.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x8b.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x8c.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x8d.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x8e.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x8f.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x90.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x91.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x92.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x93.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x94.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x95.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x96.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x97.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x98.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x99.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x9a.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x9b.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x9c.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x9d.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x9e.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/x9f.yml +0 -256
- data/lib/lucky_sneaks/unidecoder_data/xa0.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/xa1.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/xa2.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/xa3.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/xa4.yml +0 -256
- data/lib/lucky_sneaks/unidecoder_data/xac.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/xad.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/xae.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/xaf.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/xb0.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/xb1.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/xb2.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/xb3.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/xb4.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/xb5.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/xb6.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/xb7.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/xb8.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/xb9.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/xba.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/xbb.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/xbc.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/xbd.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/xbe.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/xbf.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/xc0.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/xc1.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/xc2.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/xc3.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/xc4.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/xc5.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/xc6.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/xc7.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/xc8.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/xc9.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/xca.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/xcb.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/xcc.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/xcd.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/xce.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/xcf.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/xd0.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/xd1.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/xd2.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/xd3.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/xd4.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/xd5.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/xd6.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/xd7.yml +0 -256
- data/lib/lucky_sneaks/unidecoder_data/xf9.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/xfa.yml +0 -256
- data/lib/lucky_sneaks/unidecoder_data/xfb.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/xfc.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/xfd.yml +0 -256
- data/lib/lucky_sneaks/unidecoder_data/xfe.yml +0 -257
- data/lib/lucky_sneaks/unidecoder_data/xff.yml +0 -257
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
# encoding: UTF-8
|
|
2
|
-
module LuckySneaks
|
|
3
|
-
module ActsAsUrl # :nodoc:
|
|
4
|
-
def self.included(base)
|
|
5
|
-
base.extend ClassMethods
|
|
6
|
-
end
|
|
7
|
-
|
|
8
|
-
module ClassMethods # :doc:
|
|
9
|
-
# Creates a callback to automatically create an url-friendly representation
|
|
10
|
-
# of the <tt>attribute</tt> argument. Example:
|
|
11
|
-
#
|
|
12
|
-
# act_as_url :title
|
|
13
|
-
#
|
|
14
|
-
# will use the string contents of the <tt>title</tt> attribute
|
|
15
|
-
# to create the permalink. <strong>Note:</strong> you can also use a non-database-backed
|
|
16
|
-
# method to supply the string contents for the permalink. Just use that method's name
|
|
17
|
-
# as the argument as you would an attribute.
|
|
18
|
-
#
|
|
19
|
-
# The default attribute <tt>acts_as_url</tt> uses to save the permalink is <tt>url</tt>
|
|
20
|
-
# but this can be changed in the options hash. Available options are:
|
|
21
|
-
#
|
|
22
|
-
# <tt>:url_attribute</tt>:: The name of the attribute to use for storing the generated url string.
|
|
23
|
-
# Default is <tt>:url</tt>
|
|
24
|
-
# <tt>:scope</tt>:: The name of model attribute to scope unique urls to. There is no default here.
|
|
25
|
-
# <tt>:only_when_blank</tt>:: If true, the url generation will only happen when <tt>:url_attribute</tt> is
|
|
26
|
-
# blank. Default is false (meaning url generation will happen always)
|
|
27
|
-
# <tt>:sync_url</tt>:: If set to true, the url field will be updated when changes are made to the
|
|
28
|
-
# attribute it is based on. Default is false.
|
|
29
|
-
def acts_as_url(attribute, options = {})
|
|
30
|
-
cattr_accessor :attribute_to_urlify
|
|
31
|
-
cattr_accessor :scope_for_url
|
|
32
|
-
cattr_accessor :url_attribute # The attribute on the DB
|
|
33
|
-
cattr_accessor :only_when_blank
|
|
34
|
-
cattr_accessor :duplicate_count_separator
|
|
35
|
-
|
|
36
|
-
if options[:sync_url]
|
|
37
|
-
before_validation(:ensure_unique_url)
|
|
38
|
-
else
|
|
39
|
-
if defined?(ActiveModel::Callbacks)
|
|
40
|
-
before_validation(:ensure_unique_url, :on => :create)
|
|
41
|
-
else
|
|
42
|
-
before_validation_on_create(:ensure_unique_url)
|
|
43
|
-
end
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
self.attribute_to_urlify = attribute
|
|
47
|
-
self.scope_for_url = options[:scope]
|
|
48
|
-
self.url_attribute = options[:url_attribute] || "url"
|
|
49
|
-
self.only_when_blank = options[:only_when_blank] || false
|
|
50
|
-
self.duplicate_count_separator = options[:duplicate_count_separator] || "-"
|
|
51
|
-
|
|
52
|
-
class_eval <<-"END"
|
|
53
|
-
def #{url_attribute}
|
|
54
|
-
if !new_record? && errors[attribute_to_urlify].present?
|
|
55
|
-
self.class.find(id).send(url_attribute)
|
|
56
|
-
else
|
|
57
|
-
read_attribute(url_attribute)
|
|
58
|
-
end
|
|
59
|
-
end
|
|
60
|
-
END
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
# Initialize the url fields for the records that need it. Designed for people who add
|
|
64
|
-
# <tt>acts_as_url</tt> support once there's already development/production data they'd
|
|
65
|
-
# like to keep around.
|
|
66
|
-
#
|
|
67
|
-
# Note: This method can get very expensive, very fast. If you're planning on using this
|
|
68
|
-
# on a large selection, you will get much better results writing your own version with
|
|
69
|
-
# using pagination.
|
|
70
|
-
def initialize_urls
|
|
71
|
-
find(:all, :conditions => {self.url_attribute => nil}).each do |instance|
|
|
72
|
-
instance.send :ensure_unique_url
|
|
73
|
-
instance.save
|
|
74
|
-
end
|
|
75
|
-
end
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
private
|
|
79
|
-
|
|
80
|
-
def ensure_unique_url
|
|
81
|
-
url_attribute = self.class.url_attribute
|
|
82
|
-
separator = self.class.duplicate_count_separator
|
|
83
|
-
base_url = self.send(url_attribute)
|
|
84
|
-
base_url = self.send(self.class.attribute_to_urlify).to_s.to_url if base_url.blank? || !self.only_when_blank
|
|
85
|
-
conditions = ["#{url_attribute} LIKE ?", base_url+'%']
|
|
86
|
-
unless new_record?
|
|
87
|
-
conditions.first << " and id != ?"
|
|
88
|
-
conditions << id
|
|
89
|
-
end
|
|
90
|
-
if self.class.scope_for_url
|
|
91
|
-
conditions.first << " and #{self.class.scope_for_url} = ?"
|
|
92
|
-
conditions << send(self.class.scope_for_url)
|
|
93
|
-
end
|
|
94
|
-
url_owners = self.class.find(:all, :conditions => conditions)
|
|
95
|
-
write_attribute url_attribute, base_url
|
|
96
|
-
if url_owners.any?{|owner| owner.send(url_attribute) == base_url}
|
|
97
|
-
n = 1
|
|
98
|
-
while url_owners.any?{|owner| owner.send(url_attribute) == "#{base_url}#{separator}#{n}"}
|
|
99
|
-
n = n.succ
|
|
100
|
-
end
|
|
101
|
-
write_attribute url_attribute, "#{base_url}#{separator}#{n}"
|
|
102
|
-
end
|
|
103
|
-
end
|
|
104
|
-
end
|
|
105
|
-
end
|
|
@@ -1,196 +0,0 @@
|
|
|
1
|
-
# encoding: UTF-8
|
|
2
|
-
|
|
3
|
-
module LuckySneaks
|
|
4
|
-
# These methods are all added on String class.
|
|
5
|
-
module StringExtensions
|
|
6
|
-
def self.included(base) # :nodoc:
|
|
7
|
-
base.extend(ClassMethods)
|
|
8
|
-
end
|
|
9
|
-
|
|
10
|
-
# Returns the string converted (via Textile/RedCloth) to HTML format
|
|
11
|
-
# or self [with a friendly warning] if Redcloth is not available.
|
|
12
|
-
#
|
|
13
|
-
# Using <tt>:lite</tt> argument will cause RedCloth to not wrap the HTML in a container
|
|
14
|
-
# P element, which is useful behavior for generating header element text, etc.
|
|
15
|
-
# This is roughly equivalent to ActionView's <tt>textilize_without_paragraph</tt>
|
|
16
|
-
# except that it makes RedCloth do all the work instead of just gsubbing the return
|
|
17
|
-
# from RedCloth.
|
|
18
|
-
def to_html(lite_mode = false)
|
|
19
|
-
if defined?(RedCloth)
|
|
20
|
-
if lite_mode
|
|
21
|
-
RedCloth.new(self, [:lite_mode]).to_html
|
|
22
|
-
else
|
|
23
|
-
if self =~ /<pre>/
|
|
24
|
-
RedCloth.new(self).to_html.tr("\t", "")
|
|
25
|
-
else
|
|
26
|
-
RedCloth.new(self).to_html.tr("\t", "").gsub(/\n\n/, "")
|
|
27
|
-
end
|
|
28
|
-
end
|
|
29
|
-
else
|
|
30
|
-
warn "String#to_html was called without RedCloth being successfully required"
|
|
31
|
-
self
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
# Create a URI-friendly representation of the string. This is used internally by
|
|
36
|
-
# acts_as_url[link:classes/LuckySneaks/ActsAsUrl/ClassMethods.html#M000012]
|
|
37
|
-
# but can be called manually in order to generate an URI-friendly version of any string.
|
|
38
|
-
def to_url
|
|
39
|
-
remove_formatting.downcase.replace_whitespace("-").collapse("-")
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
# Performs multiple text manipulations. Essentially a shortcut for typing them all. View source
|
|
43
|
-
# below to see which methods are run.
|
|
44
|
-
def remove_formatting
|
|
45
|
-
strip_html_tags.convert_smart_punctuation.convert_accented_entities.convert_misc_entities.convert_misc_characters.to_ascii.collapse
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
# Removes HTML tags from text. This code is simplified from Tobias Luettke's regular expression
|
|
49
|
-
# in Typo[http://typosphere.org].
|
|
50
|
-
def strip_html_tags(leave_whitespace = false)
|
|
51
|
-
name = /[\w:_-]+/
|
|
52
|
-
value = /([A-Za-z0-9]+|('[^']*?'|"[^"]*?"))/
|
|
53
|
-
attr = /(#{name}(\s*=\s*#{value})?)/
|
|
54
|
-
rx = /<[!\/?\[]?(#{name}|--)(\s+(#{attr}(\s+#{attr})*))?\s*([!\/?\]]+|--)?>/
|
|
55
|
-
(leave_whitespace) ? gsub(rx, "").strip : gsub(rx, "").gsub(/\s+/, " ").strip
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
# Converts HTML entities into the respective non-accented letters. Examples:
|
|
59
|
-
#
|
|
60
|
-
# "á".convert_accented_entities # => "a"
|
|
61
|
-
# "ç".convert_accented_entities # => "c"
|
|
62
|
-
# "è".convert_accented_entities # => "e"
|
|
63
|
-
# "î".convert_accented_entities # => "i"
|
|
64
|
-
# "ø".convert_accented_entities # => "o"
|
|
65
|
-
# "ü".convert_accented_entities # => "u"
|
|
66
|
-
#
|
|
67
|
-
# Note: This does not do any conversion of Unicode/Ascii accented-characters. For that
|
|
68
|
-
# functionality please use <tt>to_ascii</tt>.
|
|
69
|
-
def convert_accented_entities
|
|
70
|
-
gsub(/&([A-Za-z])(grave|acute|circ|tilde|uml|ring|cedil|slash);/, '\1')
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
# Converts HTML entities (taken from common Textile/RedCloth formattings) into plain text formats.
|
|
74
|
-
#
|
|
75
|
-
# Note: This isn't an attempt at complete conversion of HTML entities, just those most likely
|
|
76
|
-
# to be generated by Textile.
|
|
77
|
-
def convert_misc_entities
|
|
78
|
-
dummy = dup
|
|
79
|
-
{
|
|
80
|
-
"#822[01]" => "\"",
|
|
81
|
-
"#821[67]" => "'",
|
|
82
|
-
"#8230" => "...",
|
|
83
|
-
"#8211" => "-",
|
|
84
|
-
"#8212" => "--",
|
|
85
|
-
"#215" => "x",
|
|
86
|
-
"gt" => ">",
|
|
87
|
-
"lt" => "<",
|
|
88
|
-
"(#8482|trade)" => "(tm)",
|
|
89
|
-
"(#174|reg)" => "(r)",
|
|
90
|
-
"(#169|copy)" => "(c)",
|
|
91
|
-
"(#38|amp)" => "and",
|
|
92
|
-
"nbsp" => " ",
|
|
93
|
-
"(#162|cent)" => " cent",
|
|
94
|
-
"(#163|pound)" => " pound",
|
|
95
|
-
"(#188|frac14)" => "one fourth",
|
|
96
|
-
"(#189|frac12)" => "half",
|
|
97
|
-
"(#190|frac34)" => "three fourths",
|
|
98
|
-
"(#176|deg)" => " degrees"
|
|
99
|
-
}.each do |textiled, normal|
|
|
100
|
-
dummy.gsub!(/&#{textiled};/, normal)
|
|
101
|
-
end
|
|
102
|
-
dummy.gsub(/&[^;]+;/, "")
|
|
103
|
-
end
|
|
104
|
-
|
|
105
|
-
# Converts MS Word 'smart punctuation' to ASCII
|
|
106
|
-
#
|
|
107
|
-
def convert_smart_punctuation
|
|
108
|
-
dummy = dup
|
|
109
|
-
{
|
|
110
|
-
|
|
111
|
-
"(“|”|\302\223|\302\224)" => '"',
|
|
112
|
-
"(‘|’|\302\221|\302\222)" => "'",
|
|
113
|
-
"…" => "...",
|
|
114
|
-
}.each do |smart, normal|
|
|
115
|
-
dummy.gsub!(/#{smart}/, normal)
|
|
116
|
-
end
|
|
117
|
-
dummy
|
|
118
|
-
end
|
|
119
|
-
|
|
120
|
-
# Converts various common plaintext characters to a more URI-friendly representation.
|
|
121
|
-
# Examples:
|
|
122
|
-
#
|
|
123
|
-
# "foo & bar".convert_misc_characters # => "foo and bar"
|
|
124
|
-
# "Chanel #9".convert_misc_characters # => "Chanel number nine"
|
|
125
|
-
# "user@host".convert_misc_characters # => "user at host"
|
|
126
|
-
# "google.com".convert_misc_characters # => "google dot com"
|
|
127
|
-
# "$10".convert_misc_characters # => "10 dollars"
|
|
128
|
-
# "*69".convert_misc_characters # => "star 69"
|
|
129
|
-
# "100%".convert_misc_characters # => "100 percent"
|
|
130
|
-
# "windows/mac/linux".convert_misc_characters # => "windows slash mac slash linux"
|
|
131
|
-
#
|
|
132
|
-
# Note: Because this method will convert any & symbols to the string "and",
|
|
133
|
-
# you should run any methods which convert HTML entities (convert_html_entities and convert_misc_entities)
|
|
134
|
-
# before running this method.
|
|
135
|
-
def convert_misc_characters
|
|
136
|
-
dummy = dup.gsub(/\.{3,}/, " dot dot dot ") # Catch ellipses before single dot rule!
|
|
137
|
-
# Special rules for money
|
|
138
|
-
{
|
|
139
|
-
/(\s|^)\$(\d+)\.(\d+)(\s|$)/ => '\2 dollars \3 cents',
|
|
140
|
-
/(\s|^)£(\d+)\.(\d+)(\s|$)/u => '\2 pounds \3 pence',
|
|
141
|
-
}.each do |found, replaced|
|
|
142
|
-
replaced = " #{replaced} " unless replaced =~ /\\1/
|
|
143
|
-
dummy.gsub!(found, replaced)
|
|
144
|
-
end
|
|
145
|
-
# Back to normal rules
|
|
146
|
-
{
|
|
147
|
-
/\s*&\s*/ => "and",
|
|
148
|
-
/\s*#/ => "number",
|
|
149
|
-
/\s*@\s*/ => "at",
|
|
150
|
-
/(\S|^)\.(\S)/ => '\1 dot \2',
|
|
151
|
-
/(\s|^)\$(\d*)(\s|$)/ => '\2 dollars',
|
|
152
|
-
/(\s|^)£(\d*)(\s|$)/u => '\2 pounds',
|
|
153
|
-
/(\s|^)¥(\d*)(\s|$)/u => '\2 yen',
|
|
154
|
-
/\s*\*\s*/ => "star",
|
|
155
|
-
/\s*%\s*/ => "percent",
|
|
156
|
-
/\s*(\\|\/)\s*/ => "slash",
|
|
157
|
-
/(\s*=\s*)/ => " equals ",
|
|
158
|
-
/\s*\+\s*/ => "plus"
|
|
159
|
-
}.each do |found, replaced|
|
|
160
|
-
replaced = " #{replaced} " unless replaced =~ /\\1/
|
|
161
|
-
dummy.gsub!(found, replaced)
|
|
162
|
-
end
|
|
163
|
-
dummy = dummy.gsub(/(^|\w)'(\w|$)/, '\1\2').gsub(/[\.,:;()\[\]\/\?!\^'"_]/, " ")
|
|
164
|
-
end
|
|
165
|
-
|
|
166
|
-
# Replace runs of whitespace in string. Defaults to a single space but any replacement
|
|
167
|
-
# string may be specified as an argument. Examples:
|
|
168
|
-
#
|
|
169
|
-
# "Foo bar".replace_whitespace # => "Foo bar"
|
|
170
|
-
# "Foo bar".replace_whitespace("-") # => "Foo-bar"
|
|
171
|
-
def replace_whitespace(replace = " ")
|
|
172
|
-
gsub(/\s+/, replace)
|
|
173
|
-
end
|
|
174
|
-
|
|
175
|
-
# Removes specified character from the beginning and/or end of the string and then performs
|
|
176
|
-
# <tt>String#squeeze(character)</tt>, condensing runs of the character within the string.
|
|
177
|
-
#
|
|
178
|
-
# Note: This method has been superceded by ActiveSupport's squish method.
|
|
179
|
-
def collapse(character = " ")
|
|
180
|
-
sub(/^#{character}*/, "").sub(/#{character}*$/, "").squeeze(character)
|
|
181
|
-
end
|
|
182
|
-
|
|
183
|
-
module ClassMethods
|
|
184
|
-
# Returns string of random characters with a length matching the specified limit. Excludes 0
|
|
185
|
-
# to avoid confusion between 0 and O.
|
|
186
|
-
def random(limit)
|
|
187
|
-
strong_alphanumerics = %w{
|
|
188
|
-
a b c d e f g h i j k l m n o p q r s t u v w x y z
|
|
189
|
-
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
|
|
190
|
-
1 2 3 4 5 6 7 8 9
|
|
191
|
-
}
|
|
192
|
-
Array.new(limit, "").collect{strong_alphanumerics[rand(61)]}.join
|
|
193
|
-
end
|
|
194
|
-
end
|
|
195
|
-
end
|
|
196
|
-
end
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
# encoding: UTF-8
|
|
2
|
-
require "yaml"
|
|
3
|
-
|
|
4
|
-
module LuckySneaks
|
|
5
|
-
module Unidecoder
|
|
6
|
-
# Contains Unicode codepoints, loading as needed from YAML files
|
|
7
|
-
CODEPOINTS = Hash.new { |h, k|
|
|
8
|
-
h[k] = YAML::load_file(File.join(File.expand_path(File.dirname(__FILE__)), "unidecoder_data", "#{k}.yml"))
|
|
9
|
-
} unless defined?(CODEPOINTS)
|
|
10
|
-
|
|
11
|
-
class << self
|
|
12
|
-
# Returns string with its UTF-8 characters transliterated to ASCII ones
|
|
13
|
-
#
|
|
14
|
-
# You're probably better off just using the added String#to_ascii
|
|
15
|
-
def decode(string)
|
|
16
|
-
string.gsub(/[^\x00-\x7f]/u) do |codepoint|
|
|
17
|
-
begin
|
|
18
|
-
unpacked = codepoint.unpack("U")[0]
|
|
19
|
-
CODEPOINTS[code_group(unpacked)][grouped_point(unpacked)]
|
|
20
|
-
rescue
|
|
21
|
-
# Hopefully this won't come up much
|
|
22
|
-
"?"
|
|
23
|
-
end
|
|
24
|
-
end
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
# Returns character for the given Unicode codepoint
|
|
28
|
-
def encode(codepoint)
|
|
29
|
-
["0x#{codepoint}".to_i(16)].pack("U")
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
# Returns string indicating which file (and line) contains the
|
|
33
|
-
# transliteration value for the character
|
|
34
|
-
def in_yaml_file(character)
|
|
35
|
-
unpacked = character.unpack("U")[0]
|
|
36
|
-
"#{code_group(unpacked)}.yml (line #{grouped_point(unpacked) + 2})"
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
private
|
|
40
|
-
# Returns the Unicode codepoint grouping for the given character
|
|
41
|
-
def code_group(unpacked_character)
|
|
42
|
-
"x%02x" % (unpacked_character >> 8)
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
# Returns the index of the given character in the YAML file for its codepoint group
|
|
46
|
-
def grouped_point(unpacked_character)
|
|
47
|
-
unpacked_character & 255
|
|
48
|
-
end
|
|
49
|
-
end
|
|
50
|
-
end
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
module LuckySneaks
|
|
54
|
-
module StringExtensions
|
|
55
|
-
# Returns string with its UTF-8 characters transliterated to ASCII ones. Example:
|
|
56
|
-
#
|
|
57
|
-
# "⠋⠗⠁⠝⠉⠑".to_ascii #=> "braille"
|
|
58
|
-
def to_ascii
|
|
59
|
-
LuckySneaks::Unidecoder.decode(self)
|
|
60
|
-
end
|
|
61
|
-
end
|
|
62
|
-
end
|
|
@@ -1,257 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
- "\x00"
|
|
3
|
-
- "\x01"
|
|
4
|
-
- "\x02"
|
|
5
|
-
- "\x03"
|
|
6
|
-
- "\x04"
|
|
7
|
-
- "\x05"
|
|
8
|
-
- "\x06"
|
|
9
|
-
- "\a"
|
|
10
|
-
- "\x08"
|
|
11
|
-
- ' '
|
|
12
|
-
- "\n"
|
|
13
|
-
- "\v"
|
|
14
|
-
- "\f"
|
|
15
|
-
- "\r"
|
|
16
|
-
- "\x0e"
|
|
17
|
-
- "\x0f"
|
|
18
|
-
- "\x10"
|
|
19
|
-
- "\x11"
|
|
20
|
-
- "\x12"
|
|
21
|
-
- "\x13"
|
|
22
|
-
- "\x14"
|
|
23
|
-
- "\x15"
|
|
24
|
-
- "\x16"
|
|
25
|
-
- "\x17"
|
|
26
|
-
- "\x18"
|
|
27
|
-
- "\x19"
|
|
28
|
-
- "\x1a"
|
|
29
|
-
- "\e"
|
|
30
|
-
- "\x1c"
|
|
31
|
-
- "\x1d"
|
|
32
|
-
- "\x1e"
|
|
33
|
-
- "\x1f"
|
|
34
|
-
- ' '
|
|
35
|
-
- '!'
|
|
36
|
-
- '"'
|
|
37
|
-
- '#'
|
|
38
|
-
- $
|
|
39
|
-
- '%'
|
|
40
|
-
- '&'
|
|
41
|
-
- "'"
|
|
42
|
-
- (
|
|
43
|
-
- )
|
|
44
|
-
- '*'
|
|
45
|
-
- +
|
|
46
|
-
- ','
|
|
47
|
-
- '-'
|
|
48
|
-
- .
|
|
49
|
-
- /
|
|
50
|
-
- 0
|
|
51
|
-
- 1
|
|
52
|
-
- 2
|
|
53
|
-
- 3
|
|
54
|
-
- 4
|
|
55
|
-
- 5
|
|
56
|
-
- 6
|
|
57
|
-
- 7
|
|
58
|
-
- 8
|
|
59
|
-
- 9
|
|
60
|
-
- ':'
|
|
61
|
-
- ;
|
|
62
|
-
- <
|
|
63
|
-
- '='
|
|
64
|
-
- '>'
|
|
65
|
-
- '?'
|
|
66
|
-
- '@'
|
|
67
|
-
- A
|
|
68
|
-
- B
|
|
69
|
-
- C
|
|
70
|
-
- D
|
|
71
|
-
- E
|
|
72
|
-
- F
|
|
73
|
-
- G
|
|
74
|
-
- H
|
|
75
|
-
- I
|
|
76
|
-
- J
|
|
77
|
-
- K
|
|
78
|
-
- L
|
|
79
|
-
- M
|
|
80
|
-
- N
|
|
81
|
-
- O
|
|
82
|
-
- P
|
|
83
|
-
- Q
|
|
84
|
-
- R
|
|
85
|
-
- S
|
|
86
|
-
- T
|
|
87
|
-
- U
|
|
88
|
-
- V
|
|
89
|
-
- W
|
|
90
|
-
- X
|
|
91
|
-
- Y
|
|
92
|
-
- Z
|
|
93
|
-
- ']'
|
|
94
|
-
- \
|
|
95
|
-
- ']'
|
|
96
|
-
- '^'
|
|
97
|
-
- _
|
|
98
|
-
- '`'
|
|
99
|
-
- a
|
|
100
|
-
- b
|
|
101
|
-
- c
|
|
102
|
-
- d
|
|
103
|
-
- e
|
|
104
|
-
- f
|
|
105
|
-
- g
|
|
106
|
-
- h
|
|
107
|
-
- i
|
|
108
|
-
- j
|
|
109
|
-
- k
|
|
110
|
-
- l
|
|
111
|
-
- m
|
|
112
|
-
- n
|
|
113
|
-
- o
|
|
114
|
-
- p
|
|
115
|
-
- q
|
|
116
|
-
- r
|
|
117
|
-
- s
|
|
118
|
-
- t
|
|
119
|
-
- u
|
|
120
|
-
- v
|
|
121
|
-
- w
|
|
122
|
-
- x
|
|
123
|
-
- y
|
|
124
|
-
- z
|
|
125
|
-
- '{'
|
|
126
|
-
- '|'
|
|
127
|
-
- '}'
|
|
128
|
-
- '~'
|
|
129
|
-
- ''
|
|
130
|
-
- ''
|
|
131
|
-
- ''
|
|
132
|
-
- ''
|
|
133
|
-
- ''
|
|
134
|
-
- ''
|
|
135
|
-
- ''
|
|
136
|
-
- ''
|
|
137
|
-
- ''
|
|
138
|
-
- ''
|
|
139
|
-
- ''
|
|
140
|
-
- ''
|
|
141
|
-
- ''
|
|
142
|
-
- ''
|
|
143
|
-
- ''
|
|
144
|
-
- ''
|
|
145
|
-
- ''
|
|
146
|
-
- ''
|
|
147
|
-
- "'"
|
|
148
|
-
- "'"
|
|
149
|
-
- '"'
|
|
150
|
-
- '"'
|
|
151
|
-
- ''
|
|
152
|
-
- ''
|
|
153
|
-
- ''
|
|
154
|
-
- ''
|
|
155
|
-
- ''
|
|
156
|
-
- ''
|
|
157
|
-
- ''
|
|
158
|
-
- ''
|
|
159
|
-
- ''
|
|
160
|
-
- ''
|
|
161
|
-
- ''
|
|
162
|
-
- ' '
|
|
163
|
-
- ''
|
|
164
|
-
- C/
|
|
165
|
-
- PS
|
|
166
|
-
- $?
|
|
167
|
-
- Y=
|
|
168
|
-
- '|'
|
|
169
|
-
- SS
|
|
170
|
-
- '"'
|
|
171
|
-
- (c)
|
|
172
|
-
- a
|
|
173
|
-
- '<<'
|
|
174
|
-
- '!'
|
|
175
|
-
- ''
|
|
176
|
-
- (r)
|
|
177
|
-
- '-'
|
|
178
|
-
- deg
|
|
179
|
-
- +-
|
|
180
|
-
- 2
|
|
181
|
-
- 3
|
|
182
|
-
- "'"
|
|
183
|
-
- u
|
|
184
|
-
- P
|
|
185
|
-
- '*'
|
|
186
|
-
- ','
|
|
187
|
-
- 1
|
|
188
|
-
- o
|
|
189
|
-
- '>>'
|
|
190
|
-
- 1/4
|
|
191
|
-
- 1/2
|
|
192
|
-
- 3/4
|
|
193
|
-
- ''
|
|
194
|
-
- A
|
|
195
|
-
- A
|
|
196
|
-
- A
|
|
197
|
-
- A
|
|
198
|
-
- A
|
|
199
|
-
- A
|
|
200
|
-
- AE
|
|
201
|
-
- C
|
|
202
|
-
- E
|
|
203
|
-
- E
|
|
204
|
-
- E
|
|
205
|
-
- E
|
|
206
|
-
- I
|
|
207
|
-
- I
|
|
208
|
-
- I
|
|
209
|
-
- I
|
|
210
|
-
- D
|
|
211
|
-
- N
|
|
212
|
-
- O
|
|
213
|
-
- O
|
|
214
|
-
- O
|
|
215
|
-
- O
|
|
216
|
-
- O
|
|
217
|
-
- x
|
|
218
|
-
- O
|
|
219
|
-
- U
|
|
220
|
-
- U
|
|
221
|
-
- U
|
|
222
|
-
- U
|
|
223
|
-
- Y
|
|
224
|
-
- Th
|
|
225
|
-
- ss
|
|
226
|
-
- a
|
|
227
|
-
- a
|
|
228
|
-
- a
|
|
229
|
-
- a
|
|
230
|
-
- a
|
|
231
|
-
- a
|
|
232
|
-
- ae
|
|
233
|
-
- c
|
|
234
|
-
- e
|
|
235
|
-
- e
|
|
236
|
-
- e
|
|
237
|
-
- e
|
|
238
|
-
- i
|
|
239
|
-
- i
|
|
240
|
-
- i
|
|
241
|
-
- i
|
|
242
|
-
- d
|
|
243
|
-
- n
|
|
244
|
-
- o
|
|
245
|
-
- o
|
|
246
|
-
- o
|
|
247
|
-
- o
|
|
248
|
-
- o
|
|
249
|
-
- /
|
|
250
|
-
- o
|
|
251
|
-
- u
|
|
252
|
-
- u
|
|
253
|
-
- u
|
|
254
|
-
- u
|
|
255
|
-
- y
|
|
256
|
-
- th
|
|
257
|
-
- y
|