knitkit 2.0.4 → 2.0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (196) hide show
  1. data/app/models/document.rb +18 -1
  2. data/app/models/website.rb +6 -4
  3. data/app/widgets/contact_us/base.rb +1 -1
  4. data/app/widgets/search/base.rb +6 -6
  5. data/db/migrate/20120628165503_add_dynamic_attributes_to_documents.rb +5 -0
  6. data/lib/knitkit/engine.rb +0 -1
  7. data/lib/knitkit/version.rb +1 -1
  8. data/lib/knitkit.rb +1 -0
  9. data/lib/permalink_fu/README.markdown +64 -0
  10. data/lib/permalink_fu/init.rb +1 -0
  11. data/lib/permalink_fu/lib/data/x00.yml +257 -0
  12. data/lib/permalink_fu/lib/data/x01.yml +257 -0
  13. data/lib/permalink_fu/lib/data/x02.yml +256 -0
  14. data/lib/permalink_fu/lib/data/x03.yml +256 -0
  15. data/lib/permalink_fu/lib/data/x04.yml +256 -0
  16. data/lib/permalink_fu/lib/data/x05.yml +256 -0
  17. data/lib/permalink_fu/lib/data/x06.yml +256 -0
  18. data/lib/permalink_fu/lib/data/x07.yml +256 -0
  19. data/lib/permalink_fu/lib/data/x09.yml +256 -0
  20. data/lib/permalink_fu/lib/data/x0a.yml +256 -0
  21. data/lib/permalink_fu/lib/data/x0b.yml +256 -0
  22. data/lib/permalink_fu/lib/data/x0c.yml +256 -0
  23. data/lib/permalink_fu/lib/data/x0d.yml +256 -0
  24. data/lib/permalink_fu/lib/data/x0e.yml +256 -0
  25. data/lib/permalink_fu/lib/data/x0f.yml +256 -0
  26. data/lib/permalink_fu/lib/data/x10.yml +256 -0
  27. data/lib/permalink_fu/lib/data/x11.yml +256 -0
  28. data/lib/permalink_fu/lib/data/x12.yml +257 -0
  29. data/lib/permalink_fu/lib/data/x13.yml +256 -0
  30. data/lib/permalink_fu/lib/data/x14.yml +257 -0
  31. data/lib/permalink_fu/lib/data/x15.yml +257 -0
  32. data/lib/permalink_fu/lib/data/x16.yml +256 -0
  33. data/lib/permalink_fu/lib/data/x17.yml +256 -0
  34. data/lib/permalink_fu/lib/data/x18.yml +256 -0
  35. data/lib/permalink_fu/lib/data/x1e.yml +256 -0
  36. data/lib/permalink_fu/lib/data/x1f.yml +256 -0
  37. data/lib/permalink_fu/lib/data/x20.yml +256 -0
  38. data/lib/permalink_fu/lib/data/x21.yml +256 -0
  39. data/lib/permalink_fu/lib/data/x22.yml +256 -0
  40. data/lib/permalink_fu/lib/data/x23.yml +256 -0
  41. data/lib/permalink_fu/lib/data/x24.yml +256 -0
  42. data/lib/permalink_fu/lib/data/x25.yml +256 -0
  43. data/lib/permalink_fu/lib/data/x26.yml +256 -0
  44. data/lib/permalink_fu/lib/data/x27.yml +256 -0
  45. data/lib/permalink_fu/lib/data/x28.yml +257 -0
  46. data/lib/permalink_fu/lib/data/x2e.yml +256 -0
  47. data/lib/permalink_fu/lib/data/x2f.yml +256 -0
  48. data/lib/permalink_fu/lib/data/x30.yml +256 -0
  49. data/lib/permalink_fu/lib/data/x31.yml +256 -0
  50. data/lib/permalink_fu/lib/data/x32.yml +256 -0
  51. data/lib/permalink_fu/lib/data/x33.yml +256 -0
  52. data/lib/permalink_fu/lib/data/x4d.yml +256 -0
  53. data/lib/permalink_fu/lib/data/x4e.yml +257 -0
  54. data/lib/permalink_fu/lib/data/x4f.yml +257 -0
  55. data/lib/permalink_fu/lib/data/x50.yml +257 -0
  56. data/lib/permalink_fu/lib/data/x51.yml +257 -0
  57. data/lib/permalink_fu/lib/data/x52.yml +257 -0
  58. data/lib/permalink_fu/lib/data/x53.yml +257 -0
  59. data/lib/permalink_fu/lib/data/x54.yml +257 -0
  60. data/lib/permalink_fu/lib/data/x55.yml +257 -0
  61. data/lib/permalink_fu/lib/data/x56.yml +257 -0
  62. data/lib/permalink_fu/lib/data/x57.yml +257 -0
  63. data/lib/permalink_fu/lib/data/x58.yml +257 -0
  64. data/lib/permalink_fu/lib/data/x59.yml +257 -0
  65. data/lib/permalink_fu/lib/data/x5a.yml +257 -0
  66. data/lib/permalink_fu/lib/data/x5b.yml +257 -0
  67. data/lib/permalink_fu/lib/data/x5c.yml +257 -0
  68. data/lib/permalink_fu/lib/data/x5d.yml +257 -0
  69. data/lib/permalink_fu/lib/data/x5e.yml +257 -0
  70. data/lib/permalink_fu/lib/data/x5f.yml +257 -0
  71. data/lib/permalink_fu/lib/data/x60.yml +257 -0
  72. data/lib/permalink_fu/lib/data/x61.yml +257 -0
  73. data/lib/permalink_fu/lib/data/x62.yml +257 -0
  74. data/lib/permalink_fu/lib/data/x63.yml +257 -0
  75. data/lib/permalink_fu/lib/data/x64.yml +257 -0
  76. data/lib/permalink_fu/lib/data/x65.yml +257 -0
  77. data/lib/permalink_fu/lib/data/x66.yml +257 -0
  78. data/lib/permalink_fu/lib/data/x67.yml +257 -0
  79. data/lib/permalink_fu/lib/data/x68.yml +257 -0
  80. data/lib/permalink_fu/lib/data/x69.yml +257 -0
  81. data/lib/permalink_fu/lib/data/x6a.yml +257 -0
  82. data/lib/permalink_fu/lib/data/x6b.yml +257 -0
  83. data/lib/permalink_fu/lib/data/x6c.yml +257 -0
  84. data/lib/permalink_fu/lib/data/x6d.yml +257 -0
  85. data/lib/permalink_fu/lib/data/x6e.yml +257 -0
  86. data/lib/permalink_fu/lib/data/x6f.yml +257 -0
  87. data/lib/permalink_fu/lib/data/x70.yml +257 -0
  88. data/lib/permalink_fu/lib/data/x71.yml +257 -0
  89. data/lib/permalink_fu/lib/data/x72.yml +257 -0
  90. data/lib/permalink_fu/lib/data/x73.yml +257 -0
  91. data/lib/permalink_fu/lib/data/x74.yml +257 -0
  92. data/lib/permalink_fu/lib/data/x75.yml +257 -0
  93. data/lib/permalink_fu/lib/data/x76.yml +257 -0
  94. data/lib/permalink_fu/lib/data/x77.yml +257 -0
  95. data/lib/permalink_fu/lib/data/x78.yml +257 -0
  96. data/lib/permalink_fu/lib/data/x79.yml +257 -0
  97. data/lib/permalink_fu/lib/data/x7a.yml +257 -0
  98. data/lib/permalink_fu/lib/data/x7b.yml +257 -0
  99. data/lib/permalink_fu/lib/data/x7c.yml +257 -0
  100. data/lib/permalink_fu/lib/data/x7d.yml +257 -0
  101. data/lib/permalink_fu/lib/data/x7e.yml +257 -0
  102. data/lib/permalink_fu/lib/data/x7f.yml +257 -0
  103. data/lib/permalink_fu/lib/data/x80.yml +257 -0
  104. data/lib/permalink_fu/lib/data/x81.yml +257 -0
  105. data/lib/permalink_fu/lib/data/x82.yml +257 -0
  106. data/lib/permalink_fu/lib/data/x83.yml +257 -0
  107. data/lib/permalink_fu/lib/data/x84.yml +257 -0
  108. data/lib/permalink_fu/lib/data/x85.yml +257 -0
  109. data/lib/permalink_fu/lib/data/x86.yml +257 -0
  110. data/lib/permalink_fu/lib/data/x87.yml +257 -0
  111. data/lib/permalink_fu/lib/data/x88.yml +257 -0
  112. data/lib/permalink_fu/lib/data/x89.yml +257 -0
  113. data/lib/permalink_fu/lib/data/x8a.yml +257 -0
  114. data/lib/permalink_fu/lib/data/x8b.yml +257 -0
  115. data/lib/permalink_fu/lib/data/x8c.yml +257 -0
  116. data/lib/permalink_fu/lib/data/x8d.yml +257 -0
  117. data/lib/permalink_fu/lib/data/x8e.yml +257 -0
  118. data/lib/permalink_fu/lib/data/x8f.yml +257 -0
  119. data/lib/permalink_fu/lib/data/x90.yml +257 -0
  120. data/lib/permalink_fu/lib/data/x91.yml +257 -0
  121. data/lib/permalink_fu/lib/data/x92.yml +257 -0
  122. data/lib/permalink_fu/lib/data/x93.yml +257 -0
  123. data/lib/permalink_fu/lib/data/x94.yml +257 -0
  124. data/lib/permalink_fu/lib/data/x95.yml +257 -0
  125. data/lib/permalink_fu/lib/data/x96.yml +257 -0
  126. data/lib/permalink_fu/lib/data/x97.yml +257 -0
  127. data/lib/permalink_fu/lib/data/x98.yml +257 -0
  128. data/lib/permalink_fu/lib/data/x99.yml +257 -0
  129. data/lib/permalink_fu/lib/data/x9a.yml +257 -0
  130. data/lib/permalink_fu/lib/data/x9b.yml +257 -0
  131. data/lib/permalink_fu/lib/data/x9c.yml +257 -0
  132. data/lib/permalink_fu/lib/data/x9d.yml +257 -0
  133. data/lib/permalink_fu/lib/data/x9e.yml +257 -0
  134. data/lib/permalink_fu/lib/data/x9f.yml +256 -0
  135. data/lib/permalink_fu/lib/data/xa0.yml +257 -0
  136. data/lib/permalink_fu/lib/data/xa1.yml +257 -0
  137. data/lib/permalink_fu/lib/data/xa2.yml +257 -0
  138. data/lib/permalink_fu/lib/data/xa3.yml +257 -0
  139. data/lib/permalink_fu/lib/data/xa4.yml +256 -0
  140. data/lib/permalink_fu/lib/data/xac.yml +257 -0
  141. data/lib/permalink_fu/lib/data/xad.yml +257 -0
  142. data/lib/permalink_fu/lib/data/xae.yml +257 -0
  143. data/lib/permalink_fu/lib/data/xaf.yml +257 -0
  144. data/lib/permalink_fu/lib/data/xb0.yml +257 -0
  145. data/lib/permalink_fu/lib/data/xb1.yml +257 -0
  146. data/lib/permalink_fu/lib/data/xb2.yml +257 -0
  147. data/lib/permalink_fu/lib/data/xb3.yml +257 -0
  148. data/lib/permalink_fu/lib/data/xb4.yml +257 -0
  149. data/lib/permalink_fu/lib/data/xb5.yml +257 -0
  150. data/lib/permalink_fu/lib/data/xb6.yml +257 -0
  151. data/lib/permalink_fu/lib/data/xb7.yml +257 -0
  152. data/lib/permalink_fu/lib/data/xb8.yml +257 -0
  153. data/lib/permalink_fu/lib/data/xb9.yml +257 -0
  154. data/lib/permalink_fu/lib/data/xba.yml +257 -0
  155. data/lib/permalink_fu/lib/data/xbb.yml +257 -0
  156. data/lib/permalink_fu/lib/data/xbc.yml +257 -0
  157. data/lib/permalink_fu/lib/data/xbd.yml +257 -0
  158. data/lib/permalink_fu/lib/data/xbe.yml +257 -0
  159. data/lib/permalink_fu/lib/data/xbf.yml +257 -0
  160. data/lib/permalink_fu/lib/data/xc0.yml +257 -0
  161. data/lib/permalink_fu/lib/data/xc1.yml +257 -0
  162. data/lib/permalink_fu/lib/data/xc2.yml +257 -0
  163. data/lib/permalink_fu/lib/data/xc3.yml +257 -0
  164. data/lib/permalink_fu/lib/data/xc4.yml +257 -0
  165. data/lib/permalink_fu/lib/data/xc5.yml +257 -0
  166. data/lib/permalink_fu/lib/data/xc6.yml +257 -0
  167. data/lib/permalink_fu/lib/data/xc7.yml +257 -0
  168. data/lib/permalink_fu/lib/data/xc8.yml +257 -0
  169. data/lib/permalink_fu/lib/data/xc9.yml +257 -0
  170. data/lib/permalink_fu/lib/data/xca.yml +257 -0
  171. data/lib/permalink_fu/lib/data/xcb.yml +257 -0
  172. data/lib/permalink_fu/lib/data/xcc.yml +257 -0
  173. data/lib/permalink_fu/lib/data/xcd.yml +257 -0
  174. data/lib/permalink_fu/lib/data/xce.yml +257 -0
  175. data/lib/permalink_fu/lib/data/xcf.yml +257 -0
  176. data/lib/permalink_fu/lib/data/xd0.yml +257 -0
  177. data/lib/permalink_fu/lib/data/xd1.yml +257 -0
  178. data/lib/permalink_fu/lib/data/xd2.yml +257 -0
  179. data/lib/permalink_fu/lib/data/xd3.yml +257 -0
  180. data/lib/permalink_fu/lib/data/xd4.yml +257 -0
  181. data/lib/permalink_fu/lib/data/xd5.yml +257 -0
  182. data/lib/permalink_fu/lib/data/xd6.yml +257 -0
  183. data/lib/permalink_fu/lib/data/xd7.yml +256 -0
  184. data/lib/permalink_fu/lib/data/xf9.yml +257 -0
  185. data/lib/permalink_fu/lib/data/xfa.yml +256 -0
  186. data/lib/permalink_fu/lib/data/xfb.yml +257 -0
  187. data/lib/permalink_fu/lib/data/xfc.yml +257 -0
  188. data/lib/permalink_fu/lib/data/xfd.yml +256 -0
  189. data/lib/permalink_fu/lib/data/xfe.yml +257 -0
  190. data/lib/permalink_fu/lib/data/xff.yml +257 -0
  191. data/lib/permalink_fu/lib/permalink_fu.rb +176 -0
  192. data/lib/permalink_fu/test/permalink_fu_test.rb +476 -0
  193. data/lib/permalink_fu/test/test_helper.rb +13 -0
  194. data/public/images/check.png +0 -0
  195. data/public/images/credit_card.png +0 -0
  196. metadata +214 -39
@@ -0,0 +1,257 @@
1
+ ---
2
+ - '[?]'
3
+ - '!'
4
+ - '"'
5
+ - '#'
6
+ - $
7
+ - '%'
8
+ - '&'
9
+ - "'"
10
+ - (
11
+ - )
12
+ - '*'
13
+ - +
14
+ - ','
15
+ - -
16
+ - .
17
+ - /
18
+ - 0
19
+ - 1
20
+ - 2
21
+ - 3
22
+ - 4
23
+ - 5
24
+ - 6
25
+ - 7
26
+ - 8
27
+ - 9
28
+ - ':'
29
+ - ;
30
+ - <
31
+ - =
32
+ - '>'
33
+ - '?'
34
+ - '@'
35
+ - A
36
+ - B
37
+ - C
38
+ - D
39
+ - E
40
+ - F
41
+ - G
42
+ - H
43
+ - I
44
+ - J
45
+ - K
46
+ - L
47
+ - M
48
+ - N
49
+ - O
50
+ - P
51
+ - Q
52
+ - R
53
+ - S
54
+ - T
55
+ - U
56
+ - V
57
+ - W
58
+ - X
59
+ - Y
60
+ - Z
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
+ - .
100
+ - '['
101
+ - ']'
102
+ - ','
103
+ - '*'
104
+ - wo
105
+ - a
106
+ - i
107
+ - u
108
+ - e
109
+ - o
110
+ - ya
111
+ - yu
112
+ - yo
113
+ - tu
114
+ - +
115
+ - a
116
+ - i
117
+ - u
118
+ - e
119
+ - o
120
+ - ka
121
+ - ki
122
+ - ku
123
+ - ke
124
+ - ko
125
+ - sa
126
+ - si
127
+ - su
128
+ - se
129
+ - so
130
+ - ta
131
+ - ti
132
+ - tu
133
+ - te
134
+ - to
135
+ - na
136
+ - ni
137
+ - nu
138
+ - ne
139
+ - no
140
+ - ha
141
+ - hi
142
+ - hu
143
+ - he
144
+ - ho
145
+ - ma
146
+ - mi
147
+ - mu
148
+ - me
149
+ - mo
150
+ - ya
151
+ - yu
152
+ - yo
153
+ - ra
154
+ - ri
155
+ - ru
156
+ - re
157
+ - ro
158
+ - wa
159
+ - n
160
+ - ':'
161
+ - ;
162
+ - ''
163
+ - g
164
+ - gg
165
+ - gs
166
+ - n
167
+ - nj
168
+ - nh
169
+ - d
170
+ - dd
171
+ - r
172
+ - lg
173
+ - lm
174
+ - lb
175
+ - ls
176
+ - lt
177
+ - lp
178
+ - rh
179
+ - m
180
+ - b
181
+ - bb
182
+ - bs
183
+ - s
184
+ - ss
185
+ - ''
186
+ - j
187
+ - jj
188
+ - c
189
+ - k
190
+ - t
191
+ - p
192
+ - h
193
+ - '[?]'
194
+ - '[?]'
195
+ - '[?]'
196
+ - a
197
+ - ae
198
+ - ya
199
+ - yae
200
+ - eo
201
+ - e
202
+ - '[?]'
203
+ - '[?]'
204
+ - yeo
205
+ - ye
206
+ - o
207
+ - wa
208
+ - wae
209
+ - oe
210
+ - '[?]'
211
+ - '[?]'
212
+ - yo
213
+ - u
214
+ - weo
215
+ - we
216
+ - wi
217
+ - yu
218
+ - '[?]'
219
+ - '[?]'
220
+ - eu
221
+ - yi
222
+ - i
223
+ - '[?]'
224
+ - '[?]'
225
+ - '[?]'
226
+ - /C
227
+ - PS
228
+ - '!'
229
+ - -
230
+ - '|'
231
+ - Y=
232
+ - W=
233
+ - '[?]'
234
+ - '|'
235
+ - -
236
+ - '|'
237
+ - -
238
+ - '|'
239
+ - '#'
240
+ - O
241
+ - '[?]'
242
+ - '[?]'
243
+ - '[?]'
244
+ - '[?]'
245
+ - '[?]'
246
+ - '[?]'
247
+ - '[?]'
248
+ - '[?]'
249
+ - '[?]'
250
+ - '[?]'
251
+ - '{'
252
+ - '|'
253
+ - '}'
254
+ - ''
255
+ - ''
256
+ - ''
257
+ - ''
@@ -0,0 +1,176 @@
1
+ require 'yaml'
2
+ require 'digest/sha1'
3
+
4
+ module PermalinkFu
5
+ def has_permalink(attr_names = [], permalink_field = nil, options = {})
6
+ if permalink_field.is_a?(Hash)
7
+ options = permalink_field
8
+ permalink_field = nil
9
+ end
10
+ ClassMethods.setup_permalink_fu_on self do
11
+ self.permalink_attributes = Array(attr_names)
12
+ self.permalink_field = (permalink_field || 'permalink').to_s
13
+ self.permalink_options = {:unique => true}.update(options)
14
+ end
15
+
16
+ include InstanceMethods
17
+ end
18
+
19
+ class << self
20
+ # This method does the actual permalink escaping.
21
+ def escape(str)
22
+ s = ClassMethods.decode(str)#.force_encoding("UTF-8")
23
+ s.gsub!(/[^\x00-\x7F]+/, '') # Remove anything non-ASCII entirely (e.g. diacritics).
24
+ s.gsub!(/[^\w_ \-]+/i, '') # Remove unwanted chars.
25
+ s.gsub!(/[ \-]+/i, '-') # No more than one of the separator in a row.
26
+ s.gsub!(/^\-|\-$/i, '') # Remove leading/trailing separator.
27
+ s.downcase!
28
+ s.size == 0 ? ClassMethods.random_permalink(str) : s
29
+ end
30
+ end
31
+
32
+ # Contains class methods for ActiveRecord models that have permalinks
33
+ module ClassMethods
34
+ # Contains Unicode codepoints, loading as needed from YAML files
35
+ CODEPOINTS = Hash.new { |h, k|
36
+ h[k] = YAML::load_file(File.join(File.dirname(__FILE__), "data", "#{k}.yml"))
37
+ }
38
+
39
+ class << self
40
+ def decode(string)
41
+ string.gsub(/[^\x00-\x7f]/u) do |codepoint|
42
+ begin
43
+ CODEPOINTS["x%02x" % (codepoint.unpack("U")[0] >> 8)][codepoint.unpack("U")[0] & 255]
44
+ rescue
45
+ "_"
46
+ end
47
+ end
48
+ end
49
+
50
+ def random_permalink(seed = nil)
51
+ Digest::SHA1.hexdigest("#{seed}#{Time.now.to_s.split(//).sort_by {rand}}")
52
+ end
53
+ end
54
+
55
+ def self.setup_permalink_fu_on(base)
56
+ base.extend self
57
+ class << base
58
+ attr_accessor :permalink_options
59
+ attr_accessor :permalink_attributes
60
+ attr_accessor :permalink_field
61
+ end
62
+
63
+ yield
64
+
65
+ if base.permalink_options[:unique]
66
+ base.before_validation :create_unique_permalink
67
+ else
68
+ base.before_validation :create_common_permalink
69
+ end
70
+ class << base
71
+ alias_method :define_attribute_methods_without_permalinks, :define_attribute_methods
72
+ alias_method :define_attribute_methods, :define_attribute_methods_with_permalinks
73
+ end unless base.respond_to?(:define_attribute_methods_without_permalinks)
74
+ end
75
+
76
+ def define_attribute_methods_with_permalinks
77
+ if (value = define_attribute_methods_without_permalinks) && self.permalink_field
78
+ class_eval <<-EOV
79
+ def #{self.permalink_field}=(new_value);
80
+ write_attribute(:#{self.permalink_field}, new_value.blank? ? '' : PermalinkFu.escape(new_value));
81
+ end
82
+ EOV
83
+ end
84
+ value
85
+ end
86
+ end
87
+
88
+ # This contains instance methods for ActiveRecord models that have permalinks.
89
+ module InstanceMethods
90
+ protected
91
+ def create_common_permalink
92
+ return unless should_create_permalink?
93
+ if read_attribute(self.class.permalink_field).blank? || permalink_fields_changed?
94
+ send("#{self.class.permalink_field}=", create_permalink_for(self.class.permalink_attributes))
95
+ end
96
+
97
+ # Quit now if we have the changed method available and nothing has changed
98
+ permalink_changed = "#{self.class.permalink_field}_changed?"
99
+ return if respond_to?(permalink_changed) && !send(permalink_changed)
100
+
101
+ # Otherwise find the limit and crop the permalink
102
+ limit = self.class.columns_hash[self.class.permalink_field].limit
103
+ base = send("#{self.class.permalink_field}=", read_attribute(self.class.permalink_field)[0..limit - 1])
104
+ [limit, base]
105
+ end
106
+
107
+ def create_unique_permalink
108
+ limit, base = create_common_permalink
109
+ return if limit.nil? # nil if the permalink has not changed or :if/:unless fail
110
+ counter = 1
111
+ # oh how i wish i could use a hash for conditions
112
+ conditions = ["#{self.class.permalink_field} = ?", base]
113
+ unless new_record?
114
+ conditions.first << " and id != ?"
115
+ conditions << id
116
+ end
117
+ if self.class.permalink_options[:scope]
118
+ [self.class.permalink_options[:scope]].flatten.each do |scope|
119
+ value = send(scope)
120
+ if value
121
+ conditions.first << " and #{scope} = ?"
122
+ conditions << send(scope)
123
+ else
124
+ conditions.first << " and #{scope} IS NULL"
125
+ end
126
+ end
127
+ end
128
+ while self.class.exists?(conditions)
129
+ suffix = "-#{counter += 1}"
130
+ conditions[1] = "#{base[0..limit-suffix.size-1]}#{suffix}"
131
+ send("#{self.class.permalink_field}=", conditions[1])
132
+ end
133
+ end
134
+
135
+ def create_permalink_for(attr_names)
136
+ str = attr_names.collect { |attr_name| send(attr_name).to_s } * " "
137
+ str.blank? ? PermalinkFu::ClassMethods.random_permalink : str
138
+ end
139
+
140
+ private
141
+ def should_create_permalink?
142
+ if self.class.permalink_field.blank?
143
+ false
144
+ elsif self.class.permalink_options[:if]
145
+ evaluate_method(self.class.permalink_options[:if])
146
+ elsif self.class.permalink_options[:unless]
147
+ !evaluate_method(self.class.permalink_options[:unless])
148
+ else
149
+ true
150
+ end
151
+ end
152
+
153
+ # Don't even check _changed? methods unless :update is set
154
+ def permalink_fields_changed?
155
+ return false unless self.class.permalink_options[:update]
156
+ self.class.permalink_attributes.any? do |attribute|
157
+ changed_method = "#{attribute}_changed?"
158
+ respond_to?(changed_method) ? send(changed_method) : true
159
+ end
160
+ end
161
+
162
+ def evaluate_method(method)
163
+ case method
164
+ when Symbol
165
+ send(method)
166
+ when String
167
+ eval(method, instance_eval { binding })
168
+ when Proc, Method
169
+ method.call(self)
170
+ end
171
+ end
172
+ end
173
+ end
174
+
175
+ # Extend ActiveRecord functionality
176
+ ActiveRecord::Base.extend PermalinkFu