jekyll-recker 1.2.3 → 1.8.0

Sign up to get free protection for your applications and to get access to all the features.
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