Module: CarrierWave::Cloudflare::ActionView::ResponsiveImagesHelper
- Defined in:
- lib/carrierwave/cloudflare/action_view/responsive_images_helper.rb
Constant Summary collapse
- CDN_TRANSFORM_KEYS =
CarrierWave::Cloudflare::URL::ALLOWED_OPTIONS.map(&:to_sym)
Instance Method Summary collapse
-
#cdn_transformed(url, **options) ⇒ Object
Returns an image URL with CDN transformations applied.
-
#hidpi_image_srcset(url, dprs: nil, **options) ⇒ Object
Like #hidpi_image_tag, but returns an scrset attribute value.
-
#hidpi_image_tag(url, dprs: nil, **options) ⇒ Object
Returns an image tag with with scaled variations (via ‘srcset`) attribute for devices with different DPR values.
-
#responsive_image_tag(url, width:, sizes: nil, dprs: [1, 2], **options) ⇒ Object
Returns a reponsive image tag with variations.
- #scrset_variations_from_breakpoints(breakpoints, dprs:, granularity: 180) ⇒ Object
-
#split_cdn_transform_options(options) ⇒ Object
returns a pair of transformation options and other options.
Instance Method Details
#cdn_transformed(url, **options) ⇒ Object
Returns an image URL with CDN transformations applied. Can process already transformed URLs, in that case the options will be merged together.
Examples
cdn_transformed('/img.jpg', width: 400)
# => '/cdn-cgi/image/width=400/img.jpg'
cdn_transformed('/cdn-cgi/image/width=100,fit=pad/img.jpg', width: 333)
# => '/cdn-cgi/image/width=333,fit=pad/img.jpg'
21 22 23 24 25 26 27 28 29 |
# File 'lib/carrierwave/cloudflare/action_view/responsive_images_helper.rb', line 21 def cdn_transformed(url, **) = BaseUploader. CarrierWave::Cloudflare::URL.transform( url, **, ** ) end |
#hidpi_image_srcset(url, dprs: nil, **options) ⇒ Object
Like #hidpi_image_tag, but returns an scrset attribute value.
57 58 59 60 61 62 63 64 65 |
# File 'lib/carrierwave/cloudflare/action_view/responsive_images_helper.rb', line 57 def hidpi_image_srcset(url, dprs: nil, **) return nil unless url.present? url = url.url if url.is_a?(CarrierWave::Uploader) (dprs || [1, 2]).map do |dpr| [cdn_transformed(url, dpr: dpr, **), "#{dpr}x"].join(" ") end.join(", ") end |
#hidpi_image_tag(url, dprs: nil, **options) ⇒ Object
Returns an image tag with with scaled variations (via ‘srcset`) attribute for devices with different DPR values.
The transformation of the original image should be specified via options.
Examples
hidpi_image_tag('/bird.jpg', width: 400, height: 100, alt: 'A bird')
hidpi_image_tag('/bird.jpg', width: 400, drps: [1, 2])
43 44 45 46 47 48 49 50 51 52 53 54 |
# File 'lib/carrierwave/cloudflare/action_view/responsive_images_helper.rb', line 43 def hidpi_image_tag(url, dprs: nil, **) url = url.url if url.is_a?(CarrierWave::Uploader) transform, rest = () image_tag( cdn_transformed(url, **transform), srcset: hidpi_image_srcset(url, dprs: dprs, **transform), width: transform[:width], height: transform[:height], **rest ) end |
#responsive_image_tag(url, width:, sizes: nil, dprs: [1, 2], **options) ⇒ Object
Returns a reponsive image tag with variations.
Examples
responsive_image_tag('/bird.jpg', width: 1200, sizes:
{ phone: 600, tablet: 800 })
74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 |
# File 'lib/carrierwave/cloudflare/action_view/responsive_images_helper.rb', line 74 def responsive_image_tag(url, width:, sizes: nil, dprs: [1, 2], **) url = url.url if url.is_a?(CarrierWave::Uploader) if sizes.nil? return hidpi_image_tag(url, width: width, **) end sizes[:default] = width breakpoints = { phone: "(max-width: 767px)", mobile: "(max-width: 767px)", # an alias for :phone tablet: "(max-width: 1023px)", laptop: "(max-width: 1279px)", desktop: "(min-width: 1280px)", default: nil } sizes_attr = breakpoints.map do |device, media| next nil unless sizes[device] [media, "#{sizes[device]}px"].compact.join(" ") end.compact.join(", ") transform, rest = () base_version = cdn_transformed(url, width: width, **transform) # construct the array of available variation sizes in `srcset` variations = scrset_variations_from_breakpoints(sizes, dprs: dprs) srcset = variations.map do |size| scale = (size.to_f / width).round(2) [cdn_transformed(url, width: width, **transform, dpr: scale), "#{size}w"] end image_tag( base_version, srcset: srcset, sizes: sizes_attr, width: width, height: transform[:height], **rest ) end |
#scrset_variations_from_breakpoints(breakpoints, dprs:, granularity: 180) ⇒ Object
119 120 121 122 123 124 125 |
# File 'lib/carrierwave/cloudflare/action_view/responsive_images_helper.rb', line 119 def scrset_variations_from_breakpoints(breakpoints, dprs:, granularity: 180) # [300, 900] => [300, 600, 900, 1800] doubled = breakpoints.values.product(dprs).map { |s, d| (s * d).round } # [100, 101, 150, 250, 320] => [100, 250, 320] doubled.uniq { |s| s / granularity } end |
#split_cdn_transform_options(options) ⇒ Object
returns a pair of transformation options and other options
128 129 130 131 132 133 |
# File 'lib/carrierwave/cloudflare/action_view/responsive_images_helper.rb', line 128 def () [ .slice(*CDN_TRANSFORM_KEYS), .except(*CDN_TRANSFORM_KEYS) ] end |