Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
el / lib / el / assets.rb
Size: Mime:
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