Sha256: 70203058f5e19a5e484085b9a4e93bceabfe928e333c6a2f397a749b666d9a37

Contents?: true

Size: 1.47 KB

Versions: 1

Compression:

Stored size: 1.47 KB

Contents

module Jekyll
  class Avatar < Liquid::Tag
    SERVERS = 4
    DEFAULT_SIZE = 40
    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
      }
    end

    def username
      matches = @text.match(/\buser=(\w+)\b/)
      if matches && @context.has_key?(matches[1])
        @context[matches[1]]
      else
        @text.split(' ').first.sub('@', '')
      end
    end

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

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

    def server_number
      Zlib.crc32(path) % SERVERS
    end

    def host
      "avatars#{server_number}.githubusercontent.com"
    end

    def url(scale = 1)
      "https://#{host}/#{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.3.0 lib/jekyll-avatar.rb