module Hanami::Assets::Helpers

HTML assets helpers

Include this helper in a view

@since 0.1.0

@see www.rubydoc.info/gems/hanami-helpers/Hanami/Helpers/HtmlHelper

rubocop:disable Metrics/ModuleLength

Constants

ABSOLUTE_URL_MATCHER

@since 0.3.0 @api private

CROSSORIGIN_ANONYMOUS

@since 0.3.0 @api private

DEFAULT_FAVICON

@since 0.1.0 @api private

FAVICON_MIME_TYPE

@since 0.1.0 @api private

FAVICON_REL

@since 0.1.0 @api private

JAVASCRIPT_EXT

@since 0.1.0 @api private

JAVASCRIPT_MIME_TYPE

@since 0.1.0 @api private

NEW_LINE_SEPARATOR

@since 0.1.0 @api private

QUERY_STRING_MATCHER

@since 1.1.0 @api private

STYLESHEET_EXT

@since 0.1.0 @api private

STYLESHEET_MIME_TYPE

@since 0.1.0 @api private

STYLESHEET_REL

@since 0.1.0 @api private

WILDCARD_EXT

@since 0.1.0 @api private

Public Class Methods

included(base) click to toggle source

Inject helpers into the given class

@since 0.1.0 @api private

# File lib/hanami/assets/helpers.rb, line 77
def self.included(base)
  conf = ::Hanami::Assets::Configuration.for(base)
  base.class_eval do
    include Utils::ClassAttribute

    class_attribute :assets_configuration
    self.assets_configuration = conf
  end
end

Public Instance Methods

asset_path(source, push: false, as: nil) click to toggle source

It generates the relative URL for the given source.

It can be the name of the asset, coming from the sources or third party gems.

Absolute URLs are returned as they are.

If Fingerprint mode is on, it returns the fingerprinted path of the source

If CDN mode is on, it returns the absolute URL of the asset.

@param source [String] the asset name @param push [TrueClass, FalseClass, Symbol] HTTP/2 Push Promise/Early Hints flag, or type @param as [Symbol] HTTP/2 Push Promise / Early Hints flag type

@return [String] the asset path

@raise [Hanami::Assets::MissingManifestAssetError] if `fingerprint` or `subresource_integrity` modes are on and the asset is missing from the manifest

@since 0.1.0

@example Basic Usage

<%= asset_path 'application.js' %>

# "/assets/application.js"

@example Absolute URL

<%= asset_path 'https://code.jquery.com/jquery-2.1.4.min.js' %>

# "https://code.jquery.com/jquery-2.1.4.min.js"

@example Fingerprint Mode

<%= asset_path 'application.js' %>

# "/assets/application-28a6b886de2372ee3922fcaf3f78f2d8.js"

@example CDN Mode

<%= asset_path 'application.js' %>

# "https://assets.bookshelf.org/assets/application-28a6b886de2372ee3922fcaf3f78f2d8.js"

@example Enable Push Promise/Early Hints

<%= asset_path "application.js", push: :script %>
# File lib/hanami/assets/helpers.rb, line 781
def asset_path(source, push: false, as: nil)
  _asset_url(source, push: push, as: as) { _relative_url(source) }
end
asset_url(source, push: false, as: nil) click to toggle source

It generates the absolute URL for the given source.

It can be the name of the asset, coming from the sources or third party gems.

Absolute URLs are returned as they are.

If Fingerprint mode is on, it returns the fingerprint URL of the source

If CDN mode is on, it returns the absolute URL of the asset.

@param source [String] the asset name @param push [TrueClass, FalseClass, Symbol] HTTP/2 Push Promise/Early Hints flag, or type @param as [Symbol] HTTP/2 Push Promise / Early Hints flag type

@return [String] the asset URL

@raise [Hanami::Assets::MissingManifestAssetError] if `fingerprint` or `subresource_integrity` modes are on and the asset is missing from the manifest

@since 0.1.0

@example Basic Usage

<%= asset_url 'application.js' %>

# "https://bookshelf.org/assets/application.js"

@example Absolute URL

<%= asset_url 'https://code.jquery.com/jquery-2.1.4.min.js' %>

# "https://code.jquery.com/jquery-2.1.4.min.js"

@example Fingerprint Mode

<%= asset_url 'application.js' %>

# "https://bookshelf.org/assets/application-28a6b886de2372ee3922fcaf3f78f2d8.js"

@example CDN Mode

<%= asset_url 'application.js' %>

# "https://assets.bookshelf.org/assets/application-28a6b886de2372ee3922fcaf3f78f2d8.js"

@example Enable Push Promise/Early Hints

<%= asset_url "application.js", push: :script %>
# File lib/hanami/assets/helpers.rb, line 835
def asset_url(source, push: false, as: nil)
  _asset_url(source, push: push, as: as) { _absolute_url(source) }
end
audio(source = nil, options = {}, &blk) click to toggle source

Generate audio tag for given source

It accepts one string representing the name of the asset, if it comes from the application or third party gems. It also accepts string representing absolute URLs in case of public CDN (eg. Bootstrap CDN).

Alternatively, it accepts a block that allows to specify one or more sources via the source tag.

If the “fingerprint mode” is on, src is the fingerprinted version of the relative URL.

If the “CDN mode” is on, the src is an absolute URL of the application CDN.

@param source [String] asset name or absolute URL @param options [Hash] HTML 5 attributes @option options [TrueClass, FalseClass] :push HTTP/2 Push Promise/Early Hints flag

@return [Hanami::Utils::Helpers::HtmlBuilder] the builder

@raise [Hanami::Assets::MissingManifestAssetError] if `fingerprint` or `subresource_integrity` modes are on and the audio file is missing from the manifest

@raise [ArgumentError] if source isn't specified both as argument or

tag inside the given block

@since 0.1.0

@see Hanami::Assets::Configuration#fingerprint @see Hanami::Assets::Configuration#cdn @see Hanami::Assets::Helpers#asset_path

@example Basic Usage

<%= audio 'song.ogg' %>

# <audio src="/assets/song.ogg"></audio>

@example Absolute URL

<%= audio 'https://example-cdn.com/assets/song.ogg' %>

# <audio src="https://example-cdn.com/assets/song.ogg"></audio>

@example Custom HTML Attributes

<%= audio('song.ogg', autoplay: true, controls: true) %>

# <audio src="/assets/song.ogg" autoplay="autoplay" controls="controls"></audio>

@example Fallback Content

<%=
  audio('song.ogg') do
    "Your browser does not support the audio tag"
  end
%>

# <audio src="/assets/song.ogg">
#  Your browser does not support the audio tag
# </audio>

@example Tracks

<%=
  audio('song.ogg') do
    track(kind: 'captions', src:  asset_path('song.pt-BR.vtt'),
          srclang: 'pt-BR', label: 'Portuguese')
  end
%>

# <audio src="/assets/song.ogg">
#   <track kind="captions" src="/assets/song.pt-BR.vtt" srclang="pt-BR" label="Portuguese">
# </audio>

@example Sources

<%=
  audio do
    text "Your browser does not support the audio tag"
    source(src: asset_path('song.ogg'), type: 'audio/ogg')
    source(src: asset_path('song.wav'), type: 'auido/wav')
  end
%>

# <audio>
#   Your browser does not support the audio tag
#   <source src="/assets/song.ogg" type="audio/ogg">
#   <source src="/assets/song.wav" type="auido/wav">
# </audio>

@example Without Any Argument

<%= audio %>

# ArgumentError

@example Without src And Without Block

<%= audio(controls: true) %>

# ArgumentError

@example Fingerprint Mode

<%= audio 'song.ogg' %>

# <audio src="/assets/song-28a6b886de2372ee3922fcaf3f78f2d8.ogg"></audio>

@example CDN Mode

<%= audio 'song.ogg' %>

# <audio src="https://assets.bookshelf.org/assets/song-28a6b886de2372ee3922fcaf3f78f2d8.ogg"></audio>

@example Enable Push Promise/Early Hints

<%= audio 'movie.mp4', push: true %>

<%=

audio do
  text "Your browser does not support the audio tag"
  source src: asset_path("song.ogg", push: :audio), type: "audio/ogg"
  source src: asset_path("song.wav"), type: "audio/wav"
end

%>

# File lib/hanami/assets/helpers.rb, line 726
def audio(source = nil, options = {}, &blk)
  options = _source_options(source, options, as: :audio, &blk)
  html.audio(blk, options)
end
favicon(source = DEFAULT_FAVICON, options = {}) click to toggle source

Generate link tag application favicon.

If no argument is given, it assumes favico.ico from the application.

It accepts one string representing the name of the asset.

If the “fingerprint mode” is on, href is the fingerprinted version of the relative URL.

If the “CDN mode” is on, the href is an absolute URL of the application CDN.

@param source [String] asset name @param options [Hash] HTML 5 attributes @option options [TrueClass, FalseClass] :push HTTP/2 Push Promise/Early Hints flag

@return [Hanami::Utils::Helpers::HtmlBuilder] the builder

@raise [Hanami::Assets::MissingManifestAssetError] if `fingerprint` or `subresource_integrity` modes are on and the favicon is file missing from the manifest

@since 0.1.0

@see Hanami::Assets::Configuration#fingerprint @see Hanami::Assets::Configuration#cdn @see Hanami::Assets::Helpers#asset_path

@example Basic Usage

<%= favicon %>

# <link href="/assets/favicon.ico" rel="shortcut icon" type="image/x-icon">

@example Custom Path

<%= favicon 'fav.ico' %>

# <link href="/assets/fav.ico" rel="shortcut icon" type="image/x-icon">

@example Custom HTML Attributes

<%= favicon "favicon.ico", id: "fav" %>

# <link id: "fav" href="/assets/favicon.ico" rel="shortcut icon" type="image/x-icon">

@example Fingerprint Mode

<%= favicon %>

# <link href="/assets/favicon-28a6b886de2372ee3922fcaf3f78f2d8.ico" rel="shortcut icon" type="image/x-icon">

@example CDN Mode

<%= favicon %>

# <link href="https://assets.bookshelf.org/assets/favicon-28a6b886de2372ee3922fcaf3f78f2d8.ico"
        rel="shortcut icon" type="image/x-icon">

@example Enable Push Promise/Early Hints

<%= favicon 'favicon.ico', push: true %>
# File lib/hanami/assets/helpers.rb, line 452
def favicon(source = DEFAULT_FAVICON, options = {})
  options = options.reject { |k, _| k.to_sym == :href }

  attributes = {
    href: asset_path(source, push: options.delete(:push) || false, as: :image),
    rel: FAVICON_REL,
    type: FAVICON_MIME_TYPE
  }
  attributes.merge!(options)

  html.link(attributes)
end
image(source, options = {}) click to toggle source

Generate img tag for given source

It accepts one string representing the name of the asset, if it comes from the application or third party gems. It also accepts string representing absolute URLs in case of public CDN (eg. Bootstrap CDN).

alt Attribute is auto generated from src. You can specify a different value, by passing the :src option.

If the “fingerprint mode” is on, src is the fingerprinted version of the relative URL.

If the “CDN mode” is on, the src is an absolute URL of the application CDN.

@param source [String] asset name or absolute URL @param options [Hash] HTML 5 attributes @option options [TrueClass, FalseClass] :push HTTP/2 Push Promise/Early Hints flag

@return [Hanami::Utils::Helpers::HtmlBuilder] the builder

@raise [Hanami::Assets::MissingManifestAssetError] if `fingerprint` or `subresource_integrity` modes are on and the image file is missing from the manifest

@since 0.1.0

@see Hanami::Assets::Configuration#fingerprint @see Hanami::Assets::Configuration#cdn @see Hanami::Assets::Configuration#subresource_integrity @see Hanami::Assets::Helpers#asset_path

@example Basic Usage

<%= image 'logo.png' %>

# <img src="/assets/logo.png" alt="Logo">

@example Custom alt Attribute

<%= image 'logo.png', alt: 'Application Logo' %>

# <img src="/assets/logo.png" alt="Application Logo">

@example Custom HTML Attributes

<%= image 'logo.png', id: 'logo', class: 'image' %>

# <img src="/assets/logo.png" alt="Logo" id="logo" class="image">

@example Absolute URL

<%= image 'https://example-cdn.com/images/logo.png' %>

# <img src="https://example-cdn.com/images/logo.png" alt="Logo">

@example Fingerprint Mode

<%= image 'logo.png' %>

# <img src="/assets/logo-28a6b886de2372ee3922fcaf3f78f2d8.png" alt="Logo">

@example CDN Mode

<%= image 'logo.png' %>

# <img src="https://assets.bookshelf.org/assets/logo-28a6b886de2372ee3922fcaf3f78f2d8.png" alt="Logo">

@example Enable Push Promise/Early Hints

<%= image 'logo.png', push: true %>
# File lib/hanami/assets/helpers.rb, line 379
def image(source, options = {})
  options = options.reject { |k, _| k.to_sym == :src }
  attributes = {
    src: asset_path(source, push: options.delete(:push) || false, as: :image),
    alt: Utils::String.titleize(::File.basename(source, WILDCARD_EXT))
  }
  attributes.merge!(options)

  html.img(attributes)
end
javascript(*sources, push: true, **options) click to toggle source

Generate script tag for given source(s)

It accepts one or more strings representing the name of the asset, if it comes from the application or third party gems. It also accepts strings representing absolute URLs in case of public CDN (eg. jQuery CDN).

If the “fingerprint mode” is on, src is the fingerprinted version of the relative URL.

If the “CDN mode” is on, the src is an absolute URL of the application CDN.

If the “subresource integrity mode” is on, integriy is the name of the algorithm, then a hyphen, then the hash value of the file. If more than one algorithm is used, they'll be separated by a space.

It makes the script(s) eligible for HTTP/2 Push Promise/Early Hints. You can opt-out with inline option: `push: false`.

@param sources [Array<String>] one or more assets by name or absolute URL @param push [TrueClass, FalseClass] HTTP/2 Push Promise/Early Hints flag

@return [Hanami::Utils::Escape::SafeString] the markup

@raise [Hanami::Assets::MissingManifestAssetError] if `fingerprint` or `subresource_integrity` modes are on and the javascript file is missing from the manifest

@since 0.1.0

@see Hanami::Assets::Configuration#fingerprint @see Hanami::Assets::Configuration#cdn @see Hanami::Assets::Helpers#asset_path

@example Single Asset

<%= javascript 'application' %>

# <script src="/assets/application.js" type="text/javascript"></script>

@example Multiple Assets

<%= javascript 'application', 'dashboard' %>

# <script src="/assets/application.js" type="text/javascript"></script>
# <script src="/assets/dashboard.js" type="text/javascript"></script>

@example Asynchronous Execution

<%= javascript 'application', async: true %>

# <script src="/assets/application.js" type="text/javascript" async="async"></script>

@example Subresource Integrity

<%= javascript 'application' %>

# <script src="/assets/application-28a6b886de2372ee3922fcaf3f78f2d8.js"
#         type="text/javascript" integrity="sha384-oqVu...Y8wC" crossorigin="anonymous"></script>

@example Subresource Integrity for 3rd Party Scripts

<%= javascript 'https://example.com/assets/example.js', integrity: 'sha384-oqVu...Y8wC' %>

# <script src="https://example.com/assets/example.js" type="text/javascript"
#         integrity="sha384-oqVu...Y8wC" crossorigin="anonymous"></script>

@example Deferred Execution

<%= javascript 'application', defer: true %>

# <script src="/assets/application.js" type="text/javascript" defer="defer"></script>

@example Absolute URL

<%= javascript 'https://code.jquery.com/jquery-2.1.4.min.js' %>

# <script src="https://code.jquery.com/jquery-2.1.4.min.js" type="text/javascript"></script>

@example Fingerprint Mode

<%= javascript 'application' %>

# <script src="/assets/application-28a6b886de2372ee3922fcaf3f78f2d8.js" type="text/javascript"></script>

@example CDN Mode

<%= javascript 'application' %>

# <script src="https://assets.bookshelf.org/assets/application-28a6b886de2372ee3922fcaf3f78f2d8.js"
#         type="text/javascript"></script>

@example Disable Push Promise/Early Hints

<%= javascript 'application', push: false %>
<%= javascript 'http://cdn.example.test/jquery.js', 'dashboard', push: false %>
# File lib/hanami/assets/helpers.rb, line 183
def javascript(*sources, push: true, **options)
  options = options.reject { |k, _| k.to_sym == :src }

  _safe_tags(*sources) do |source|
    attributes = {
      src: _typed_asset_path(source, JAVASCRIPT_EXT, push: push, as: :script),
      type: JAVASCRIPT_MIME_TYPE
    }
    attributes.merge!(options)

    if _subresource_integrity? || attributes.include?(:integrity)
      attributes[:integrity] ||= _subresource_integrity_value(source, JAVASCRIPT_EXT)
      attributes[:crossorigin] ||= CROSSORIGIN_ANONYMOUS
    end

    html.script(**attributes).to_s
  end
end
stylesheet(*sources, push: true, **options) click to toggle source

Generate link tag for given source(s)

It accepts one or more strings representing the name of the asset, if it comes from the application or third party gems. It also accepts strings representing absolute URLs in case of public CDN (eg. Bootstrap CDN).

If the “fingerprint mode” is on, href is the fingerprinted version of the relative URL.

If the “CDN mode” is on, the href is an absolute URL of the application CDN.

If the “subresource integrity mode” is on, integriy is the name of the algorithm, then a hyphen, then the hashed value of the file. If more than one algorithm is used, they'll be separated by a space.

It makes the script(s) eligible for HTTP/2 Push Promise/Early Hints. You can opt-out with inline option: `push: false`.

@param sources [Array<String>] one or more assets by name or absolute URL @param push [TrueClass, FalseClass] HTTP/2 Push Promise/Early Hints flag

@return [Hanami::Utils::Escape::SafeString] the markup

@raise [Hanami::Assets::MissingManifestAssetError] if `fingerprint` or `subresource_integrity` modes are on and the stylesheet file is missing from the manifest

@since 0.1.0

@see Hanami::Assets::Configuration#fingerprint @see Hanami::Assets::Configuration#cdn @see Hanami::Assets::Configuration#subresource_integrity @see Hanami::Assets::Helpers#asset_path

@example Single Asset

<%= stylesheet 'application' %>

# <link href="/assets/application.css" type="text/css" rel="stylesheet">

@example Multiple Assets

<%= stylesheet 'application', 'dashboard' %>

# <link href="/assets/application.css" type="text/css" rel="stylesheet">
# <link href="/assets/dashboard.css" type="text/css" rel="stylesheet">

@example Subresource Integrity

<%= stylesheet 'application' %>

# <link href="/assets/application-28a6b886de2372ee3922fcaf3f78f2d8.css"
#       type="text/css" integrity="sha384-oqVu...Y8wC" crossorigin="anonymous"></script>

@example Subresource Integrity for 3rd Party Assets

<%= stylesheet 'https://example.com/assets/example.css', integrity: 'sha384-oqVu...Y8wC' %>

# <link href="https://example.com/assets/example.css"
#       type="text/css" rel="stylesheet" integrity="sha384-oqVu...Y8wC" crossorigin="anonymous"></script>

@example Absolute URL

<%= stylesheet 'https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css' %>

# <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css"
#       type="text/css" rel="stylesheet">

@example Fingerprint Mode

<%= stylesheet 'application' %>

# <link href="/assets/application-28a6b886de2372ee3922fcaf3f78f2d8.css" type="text/css" rel="stylesheet">

@example CDN Mode

<%= stylesheet 'application' %>

# <link href="https://assets.bookshelf.org/assets/application-28a6b886de2372ee3922fcaf3f78f2d8.css"
#       type="text/css" rel="stylesheet">

@example Disable Push Promise/Early Hints

<%= stylesheet 'application', push: false %>
<%= stylesheet 'http://cdn.example.test/bootstrap.css', 'dashboard', push: false %>
# File lib/hanami/assets/helpers.rb, line 288
def stylesheet(*sources, push: true, **options)
  options = options.reject { |k, _| k.to_sym == :href }

  _safe_tags(*sources) do |source|
    attributes = {
      href: _typed_asset_path(source, STYLESHEET_EXT, push: push, as: :style),
      type: STYLESHEET_MIME_TYPE,
      rel: STYLESHEET_REL
    }
    attributes.merge!(options)

    if _subresource_integrity? || attributes.include?(:integrity)
      attributes[:integrity] ||= _subresource_integrity_value(source, STYLESHEET_EXT)
      attributes[:crossorigin] ||= CROSSORIGIN_ANONYMOUS
    end

    html.link(**attributes).to_s
  end
end
video(source = nil, options = {}, &blk) click to toggle source

Generate video tag for given source

It accepts one string representing the name of the asset, if it comes from the application or third party gems. It also accepts string representing absolute URLs in case of public CDN (eg. Bootstrap CDN).

Alternatively, it accepts a block that allows to specify one or more sources via the source tag.

If the “fingerprint mode” is on, src is the fingerprinted version of the relative URL.

If the “CDN mode” is on, the src is an absolute URL of the application CDN.

@param source [String] asset name or absolute URL @param options [Hash] HTML 5 attributes @option options [TrueClass, FalseClass] :push HTTP/2 Push Promise/Early Hints flag

@return [Hanami::Utils::Helpers::HtmlBuilder] the builder

@raise [Hanami::Assets::MissingManifestAssetError] if `fingerprint` or `subresource_integrity` modes are on and the video file is missing from the manifest

@raise [ArgumentError] if source isn't specified both as argument or

tag inside the given block

@since 0.1.0

@see Hanami::Assets::Configuration#fingerprint @see Hanami::Assets::Configuration#cdn @see Hanami::Assets::Helpers#asset_path

@example Basic Usage

<%= video 'movie.mp4' %>

# <video src="/assets/movie.mp4"></video>

@example Absolute URL

<%= video 'https://example-cdn.com/assets/movie.mp4' %>

# <video src="https://example-cdn.com/assets/movie.mp4"></video>

@example Custom HTML Attributes

<%= video('movie.mp4', autoplay: true, controls: true) %>

# <video src="/assets/movie.mp4" autoplay="autoplay" controls="controls"></video>

@example Fallback Content

<%=
  video('movie.mp4') do
    "Your browser does not support the video tag"
  end
%>

# <video src="/assets/movie.mp4">
#  Your browser does not support the video tag
# </video>

@example Tracks

<%=
  video('movie.mp4') do
    track(kind: 'captions', src:  asset_path('movie.en.vtt'),
          srclang: 'en', label: 'English')
  end
%>

# <video src="/assets/movie.mp4">
#   <track kind="captions" src="/assets/movie.en.vtt" srclang="en" label="English">
# </video>

@example Sources

<%=
  video do
    text "Your browser does not support the video tag"
    source(src: asset_path('movie.mp4'), type: 'video/mp4')
    source(src: asset_path('movie.ogg'), type: 'video/ogg')
  end
%>

# <video>
#   Your browser does not support the video tag
#   <source src="/assets/movie.mp4" type="video/mp4">
#   <source src="/assets/movie.ogg" type="video/ogg">
# </video>

@example Without Any Argument

<%= video %>

# ArgumentError

@example Without src And Without Block

<%= video(content: true) %>

# ArgumentError

@example Fingerprint Mode

<%= video 'movie.mp4' %>

# <video src="/assets/movie-28a6b886de2372ee3922fcaf3f78f2d8.mp4"></video>

@example CDN Mode

<%= video 'movie.mp4' %>

# <video src="https://assets.bookshelf.org/assets/movie-28a6b886de2372ee3922fcaf3f78f2d8.mp4"></video>

@example Enable Push Promise/Early Hints

<%= video 'movie.mp4', push: true %>

<%=

video do
  text "Your browser does not support the video tag"
  source src: asset_path("movie.mp4", push: :video), type: "video/mp4"
  source src: asset_path("movie.ogg"), type: "video/ogg"
end

%>

# File lib/hanami/assets/helpers.rb, line 593
def video(source = nil, options = {}, &blk)
  options = _source_options(source, options, as: :video, &blk)
  html.video(blk, options)
end

Private Instance Methods

_absolute_url(source) click to toggle source

@since 0.1.0 @api private

# File lib/hanami/assets/helpers.rb, line 906
def _absolute_url(source)
  self.class.assets_configuration.asset_url(source)
end
_absolute_url?(source) click to toggle source

@since 0.1.0 @api private

# File lib/hanami/assets/helpers.rb, line 886
def _absolute_url?(source)
  ABSOLUTE_URL_MATCHER.match(source)
end
_append_extension?(source, ext) click to toggle source

@since 1.1.0 @api private

# File lib/hanami/assets/helpers.rb, line 939
def _append_extension?(source, ext)
  source !~ QUERY_STRING_MATCHER && source !~ /#{Regexp.escape(ext)}\z/
end
_asset_url(source, push:, as:) { || ... } click to toggle source

@since 0.1.0 @api private

# File lib/hanami/assets/helpers.rb, line 853
def _asset_url(source, push:, as:)
  url = _absolute_url?(source) ? source : yield

  case push
  when Symbol
    _push_promise(url, as: push)
  when TrueClass
    _push_promise(url, as: as)
  end

  url
end
_crossorigin?(source) click to toggle source

@since 1.2.0 @api private

# File lib/hanami/assets/helpers.rb, line 892
def _crossorigin?(source)
  return false unless _absolute_url?(source)

  self.class.assets_configuration.crossorigin?(source)
end
_push_promise(url, as: nil) click to toggle source

@since 0.1.0 @api private

# File lib/hanami/assets/helpers.rb, line 930
def _push_promise(url, as: nil)
  Thread.current[:__hanami_assets] ||= {}
  Thread.current[:__hanami_assets][url.to_s] = {as: as, crossorigin: _crossorigin?(url)}

  url
end
_relative_url(source) click to toggle source

@since 0.1.0 @api private

# File lib/hanami/assets/helpers.rb, line 900
def _relative_url(source)
  self.class.assets_configuration.asset_path(source)
end
_safe_tags(*sources) { |source| ... } click to toggle source

@since 0.1.0 @api private

# File lib/hanami/assets/helpers.rb, line 843
def _safe_tags(*sources)
  ::Hanami::Utils::Escape::SafeString.new(
    sources.map do |source|
      yield source
    end.join(NEW_LINE_SEPARATOR)
  )
end
_source_options(src, options, as:, &_blk) click to toggle source

@since 0.1.0 @api private

# File lib/hanami/assets/helpers.rb, line 912
def _source_options(src, options, as:, &_blk)
  options ||= {}

  if src.respond_to?(:to_hash)
    options = src.to_hash
  elsif src
    options[:src] = asset_path(src, push: options.delete(:push) || false, as: as)
  end

  if !options[:src] && !block_given?
    raise ArgumentError.new("You should provide a source via `src` option or with a `source` HTML tag")
  end

  options
end
_subresource_integrity?() click to toggle source

@api private

# File lib/hanami/assets/helpers.rb, line 874
def _subresource_integrity?
  !!self.class.assets_configuration.subresource_integrity
end
_subresource_integrity_value(source, ext) click to toggle source

@api private

# File lib/hanami/assets/helpers.rb, line 879
def _subresource_integrity_value(source, ext)
  source = "#{source}#{ext}" unless source =~ /#{Regexp.escape(ext)}\z/
  self.class.assets_configuration.subresource_integrity_value(source) unless _absolute_url?(source)
end
_typed_asset_path(source, ext, push: false, as: nil) click to toggle source

@since 0.1.0 @api private

# File lib/hanami/assets/helpers.rb, line 868
def _typed_asset_path(source, ext, push: false, as: nil)
  source = "#{source}#{ext}" if _append_extension?(source, ext)
  asset_path(source, push: push, as: as)
end