knitkit 2.0.4 → 2.0.5

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 (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