jekyll-recker 1.2.3 → 1.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.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +6 -7
  3. data/_includes/figure.html +14 -0
  4. data/_includes/footer.html +10 -1
  5. data/_includes/head.html +21 -0
  6. data/_includes/nav.html +3 -6
  7. data/_includes/pager.html +13 -0
  8. data/_layouts/home.html +13 -9
  9. data/_layouts/page.html +13 -8
  10. data/_layouts/post.html +20 -28
  11. data/lib/jekyll-recker.rb +17 -17
  12. data/lib/jekyll_recker/commands.rb +27 -0
  13. data/lib/jekyll_recker/configuration.rb +37 -0
  14. data/lib/jekyll_recker/error.rb +6 -0
  15. data/lib/jekyll_recker/extensions.rb +38 -0
  16. data/lib/jekyll_recker/filters.rb +13 -0
  17. data/lib/jekyll_recker/generators.rb +110 -0
  18. data/lib/jekyll_recker/mixins.rb +43 -0
  19. data/lib/{jekyll-recker → jekyll_recker}/shell.rb +5 -5
  20. data/lib/jekyll_recker/social.rb +175 -0
  21. data/lib/jekyll_recker/tags.rb +14 -0
  22. data/lib/jekyll_recker/utils.rb +37 -0
  23. data/lib/jekyll_recker/version.rb +5 -0
  24. metadata +103 -24
  25. data/_layouts/default.html +0 -16
  26. data/assets/inconsolata.css +0 -27
  27. data/assets/jekyll-recker.scss +0 -107
  28. data/assets/open-sans.css +0 -63
  29. data/lib/jekyll-recker/commands.rb +0 -12
  30. data/lib/jekyll-recker/commands/share.rb +0 -25
  31. data/lib/jekyll-recker/commands/slack.rb +0 -31
  32. data/lib/jekyll-recker/commands/tweet.rb +0 -31
  33. data/lib/jekyll-recker/configuration.rb +0 -35
  34. data/lib/jekyll-recker/error.rb +0 -8
  35. data/lib/jekyll-recker/generators.rb +0 -17
  36. data/lib/jekyll-recker/logger.rb +0 -20
  37. data/lib/jekyll-recker/mixins.rb +0 -27
  38. data/lib/jekyll-recker/slack.rb +0 -70
  39. data/lib/jekyll-recker/stats.rb +0 -109
  40. data/lib/jekyll-recker/tags.rb +0 -16
  41. data/lib/jekyll-recker/twitter.rb +0 -83
  42. data/lib/jekyll-recker/version.rb +0 -7
  43. data/lib/jekyll-recker/words.rb +0 -82
@@ -1,16 +0,0 @@
1
- <!doctype html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="UTF-8"/>
5
- <title>{{ site.title }} | {{ page.title | default: site.description }}</title>
6
- <meta name="viewport" content="width=device-width, initial-scale=1">
7
- <link href="{{ site.baseurl }}/assets/open-sans.css" rel="stylesheet"/>
8
- <link href="{{ site.baseurl }}/assets/inconsolata.css" rel="stylesheet"/>
9
- <link href="{{ site.baseurl }}/assets/jekyll-recker.css" rel="stylesheet"/>
10
- </head>
11
- <body>
12
- {{ content }}
13
- <hr/>
14
- {% include footer.html %}
15
- </body>
16
- </html>
@@ -1,27 +0,0 @@
1
- /* vietnamese */
2
- @font-face {
3
- font-family: 'Inconsolata';
4
- font-style: normal;
5
- font-weight: 400;
6
- font-display: swap;
7
- src: local('Inconsolata Regular'), local('Inconsolata-Regular'), url(https://fonts.gstatic.com/s/inconsolata/v18/QldKNThLqRwH-OJ1UHjlKGlW5qhExfHwNJU.woff2) format('woff2');
8
- unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB;
9
- }
10
- /* latin-ext */
11
- @font-face {
12
- font-family: 'Inconsolata';
13
- font-style: normal;
14
- font-weight: 400;
15
- font-display: swap;
16
- src: local('Inconsolata Regular'), local('Inconsolata-Regular'), url(https://fonts.gstatic.com/s/inconsolata/v18/QldKNThLqRwH-OJ1UHjlKGlX5qhExfHwNJU.woff2) format('woff2');
17
- unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
18
- }
19
- /* latin */
20
- @font-face {
21
- font-family: 'Inconsolata';
22
- font-style: normal;
23
- font-weight: 400;
24
- font-display: swap;
25
- src: local('Inconsolata Regular'), local('Inconsolata-Regular'), url(https://fonts.gstatic.com/s/inconsolata/v18/QldKNThLqRwH-OJ1UHjlKGlZ5qhExfHw.woff2) format('woff2');
26
- unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
27
- }
@@ -1,107 +0,0 @@
1
- ---
2
- ---
3
-
4
- .float-right {
5
- float: right;
6
- }
7
-
8
- .float-left {
9
- float: left;
10
- }
11
-
12
- .clearfix::after {
13
- content: "";
14
- clear: both;
15
- display: block;
16
- }
17
-
18
- @media screen and (max-width: 600px) {
19
- .hide-on-mobile {
20
- display: none;
21
- }
22
- }
23
-
24
- ul.unstyled {
25
- list-style-type: none;
26
- margin: 0;
27
- padding: 0;
28
- }
29
-
30
- body {
31
- margin: 40px auto;
32
- max-width: 800px;
33
- line-height: 1.6;
34
- font-size: 18px;
35
- color: #444;
36
- padding: 0 10px;
37
- }
38
-
39
- h1, h2, h3 {
40
- line-height: 1.2;
41
- }
42
-
43
- header {
44
- h1 {
45
- margin-bottom: 9px;
46
- }
47
-
48
- p {
49
- margin-top: 9px;
50
- }
51
- }
52
-
53
- figure {
54
- img {
55
- display: block;
56
- margin-left: auto;
57
- margin-right: auto;
58
- vertical-align: top;
59
- height: auto;
60
- max-width: 100%;
61
- }
62
-
63
- figcaption {
64
- text-align: center;
65
- }
66
- }
67
-
68
- nav {
69
- a {
70
- margin-right: 10px;
71
- }
72
-
73
- a.active {
74
- color: black !important;
75
- }
76
-
77
- span {
78
- color: #6f7370;
79
- }
80
- }
81
-
82
- a {
83
- text-decoration: none !important;
84
- color: #008083 !important;
85
-
86
- :hover {
87
- text-decoration: underline !important;
88
- }
89
-
90
- :active {
91
- color: #6f7370 !important;
92
- }
93
- }
94
-
95
- * {
96
- // font-family: 'Titillium Web', sans-serif !important;
97
- font-family: 'Open Sans', 'sans-serif' !important;
98
- }
99
-
100
- code, pre, pre span {
101
- font-family: Inconsolata, monospace !important;
102
- }
103
-
104
- pre, pre span {
105
- font-size: 14px;
106
- }
107
-
@@ -1,63 +0,0 @@
1
- /* cyrillic-ext */
2
- @font-face {
3
- font-family: 'Open Sans';
4
- font-style: normal;
5
- font-weight: 400;
6
- font-display: swap;
7
- src: local('Open Sans Regular'), local('OpenSans-Regular'), url(https://fonts.gstatic.com/s/opensans/v17/mem8YaGs126MiZpBA-UFWJ0bf8pkAp6a.woff2) format('woff2');
8
- unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
9
- }
10
- /* cyrillic */
11
- @font-face {
12
- font-family: 'Open Sans';
13
- font-style: normal;
14
- font-weight: 400;
15
- font-display: swap;
16
- src: local('Open Sans Regular'), local('OpenSans-Regular'), url(https://fonts.gstatic.com/s/opensans/v17/mem8YaGs126MiZpBA-UFUZ0bf8pkAp6a.woff2) format('woff2');
17
- unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
18
- }
19
- /* greek-ext */
20
- @font-face {
21
- font-family: 'Open Sans';
22
- font-style: normal;
23
- font-weight: 400;
24
- font-display: swap;
25
- src: local('Open Sans Regular'), local('OpenSans-Regular'), url(https://fonts.gstatic.com/s/opensans/v17/mem8YaGs126MiZpBA-UFWZ0bf8pkAp6a.woff2) format('woff2');
26
- unicode-range: U+1F00-1FFF;
27
- }
28
- /* greek */
29
- @font-face {
30
- font-family: 'Open Sans';
31
- font-style: normal;
32
- font-weight: 400;
33
- font-display: swap;
34
- src: local('Open Sans Regular'), local('OpenSans-Regular'), url(https://fonts.gstatic.com/s/opensans/v17/mem8YaGs126MiZpBA-UFVp0bf8pkAp6a.woff2) format('woff2');
35
- unicode-range: U+0370-03FF;
36
- }
37
- /* vietnamese */
38
- @font-face {
39
- font-family: 'Open Sans';
40
- font-style: normal;
41
- font-weight: 400;
42
- font-display: swap;
43
- src: local('Open Sans Regular'), local('OpenSans-Regular'), url(https://fonts.gstatic.com/s/opensans/v17/mem8YaGs126MiZpBA-UFWp0bf8pkAp6a.woff2) format('woff2');
44
- unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB;
45
- }
46
- /* latin-ext */
47
- @font-face {
48
- font-family: 'Open Sans';
49
- font-style: normal;
50
- font-weight: 400;
51
- font-display: swap;
52
- src: local('Open Sans Regular'), local('OpenSans-Regular'), url(https://fonts.gstatic.com/s/opensans/v17/mem8YaGs126MiZpBA-UFW50bf8pkAp6a.woff2) format('woff2');
53
- unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
54
- }
55
- /* latin */
56
- @font-face {
57
- font-family: 'Open Sans';
58
- font-style: normal;
59
- font-weight: 400;
60
- font-display: swap;
61
- src: local('Open Sans Regular'), local('OpenSans-Regular'), url(https://fonts.gstatic.com/s/opensans/v17/mem8YaGs126MiZpBA-UFVZ0bf8pkAg.woff2) format('woff2');
62
- unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
63
- }
@@ -1,12 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Jekyll
4
- module Recker
5
- # Commands
6
- module Commands
7
- require 'jekyll-recker/commands/share.rb'
8
- require 'jekyll-recker/commands/slack.rb'
9
- require 'jekyll-recker/commands/tweet.rb'
10
- end
11
- end
12
- end
@@ -1,25 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Jekyll
4
- module Recker
5
- module Commands
6
- # Share
7
- class Share < Jekyll::Command
8
- include Jekyll::Recker::LoggingMixin
9
-
10
- def self.init_with_program(prog)
11
- prog.command(:share) do |c|
12
- c.syntax 'share'
13
- c.description 'Share latest post with each configured backend'
14
- c.option 'dry', '-d', '--dry', 'perform dry run'
15
- c.action do |_args, _options|
16
- logger.info 'normally I\'d share here'
17
- rescue ReckerError => e
18
- logger.abort_with e.message
19
- end
20
- end
21
- end
22
- end
23
- end
24
- end
25
- end
@@ -1,31 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Jekyll
4
- module Recker
5
- module Commands
6
- # Slack
7
- class Slack < Jekyll::Command
8
- include LoggingMixin
9
- class << self
10
- def init_with_program(prog)
11
- prog.command(:slack) do |c|
12
- c.syntax 'slack'
13
- c.description 'slack latest post'
14
- c.option 'dry', '-d', '--dry', 'print message instead of posting'
15
- c.action do |_args, options|
16
- Recker::Slack.each_in_config(dry: options['dry']) do |client|
17
- logger.info "#{client.key}: discovering webhook"
18
- client.discover_webhook!
19
- logger.info "#{client.key}: posting #{client.latest.data['title']}"
20
- client.post_latest!
21
- end
22
- rescue ReckerError => e
23
- logger.abort_with e.message
24
- end
25
- end
26
- end
27
- end
28
- end
29
- end
30
- end
31
- end
@@ -1,31 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Jekyll
4
- module Recker
5
- module Commands
6
- # Tweet
7
- class Tweet < Jekyll::Command
8
- include LoggingMixin
9
-
10
- class << self
11
- def init_with_program(prog)
12
- prog.command(:tweet) do |c|
13
- c.syntax 'tweet'
14
- c.description 'tweet latest post'
15
- c.option 'dry', '-d', '--dry', 'print message instead of tweeting'
16
- c.action do |_args, options|
17
- client = Jekyll::Recker::Twitter.new(dry: options['dry'])
18
- logger.info 'discovering credentials'
19
- client.discover_credentials!
20
- logger.info "tweeting #{client.latest.data['title']}"
21
- client.post_latest!
22
- rescue ReckerError => e
23
- logger.abort_with e.message
24
- end
25
- end
26
- end
27
- end
28
- end
29
- end
30
- end
31
- end
@@ -1,35 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Jekyll
4
- module Recker
5
- # Configuration
6
- module Configuration
7
- def self.jekyll
8
- @jekyll ||= Jekyll.configuration
9
- end
10
-
11
- def self.recker
12
- jekyll.fetch('recker', {})
13
- end
14
-
15
- def self.twitter
16
- recker.fetch('twitter', {})
17
- end
18
-
19
- def self.slack
20
- recker.fetch('slack', {})
21
- end
22
-
23
- def self.site
24
- @site = Jekyll::Site.new(jekyll)
25
- @site.reset
26
- @site.read
27
- @site
28
- end
29
-
30
- def self.latest_post
31
- @latest_post ||= site.posts.docs.last
32
- end
33
- end
34
- end
35
- end
@@ -1,8 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Jekyll
4
- module Recker
5
- # ReckerError
6
- class ReckerError < StandardError; end
7
- end
8
- end
@@ -1,17 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Jekyll
4
- module Recker
5
- module Generators
6
- # StatsGenerator
7
- class StatsGenerator < Jekyll::Generator
8
- include Jekyll::Recker::LoggingMixin
9
-
10
- def generate(site)
11
- logger.info 'generating site statistics'
12
- site.data['stats'] = Stats.crunch(site)
13
- end
14
- end
15
- end
16
- end
17
- end
@@ -1,20 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'logger'
4
-
5
- module Jekyll
6
- # Recker
7
- module Recker
8
- def self.logger
9
- @logger ||= make_logger
10
- end
11
-
12
- def self.make_logger
13
- logger = Logger.new(STDOUT)
14
- logger.formatter = proc do |_severity, _datetime, _progname, msg|
15
- "jekyll-recker: #{msg}\n"
16
- end
17
- logger
18
- end
19
- end
20
- end
@@ -1,27 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Jekyll
4
- module Recker
5
- # Descendants Mixin
6
- module DescendantsMixin
7
- def self.included(base)
8
- def base.descendants
9
- ObjectSpace.each_object(Class).select { |klass| klass < self }
10
- end
11
- end
12
- end
13
-
14
- # Logging Mixin
15
- module LoggingMixin
16
- def self.included(base)
17
- def base.logger
18
- Jekyll::Recker.logger
19
- end
20
- end
21
-
22
- def logger
23
- Jekyll::Recker.logger
24
- end
25
- end
26
- end
27
- end
@@ -1,70 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'slack-notifier'
4
-
5
- module Jekyll
6
- # Recker
7
- module Recker
8
- # Slack
9
- class Slack
10
- include Jekyll::Recker::LoggingMixin
11
-
12
- def self.each_in_config(dry: false)
13
- Configuration.slack.map do |key, body|
14
- yield new(key, body, dry: dry)
15
- end
16
- end
17
-
18
- attr_reader :key
19
-
20
- def initialize(config_key, config_body, dry: false)
21
- @key = config_key
22
- @data = config_body
23
- @webhook = nil
24
- @dry = dry
25
- end
26
-
27
- def discover_webhook!
28
- @webhook = ENV["SLACK_#{@key.upcase}_WEBHOOK"] || extract_from_config
29
- raise ReckerError, 'cannot find slack credentials!' if @webhook.nil?
30
- end
31
-
32
- def latest
33
- @latest ||= Configuration.latest_post
34
- end
35
-
36
- def post_latest!
37
- if @dry
38
- logger.info('postign in dry mode, printing message')
39
- logger.info("BEGIN MESSAGE\n#{message_body.strip}\nEND MESSAGE")
40
- else
41
- ::Slack::Notifier.new(
42
- @webhook.strip,
43
- channel: @data.fetch('channel'),
44
- username: @data.fetch('username'),
45
- icon_emoji: @data.fetch('emoji')
46
- ).post(text: message_body)
47
- end
48
- end
49
-
50
- private
51
-
52
- def message_body
53
- url = File.join Configuration.jekyll['url'], latest.url
54
- body = <<~MSG
55
- #{latest.data['date'].strftime('%A, %B %-d %Y')}
56
- #{latest.data['title']}
57
- #{url}
58
- MSG
59
- ::Slack::Notifier::Util::LinkFormatter.format(body)
60
- end
61
-
62
- def extract_from_config
63
- cmd = @data['webhook_cmd']
64
- return nil if cmd.nil?
65
-
66
- Recker.shell(cmd)
67
- end
68
- end
69
- end
70
- end