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.
- checksums.yaml +4 -4
- data/README.md +6 -7
- data/_includes/figure.html +14 -0
- data/_includes/footer.html +10 -1
- data/_includes/head.html +21 -0
- data/_includes/nav.html +3 -6
- data/_includes/pager.html +13 -0
- data/_layouts/home.html +13 -9
- data/_layouts/page.html +13 -8
- data/_layouts/post.html +20 -28
- data/lib/jekyll-recker.rb +17 -17
- data/lib/jekyll_recker/commands.rb +27 -0
- data/lib/jekyll_recker/configuration.rb +37 -0
- data/lib/jekyll_recker/error.rb +6 -0
- data/lib/jekyll_recker/extensions.rb +38 -0
- data/lib/jekyll_recker/filters.rb +13 -0
- data/lib/jekyll_recker/generators.rb +110 -0
- data/lib/jekyll_recker/mixins.rb +43 -0
- data/lib/{jekyll-recker → jekyll_recker}/shell.rb +5 -5
- data/lib/jekyll_recker/social.rb +175 -0
- data/lib/jekyll_recker/tags.rb +14 -0
- data/lib/jekyll_recker/utils.rb +37 -0
- data/lib/jekyll_recker/version.rb +5 -0
- metadata +103 -24
- data/_layouts/default.html +0 -16
- data/assets/inconsolata.css +0 -27
- data/assets/jekyll-recker.scss +0 -107
- data/assets/open-sans.css +0 -63
- data/lib/jekyll-recker/commands.rb +0 -12
- data/lib/jekyll-recker/commands/share.rb +0 -25
- data/lib/jekyll-recker/commands/slack.rb +0 -31
- data/lib/jekyll-recker/commands/tweet.rb +0 -31
- data/lib/jekyll-recker/configuration.rb +0 -35
- data/lib/jekyll-recker/error.rb +0 -8
- data/lib/jekyll-recker/generators.rb +0 -17
- data/lib/jekyll-recker/logger.rb +0 -20
- data/lib/jekyll-recker/mixins.rb +0 -27
- data/lib/jekyll-recker/slack.rb +0 -70
- data/lib/jekyll-recker/stats.rb +0 -109
- data/lib/jekyll-recker/tags.rb +0 -16
- data/lib/jekyll-recker/twitter.rb +0 -83
- data/lib/jekyll-recker/version.rb +0 -7
- data/lib/jekyll-recker/words.rb +0 -82
data/_layouts/default.html
DELETED
@@ -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>
|
data/assets/inconsolata.css
DELETED
@@ -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
|
-
}
|
data/assets/jekyll-recker.scss
DELETED
@@ -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
|
-
|
data/assets/open-sans.css
DELETED
@@ -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,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
|
data/lib/jekyll-recker/error.rb
DELETED
@@ -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
|
data/lib/jekyll-recker/logger.rb
DELETED
@@ -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
|
data/lib/jekyll-recker/mixins.rb
DELETED
@@ -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
|
data/lib/jekyll-recker/slack.rb
DELETED
@@ -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
|