radiant-clipped-extension 1.0.9 → 1.0.10

Sign up to get free protection for your applications and to get access to all the features.
data/app/models/asset.rb CHANGED
@@ -71,8 +71,8 @@ class Asset < ActiveRecord::Base
71
71
  return asset_type.icon(style_name)
72
72
  end
73
73
 
74
- def has_style?(style_name)
75
- paperclip_styles.keys.include?(style_name.to_sym)
74
+ def has_style?(style_name='original')
75
+ style_name == 'original' || paperclip_styles.keys.include?(style_name.to_sym)
76
76
  end
77
77
 
78
78
  def basename
@@ -102,49 +102,57 @@ class Asset < ActiveRecord::Base
102
102
  end
103
103
 
104
104
  def geometry(style_name='original')
105
+ raise Paperclip::StyleError, "Requested style #{style_name} is not defined for this asset." unless has_style?(style_name)
105
106
  @geometry ||= {}
106
- @geometry[style_name] ||= if style_name.to_s == 'original'
107
- original_geometry
108
- elsif style = self.asset.styles[style_name.to_sym] # self.asset.styles holds Style objects, where self.paperclip_styles is still just rule hashes
109
- original_geometry.transformed_by(style.geometry)
110
- else
111
- raise PaperclipError, "Requested style #{style_name} is not defined."
107
+ begin
108
+ @geometry[style_name] ||= if style_name.to_s == 'original'
109
+ original_geometry
110
+ else
111
+ style = self.asset.styles[style_name.to_sym]
112
+ original_geometry.transformed_by(style.geometry) # this can return dimensions for fully specified style sizes but not for relative sizes when there are no original dimensions
113
+ end
114
+ rescue Paperclip::TransformationError => e
115
+ Rails.logger.warn "geometry transformation error: #{e}"
116
+ original_geometry # returns a blank geometry if the real geometry cannot be calculated
112
117
  end
113
118
  end
114
119
 
115
120
  def aspect(style_name='original')
116
- image? && geometry(style_name).aspect
121
+ geometry(style_name).aspect
117
122
  end
118
123
 
119
124
  def orientation(style_name='original')
120
- if image?
121
- this_aspect = aspect(style_name)
122
- case
123
- when this_aspect < 1.0 then 'vertical'
124
- when this_aspect > 1.0 then 'horizontal'
125
- else 'square'
126
- end
125
+ a = aspect(style_name)
126
+ case
127
+ when a == nil?
128
+ 'unknown'
129
+ when a < 1.0
130
+ 'vertical'
131
+ when a > 1.0
132
+ 'horizontal'
133
+ else
134
+ 'square'
127
135
  end
128
136
  end
129
137
 
130
138
  def width(style_name='original')
131
- image? ? geometry(style_name).width.to_i : 0
139
+ geometry(style_name).width.to_i
132
140
  end
133
141
 
134
142
  def height(style_name='original')
135
- image? ? geometry(style_name).height.to_i : 0
143
+ geometry(style_name).height.to_i
136
144
  end
137
145
 
138
146
  def square?(style_name='original')
139
- image? && geometry(style_name).square?
147
+ geometry(style_name).square?
140
148
  end
141
149
 
142
150
  def vertical?(style_name='original')
143
- image? && geometry(style_name).vertical?
151
+ geometry(style_name).vertical?
144
152
  end
145
153
 
146
154
  def horizontal?(style_name='original')
147
- image? && geometry(style_name).horizontal?
155
+ geometry(style_name).horizontal?
148
156
  end
149
157
 
150
158
  def dimensions_known?
@@ -37,7 +37,7 @@ class AssetType
37
37
  Asset.send :named_scope, plural.to_sym, :conditions => condition
38
38
  Asset.send :named_scope, "not_#{plural}".to_sym, :conditions => non_condition
39
39
 
40
- # Page.define_radius_tags_for_asset_type self #TODO discuss interface
40
+ self.define_radius_tags
41
41
  @@types.push self
42
42
  @@type_lookup[@name] = self
43
43
  end
@@ -164,6 +164,18 @@ class AssetType
164
164
  end
165
165
  end
166
166
 
167
+ def define_radius_tags
168
+ type = self.name
169
+ Page.class_eval {
170
+ tag "asset:if_#{type}" do |tag|
171
+ tag.expand if find_asset(tag, tag.attr.dup).send("#{type}?".to_sym)
172
+ end
173
+ tag "asset:unless_#{type}" do |tag|
174
+ tag.expand unless find_asset(tag, tag.attr.dup).send("#{type}?".to_sym)
175
+ end
176
+ }
177
+ end
178
+
167
179
  # class methods
168
180
 
169
181
  def self.for(attachment)
data/lib/asset_tags.rb CHANGED
@@ -7,11 +7,6 @@ module AssetTags
7
7
  deprecated_tag "assets:#{name}", :substitute => "asset:#{name}", :deadline => '2.0'
8
8
  end
9
9
 
10
- Asset.known_types.each do |known_type|
11
- deprecated_tag "assets:if_#{known_type}", :substitute => "asset:if_#{known_type}", :deadline => '2.0'
12
- deprecated_tag "assets:unless_#{known_type}", :substitute => "asset:unless_#{known_type}", :deadline => '2.0'
13
- end
14
-
15
10
  desc %{
16
11
  The namespace for referencing images and assets.
17
12
 
@@ -20,7 +15,12 @@ module AssetTags
20
15
  }
21
16
  tag 'asset' do |tag|
22
17
  tag.locals.asset = find_asset unless tag.attr.empty?
23
- tag.expand
18
+ begin
19
+ tag.expand
20
+ rescue Paperclip::StyleError => e
21
+ Rails.logger.warn "style processing error with asset ##{tag.locals.asset.id}: #{e}"
22
+ raise TagError, e
23
+ end
24
24
  end
25
25
 
26
26
  desc %{
@@ -111,7 +111,7 @@ module AssetTags
111
111
 
112
112
 
113
113
  desc %{
114
- Renders the value for a top padding for the image. Put the image in a
114
+ Renders the value for a top padding for a thumbnail. Put the thumbnail in a
115
115
  container with specified height and using this tag you can vertically
116
116
  align the image within its container.
117
117
 
@@ -132,9 +132,9 @@ module AssetTags
132
132
  }
133
133
  tag 'asset:top_padding' do |tag|
134
134
  asset, options = asset_and_options(tag)
135
- raise TagError, 'Asset is not an image' unless asset.image?
136
135
  raise TagError, "'container' attribute required" unless options['container']
137
136
  size = options['size'] ? options.delete('size') : 'icon'
137
+ raise TagError, "asset #{tag.locals.asset.title} has no '#{size}' thumbnail" unless tag.locals.asset.has_style?(size)
138
138
  container = options.delete('container')
139
139
  ((container.to_i - asset.height(size).to_i)/2).to_s
140
140
  end
@@ -154,12 +154,14 @@ module AssetTags
154
154
  end
155
155
 
156
156
  desc %{
157
- Returns a string representing the orientation of the asset, which must be an image. Can be 'horizontal', 'vertical' or 'square'.
157
+ Returns a string representing the orientation of the asset, which must be imageable.
158
+ (ie, it is an image or it has been processed to produce an image).
159
+ Can be 'horizontal', 'vertical' or 'square'.
158
160
  }
159
161
  tag 'asset:orientation' do |tag|
160
162
  asset, options = asset_and_options(tag)
161
- raise TagError, 'Asset is not an image' unless asset.image?
162
163
  size = options['size'] ? options.delete('size') : 'original'
164
+ raise TagError, "asset #{tag.locals.asset.title} has no '#{size}' thumbnail" unless tag.locals.asset.has_style?(size)
163
165
  asset.orientation(size)
164
166
  end
165
167
 
@@ -168,8 +170,8 @@ module AssetTags
168
170
  }
169
171
  tag 'asset:aspect' do |tag|
170
172
  asset, options = asset_and_options(tag)
171
- raise TagError, 'Asset is not an image' unless asset.image?
172
173
  size = options['size'] ? options.delete('size') : 'original'
174
+ raise TagError, "asset #{tag.locals.asset.title} has no '#{size}' thumbnail" unless tag.locals.asset.has_style?(size)
173
175
  asset.aspect(size)
174
176
  end
175
177
 
@@ -193,21 +195,6 @@ module AssetTags
193
195
  end
194
196
 
195
197
  #TODO: could use better docs for Asset#other? case explaining what types it covers
196
- Asset.known_types.each do |known_type|
197
- desc %{
198
- Renders the contents only of the asset is of the type #{known_type}
199
- }
200
- tag "asset:if_#{known_type}" do |tag|
201
- tag.expand if find_asset(tag, tag.attr.dup).send("#{known_type}?".to_sym)
202
- end
203
-
204
- desc %{
205
- Renders the contents only of the asset is not of the type #{known_type}
206
- }
207
- tag "asset:unless_#{known_type}" do |tag|
208
- tag.expand unless find_asset(tag, tag.attr.dup).send("#{known_type}?".to_sym)
209
- end
210
- end
211
198
 
212
199
  [:title, :caption, :asset_file_name, :extension, :asset_content_type, :asset_file_size, :id].each do |method|
213
200
  desc %{
@@ -233,22 +220,19 @@ module AssetTags
233
220
 
234
221
  Using the optional @size@ attribute, different sizes can be display.
235
222
  "thumbnail" and "icon" sizes are built in, but custom ones can be set
236
- using by changing assets.addition_thumbnails in the Radiant::Config
237
- settings.
223
+ by changing `assets.thumbnails.[type]` in the Radiant::Config settings.
238
224
 
239
225
  *Usage:*
240
226
  <pre><code><r:asset:image [name="asset name" or id="asset id"] [size="icon|thumbnail|whatever"]></code></pre>
241
227
  }
242
228
  tag 'asset:image' do |tag|
243
229
  tag.locals.asset, options = asset_and_options(tag)
244
- if tag.locals.asset.image?
245
- size = options['size'] ? options.delete('size') : 'original'
246
- alt = "alt='#{tag.locals.asset.title}'" unless tag.attr['alt']
247
- attributes = options.inject('') { |s, (k, v)| s << %{#{k.downcase}="#{v}" } }.strip
248
- attributes << alt unless alt.nil?
249
- url = tag.locals.asset.thumbnail(size)
250
- %{<img src="#{url}" #{attributes unless attributes.empty?} />} rescue nil
251
- end
230
+ size = options.delete('size') || 'original'
231
+ raise TagError, "asset #{tag.locals.asset.title} has no '#{size}' thumbnail" unless tag.locals.asset.has_style?(size)
232
+ options['alt'] ||= tag.locals.asset.title
233
+ attributes = options.inject('') { |s, (k, v)| s << %{#{k.downcase}="#{v}" } }.strip
234
+ url = tag.locals.asset.thumbnail(size)
235
+ %{<img src="#{url}" #{attributes} />} rescue nil
252
236
  end
253
237
 
254
238
  desc %{
@@ -1,7 +1,7 @@
1
1
  module Paperclip
2
2
 
3
- class TransformationError < PaperclipError
4
- end
3
+ class TransformationError < PaperclipError; end
4
+ class StyleError < PaperclipError; end
5
5
 
6
6
  class Geometry
7
7
 
@@ -17,13 +17,14 @@ module Paperclip
17
17
  # This saves us having to go back to the file, which is expensive with S3.
18
18
  # We understand all the Imagemagick geometry arguments described at http://www.imagemagick.org/script/command-line-processing.php#geometry
19
19
  # including both '^' and paperclip's own '#' modifier.
20
+ #
20
21
  def transformed_by (other)
21
- raise TransformationError, "geometry is not transformable without both width and height" if self.height == 0 or self.width == 0
22
22
  other = Geometry.parse(other) unless other.is_a? Geometry
23
- return other.without_modifier if self =~ other
23
+ # if the two geometries are similar, or the destination geometry is a fixed size, the resulting dimensions are fixed
24
+ return other.without_modifier if self =~ other || ['#', '!', '^'].include?(other.modifier)
25
+ # otherwise, we apply the transformation
26
+ raise TransformationError, "geometry is not transformable without both width and height" if self.height == 0 or self.width == 0
24
27
  case other.modifier
25
- when '#', '!', '^'
26
- other.without_modifier
27
28
  when '>'
28
29
  (other.width < self.width || other.height < self.height) ? scaled_to_fit(other) : self
29
30
  when '<'
@@ -1,5 +1,5 @@
1
1
  module RadiantClippedExtension
2
- VERSION = "1.0.9"
2
+ VERSION = "1.0.10"
3
3
  SUMMARY = %q{Assets for Radiant CMS}
4
4
  DESCRIPTION = %q{Asset-management derived from Keith Bingman's Paperclipped extension.}
5
5
  URL = "http://radiantcms.org"
@@ -90,6 +90,7 @@ Asset.Insert = Behavior.create({
90
90
  onclick: function(e) {
91
91
  if (e) e.stop();
92
92
  var part_name = TabControlBehavior.instances[0].controller.selected.caption;
93
+ if (part_name.indexOf(' ')) part_name = part_name.replace(' ', '-');
93
94
  var textbox = $('part_' + part_name + '_content');
94
95
  var tag_parts = this.element.getAttribute('rel').split('_');
95
96
  var tag_name = tag_parts[0];
@@ -54,6 +54,10 @@ p.asset
54
54
  width: 180px
55
55
  padding: 2px 8px 2px 20px
56
56
 
57
+ #assets_table.assets
58
+ overflow: auto
59
+
60
+
57
61
  #upload_holders
58
62
  display: none
59
63
 
@@ -174,15 +178,13 @@ p.asset
174
178
 
175
179
  #assets_table.assets
176
180
  position: relative
177
- overflow: auto
181
+ font-size: 75%
178
182
  p
179
183
  padding: 40px
180
184
  top: 45px
181
185
  color: silver
182
186
  text-align: center
183
- font:
184
- size: 75%
185
- style: oblique
187
+ font-style: oblique
186
188
  ul
187
189
  clear: both
188
190
  li.asset
@@ -194,7 +196,7 @@ p.asset
194
196
  clear: left
195
197
  width: 100%
196
198
  height: 3em
197
- padding: 0.5em
199
+ padding: 0.5em 0
198
200
  span, a
199
201
  display: block
200
202
  float: left
@@ -61,8 +61,8 @@ describe AssetTags do
61
61
  end
62
62
 
63
63
  it "asset:image" do
64
- page.should render(%{<r:asset:image id="#{asset_id(:test1)}" />}).as( %{<img src="#{asset.thumbnail}" alt='#{asset.title}' />} )
65
- page.should render(%{<r:asset:image size="icon" id="#{asset_id(:test1)}" />}).as( %{<img src="#{asset.thumbnail('icon')}" alt='#{asset.title}' />} )
64
+ page.should render(%{<r:asset:image id="#{asset_id(:test1)}" />}).as( %{<img src="#{asset.thumbnail}" alt="#{asset.title}" />} )
65
+ page.should render(%{<r:asset:image size="icon" id="#{asset_id(:test1)}" />}).as( %{<img src="#{asset.thumbnail('icon')}" alt="#{asset.title}" />} )
66
66
  end
67
67
 
68
68
  it "asset:caption" do
@@ -96,6 +96,11 @@ describe AssetTags do
96
96
  page.should render(%{<r:asset:aspect id="#{asset_id(:test1)}" />}).as( 2.to_f.to_s )
97
97
  page.should render(%{<r:asset:aspect id="#{asset_id(:test1)}" size="icon" />}).as( 1.to_f.to_s )
98
98
  end
99
+
100
+ it "asset:if_image" do
101
+ page.should render(%{<r:asset:if_image name="test1">foo</r:asset:if_image>}).as( "foo" )
102
+ page.should render(%{<r:asset:if_image name="video">foo</r:asset:if_image>}).as( "" )
103
+ end
99
104
 
100
105
  end
101
106
 
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: radiant-clipped-extension
3
3
  version: !ruby/object:Gem::Version
4
- hash: 5
4
+ hash: 3
5
5
  prerelease:
6
6
  segments:
7
7
  - 1
8
8
  - 0
9
- - 9
10
- version: 1.0.9
9
+ - 10
10
+ version: 1.0.10
11
11
  platform: ruby
12
12
  authors:
13
13
  - Keith Bingman
@@ -18,7 +18,7 @@ autorequire:
18
18
  bindir: bin
19
19
  cert_chain: []
20
20
 
21
- date: 2011-09-10 00:00:00 Z
21
+ date: 2011-09-13 00:00:00 Z
22
22
  dependencies:
23
23
  - !ruby/object:Gem::Dependency
24
24
  name: acts_as_list