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.



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

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'


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

def content_type
  @content_type
end

#environmentObject (readonly)

Returns the value of attribute environment.



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

def environment
  @environment
end

#filenameObject (readonly)

Returns the value of attribute filename.



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

def filename
  @filename
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`.



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

def load_path
  @load_path
end

#logical_pathObject (readonly)

Returns logical path without any file extensions.

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


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

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' %>')


169
170
171
172
173
174
175
176
# File 'lib/condenser/context.rb', line 169

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)


184
185
186
187
188
189
190
191
192
193
194
195
196
# File 'lib/condenser/context.rb', line 184

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.



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

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 made to the dependency file will invalidate the cache of the source file.



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

def depend_on(path)
  if environment.absolute_path?(path) && environment.stat(path)
    @dependencies << environment.build_file_digest_uri(path)
  else
    resolve(path)
  end
  nil
end

#depend_on_asset(path) ⇒ Object

‘depend_on_asset` allows you to state an asset dependency without including it.

This is used for caching purposes. Any changes that would invalidate the dependency asset will invalidate the source file. Unlike ‘depend_on`, this will recursively include the target asset’s dependencies.



132
133
134
135
136
# File 'lib/condenser/context.rb', line 132

def depend_on_asset(path)
  asset = environment.find!(path)
  @dependencies << asset.source_file
  asset
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.



143
144
145
# File 'lib/condenser/context.rb', line 143

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

#env_proxyObject



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

def env_proxy
  ENVProxy.new(self)
end

#font_path(path) ⇒ Object

Expand logical font asset path.



214
215
216
# File 'lib/condenser/context.rb', line 214

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

#image_path(path) ⇒ Object

Expand logical image asset path.



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

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

#javascript_path(path) ⇒ Object

Expand logical javascript asset path.



219
220
221
# File 'lib/condenser/context.rb', line 219

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.



152
153
154
155
156
# File 'lib/condenser/context.rb', line 152

def link_asset(path)
  asset = depend_on_asset(path)
  @links << asset.path
  asset
end

#load(uri) ⇒ Object

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

uri - AssetURI

Returns Asset.



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

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

#metadataObject



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

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.



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

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.



224
225
226
# File 'lib/condenser/context.rb', line 224

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

#video_path(path) ⇒ Object

Expand logical video asset path.



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

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