planet 0.3.1 → 0.3.3
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/planet +49 -47
- data/lib/planet/version.rb +1 -1
- data/lib/planet.rb +29 -15
- metadata +17 -1
data/bin/planet
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
$: << File.expand_path(File.dirname(File.realpath(__FILE__)) + '/../lib')
|
4
|
-
require 'rubygems'
|
5
3
|
require 'gli'
|
4
|
+
require 'box'
|
6
5
|
require 'planet'
|
7
6
|
|
8
7
|
include GLI
|
8
|
+
include Box
|
9
9
|
|
10
10
|
program_desc 'Planet.rb is an awesome feed-aggregator gem that consumes RSS/Atom feeds and outputs them in a format suitable to use with Octopress or Jekyll'
|
11
11
|
|
@@ -13,7 +13,7 @@ desc 'Parses planet.yml file for blogs and generates their posts in Jekyll compl
|
|
13
13
|
command :generate do |c|
|
14
14
|
|
15
15
|
c.action do |global_options,options,args|
|
16
|
-
conf = YAML.
|
16
|
+
conf = YAML.load_file('planet.yml')
|
17
17
|
|
18
18
|
@planet = Planet.new(config: conf.fetch('planet', {}))
|
19
19
|
|
@@ -38,29 +38,9 @@ end
|
|
38
38
|
desc 'Creates basic planet.yml config file'
|
39
39
|
command :init do |c|
|
40
40
|
c.action do |global_options,options,args|
|
41
|
-
|
41
|
+
abort 'There is already a planet.yml file present' if File.exist? 'planet.yml'
|
42
42
|
|
43
|
-
|
44
|
-
|
45
|
-
planet:
|
46
|
-
posts_directory: source/_posts/
|
47
|
-
templates_directory: source/_layouts/
|
48
|
-
|
49
|
-
blogs:
|
50
|
-
# Bare minimum to get it working
|
51
|
-
- author: "Cubox"
|
52
|
-
feed: "http://blog.cuboxlabs.com/atom.xml"
|
53
|
-
image: "http://cuboxlabs.com/img/cubox-humans/could-be-you.png"
|
54
|
-
|
55
|
-
- author: "Pablo Astigarraga"
|
56
|
-
feed: "http://blog.poteland.com/atom.xml"
|
57
|
-
image: "http://poteland.com/images/avatars/red_mage.png"
|
58
|
-
# Other fields:
|
59
|
-
twitter: "poteland"
|
60
|
-
url: "http://blog.poteland.com" # => only required for people that don\'t have a \'url\' field on their RSS/Atom field'
|
61
|
-
|
62
|
-
|
63
|
-
File.open('planet.yml', 'w') { |f| f.write(default) }
|
43
|
+
File.open('planet.yml', 'w') { |f| f.write(Box::FILES['planet.yml']) }
|
64
44
|
|
65
45
|
puts '=> Created default planet.yml'
|
66
46
|
end
|
@@ -71,35 +51,19 @@ command :create_templates do |c|
|
|
71
51
|
c.action do |global_options,options,args|
|
72
52
|
conf = YAML.load File.open('planet.yml', 'r') { |f| f.read }
|
73
53
|
|
74
|
-
templates_dir = conf.fetch('planet').fetch('templates_directory', '_layouts/')
|
54
|
+
templates_dir = conf.fetch('planet').fetch('templates_directory', 'source/_layouts/')
|
75
55
|
|
76
56
|
FileUtils.mkdir_p(templates_dir)
|
77
57
|
|
78
|
-
author = '
|
79
|
-
<div class="author">
|
80
|
-
<img src="{{ image_url }}" style="width: 96px; height: 96;">
|
81
|
-
<span style="position: absolute; padding: 32px 15px;">
|
82
|
-
<i>Original post by <a href="{{ twitter_url }}">{{ author }}</a> - check out <a href="{{ blog_url }}">{{ blog_name }}</a></i>
|
83
|
-
</span>
|
84
|
-
</div>
|
85
|
-
'
|
86
58
|
if !File.exists?(templates_dir + 'author.html')
|
87
|
-
File.open(templates_dir + 'author.html', 'w') { |f| f.write(author) }
|
59
|
+
File.open(templates_dir + 'author.html', 'w') { |f| f.write(Box::FILES['author.html']) }
|
88
60
|
puts "=> Created default #{ templates_dir }author.html"
|
89
61
|
else
|
90
62
|
puts "=> Template #{ templates_dir }author.html already exists, skipping"
|
91
63
|
end
|
92
64
|
|
93
|
-
header ='---
|
94
|
-
title: "{{ post_title }}"
|
95
|
-
kind: article
|
96
|
-
created_at: {{ post_date }}
|
97
|
-
author: {{ author }}
|
98
|
-
layout: post
|
99
|
-
---
|
100
|
-
'
|
101
65
|
if !File.exists?(templates_dir + 'header.md')
|
102
|
-
File.open(templates_dir + 'header.md', 'w') { |f| f.write(header) }
|
66
|
+
File.open(templates_dir + 'header.md', 'w') { |f| f.write(Box::FILES['header.md']) }
|
103
67
|
puts "=> Created default #{ templates_dir }header.md"
|
104
68
|
else
|
105
69
|
puts "=> Template #{ templates_dir }header.md already exists, skipping"
|
@@ -111,12 +75,12 @@ pre do |global,command,options,args|
|
|
111
75
|
if command.name == :generate
|
112
76
|
conf = YAML.load File.open('planet.yml', 'r') { |f| f.read }
|
113
77
|
|
114
|
-
templates_dir = conf.fetch('planet').fetch('templates_directory', 'source/_layouts')
|
78
|
+
templates_dir = conf.fetch('planet').fetch('templates_directory', 'source/_layouts/')
|
115
79
|
FileUtils.mkdir_p(templates_dir)
|
116
80
|
|
117
|
-
|
81
|
+
files = [templates_dir, templates_dir + 'author.html', templates_dir + 'header.md']
|
118
82
|
|
119
|
-
|
83
|
+
files.each do |file|
|
120
84
|
unless File.exists?(file)
|
121
85
|
puts "=> You are missing some files in your templates directory, planet.rb will create them for you - make sure to review them on #{ templates_dir }!"
|
122
86
|
response = `planet create_templates`
|
@@ -137,3 +101,41 @@ on_error do |exception|
|
|
137
101
|
end
|
138
102
|
|
139
103
|
exit GLI.run(ARGV)
|
104
|
+
|
105
|
+
__END__
|
106
|
+
@@ header.md
|
107
|
+
---
|
108
|
+
title: "{{ post_title }}"
|
109
|
+
kind: article
|
110
|
+
created_at: {{ post_date }}
|
111
|
+
author: {{ author }}
|
112
|
+
layout: post
|
113
|
+
---
|
114
|
+
|
115
|
+
@@ author.html
|
116
|
+
<div class="author">
|
117
|
+
<img src="{{ image_url }}" style="width: 96px; height: 96;">
|
118
|
+
<span style="position: absolute; padding: 32px 15px;">
|
119
|
+
<i>Original post by <a href="{{ twitter_url }}">{{ author }}</a> - check out <a href="{{ blog_url }}">{{ blog_name }}</a></i>
|
120
|
+
</span>
|
121
|
+
</div>
|
122
|
+
|
123
|
+
@@ planet.yml
|
124
|
+
## planet.rb default config file, modify it and spawn awesomeness!
|
125
|
+
|
126
|
+
planet:
|
127
|
+
posts_directory: source/_posts/
|
128
|
+
templates_directory: source/_layouts/
|
129
|
+
|
130
|
+
blogs:
|
131
|
+
# Bare minimum to get it working
|
132
|
+
- author: "Cubox"
|
133
|
+
feed: "http://blog.cuboxlabs.com/atom.xml"
|
134
|
+
image: "http://cuboxlabs.com/img/cubox-humans/could-be-you.png"
|
135
|
+
|
136
|
+
- author: "Pablo Astigarraga"
|
137
|
+
feed: "http://blog.poteland.com/atom.xml"
|
138
|
+
image: "http://poteland.com/images/avatars/red_mage.png"
|
139
|
+
# Other fields:
|
140
|
+
twitter: "poteland"
|
141
|
+
url: "http://blog.poteland.com" # => only required for people that don\'t have a \'url\' field on their RSS/Atom field'
|
data/lib/planet/version.rb
CHANGED
data/lib/planet.rb
CHANGED
@@ -20,16 +20,15 @@ class Planet < Struct.new(:config, :blogs)
|
|
20
20
|
blog.name ||= feed.title || 'the source'
|
21
21
|
blog.url ||= feed.url
|
22
22
|
|
23
|
-
## This is slightly gay.
|
24
23
|
if blog.url.nil?
|
25
|
-
|
24
|
+
abort "#{ blog.author }'s blog does not have a url field on it's feed, you will need to specify it on planet.yml"
|
26
25
|
end
|
27
26
|
|
28
27
|
feed.entries.each do |entry|
|
29
28
|
blog.posts << @post = Post.new(
|
30
29
|
title: entry.title.sanitize,
|
31
|
-
content: entry.content.strip
|
32
|
-
date: entry.published,
|
30
|
+
content: blog.sanitize_images(entry.content.strip),
|
31
|
+
date: entry.published,
|
33
32
|
url: blog.url + entry.url,
|
34
33
|
blog: blog
|
35
34
|
)
|
@@ -61,6 +60,10 @@ class Planet < Struct.new(:config, :blogs)
|
|
61
60
|
self.blog = attributes.fetch(:blog, nil)
|
62
61
|
end
|
63
62
|
|
63
|
+
def to_s
|
64
|
+
"#{ header }#{ content }#{ footer }"
|
65
|
+
end
|
66
|
+
|
64
67
|
def to_hash
|
65
68
|
{
|
66
69
|
post_content: self.content,
|
@@ -79,28 +82,25 @@ class Planet < Struct.new(:config, :blogs)
|
|
79
82
|
def header
|
80
83
|
## TODO: We need categories/tags
|
81
84
|
file = self.blog.planet.config.fetch('templates_directory', '_layouts/') + 'header.md'
|
82
|
-
file_contents = File.
|
85
|
+
file_contents = File.read(file)
|
83
86
|
|
84
87
|
Mustache.render(file_contents, self.to_hash)
|
85
88
|
end
|
86
89
|
|
87
|
-
def file_name
|
88
|
-
name_date = date ? date.strftime('%Y-%m-%d') : nil
|
89
|
-
name_title = title.downcase.scan(/\w+/).join('-')
|
90
|
-
|
91
|
-
[name_date, name_title].join('-')
|
92
|
-
end
|
93
|
-
|
94
90
|
def footer
|
95
91
|
file = self.blog.planet.config.fetch('templates_directory', '_layouts/') + 'author.html'
|
96
|
-
file_contents = File.
|
92
|
+
file_contents = File.read(file)
|
97
93
|
|
98
94
|
Mustache.render(file_contents, self.to_hash)
|
99
95
|
end
|
100
96
|
|
101
|
-
def
|
102
|
-
|
97
|
+
def file_name
|
98
|
+
name_date = date ? date.strftime('%Y-%m-%d') : nil
|
99
|
+
name_title = title.downcase.scan(/\w+/).join('-')
|
100
|
+
|
101
|
+
[name_date, name_title].join('-')
|
103
102
|
end
|
103
|
+
|
104
104
|
end
|
105
105
|
|
106
106
|
class Blog < Struct.new(:url, :feed, :name, :author, :image, :twitter, :posts, :planet)
|
@@ -115,5 +115,19 @@ class Planet < Struct.new(:config, :blogs)
|
|
115
115
|
self.posts = attributes.fetch('posts', [])
|
116
116
|
self.planet = attributes[:planet]
|
117
117
|
end
|
118
|
+
|
119
|
+
def sanitize_images(html)
|
120
|
+
## We take all images with src not matching http refs and append
|
121
|
+
## the original blog to them.
|
122
|
+
html.scan(/<img src="([^h"]+)"/).flatten.each do |img|
|
123
|
+
if img[0] == '/'
|
124
|
+
html.gsub!(img, "#{ self.url }#{ img }")
|
125
|
+
else
|
126
|
+
html.gsub!(img, "#{ self.url }/#{ img }")
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
html
|
131
|
+
end
|
118
132
|
end
|
119
133
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: planet
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -75,6 +75,22 @@ dependencies:
|
|
75
75
|
- - ! '>='
|
76
76
|
- !ruby/object:Gem::Version
|
77
77
|
version: '0'
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: box
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ! '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
type: :runtime
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
78
94
|
description:
|
79
95
|
email: pote@tardis.com.uy
|
80
96
|
executables:
|