Sha256: bcdaf28d8a98aa59a7167a7b7b7cfe664fb6e8a2f8654c257ff3208c3ace17e8

Contents?: true

Size: 1.89 KB

Versions: 1

Compression:

Stored size: 1.89 KB

Contents

# frozen_string_literal: true

require "zlib"

module Jekyll
  class Avatar < Liquid::Tag
    include Jekyll::LiquidExtensions

    SERVERS      = 4
    DEFAULT_SIZE = 40
    API_VERSION  = 3

    def initialize(_tag_name, text, _tokens)
      super
      @text = text
    end

    def render(context)
      @context = context
      @text    = Liquid::Template.parse(@text).render(@context)
      attrs    = attributes.map { |k, v| "#{k}=\"#{v}\"" }.join(" ")
      "<img #{attrs} />"
    end

    private

    def attributes
      {
        :class                => classes,
        :src                  => url,
        :alt                  => username,
        :srcset               => srcset,
        :width                => size,
        :height               => size,
        "data-proofer-ignore" => true,
      }
    end

    def username
      matches = @text.match(%r!\buser=([\w\.]+)\b!)
      if matches
        lookup_variable(@context, matches[1])
      else
        @text.split(" ").first.sub("@", "")
      end
    end

    def size
      matches = @text.match(%r!\bsize=(\d+)\b!i)
      matches ? matches[1].to_i : DEFAULT_SIZE
    end

    def path(scale = 1)
      "#{username}?v=#{API_VERSION}&s=#{size * scale}"
    end

    def server_number
      Zlib.crc32(path) % SERVERS
    end

    def host
      if ENV["PAGES_AVATARS_URL"].to_s.empty?
        "https://avatars#{server_number}.githubusercontent.com"
      else
        ENV["PAGES_AVATARS_URL"]
      end
    end

    def url(scale = 1)
      uri = Addressable::URI.parse host
      uri.path << "/" unless uri.path.end_with?("/")
      uri.join path(scale)
    end

    def srcset
      (1..4).map { |scale| "#{url(scale)} #{scale}x" }.join(", ")
    end

    # See http://primercss.io/avatars/#small-avatars
    def classes
      size < 48 ? "avatar avatar-small" : "avatar"
    end
  end
end

Liquid::Template.register_tag("avatar", Jekyll::Avatar)

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
jekyll-avatar-0.5.0 lib/jekyll-avatar.rb