module ActionView::Helpers::AssetTagHelper

def audio_tag(*sources)

# =>
audio_tag(user.name_pronunciation_audio)

Active Storage blobs (audios that are uploaded by the users of your app):

# =>
audio_tag("sound.wav", "sound.mid")
# =>
audio_tag("sound.wav", autoplay: true, controls: true)
# =>
audio_tag("sound.wav")
# =>
audio_tag("sound")

parameter.
When the last parameter is a hash you can add HTML attributes using that

directory, or Active Storage attachments.
+sources+ can be full paths, files that exist in your public audios
tag with nested source tags for each source will be returned. The
a single audio tag will be returned. If +sources+ is an array, an audio
Returns an HTML audio tag for the +sources+. If +sources+ is a string,
def audio_tag(*sources)
  multiple_sources_tag_builder("audio", sources)
end

def auto_discovery_link_tag(type = :rss, url_options = {}, tag_options = {})

# =>
auto_discovery_link_tag(:rss, "http://www.example.com/feed.rss", {title: "Example RSS"})
# =>
auto_discovery_link_tag(:rss, {controller: "news", action: "feed"})
# =>
auto_discovery_link_tag(:rss, {action: "feed"}, {title: "My RSS"})
# =>
auto_discovery_link_tag(:rss, {action: "feed"})
# =>
auto_discovery_link_tag(:json)
# =>
auto_discovery_link_tag(:atom)
# =>
auto_discovery_link_tag

==== Examples

* :title - Specify the title of the link, defaults to the +type+
* :type - Override the auto-generated mime type
* :rel - Specify the relation of this link, defaults to "alternate"

==== Options

using the +url_options+. You can modify the LINK tag itself in +tag_options+.
:atom, or :json. Control the link options in url_for format
an RSS, Atom, or JSON feed. The +type+ can be :rss (default),
Returns a link tag that browsers and feed readers can use to auto-detect
def auto_discovery_link_tag(type = :rss, url_options = {}, tag_options = {})
  if !(type == :rss || type == :atom || type == :json) && tag_options[:type].blank?
    raise ArgumentError.new("You should pass :type tag_option key explicitly, because you have passed #{type} type other than :rss, :atom, or :json.")
  end
  tag(
    "link",
    "rel"   => tag_options[:rel] || "alternate",
    "type"  => tag_options[:type] || Template::Types[type].to_s,
    "title" => tag_options[:title] || type.to_s.upcase,
    "href"  => url_options.is_a?(Hash) ? url_for(url_options.merge(only_path: false)) : url_options
  )
end

def check_for_image_tag_errors(options)

def check_for_image_tag_errors(options)
  if options[:size] && (options[:height] || options[:width])
    raise ArgumentError, "Cannot pass a :size option with a :height or :width option"
  end
end

def extract_dimensions(size)

def extract_dimensions(size)
  size = size.to_s
  if /\A\d+(?:\.\d+)?x\d+(?:\.\d+)?\z/.match?(size)
    size.split("x")
  elsif /\A\d+(?:\.\d+)?\z/.match?(size)
    [size, size]
  end
end

def favicon_link_tag(source = "favicon.ico", options = {})

# =>
favicon_link_tag 'mb-icon.png', rel: 'apple-touch-icon', type: 'image/png'

The following call would generate such a tag:
will be used if you add the page to the home screen of an iOS device.
Mobile Safari looks for a different link tag, pointing to an image that

# =>
favicon_link_tag 'myicon.ico'

# =>
favicon_link_tag

respectively:
to override their defaults, "icon" and "image/x-icon"
defaults to "favicon.ico", and also supports +:rel+ and +:type+ options
The helper gets the name of the favicon file as first argument, which

using this helper to generate its corresponding link tag.
their favicon storing the file under app/assets/images, and
To have better control applications may let the asset pipeline manage

request succeeds. If the favicon changes it is hard to get it updated.
ask for /favicon.ico automatically, and cache the file if the
If a page has no link like the one generated by this helper, browsers

Returns a link tag for a favicon managed by the asset pipeline.
def favicon_link_tag(source = "favicon.ico", options = {})
  tag("link", {
    rel: "icon",
    type: "image/x-icon",
    href: path_to_image(source, skip_pipeline: options.delete(:skip_pipeline))
  }.merge!(options.symbolize_keys))
end

def image_tag(source, options = {})

# =>
image_tag(user.avatar.variant(resize_to_limit: [100, 100]), size: '100')
# =>
image_tag(user.avatar.variant(resize_to_limit: [100, 100]))
# =>
image_tag(user.avatar)

Active Storage blobs (images that are uploaded by the users of your app):

# =>
image_tag("pic.jpg", srcset: [["pic_1024.jpg", "1024w"], ["pic_1980.jpg", "1980w"]], sizes: "100vw")
# =>
image_tag("icon.png", srcset: { "icon_2x.png" => "2x", "icon_4x.png" => "4x" })
# =>
image_tag("/icons/icon.gif", data: { title: 'Rails Application' })
# =>
image_tag("/icons/icon.gif", class: "menu_icon")
# =>
image_tag("/icons/icon.gif", height: '32', width: '32')
# =>
image_tag("/icons/icon.gif", size: "16")
# => Edit Entry
image_tag("icon.png", size: "16x10", alt: "Edit Entry")
# =>
image_tag("icon.png")
# =>
image_tag("icon")

Assets (images that are part of your app):

==== Examples

pairs, each image path will be expanded before the list is formatted as a string.
* :srcset - If supplied as a hash or array of [source, descriptor]
:size will be ignored if the value is not in the correct format.
width="30" height="45", and "50" becomes width="50" height="50".
* :size - Supplied as "#{width}x#{height}" or "#{number}", so "30x45" becomes

additional keys for convenience and conformance:
You can add HTML attributes using the +options+. The +options+ supports

==== Options

path, a file, or an Active Storage attachment.
Returns an HTML image tag for the +source+. The +source+ can be a full
def image_tag(source, options = {})
  options = options.symbolize_keys
  check_for_image_tag_errors(options)
  skip_pipeline = options.delete(:skip_pipeline)
  options[:src] = resolve_asset_source("image", source, skip_pipeline)
  if options[:srcset] && !options[:srcset].is_a?(String)
    options[:srcset] = options[:srcset].map do |src_path, size|
      src_path = path_to_image(src_path, skip_pipeline: skip_pipeline)
      "#{src_path} #{size}"
    end.join(", ")
  end
  options[:width], options[:height] = extract_dimensions(options.delete(:size)) if options[:size]
  options[:loading] ||= image_loading if image_loading
  options[:decoding] ||= image_decoding if image_decoding
  tag("img", options)
end

def javascript_include_tag(*sources)

# =>
javascript_include_tag "http://www.example.com/xmlhr.js", defer: true

# =>
javascript_include_tag "http://www.example.com/xmlhr.js", async: true

# =>
javascript_include_tag "http://www.example.com/xmlhr.js", nonce: true

# =>
javascript_include_tag "http://www.example.com/xmlhr.js"

# =>
javascript_include_tag "http://www.example.com/xmlhr"

#
# =>
javascript_include_tag "common.javascript", "/elsewhere/cools"

# =>
javascript_include_tag "xmlhr.js"

# =>
javascript_include_tag "template.jst", extname: false

# =>
javascript_include_tag "xmlhr", host: "localhost", protocol: "https"

# =>
javascript_include_tag "xmlhr"

==== Examples

{MDN docs}[https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script].
options affect the