ruhoh 0.3.0 → 1.0.0.alpha
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.
- data/Gemfile +1 -0
- data/README.md +0 -33
- data/dash.html +1 -0
- data/history.json +29 -0
- data/lib/ruhoh/client/client.rb +30 -22
- data/lib/ruhoh/client/help.yml +6 -2
- data/lib/ruhoh/compiler.rb +8 -20
- data/lib/ruhoh/compilers/rss.rb +36 -0
- data/lib/ruhoh/compilers/theme.rb +41 -0
- data/lib/ruhoh/config.rb +49 -0
- data/lib/ruhoh/converters/converter.rb +17 -4
- data/lib/ruhoh/converters/markdown.rb +2 -2
- data/lib/ruhoh/db.rb +29 -2
- data/lib/ruhoh/deployers/s3.rb +1 -1
- data/lib/ruhoh/logger.rb +1 -1
- data/lib/ruhoh/page.rb +38 -22
- data/lib/ruhoh/parsers/javascripts.rb +67 -0
- data/lib/ruhoh/parsers/layouts.rb +6 -10
- data/lib/ruhoh/parsers/pages.rb +17 -24
- data/lib/ruhoh/parsers/partials.rb +6 -14
- data/lib/ruhoh/parsers/payload.rb +47 -0
- data/lib/ruhoh/parsers/posts.rb +27 -29
- data/lib/ruhoh/parsers/site.rb +2 -2
- data/lib/ruhoh/parsers/stylesheets.rb +75 -0
- data/lib/ruhoh/parsers/widgets.rb +104 -0
- data/lib/ruhoh/paths.rb +75 -0
- data/lib/ruhoh/previewer.rb +11 -5
- data/lib/ruhoh/program.rb +35 -4
- data/lib/ruhoh/templaters/asset_helpers.rb +66 -0
- data/lib/ruhoh/templaters/base_helpers.rb +143 -0
- data/lib/ruhoh/templaters/helpers.rb +1 -148
- data/lib/ruhoh/templaters/rmustache.rb +45 -4
- data/lib/ruhoh/urls.rb +46 -0
- data/lib/ruhoh/utils.rb +59 -17
- data/lib/ruhoh/version.rb +2 -2
- data/lib/ruhoh/watch.rb +26 -14
- data/lib/ruhoh.rb +38 -96
- data/ruhoh.gemspec +29 -10
- data/scaffolds/draft.html +9 -0
- data/scaffolds/page.html +0 -2
- data/scaffolds/post.html +0 -4
- data/scaffolds/theme/{images → javascripts}/.gitkeep +0 -0
- data/scaffolds/theme/layouts/default.html +2 -4
- data/scaffolds/theme/layouts/page.html +1 -1
- data/scaffolds/theme/layouts/post.html +1 -1
- data/scaffolds/theme/{css/style.css → media/.gitkeep} +0 -0
- data/scaffolds/theme/stylesheets/style.css +0 -0
- data/scaffolds/theme/theme.yml +27 -0
- data/scaffolds/theme/widgets/.gitkeep +0 -0
- data/spec/config_spec.rb +50 -0
- data/spec/db_spec.rb +28 -14
- data/spec/page_spec.rb +24 -35
- data/spec/parsers/layouts_spec.rb +5 -13
- data/spec/parsers/pages_spec.rb +13 -11
- data/spec/parsers/posts_spec.rb +34 -29
- data/spec/parsers/routes_spec.rb +2 -1
- data/spec/parsers/site_spec.rb +6 -5
- data/spec/setup_spec.rb +3 -47
- data/widgets/analytics/config.yml +5 -0
- data/{system_partials/analytics/getclicky → widgets/analytics/layouts/getclicky.html} +2 -2
- data/{system_partials/analytics/google → widgets/analytics/layouts/google.html} +1 -1
- data/widgets/comments/config.yml +12 -0
- data/{system_partials/comments/disqus → widgets/comments/layouts/disqus.html} +2 -2
- data/{system_partials/comments/facebook → widgets/comments/layouts/facebook.html} +1 -1
- data/{system_partials/comments/intensedebate → widgets/comments/layouts/intensedebate.html} +1 -1
- data/{system_partials/comments/livefyre → widgets/comments/layouts/livefyre.html} +1 -1
- data/widgets/google_prettify/config.yml +1 -0
- data/widgets/google_prettify/layouts/google_prettify.html +10 -0
- metadata +54 -31
- data/lib/ruhoh/templaters/base.rb +0 -57
- data/system_partials/syntax/google_prettify +0 -11
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -7,36 +7,3 @@
|
|
7
7
|
|
8
8
|
$ gem install ruhoh
|
9
9
|
$ ruhoh help
|
10
|
-
|
11
|
-
|
12
|
-
- setup
|
13
|
-
- database
|
14
|
-
- page
|
15
|
-
- templater
|
16
|
-
- converter
|
17
|
-
- preview
|
18
|
-
- compiler
|
19
|
-
|
20
|
-
### Plugins
|
21
|
-
|
22
|
-
|
23
|
-
1. Mustache method additions
|
24
|
-
Extend the templating language
|
25
|
-
* Mounted onto the page object
|
26
|
-
|
27
|
-
|
28
|
-
2. Add additional converter support (textile)
|
29
|
-
* Mounted onto the page object
|
30
|
-
|
31
|
-
3. Generators ? compose extra pages?
|
32
|
-
I'm leaning toward why? any page should be able to be made
|
33
|
-
by calling a custom mustache method within a given textfile.
|
34
|
-
Jekyll's relevant example is to create mass-pages per each category.
|
35
|
-
Generating extra pages can be mounted onto the compiler
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
data/dash.html
CHANGED
data/history.json
CHANGED
@@ -1,4 +1,33 @@
|
|
1
1
|
[
|
2
|
+
{
|
3
|
+
"version" : "1.0.0.alpha",
|
4
|
+
"date" : "05.06.2012",
|
5
|
+
"changes" : [
|
6
|
+
"Converters now take in (content, id), rather than page object: (page).",
|
7
|
+
"Client now has both post and draft generation. Optionally can pass in a title.",
|
8
|
+
"Change config format for pages and posts; now must be namespaced respectively.",
|
9
|
+
"Major changes to theme directory API",
|
10
|
+
"Re-implement how internal config, path, and url parameters are generated and accessed.",
|
11
|
+
"Payload object 'paths' is now 'urls' and namespaced with theme_* for consistency",
|
12
|
+
"Master and sub layout templating is now handled entirely by mustache.",
|
13
|
+
"Add nokogiri as dependency"
|
14
|
+
],
|
15
|
+
"features" : [
|
16
|
+
"YAML meta-data is now optional",
|
17
|
+
"Provide default, global layout attribute for post/page",
|
18
|
+
"Add summary and posts_latest helper methods",
|
19
|
+
"Add widget system",
|
20
|
+
"Add stylesheets asset manager",
|
21
|
+
"Add javascripts asset manager",
|
22
|
+
"Add RSS compiler",
|
23
|
+
"Add ability to run previewer in production mode",
|
24
|
+
"Make post filename available to permalink"
|
25
|
+
],
|
26
|
+
"bugs" : [
|
27
|
+
"Fix permalinks and titlelize methods to support international characters",
|
28
|
+
"Transform all extensions registered in a convertable module to .html"
|
29
|
+
]
|
30
|
+
},
|
2
31
|
{
|
3
32
|
"version" : "0.3.0",
|
4
33
|
"date" : "13.5.2012",
|
data/lib/ruhoh/client/client.rb
CHANGED
@@ -3,7 +3,7 @@ require 'ruhoh/compiler'
|
|
3
3
|
class Ruhoh
|
4
4
|
class Client
|
5
5
|
|
6
|
-
Paths = Struct.new(:page_template, :post_template, :layout_template, :theme_template)
|
6
|
+
Paths = Struct.new(:page_template, :draft_template, :post_template, :layout_template, :theme_template)
|
7
7
|
BlogScaffold = 'git://github.com/ruhoh/blog.git'
|
8
8
|
|
9
9
|
def initialize(data)
|
@@ -17,7 +17,7 @@ class Ruhoh
|
|
17
17
|
exit
|
18
18
|
} unless self.respond_to?(cmd)
|
19
19
|
|
20
|
-
Ruhoh.setup unless ['help','blog'].include?(cmd)
|
20
|
+
Ruhoh.setup unless ['help','blog','compile'].include?(cmd)
|
21
21
|
|
22
22
|
self.__send__(cmd)
|
23
23
|
end
|
@@ -32,6 +32,7 @@ class Ruhoh
|
|
32
32
|
def setup_paths
|
33
33
|
@paths = Paths.new
|
34
34
|
@paths.page_template = File.join(Ruhoh::Root, "scaffolds", "page.html")
|
35
|
+
@paths.draft_template = File.join(Ruhoh::Root, "scaffolds", "draft.html")
|
35
36
|
@paths.post_template = File.join(Ruhoh::Root, "scaffolds", "post.html")
|
36
37
|
@paths.layout_template = File.join(Ruhoh::Root, "scaffolds", "layout.html")
|
37
38
|
@paths.theme_template = File.join(Ruhoh::Root, "scaffolds", "theme")
|
@@ -40,7 +41,7 @@ class Ruhoh
|
|
40
41
|
# Internal: Show Client Utility help documentation.
|
41
42
|
def help
|
42
43
|
file = File.join(Ruhoh::Root, 'lib', 'ruhoh', 'client', 'help.yml')
|
43
|
-
content = Ruhoh::Utils.
|
44
|
+
content = Ruhoh::Utils.parse_yaml_file(file)
|
44
45
|
options = @opt_parser.help
|
45
46
|
Ruhoh::Friend.say {
|
46
47
|
plain content['description']
|
@@ -56,27 +57,35 @@ class Ruhoh
|
|
56
57
|
}
|
57
58
|
end
|
58
59
|
|
59
|
-
# Public: Create a new draft file.
|
60
|
-
# Requires no settings as it is meant to be fastest way to create content.
|
61
60
|
def draft
|
61
|
+
self.draft_or_post(:draft)
|
62
|
+
end
|
63
|
+
|
64
|
+
def post
|
65
|
+
self.draft_or_post(:post)
|
66
|
+
end
|
67
|
+
|
68
|
+
def draft_or_post(type)
|
62
69
|
begin
|
63
|
-
|
70
|
+
name = @args[1] || "untitled-#{type}"
|
71
|
+
name = "#{name}-#{@iterator}" unless @iterator.zero?
|
72
|
+
name = Ruhoh::Urls.to_slug(name)
|
73
|
+
filename = File.join(Ruhoh.paths.posts, "#{name}.#{@options.ext}")
|
64
74
|
@iterator += 1
|
65
75
|
end while File.exist?(filename)
|
66
76
|
|
67
77
|
FileUtils.mkdir_p File.dirname(filename)
|
68
78
|
|
69
|
-
output = File.open(@paths.
|
79
|
+
output = File.open(@paths.send("#{type}_template"), 'r:UTF-8') { |f| f.read }
|
70
80
|
output = output.gsub('{{DATE}}', Ruhoh::Parsers::Posts.formatted_date(Time.now))
|
71
|
-
File.open(filename, 'w') {|f| f.puts output }
|
81
|
+
File.open(filename, 'w:UTF-8') {|f| f.puts output }
|
72
82
|
|
73
83
|
Ruhoh::Friend.say {
|
74
|
-
green "New
|
75
|
-
green Ruhoh.relative_path(filename)
|
84
|
+
green "New #{type}:"
|
85
|
+
green Ruhoh::Utils.relative_path(filename)
|
76
86
|
green 'View drafts at the URL: /dash'
|
77
87
|
}
|
78
88
|
end
|
79
|
-
alias_method :post, :draft
|
80
89
|
|
81
90
|
# Public: Create a new page file.
|
82
91
|
def page
|
@@ -94,15 +103,15 @@ class Ruhoh
|
|
94
103
|
end
|
95
104
|
|
96
105
|
FileUtils.mkdir_p File.dirname(filename)
|
97
|
-
File.open(@paths.page_template) do |template|
|
98
|
-
File.open(filename, 'w') do |page|
|
106
|
+
File.open(@paths.page_template, 'r:UTF-8') do |template|
|
107
|
+
File.open(filename, 'w:UTF-8') do |page|
|
99
108
|
page.puts template.read
|
100
109
|
end
|
101
110
|
end
|
102
111
|
|
103
112
|
Ruhoh::Friend.say {
|
104
113
|
green "New page:"
|
105
|
-
plain Ruhoh.relative_path(filename)
|
114
|
+
plain Ruhoh::Utils.relative_path(filename)
|
106
115
|
}
|
107
116
|
end
|
108
117
|
|
@@ -110,9 +119,9 @@ class Ruhoh
|
|
110
119
|
def titleize
|
111
120
|
Ruhoh::Parsers::Posts.files.each do |file|
|
112
121
|
next unless File.basename(file) =~ /^untitled/
|
113
|
-
parsed_page = Ruhoh::Utils.
|
122
|
+
parsed_page = Ruhoh::Utils.parse_page_file(file)
|
114
123
|
next unless parsed_page['data']['title']
|
115
|
-
new_name = Ruhoh::
|
124
|
+
new_name = Ruhoh::Urls.to_slug(parsed_page['data']['title'])
|
116
125
|
new_file = File.join(File.dirname(file), "#{new_name}#{File.extname(file)}")
|
117
126
|
FileUtils.mv(file, new_file)
|
118
127
|
Ruhoh::Friend.say { green "Renamed #{file} to: #{new_file}" }
|
@@ -121,8 +130,7 @@ class Ruhoh
|
|
121
130
|
|
122
131
|
# Public: Compile to static website.
|
123
132
|
def compile
|
124
|
-
Ruhoh::
|
125
|
-
Ruhoh::Compiler.compile(@args[1])
|
133
|
+
Ruhoh::Program.compile(@args[1])
|
126
134
|
end
|
127
135
|
|
128
136
|
# Public: Create a new blog at the directory provided.
|
@@ -191,21 +199,21 @@ class Ruhoh
|
|
191
199
|
exit
|
192
200
|
} if name.nil?
|
193
201
|
|
194
|
-
filename = File.join(Ruhoh.paths.
|
202
|
+
filename = File.join(Ruhoh.paths.theme_layouts, name.gsub(/\s/, '-').downcase) + ".html"
|
195
203
|
if File.exist?(filename)
|
196
204
|
abort("Create new layout: aborted!") if ask("#{filename} already exists. Do you want to overwrite?", ['y', 'n']) == 'n'
|
197
205
|
end
|
198
206
|
|
199
207
|
FileUtils.mkdir_p File.dirname(filename)
|
200
208
|
File.open(@paths.layout_template) do |template|
|
201
|
-
File.open(filename, 'w') do |page|
|
209
|
+
File.open(filename, 'w:UTF-8') do |page|
|
202
210
|
page.puts template.read
|
203
211
|
end
|
204
212
|
end
|
205
213
|
|
206
214
|
Ruhoh::Friend.say {
|
207
215
|
green "New layout:"
|
208
|
-
plain Ruhoh.relative_path(filename)
|
216
|
+
plain Ruhoh::Utils.relative_path(filename)
|
209
217
|
}
|
210
218
|
end
|
211
219
|
|
@@ -229,7 +237,7 @@ class Ruhoh
|
|
229
237
|
require 'pp'
|
230
238
|
Ruhoh::DB.update_all
|
231
239
|
Ruhoh::Friend.say {
|
232
|
-
plain Ruhoh::
|
240
|
+
plain Ruhoh::DB.payload.pretty_inspect
|
233
241
|
}
|
234
242
|
end
|
235
243
|
|
data/lib/ruhoh/client/help.yml
CHANGED
@@ -15,9 +15,13 @@ commands:
|
|
15
15
|
"desc" : |
|
16
16
|
Compile to static website.
|
17
17
|
-
|
18
|
-
"command" : "
|
18
|
+
"command" : "draft <title>"
|
19
19
|
"desc" : |
|
20
|
-
Create a new draft.
|
20
|
+
Create a new draft. Post title is optional.
|
21
|
+
-
|
22
|
+
"command" : "post <title>"
|
23
|
+
"desc" : |
|
24
|
+
Create a new post. Post title is optional.
|
21
25
|
-
|
22
26
|
"command" : "page <path>"
|
23
27
|
"desc" : |
|
data/lib/ruhoh/compiler.rb
CHANGED
@@ -1,11 +1,13 @@
|
|
1
|
+
require 'ruhoh/compilers/theme'
|
2
|
+
require 'ruhoh/compilers/rss'
|
3
|
+
|
1
4
|
class Ruhoh
|
2
5
|
module Compiler
|
3
6
|
|
4
7
|
# TODO: seems rather dangerous to delete the incoming target directory?
|
5
8
|
def self.compile(target_directory = nil, page = nil)
|
6
|
-
Ruhoh.config.env ||= 'production'
|
7
9
|
Ruhoh::Friend.say { plain "Compiling for environment: '#{Ruhoh.config.env}'" }
|
8
|
-
target = target_directory || "./#{Ruhoh.
|
10
|
+
target = target_directory || "./#{Ruhoh.names.compiled}"
|
9
11
|
page = page || Ruhoh::Page.new
|
10
12
|
|
11
13
|
FileUtils.rm_r target if File.exist?(target)
|
@@ -23,9 +25,7 @@ class Ruhoh
|
|
23
25
|
|
24
26
|
def self.run(target, page)
|
25
27
|
self.pages(target, page)
|
26
|
-
self.theme(target, page)
|
27
28
|
self.media(target, page)
|
28
|
-
self.syntax(target, page)
|
29
29
|
end
|
30
30
|
|
31
31
|
def self.pages(target, page)
|
@@ -40,24 +40,12 @@ class Ruhoh
|
|
40
40
|
end
|
41
41
|
}
|
42
42
|
end
|
43
|
-
|
44
|
-
def self.theme(target, page)
|
45
|
-
return unless FileTest.directory? Ruhoh.paths.theme
|
46
|
-
FileUtils.mkdir_p File.join(target, Ruhoh.config.theme_path)
|
47
|
-
FileUtils.cp_r Ruhoh.paths.theme, File.join(target, Ruhoh.folders.templates, Ruhoh.folders.themes)
|
48
|
-
end
|
49
|
-
|
43
|
+
|
50
44
|
def self.media(target, page)
|
51
45
|
return unless FileTest.directory? Ruhoh.paths.media
|
52
|
-
|
53
|
-
FileUtils.
|
54
|
-
|
55
|
-
|
56
|
-
def self.syntax(target, page)
|
57
|
-
return unless FileTest.directory? Ruhoh.paths.syntax
|
58
|
-
syntax_path = File.join(target, Ruhoh.folders.templates, Ruhoh.folders.syntax)
|
59
|
-
FileUtils.mkdir_p syntax_path
|
60
|
-
FileUtils.cp_r "#{Ruhoh.paths.syntax}/.", syntax_path
|
46
|
+
media = Ruhoh::Utils.url_to_path(Ruhoh.urls.media, target)
|
47
|
+
FileUtils.mkdir_p media
|
48
|
+
FileUtils.cp_r File.join(Ruhoh.paths.media, '.'), media
|
61
49
|
end
|
62
50
|
|
63
51
|
end #Defaults
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'nokogiri'
|
2
|
+
class Ruhoh
|
3
|
+
module Compiler
|
4
|
+
# This rss compiler is provided by David Long
|
5
|
+
# http://www.davejlong.com/
|
6
|
+
# https://github.com/davejlong
|
7
|
+
# Thanks David!
|
8
|
+
module Rss
|
9
|
+
# TODO: This renders the page content even though we already need to
|
10
|
+
# render the content to save to disk. This will be a problem when
|
11
|
+
# posts numbers expand. Merge this in later.
|
12
|
+
def self.run(target, page)
|
13
|
+
feed = Nokogiri::XML::Builder.new do |xml|
|
14
|
+
xml.rss(:version => '2.0') {
|
15
|
+
xml.channel {
|
16
|
+
xml.title_ Ruhoh::DB.site['title']
|
17
|
+
xml.link_ Ruhoh::DB.site['config']['production_url']
|
18
|
+
xml.pubDate_ Time.now
|
19
|
+
Ruhoh::DB.posts['chronological'].each do |post_id|
|
20
|
+
post = Ruhoh::DB.posts['dictionary'][post_id]
|
21
|
+
page.change(post_id)
|
22
|
+
xml.item {
|
23
|
+
xml.title_ post['title']
|
24
|
+
xml.link "#{Ruhoh::DB.site['config']['production_url']}#{post['url']}"
|
25
|
+
xml.pubDate_ post['date']
|
26
|
+
xml.description_ (post['description'] ? post['description'] : page.render)
|
27
|
+
}
|
28
|
+
end
|
29
|
+
}
|
30
|
+
}
|
31
|
+
end
|
32
|
+
File.open(File.join(target, 'rss.xml'), 'w'){ |p| p.puts feed.to_xml }
|
33
|
+
end
|
34
|
+
end #Rss
|
35
|
+
end #Compiler
|
36
|
+
end #Ruhoh
|
@@ -0,0 +1,41 @@
|
|
1
|
+
class Ruhoh
|
2
|
+
module Compiler
|
3
|
+
module Theme
|
4
|
+
|
5
|
+
def self.run(target, page)
|
6
|
+
self.stylesheets(target, page)
|
7
|
+
self.javascripts(target, page)
|
8
|
+
self.media(target, page)
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.stylesheets(target, page)
|
12
|
+
Ruhoh::DB.stylesheets.each do |type, assets|
|
13
|
+
assets.each do |asset|
|
14
|
+
next unless File.exist?(asset['id'])
|
15
|
+
file_path = Ruhoh::Utils.url_to_path(File.dirname(asset['url']), target)
|
16
|
+
FileUtils.mkdir_p file_path
|
17
|
+
FileUtils.cp(asset['id'], file_path)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.javascripts(target, page)
|
23
|
+
Ruhoh::DB.javascripts.each do |type, assets|
|
24
|
+
assets.each do |asset|
|
25
|
+
next unless File.exist?(asset['id'])
|
26
|
+
file_path = Ruhoh::Utils.url_to_path(File.dirname(asset['url']), target)
|
27
|
+
FileUtils.mkdir_p file_path
|
28
|
+
FileUtils.cp(asset['id'], file_path)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.media(target, page)
|
34
|
+
return unless FileTest.directory? Ruhoh.paths.theme_media
|
35
|
+
theme_media = Ruhoh::Utils.url_to_path(Ruhoh.urls.theme_media, target)
|
36
|
+
FileUtils.mkdir_p theme_media
|
37
|
+
FileUtils.cp_r File.join(Ruhoh.paths.theme_media, '.'), theme_media
|
38
|
+
end
|
39
|
+
end #Theme
|
40
|
+
end #Compiler
|
41
|
+
end #Ruhoh
|
data/lib/ruhoh/config.rb
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
class Ruhoh
|
2
|
+
# Structured container for global configuration parameters.
|
3
|
+
module Config
|
4
|
+
Config = Struct.new(
|
5
|
+
:env,
|
6
|
+
:pages_exclude,
|
7
|
+
:pages_permalink,
|
8
|
+
:pages_layout,
|
9
|
+
:posts_exclude,
|
10
|
+
:posts_layout,
|
11
|
+
:posts_permalink,
|
12
|
+
:theme
|
13
|
+
)
|
14
|
+
|
15
|
+
def self.generate(path_to_config)
|
16
|
+
site_config = Ruhoh::Utils.parse_yaml_file(path_to_config)
|
17
|
+
unless site_config
|
18
|
+
Ruhoh.log.error("Empty site_config.\nEnsure ./#{Ruhoh.names.config_data} exists and contains valid YAML")
|
19
|
+
return false
|
20
|
+
end
|
21
|
+
|
22
|
+
theme = site_config['theme'] ? site_config['theme'].to_s.gsub(/\s/, '') : ''
|
23
|
+
if theme.empty?
|
24
|
+
Ruhoh.log.error("Theme not specified in #{Ruhoh.names.config_data}")
|
25
|
+
return false
|
26
|
+
end
|
27
|
+
|
28
|
+
config = Config.new
|
29
|
+
config.theme = theme
|
30
|
+
config.env = site_config['env'] || nil
|
31
|
+
|
32
|
+
config.posts_permalink = site_config['posts']['permalink'] rescue nil
|
33
|
+
config.posts_layout = site_config['posts']['layout'] rescue nil
|
34
|
+
config.posts_layout = 'post' if config.posts_layout.nil?
|
35
|
+
excluded_posts = site_config['posts']['exclude'] rescue nil
|
36
|
+
config.posts_exclude = Array(excluded_posts)
|
37
|
+
config.posts_exclude = config.posts_exclude.map {|node| Regexp.new(node) }
|
38
|
+
|
39
|
+
config.pages_permalink = site_config['pages']['permalink'] rescue nil
|
40
|
+
config.pages_layout = site_config['pages']['layout'] rescue nil
|
41
|
+
config.pages_layout = 'page' if config.pages_layout.nil?
|
42
|
+
excluded_pages = site_config['pages']['exclude'] rescue nil
|
43
|
+
config.pages_exclude = Array(excluded_pages)
|
44
|
+
config.pages_exclude = config.pages_exclude.map {|node| Regexp.new(node) }
|
45
|
+
|
46
|
+
config
|
47
|
+
end
|
48
|
+
end #Config
|
49
|
+
end #Ruhoh
|
@@ -1,18 +1,31 @@
|
|
1
|
+
require 'ruhoh/converters/markdown'
|
2
|
+
|
1
3
|
class Ruhoh
|
2
4
|
module Converter
|
3
5
|
|
4
|
-
def self.convert(
|
5
|
-
extension = File.extname(
|
6
|
+
def self.convert(content, id)
|
7
|
+
extension = File.extname(id).downcase
|
6
8
|
|
7
9
|
Ruhoh::Converter.constants.each {|c|
|
8
10
|
converter = Ruhoh::Converter.const_get(c)
|
9
11
|
next unless converter.respond_to?(:convert)
|
10
12
|
next unless converter.respond_to?(:extensions)
|
11
13
|
next unless Array(converter.extensions).include?(extension)
|
12
|
-
return converter.convert(
|
14
|
+
return converter.convert(content)
|
13
15
|
}
|
14
16
|
|
15
|
-
|
17
|
+
content
|
18
|
+
end
|
19
|
+
|
20
|
+
# Return an Array of all regestered extensions
|
21
|
+
def self.extensions
|
22
|
+
collection = []
|
23
|
+
Ruhoh::Converter.constants.each {|c|
|
24
|
+
converter = Ruhoh::Converter.const_get(c)
|
25
|
+
next unless converter.respond_to?(:extensions)
|
26
|
+
collection += Array(converter.extensions)
|
27
|
+
}
|
28
|
+
collection
|
16
29
|
end
|
17
30
|
|
18
31
|
end #Converter
|
@@ -6,13 +6,13 @@ class Ruhoh
|
|
6
6
|
['.md', '.markdown']
|
7
7
|
end
|
8
8
|
|
9
|
-
def self.convert(
|
9
|
+
def self.convert(content)
|
10
10
|
require 'redcarpet'
|
11
11
|
markdown = Redcarpet::Markdown.new(Redcarpet::Render::HTML.new(:with_toc_data => true),
|
12
12
|
:autolink => true,
|
13
13
|
:fenced_code_blocks => true,
|
14
14
|
)
|
15
|
-
markdown.render(
|
15
|
+
markdown.render(content)
|
16
16
|
end
|
17
17
|
end
|
18
18
|
end
|
data/lib/ruhoh/db.rb
CHANGED
@@ -1,8 +1,20 @@
|
|
1
|
+
require 'ruhoh/parsers/posts'
|
2
|
+
require 'ruhoh/parsers/pages'
|
3
|
+
require 'ruhoh/parsers/routes'
|
4
|
+
require 'ruhoh/parsers/layouts'
|
5
|
+
require 'ruhoh/parsers/partials'
|
6
|
+
require 'ruhoh/parsers/widgets'
|
7
|
+
require 'ruhoh/parsers/stylesheets'
|
8
|
+
require 'ruhoh/parsers/javascripts'
|
9
|
+
require 'ruhoh/parsers/payload'
|
10
|
+
require 'ruhoh/parsers/site'
|
11
|
+
|
1
12
|
class Ruhoh
|
2
13
|
# Public: Database class for interacting with "data" in Ruhoh.
|
3
14
|
class DB
|
15
|
+
WhiteList = [:site, :posts, :pages, :routes, :layouts, :partials, :widgets, :stylesheets, :javascripts, :payload]
|
16
|
+
|
4
17
|
class << self
|
5
|
-
WhiteList = [:site, :posts, :pages, :routes, :layouts, :partials]
|
6
18
|
self.__send__ :attr_reader, *WhiteList
|
7
19
|
|
8
20
|
def update(name)
|
@@ -20,19 +32,34 @@ class Ruhoh
|
|
20
32
|
Ruhoh::Parsers::Layouts.generate
|
21
33
|
when :partials
|
22
34
|
Ruhoh::Parsers::Partials.generate
|
35
|
+
when :widgets
|
36
|
+
Ruhoh::Parsers::Widgets.generate
|
37
|
+
when :stylesheets
|
38
|
+
Ruhoh::Parsers::Stylesheets.generate
|
39
|
+
when :javascripts
|
40
|
+
Ruhoh::Parsers::Javascripts.generate
|
41
|
+
when :payload
|
42
|
+
Ruhoh::Parsers::Payload.generate
|
23
43
|
else
|
24
44
|
raise "Data type: '#{name}' is not a valid data type."
|
25
45
|
end
|
26
46
|
)
|
27
47
|
end
|
28
48
|
|
49
|
+
# Always regenerate a fresh payload since it
|
50
|
+
# references other generated data.
|
51
|
+
def payload
|
52
|
+
self.update(:payload)
|
53
|
+
@payload
|
54
|
+
end
|
55
|
+
|
29
56
|
def all_pages
|
30
57
|
self.posts['dictionary'].merge(self.pages)
|
31
58
|
end
|
32
59
|
|
33
60
|
def update_all
|
34
61
|
WhiteList.each do |var|
|
35
|
-
self.__send__
|
62
|
+
self.__send__(:update, var)
|
36
63
|
end
|
37
64
|
end
|
38
65
|
|
data/lib/ruhoh/deployers/s3.rb
CHANGED
@@ -9,7 +9,7 @@ class Ruhoh
|
|
9
9
|
class AmazonS3 < AWS::S3::S3Object
|
10
10
|
|
11
11
|
def initialize
|
12
|
-
credentials = Ruhoh::Utils.
|
12
|
+
credentials = Ruhoh::Utils.parse_yaml_file(Ruhoh.paths.base, "_deploy.yml")['s3']
|
13
13
|
self.connect(credentials)
|
14
14
|
self.ensure_bucket(credentials["bucket"])
|
15
15
|
#set_current_bucket_to(credentials["bucket"])
|
data/lib/ruhoh/logger.rb
CHANGED
data/lib/ruhoh/page.rb
CHANGED
@@ -1,21 +1,20 @@
|
|
1
1
|
class Ruhoh
|
2
2
|
class Page
|
3
|
-
attr_reader :id, :data, :
|
4
|
-
attr_accessor :templater
|
3
|
+
attr_reader :id, :data, :sub_layout, :master_layout
|
4
|
+
attr_accessor :templater
|
5
5
|
|
6
6
|
def initialize
|
7
|
-
@templater = Ruhoh::Templaters::
|
8
|
-
@converter = Ruhoh::Converter
|
7
|
+
@templater = Ruhoh::Templaters::RMustache
|
9
8
|
end
|
10
9
|
|
11
10
|
# Public: Change this page using an id.
|
12
11
|
def change(id)
|
13
12
|
self.reset
|
14
13
|
@path = id
|
15
|
-
@data = if id =~ Regexp.new("^#{Ruhoh.
|
14
|
+
@data = if id =~ Regexp.new("^#{Ruhoh.names.posts}")
|
16
15
|
Ruhoh::DB.posts['dictionary'][id]
|
17
16
|
else
|
18
|
-
@path = "#{Ruhoh.
|
17
|
+
@path = "#{Ruhoh.names.pages}/#{id}"
|
19
18
|
Ruhoh::DB.pages[id]
|
20
19
|
end
|
21
20
|
|
@@ -26,8 +25,7 @@ class Ruhoh
|
|
26
25
|
def render
|
27
26
|
self.ensure_id
|
28
27
|
self.process_layouts
|
29
|
-
self.
|
30
|
-
@templater.render(self)
|
28
|
+
@templater.render(self.expand_layouts, self.payload)
|
31
29
|
end
|
32
30
|
|
33
31
|
def process_layouts
|
@@ -41,26 +39,44 @@ class Ruhoh
|
|
41
39
|
@master_layout = Ruhoh::DB.layouts[@sub_layout['data']['layout']]
|
42
40
|
raise "Layout does not exist: #{@sub_layout['data']['layout']}" unless @master_layout
|
43
41
|
end
|
42
|
+
|
43
|
+
@data['sub_layout'] = @sub_layout['id'] rescue nil
|
44
|
+
@data['master_layout'] = @master_layout['id'] rescue nil
|
45
|
+
@data
|
44
46
|
end
|
45
47
|
|
46
|
-
#
|
47
|
-
#
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
48
|
+
# Expand the layout(s).
|
49
|
+
# Pages may have a single master_layout, a master_layout + sub_layout, or no layout.
|
50
|
+
def expand_layouts
|
51
|
+
if @sub_layout
|
52
|
+
layout = @sub_layout['content']
|
53
|
+
|
54
|
+
# If a master_layout is found we need to process the sub_layout
|
55
|
+
# into the master_layout using mustache.
|
56
|
+
if @master_layout && @master_layout['content']
|
57
|
+
payload = self.payload
|
58
|
+
payload['content'] = layout
|
59
|
+
layout = @templater.render(@master_layout['content'], payload)
|
60
|
+
end
|
61
|
+
else
|
62
|
+
# Minimum layout if no layout defined.
|
63
|
+
layout = '{{{content}}}'
|
64
|
+
end
|
53
65
|
|
54
|
-
|
55
|
-
@content = @converter.convert(self)
|
66
|
+
layout
|
56
67
|
end
|
57
68
|
|
58
|
-
|
59
|
-
# 'payload' of the given templater.
|
60
|
-
def attributes
|
69
|
+
def payload
|
61
70
|
self.ensure_id
|
62
|
-
|
63
|
-
@data
|
71
|
+
payload = Ruhoh::DB.payload.dup
|
72
|
+
payload['page'] = @data
|
73
|
+
payload
|
74
|
+
end
|
75
|
+
|
76
|
+
# Provide access to the page content.
|
77
|
+
def content
|
78
|
+
self.ensure_id
|
79
|
+
Ruhoh::Utils.parse_page_file(Ruhoh.paths.base, @path)['content']
|
64
80
|
end
|
65
81
|
|
66
82
|
# Public: Formats the path to the compiled file based on the URL.
|