ruhoh 1.1 → 2.1
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 +3 -3
- data/README.md +3 -2
- data/Rakefile +1 -22
- data/bin/ruhoh +1 -5
- data/history.json +16 -0
- data/lib/ruhoh.rb +229 -84
- data/lib/ruhoh/base/collection.rb +280 -0
- data/lib/ruhoh/base/compiler.rb +55 -0
- data/lib/ruhoh/base/model.rb +220 -0
- data/lib/ruhoh/base/model_view.rb +152 -0
- data/lib/ruhoh/base/watcher.rb +25 -0
- data/lib/ruhoh/cache.rb +46 -0
- data/lib/ruhoh/client.rb +162 -0
- data/lib/ruhoh/collections.rb +172 -0
- data/lib/ruhoh/console_methods.rb +21 -0
- data/lib/ruhoh/{converters/converter.rb → converter.rb} +4 -1
- data/lib/ruhoh/programs/compile.rb +22 -0
- data/lib/ruhoh/programs/preview.rb +63 -0
- data/lib/ruhoh/programs/watch.rb +45 -0
- data/lib/ruhoh/resources/dash/collection.rb +10 -0
- data/lib/ruhoh/resources/dash/model.rb +5 -0
- data/lib/ruhoh/resources/dash/model_view.rb +5 -0
- data/lib/ruhoh/resources/dash/previewer.rb +13 -0
- data/lib/ruhoh/resources/data/collection.rb +9 -0
- data/lib/ruhoh/resources/data/collection_view.rb +23 -0
- data/lib/ruhoh/resources/javascripts/collection.rb +9 -0
- data/lib/ruhoh/resources/javascripts/collection_view.rb +46 -0
- data/lib/ruhoh/resources/javascripts/compiler.rb +5 -0
- data/lib/ruhoh/resources/layouts/client.rb +45 -0
- data/lib/ruhoh/resources/layouts/model.rb +16 -0
- data/lib/ruhoh/resources/media/collection.rb +9 -0
- data/lib/ruhoh/resources/media/compiler.rb +27 -0
- data/lib/ruhoh/resources/pages/client.rb +124 -0
- data/lib/ruhoh/resources/pages/collection.rb +86 -0
- data/lib/ruhoh/resources/pages/collection_view.rb +73 -0
- data/lib/ruhoh/resources/pages/compiler.rb +101 -0
- data/lib/ruhoh/resources/pages/model.rb +5 -0
- data/lib/ruhoh/resources/pages/model_view.rb +5 -0
- data/lib/ruhoh/resources/pages/previewer.rb +72 -0
- data/lib/ruhoh/resources/partials/model.rb +11 -0
- data/lib/ruhoh/resources/stylesheets/collection.rb +9 -0
- data/lib/ruhoh/resources/stylesheets/collection_view.rb +45 -0
- data/lib/ruhoh/resources/stylesheets/compiler.rb +5 -0
- data/lib/ruhoh/resources/theme/collection.rb +14 -0
- data/lib/ruhoh/resources/theme/compiler.rb +54 -0
- data/lib/ruhoh/resources/widgets/collection.rb +26 -0
- data/lib/ruhoh/resources/widgets/collection_view.rb +34 -0
- data/lib/ruhoh/resources/widgets/compiler.rb +27 -0
- data/lib/ruhoh/resources/widgets/model.rb +16 -0
- data/lib/ruhoh/routes.rb +29 -0
- data/lib/ruhoh/utils.rb +32 -49
- data/lib/ruhoh/version.rb +2 -2
- data/lib/ruhoh/views/helpers/categories.rb +38 -0
- data/lib/ruhoh/views/helpers/paginator.rb +39 -0
- data/lib/ruhoh/views/helpers/tags.rb +37 -0
- data/lib/ruhoh/views/master_view.rb +183 -0
- data/lib/ruhoh/views/rmustache.rb +24 -0
- data/ruhoh.gemspec +6 -82
- data/spec/spec_helper.rb +1 -1
- data/spec/support/shared_contexts.rb +6 -5
- data/system/{scaffolds/post.html → _scaffold.html} +1 -1
- data/system/{dash.html → dash/index.html} +37 -51
- data/system/{scaffolds/layout.html → layouts/_scaffold.html} +0 -0
- data/system/layouts/paginator.html +28 -0
- data/system/plugins/sprockets/javascripts/compiler.rb +25 -0
- data/system/plugins/sprockets/javascripts/previewer.rb +17 -0
- data/system/plugins/sprockets/stylesheets/compiler.rb +26 -0
- data/system/plugins/sprockets/stylesheets/previewer.rb +17 -0
- data/system/widgets/analytics/{layouts/getclicky.html → getclicky.html} +6 -2
- data/system/widgets/analytics/{layouts/google.html → google.html} +5 -1
- data/system/widgets/comments/{layouts/disqus.html → disqus.html} +6 -2
- data/system/widgets/comments/{layouts/facebook.html → facebook.html} +9 -2
- data/system/widgets/comments/{layouts/intensedebate.html → intensedebate.html} +5 -1
- data/system/widgets/comments/{layouts/livefyre.html → livefyre.html} +5 -1
- data/system/widgets/google_prettify/{layouts/google_prettify.html → default.html} +6 -2
- metadata +69 -66
- data/lib/ruhoh/client/client.rb +0 -306
- data/lib/ruhoh/client/console_methods.rb +0 -9
- data/lib/ruhoh/client/help.yml +0 -56
- data/lib/ruhoh/compiler.rb +0 -72
- data/lib/ruhoh/compilers/rss.rb +0 -39
- data/lib/ruhoh/compilers/theme.rb +0 -46
- data/lib/ruhoh/config.rb +0 -62
- data/lib/ruhoh/db.rb +0 -50
- data/lib/ruhoh/deployers/s3.rb +0 -71
- data/lib/ruhoh/page.rb +0 -106
- data/lib/ruhoh/parsers/javascripts.rb +0 -55
- data/lib/ruhoh/parsers/layouts.rb +0 -32
- data/lib/ruhoh/parsers/pages.rb +0 -79
- data/lib/ruhoh/parsers/partials.rb +0 -42
- data/lib/ruhoh/parsers/payload.rb +0 -49
- data/lib/ruhoh/parsers/posts.rb +0 -259
- data/lib/ruhoh/parsers/routes.rb +0 -20
- data/lib/ruhoh/parsers/scaffolds.rb +0 -35
- data/lib/ruhoh/parsers/site.rb +0 -19
- data/lib/ruhoh/parsers/stylesheets.rb +0 -63
- data/lib/ruhoh/parsers/theme_config.rb +0 -30
- data/lib/ruhoh/parsers/widgets.rb +0 -104
- data/lib/ruhoh/paths.rb +0 -83
- data/lib/ruhoh/previewer.rb +0 -48
- data/lib/ruhoh/program.rb +0 -68
- data/lib/ruhoh/templaters/asset_helpers.rb +0 -66
- data/lib/ruhoh/templaters/base_helpers.rb +0 -147
- data/lib/ruhoh/templaters/helpers.rb +0 -8
- data/lib/ruhoh/templaters/rmustache.rb +0 -70
- data/lib/ruhoh/urls.rb +0 -50
- data/lib/ruhoh/watch.rb +0 -78
- data/spec/config_spec.rb +0 -50
- data/spec/db_spec.rb +0 -91
- data/spec/page_spec.rb +0 -164
- data/spec/parsers/layouts_spec.rb +0 -41
- data/spec/parsers/pages_spec.rb +0 -120
- data/spec/parsers/posts_spec.rb +0 -309
- data/spec/parsers/routes_spec.rb +0 -39
- data/spec/parsers/site_spec.rb +0 -28
- data/spec/setup_spec.rb +0 -12
- data/system/scaffolds/draft.html +0 -9
- data/system/scaffolds/page.html +0 -4
- data/system/widgets/analytics/config.yml +0 -5
- data/system/widgets/comments/config.yml +0 -13
- data/system/widgets/google_prettify/config.yml +0 -1
data/lib/ruhoh/cache.rb
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
class Ruhoh
|
2
|
+
class Cache
|
3
|
+
def initialize(ruhoh)
|
4
|
+
@__cache = {}
|
5
|
+
end
|
6
|
+
|
7
|
+
def __cache
|
8
|
+
@__cache
|
9
|
+
end
|
10
|
+
|
11
|
+
def set(key, data)
|
12
|
+
key = tokenize(key)
|
13
|
+
return nil unless key
|
14
|
+
|
15
|
+
@__cache[key] = data
|
16
|
+
end
|
17
|
+
|
18
|
+
def get(key)
|
19
|
+
key = tokenize(key)
|
20
|
+
return nil unless key
|
21
|
+
|
22
|
+
if @__cache[key]
|
23
|
+
@__cache[key]
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def delete(key)
|
28
|
+
@__cache.delete(tokenize(key))
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def tokenize(key)
|
34
|
+
new_key = case key
|
35
|
+
when Hash
|
36
|
+
key.to_a.sort.to_s.strip
|
37
|
+
when Array
|
38
|
+
key.sort.to_s.strip
|
39
|
+
else
|
40
|
+
key.to_s.strip
|
41
|
+
end
|
42
|
+
|
43
|
+
new_key.empty? ? nil : new_key
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
data/lib/ruhoh/client.rb
ADDED
@@ -0,0 +1,162 @@
|
|
1
|
+
require 'ruhoh/programs/compile'
|
2
|
+
require 'ruhoh/console_methods'
|
3
|
+
require 'irb'
|
4
|
+
require 'benchmark'
|
5
|
+
|
6
|
+
class Ruhoh
|
7
|
+
|
8
|
+
class Client
|
9
|
+
DefaultBlogScaffold = 'git://github.com/ruhoh/blog.git'
|
10
|
+
Help = [
|
11
|
+
{
|
12
|
+
"command" => "new <directory_path>",
|
13
|
+
"desc" => "Create a new blog directory based on the Ruhoh specification."
|
14
|
+
},
|
15
|
+
{
|
16
|
+
"command" => "compile",
|
17
|
+
"desc" => "Compile to static website."
|
18
|
+
},
|
19
|
+
{
|
20
|
+
"command" => "help",
|
21
|
+
"desc" => "Show this menu."
|
22
|
+
}
|
23
|
+
]
|
24
|
+
def initialize(data)
|
25
|
+
@args = data[:args]
|
26
|
+
@options = data[:options]
|
27
|
+
@opt_parser = data[:opt_parser]
|
28
|
+
@ruhoh = Ruhoh.new
|
29
|
+
cmd = (@args[0] == 'new') ? 'blog' : (@args[0] || 'help')
|
30
|
+
|
31
|
+
@ruhoh.setup
|
32
|
+
@ruhoh.setup_paths
|
33
|
+
|
34
|
+
return __send__(cmd) if respond_to?(cmd)
|
35
|
+
|
36
|
+
Ruhoh::Friend.say {
|
37
|
+
yellow "-> Autoloading '#{cmd}' as pages collection"
|
38
|
+
} unless @ruhoh.collections.exists?(cmd)
|
39
|
+
|
40
|
+
collection = @ruhoh.collection(cmd)
|
41
|
+
client = collection.load_client(data)
|
42
|
+
|
43
|
+
Ruhoh::Friend.say {
|
44
|
+
red "method '#{data[:args][1]}' not found for #{client.class}"
|
45
|
+
exit
|
46
|
+
} unless @args[1] && client.respond_to?(@args[1])
|
47
|
+
|
48
|
+
client.__send__(@args[1])
|
49
|
+
end
|
50
|
+
|
51
|
+
# Thanks rails! https://github.com/rails/rails/blob/master/railties/lib/rails/commands/console.rb
|
52
|
+
def console
|
53
|
+
require 'pp'
|
54
|
+
Ruhoh::ConsoleMethods.env = @args[1]
|
55
|
+
IRB::ExtendCommandBundle.send :include, Ruhoh::ConsoleMethods
|
56
|
+
|
57
|
+
ARGV.clear # IRB throws an error otherwise.
|
58
|
+
IRB.start
|
59
|
+
end
|
60
|
+
alias_method :c, :console
|
61
|
+
|
62
|
+
# Show Client Utility help documentation.
|
63
|
+
def help
|
64
|
+
options = @opt_parser.help
|
65
|
+
resources = [{"methods" => Help}]
|
66
|
+
resources += @ruhoh.collections.all.map {|name|
|
67
|
+
collection = @ruhoh.collection(name)
|
68
|
+
next unless collection.client?
|
69
|
+
next unless collection.client.const_defined?(:Help)
|
70
|
+
{
|
71
|
+
"name" => name,
|
72
|
+
"methods" => collection.client.const_get(:Help)
|
73
|
+
}
|
74
|
+
}.compact
|
75
|
+
|
76
|
+
Ruhoh::Friend.say {
|
77
|
+
plain "Ruhoh is a nifty, modular static blog generator."
|
78
|
+
plain "It is the Universal Static Blog API."
|
79
|
+
plain "Visit http://www.ruhoh.com for complete usage and documentation."
|
80
|
+
plain ''
|
81
|
+
plain options
|
82
|
+
plain ''
|
83
|
+
plain 'Commands:'
|
84
|
+
plain ''
|
85
|
+
resources.each do |resource|
|
86
|
+
resource["methods"].each do |method|
|
87
|
+
if resource["name"]
|
88
|
+
green(" " + "#{resource["name"]} #{method["command"]}")
|
89
|
+
else
|
90
|
+
green(" " + method["command"])
|
91
|
+
end
|
92
|
+
plain(" "+ method["desc"])
|
93
|
+
end
|
94
|
+
end
|
95
|
+
}
|
96
|
+
end
|
97
|
+
|
98
|
+
# Public: Compile to static website.
|
99
|
+
def compile
|
100
|
+
puts Benchmark.measure {
|
101
|
+
Ruhoh::Program.compile(@args[1])
|
102
|
+
}
|
103
|
+
end
|
104
|
+
|
105
|
+
# Public: Create a new blog at the directory provided.
|
106
|
+
def blog
|
107
|
+
name = @args[1]
|
108
|
+
scaffold = @args.length > 2 ? @args[2] : DefaultBlogScaffold
|
109
|
+
useHg = @options.hg
|
110
|
+
Ruhoh::Friend.say {
|
111
|
+
red "Please specify a directory path."
|
112
|
+
plain " ex: ruhoh new the-blogist"
|
113
|
+
exit
|
114
|
+
} if name.nil?
|
115
|
+
|
116
|
+
target_directory = File.join(Dir.pwd, name)
|
117
|
+
|
118
|
+
Ruhoh::Friend.say {
|
119
|
+
red "#{target_directory} already exists."
|
120
|
+
plain " Specify another directory or `rm -rf` this directory first."
|
121
|
+
exit
|
122
|
+
} if File.exist?(target_directory)
|
123
|
+
|
124
|
+
Ruhoh::Friend.say {
|
125
|
+
plain "Trying this command:"
|
126
|
+
|
127
|
+
if useHg
|
128
|
+
cyan " hg clone #{scaffold} #{target_directory}"
|
129
|
+
success = system('hg', 'clone', scaffold, target_directory)
|
130
|
+
else
|
131
|
+
cyan " git clone #{scaffold} #{target_directory}"
|
132
|
+
success = system('git', 'clone', scaffold, target_directory)
|
133
|
+
end
|
134
|
+
|
135
|
+
if success
|
136
|
+
green "Success! Now do..."
|
137
|
+
cyan " cd #{target_directory}"
|
138
|
+
cyan " rackup -p9292"
|
139
|
+
cyan " http://localhost:9292"
|
140
|
+
else
|
141
|
+
red "Could not git clone blog scaffold. Please try it manually:"
|
142
|
+
cyan " git clone git://github.com/ruhoh/blog.git #{target_directory}"
|
143
|
+
end
|
144
|
+
}
|
145
|
+
end
|
146
|
+
|
147
|
+
def ask(message, valid_options)
|
148
|
+
if valid_options
|
149
|
+
answer = get_stdin("#{message} #{valid_options.to_s.gsub(/"/, '').gsub(/, /,'/')} ") while !valid_options.include?(answer)
|
150
|
+
else
|
151
|
+
answer = get_stdin(message)
|
152
|
+
end
|
153
|
+
answer
|
154
|
+
end
|
155
|
+
|
156
|
+
def get_stdin(message)
|
157
|
+
print message
|
158
|
+
STDIN.gets.chomp
|
159
|
+
end
|
160
|
+
|
161
|
+
end
|
162
|
+
end
|
@@ -0,0 +1,172 @@
|
|
1
|
+
module Ruhoh::Resources ; end
|
2
|
+
# Require all the resources
|
3
|
+
FileUtils.cd(File.join(File.dirname(__FILE__), 'base')) do
|
4
|
+
(Dir['*.rb'] + Dir[File.join('*', '*.rb')]).each do |f|
|
5
|
+
require File.join(File.dirname(__FILE__), 'base', f)
|
6
|
+
end
|
7
|
+
end
|
8
|
+
FileUtils.cd(File.join(File.dirname(__FILE__), 'resources')) do
|
9
|
+
Dir[File.join('**', '*.rb')].each do |f|
|
10
|
+
require File.join(File.dirname(__FILE__), 'resources', f)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
class Ruhoh
|
15
|
+
class Collections
|
16
|
+
def initialize(ruhoh)
|
17
|
+
@ruhoh = ruhoh
|
18
|
+
@collections = {}
|
19
|
+
end
|
20
|
+
|
21
|
+
def collection(resource)
|
22
|
+
get_module_namespace_for(resource).const_get(:Collection)
|
23
|
+
end
|
24
|
+
|
25
|
+
def collection?(resource)
|
26
|
+
get_module_namespace_for(resource).const_defined?(:Collection)
|
27
|
+
end
|
28
|
+
|
29
|
+
# Load and cache a given resource collection.
|
30
|
+
# This allows you to work with single object instance and perform
|
31
|
+
# persistant mutations on it if necessary.
|
32
|
+
# Note the collection is always wrapped in its view.
|
33
|
+
# @returns[Class Instance] of the resource and class_name given.
|
34
|
+
def load(resource)
|
35
|
+
return @collections[resource] if @collections[resource]
|
36
|
+
instance = collection?(resource) ?
|
37
|
+
collection(resource).new(@ruhoh) :
|
38
|
+
Ruhoh::Base::Collection.new(@ruhoh)
|
39
|
+
instance.resource_name = resource
|
40
|
+
@collections[resource] = instance.load_collection_view
|
41
|
+
end
|
42
|
+
|
43
|
+
# Load the CollectionView class for this resource.
|
44
|
+
# Used primarily to as the plugin interface to include modules for mustache.
|
45
|
+
def self.load(resource)
|
46
|
+
get_module_namespace_for(resource).const_get(:CollectionView)
|
47
|
+
end
|
48
|
+
|
49
|
+
def all
|
50
|
+
(discover + registered).uniq
|
51
|
+
end
|
52
|
+
|
53
|
+
def base
|
54
|
+
Ruhoh::Base.constants.select{ |a|
|
55
|
+
Ruhoh::Base.const_get(a).class == Module
|
56
|
+
}.map{ |a|
|
57
|
+
a.to_s.downcase
|
58
|
+
}
|
59
|
+
end
|
60
|
+
|
61
|
+
def registered
|
62
|
+
self.class.registered
|
63
|
+
end
|
64
|
+
|
65
|
+
def self.registered
|
66
|
+
Ruhoh::Resources.constants.map{ |a| a.to_s.downcase }.delete_if{ |a| a == "pages" }
|
67
|
+
end
|
68
|
+
|
69
|
+
# discover all the resource mappings
|
70
|
+
def discover
|
71
|
+
FileUtils.cd(@ruhoh.base) {
|
72
|
+
return Dir['*'].select { |x|
|
73
|
+
File.directory?(x) && !["plugins", 'compiled'].include?(x)
|
74
|
+
}
|
75
|
+
}
|
76
|
+
end
|
77
|
+
|
78
|
+
def acting_as_pages
|
79
|
+
pool = discover
|
80
|
+
theme = @ruhoh.config['theme']['name'] rescue nil
|
81
|
+
pool.delete(theme)
|
82
|
+
|
83
|
+
pool.keep_if { |resource|
|
84
|
+
config = @ruhoh.config[resource]
|
85
|
+
if (config && config["use"])
|
86
|
+
config["use"] == "pages"
|
87
|
+
else
|
88
|
+
if resource == "pages"
|
89
|
+
true
|
90
|
+
else
|
91
|
+
!registered.include?(resource)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
}
|
95
|
+
end
|
96
|
+
|
97
|
+
def exists?(name)
|
98
|
+
all.include?(name)
|
99
|
+
end
|
100
|
+
alias_method :exist?, :exists?
|
101
|
+
|
102
|
+
def paginator_urls
|
103
|
+
data = {}
|
104
|
+
all.each do |name|
|
105
|
+
paginator = load(name).config['paginator']['url'] rescue nil
|
106
|
+
next if paginator.nil? || paginator.empty?
|
107
|
+
|
108
|
+
data[name] = @ruhoh.to_url(paginator)
|
109
|
+
end
|
110
|
+
|
111
|
+
data
|
112
|
+
end
|
113
|
+
|
114
|
+
def url_endpoints
|
115
|
+
urls = {}
|
116
|
+
urls["base_path"] = @ruhoh.base_path
|
117
|
+
|
118
|
+
all.each do |name|
|
119
|
+
collection = load(name)
|
120
|
+
next unless collection.respond_to?(:url_endpoint)
|
121
|
+
urls[name] = @ruhoh.to_url(collection.url_endpoint)
|
122
|
+
end
|
123
|
+
|
124
|
+
urls
|
125
|
+
end
|
126
|
+
|
127
|
+
def url_endpoints_sorted
|
128
|
+
sorted_urls = url_endpoints.each.map {|k, v| {"name" => k, "url" => v} }
|
129
|
+
sorted_urls.sort { |a, b| b["url"].length <=> a["url"].length }
|
130
|
+
end
|
131
|
+
|
132
|
+
protected
|
133
|
+
|
134
|
+
# Load the registered resource else default to Pages if not configured.
|
135
|
+
# @returns[Constant] the resource's module namespace
|
136
|
+
def get_module_namespace_for(resource)
|
137
|
+
type = @ruhoh.config[resource]["use"] rescue nil
|
138
|
+
|
139
|
+
self.class.get_module_namespace_for(resource, type)
|
140
|
+
end
|
141
|
+
|
142
|
+
def self.get_module_namespace_for(resource, type=nil)
|
143
|
+
if type
|
144
|
+
if registered.include?(type)
|
145
|
+
Ruhoh::Resources.const_get(camelize(type))
|
146
|
+
elsif base.include?(type)
|
147
|
+
Ruhoh::Base.const_get(camelize(type))
|
148
|
+
else
|
149
|
+
klass = camelize(type)
|
150
|
+
Friend.say {
|
151
|
+
red "#{resource} resource set to use:'#{type}' in config.yml but Ruhoh::Resources::#{klass} does not exist."
|
152
|
+
}
|
153
|
+
abort
|
154
|
+
end
|
155
|
+
else
|
156
|
+
if registered.include?(resource)
|
157
|
+
Ruhoh::Resources.const_get(camelize(resource))
|
158
|
+
else
|
159
|
+
Ruhoh::Resources.const_get(:Pages)
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
def camelize(name)
|
165
|
+
self.class.camelize(name)
|
166
|
+
end
|
167
|
+
|
168
|
+
def self.camelize(name)
|
169
|
+
name.to_s.split('_').map {|a| a.capitalize}.join
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
class Ruhoh
|
2
|
+
module ConsoleMethods
|
3
|
+
class << self
|
4
|
+
attr_accessor :env
|
5
|
+
end
|
6
|
+
|
7
|
+
def ruhoh
|
8
|
+
return @ruhoh if @ruhoh
|
9
|
+
@ruhoh = Ruhoh.new
|
10
|
+
@ruhoh.setup
|
11
|
+
@ruhoh.env = ConsoleMethods.env || 'development'
|
12
|
+
@ruhoh.setup_paths
|
13
|
+
@ruhoh
|
14
|
+
end
|
15
|
+
|
16
|
+
def reload!
|
17
|
+
@ruhoh = nil
|
18
|
+
self.ruhoh
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
class Ruhoh
|
2
|
+
module Program
|
3
|
+
# Public: A program for compiling to a static website.
|
4
|
+
# The compile environment should always be 'production' in order
|
5
|
+
# to properly omit drafts and other development-only settings.
|
6
|
+
def self.compile(target)
|
7
|
+
ruhoh = Ruhoh.new
|
8
|
+
ruhoh.setup
|
9
|
+
ruhoh.env = 'production'
|
10
|
+
ruhoh.setup_paths
|
11
|
+
ruhoh.setup_plugins
|
12
|
+
|
13
|
+
if target
|
14
|
+
ruhoh.paths.compiled = File.expand_path(target)
|
15
|
+
elsif ruhoh.config["compiled"]
|
16
|
+
ruhoh.paths.compiled = ruhoh.config["compiled"]
|
17
|
+
end
|
18
|
+
|
19
|
+
ruhoh.compile
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'ruhoh/programs/watch'
|
2
|
+
class Ruhoh
|
3
|
+
module Program
|
4
|
+
# Public: A program for running ruhoh as a rack application
|
5
|
+
# which renders singular pages via their URL.
|
6
|
+
#
|
7
|
+
# Examples
|
8
|
+
#
|
9
|
+
# In config.ru:
|
10
|
+
#
|
11
|
+
# require 'ruhoh'
|
12
|
+
# run Ruhoh::Program.preview
|
13
|
+
#
|
14
|
+
# Returns: A new Rack builder object which should work inside config.ru
|
15
|
+
def self.preview(opts={})
|
16
|
+
opts[:watch] ||= true
|
17
|
+
opts[:env] ||= 'development'
|
18
|
+
|
19
|
+
ruhoh = Ruhoh.new
|
20
|
+
ruhoh.setup
|
21
|
+
ruhoh.env = opts[:env]
|
22
|
+
ruhoh.setup_paths
|
23
|
+
ruhoh.setup_plugins unless opts[:enable_plugins] == false
|
24
|
+
|
25
|
+
# initialize the routes dictionary for all page resources.
|
26
|
+
ruhoh.routes.all
|
27
|
+
|
28
|
+
Ruhoh::Program.watch(ruhoh) if opts[:watch]
|
29
|
+
Rack::Builder.new {
|
30
|
+
use Rack::Lint
|
31
|
+
use Rack::ShowExceptions
|
32
|
+
|
33
|
+
# Url endpoints as registered by the resources.
|
34
|
+
# The urls are mapped to the resource's individual rack-compatable Previewer class.
|
35
|
+
# Note page-like resources (posts, pages) don't render uniform url endpoints,
|
36
|
+
# since presumably they define customized permalinks per singular resource.
|
37
|
+
# Page-like resources are handled the root mapping below.
|
38
|
+
ruhoh.collections.url_endpoints_sorted.each do |h|
|
39
|
+
# Omit base_path and theme because they are special use-cases.
|
40
|
+
next if %w{base_path theme}.include?(h["name"])
|
41
|
+
map h["url"] do
|
42
|
+
collection = ruhoh.collection(h["name"])
|
43
|
+
if collection.previewer?
|
44
|
+
run collection.load_previewer
|
45
|
+
else
|
46
|
+
run Rack::Cascade.new(
|
47
|
+
collection.paths.reverse.map { |path|
|
48
|
+
Rack::File.new(path)
|
49
|
+
}
|
50
|
+
)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
# The generic Page::Previewer is used to render any/all page-like resources,
|
56
|
+
# since they likely have arbitrary urls based on permalink settings.
|
57
|
+
map '/' do
|
58
|
+
run Ruhoh::Resources::Pages::Previewer.new(ruhoh)
|
59
|
+
end
|
60
|
+
}
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|