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.
Files changed (189) hide show
  1. data/README.rdoc +35 -22
  2. data/Rakefile +2 -2
  3. data/lib/stringex.rb +5 -5
  4. data/stringex.gemspec +3 -186
  5. data/test/unidecoder_test.rb +4 -4
  6. metadata +5 -188
  7. data/lib/lucky_sneaks/acts_as_url.rb +0 -105
  8. data/lib/lucky_sneaks/string_extensions.rb +0 -196
  9. data/lib/lucky_sneaks/unidecoder.rb +0 -62
  10. data/lib/lucky_sneaks/unidecoder_data/x00.yml +0 -257
  11. data/lib/lucky_sneaks/unidecoder_data/x01.yml +0 -257
  12. data/lib/lucky_sneaks/unidecoder_data/x02.yml +0 -256
  13. data/lib/lucky_sneaks/unidecoder_data/x03.yml +0 -256
  14. data/lib/lucky_sneaks/unidecoder_data/x04.yml +0 -256
  15. data/lib/lucky_sneaks/unidecoder_data/x05.yml +0 -256
  16. data/lib/lucky_sneaks/unidecoder_data/x06.yml +0 -256
  17. data/lib/lucky_sneaks/unidecoder_data/x07.yml +0 -256
  18. data/lib/lucky_sneaks/unidecoder_data/x09.yml +0 -256
  19. data/lib/lucky_sneaks/unidecoder_data/x0a.yml +0 -256
  20. data/lib/lucky_sneaks/unidecoder_data/x0b.yml +0 -256
  21. data/lib/lucky_sneaks/unidecoder_data/x0c.yml +0 -256
  22. data/lib/lucky_sneaks/unidecoder_data/x0d.yml +0 -256
  23. data/lib/lucky_sneaks/unidecoder_data/x0e.yml +0 -256
  24. data/lib/lucky_sneaks/unidecoder_data/x0f.yml +0 -256
  25. data/lib/lucky_sneaks/unidecoder_data/x10.yml +0 -256
  26. data/lib/lucky_sneaks/unidecoder_data/x11.yml +0 -256
  27. data/lib/lucky_sneaks/unidecoder_data/x12.yml +0 -257
  28. data/lib/lucky_sneaks/unidecoder_data/x13.yml +0 -256
  29. data/lib/lucky_sneaks/unidecoder_data/x14.yml +0 -257
  30. data/lib/lucky_sneaks/unidecoder_data/x15.yml +0 -257
  31. data/lib/lucky_sneaks/unidecoder_data/x16.yml +0 -256
  32. data/lib/lucky_sneaks/unidecoder_data/x17.yml +0 -256
  33. data/lib/lucky_sneaks/unidecoder_data/x18.yml +0 -256
  34. data/lib/lucky_sneaks/unidecoder_data/x1e.yml +0 -256
  35. data/lib/lucky_sneaks/unidecoder_data/x1f.yml +0 -256
  36. data/lib/lucky_sneaks/unidecoder_data/x20.yml +0 -256
  37. data/lib/lucky_sneaks/unidecoder_data/x21.yml +0 -256
  38. data/lib/lucky_sneaks/unidecoder_data/x22.yml +0 -256
  39. data/lib/lucky_sneaks/unidecoder_data/x23.yml +0 -256
  40. data/lib/lucky_sneaks/unidecoder_data/x24.yml +0 -256
  41. data/lib/lucky_sneaks/unidecoder_data/x25.yml +0 -256
  42. data/lib/lucky_sneaks/unidecoder_data/x26.yml +0 -256
  43. data/lib/lucky_sneaks/unidecoder_data/x27.yml +0 -256
  44. data/lib/lucky_sneaks/unidecoder_data/x28.yml +0 -257
  45. data/lib/lucky_sneaks/unidecoder_data/x2e.yml +0 -256
  46. data/lib/lucky_sneaks/unidecoder_data/x2f.yml +0 -256
  47. data/lib/lucky_sneaks/unidecoder_data/x30.yml +0 -256
  48. data/lib/lucky_sneaks/unidecoder_data/x31.yml +0 -256
  49. data/lib/lucky_sneaks/unidecoder_data/x32.yml +0 -256
  50. data/lib/lucky_sneaks/unidecoder_data/x33.yml +0 -256
  51. data/lib/lucky_sneaks/unidecoder_data/x4d.yml +0 -256
  52. data/lib/lucky_sneaks/unidecoder_data/x4e.yml +0 -257
  53. data/lib/lucky_sneaks/unidecoder_data/x4f.yml +0 -257
  54. data/lib/lucky_sneaks/unidecoder_data/x50.yml +0 -257
  55. data/lib/lucky_sneaks/unidecoder_data/x51.yml +0 -257
  56. data/lib/lucky_sneaks/unidecoder_data/x52.yml +0 -257
  57. data/lib/lucky_sneaks/unidecoder_data/x53.yml +0 -257
  58. data/lib/lucky_sneaks/unidecoder_data/x54.yml +0 -257
  59. data/lib/lucky_sneaks/unidecoder_data/x55.yml +0 -257
  60. data/lib/lucky_sneaks/unidecoder_data/x56.yml +0 -257
  61. data/lib/lucky_sneaks/unidecoder_data/x57.yml +0 -257
  62. data/lib/lucky_sneaks/unidecoder_data/x58.yml +0 -257
  63. data/lib/lucky_sneaks/unidecoder_data/x59.yml +0 -257
  64. data/lib/lucky_sneaks/unidecoder_data/x5a.yml +0 -257
  65. data/lib/lucky_sneaks/unidecoder_data/x5b.yml +0 -257
  66. data/lib/lucky_sneaks/unidecoder_data/x5c.yml +0 -257
  67. data/lib/lucky_sneaks/unidecoder_data/x5d.yml +0 -257
  68. data/lib/lucky_sneaks/unidecoder_data/x5e.yml +0 -257
  69. data/lib/lucky_sneaks/unidecoder_data/x5f.yml +0 -257
  70. data/lib/lucky_sneaks/unidecoder_data/x60.yml +0 -257
  71. data/lib/lucky_sneaks/unidecoder_data/x61.yml +0 -257
  72. data/lib/lucky_sneaks/unidecoder_data/x62.yml +0 -257
  73. data/lib/lucky_sneaks/unidecoder_data/x63.yml +0 -257
  74. data/lib/lucky_sneaks/unidecoder_data/x64.yml +0 -257
  75. data/lib/lucky_sneaks/unidecoder_data/x65.yml +0 -257
  76. data/lib/lucky_sneaks/unidecoder_data/x66.yml +0 -257
  77. data/lib/lucky_sneaks/unidecoder_data/x67.yml +0 -257
  78. data/lib/lucky_sneaks/unidecoder_data/x68.yml +0 -257
  79. data/lib/lucky_sneaks/unidecoder_data/x69.yml +0 -257
  80. data/lib/lucky_sneaks/unidecoder_data/x6a.yml +0 -257
  81. data/lib/lucky_sneaks/unidecoder_data/x6b.yml +0 -257
  82. data/lib/lucky_sneaks/unidecoder_data/x6c.yml +0 -257
  83. data/lib/lucky_sneaks/unidecoder_data/x6d.yml +0 -257
  84. data/lib/lucky_sneaks/unidecoder_data/x6e.yml +0 -257
  85. data/lib/lucky_sneaks/unidecoder_data/x6f.yml +0 -257
  86. data/lib/lucky_sneaks/unidecoder_data/x70.yml +0 -257
  87. data/lib/lucky_sneaks/unidecoder_data/x71.yml +0 -257
  88. data/lib/lucky_sneaks/unidecoder_data/x72.yml +0 -257
  89. data/lib/lucky_sneaks/unidecoder_data/x73.yml +0 -257
  90. data/lib/lucky_sneaks/unidecoder_data/x74.yml +0 -257
  91. data/lib/lucky_sneaks/unidecoder_data/x75.yml +0 -257
  92. data/lib/lucky_sneaks/unidecoder_data/x76.yml +0 -257
  93. data/lib/lucky_sneaks/unidecoder_data/x77.yml +0 -257
  94. data/lib/lucky_sneaks/unidecoder_data/x78.yml +0 -257
  95. data/lib/lucky_sneaks/unidecoder_data/x79.yml +0 -257
  96. data/lib/lucky_sneaks/unidecoder_data/x7a.yml +0 -257
  97. data/lib/lucky_sneaks/unidecoder_data/x7b.yml +0 -257
  98. data/lib/lucky_sneaks/unidecoder_data/x7c.yml +0 -257
  99. data/lib/lucky_sneaks/unidecoder_data/x7d.yml +0 -257
  100. data/lib/lucky_sneaks/unidecoder_data/x7e.yml +0 -257
  101. data/lib/lucky_sneaks/unidecoder_data/x7f.yml +0 -257
  102. data/lib/lucky_sneaks/unidecoder_data/x80.yml +0 -257
  103. data/lib/lucky_sneaks/unidecoder_data/x81.yml +0 -257
  104. data/lib/lucky_sneaks/unidecoder_data/x82.yml +0 -257
  105. data/lib/lucky_sneaks/unidecoder_data/x83.yml +0 -257
  106. data/lib/lucky_sneaks/unidecoder_data/x84.yml +0 -257
  107. data/lib/lucky_sneaks/unidecoder_data/x85.yml +0 -257
  108. data/lib/lucky_sneaks/unidecoder_data/x86.yml +0 -257
  109. data/lib/lucky_sneaks/unidecoder_data/x87.yml +0 -257
  110. data/lib/lucky_sneaks/unidecoder_data/x88.yml +0 -257
  111. data/lib/lucky_sneaks/unidecoder_data/x89.yml +0 -257
  112. data/lib/lucky_sneaks/unidecoder_data/x8a.yml +0 -257
  113. data/lib/lucky_sneaks/unidecoder_data/x8b.yml +0 -257
  114. data/lib/lucky_sneaks/unidecoder_data/x8c.yml +0 -257
  115. data/lib/lucky_sneaks/unidecoder_data/x8d.yml +0 -257
  116. data/lib/lucky_sneaks/unidecoder_data/x8e.yml +0 -257
  117. data/lib/lucky_sneaks/unidecoder_data/x8f.yml +0 -257
  118. data/lib/lucky_sneaks/unidecoder_data/x90.yml +0 -257
  119. data/lib/lucky_sneaks/unidecoder_data/x91.yml +0 -257
  120. data/lib/lucky_sneaks/unidecoder_data/x92.yml +0 -257
  121. data/lib/lucky_sneaks/unidecoder_data/x93.yml +0 -257
  122. data/lib/lucky_sneaks/unidecoder_data/x94.yml +0 -257
  123. data/lib/lucky_sneaks/unidecoder_data/x95.yml +0 -257
  124. data/lib/lucky_sneaks/unidecoder_data/x96.yml +0 -257
  125. data/lib/lucky_sneaks/unidecoder_data/x97.yml +0 -257
  126. data/lib/lucky_sneaks/unidecoder_data/x98.yml +0 -257
  127. data/lib/lucky_sneaks/unidecoder_data/x99.yml +0 -257
  128. data/lib/lucky_sneaks/unidecoder_data/x9a.yml +0 -257
  129. data/lib/lucky_sneaks/unidecoder_data/x9b.yml +0 -257
  130. data/lib/lucky_sneaks/unidecoder_data/x9c.yml +0 -257
  131. data/lib/lucky_sneaks/unidecoder_data/x9d.yml +0 -257
  132. data/lib/lucky_sneaks/unidecoder_data/x9e.yml +0 -257
  133. data/lib/lucky_sneaks/unidecoder_data/x9f.yml +0 -256
  134. data/lib/lucky_sneaks/unidecoder_data/xa0.yml +0 -257
  135. data/lib/lucky_sneaks/unidecoder_data/xa1.yml +0 -257
  136. data/lib/lucky_sneaks/unidecoder_data/xa2.yml +0 -257
  137. data/lib/lucky_sneaks/unidecoder_data/xa3.yml +0 -257
  138. data/lib/lucky_sneaks/unidecoder_data/xa4.yml +0 -256
  139. data/lib/lucky_sneaks/unidecoder_data/xac.yml +0 -257
  140. data/lib/lucky_sneaks/unidecoder_data/xad.yml +0 -257
  141. data/lib/lucky_sneaks/unidecoder_data/xae.yml +0 -257
  142. data/lib/lucky_sneaks/unidecoder_data/xaf.yml +0 -257
  143. data/lib/lucky_sneaks/unidecoder_data/xb0.yml +0 -257
  144. data/lib/lucky_sneaks/unidecoder_data/xb1.yml +0 -257
  145. data/lib/lucky_sneaks/unidecoder_data/xb2.yml +0 -257
  146. data/lib/lucky_sneaks/unidecoder_data/xb3.yml +0 -257
  147. data/lib/lucky_sneaks/unidecoder_data/xb4.yml +0 -257
  148. data/lib/lucky_sneaks/unidecoder_data/xb5.yml +0 -257
  149. data/lib/lucky_sneaks/unidecoder_data/xb6.yml +0 -257
  150. data/lib/lucky_sneaks/unidecoder_data/xb7.yml +0 -257
  151. data/lib/lucky_sneaks/unidecoder_data/xb8.yml +0 -257
  152. data/lib/lucky_sneaks/unidecoder_data/xb9.yml +0 -257
  153. data/lib/lucky_sneaks/unidecoder_data/xba.yml +0 -257
  154. data/lib/lucky_sneaks/unidecoder_data/xbb.yml +0 -257
  155. data/lib/lucky_sneaks/unidecoder_data/xbc.yml +0 -257
  156. data/lib/lucky_sneaks/unidecoder_data/xbd.yml +0 -257
  157. data/lib/lucky_sneaks/unidecoder_data/xbe.yml +0 -257
  158. data/lib/lucky_sneaks/unidecoder_data/xbf.yml +0 -257
  159. data/lib/lucky_sneaks/unidecoder_data/xc0.yml +0 -257
  160. data/lib/lucky_sneaks/unidecoder_data/xc1.yml +0 -257
  161. data/lib/lucky_sneaks/unidecoder_data/xc2.yml +0 -257
  162. data/lib/lucky_sneaks/unidecoder_data/xc3.yml +0 -257
  163. data/lib/lucky_sneaks/unidecoder_data/xc4.yml +0 -257
  164. data/lib/lucky_sneaks/unidecoder_data/xc5.yml +0 -257
  165. data/lib/lucky_sneaks/unidecoder_data/xc6.yml +0 -257
  166. data/lib/lucky_sneaks/unidecoder_data/xc7.yml +0 -257
  167. data/lib/lucky_sneaks/unidecoder_data/xc8.yml +0 -257
  168. data/lib/lucky_sneaks/unidecoder_data/xc9.yml +0 -257
  169. data/lib/lucky_sneaks/unidecoder_data/xca.yml +0 -257
  170. data/lib/lucky_sneaks/unidecoder_data/xcb.yml +0 -257
  171. data/lib/lucky_sneaks/unidecoder_data/xcc.yml +0 -257
  172. data/lib/lucky_sneaks/unidecoder_data/xcd.yml +0 -257
  173. data/lib/lucky_sneaks/unidecoder_data/xce.yml +0 -257
  174. data/lib/lucky_sneaks/unidecoder_data/xcf.yml +0 -257
  175. data/lib/lucky_sneaks/unidecoder_data/xd0.yml +0 -257
  176. data/lib/lucky_sneaks/unidecoder_data/xd1.yml +0 -257
  177. data/lib/lucky_sneaks/unidecoder_data/xd2.yml +0 -257
  178. data/lib/lucky_sneaks/unidecoder_data/xd3.yml +0 -257
  179. data/lib/lucky_sneaks/unidecoder_data/xd4.yml +0 -257
  180. data/lib/lucky_sneaks/unidecoder_data/xd5.yml +0 -257
  181. data/lib/lucky_sneaks/unidecoder_data/xd6.yml +0 -257
  182. data/lib/lucky_sneaks/unidecoder_data/xd7.yml +0 -256
  183. data/lib/lucky_sneaks/unidecoder_data/xf9.yml +0 -257
  184. data/lib/lucky_sneaks/unidecoder_data/xfa.yml +0 -256
  185. data/lib/lucky_sneaks/unidecoder_data/xfb.yml +0 -257
  186. data/lib/lucky_sneaks/unidecoder_data/xfc.yml +0 -257
  187. data/lib/lucky_sneaks/unidecoder_data/xfd.yml +0 -256
  188. data/lib/lucky_sneaks/unidecoder_data/xfe.yml +0 -257
  189. 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
- # "&aacute;".convert_accented_entities # => "a"
61
- # "&ccedil;".convert_accented_entities # => "c"
62
- # "&egrave;".convert_accented_entities # => "e"
63
- # "&icirc;".convert_accented_entities # => "i"
64
- # "&oslash;".convert_accented_entities # => "o"
65
- # "&uuml;".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