polymer 1.0.0.beta.4 → 1.0.0.beta.5

Sign up to get free protection for your applications and to get access to all the features.
data/History.md CHANGED
@@ -25,6 +25,17 @@ v1.0.0 / HEAD (Unreleased)
25
25
  also available as an alternative to the old "sprite-name-pos()"
26
26
  mixins.
27
27
 
28
+ * Sprites can now be included "inline" in your Sass files by setting the
29
+ sprite path to :data\_uri in your .polymer file. This further reduces
30
+ the number of HTTP requests required at the expense of slightly
31
+ greater data transfer.
32
+
33
+ Polymer adds the data URI to the Sass file by using a selector (such
34
+ as ".my\_sprite\_data"), and then uses Sass' @extend feature so that
35
+ the data is only added to the CSS file once. Your own Sass files do
36
+ not need to be modified to make use of this feature; the @polymer
37
+ mixin suffices.
38
+
28
39
  * The "polymer-pos" Sass mixin, which sets only the background position
29
40
  of a source, without including the background-image property, has been
30
41
  renamed to "polymer-position".
data/README.md CHANGED
@@ -132,6 +132,13 @@ With the latest versions of the Haml library, you may use SCSS instead:
132
132
  You can disable creation of the Sass mixin file by setting `config.sass
133
133
  false` in the ".polymer" file.
134
134
 
135
+ Sass users can make use of data URIs; the sprite contents will, instead
136
+ of being written to disk, be inlined into your CSS files. This reduces
137
+ the number of HTTP requests required to load your pages, but results in
138
+ slightly more data having to be transferred to your users. See
139
+ [polymer(5)][polymer-5] for instructions.
140
+
141
+
135
142
  ### CSS Stylesheets
136
143
 
137
144
  ... are not yet implemented. Hold tight; these should be around before
data/lib/polymer/dsl.rb CHANGED
@@ -114,7 +114,7 @@ module Polymer
114
114
  raise Polymer::DslError,
115
115
  "Sprite '#{source} => #{sprite}' has both a :name path segment " \
116
116
  "and a :name option; please use only one."
117
- elsif sprite !~ /:name/
117
+ elsif sprite != :data_uri and sprite !~ /:name/
118
118
  raise Polymer::MissingName,
119
119
  "Sprite '#{source} => #{sprite}' requires a :name segment in " \
120
120
  "the sprite path."
@@ -138,7 +138,7 @@ module Polymer
138
138
  project_config = @config.to_h
139
139
 
140
140
  Project.new(@root, @sprites.map do |definition|
141
- definition = _create_sprite(definition, project_config)
141
+ _create_sprite(definition, project_config)
142
142
  end, project_config)
143
143
  end
144
144
 
@@ -178,7 +178,9 @@ module Polymer
178
178
  # existing sprite.
179
179
  #
180
180
  def _define_sprite(sources, sprite, options)
181
- sources, sprite = @root + sources, @root + sprite
181
+ sources = @root + sources
182
+ sprite = @root + sprite unless sprite == :data_uri
183
+
182
184
  name = options[:name] || sprite.basename(sprite.extname).to_s
183
185
 
184
186
  if @sprites.detect { |definition| definition[:name] == name }
@@ -193,7 +195,7 @@ module Polymer
193
195
  @sprites << options.merge(
194
196
  :name => name,
195
197
  :sources => Pathname.glob(sources),
196
- :save_path => @root + sprite
198
+ :save_path => sprite
197
199
  )
198
200
  end
199
201
 
@@ -216,7 +218,8 @@ module Polymer
216
218
  sprite_opts[:name] = entry.basename.to_s # Use directory as the name
217
219
 
218
220
  source_path = "#{leading}#{sprite_opts[:name]}#{trailing}"
219
- sprite_path = sprite.gsub(/:name/, sprite_opts[:name])
221
+ sprite_path = (sprite == :data_uri) ?
222
+ :data_uri : sprite.gsub(/:name/, sprite_opts[:name])
220
223
 
221
224
  _define_sprite(source_path, sprite_path, sprite_opts)
222
225
  end
@@ -232,16 +235,23 @@ module Polymer
232
235
  # @return [Polymer::Sprite]
233
236
  #
234
237
  def _create_sprite(definition, project_config)
235
- url = definition.fetch(:url, project_config[:url]).dup
236
- url.gsub!(/:name/, definition[:name])
237
- url.gsub!(/:filename/, definition[:save_path].basename.to_s)
238
+ if definition[:save_path] == :data_uri and not project_config[:sass]
239
+ raise DslError, "The `#{definition[:name]}' sprite wants to use a " \
240
+ "data URI, but you have disabled Sass"
241
+ end
242
+
243
+ unless definition[:save_path] == :data_uri
244
+ url = definition.fetch(:url, project_config[:url]).dup
245
+ url.gsub!(/:name/, definition[:name])
246
+ url.gsub!(/:filename/, definition[:save_path].basename.to_s)
247
+ end
238
248
 
239
249
  Polymer::Sprite.new \
240
250
  definition[:name],
241
251
  definition[:sources],
242
252
  definition[:save_path],
243
253
  definition.fetch(:padding, project_config[:padding]),
244
- url
254
+ url || ''
245
255
  end
246
256
 
247
257
  # Provides the DSL for the global configuration options.
@@ -2,7 +2,7 @@
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .ad l
4
4
  .
5
- .TH "POLYMER\-BOND" "1" "September 2010" "POLYMER 1.0.0.BETA.4" "Polymer Manual"
5
+ .TH "POLYMER\-BOND" "1" "October 2010" "POLYMER 1.0.0.BETA.5" "Polymer Manual"
6
6
  .
7
7
  .SH "NAME"
8
8
  \fBpolymer\-bond\fR \- Create sprite images defined in your \.polymer file
@@ -63,4 +63,4 @@ SEE ALSO
63
63
 
64
64
 
65
65
 
66
- POLYMER 1.0.0.BETA.4 September 2010 POLYMER-BOND(1)
66
+ POLYMER 1.0.0.BETA.5 October 2010 POLYMER-BOND(1)
@@ -2,7 +2,7 @@
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .ad l
4
4
  .
5
- .TH "POLYMER\-INIT" "1" "September 2010" "POLYMER 1.0.0.BETA.4" "Polymer Manual"
5
+ .TH "POLYMER\-INIT" "1" "October 2010" "POLYMER 1.0.0.BETA.5" "Polymer Manual"
6
6
  .
7
7
  .SH "NAME"
8
8
  \fBpolymer\-init\fR \- Create a new Polymer project in the current directory
@@ -39,4 +39,4 @@ OPTIONS
39
39
 
40
40
 
41
41
 
42
- POLYMER 1.0.0.BETA.4 September 2010 POLYMER-INIT(1)
42
+ POLYMER 1.0.0.BETA.5 October 2010 POLYMER-INIT(1)
@@ -2,7 +2,7 @@
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .ad l
4
4
  .
5
- .TH "POLYMER\-OPTIMISE" "1" "September 2010" "POLYMER 1.0.0.BETA.4" "Polymer Manual"
5
+ .TH "POLYMER\-OPTIMISE" "1" "October 2010" "POLYMER 1.0.0.BETA.5" "Polymer Manual"
6
6
  .
7
7
  .SH "NAME"
8
8
  \fBpolymer\-optimise\fR \- Optimise PNG images
@@ -27,4 +27,4 @@ DESCRIPTION
27
27
 
28
28
 
29
29
 
30
- POLYMER 1.0.0.BETA.4 September 2010 POLYMER-OPTIMISE(1)
30
+ POLYMER 1.0.0.BETA.5 October 2010 POLYMER-OPTIMISE(1)
@@ -2,7 +2,7 @@
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .ad l
4
4
  .
5
- .TH "POLYMER\-POSITION" "1" "September 2010" "POLYMER 1.0.0.BETA.4" "Polymer Manual"
5
+ .TH "POLYMER\-POSITION" "1" "October 2010" "POLYMER 1.0.0.BETA.5" "Polymer Manual"
6
6
  .
7
7
  .SH "NAME"
8
8
  \fBpolymer\-position\fR \- Information about your sprite sources
@@ -39,4 +39,4 @@ DESCRIPTION
39
39
 
40
40
 
41
41
 
42
- POLYMER 1.0.0.BETA.4 September 2010 POLYMER-POSITION(1)
42
+ POLYMER 1.0.0.BETA.5 October 2010 POLYMER-POSITION(1)
@@ -2,7 +2,7 @@
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .ad l
4
4
  .
5
- .TH "POLYMER" "1" "September 2010" "POLYMER 1.0.0.BETA.4" "Polymer Manual"
5
+ .TH "POLYMER" "1" "October 2010" "POLYMER 1.0.0.BETA.5" "Polymer Manual"
6
6
  .
7
7
  .SH "NAME"
8
8
  \fBpolymer\fR \- Image spriting for web applications
@@ -57,4 +57,4 @@ SEE ALSO
57
57
 
58
58
 
59
59
 
60
- POLYMER 1.0.0.BETA.4 September 2010 POLYMER(1)
60
+ POLYMER 1.0.0.BETA.5 October 2010 POLYMER(1)
@@ -2,7 +2,7 @@
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .ad l
4
4
  .
5
- .TH "\.POLYMER" "5" "September 2010" "POLYMER 1.0.0.BETA.4" "Polymer Manual"
5
+ .TH "\.POLYMER" "5" "October 2010" "POLYMER 1.0.0.BETA.5" "Polymer Manual"
6
6
  .
7
7
  .SH "NAME"
8
8
  \fB\.polymer\fR \- a format for describing image sprites and their sources
@@ -110,6 +110,19 @@ sources/
110
110
  \&\.\.\. Polymer will create two sprites in the "sprites/" directory: one\.png will contain "book" and "calculator", while two\.png will contain "magnet" and "television"\.
111
111
  .
112
112
  .P
113
+ You may instead prefer to set the save path to :data_uri; Polymer will place the sprite contents into your CSS file\. This reduces the number of HTTP requests requires to load your pages at the expense of slightly greater data transfer\.
114
+ .
115
+ .IP "" 4
116
+ .
117
+ .nf
118
+
119
+ sprites "sources/:name/*" => :data_uri
120
+ .
121
+ .fi
122
+ .
123
+ .IP "" 0
124
+ .
125
+ .P
113
126
  There may be cases where you need to customise an individual sprite and you don\'t want to change the global setting; \fBsprite\fR allows you to specify any of the global settings with the exception of "sass" and "css" like so:
114
127
  .
115
128
  .IP "" 4
@@ -122,6 +122,17 @@ DEFINING SPRITES
122
122
  one.png will contain "book" and "calculator", while two.png will con-
123
123
  tain "magnet" and "television".
124
124
 
125
+ You may instead prefer to set the save path to :data_uri; Polymer will
126
+ place the sprite contents into your CSS file. This reduces the number
127
+ of HTTP requests requires to load your pages at the expense of slightly
128
+ greater data transfer.
129
+
130
+
131
+
132
+ sprites "sources/:name/*" => :data_uri
133
+
134
+
135
+
125
136
  There may be cases where you need to customise an individual sprite and
126
137
  you don't want to change the global setting; sprite allows you to spec-
127
138
  ify any of the global settings with the exception of "sass" and "css"
@@ -145,4 +156,4 @@ SEE ALSO
145
156
 
146
157
 
147
158
 
148
- POLYMER 1.0.0.BETA.4 September 2010 .POLYMER(5)
159
+ POLYMER 1.0.0.BETA.5 October 2010 .POLYMER(5)
@@ -43,6 +43,13 @@ module Polymer
43
43
  #
44
44
  attr_reader :sprites
45
45
 
46
+ # Returns a subset of +sprites+ containing sprites which are to be written
47
+ # as a data URI in a Sass file.
48
+ #
49
+ # @return [Array<Polymer::Sprite>]
50
+ #
51
+ attr_reader :data_uri_sprites
52
+
46
53
  # Creates a new Project.
47
54
  #
48
55
  # Note that +new+ does not validation of the given paths or options; it
@@ -72,6 +79,14 @@ module Polymer
72
79
  @sass = extract_path :sass, options
73
80
  @css = extract_path :css, options
74
81
  @cachefile = extract_path :cache, options
82
+
83
+ # Sprites which are to be saved as a data URI need to have a save
84
+ # path explicitly set.
85
+ @data_uri_sprites = @sprites.select do |sprite|
86
+ if sprite.save_path == :data_uri
87
+ sprite.save_path = tmpdir.join("#{sprite.name.to_s}.png")
88
+ end
89
+ end
75
90
  end
76
91
 
77
92
  # Returns the sprite whose name is +name+.
@@ -80,7 +95,7 @@ module Polymer
80
95
  # The name of the sprite to be retrieved.
81
96
  #
82
97
  # @return [Polymer::Sprite] The sprite.
83
- # @return [nil] If no such sprite exists.
98
+ # @return [nil] If no such sprite exists.
84
99
  #
85
100
  def sprite(name)
86
101
  sprites.detect { |sprite| sprite.name == name }
@@ -103,6 +118,17 @@ module Polymer
103
118
  @cache ||= Polymer::Cache.new(@cachefile)
104
119
  end
105
120
 
121
+ # Returns a path to a temporary directory which may be used by this
122
+ # project.
123
+ #
124
+ # The temporary directory will be created if it does not already exist.
125
+ #
126
+ # @return [Pathname] Path to the temporary directory.
127
+ #
128
+ def tmpdir
129
+ @tmpdir ||= Pathname.new(Dir.mktmpdir).tap { |p| p.mkpath }
130
+ end
131
+
106
132
  private # ================================================================
107
133
 
108
134
  # Extracts a path, typically specified in the DSL, and converts it to
@@ -27,6 +27,12 @@ module Polymer
27
27
  save_to = project.sass + '_polymer.sass'
28
28
  end
29
29
 
30
+ data_uris = project.data_uri_sprites.inject({}) do |memo, sprite|
31
+ data = [sprite.save_path.read].pack('m').strip
32
+ memo[sprite.name] = "data:image/png;base64,#{data}"
33
+ memo
34
+ end
35
+
30
36
  File.open(save_to, 'w') do |file|
31
37
  file.puts ERB.new(File.read(TEMPLATE), nil, '<>').result(binding)
32
38
  end
@@ -2,7 +2,8 @@ module Polymer
2
2
  # Represents a collection of images which will be used to make a sprite.
3
3
  #
4
4
  class Sprite
5
- attr_reader :name, :save_path, :url, :padding, :sources
5
+ attr_reader :name, :url, :padding, :sources
6
+ attr_accessor :save_path
6
7
 
7
8
  # Creates a new Sprite instance.
8
9
  #
@@ -10,8 +11,10 @@ module Polymer
10
11
  # The name of the sprite.
11
12
  # @param [Array<Pathname>] sources
12
13
  # An array of Pathname instances to be used as sources.
13
- # @param [Pathname] save_path
14
- # The location at which the sprite should be saved.
14
+ # @param [Pathname, Symbol] save_path
15
+ # The location at which the sprite should be saved. When being used with
16
+ # a Project, this may instead be :data_uri; adding the sprite to the
17
+ # project will set the correct path.
15
18
  # @param [Integer] padding
16
19
  # The amount of transparent space, in pixels, to be inserted between
17
20
  # each source image.
@@ -2,6 +2,11 @@
2
2
  // command provided by the polymer gem. Don't edit this file directly;
3
3
  // change the polymer.rb configuration file, then re-run 'polymer'.
4
4
 
5
+ <% project.data_uri_sprites.each do |sprite| %>
6
+ .<%= sprite.name %>_data
7
+ background: url(<%= data_uris[sprite.name] %>) 0 0 no-repeat
8
+ <% end %>
9
+
5
10
  @mixin polymer($source, $x-offset: 0px, $y-offset: 0px)
6
11
  <% project.sprites.each_with_index do |sprite, sprite_index| %>
7
12
  <% sprite.sources.each_with_index do |source, source_index| %>
@@ -10,10 +15,15 @@
10
15
  <% else %>
11
16
  @else if $source == "<%= sprite.name %>/<%= source.name %>"
12
17
  <% end %>
18
+ <% if project.data_uri_sprites.include?(sprite) %>
19
+ @extend .<%= sprite.name %>_data
20
+ @include polymer-position($source, $x-offset, $y-offset)
21
+ <% else %>
13
22
  $y-offset: $y-offset - <%= sprite.position_of(source) %>px
14
23
  background: url(<%= sprite.url %>) $x-offset $y-offset no-repeat
15
24
  <% end %>
16
25
  <% end %>
26
+ <% end %>
17
27
 
18
28
  @mixin polymer-position($source, $x-offset: 0px, $y-offset: 0px)
19
29
  <% project.sprites.each_with_index do |sprite, sprite_index| %>
@@ -1,4 +1,4 @@
1
1
  module Polymer
2
2
  # The current version of the Polymer library.
3
- VERSION = '1.0.0.beta.4'.freeze
3
+ VERSION = '1.0.0.beta.5'.freeze
4
4
  end
data/polymer.gemspec CHANGED
@@ -8,8 +8,8 @@ Gem::Specification.new do |s|
8
8
  # rake task. It it completely safe to edit them, but using the rake task
9
9
  # is easier.
10
10
  s.name = 'polymer'
11
- s.version = '1.0.0.beta.4'
12
- s.date = '2010-09-29'
11
+ s.version = '1.0.0.beta.5'
12
+ s.date = '2010-10-31'
13
13
  s.rubyforge_project = 'polymer'
14
14
 
15
15
  # You may safely edit the section below.
metadata CHANGED
@@ -7,8 +7,8 @@ version: !ruby/object:Gem::Version
7
7
  - 0
8
8
  - 0
9
9
  - beta
10
- - 4
11
- version: 1.0.0.beta.4
10
+ - 5
11
+ version: 1.0.0.beta.5
12
12
  platform: ruby
13
13
  authors:
14
14
  - Anthony Williams
@@ -16,7 +16,7 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2010-09-29 00:00:00 +01:00
19
+ date: 2010-10-31 00:00:00 +01:00
20
20
  default_executable:
21
21
  dependencies:
22
22
  - !ruby/object:Gem::Dependency