ruhoh 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +13 -0
- data/README.md +5 -53
- data/Rakefile +56 -0
- data/bin/ruhoh +23 -14
- data/lib/ruhoh/client/client.rb +310 -0
- data/lib/ruhoh/client/help.yml +56 -0
- data/lib/ruhoh/compiler.rb +16 -19
- data/lib/ruhoh/converters/converter.rb +30 -3
- data/lib/ruhoh/db.rb +7 -17
- data/lib/ruhoh/deployers/s3.rb +71 -0
- data/lib/ruhoh/friend.rb +71 -0
- data/lib/ruhoh/page.rb +41 -11
- data/lib/ruhoh/parsers/drafts.rb +54 -0
- data/lib/ruhoh/parsers/layouts.rb +14 -9
- data/lib/ruhoh/parsers/pages.rb +47 -35
- data/lib/ruhoh/parsers/partials.rb +14 -2
- data/lib/ruhoh/parsers/posts.rb +139 -88
- data/lib/ruhoh/parsers/routes.rb +4 -8
- data/lib/ruhoh/parsers/site.rb +2 -8
- data/lib/ruhoh/previewer.rb +48 -0
- data/lib/ruhoh/templaters/base.rb +53 -0
- data/lib/ruhoh/templaters/helpers.rb +159 -0
- data/lib/ruhoh/templaters/rmustache.rb +29 -0
- data/lib/ruhoh/utils.rb +25 -7
- data/lib/ruhoh/version.rb +1 -1
- data/lib/ruhoh/watch.rb +22 -9
- data/lib/ruhoh.rb +74 -29
- data/ruhoh.gemspec +70 -9
- data/scaffolds/blog/_config.yml +33 -0
- data/scaffolds/blog/_drafts/.gitkeep +0 -0
- data/scaffolds/blog/_posts/.gitkeep +0 -0
- data/scaffolds/blog/_site.yml +16 -0
- data/scaffolds/blog/_templates/partials/categories_list +3 -0
- data/scaffolds/blog/_templates/partials/pages_list +7 -0
- data/scaffolds/blog/_templates/partials/posts_collate +9 -0
- data/scaffolds/blog/_templates/partials/posts_list +1 -0
- data/scaffolds/blog/_templates/partials/tags_list +3 -0
- data/scaffolds/blog/_templates/syntax/google_prettify/default.css +52 -0
- data/scaffolds/blog/_templates/syntax/google_prettify/desert.css +34 -0
- data/scaffolds/blog/_templates/syntax/google_prettify/sons-of-obsidian.css +117 -0
- data/scaffolds/blog/_templates/syntax/google_prettify/sunburst.css +51 -0
- data/scaffolds/blog/_templates/syntax/google_prettify/twitter-bootstrap.css +30 -0
- data/scaffolds/blog/_templates/themes/twitter/bootstrap/css/bootstrap.min.css +689 -0
- data/scaffolds/blog/_templates/themes/twitter/bootstrap/img/glyphicons-halflings-white.png +0 -0
- data/scaffolds/blog/_templates/themes/twitter/bootstrap/img/glyphicons-halflings.png +0 -0
- data/scaffolds/blog/_templates/themes/twitter/css/style.css +68 -0
- data/scaffolds/blog/_templates/themes/twitter/layouts/default.html +64 -0
- data/scaffolds/blog/_templates/themes/twitter/layouts/page.html +13 -0
- data/scaffolds/blog/_templates/themes/twitter/layouts/post.html +55 -0
- data/scaffolds/blog/_templates/themes/twitter/manifest.yml +11 -0
- data/scaffolds/blog/about.md +5 -0
- data/scaffolds/blog/archive.html +11 -0
- data/scaffolds/blog/categories.html +21 -0
- data/scaffolds/blog/config.ru +9 -0
- data/scaffolds/blog/index.html +13 -0
- data/scaffolds/blog/pages.html +14 -0
- data/scaffolds/blog/tags.html +21 -0
- data/scaffolds/layout.html +3 -0
- data/scaffolds/page.html +6 -0
- data/scaffolds/post.html +8 -0
- data/scaffolds/theme/css/style.css +0 -0
- data/scaffolds/theme/images/.gitkeep +0 -0
- data/scaffolds/theme/layouts/default.html +17 -0
- data/scaffolds/theme/layouts/page.html +7 -0
- data/scaffolds/theme/layouts/post.html +8 -0
- data/scaffolds/theme/partials/.gitkeep +0 -0
- data/spec/db_spec.rb +88 -0
- data/spec/page_spec.rb +200 -0
- data/spec/parsers/layouts_spec.rb +32 -0
- data/spec/parsers/pages_spec.rb +97 -0
- data/spec/parsers/posts_spec.rb +301 -0
- data/spec/parsers/routes_spec.rb +45 -0
- data/spec/parsers/site_spec.rb +32 -0
- data/spec/setup_spec.rb +72 -0
- data/spec/spec_helper.rb +23 -0
- data/system_partials/analytics/getclicky +12 -0
- data/system_partials/analytics/google +11 -0
- data/system_partials/comments/disqus +13 -0
- data/system_partials/comments/facebook +9 -0
- data/system_partials/comments/intensedebate +6 -0
- data/system_partials/comments/livefyre +6 -0
- data/system_partials/syntax/google_prettify +11 -0
- metadata +84 -23
- data/lib/ruhoh/client.rb +0 -28
- data/lib/ruhoh/preview.rb +0 -36
- data/lib/ruhoh/templaters/helper_mustache.rb +0 -109
- data/lib/ruhoh/templaters/templater.rb +0 -39
data/lib/ruhoh/db.rb
CHANGED
@@ -3,24 +3,12 @@ require "observer"
|
|
3
3
|
class Ruhoh
|
4
4
|
|
5
5
|
# Public: Database class for interacting with "data" in Ruhoh.
|
6
|
-
#
|
7
6
|
class DB
|
8
|
-
|
9
7
|
class << self
|
10
8
|
include Observable
|
11
|
-
|
9
|
+
WhiteList = [:site, :posts, :drafts, :pages, :routes, :layouts, :partials]
|
10
|
+
self.__send__ :attr_reader, *WhiteList
|
12
11
|
|
13
|
-
# Note this is class-level so you have to call it manually.
|
14
|
-
def initialize
|
15
|
-
@site = ''
|
16
|
-
@routes = ''
|
17
|
-
@posts = ''
|
18
|
-
@pages = ''
|
19
|
-
@layouts = ''
|
20
|
-
@partials = ''
|
21
|
-
self.update!
|
22
|
-
end
|
23
|
-
|
24
12
|
def update(name)
|
25
13
|
self.instance_variable_set("@#{name}",
|
26
14
|
case name
|
@@ -30,6 +18,8 @@ class Ruhoh
|
|
30
18
|
Ruhoh::Parsers::Routes.generate
|
31
19
|
when :posts
|
32
20
|
Ruhoh::Parsers::Posts.generate
|
21
|
+
when :drafts
|
22
|
+
Ruhoh::Parsers::Drafts.generate
|
33
23
|
when :pages
|
34
24
|
Ruhoh::Parsers::Pages.generate
|
35
25
|
when :layouts
|
@@ -45,9 +35,9 @@ class Ruhoh
|
|
45
35
|
end
|
46
36
|
|
47
37
|
def update!
|
48
|
-
|
49
|
-
self.__send__ :update, var
|
50
|
-
|
38
|
+
WhiteList.each do |var|
|
39
|
+
self.__send__ :update, var
|
40
|
+
end
|
51
41
|
end
|
52
42
|
|
53
43
|
end #self
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'aws/s3'
|
2
|
+
|
3
|
+
class Ruhoh
|
4
|
+
|
5
|
+
module Deployers
|
6
|
+
|
7
|
+
# Deploy to Amazon S3
|
8
|
+
# See http://amazon.rubyforge.org/ for usage.
|
9
|
+
class AmazonS3 < AWS::S3::S3Object
|
10
|
+
|
11
|
+
def initialize
|
12
|
+
credentials = Ruhoh::Utils.parse_file_as_yaml(Ruhoh.paths.site_source, "_deploy.yml")['s3']
|
13
|
+
self.connect(credentials)
|
14
|
+
self.ensure_bucket(credentials["bucket"])
|
15
|
+
#set_current_bucket_to(credentials["bucket"])
|
16
|
+
@bucket = credentials["bucket"]
|
17
|
+
end
|
18
|
+
|
19
|
+
def connect(credentials)
|
20
|
+
AWS::S3::Base.establish_connection!({
|
21
|
+
:access_key_id => credentials["access_key_id"],
|
22
|
+
:secret_access_key => credentials["secret_access_key"]
|
23
|
+
})
|
24
|
+
end
|
25
|
+
|
26
|
+
def deploy(compiled_directory)
|
27
|
+
FileUtils.cd(compiled_directory) {
|
28
|
+
Dir.glob("**/**") do |filepath|
|
29
|
+
next if FileTest.directory?(file)
|
30
|
+
self.store(filepath)
|
31
|
+
end
|
32
|
+
}
|
33
|
+
end
|
34
|
+
|
35
|
+
def ensure_bucket(bucket)
|
36
|
+
AWS::S3::Bucket.find(bucket)
|
37
|
+
rescue
|
38
|
+
Ruhoh::Friend.say {
|
39
|
+
yellow "'#{@bucket}' bucket not found, trying to create..."
|
40
|
+
}
|
41
|
+
AWS::S3::Bucket.create(bucket, :access => :public_read)
|
42
|
+
|
43
|
+
if AWS::S3::Service.response.success?
|
44
|
+
Ruhoh::Friend.say { green "Bucket created!" }
|
45
|
+
else
|
46
|
+
Ruhoh::Friend.say {
|
47
|
+
red "Bucket creation failed!"
|
48
|
+
plain "Perhaps you will need to manually create the bucket."
|
49
|
+
}
|
50
|
+
exit
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# save/update a file to s3
|
55
|
+
def store(filepath)
|
56
|
+
File.open(filepath) do |file|
|
57
|
+
AWS::S3::S3Object.store(filepath, file, @bucket, :access => :public_read)
|
58
|
+
end
|
59
|
+
|
60
|
+
if AWS::S3::Service.response.success?
|
61
|
+
Ruhoh::Friend.say { green "#{filepath}: success!" }
|
62
|
+
else
|
63
|
+
Ruhoh::Friend.say { green "#{filepath}: failure!" }
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
end #S3
|
68
|
+
|
69
|
+
end #Deployers
|
70
|
+
|
71
|
+
end #Ruhoh
|
data/lib/ruhoh/friend.rb
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
class Ruhoh
|
2
|
+
|
3
|
+
# The Friend is good for conversation.
|
4
|
+
# He tells you what's going on.
|
5
|
+
# Implementation is largely copied from rspec gem: http://rspec.info/
|
6
|
+
class Friend
|
7
|
+
|
8
|
+
class << self
|
9
|
+
|
10
|
+
def say(&block)
|
11
|
+
self.instance_eval(&block)
|
12
|
+
end
|
13
|
+
|
14
|
+
# TODO: Adds ability to disable if color is not supported?
|
15
|
+
def color_enabled?
|
16
|
+
true
|
17
|
+
end
|
18
|
+
|
19
|
+
def list(caption, listings)
|
20
|
+
red(" " + caption)
|
21
|
+
listings.each do |pair|
|
22
|
+
cyan(" - " + pair[0])
|
23
|
+
cyan(" " + pair[1])
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def color(text, color_code)
|
28
|
+
puts color_enabled? ? "#{color_code}#{text}\e[0m" : text
|
29
|
+
end
|
30
|
+
|
31
|
+
def plain(text)
|
32
|
+
puts text
|
33
|
+
end
|
34
|
+
|
35
|
+
def bold(text)
|
36
|
+
color(text, "\e[1m")
|
37
|
+
end
|
38
|
+
|
39
|
+
def red(text)
|
40
|
+
color(text, "\e[31m")
|
41
|
+
end
|
42
|
+
|
43
|
+
def green(text)
|
44
|
+
color(text, "\e[32m")
|
45
|
+
end
|
46
|
+
|
47
|
+
def yellow(text)
|
48
|
+
color(text, "\e[33m")
|
49
|
+
end
|
50
|
+
|
51
|
+
def blue(text)
|
52
|
+
color(text, "\e[34m")
|
53
|
+
end
|
54
|
+
|
55
|
+
def magenta(text)
|
56
|
+
color(text, "\e[35m")
|
57
|
+
end
|
58
|
+
|
59
|
+
def cyan(text)
|
60
|
+
color(text, "\e[36m")
|
61
|
+
end
|
62
|
+
|
63
|
+
def white(text)
|
64
|
+
color(text, "\e[37m")
|
65
|
+
end
|
66
|
+
|
67
|
+
end #self
|
68
|
+
|
69
|
+
end #Friend
|
70
|
+
|
71
|
+
end #Ruhoh
|
data/lib/ruhoh/page.rb
CHANGED
@@ -1,35 +1,59 @@
|
|
1
1
|
class Ruhoh
|
2
2
|
|
3
3
|
class Page
|
4
|
-
attr_reader :data, :content, :sub_layout, :master_layout
|
4
|
+
attr_reader :id, :data, :content, :sub_layout, :master_layout
|
5
|
+
attr_accessor :templater, :converter
|
5
6
|
|
7
|
+
def initialize
|
8
|
+
@templater = Ruhoh::Templaters::Base
|
9
|
+
@converter = Ruhoh::Converter
|
10
|
+
end
|
11
|
+
|
6
12
|
# Public: Change this page using an id.
|
7
13
|
def change(id)
|
8
14
|
@data = nil
|
9
|
-
|
15
|
+
|
16
|
+
@data = if id =~ Regexp.new("^#{Ruhoh.folders.posts}")
|
17
|
+
Ruhoh::DB.posts['dictionary'][id]
|
18
|
+
elsif id =~ Regexp.new("^#{Ruhoh.folders.drafts}")
|
19
|
+
Ruhoh::DB.drafts[id]
|
20
|
+
else
|
21
|
+
Ruhoh::DB.pages[id]
|
22
|
+
end
|
23
|
+
|
10
24
|
raise "Page #{id} not found in database" unless @data
|
11
25
|
@id = id
|
12
26
|
end
|
13
27
|
|
14
28
|
# Public: Change this page using a URL.
|
15
29
|
def change_with_url(url)
|
16
|
-
|
17
|
-
|
30
|
+
id = if url =~ Regexp.new("^/#{Ruhoh.folders.drafts}")
|
31
|
+
url.gsub(/^\//,'')
|
32
|
+
else
|
33
|
+
Ruhoh::DB.routes[url]
|
34
|
+
end
|
35
|
+
|
18
36
|
raise "Page id not found for url: #{url}" unless id
|
19
37
|
self.change(id)
|
20
38
|
end
|
21
39
|
|
22
40
|
def render
|
41
|
+
raise "ID is null: Id must be set via page.change(id) or page.change_with_url(url)" if @id.nil?
|
23
42
|
self.process_layouts
|
24
43
|
self.process_content
|
25
|
-
|
44
|
+
@templater.render(self)
|
26
45
|
end
|
27
46
|
|
28
47
|
def process_layouts
|
29
|
-
|
30
|
-
|
31
|
-
|
48
|
+
raise "ID is null: Id must be set via page.change(id) or page.change_with_url(url)" if @id.nil?
|
49
|
+
if @data['layout']
|
50
|
+
@sub_layout = Ruhoh::DB.layouts[@data['layout']]
|
51
|
+
raise "Layout does not exist: #{@data['layout']}" unless @sub_layout
|
52
|
+
end
|
53
|
+
|
54
|
+
if @sub_layout && @sub_layout['data']['layout']
|
32
55
|
@master_layout = Ruhoh::DB.layouts[@sub_layout['data']['layout']]
|
56
|
+
raise "Layout does not exist: #{@sub_layout['data']['layout']}" unless @master_layout
|
33
57
|
end
|
34
58
|
end
|
35
59
|
|
@@ -37,14 +61,18 @@ class Ruhoh
|
|
37
61
|
# in order to invoke converters on the result.
|
38
62
|
# Converters (markdown) always choke on the templating language.
|
39
63
|
def process_content
|
40
|
-
|
41
|
-
|
42
|
-
@
|
64
|
+
raise "ID is null: Id must be set via page.change(id) or page.change_with_url(url)" if @id.nil?
|
65
|
+
data = Ruhoh::Utils.parse_file(Ruhoh.paths.site_source, @id)
|
66
|
+
raise "Invalid Frontmatter in page: #{@id}" if data.empty?
|
67
|
+
|
68
|
+
@content = @templater.parse(data['content'], self)
|
69
|
+
@content = @converter.convert(self)
|
43
70
|
end
|
44
71
|
|
45
72
|
# Public: Return page attributes suitable for inclusion in the
|
46
73
|
# 'payload' of the given templater.
|
47
74
|
def attributes
|
75
|
+
raise "ID is null: Id must be set via page.change(id) or page.change_with_url(url)" if @id.nil?
|
48
76
|
@data['content'] = @content
|
49
77
|
@data
|
50
78
|
end
|
@@ -53,7 +81,9 @@ class Ruhoh
|
|
53
81
|
#
|
54
82
|
# Returns: [String] The relative path to the compiled file for this page.
|
55
83
|
def compiled_path
|
84
|
+
raise "ID is null: Id must be set via page.change(id) or page.change_with_url(url)" if @id.nil?
|
56
85
|
path = CGI.unescape(@data['url']).gsub(/^\//, '') #strip leading slash.
|
86
|
+
path = "index.html" if path.empty?
|
57
87
|
path += '/index.html' unless path =~ /\.html$/
|
58
88
|
path
|
59
89
|
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
class Ruhoh
|
2
|
+
module Parsers
|
3
|
+
module Drafts
|
4
|
+
|
5
|
+
def self.generate
|
6
|
+
raise "Ruhoh.config cannot be nil.\n To set config call: Ruhoh.setup" unless Ruhoh.config
|
7
|
+
|
8
|
+
dictionary = {}
|
9
|
+
invalid = []
|
10
|
+
|
11
|
+
self.files.each do |filename|
|
12
|
+
parsed_page = Ruhoh::Utils.parse_file(filename)
|
13
|
+
if parsed_page.empty?
|
14
|
+
error = "Invalid YAML Front Matter. Ensure this page has valid YAML, even if it's empty."
|
15
|
+
invalid << [filename, error] ; next
|
16
|
+
end
|
17
|
+
|
18
|
+
data = parsed_page['data']
|
19
|
+
data['id'] = filename
|
20
|
+
data['url'] = "/#{filename}"
|
21
|
+
dictionary[filename] = data
|
22
|
+
end
|
23
|
+
|
24
|
+
self.report(dictionary, invalid)
|
25
|
+
dictionary
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.files
|
29
|
+
FileUtils.cd(Ruhoh.paths.site_source) {
|
30
|
+
return Dir["#{Ruhoh.folders.drafts}/**/*.*"].select { |filename|
|
31
|
+
next if FileTest.directory?(filename)
|
32
|
+
next if ['.'].include? filename[0]
|
33
|
+
true
|
34
|
+
}
|
35
|
+
}
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.report(dictionary, invalid)
|
39
|
+
output = "#{dictionary.count}/#{dictionary.count + invalid.count} drafts processed."
|
40
|
+
if dictionary.empty? && invalid.empty?
|
41
|
+
Ruhoh::Friend.say { plain "0 drafts to process." }
|
42
|
+
elsif invalid.empty?
|
43
|
+
Ruhoh::Friend.say { green output }
|
44
|
+
else
|
45
|
+
Ruhoh::Friend.say {
|
46
|
+
yellow output
|
47
|
+
list "Drafts not processed:", invalid
|
48
|
+
}
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
end #Drafts
|
53
|
+
end #Parsers
|
54
|
+
end #Ruhoh
|
@@ -1,25 +1,30 @@
|
|
1
1
|
class Ruhoh
|
2
|
-
|
3
2
|
module Parsers
|
4
|
-
|
5
3
|
module Layouts
|
6
4
|
|
7
5
|
# Generate layouts only from the active theme.
|
8
6
|
def self.generate
|
9
7
|
layouts = {}
|
8
|
+
|
9
|
+
self.files.each do |filename|
|
10
|
+
id = File.basename(filename, File.extname(filename))
|
11
|
+
layouts[id] = Ruhoh::Utils.parse_file(Ruhoh.paths.layouts, filename)
|
12
|
+
raise "Invalid Frontmatter in layout: #{filename}" if layouts[id].empty?
|
13
|
+
end
|
14
|
+
|
15
|
+
layouts
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.files
|
10
19
|
FileUtils.cd(Ruhoh.paths.layouts) {
|
11
|
-
Dir
|
20
|
+
return Dir["**/*.*"].select { |filename|
|
12
21
|
next if FileTest.directory?(filename)
|
13
22
|
next if ['_','.'].include? filename[0]
|
14
|
-
|
15
|
-
layouts[id] = Ruhoh::Utils.parse_file(Ruhoh.paths.layouts, filename)
|
23
|
+
true
|
16
24
|
}
|
17
25
|
}
|
18
|
-
layouts
|
19
26
|
end
|
20
|
-
|
27
|
+
|
21
28
|
end #Layouts
|
22
|
-
|
23
29
|
end #Parsers
|
24
|
-
|
25
30
|
end #Ruhoh
|
data/lib/ruhoh/parsers/pages.rb
CHANGED
@@ -8,59 +8,71 @@ class Ruhoh
|
|
8
8
|
#
|
9
9
|
def self.generate
|
10
10
|
raise "Ruhoh.config cannot be nil.\n To set config call: Ruhoh.setup" unless Ruhoh.config
|
11
|
-
puts "=> Generating Pages..."
|
12
11
|
|
13
|
-
|
12
|
+
pages = self.files
|
13
|
+
invalid = []
|
14
14
|
dictionary = {}
|
15
|
-
total_pages = 0
|
16
|
-
FileUtils.cd(Ruhoh.paths.site_source) {
|
17
|
-
Dir.glob("**/*.*") { |filename|
|
18
|
-
next unless self.is_valid_page?(filename)
|
19
|
-
total_pages += 1
|
20
15
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
16
|
+
pages.each do |filename|
|
17
|
+
parsed_page = Ruhoh::Utils.parse_file(filename)
|
18
|
+
if parsed_page.empty?
|
19
|
+
error = "Invalid Yaml Front Matter.\n Ensure this page has valid YAML, even if it's empty."
|
20
|
+
invalid << [filename, error] ; next
|
21
|
+
end
|
22
|
+
|
23
|
+
parsed_page['data']['id'] = filename
|
24
|
+
parsed_page['data']['url'] = self.permalink(parsed_page['data'])
|
25
|
+
parsed_page['data']['title'] = parsed_page['data']['title'] || self.titleize(filename)
|
26
26
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
27
|
+
dictionary[filename] = parsed_page['data']
|
28
|
+
end
|
29
|
+
|
30
|
+
report = "#{pages.count - invalid.count }/#{pages.count} pages processed."
|
31
|
+
|
32
|
+
if pages.count.zero? && invalid.empty?
|
33
|
+
Ruhoh::Friend.say { plain "0 pages to process." }
|
34
|
+
elsif invalid.empty?
|
35
|
+
Ruhoh::Friend.say { green report }
|
36
|
+
else
|
37
|
+
Ruhoh::Friend.say {
|
38
|
+
yellow report
|
39
|
+
list "Pages not processed:", invalid
|
34
40
|
}
|
35
|
-
|
41
|
+
end
|
36
42
|
|
37
|
-
if invalid_pages.empty?
|
38
|
-
puts "=> #{total_pages - invalid_pages.count }/#{total_pages} pages processed."
|
39
|
-
else
|
40
|
-
puts "=> Invalid pages not processed:"
|
41
|
-
puts invalid_pages.to_yaml
|
42
|
-
end
|
43
|
-
|
44
43
|
dictionary
|
45
44
|
end
|
46
|
-
|
47
|
-
def self.
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
45
|
+
|
46
|
+
def self.files
|
47
|
+
FileUtils.cd(Ruhoh.paths.site_source) {
|
48
|
+
return Dir["**/*.*"].select { |filename|
|
49
|
+
next unless self.is_valid_page?(filename)
|
50
|
+
true
|
51
|
+
}
|
52
|
+
}
|
53
|
+
end
|
54
|
+
|
55
|
+
def self.is_valid_page?(filepath)
|
56
|
+
return false if FileTest.directory?(filepath)
|
57
|
+
return false if ['_', '.'].include? filepath[0]
|
58
|
+
return false if Ruhoh.filters.pages['names'].include? filepath
|
59
|
+
Ruhoh.filters.pages['regexes'].each {|regex| return false if filepath =~ regex }
|
52
60
|
true
|
53
61
|
end
|
54
62
|
|
55
63
|
def self.titleize(filename)
|
56
|
-
File.basename( filename, File.extname(filename) )
|
64
|
+
name = File.basename( filename, File.extname(filename) )
|
65
|
+
name = filename.split('/')[-2] if name == 'index' && !filename.index('/').nil?
|
66
|
+
name.gsub(/[\W\_]/, ' ').gsub(/\b\w/){$&.upcase}
|
57
67
|
end
|
58
68
|
|
59
69
|
def self.permalink(page)
|
60
70
|
url = '/' + page['id'].gsub(File.extname(page['id']), '.html')
|
61
|
-
|
62
71
|
# sanitize url
|
63
72
|
url = url.split('/').reject{ |part| part =~ /^\.+$/ }.join('/')
|
73
|
+
url.gsub!(/\/index.html$/, '')
|
74
|
+
url = "/" if url.empty?
|
75
|
+
|
64
76
|
url
|
65
77
|
end
|
66
78
|
|
@@ -5,7 +5,19 @@ class Ruhoh
|
|
5
5
|
module Partials
|
6
6
|
|
7
7
|
def self.generate
|
8
|
-
self.
|
8
|
+
self.system_partials.merge(self.global_partials).merge(self.theme_partials)
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.theme_partials
|
12
|
+
self.process(Ruhoh.paths.partials)
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.global_partials
|
16
|
+
self.process(Ruhoh.paths.global_partials)
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.system_partials
|
20
|
+
self.process(File.join(Ruhoh::Root, 'system_partials'))
|
9
21
|
end
|
10
22
|
|
11
23
|
def self.process(path)
|
@@ -16,7 +28,7 @@ class Ruhoh
|
|
16
28
|
Dir.glob("**/*").each { |filename|
|
17
29
|
next if FileTest.directory?(filename)
|
18
30
|
next if ['.'].include? filename[0]
|
19
|
-
partials[filename] =
|
31
|
+
File.open(filename) { |f| partials[filename] = f.read }
|
20
32
|
}
|
21
33
|
}
|
22
34
|
partials
|