blog-generator 0.0.8 → 0.0.9
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 +2 -2
- data/bin/blog-generator.rb +18 -4
- data/lib/blog-generator.rb +15 -2
- data/lib/blog-generator/feed.rb +4 -3
- data/lib/blog-generator/post.rb +26 -6
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c4223a5c99949293121434806a6e208892610b2e
|
4
|
+
data.tar.gz: 11ddc6a101e1d2da88cc950fc5b22addbeed5662
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9c96fe40d449a78473f476f3810f84908c27f7258428c1fd5df7891427be9f54e92674fefd745703c1e33bed69763ea61cf7e784c6a2bb2672e170bbfccffe59
|
7
|
+
data.tar.gz: 69ae7f14ae1bad2d91c380243f1c5fd4e475c165907989e82eb7b94604b98257c64043cf0e0030a0474091d75dcf1c1f95f58ac5ffdbb5ef9a9f3abde162d7fc
|
data/README.md
CHANGED
@@ -37,11 +37,11 @@ tags: ['Hello world', 'Test']
|
|
37
37
|
- Metadata `draft: true` will exclude the post.
|
38
38
|
- Any other metadata can be added and will be accessible in the resulting JSON.
|
39
39
|
- Body has `#excerpt`.
|
40
|
-
- Format `posts/:
|
40
|
+
- Format `posts/:published_at-:slug.:format`.
|
41
41
|
|
42
42
|
# Routes generated
|
43
43
|
|
44
|
-
- `slug` and `
|
44
|
+
- `slug` and `published_at` added to metadata.
|
45
45
|
- `/metadata.json`
|
46
46
|
- `/posts.json`
|
47
47
|
- `/posts/:slug.json`
|
data/bin/blog-generator.rb
CHANGED
@@ -8,7 +8,7 @@ require 'ostruct'
|
|
8
8
|
require 'fileutils'
|
9
9
|
require 'blog-generator'
|
10
10
|
|
11
|
-
POSTS_DIR, OUTPUT_BASE_PATH = ARGV
|
11
|
+
POSTS_DIR, OUTPUT_BASE_PATH = ARGV.map { |i| i.chomp('/') }
|
12
12
|
|
13
13
|
unless ARGV.length == 2
|
14
14
|
abort "Usage: #{$0} [posts dir] [output base path]"
|
@@ -18,9 +18,21 @@ unless File.directory?(POSTS_DIR)
|
|
18
18
|
abort "Posts directory #{POSTS_DIR} doesn't exist."
|
19
19
|
end
|
20
20
|
|
21
|
+
if Dir.exists?("#{OUTPUT_BASE_PATH}_prev") # If it does, the last build crashed.
|
22
|
+
puts "~ Last build crashed. Reusing #{OUTPUT_BASE_PATH}_prev."
|
23
|
+
elsif (! Dir.exists?("#{OUTPUT_BASE_PATH}_prev")) && Dir.exists?(OUTPUT_BASE_PATH) # otherwise it's first run.
|
24
|
+
FileUtils.mv(OUTPUT_BASE_PATH, "#{OUTPUT_BASE_PATH}_prev") # So we don't get any artifacts.
|
25
|
+
end
|
21
26
|
|
22
|
-
|
23
|
-
|
27
|
+
unless Dir.exists?(OUTPUT_BASE_PATH)
|
28
|
+
puts "~ #{OUTPUT_BASE_PATH} doesn't exist, creating."
|
29
|
+
Dir.mkdir(OUTPUT_BASE_PATH)
|
30
|
+
end
|
31
|
+
|
32
|
+
OLD_POSTS = Dir.glob("#{OUTPUT_BASE_PATH}_prev/posts/*.json").reduce(Hash.new) do |posts, path|
|
33
|
+
post = JSON.parse(File.read(path))
|
34
|
+
posts.merge(post['slug'] => post)
|
35
|
+
end
|
24
36
|
|
25
37
|
path = File.expand_path(File.join(POSTS_DIR, '..', 'defaults.yml'))
|
26
38
|
unless File.exist?(path)
|
@@ -30,7 +42,7 @@ end
|
|
30
42
|
# Parse the posts.
|
31
43
|
site = OpenStruct.new(File.exist?(path) ? YAML.load_file(path) : Hash.new)
|
32
44
|
site.feed = [site.base_url, 'posts.atom'].join('/')
|
33
|
-
generator = BlogGenerator::Generator.parse(site, POSTS_DIR)
|
45
|
+
generator = BlogGenerator::Generator.parse(site, POSTS_DIR, OLD_POSTS)
|
34
46
|
|
35
47
|
# Generate.
|
36
48
|
|
@@ -76,3 +88,5 @@ Dir.chdir(OUTPUT_BASE_PATH) do
|
|
76
88
|
file "tags/#{tag[:slug]}.atom", feed.render
|
77
89
|
end
|
78
90
|
end
|
91
|
+
|
92
|
+
FileUtils.rm_rf("#{OUTPUT_BASE_PATH}_prev") # Has to be forced, otherwise fails on the first run.
|
data/lib/blog-generator.rb
CHANGED
@@ -7,7 +7,7 @@ require 'blog-generator/feed'
|
|
7
7
|
|
8
8
|
module BlogGenerator
|
9
9
|
class Generator
|
10
|
-
def self.parse(site, posts_dir)
|
10
|
+
def self.parse(site, posts_dir, old_posts)
|
11
11
|
posts = Dir.glob("#{posts_dir}/*.{html,md}").reduce(Array.new) do |posts, path|
|
12
12
|
posts.push(Post.new(site, path))
|
13
13
|
end
|
@@ -15,7 +15,20 @@ module BlogGenerator
|
|
15
15
|
published_posts = posts.select { |post| ! post.metadata[:draft] }
|
16
16
|
|
17
17
|
published_posts.sort! do |a, b|
|
18
|
-
b.
|
18
|
+
b.published_at <=> a.published_at
|
19
|
+
end
|
20
|
+
|
21
|
+
published_posts.each do |post|
|
22
|
+
if old_post = old_posts[post.slug]
|
23
|
+
post.update_post_with_previous_values(OpenStruct.new(old_post))
|
24
|
+
p [post.published_at, post.published_on]
|
25
|
+
if post.published_at && post.published_on.to_date != post.published_at.to_date
|
26
|
+
abort "~ Published_at doesn't match published_on from the date part of #{post.slug} filename: #{[post.published_on.to_date, post.published_at.to_date].inspect}"
|
27
|
+
end
|
28
|
+
|
29
|
+
else
|
30
|
+
puts "~ New post: #{post.slug}"
|
31
|
+
end
|
19
32
|
end
|
20
33
|
|
21
34
|
self.new(site, PostList.new(site, published_posts))
|
data/lib/blog-generator/feed.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'erb'
|
2
2
|
require 'digest'
|
3
3
|
require 'forwardable'
|
4
|
+
require 'date'
|
4
5
|
|
5
6
|
module BlogGenerator
|
6
7
|
class Feed
|
@@ -31,7 +32,7 @@ module BlogGenerator
|
|
31
32
|
end
|
32
33
|
|
33
34
|
def updated_at
|
34
|
-
self.posts.last.updated_at
|
35
|
+
self.posts.last.updated_at || self.posts.last.published_at
|
35
36
|
end
|
36
37
|
|
37
38
|
def template
|
@@ -54,7 +55,7 @@ __END__
|
|
54
55
|
<link href="<%= self.feed_url %>" rel="self" />
|
55
56
|
<link href="<%= self.base_url %>" />
|
56
57
|
<id><%= self.id %></id>
|
57
|
-
<updated><%= self.updated_at.iso8601 %></updated>
|
58
|
+
<updated><%= self.updated_at.to_date.iso8601 %></updated>
|
58
59
|
|
59
60
|
<% posts.each do |post| %>
|
60
61
|
<entry>
|
@@ -62,7 +63,7 @@ __END__
|
|
62
63
|
<link href="<%= post.absolute_url %>" />
|
63
64
|
<link rel="alternate" type="text/html" href="<%= post.absolute_url %>"/>
|
64
65
|
<id><%= post.id %></id>
|
65
|
-
<updated><%= post.updated_at.iso8601 %></updated>
|
66
|
+
<updated><%= (post.updated_at || post.published_at).to_date.iso8601 %></updated>
|
66
67
|
<!-- TODO: strip HTML from excerpt -->
|
67
68
|
<summary><%= post.excerpt %></summary>
|
68
69
|
<!-- <content type="xhtml">
|
data/lib/blog-generator/post.rb
CHANGED
@@ -7,7 +7,7 @@ module BlogGenerator
|
|
7
7
|
class Post
|
8
8
|
REGEXP = /^(\d{4}-\d{2}-\d{2})-(.+)\.(html|md)$/
|
9
9
|
|
10
|
-
attr_reader :site, :metadata, :format
|
10
|
+
attr_reader :site, :metadata, :format, :published_on, :updated_at
|
11
11
|
def initialize(site, path)
|
12
12
|
# TODO: metadata so we can construct url (base_url + relative) AND merge author
|
13
13
|
@site, @path = site, File.expand_path(path)
|
@@ -16,13 +16,14 @@ module BlogGenerator
|
|
16
16
|
buffer.merge(slug.to_sym => value)
|
17
17
|
end
|
18
18
|
|
19
|
-
published_on, slug, format = parse_path(path)
|
19
|
+
@published_on, slug, format = parse_path(path)
|
20
|
+
|
20
21
|
@format = format # So we can access it from excerpt without having to pass it as an argument and break everything.
|
21
22
|
|
22
23
|
@body = convert_markdown(self.body) if format == :md
|
23
24
|
self.body # cache if it wasn't called yet
|
24
25
|
|
25
|
-
@metadata.merge!(slug: slug,
|
26
|
+
@metadata.merge!(slug: slug, published_at: self.published_at)
|
26
27
|
@metadata.merge!(excerpt: excerpt)
|
27
28
|
@metadata.merge!(path: "/posts/#{slug}") ### TODO: some routing config.
|
28
29
|
|
@@ -43,8 +44,27 @@ module BlogGenerator
|
|
43
44
|
@body = document.css('body').inner_html.strip
|
44
45
|
end
|
45
46
|
|
46
|
-
|
47
|
-
|
47
|
+
# slug cannot be updated
|
48
|
+
# => It has to be in Git now.
|
49
|
+
def update_post_with_previous_values(old_post)
|
50
|
+
@published_at = DateTime.parse(old_post.published_at).to_time.utc
|
51
|
+
@updated_at = DateTime.parse(old_post.updated_at).to_time.utc if old_post.updated_at
|
52
|
+
@metadata.merge!(published_at: self.published_at)
|
53
|
+
@metadata.merge!(updated_at: self.updated_at) if @updated_at
|
54
|
+
if old_post.body != self.body # TODO: some more intelligent analysis, if more than 10% changed.
|
55
|
+
puts "~ Post #{self.slug} has been updated."
|
56
|
+
self.update!
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
# TODO: get rid off the variable and proxy it to metadata[:published_at].
|
61
|
+
def published_at
|
62
|
+
# When it was actually generated. It is then sourced from the last generated file, so it doesn't keep updating.
|
63
|
+
@published_at ||= Time.now.utc
|
64
|
+
end
|
65
|
+
|
66
|
+
def update!
|
67
|
+
@updated_at = Time.now.utc
|
48
68
|
end
|
49
69
|
|
50
70
|
def author
|
@@ -104,7 +124,7 @@ module BlogGenerator
|
|
104
124
|
|
105
125
|
def parse_path(path)
|
106
126
|
match = File.basename(path).match(REGEXP)
|
107
|
-
[Date.parse(match[1]), match[2], match[3].to_sym]
|
127
|
+
[Date.parse(match[1]).to_time.utc, match[2], match[3].to_sym]
|
108
128
|
end
|
109
129
|
|
110
130
|
def convert_markdown(markup)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: blog-generator
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- James C Russell
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-01-
|
11
|
+
date: 2017-01-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nokogiri
|