jekyll-avatar 0.5.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 41753d6b8276409f37b03545caedf501794f95d4
4
- data.tar.gz: 3cf88d6e733c61b0aa266733556b959c93050b5b
2
+ SHA256:
3
+ metadata.gz: 59a9a3637415d5b08eab35b0c56c43282eb55d0d068ecbcee79e7aefb38af288
4
+ data.tar.gz: ae037ea80d6f45c2443a7cfa560633cd32dd6de06476083e48abf898e41e5cb8
5
5
  SHA512:
6
- metadata.gz: 09067eddb6f28ae052302444952d5931a199cbd5d7cfe0be096cc20b9ce69b19ebad64ca65c6587644000b12ed702364135d53021d9dd04abbb4292e7567b7d2
7
- data.tar.gz: 391e2d65a1213ab51c64c7a8b36911f7dd35575baf1e0ff22ee4e2c4766bbe05f97bf3414c97bd665dbd6e9fb4cb285d6d4f47975a94ca150b893f0b0fe5227b
6
+ metadata.gz: 3a3d603193c1c92e9b98a78f58899b4c2d6ae39666509a87f4ab43028ae993c4901246a644b45406955b19acbab58072d2e26cf6973b44988c269659a717101e
7
+ data.tar.gz: 7f1a6ca837d81f451acf8a86d4ee6560734978e5b2071163424ad8a9f1ec2babae36678aef9e421eb50245276814b22ece3434e653f8f9f7e43b49e65a5082d6
data/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  *A Jekyll plugin for rendering GitHub avatars*
4
4
 
5
- [![Build Status](https://travis-ci.org/benbalter/jekyll-avatar.svg)](https://travis-ci.org/benbalter/jekyll-avatar)
5
+ [![CI](https://github.com/jekyll/jekyll-avatar/actions/workflows/ci.yml/badge.svg)](https://github.com/jekyll/jekyll-avatar/actions/workflows/ci.yml)
6
6
 
7
7
  Jekyll Avatar makes it easy to add GitHub avatars to your Jekyll site by specifying a username. If performance is a concern, Jekyll Avatar is deeply integrated with the GitHub avatar API, ensuring avatars are cached and load in parallel. It even automatically upgrades users to Retina images, when supported.
8
8
 
@@ -17,9 +17,10 @@ gem 'jekyll-avatar'
17
17
  And add the following to your site's `_config.yml` file:
18
18
 
19
19
  ```yaml
20
- gems:
20
+ plugins:
21
21
  - jekyll-avatar
22
22
  ```
23
+ Note: If you are using a Jekyll version less than 3.5.0, use the `gems` key instead of `plugins`.
23
24
 
24
25
  ## Usage
25
26
 
@@ -60,8 +61,8 @@ That will output:
60
61
  You can also pass the username as a variable, like this:
61
62
 
62
63
  ```
63
- {% assign username="hubot" %}
64
- {% avatar {{ username }} %}
64
+ {% assign user="hubot" %}
65
+ {% avatar {{ user }} %}
65
66
  ```
66
67
 
67
68
  Or, if the variable is someplace a bit more complex, like a loop:
@@ -73,6 +74,19 @@ Or, if the variable is someplace a bit more complex, like a loop:
73
74
  {% endfor %}
74
75
  ```
75
76
 
77
+ ### Lazy loading images
78
+
79
+ For pages showing a large number of avatars, you may want to load the images lazily.
80
+
81
+ ```liquid
82
+ {% avatar hubot lazy=true %}
83
+ ```
84
+
85
+ This will set the `data-src` and `data-srcset` attributes on the `<img>` tag, which is compatible with many lazy load JavaScript plugins, such as:
86
+
87
+ * https://www.andreaverlicchi.eu/lazyload/
88
+ * https://appelsiini.net/projects/lazyload/
89
+
76
90
  ### Using with GitHub Enterprise
77
91
 
78
92
  To use Jekyll Avatars with GitHub Enterprise, you must set the `PAGES_AVATARS_URL` environmental variable.
@@ -80,4 +94,4 @@ To use Jekyll Avatars with GitHub Enterprise, you must set the `PAGES_AVATARS_UR
80
94
  This should be the full URL to the avatars subdomain or subpath. For example:
81
95
 
82
96
  * With subdomain isolation: `PAGES_AVATARS_URL="https://avatars.github.example.com"`
83
- * Without subdomain isolation: `PAGES_AVATARS_URL="https://github.example.com/avatars"`
97
+ * Without subdomain isolation: `PAGES_AVATARS_URL="https://github.example.com/avatars"`
@@ -1,8 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Liquid; class Tag; end; end
4
+
4
5
  module Jekyll
5
6
  class Avatar < Liquid::Tag
6
- VERSION = "0.5.0".freeze
7
+ VERSION = "0.8.0"
7
8
  end
8
9
  end
data/lib/jekyll-avatar.rb CHANGED
@@ -4,54 +4,112 @@ require "zlib"
4
4
 
5
5
  module Jekyll
6
6
  class Avatar < Liquid::Tag
7
- include Jekyll::LiquidExtensions
7
+ def self.generate_template_with(keys)
8
+ attrs = (BASE_ATTRIBUTES + keys).map! { |key| %(#{key}="%<#{key}>s") }.join(" ")
9
+ "<img #{attrs} />"
10
+ end
11
+ private_class_method :generate_template_with
12
+
13
+ #
8
14
 
9
15
  SERVERS = 4
10
- DEFAULT_SIZE = 40
11
- API_VERSION = 3
16
+ DEFAULT_SIZE = "40"
17
+ API_VERSION = "3"
18
+
19
+ BASE_ATTRIBUTES = %w(
20
+ class alt width height data-proofer-ignore src
21
+ ).freeze
22
+
23
+ BASE_TEMPLATE = generate_template_with %w(srcset)
24
+ LAZY_TEMPLATE = generate_template_with %w(data-src data-srcset)
25
+
26
+ private_constant :BASE_ATTRIBUTES, :BASE_TEMPLATE, :LAZY_TEMPLATE
12
27
 
13
28
  def initialize(_tag_name, text, _tokens)
14
29
  super
15
- @text = text
30
+ @text = text.strip
31
+ @markup = Liquid::Template.parse(@text)
32
+
33
+ @size = compute_size
34
+ @user_variable = extract_user_variable
35
+
36
+ @custom_host = ENV["PAGES_AVATARS_URL"]
37
+ @custom_host = "" unless @custom_host.is_a?(String)
16
38
  end
17
39
 
18
40
  def render(context)
19
41
  @context = context
20
- @text = Liquid::Template.parse(@text).render(@context)
21
- attrs = attributes.map { |k, v| "#{k}=\"#{v}\"" }.join(" ")
22
- "<img #{attrs} />"
42
+ @text = @markup.render(@context)
43
+ template = lazy_load? ? LAZY_TEMPLATE : BASE_TEMPLATE
44
+ format(template, attributes)
23
45
  end
24
46
 
25
47
  private
26
48
 
27
49
  def attributes
28
- {
29
- :class => classes,
30
- :src => url,
31
- :alt => username,
32
- :srcset => srcset,
33
- :width => size,
34
- :height => size,
35
- "data-proofer-ignore" => true,
50
+ result = {
51
+ :class => classes,
52
+ :alt => username,
53
+ :width => size,
54
+ :height => size,
55
+ :"data-proofer-ignore" => "true",
36
56
  }
57
+
58
+ if lazy_load?
59
+ result[:src] = ""
60
+ result[:"data-src"] = url
61
+ result[:"data-srcset"] = srcset
62
+ else
63
+ result[:src] = url
64
+ result[:srcset] = srcset
65
+ end
66
+
67
+ result
68
+ end
69
+
70
+ def lazy_load?
71
+ @text.include?("lazy=true")
72
+ end
73
+
74
+ def extract_user_variable
75
+ matches = @text.match(%r!\buser=([\w.]+)\b!)
76
+ matches[1] if matches
37
77
  end
38
78
 
39
79
  def username
40
- matches = @text.match(%r!\buser=([\w\.]+)\b!)
41
- if matches
42
- lookup_variable(@context, matches[1])
80
+ return lookup_variable(@user_variable) if @user_variable
81
+
82
+ result = @text.include?(" ") ? @text.split(" ")[0] : @text
83
+ result.start_with?("@") ? result.sub("@", "") : result
84
+ end
85
+
86
+ # Lookup a Liquid variable in the current context.
87
+ #
88
+ # variable - the variable name, as a string.
89
+ #
90
+ # Returns the value of the variable in the context or the variable name if not found.
91
+ def lookup_variable(variable)
92
+ lookup = @context
93
+ if variable.include?(".")
94
+ variable.split(".").each do |value|
95
+ lookup = lookup[value]
96
+ end
43
97
  else
44
- @text.split(" ").first.sub("@", "")
98
+ lookup = lookup[variable]
45
99
  end
100
+
101
+ lookup || variable
46
102
  end
47
103
 
48
- def size
104
+ # Returns a string value
105
+ def compute_size
49
106
  matches = @text.match(%r!\bsize=(\d+)\b!i)
50
- matches ? matches[1].to_i : DEFAULT_SIZE
107
+ matches ? matches[1] : DEFAULT_SIZE
51
108
  end
109
+ attr_reader :size
52
110
 
53
111
  def path(scale = 1)
54
- "#{username}?v=#{API_VERSION}&s=#{size * scale}"
112
+ "#{username}?v=#{API_VERSION}&s=#{scale == 1 ? size : (size.to_i * scale)}"
55
113
  end
56
114
 
57
115
  def server_number
@@ -59,26 +117,41 @@ module Jekyll
59
117
  end
60
118
 
61
119
  def host
62
- if ENV["PAGES_AVATARS_URL"].to_s.empty?
120
+ if @custom_host.empty?
63
121
  "https://avatars#{server_number}.githubusercontent.com"
64
122
  else
65
- ENV["PAGES_AVATARS_URL"]
123
+ @custom_host
66
124
  end
67
125
  end
68
126
 
69
- def url(scale = 1)
70
- uri = Addressable::URI.parse host
127
+ def parsed_host
128
+ @parsed_host ||= {}
129
+ @parsed_host[host] ||= Addressable::URI.parse(host)
130
+ end
131
+
132
+ def url_with_custom_host(scale = 1)
133
+ uri = parsed_host
71
134
  uri.path << "/" unless uri.path.end_with?("/")
72
- uri.join path(scale)
135
+ uri = uri.join path(scale)
136
+ uri.to_s
73
137
  end
74
138
 
139
+ def url(scale = 1)
140
+ return url_with_custom_host(scale) unless @custom_host.empty?
141
+
142
+ "#{host}/#{path(scale)}"
143
+ end
144
+
145
+ SCALES = %w(1 2 3 4).freeze
146
+ private_constant :SCALES
147
+
75
148
  def srcset
76
- (1..4).map { |scale| "#{url(scale)} #{scale}x" }.join(", ")
149
+ SCALES.map { |scale| "#{url(scale.to_i)} #{scale}x" }.join(", ")
77
150
  end
78
151
 
79
152
  # See http://primercss.io/avatars/#small-avatars
80
153
  def classes
81
- size < 48 ? "avatar avatar-small" : "avatar"
154
+ size.to_i < 48 ? "avatar avatar-small" : "avatar"
82
155
  end
83
156
  end
84
157
  end
metadata CHANGED
@@ -1,57 +1,69 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jekyll-avatar
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ben Balter
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-09-05 00:00:00.000000000 Z
11
+ date: 2022-04-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jekyll
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '3.0'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '5.0'
20
23
  type: :runtime
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
23
26
  requirements:
24
- - - "~>"
27
+ - - ">="
25
28
  - !ruby/object:Gem::Version
26
29
  version: '3.0'
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '5.0'
27
33
  - !ruby/object:Gem::Dependency
28
34
  name: bundler
29
35
  requirement: !ruby/object:Gem::Requirement
30
36
  requirements:
31
- - - "~>"
37
+ - - ">"
38
+ - !ruby/object:Gem::Version
39
+ version: '1.0'
40
+ - - "<"
32
41
  - !ruby/object:Gem::Version
33
- version: '1.11'
42
+ version: '3.0'
34
43
  type: :development
35
44
  prerelease: false
36
45
  version_requirements: !ruby/object:Gem::Requirement
37
46
  requirements:
38
- - - "~>"
47
+ - - ">"
39
48
  - !ruby/object:Gem::Version
40
- version: '1.11'
49
+ version: '1.0'
50
+ - - "<"
51
+ - !ruby/object:Gem::Version
52
+ version: '3.0'
41
53
  - !ruby/object:Gem::Dependency
42
- name: rake
54
+ name: kramdown-parser-gfm
43
55
  requirement: !ruby/object:Gem::Requirement
44
56
  requirements:
45
57
  - - "~>"
46
58
  - !ruby/object:Gem::Version
47
- version: '10.0'
59
+ version: '1.0'
48
60
  type: :development
49
61
  prerelease: false
50
62
  version_requirements: !ruby/object:Gem::Requirement
51
63
  requirements:
52
64
  - - "~>"
53
65
  - !ruby/object:Gem::Version
54
- version: '10.0'
66
+ version: '1.0'
55
67
  - !ruby/object:Gem::Dependency
56
68
  name: rspec
57
69
  requirement: !ruby/object:Gem::Requirement
@@ -67,19 +79,47 @@ dependencies:
67
79
  - !ruby/object:Gem::Version
68
80
  version: '3.0'
69
81
  - !ruby/object:Gem::Dependency
70
- name: rubocop
82
+ name: rspec-html-matchers
71
83
  requirement: !ruby/object:Gem::Requirement
72
84
  requirements:
73
- - - ">="
85
+ - - "~>"
74
86
  - !ruby/object:Gem::Version
75
- version: '0'
87
+ version: '0.9'
76
88
  type: :development
77
89
  prerelease: false
78
90
  version_requirements: !ruby/object:Gem::Requirement
79
91
  requirements:
80
- - - ">="
92
+ - - "~>"
81
93
  - !ruby/object:Gem::Version
82
- version: '0'
94
+ version: '0.9'
95
+ - !ruby/object:Gem::Dependency
96
+ name: rubocop-jekyll
97
+ requirement: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - "~>"
100
+ - !ruby/object:Gem::Version
101
+ version: 0.12.0
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - "~>"
107
+ - !ruby/object:Gem::Version
108
+ version: 0.12.0
109
+ - !ruby/object:Gem::Dependency
110
+ name: rubocop-rspec
111
+ requirement: !ruby/object:Gem::Requirement
112
+ requirements:
113
+ - - "~>"
114
+ - !ruby/object:Gem::Version
115
+ version: '2.0'
116
+ type: :development
117
+ prerelease: false
118
+ version_requirements: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - "~>"
121
+ - !ruby/object:Gem::Version
122
+ version: '2.0'
83
123
  description:
84
124
  email:
85
125
  - ben.balter@github.com
@@ -87,21 +127,11 @@ executables: []
87
127
  extensions: []
88
128
  extra_rdoc_files: []
89
129
  files:
90
- - ".gitignore"
91
- - ".rspec"
92
- - ".rubocop.yml"
93
- - ".ruby-version"
94
- - ".travis.yml"
95
- - Gemfile
96
130
  - LICENSE.txt
97
131
  - README.md
98
- - Rakefile
99
- - jekyll-avatar.gemspec
100
132
  - lib/jekyll-avatar.rb
101
133
  - lib/jekyll-avatar/version.rb
102
- - script/bootstrap
103
- - script/cibuild
104
- homepage: https://github.com/benbalter/jekyll-avatar
134
+ homepage: https://github.com/jekyll/jekyll-avatar
105
135
  licenses:
106
136
  - MIT
107
137
  metadata: {}
@@ -113,15 +143,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
113
143
  requirements:
114
144
  - - ">="
115
145
  - !ruby/object:Gem::Version
116
- version: '0'
146
+ version: 2.5.0
117
147
  required_rubygems_version: !ruby/object:Gem::Requirement
118
148
  requirements:
119
149
  - - ">="
120
150
  - !ruby/object:Gem::Version
121
151
  version: '0'
122
152
  requirements: []
123
- rubyforge_project:
124
- rubygems_version: 2.5.1
153
+ rubygems_version: 3.1.6
125
154
  signing_key:
126
155
  specification_version: 4
127
156
  summary: A Jekyll plugin for rendering GitHub avatars
data/.gitignore DELETED
@@ -1,10 +0,0 @@
1
- /.bundle/
2
- /.yardoc
3
- /Gemfile.lock
4
- /_yardoc/
5
- /coverage/
6
- /doc/
7
- /pkg/
8
- /spec/reports/
9
- /tmp/
10
- *.gem
data/.rspec DELETED
@@ -1,2 +0,0 @@
1
- --format documentation
2
- --color
data/.rubocop.yml DELETED
@@ -1,16 +0,0 @@
1
- inherit_gem:
2
- jekyll: .rubocop.yml
3
-
4
- Style/FileName:
5
- Enabled: false
6
-
7
- Metrics/LineLength:
8
- Exclude:
9
- - spec/*/**
10
-
11
- Metrics/BlockLength:
12
- Enabled: false
13
-
14
- AllCops:
15
- Exclude:
16
- - vendor/**/*
data/.ruby-version DELETED
@@ -1 +0,0 @@
1
- 2.3.1
data/.travis.yml DELETED
@@ -1,7 +0,0 @@
1
- language: ruby
2
- rvm:
3
- - 2.3.0
4
- before_install: gem install bundler -v 1.11.2
5
- sudo: false
6
- cache: bundler
7
- script: script/cibuild
data/Gemfile DELETED
@@ -1,6 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- source "https://rubygems.org"
4
-
5
- # Specify your gem's dependencies in jekyll-avatar.gemspec
6
- gemspec
data/Rakefile DELETED
@@ -1,8 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "bundler/gem_tasks"
4
- require "rspec/core/rake_task"
5
-
6
- RSpec::Core::RakeTask.new(:spec)
7
-
8
- task :default => :spec
@@ -1,29 +0,0 @@
1
- # coding: utf-8
2
- # frozen_string_literal: true
3
-
4
- lib = File.expand_path("../lib", __FILE__)
5
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
6
- require "jekyll-avatar/version"
7
-
8
- Gem::Specification.new do |spec|
9
- spec.name = "jekyll-avatar"
10
- spec.version = Jekyll::Avatar::VERSION
11
- spec.authors = ["Ben Balter"]
12
- spec.email = ["ben.balter@github.com"]
13
-
14
- spec.summary = "A Jekyll plugin for rendering GitHub avatars"
15
- spec.homepage = "https://github.com/benbalter/jekyll-avatar"
16
- spec.license = "MIT"
17
-
18
- spec.files = `git ls-files -z`.split("\x0").reject do |file|
19
- file.match(%r!^(test|spec|features)/!)
20
- end
21
-
22
- spec.require_paths = ["lib"]
23
-
24
- spec.add_dependency "jekyll", "~> 3.0"
25
- spec.add_development_dependency "bundler", "~> 1.11"
26
- spec.add_development_dependency "rake", "~> 10.0"
27
- spec.add_development_dependency "rspec", "~> 3.0"
28
- spec.add_development_dependency "rubocop"
29
- end
data/script/bootstrap DELETED
@@ -1,5 +0,0 @@
1
- #!/bin/sh
2
-
3
- set -ex
4
-
5
- bundle install
data/script/cibuild DELETED
@@ -1,6 +0,0 @@
1
- #!/bin/sh
2
-
3
- set -ex
4
-
5
- bundle exec rake spec
6
- bundle exec rubocop