Ortuna/padrino-pipeline

View on GitHub
lib/padrino-pipeline/ext/padrino-helpers/asset_tag_helper.rb

Summary

Maintainability
A
35 mins
Test Coverage
require 'padrino-helpers'

module Padrino
  module Helpers
    module AssetTagHelpers

      def pipeline_asset_folder_name(kind)
        pipeline = settings.pipeline
        case kind
        when :css    then pipeline.css_prefix
        when :js     then pipeline.js_prefix
        when :images then pipeline.image_prefix
        when :fonts  then pipeline.font_prefix
        else kind.to_s
        end
      end

      alias_method :original_asset_folder_name, :asset_folder_name
      alias_method :asset_folder_name, :pipeline_asset_folder_name

      alias_method :original_javascript_include_tag, :javascript_include_tag
      def javascript_include_tag(*sources)
        options = sources.extract_options!.symbolize_keys
        options.reverse_merge!(:type => 'text/javascript')
        sources.flatten.map { |source|
          content_tag(:script, nil, options.reverse_merge(:src => resolve_js_path(source.to_s)))
        }.join("\n").html_safe
      end

      alias_method :original_stylesheet_link_tag, :stylesheet_link_tag
      def stylesheet_link_tag(*sources)
        options = sources.extract_options!.symbolize_keys
        options.reverse_merge!(:media => 'screen', :rel => 'stylesheet', :type => 'text/css')
        sources.flatten.map { |source|
          tag(:link, options.reverse_merge(:href => asset_path(:css, resolve_css_path(source.to_s))))
        }.join("\n").html_safe
      end

      private
      def resolve_css_path(source)
        resolve_path(:css, source)
      end

      def resolve_js_path(source)
        resolve_path(:js, source)
      end

      def resolve_path(type, source)
        digested_source       = digested_source(source)
        digested_source_path  = digested_source_path(type, digested_source)
        File.exists?(digested_source_path) ? asset_path(type, digested_source) : asset_path(type, source)
      end

      ##
      # Get the full path of the digested_source
      def digested_source_path(type, digested_source)
        #hackzor
        settings.pipeline.asset_compiler.send("#{type.to_s}_output_path", digested_source)
      rescue
        ''
      end

      ##
      # Add the hex digest to the source path
      def digested_source(source)
        digest = asset_digest(source)
        parts  = source.split('.')
        (parts[0...parts.count-1]).join('.') << "-#{digest}.#{parts.last}"
      end

      ##
      # Get the hex digest for a particular asset
      def asset_digest(source)
        return '' unless defined? settings
        return '' unless settings.respond_to?(:assets)
        return '' unless settings.assets.respond_to?(:[])
        settings.assets[source] && settings.assets[source].digest
      end

    end #AssetTagHelpers
  end #Helpers
end #Padrino