blog-generator 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/blog-generator.rb +22 -31
- data/lib/blog-generator.rb +7 -5
- data/lib/blog-generator/feed.rb +8 -0
- data/lib/blog-generator/post.rb +21 -6
- data/lib/blog-generator/post_list.rb +3 -3
- 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: ed3c23b9ad0f82dde254a9d03d078a9531485b59
|
4
|
+
data.tar.gz: b826167d4a93e7e559c98a493680572fb85f76e8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b1f7b6d0caf385190f2d95bd8c680486cffff05a99f8e6cdf3de66f5b9e91466583908ff7a473cc0c39855158a81f3816cf32638f0d1a70dc53c12d07220fe53
|
7
|
+
data.tar.gz: 4298605c3a49269f119d3f3ccecea54e38e74a2970f429087f94628d3ae75ac0d35ddd660dcfa4bec4197a0fda9f8eb191a8a74a2e9affad8cef738f9f9ca5ff
|
data/bin/blog-generator.rb
CHANGED
@@ -29,57 +29,48 @@ end
|
|
29
29
|
|
30
30
|
# Parse the posts.
|
31
31
|
site = OpenStruct.new(File.exist?(path) ? YAML.load_file(path) : Hash.new)
|
32
|
+
site.feed = [site.base_url, 'posts.atom'].join('/')
|
32
33
|
generator = BlogGenerator::Generator.parse(site, POSTS_DIR)
|
33
34
|
|
34
35
|
# Generate.
|
35
36
|
|
36
|
-
|
37
|
-
|
38
|
-
File.open(
|
39
|
-
|
40
|
-
file.puts(site.instance_variable_get(:@table).to_json)
|
37
|
+
def file(path, content)
|
38
|
+
puts "~ #{path}"
|
39
|
+
File.open(path, 'w') do |file|
|
40
|
+
file.puts(content)
|
41
41
|
end
|
42
|
+
end
|
42
43
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
end
|
44
|
+
Dir.chdir(OUTPUT_BASE_PATH) do
|
45
|
+
# GET /metadata.json
|
46
|
+
# TODO: Refactor this, it's evil.
|
47
|
+
file 'metadata.json', JSON.pretty_generate(site.instance_variable_get(:@table))
|
48
48
|
|
49
49
|
# GET /posts.atom
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
50
|
+
feed = BlogGenerator::Feed.new(site, generator.posts, 'posts.atom')
|
51
|
+
file 'posts.atom', feed.render
|
52
|
+
|
53
|
+
# GET /api/posts.json
|
54
|
+
# This calls PostList#to_json
|
55
|
+
file 'posts.json', JSON.pretty_generate(generator.posts)
|
54
56
|
|
55
57
|
# GET /api/posts/hello-world.json
|
56
58
|
Dir.mkdir('posts') unless Dir.exist?('posts')
|
57
59
|
generator.posts.each do |post|
|
58
|
-
|
59
|
-
file.puts(JSON.pretty_generate(post))
|
60
|
-
end
|
60
|
+
file "posts/#{post.slug}.json", JSON.pretty_generate(post)
|
61
61
|
end
|
62
62
|
|
63
63
|
# GET /api/tags.json
|
64
|
-
|
65
|
-
# [{title: x, slug: y}]
|
66
|
-
tags = generator.tags.map do |tag, _|
|
67
|
-
tag.merge(path: "/tags/#{tag[:slug]}") ### TODO: some routing config.
|
68
|
-
end
|
69
|
-
file.puts(JSON.pretty_generate(tags))
|
70
|
-
end
|
64
|
+
file 'tags.json', JSON.pretty_generate(generator.tags.keys)
|
71
65
|
|
72
66
|
Dir.mkdir('tags') unless Dir.exist?('tags')
|
73
67
|
generator.tags.each do |tag, posts|
|
74
68
|
# GET /api/tags/doxxu.json
|
75
|
-
|
76
|
-
|
77
|
-
end
|
69
|
+
body = {tag: tag, posts: posts}
|
70
|
+
file "tags/#{tag[:slug]}.json", JSON.pretty_generate(body)
|
78
71
|
|
79
72
|
# GET /api/tags/doxxu.atom
|
80
|
-
|
81
|
-
|
82
|
-
file.puts(feed.render)
|
83
|
-
end
|
73
|
+
feed = BlogGenerator::Feed.new(site, posts, "#{tag[:slug]}.atom")
|
74
|
+
file "tags/#{tag[:slug]}.atom", feed.render
|
84
75
|
end
|
85
76
|
end
|
data/lib/blog-generator.rb
CHANGED
@@ -8,13 +8,15 @@ require 'blog-generator/feed'
|
|
8
8
|
module BlogGenerator
|
9
9
|
class Generator
|
10
10
|
def self.parse(site, posts_dir)
|
11
|
-
posts = Dir.glob("#{posts_dir}/*.{html,md}").reduce(
|
12
|
-
|
13
|
-
puts "~ Parsing #{post.inspect}"
|
14
|
-
posts.push(post)
|
11
|
+
posts = Dir.glob("#{posts_dir}/*.{html,md}").reduce(Array.new) do |posts, path|
|
12
|
+
posts.push(Post.new(site, path))
|
15
13
|
end
|
16
14
|
|
17
|
-
|
15
|
+
posts = posts.sort do |a, b|
|
16
|
+
b.published_on <=> a.published_on
|
17
|
+
end
|
18
|
+
|
19
|
+
self.new(site, PostList.new(site, posts))
|
18
20
|
end
|
19
21
|
|
20
22
|
attr_reader :site, :posts
|
data/lib/blog-generator/feed.rb
CHANGED
@@ -17,6 +17,14 @@ module BlogGenerator
|
|
17
17
|
[@site.base_url, @relative_url].join('/')
|
18
18
|
end
|
19
19
|
|
20
|
+
def as_json
|
21
|
+
{title: self.title, url: self.feed_url}
|
22
|
+
end
|
23
|
+
|
24
|
+
def to_json(*args)
|
25
|
+
self.as_json.to_json(*args)
|
26
|
+
end
|
27
|
+
|
20
28
|
def id
|
21
29
|
digest = Digest::MD5.hexdigest(posts.each.map(&:title).join(","))
|
22
30
|
"urn:uuid:#{digest}"
|
data/lib/blog-generator/post.rb
CHANGED
@@ -7,16 +7,17 @@ module BlogGenerator
|
|
7
7
|
class Post
|
8
8
|
REGEXP = /^(\d{4}-\d{2}-\d{2})-(.+)\.(html|md)$/
|
9
9
|
|
10
|
-
attr_reader :site, :metadata
|
10
|
+
attr_reader :site, :metadata, :format
|
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)
|
14
14
|
|
15
|
-
@metadata = YAML.load_file(path).reduce(Hash.new) do |buffer, (
|
16
|
-
buffer.merge(
|
15
|
+
@metadata = YAML.load_file(path).reduce(Hash.new) do |buffer, (slug, value)|
|
16
|
+
buffer.merge(slug.to_sym => value)
|
17
17
|
end
|
18
18
|
|
19
19
|
published_on, slug, format = parse_path(path)
|
20
|
+
@format = format # So we can access it from excerpt without having to pass it as an argument and break everything.
|
20
21
|
|
21
22
|
@body = convert_markdown(self.body) if format == :md
|
22
23
|
self.body # cache if it wasn't called yet
|
@@ -26,9 +27,17 @@ module BlogGenerator
|
|
26
27
|
@metadata.merge!(path: "/posts/#{slug}") ### TODO: some routing config.
|
27
28
|
|
28
29
|
@metadata[:tags].map! do |tag|
|
29
|
-
|
30
|
+
slug = generate_slug(tag)
|
31
|
+
feed = "#{site.base_url}/#{slug}.atom"
|
32
|
+
{title: tag, slug: slug, feed: feed}
|
30
33
|
end
|
31
34
|
|
35
|
+
tag_feeds = @metadata[:tags].map do |tag|
|
36
|
+
tag[:feed]
|
37
|
+
end
|
38
|
+
|
39
|
+
# @metadata.merge!(feeds: atom.feeds + tag_feeds) ### TODO: some routing config.
|
40
|
+
|
32
41
|
document = Nokogiri::HTML(self.body)
|
33
42
|
document.css('#excerpt').remove
|
34
43
|
@body = document.css('body').inner_html.strip
|
@@ -68,9 +77,15 @@ module BlogGenerator
|
|
68
77
|
@body ||= File.read(@path).match(/\n---\n(.+)$/m)[1].strip
|
69
78
|
end
|
70
79
|
|
71
|
-
# We're converting it to MD, apparently it's necessary even though we converted the whole text initially, but it seems like MD ignores whatever is in <div id="excerpt">...</div>.
|
72
80
|
def excerpt
|
73
|
-
|
81
|
+
if self.format == :html
|
82
|
+
@excerpt ||= Nokogiri::HTML(Nokogiri::HTML(self.body).css('#excerpt').inner_html.strip).css('p').inner_html
|
83
|
+
elsif self.format == :md
|
84
|
+
# We're converting it to MD, apparently it's necessary even though we
|
85
|
+
# converted the whole text initially, but it seems like MD ignores whatever
|
86
|
+
# is in <div id="excerpt">...</div>.
|
87
|
+
@excerpt ||= Nokogiri::HTML(convert_markdown(Nokogiri::HTML(self.body).css('#excerpt').inner_html.strip)).css('p').inner_html
|
88
|
+
end
|
74
89
|
end
|
75
90
|
|
76
91
|
def as_json
|
@@ -6,11 +6,11 @@ module BlogGenerator
|
|
6
6
|
extend Forwardable
|
7
7
|
|
8
8
|
attr_reader :site, :posts
|
9
|
-
def initialize(site)
|
10
|
-
@site, @posts = site,
|
9
|
+
def initialize(site, posts = Array.new)
|
10
|
+
@site, @posts = site, posts
|
11
11
|
end
|
12
12
|
|
13
|
-
def_delegators :@posts, :reduce, :each, :first, :last, :[]
|
13
|
+
def_delegators :@posts, :reduce, :each, :sort, :first, :last, :[]
|
14
14
|
|
15
15
|
def as_json
|
16
16
|
self.posts.map do |post|
|
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.5
|
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:
|
11
|
+
date: 2017-01-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nokogiri
|