Repository URL to install this package:
|
Version:
0.9.0 ▾
|
module EL
class AssetsMapper
include TagFactory
attr_reader :baseurl, :wd
# @example
#
# assets_mapper :vendor do
#
# js_tag :jquery
#
# chdir 'jquery-ui'
# js_tag 'js/jquery-ui.min'
# css_tag 'css/jquery-ui.min'
#
# cd '../bootstrap'
# js_tag 'js/bootstrap.min'
# css_tag 'css/bootstrap'
# end
#
# #=> <script src="/vendor/jquery.js" ...
# #=> <script src="/vendor/jquery-ui/js/jquery-ui.min.js" ...
# #=> <link href="/vendor/jquery-ui/css/jquery-ui.min.css" ...
# #=> <script src="/vendor/bootstrap/js/bootstrap.min.js" ...
# #=> <link href="/vendor/bootstrap/css/bootstrap.css" ...
#
def initialize baseurl, opts = {}, &proc
@opts = Hash[opts]
@suffix = @opts.delete(:suffix) || ''
baseurl = baseurl.to_s.dup.strip
baseurl.empty? ? baseurl = nil : (baseurl =~ /\/\Z/ || baseurl << '/')
@baseurl, @wd = baseurl.freeze, nil
proc && self.instance_exec(&proc)
end
(%w[js css] + EConstants::IMAGE_TAGS).each do |tag|
define_method tag + '_tag' do |src, attrs={}|
super src, attrs.merge(suffix: @suffix)
end
end
def chdir path = nil
return @wd = nil unless path
wd = []
if (path = path.to_s) =~ /\A\//
path = path.sub(/\A\/+/, '')
path = path.empty? ? [] : [path]
else
dirs_back, path = path.split(/\/+/).partition { |c| c == '..' }
if @wd
wd_chunks = @wd.split(/\/+/)
wd = wd_chunks[0, wd_chunks.size - dirs_back.size] || []
end
end
@wd = (wd + path << '').compact.join('/').freeze
end
alias :cd :chdir
private
def assets_url path = nil
chunks = [baseurl, wd, path] # assigning array to a variable
chunks.select! {|c| c && c.size > 0} # and work on it
File.join(*chunks) # is 2x faster than array#select {...}
end
end
end
class E
include EL::TagFactory
def assets *args, &proc
app.assets *args, &proc
end
def assets_mapper *args, &proc
EL::AssetsMapper.new *args, &proc
end
private
def assets_url path = nil
path ?
(app.assets_url ? File.join(app.assets_url, path.to_s) : path.to_s) :
(app.assets_url ? app.assets_url : '')
end
end
class EBuilder
# set the baseurl for assets.
# by default, assets URL is empty.
#
# @example assets_url not set
# script_tag 'master.js'
# => <script src="master.js"
# style_tag 'theme.css'
# => <link href="theme.css"
#
# @example assets_url set to /assets
#
# script_tag 'master.js'
# => <script src="/assets/master.js"
# style_tag 'theme.css'
# => <link href="/assets/theme.css"
#
# @note
# by default, Sprockets will be used to serve static files.
# to disable this, set second argument to false.
#
def assets_url url = nil, server = true
return @assets_url if @assets_url
url = url.to_s.dup.strip
url = url =~ /\A[\w|\d]+\:\/\//i ? url : EUtils.rootify_url(url)
@assets_url = (url =~ /\/\Z/ ? url : String.new(url) << '/').freeze
return unless server
mount_application(assets, @assets_url, on: :GET)
end
alias assets_map assets_url
def assets
@sprockets_env ||= Sprockets::Environment.new(root)
end
end