# export to all templates
# = asset 'www/index.scss'
# = asset 'www/index.coffee'
module HtmlHelper
def asset_include path, opts={}
raise ArgumentError.new("Asset path can't be empty") if path.empty?
ext = path.split('?').first.split('.').last
type = ['css', 'sass', 'scss'].include?(ext) ? :style : :script
type = :style if path.include?('fonts.googleapis.com')
current.response.early_hints path, type
if type == :style
%[]
else
%[]
end
end
# builds full asset path based on resource extension
# asset('js/main')
# will render 'app/assets/js/main/index.coffee' as http://aset.path/assets/main-index-md5hash.js
def asset file, opts={}
opts = { dev_file: opts } unless opts.class == Hash
if Lux.config(:compile_assets)
# return second link if it is defined and we are in dev mode
return asset_include opts[:dev_file] if opts[:dev_file]
# return internet links
return asset_include file if file.starts_with?('/') || file.starts_with?('http')
# try to create list of incuded files and show every one of them
files = LuxAssets.files(file) || []
data = files.inject([]) do |total, asset|
if asset.is_a?(Proc)
tag_name = file.include?('css') ? :style : :script
total.push({}.tag tag_name, asset.call)
else
total.push asset_include '/compiled_asset/' + asset
end
end
data.map{ |it| it.sub(/^\s\s/,'') }.join("\n")
else
# return asset link in production or fail unless able
manifest = Lux.ram_cache('asset-manifest') { JSON.load Lux.root.join('public/manifest.json').read }
mfile = manifest['files'][file]
if mfile.empty?
unless opts[:raise].is_a?(FalseClass)
raise 'Compiled asset link for "%s" not found in manifest.json' % file
end
nil
else
return asset_include(Lux.config.assets_root.to_s + mfile, opts)
end
end
end
# assets :vendor, :main
def assets *args
total = []
[:css, :js].each do |ext|
args.map do |group|
data = asset("#{ext}/#{group}", raise: false)
total.push data if data.present?
end
end
total.join($/)
end
end