ruhoh 1.1 → 2.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
@@ -0,0 +1,27 @@
|
|
1
|
+
module Ruhoh::Resources::Widgets
|
2
|
+
class Compiler
|
3
|
+
include Ruhoh::Base::Compilable
|
4
|
+
|
5
|
+
def run
|
6
|
+
collection = @collection
|
7
|
+
unless @collection.paths?
|
8
|
+
Ruhoh::Friend.say { yellow "#{collection.resource_name.capitalize}: directory not found - skipping." }
|
9
|
+
return
|
10
|
+
end
|
11
|
+
Ruhoh::Friend.say { cyan "#{collection.resource_name.capitalize}: (copying valid files)" }
|
12
|
+
|
13
|
+
compiled_path = Ruhoh::Utils.url_to_path(@ruhoh.to_url(@collection.url_endpoint), @ruhoh.paths.compiled)
|
14
|
+
FileUtils.mkdir_p compiled_path
|
15
|
+
|
16
|
+
files = @collection.files.values
|
17
|
+
# Don't copy over the layouts.
|
18
|
+
files.delete_if { |p| p['id'].end_with?('.html') }
|
19
|
+
files.each do |pointer|
|
20
|
+
compiled_file = File.join(compiled_path, pointer['id'])
|
21
|
+
FileUtils.mkdir_p File.dirname(compiled_file)
|
22
|
+
FileUtils.cp_r pointer['realpath'], compiled_file
|
23
|
+
Ruhoh::Friend.say { green " > #{pointer['id']}" }
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Ruhoh::Resources::Widgets
|
2
|
+
class Model
|
3
|
+
include Ruhoh::Base::PageLike
|
4
|
+
|
5
|
+
def process
|
6
|
+
parsed = parse_page_file
|
7
|
+
@data = parsed['data']
|
8
|
+
@content = parsed['content']
|
9
|
+
|
10
|
+
changed
|
11
|
+
notify_observers(parsed)
|
12
|
+
|
13
|
+
parsed
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/lib/ruhoh/routes.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
class Ruhoh
|
2
|
+
class Routes
|
3
|
+
def initialize(ruhoh)
|
4
|
+
@ruhoh = ruhoh
|
5
|
+
end
|
6
|
+
|
7
|
+
def find(route)
|
8
|
+
@ruhoh.collections.acting_as_pages.each do |r|
|
9
|
+
next unless @ruhoh.collection(r).routes[route]
|
10
|
+
return @ruhoh.collection(r).routes[route]
|
11
|
+
break
|
12
|
+
end
|
13
|
+
|
14
|
+
nil
|
15
|
+
end
|
16
|
+
|
17
|
+
# All available routes from pages.
|
18
|
+
# This is not cached because the page collections should manage
|
19
|
+
# their own cache invalidation strategy
|
20
|
+
# @returns[Hash map]
|
21
|
+
def all
|
22
|
+
routes = {}
|
23
|
+
@ruhoh.collections.acting_as_pages.each do |r|
|
24
|
+
routes.merge!(@ruhoh.collection(r).routes)
|
25
|
+
end
|
26
|
+
routes
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/lib/ruhoh/utils.rb
CHANGED
@@ -15,60 +15,24 @@ class Ruhoh
|
|
15
15
|
nil
|
16
16
|
end
|
17
17
|
|
18
|
-
def self.parse_page_file(*args)
|
19
|
-
path = File.__send__(:join, args)
|
20
|
-
raise "File not found: #{path}" unless File.exist?(path)
|
21
|
-
|
22
|
-
page = File.open(path, 'r:UTF-8') {|f| f.read }
|
23
|
-
|
24
|
-
front_matter = page.match(FMregex)
|
25
|
-
if front_matter
|
26
|
-
data = YAML.load(front_matter[0].gsub(/---\n/, "")) || {}
|
27
|
-
data['categories'] = Array(data['categories'])
|
28
|
-
data['tags'] = Array(data['tags'])
|
29
|
-
else
|
30
|
-
data = {}
|
31
|
-
end
|
32
|
-
|
33
|
-
{
|
34
|
-
"data" => data,
|
35
|
-
"content" => page.gsub(FMregex, '')
|
36
|
-
}
|
37
|
-
rescue Psych::SyntaxError => e
|
38
|
-
Ruhoh.log.error("ERROR in #{path}: #{e.message}")
|
39
|
-
nil
|
40
|
-
end
|
41
|
-
|
42
|
-
def self.parse_layout_file(*args)
|
43
|
-
path = File.__send__(:join, args)
|
44
|
-
raise "Layout file not found: #{path}" unless File.exist?(path)
|
45
|
-
data = {}
|
46
|
-
page = File.open(path, 'r:UTF-8') {|f| f.read }
|
47
|
-
|
48
|
-
front_matter = page.match(FMregex)
|
49
|
-
if front_matter
|
50
|
-
data = YAML.load(front_matter[0].gsub(/---\n/, "")) || {}
|
51
|
-
end
|
52
|
-
|
53
|
-
{
|
54
|
-
"data" => data,
|
55
|
-
"content" => page.gsub(FMregex, '')
|
56
|
-
}
|
57
|
-
rescue Psych::SyntaxError => e
|
58
|
-
Ruhoh.log.error("ERROR in #{path}: #{e.message}")
|
59
|
-
nil
|
60
|
-
end
|
61
|
-
|
62
|
-
def self.relative_path(filename)
|
63
|
-
filename.gsub(Regexp.new("^#{Ruhoh.paths.base}/"), '')
|
64
|
-
end
|
65
|
-
|
66
18
|
def self.url_to_path(url, base=nil)
|
19
|
+
url = url.gsub(/^\//, '')
|
67
20
|
parts = url.split('/')
|
68
21
|
parts = parts.unshift(base) if base
|
69
22
|
File.__send__(:join, parts)
|
70
23
|
end
|
71
|
-
|
24
|
+
|
25
|
+
def self.to_url_slug(title)
|
26
|
+
CGI::escape self.to_slug(title)
|
27
|
+
end
|
28
|
+
|
29
|
+
# My Post Title ===> my-post-title
|
30
|
+
def self.to_slug(title)
|
31
|
+
title = title.to_s.downcase.strip.gsub(/[^\p{Word}+]/u, '-')
|
32
|
+
title.gsub(/^\-+/, '').gsub(/\-+$/, '').gsub(/\-+/, '-')
|
33
|
+
end
|
34
|
+
|
35
|
+
|
72
36
|
def self.report(name, collection, invalid)
|
73
37
|
output = "#{collection.count}/#{collection.count + invalid.count} #{name} processed."
|
74
38
|
if collection.empty? && invalid.empty?
|
@@ -102,5 +66,24 @@ class Ruhoh
|
|
102
66
|
target
|
103
67
|
end
|
104
68
|
|
69
|
+
def self.constantize(class_name)
|
70
|
+
unless /\A(?:::)?([A-Z]\w*(?:::[A-Z]\w*)*)\z/ =~ class_name
|
71
|
+
raise NameError, "#{class_name.inspect} is not a valid constant name!"
|
72
|
+
end
|
73
|
+
|
74
|
+
Object.module_eval("::#{$1}", __FILE__, __LINE__)
|
75
|
+
end
|
76
|
+
|
77
|
+
# Thanks ActiveSupport: http://stackoverflow.com/a/1509939/101940
|
78
|
+
def self.underscore(string)
|
79
|
+
string.
|
80
|
+
to_s.
|
81
|
+
gsub(/::/, '/').
|
82
|
+
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
|
83
|
+
gsub(/([a-z\d])([A-Z])/,'\1_\2').
|
84
|
+
tr("-", "_").
|
85
|
+
downcase
|
86
|
+
end
|
87
|
+
|
105
88
|
end
|
106
89
|
end #Ruhoh
|
data/lib/ruhoh/version.rb
CHANGED
@@ -0,0 +1,38 @@
|
|
1
|
+
module Ruhoh::Views::Helpers
|
2
|
+
module Categories
|
3
|
+
# Category dictionary
|
4
|
+
def categories
|
5
|
+
categories_url = nil
|
6
|
+
[ruhoh.to_url("categories"), ruhoh.to_url("categories.html")].each { |url|
|
7
|
+
categories_url = url and break if ruhoh.routes.find(url)
|
8
|
+
}
|
9
|
+
dict = {}
|
10
|
+
dictionary.each_value do |model|
|
11
|
+
Array(model.data['categories']).each do |cat|
|
12
|
+
cat = Array(cat).join('/')
|
13
|
+
if dict[cat]
|
14
|
+
dict[cat]['count'] += 1
|
15
|
+
else
|
16
|
+
dict[cat] = {
|
17
|
+
'count' => 1,
|
18
|
+
'name' => cat,
|
19
|
+
resource_name => [],
|
20
|
+
'url' => "#{categories_url}##{cat}-ref"
|
21
|
+
}
|
22
|
+
end
|
23
|
+
|
24
|
+
dict[cat][resource_name] << model.id
|
25
|
+
end
|
26
|
+
end
|
27
|
+
dict["all"] = dict.each_value.map { |cat| cat }
|
28
|
+
dict
|
29
|
+
end
|
30
|
+
|
31
|
+
# Convert single or Array of category ids (names) to category hash(es).
|
32
|
+
def to_categories(sub_context)
|
33
|
+
Array(sub_context).map { |id|
|
34
|
+
categories[id]
|
35
|
+
}.compact
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Ruhoh::Views::Helpers
|
2
|
+
module Paginator
|
3
|
+
# current_page is set via a compiler or previewer
|
4
|
+
# in which it can discern what current_page to serve
|
5
|
+
def paginator
|
6
|
+
per_page = config["paginator"]["per_page"] rescue 5
|
7
|
+
current_page = master.page_data['current_page'].to_i
|
8
|
+
current_page = current_page.zero? ? 1 : current_page
|
9
|
+
offset = (current_page-1)*per_page
|
10
|
+
|
11
|
+
page_batch = all[offset, per_page]
|
12
|
+
raise "Page does not exist" unless page_batch
|
13
|
+
page_batch
|
14
|
+
end
|
15
|
+
|
16
|
+
def paginator_navigation
|
17
|
+
paginator_config = config["paginator"] || {}
|
18
|
+
page_count = all.length
|
19
|
+
total_pages = (page_count.to_f/paginator_config["per_page"]).ceil
|
20
|
+
current_page = master.page_data['current_page'].to_i
|
21
|
+
current_page = current_page.zero? ? 1 : current_page
|
22
|
+
|
23
|
+
pages = total_pages.times.map { |i|
|
24
|
+
url = if i.zero? && paginator_config["root_page"]
|
25
|
+
paginator_config["root_page"]
|
26
|
+
else
|
27
|
+
"#{paginator_config["url"]}/#{i+1}"
|
28
|
+
end
|
29
|
+
|
30
|
+
{
|
31
|
+
"url" => ruhoh.to_url(url),
|
32
|
+
"name" => "#{i+1}",
|
33
|
+
"is_active_page" => (i+1 == current_page)
|
34
|
+
}
|
35
|
+
}
|
36
|
+
pages
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Ruhoh::Views::Helpers
|
2
|
+
module Tags
|
3
|
+
# Generate the tags dictionary
|
4
|
+
def tags
|
5
|
+
tags_url = nil
|
6
|
+
[ruhoh.to_url("tags"), ruhoh.to_url("tags.html")].each { |url|
|
7
|
+
tags_url = url and break if ruhoh.routes.find(url)
|
8
|
+
}
|
9
|
+
dict = {}
|
10
|
+
dictionary.each_value do |model|
|
11
|
+
Array(model.data['tags']).each do |tag|
|
12
|
+
if dict[tag]
|
13
|
+
dict[tag]['count'] += 1
|
14
|
+
else
|
15
|
+
dict[tag] = {
|
16
|
+
'count' => 1,
|
17
|
+
'name' => tag,
|
18
|
+
resource_name => [],
|
19
|
+
'url' => "#{tags_url}##{tag}-ref"
|
20
|
+
}
|
21
|
+
end
|
22
|
+
|
23
|
+
dict[tag][resource_name] << model.id
|
24
|
+
end
|
25
|
+
end
|
26
|
+
dict["all"] = dict.each_value.map { |tag| tag }
|
27
|
+
dict
|
28
|
+
end
|
29
|
+
|
30
|
+
# Convert single or Array of tag ids (names) to tag hash(es).
|
31
|
+
def to_tags(sub_context)
|
32
|
+
Array(sub_context).map { |id|
|
33
|
+
tags[id]
|
34
|
+
}.compact
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,183 @@
|
|
1
|
+
require 'ruhoh/views/rmustache'
|
2
|
+
|
3
|
+
module Ruhoh::Views
|
4
|
+
module Helpers ; end
|
5
|
+
class MasterView < RMustache
|
6
|
+
attr_reader :sub_layout, :master_layout
|
7
|
+
attr_accessor :page_data
|
8
|
+
|
9
|
+
def initialize(ruhoh, pointer_or_data)
|
10
|
+
@ruhoh = ruhoh
|
11
|
+
define_resource_collection_namespaces(ruhoh)
|
12
|
+
|
13
|
+
if pointer_or_data['id']
|
14
|
+
@pointer = pointer_or_data
|
15
|
+
@page = collection.find(pointer_or_data)
|
16
|
+
unless @page
|
17
|
+
raise "Could not find the page with pointer: #{ pointer_or_data }" +
|
18
|
+
"Finding this page is required because an 'id' key is being passed."
|
19
|
+
end
|
20
|
+
|
21
|
+
@page_data = @page.data.dup # legacy...working on removing this..
|
22
|
+
else
|
23
|
+
@content = pointer_or_data['content']
|
24
|
+
@page_data = pointer_or_data
|
25
|
+
@pointer = pointer_or_data
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def render_full
|
30
|
+
process_layouts
|
31
|
+
render(expand_layouts)
|
32
|
+
end
|
33
|
+
|
34
|
+
def render_content
|
35
|
+
render('{{{page.content}}}')
|
36
|
+
end
|
37
|
+
|
38
|
+
# Delegate #page to the kind of resource this view is modeling.
|
39
|
+
def page
|
40
|
+
collection ? collection.find(@pointer) : nil
|
41
|
+
end
|
42
|
+
|
43
|
+
def collection
|
44
|
+
@pointer["resource"] ? __send__(@pointer["resource"]) : nil
|
45
|
+
end
|
46
|
+
|
47
|
+
def urls
|
48
|
+
@ruhoh.collections.url_endpoints
|
49
|
+
end
|
50
|
+
|
51
|
+
def content
|
52
|
+
render(@content || page.content)
|
53
|
+
end
|
54
|
+
|
55
|
+
# NOTE: newline ensures proper markdown rendering.
|
56
|
+
def partial(name)
|
57
|
+
partial = partials.find(name.to_s)
|
58
|
+
partial ?
|
59
|
+
partial.process.to_s + "\n" :
|
60
|
+
Ruhoh::Friend.say { yellow "partial not found: '#{name}'" }
|
61
|
+
end
|
62
|
+
|
63
|
+
def page_collections
|
64
|
+
@ruhoh.collections.acting_as_pages.map do |a|
|
65
|
+
@ruhoh.collection(a)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def to_json(sub_context)
|
70
|
+
sub_context.to_json
|
71
|
+
end
|
72
|
+
|
73
|
+
def to_pretty_json(sub_context)
|
74
|
+
JSON.pretty_generate(sub_context)
|
75
|
+
end
|
76
|
+
|
77
|
+
def debug(sub_context)
|
78
|
+
Ruhoh::Friend.say {
|
79
|
+
yellow "?debug:"
|
80
|
+
magenta sub_context.class
|
81
|
+
cyan sub_context.inspect
|
82
|
+
}
|
83
|
+
|
84
|
+
"<pre>#{sub_context.class}\n#{sub_context.pretty_inspect}</pre>"
|
85
|
+
end
|
86
|
+
|
87
|
+
def raw_code(sub_context)
|
88
|
+
code = sub_context.gsub('{', '{').gsub('}', '}').gsub('<', '<').gsub('>', '>').gsub('_', "_")
|
89
|
+
"<pre><code>#{code}</code></pre>\n"
|
90
|
+
end
|
91
|
+
|
92
|
+
# My Post Title ===> my-post-title
|
93
|
+
# Handy for transforming ids into css-classes in your views.
|
94
|
+
# @returns[String]
|
95
|
+
def to_slug(sub_context)
|
96
|
+
Ruhoh::Utils.to_slug(sub_context)
|
97
|
+
end
|
98
|
+
|
99
|
+
# Public: Formats the path to the compiled file based on the URL.
|
100
|
+
#
|
101
|
+
# Returns: [String] The relative path to the compiled file for this page.
|
102
|
+
def compiled_path
|
103
|
+
path = CGI.unescape(@page_data['url']).gsub(/^\//, '') #strip leading slash.
|
104
|
+
path = "index.html" if path.empty?
|
105
|
+
path += '/index.html' unless path =~ /\.\w+$/
|
106
|
+
path
|
107
|
+
end
|
108
|
+
|
109
|
+
protected
|
110
|
+
|
111
|
+
def process_layouts
|
112
|
+
if @page_data['layout']
|
113
|
+
@sub_layout = layouts.find(@page_data['layout'], :all => true)
|
114
|
+
raise "Layout does not exist: #{@page_data['layout']}" unless @sub_layout
|
115
|
+
elsif @page_data['layout'] != false
|
116
|
+
# try default
|
117
|
+
@sub_layout = layouts.find(@pointer["resource"], :all => true)
|
118
|
+
end
|
119
|
+
|
120
|
+
if @sub_layout && @sub_layout.layout
|
121
|
+
@master_layout = layouts.find(@sub_layout.layout)
|
122
|
+
raise "Layout does not exist: #{ @sub_layout.layout }" unless @master_layout
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
# Expand the layout(s).
|
127
|
+
# Pages may have a single master_layout, a master_layout + sub_layout, or no layout.
|
128
|
+
def expand_layouts
|
129
|
+
if @sub_layout
|
130
|
+
layout = @sub_layout.content
|
131
|
+
|
132
|
+
# If a master_layout is found we need to process the sub_layout
|
133
|
+
# into the master_layout using mustache.
|
134
|
+
if @master_layout && @master_layout.content
|
135
|
+
layout = render(@master_layout.content, {"content" => layout})
|
136
|
+
end
|
137
|
+
else
|
138
|
+
# Minimum layout if no layout defined.
|
139
|
+
layout = page ? '{{{ page.content }}}' : '{{{ content }}}'
|
140
|
+
end
|
141
|
+
|
142
|
+
layout
|
143
|
+
end
|
144
|
+
|
145
|
+
private
|
146
|
+
|
147
|
+
# Dynamically add method proxies to resource collections
|
148
|
+
# This is how collections are accessed throughout mustache's global context.
|
149
|
+
# Also support calling ?to_<resource> contextual block helpers
|
150
|
+
def define_resource_collection_namespaces(ruhoh)
|
151
|
+
ruhoh.collections.all.each do |method_name|
|
152
|
+
(class << self; self; end).class_eval do
|
153
|
+
define_method(method_name) do
|
154
|
+
load_collection_view_for(method_name.to_s)
|
155
|
+
end
|
156
|
+
|
157
|
+
define_method("to_#{method_name}") do |*args|
|
158
|
+
resource_generator_for(method_name, *args)
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
# Load collection views dynamically when calling a resources name.
|
165
|
+
# Uses method_missing to catch calls to resource namespace.
|
166
|
+
# @returns[CollectionView] for the calling resource.
|
167
|
+
def load_collection_view_for(resource)
|
168
|
+
view = @ruhoh.collection(resource)
|
169
|
+
view.master = self
|
170
|
+
view
|
171
|
+
end
|
172
|
+
|
173
|
+
# Transforms an Array or String of resource ids into their corresponding resource objects.
|
174
|
+
# Uses method_missing to catch calls to 'to_<resource>` contextual helper.
|
175
|
+
# @returns[Array] the resource modelView objects or raw data hash.
|
176
|
+
def resource_generator_for(resource, sub_context)
|
177
|
+
collection_view = load_collection_view_for(resource)
|
178
|
+
Array(sub_context).map { |id|
|
179
|
+
collection_view.find(id)
|
180
|
+
}.compact
|
181
|
+
end
|
182
|
+
end
|
183
|
+
end
|