Class: Condenser::Context

Inherits:
Object
  • Object
show all
Defined in:
lib/condenser/context.rb

Overview

They are typically accessed by ERB templates. You can mix in custom helpers by injecting them into ‘Environment#context_class`. Do not mix them into Context directly.

environment.context_class.class_eval do
  include MyHelper
  def asset_url; end
end

<%= asset_url "foo.png" %>

The Context also collects dependencies declared by assets. See DirectiveProcessor for an example of this.

Defined Under Namespace

Classes: ENVProxy

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(environment) ⇒ Context

Returns a new instance of Context.



41
42
43
44
45
# File 'lib/condenser/context.rb', line 41

def initialize(environment)
  @environment  = environment
  @dependencies = Set.new
  @links = Set.new
end

Instance Attribute Details

#content_typeObject (readonly)

Returns content type of file

'application/javascript'
'text/css'


78
79
80
# File 'lib/condenser/context.rb', line 78

def content_type
  @content_type
end

#dependenciesObject (readonly)

Returns the value of attribute dependencies.



39
40
41
# File 'lib/condenser/context.rb', line 39

def dependencies
  @dependencies
end

#environmentObject (readonly)

Returns the value of attribute environment.



39
40
41
# File 'lib/condenser/context.rb', line 39

def environment
  @environment
end

#filenameObject (readonly)

Returns the value of attribute filename.



39
40
41
# File 'lib/condenser/context.rb', line 39

def filename
  @filename
end

Returns the value of attribute links.



39
40
41
# File 'lib/condenser/context.rb', line 39

def links
  @links
end

#load_pathObject (readonly) Also known as: root_path

Returns the environment path that contains the file.

If app/javascripts and app/stylesheets are in your path, and current file is app/javascripts/foo/bar.js, load_path would return app/javascripts.



63
64
65
# File 'lib/condenser/context.rb', line 63

def load_path
  @load_path
end

#logical_pathObject (readonly)

Returns logical path without any file extensions.

'app/javascripts/application.js'
# => 'application'


71
72
73
# File 'lib/condenser/context.rb', line 71

def logical_path
  @logical_path
end

Instance Method Details

#asset_data_uri(path) ⇒ Object

Returns a data: URI with the contents of the asset at the specified path, and marks that path as a dependency of the current file.

Uses URI encoding for SVG files, base64 encoding for all the other files.

Use asset_data_uri from ERB with CSS or JavaScript assets:

#logo { background: url(<%= asset_data_uri 'logo.png' %>) }

$('<img>').attr('src', '<%= asset_data_uri 'avatar.jpg' %>')


154
155
156
157
158
159
160
161
# File 'lib/condenser/context.rb', line 154

def asset_data_uri(path)
  asset = depend_on_asset(path)
  if asset.content_type == 'image/svg+xml'
    svg_asset_data_uri(asset)
  else
    base64_asset_data_uri(asset)
  end
end

#asset_path(path, options = {}) ⇒ Object

Expands logical path to full url to asset.

NOTE: This helper is currently not implemented and should be customized by the application. Though, in the future, some basics implemention may be provided with different methods that are required to be overridden.

Raises:

  • (LoadError)


169
170
171
172
173
174
175
176
177
178
179
180
181
# File 'lib/condenser/context.rb', line 169

def asset_path(path, options = {})
  message = <<-EOS
Custom asset_path helper is not implemented

Extend your environment context with a custom method.

environment.context_class.class_eval do
  def asset_path(path, options = {})
  end
end
  EOS
  raise LoadError, message # Rack does not catch NotImplementedError
end

#audio_path(path) ⇒ Object

Expand logical audio asset path.



194
195
196
# File 'lib/condenser/context.rb', line 194

def audio_path(path)
  asset_path(path, type: :audio)
end

#depend_on(path) ⇒ Object

depend_on allows you to state a dependency on a file without including it.

This is used for caching purposes. Any changes that would invalidate the dependency asset will invalidate the source file.



117
118
119
120
121
122
# File 'lib/condenser/context.rb', line 117

def depend_on(path)
  d = environment.decompose_path(path)
  @dependencies << [File.join(*d[0], d[1]), [d[3]]]

  nil
end

#depend_on_env(key) ⇒ Object

depend_on_env allows you to state a dependency on an environment variable.

This is used for caching purposes. Any changes in the value of the environment variable will invalidate the cache of the source file.



129
130
131
# File 'lib/condenser/context.rb', line 129

def depend_on_env(key)
  @dependencies << "env:#{key}"
end

#env_proxyObject



54
55
56
# File 'lib/condenser/context.rb', line 54

def env_proxy
  ENVProxy.new(self)
end

#font_path(path) ⇒ Object

Expand logical font asset path.



199
200
201
# File 'lib/condenser/context.rb', line 199

def font_path(path)
  asset_path(path, type: :font)
end

#image_path(path) ⇒ Object

Expand logical image asset path.



184
185
186
# File 'lib/condenser/context.rb', line 184

def image_path(path)
  asset_path(path, type: :image)
end

#javascript_path(path) ⇒ Object

Expand logical javascript asset path.



204
205
206
# File 'lib/condenser/context.rb', line 204

def javascript_path(path)
  asset_path(path, type: :javascript)
end

link_asset declares an external dependency on an asset without directly including it. The target asset is returned from this function making it easy to construct a link to it.

Returns an Asset or nil.



138
139
140
141
# File 'lib/condenser/context.rb', line 138

def link_asset(path)
  depend_on(path)
  @links << path
end

#load(uri) ⇒ Object

Public: Load Asset by AssetURI and track it as a dependency.

uri - AssetURI

Returns Asset.



105
106
107
108
109
# File 'lib/condenser/context.rb', line 105

def load(uri)
  asset = environment.load(uri)
  @dependencies.merge(asset.[:dependencies])
  asset
end

#metadataObject



47
48
49
50
51
52
# File 'lib/condenser/context.rb', line 47

def 
  {
    links: @links,
    dependencies: @dependencies
  }
end

#resolve(path, **kargs) ⇒ Object

Public: Given a logical path, resolve will find and return an Asset URI. Relative paths will also be resolved. An accept type maybe given to restrict the search.

resolve("foo.js")
# => "file:///path/to/app/javascripts/foo.js?type=application/javascript"

resolve("./bar.js")
# => "file:///path/to/app/javascripts/bar.js?type=application/javascript"

path - String logical or absolute path accept - String content accept type

Returns an Asset URI String.



94
95
96
97
98
# File 'lib/condenser/context.rb', line 94

def resolve(path, **kargs)
  uri, deps = environment.resolve!(path, @dirname, **kargs)
  @dependencies.merge(deps)
  uri
end

#stylesheet_path(path) ⇒ Object

Expand logical stylesheet asset path.



209
210
211
# File 'lib/condenser/context.rb', line 209

def stylesheet_path(path)
  asset_path(path, type: :stylesheet)
end

#video_path(path) ⇒ Object

Expand logical video asset path.



189
190
191
# File 'lib/condenser/context.rb', line 189

def video_path(path)
  asset_path(path, type: :video)
end