jekyll-recker 1.8.0 → 1.14.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 78979b0c186d78e9296b547ead2c4f5a908945d7fe83fa498984e9dfa8766fc6
4
- data.tar.gz: dc418d310aec0d6245d637e4ac5f20c428f07f954d7416cb03794781d58e263c
3
+ metadata.gz: e9a5e5beecbe76dfb1a709044a22e681c1d2c17efbe295a169f83ece21b9f127
4
+ data.tar.gz: 7f0eb9d447f94fad07235c91675dab1b333a03d8fe47c102fada49547cd455c6
5
5
  SHA512:
6
- metadata.gz: 70a080461c6462a80c0296a5573f91f2d8f0eb5995d9fda6be73d018af4cd1999cd1816fb7ca18949a18abd06a05740daefc358f2db9f26e37d4249b21207ad4
7
- data.tar.gz: 96d7b050be0ad82ae2da7d1e1cadfe4aa328f4f3a780a800243d2027646a16babc22c030619289f8122899accfc24c40546fa2fa443aa70373b15c0280facaa0
6
+ metadata.gz: ed6e9a3464edd7a9986abdd755d567b12c11c0eb587b9699168d7dd2492a33b0ec85eddb473520fafb21e4cfab11d4aae8e08bb2b2f36294ebd53215eb49c681
7
+ data.tar.gz: caa4a564c65dcc69593f3f3ff8976f7de24b4c016fd7f68d14c1161ea9a9d67c247755071e09e3d5454d623f6e74ab53f393f9eaa8c501075bf8b77dff55c809
@@ -2,7 +2,7 @@
2
2
  {%- if include.url %}
3
3
  <a href="{{ include.url }}">
4
4
  {%- endif %}
5
- <img alt="{{ alt | default: include.filename }}" src="{{ site.baseurl }}assets/images/{{ include.filename }}"/>
5
+ <img alt="{{ include.alt | default: include.filename }}" src="{{ site.baseurl }}assets/images/{{ include.filename }}"/>
6
6
  {%- if include.url %}
7
7
  </a>
8
8
  {%- endif %}
@@ -1,5 +1,7 @@
1
1
  <nav>
2
- <a href="{{ site.baseurl }}/" class="{% if page.active == 'index' %}active{% endif %}">index.html</a>
3
- <a href="{{ site.basurl }}/feed.xml">feed.xml</a>
4
- <span class="float-right hide-on-mobile">{{ page.slug }}</span>
2
+ <a href="{{ site.baseurl }}/" class="{% if page.active == 'index' %}active{% endif %} lowercase">
3
+ 🏠 Home
4
+ </a>
5
+ <a class="lowercase" href="{{ site.baseurl }}/feed.xml">🛰️ RSS</a>
6
+ <a class="lowercase" href="https://cookbook.reckerfamily.com">👨‍🍳 Cookbook</a>
5
7
  </nav>
@@ -0,0 +1,121 @@
1
+ ---
2
+ ---
3
+ @import "https://fonts.googleapis.com/css?family=Inconsolata|Open+Sans&display=swap";
4
+
5
+ // color
6
+ $color-accent: #008083;
7
+ $color-black: #444;
8
+ $color-passive: #6f7370;
9
+
10
+ // font
11
+ $font-regular: Open Sans, sans-serif;
12
+ $font-regular-color: $color-black;
13
+ $font-regular-size: 20px;
14
+ $font-caption-size: 18px;
15
+ $font-code: monospace;
16
+ $font-code-size: 18px;
17
+
18
+ .float {
19
+ &-right {
20
+ float: right;
21
+ }
22
+
23
+ &-left {
24
+ float: left;
25
+ }
26
+ }
27
+
28
+ .lowercase {
29
+ text-transform: lowercase;
30
+ }
31
+
32
+ @media (max-width: 600px) {
33
+ .hide-on-mobile {
34
+ display: none;
35
+ }
36
+ }
37
+
38
+ .clearfix::after {
39
+ content: "";
40
+ clear: both;
41
+ display: block;
42
+ }
43
+
44
+ body {
45
+
46
+ -webkit-font-smoothing: antialiased;
47
+ -moz-osx-font-smoothing: grayscale;
48
+
49
+ color: $font-regular-color;
50
+ font-family: $font-regular;
51
+ font-size: $font-regular-size;
52
+ margin: 40px auto;
53
+ max-width: 800px;
54
+ line-height: 1.6;
55
+ padding: 0 10px;
56
+
57
+ header {
58
+ h1 {
59
+ margin-bottom: 9px;
60
+ }
61
+ }
62
+
63
+ nav {
64
+ a {
65
+ margin-right: 10px
66
+ }
67
+
68
+ span {
69
+ color: $color-passive;
70
+ }
71
+ }
72
+
73
+ a {
74
+ color: $color-accent;
75
+ text-decoration: none;
76
+
77
+ &.active {
78
+ color: $color-black;
79
+ }
80
+ }
81
+
82
+ h1, h2, h3 {
83
+ line-height: 1.2
84
+ }
85
+
86
+ p {
87
+ margin-top: 9px;
88
+ }
89
+
90
+ ul {
91
+ list-style-type: none;
92
+ margin: 0;
93
+ padding: 0;
94
+ }
95
+
96
+ figure {
97
+ img {
98
+ display: block;
99
+ margin-left: auto;
100
+ margin-right: auto;
101
+ vertical-align: top;
102
+ height: auto;
103
+ max-width: 100%;
104
+ }
105
+ }
106
+
107
+ figcaption {
108
+ color: $color-passive;
109
+ font-size: $font-caption-size;
110
+ text-align: center;
111
+ }
112
+
113
+ blockquote {
114
+ color: $color-passive;
115
+ }
116
+
117
+ code, pre, pre span {
118
+ font-family: $font-code;
119
+ font-size: $font-code-size;
120
+ }
121
+ }
@@ -6,17 +6,13 @@ require 'jekyll'
6
6
  #
7
7
  # The greatest jekyll plugin in the world
8
8
  module JekyllRecker
9
- autoload :Configuration, 'jekyll_recker/configuration.rb'
10
- autoload :Error, 'jekyll_recker/error.rb'
11
9
  autoload :Mixins, 'jekyll_recker/mixins.rb'
12
10
  autoload :Shell, 'jekyll_recker/shell.rb'
13
11
  autoload :Social, 'jekyll_recker/social.rb'
14
12
  autoload :VERSION, 'jekyll_recker/version.rb'
15
- autoload :Utils, 'jekyll_recker/utils.rb'
16
13
 
17
14
  # Eager loads!
18
15
  require 'jekyll_recker/commands.rb'
19
- require 'jekyll_recker/extensions.rb'
20
16
  require 'jekyll_recker/filters.rb'
21
17
  require 'jekyll_recker/generators.rb'
22
18
  require 'jekyll_recker/tags.rb'
@@ -3,7 +3,7 @@
3
3
  module JekyllRecker
4
4
  # Commands
5
5
  module Commands
6
- # Share
6
+ # Share Command
7
7
  class Share < Jekyll::Command
8
8
  include Mixins::Logging
9
9
 
@@ -17,8 +17,11 @@ module JekyllRecker
17
17
  end
18
18
 
19
19
  def self.action(args, options)
20
- JekyllRecker::Social.action(args, options)
21
- rescue ::JekyllRecker::Error => e
20
+ site = Jekyll::Site.new(configuration_from_options(options))
21
+ site.reset
22
+ site.read
23
+ Social.action(site, args, options)
24
+ rescue StandardError => e
22
25
  logger.error e.message
23
26
  exit 1
24
27
  end
@@ -7,6 +7,11 @@ module JekyllRecker
7
7
  def uyd_date(date)
8
8
  date.strftime('%A, %B %d %Y')
9
9
  end
10
+
11
+ # Adds commas to a number
12
+ def pretty(num)
13
+ num.to_s.reverse.gsub(/(\d{3})(?=\d)/, '\\1,').reverse
14
+ end
10
15
  end
11
16
  end
12
17
 
@@ -1,7 +1,50 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'mini_magick'
4
+ require 'fastimage'
5
+
3
6
  module JekyllRecker
4
7
  module Generators
8
+ # Image Resize Generator
9
+ class ImageResize < Jekyll::Generator
10
+ include Mixins::Logging
11
+
12
+ def generate(site)
13
+ @site = site
14
+ logger.info 'checking images'
15
+ resizeable_images.each do |f, d|
16
+ logger.info "resizing #{f} to fit #{d}"
17
+ image = MiniMagick::Image.new(f)
18
+ image.resize d
19
+ end
20
+ end
21
+
22
+ def image?(file)
23
+ ['.jpg', 'jpeg', '.png', '.svg'].include? File.extname(file)
24
+ end
25
+
26
+ def too_big?(width, height)
27
+ width > 800 || height > 800
28
+ end
29
+
30
+ def images
31
+ @site.static_files.collect(&:path).select { |f| image?(f) }
32
+ end
33
+
34
+ def resizeable_images
35
+ with_sizes = images.map { |f| [f, FastImage.size(f)].flatten }
36
+ with_sizes.select! { |f| too_big?(f[1], f[2]) }
37
+ with_sizes.map do |f, w, h|
38
+ dimensions = if w > h
39
+ '800x600'
40
+ else
41
+ '600x800'
42
+ end
43
+ [f, dimensions]
44
+ end
45
+ end
46
+ end
47
+
5
48
  # Stats Module
6
49
  #
7
50
  # Functions for stats generators.
@@ -54,7 +97,7 @@ module JekyllRecker
54
97
  KEY = 'posts'
55
98
 
56
99
  def crunch
57
- entries.count.pretty
100
+ entries.count
58
101
  end
59
102
  end
60
103
 
@@ -67,8 +110,8 @@ module JekyllRecker
67
110
  def crunch
68
111
  total_counts = entries.collect(&:content).map { |c| number_of_words(c) }
69
112
  {
70
- 'average' => average(total_counts).pretty,
71
- 'total' => total(total_counts).pretty
113
+ 'average' => average(total_counts),
114
+ 'total' => total(total_counts)
72
115
  }
73
116
  end
74
117
  end
@@ -82,7 +125,7 @@ module JekyllRecker
82
125
  def crunch
83
126
  streaks.take(1).map do |count, dates|
84
127
  {
85
- 'days' => count.pretty,
128
+ 'days' => count,
86
129
  'start' => dates[0],
87
130
  'end' => dates[1]
88
131
  }
@@ -4,28 +4,6 @@ require 'logger'
4
4
 
5
5
  module JekyllRecker
6
6
  module Mixins
7
- # Descendants
8
- module Descendants
9
- def self.included(base)
10
- base.extend(self)
11
- end
12
-
13
- def descendants
14
- ObjectSpace.each_object(Class).select { |klass| klass < self }
15
- end
16
- end
17
-
18
- # Introspection
19
- module Introspection
20
- def self.included(base)
21
- base.extend(self)
22
- end
23
-
24
- def class_name
25
- self.class.name.split('::').last
26
- end
27
- end
28
-
29
7
  # Logging
30
8
  module Logging
31
9
  def self.included(base)
@@ -5,9 +5,6 @@ require 'open3'
5
5
  module JekyllRecker
6
6
  # Shell
7
7
  module Shell
8
- # ShellCommandFailed
9
- class ShellCommandFailed < JekyllRecker::Error; end
10
-
11
8
  def self.run(cmd)
12
9
  out, err, status = Open3.capture3(cmd)
13
10
  return out if status.success?
@@ -22,7 +19,7 @@ module JekyllRecker
22
19
  #{err}
23
20
  ERROR
24
21
 
25
- raise ShellCommandFailed, msg
22
+ raise msg
26
23
  end
27
24
  end
28
25
  end
@@ -5,21 +5,21 @@ require 'twitter'
5
5
 
6
6
  module JekyllRecker
7
7
  module Social
8
- def self.action(args, options)
8
+ def self.action(site, args, options)
9
9
  args += %w[slack twitter] if args.empty?
10
- Slack.share(dry: options['dry']) if args.include?('slack')
11
- Twitter.share(dry: options['dry']) if args.include?('twitter')
10
+ Slack.share(site, dry: options['dry']) if args.include?('slack')
11
+ Twitter.share(site, dry: options['dry']) if args.include?('twitter')
12
12
  end
13
+
13
14
  # Backend
14
15
  #
15
16
  # Backend base class for social sharing backends.
16
17
  # @abstract
17
18
  class Share
18
- include Mixins::Introspection
19
19
  include Mixins::Logging
20
20
 
21
- def self.share(dry: false)
22
- backend = new(dry: dry)
21
+ def self.share(site, dry: false)
22
+ backend = new(site, dry: dry)
23
23
  logger.info "#{backend.name} - building configuration"
24
24
  backend.configure!
25
25
 
@@ -27,7 +27,8 @@ module JekyllRecker
27
27
  backend.post!
28
28
  end
29
29
 
30
- def initialize(dry: false)
30
+ def initialize(site, dry: false)
31
+ @site = site
31
32
  @dry = dry
32
33
  end
33
34
 
@@ -36,25 +37,25 @@ module JekyllRecker
36
37
  end
37
38
 
38
39
  def config
39
- @config ||= JekyllRecker::Configuration.recker.fetch(config_key)
40
+ @site.config.fetch('recker', {}).fetch(config_key, {})
40
41
  end
41
42
 
42
43
  def config_key
43
- class_name.downcase
44
+ self.class.const_get(:KEY)
44
45
  end
45
- alias name config_key
46
+ alias name :config_key
46
47
 
47
48
  def post_body
48
- url = File.join Configuration.jekyll['url'], latest.url
49
+ url = File.join @site.config['url'], latest.url
49
50
  <<~BODY
50
- #{latest.data['date'].strftime('%A, %B %-d %Y')}
51
- #{latest.data['title']}
52
- #{url}
53
- BODY
51
+ #{latest.data['date'].strftime('%A, %B %-d %Y')}
52
+ #{latest.data['title']}
53
+ #{url}
54
+ BODY
54
55
  end
55
56
 
56
57
  def latest
57
- @latest ||= Configuration.latest_post
58
+ @latest ||= @site.posts.docs.last
58
59
  end
59
60
 
60
61
  def latest_title
@@ -74,12 +75,14 @@ module JekyllRecker
74
75
  #
75
76
  # Slack social sharing backend
76
77
  class Slack < Share
78
+ KEY = 'slack'
79
+
77
80
  def configure!
78
81
  @creds = {}
79
82
  workspaces.each do |key, data|
80
83
  webhook = ENV["SLACK_#{key.upcase}_WEBHOOK"] || extract_from_config(data)
81
84
  if webhook.nil?
82
- raise ReckerError, "cannot find slack webhook for #{key} workspace!"
85
+ raise "cannot find slack webhook for #{key} workspace!"
83
86
  end
84
87
 
85
88
  @creds[key] = webhook
@@ -121,9 +124,11 @@ module JekyllRecker
121
124
  #
122
125
  # Twitter social sharing backend
123
126
  class Twitter < Share
127
+ KEY = 'twitter'
128
+
124
129
  def configure!
125
130
  creds = extract_from_env || extract_from_config
126
- raise ReckerError, 'cannot find twitter credentials!' if creds.nil?
131
+ raise 'cannot find twitter credentials!' if creds.nil?
127
132
 
128
133
  @client = ::Twitter::REST::Client.new do |settings|
129
134
  settings.consumer_key = creds['consumer_api_key']
@@ -154,7 +159,7 @@ module JekyllRecker
154
159
 
155
160
  def extract_from_config
156
161
  values = cred_fieldnames.map do |k|
157
- Shell.run(Configuration.twitter["#{k}_cmd"]).strip
162
+ Shell.run(config["#{k}_cmd"]).strip
158
163
  end
159
164
 
160
165
  return nil if values.any? { |v| v.nil? || v.empty? }
@@ -163,11 +168,11 @@ module JekyllRecker
163
168
  end
164
169
 
165
170
  def cred_fieldnames
166
- [
167
- 'access_token_secret',
168
- 'access_token',
169
- 'consumer_api_key',
170
- 'consumer_api_secret'
171
+ %w[
172
+ access_token_secret
173
+ access_token
174
+ consumer_api_key
175
+ consumer_api_secret
171
176
  ]
172
177
  end
173
178
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module JekyllRecker
4
- VERSION = '1.8.0'
4
+ VERSION = '1.14.0'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jekyll-recker
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.8.0
4
+ version: 1.14.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alex Recker
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-07-10 00:00:00.000000000 Z
11
+ date: 2020-07-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bump
@@ -94,6 +94,20 @@ dependencies:
94
94
  - - ">="
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: fastimage
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
97
111
  - !ruby/object:Gem::Dependency
98
112
  name: jekyll
99
113
  requirement: !ruby/object:Gem::Requirement
@@ -108,6 +122,20 @@ dependencies:
108
122
  - - "~>"
109
123
  - !ruby/object:Gem::Version
110
124
  version: '3.8'
125
+ - !ruby/object:Gem::Dependency
126
+ name: mini_magick
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
111
139
  - !ruby/object:Gem::Dependency
112
140
  name: slack-notifier
113
141
  requirement: !ruby/object:Gem::Requirement
@@ -154,18 +182,15 @@ files:
154
182
  - _layouts/home.html
155
183
  - _layouts/page.html
156
184
  - _layouts/post.html
185
+ - assets/jekyll-recker.scss
157
186
  - lib/jekyll-recker.rb
158
187
  - lib/jekyll_recker/commands.rb
159
- - lib/jekyll_recker/configuration.rb
160
- - lib/jekyll_recker/error.rb
161
- - lib/jekyll_recker/extensions.rb
162
188
  - lib/jekyll_recker/filters.rb
163
189
  - lib/jekyll_recker/generators.rb
164
190
  - lib/jekyll_recker/mixins.rb
165
191
  - lib/jekyll_recker/shell.rb
166
192
  - lib/jekyll_recker/social.rb
167
193
  - lib/jekyll_recker/tags.rb
168
- - lib/jekyll_recker/utils.rb
169
194
  - lib/jekyll_recker/version.rb
170
195
  homepage: https://www.github.com/arecker/jekyll-recker/
171
196
  licenses:
@@ -1,37 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module JekyllRecker
4
- # Configuration
5
- module Configuration
6
- def self.jekyll
7
- @jekyll ||= Jekyll.configuration
8
- end
9
-
10
- def self.recker
11
- jekyll.fetch('recker', {})
12
- end
13
-
14
- def self.facebook
15
- recker.fetch('facebook', {})
16
- end
17
-
18
- def self.twitter
19
- recker.fetch('twitter', {})
20
- end
21
-
22
- def self.slack
23
- recker.fetch('slack', {})
24
- end
25
-
26
- def self.site
27
- @site = Jekyll::Site.new(jekyll)
28
- @site.reset
29
- @site.read
30
- @site
31
- end
32
-
33
- def self.latest_post
34
- @latest_post ||= site.posts.docs.last
35
- end
36
- end
37
- end
@@ -1,6 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module JekyllRecker
4
- # Error
5
- class Error < StandardError; end
6
- end
@@ -1,38 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Integer extensions
4
- class Integer
5
- def pretty
6
- JekyllRecker::Utils.prettify_number(self)
7
- end
8
- end
9
-
10
- # String extensions
11
- class String
12
- def words
13
- JekyllRecker::Utils.to_word_list(self)
14
- end
15
-
16
- def word_count
17
- JekyllRecker::Utils.to_word_list(self).count
18
- end
19
-
20
- def pretty_path(home = nil)
21
- JekyllRecker::Utils.prettify_path(self, home)
22
- end
23
-
24
- def to_and_array
25
- JekyllRecker::Utils.and_list_to_array(self)
26
- end
27
- end
28
-
29
- # Array extensions
30
- class Array
31
- def to_and_list
32
- JekyllRecker::Utils.array_to_and_list(self)
33
- end
34
-
35
- def to_weighted_list
36
- JekyllRecker::Utils.to_weighted_list(self)
37
- end
38
- end
@@ -1,37 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module JekyllRecker
4
- # Utils
5
- module Utils
6
- def self.array_to_and_list(array)
7
- case array.length
8
- when 0
9
- ''
10
- when 1
11
- array.first
12
- when 2
13
- "#{array.first} and #{array.last}"
14
- else
15
- array[0...-1].join(', ') + ", and #{array.last}"
16
- end
17
- end
18
-
19
- def self.and_list_to_array(str)
20
- str = str.gsub(' and ', ', ')
21
- str.split(',').map(&:strip).reject(&:empty?)
22
- end
23
-
24
- def self.prettify_number(number)
25
- number.to_s.reverse.gsub(/(\d{3})(?=\d)/, '\\1,').reverse
26
- end
27
-
28
- def self.prettify_path(path, home = nil)
29
- home ||= File.expand_path('~/')
30
- path.sub(home, '~')
31
- end
32
-
33
- def self.to_word_list(str)
34
- str.split(' ')
35
- end
36
- end
37
- end