ruhoh 1.0 → 1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +2 -2
- data/README.md +16 -0
- data/bin/ruhoh +5 -1
- data/history.json +19 -0
- data/lib/ruhoh/client/client.rb +35 -48
- data/lib/ruhoh/client/console_methods.rb +9 -0
- data/lib/ruhoh/client/help.yml +0 -4
- data/lib/ruhoh/config.rb +3 -2
- data/lib/ruhoh/db.rb +7 -28
- data/lib/ruhoh/page.rb +1 -1
- data/lib/ruhoh/parsers/pages.rb +2 -4
- data/lib/ruhoh/parsers/partials.rb +11 -2
- data/lib/ruhoh/parsers/payload.rb +2 -2
- data/lib/ruhoh/parsers/posts.rb +21 -24
- data/lib/ruhoh/parsers/scaffolds.rb +35 -0
- data/lib/ruhoh/paths.rb +11 -3
- data/lib/ruhoh/previewer.rb +3 -2
- data/lib/ruhoh/urls.rb +5 -1
- data/lib/ruhoh/version.rb +1 -1
- data/lib/ruhoh.rb +3 -1
- data/ruhoh.gemspec +24 -25
- data/spec/config_spec.rb +3 -3
- data/spec/db_spec.rb +5 -9
- data/spec/page_spec.rb +1 -1
- data/spec/parsers/layouts_spec.rb +0 -4
- data/spec/parsers/pages_spec.rb +44 -36
- data/spec/parsers/posts_spec.rb +2 -7
- data/spec/parsers/routes_spec.rb +0 -7
- data/spec/parsers/site_spec.rb +2 -7
- data/spec/setup_spec.rb +0 -3
- data/spec/spec_helper.rb +10 -6
- data/spec/support/shared_contexts.rb +24 -0
- data/{dash.html → system/dash.html} +0 -0
- data/system/partials/categories_list.html +3 -0
- data/system/partials/pages_list.html +7 -0
- data/system/partials/posts_collate.html +9 -0
- data/system/partials/posts_list.html +1 -0
- data/system/partials/posts_summary.html +30 -0
- data/system/partials/tags_list.html +3 -0
- data/{scaffolds → system/scaffolds}/draft.html +0 -0
- data/{scaffolds → system/scaffolds}/layout.html +0 -0
- data/{scaffolds → system/scaffolds}/page.html +0 -0
- data/{scaffolds → system/scaffolds}/post.html +0 -0
- data/{widgets → system/widgets}/analytics/config.yml +0 -0
- data/{widgets → system/widgets}/analytics/layouts/getclicky.html +0 -0
- data/{widgets → system/widgets}/analytics/layouts/google.html +0 -0
- data/{widgets → system/widgets}/comments/config.yml +0 -0
- data/{widgets → system/widgets}/comments/layouts/disqus.html +0 -0
- data/{widgets → system/widgets}/comments/layouts/facebook.html +0 -0
- data/{widgets → system/widgets}/comments/layouts/intensedebate.html +0 -0
- data/{widgets → system/widgets}/comments/layouts/livefyre.html +0 -0
- data/{widgets → system/widgets}/google_prettify/config.yml +0 -0
- data/{widgets → system/widgets}/google_prettify/layouts/google_prettify.html +0 -0
- metadata +32 -42
- data/scaffolds/theme/javascripts/.gitkeep +0 -0
- data/scaffolds/theme/layouts/default.html +0 -15
- data/scaffolds/theme/layouts/page.html +0 -7
- data/scaffolds/theme/layouts/post.html +0 -8
- data/scaffolds/theme/media/.gitkeep +0 -0
- data/scaffolds/theme/partials/.gitkeep +0 -0
- data/scaffolds/theme/stylesheets/style.css +0 -0
- data/scaffolds/theme/theme.yml +0 -27
- data/scaffolds/theme/widgets/.gitkeep +0 -0
data/Gemfile
CHANGED
@@ -3,11 +3,11 @@ gemspec
|
|
3
3
|
|
4
4
|
gem 'rack', "~> 1.4"
|
5
5
|
gem 'directory_watcher', "~> 1.4"
|
6
|
-
gem 'psych', "~> 1.3"
|
6
|
+
gem 'psych', "~> 1.3", :platforms => [:ruby_18, :mingw_18]
|
7
7
|
gem 'redcarpet', "~> 2.1"
|
8
8
|
gem 'nokogiri', "~> 1.5"
|
9
9
|
|
10
10
|
group :development do
|
11
|
-
gem 'rspec'
|
11
|
+
gem 'rspec', "~> 2.11"
|
12
12
|
gem 'rake'
|
13
13
|
end
|
data/README.md
CHANGED
@@ -3,6 +3,22 @@
|
|
3
3
|
<http://ruhoh.com>
|
4
4
|
|
5
5
|
### Usage
|
6
|
+
|
6
7
|
$ gem install ruhoh
|
7
8
|
$ ruhoh help
|
8
9
|
|
10
|
+
### Platforms
|
11
|
+
|
12
|
+
ruhoh is tested with ruby 1.9.2 on mac OSX Lion.
|
13
|
+
ruhoh runs in production with ruby 1.9.2 on Ubuntu 10.04.4 LTS.
|
14
|
+
|
15
|
+
ruby 1.8.7 will not be (consciously) supported unless enough users bother me about it.
|
16
|
+
|
17
|
+
**Windows**
|
18
|
+
|
19
|
+
ruhoh should run on Windows with a few considerations:
|
20
|
+
|
21
|
+
If you run into trouble with YAML and psych see: https://github.com/ruhoh/ruhoh.rb/issues/54
|
22
|
+
More help is available here: https://github.com/ruhoh/ruhoh.rb/issues/search?q=windows
|
23
|
+
|
24
|
+
I can't easily test ruhoh on a Windows machine, so please consider contributing back to the community for running on Windows.
|
data/bin/ruhoh
CHANGED
@@ -8,7 +8,7 @@ require 'ruhoh/client/client'
|
|
8
8
|
|
9
9
|
require 'optparse'
|
10
10
|
|
11
|
-
Options = Struct.new(:title, :date, :ext, :verbose)
|
11
|
+
Options = Struct.new(:title, :date, :ext, :hg, :verbose)
|
12
12
|
options = Options.new
|
13
13
|
|
14
14
|
opt_parser = OptionParser.new do |opts|
|
@@ -18,6 +18,10 @@ opt_parser = OptionParser.new do |opts|
|
|
18
18
|
options.ext = ext
|
19
19
|
end
|
20
20
|
|
21
|
+
opts.on("--hg", "Use mercurial (hg) instead of git for source control.") do
|
22
|
+
options.hg = true
|
23
|
+
end
|
24
|
+
|
21
25
|
opts.on("-v", "--[no-]verbose", "Run verbosely. For pages, shows extra title, url meta-data.") do |v|
|
22
26
|
options.verbose = v
|
23
27
|
end
|
data/history.json
CHANGED
@@ -1,4 +1,23 @@
|
|
1
1
|
[
|
2
|
+
{
|
3
|
+
"version" : "1.1",
|
4
|
+
"date" : "26.08.2012",
|
5
|
+
"changes" : [
|
6
|
+
"All urls are normalized to never have trailing slashes. Fixes unfound urls when user forgets to add trailing slash to permalink formats.",
|
7
|
+
"Default partials have been moved to the 'system' level; ruhoh gem. User may still override them at the blog/theme level.",
|
8
|
+
"Partial files may now have extensions but wil still be referenced by name excluding extension.",
|
9
|
+
"(Internal) All system level assets are namespaced into the 'system' folder.",
|
10
|
+
"Theme scaffolding has been removed from the command line tool. `ruhoh theme <name>`"
|
11
|
+
],
|
12
|
+
"features" : [
|
13
|
+
"@MrWerewolf adds ability to use custom blog scaffold url. Supports mercurial(hg) repository endpoints.",
|
14
|
+
"Add IRB console for ruhoh environment: `ruhoh console` ",
|
15
|
+
"Add scaffolds for file generation: post, page, layout, etc. System level scaffolds may be overwritten by blog level files."
|
16
|
+
],
|
17
|
+
"bugs" : [
|
18
|
+
"@MrWerewolf removes psych gem dependency for ruby 1.9+ users."
|
19
|
+
]
|
20
|
+
},
|
2
21
|
{
|
3
22
|
"version" : "1.0",
|
4
23
|
"date" : "22.08.2012",
|
data/lib/ruhoh/client/client.rb
CHANGED
@@ -1,14 +1,16 @@
|
|
1
1
|
require 'ruhoh/compiler'
|
2
|
+
require 'ruhoh/client/console_methods'
|
3
|
+
require 'irb'
|
2
4
|
|
3
5
|
class Ruhoh
|
6
|
+
|
4
7
|
class Client
|
5
8
|
|
6
9
|
Paths = Struct.new(:page_template, :draft_template, :post_template, :layout_template, :theme_template)
|
7
|
-
|
10
|
+
DefaultBlogScaffold = 'git://github.com/ruhoh/blog.git'
|
8
11
|
|
9
12
|
def initialize(data)
|
10
13
|
@iterator = 0
|
11
|
-
self.setup_paths
|
12
14
|
self.setup_options(data)
|
13
15
|
|
14
16
|
cmd = (data[:args][0] == 'new') ? 'blog' : (data[:args][0] || 'help')
|
@@ -26,6 +28,14 @@ class Ruhoh
|
|
26
28
|
self.__send__(cmd)
|
27
29
|
end
|
28
30
|
|
31
|
+
# Thanks rails! https://github.com/rails/rails/blob/master/railties/lib/rails/commands/console.rb
|
32
|
+
def console
|
33
|
+
ARGV.clear # IRB throws an error otherwise.
|
34
|
+
require 'pp'
|
35
|
+
IRB::ExtendCommandBundle.send :include, Ruhoh::ConsoleMethods
|
36
|
+
IRB.start
|
37
|
+
end
|
38
|
+
|
29
39
|
def setup_options(data)
|
30
40
|
@args = data[:args]
|
31
41
|
@options = data[:options]
|
@@ -33,15 +43,6 @@ class Ruhoh
|
|
33
43
|
@options.ext = (@options.ext || 'md').gsub('.', '')
|
34
44
|
end
|
35
45
|
|
36
|
-
def setup_paths
|
37
|
-
@paths = Paths.new
|
38
|
-
@paths.page_template = File.join(Ruhoh::Root, "scaffolds", "page.html")
|
39
|
-
@paths.draft_template = File.join(Ruhoh::Root, "scaffolds", "draft.html")
|
40
|
-
@paths.post_template = File.join(Ruhoh::Root, "scaffolds", "post.html")
|
41
|
-
@paths.layout_template = File.join(Ruhoh::Root, "scaffolds", "layout.html")
|
42
|
-
@paths.theme_template = File.join(Ruhoh::Root, "scaffolds", "theme")
|
43
|
-
end
|
44
|
-
|
45
46
|
# Internal: Show Client Utility help documentation.
|
46
47
|
def help
|
47
48
|
file = File.join(Ruhoh::Root, 'lib', 'ruhoh', 'client', 'help.yml')
|
@@ -78,9 +79,10 @@ class Ruhoh
|
|
78
79
|
@iterator += 1
|
79
80
|
end while File.exist?(filename)
|
80
81
|
|
81
|
-
|
82
|
+
Ruhoh::DB.update(:scaffolds)
|
82
83
|
|
83
|
-
|
84
|
+
FileUtils.mkdir_p File.dirname(filename)
|
85
|
+
output = Ruhoh::DB.scaffolds["#{type}.html"].to_s
|
84
86
|
output = output.gsub('{{DATE}}', Ruhoh::Parsers::Posts.formatted_date(Time.now))
|
85
87
|
File.open(filename, 'w:UTF-8') {|f| f.puts output }
|
86
88
|
|
@@ -105,12 +107,12 @@ class Ruhoh
|
|
105
107
|
if File.exist?(filename)
|
106
108
|
abort("Create new page: aborted!") if ask("#{filename} already exists. Do you want to overwrite?", ['y', 'n']) == 'n'
|
107
109
|
end
|
108
|
-
|
110
|
+
|
111
|
+
Ruhoh::DB.update(:scaffolds)
|
112
|
+
|
109
113
|
FileUtils.mkdir_p File.dirname(filename)
|
110
|
-
File.open(
|
111
|
-
|
112
|
-
page.puts template.read
|
113
|
-
end
|
114
|
+
File.open(filename, 'w:UTF-8') do |page|
|
115
|
+
page.puts Ruhoh::DB.scaffolds['page.html'].to_s
|
114
116
|
end
|
115
117
|
|
116
118
|
Ruhoh::Friend.say {
|
@@ -140,6 +142,8 @@ class Ruhoh
|
|
140
142
|
# Public: Create a new blog at the directory provided.
|
141
143
|
def blog
|
142
144
|
name = @args[1]
|
145
|
+
scaffold = @args.length > 2 ? @args[2] : DefaultBlogScaffold
|
146
|
+
useHg = @options.hg
|
143
147
|
Ruhoh::Friend.say {
|
144
148
|
red "Please specify a directory path."
|
145
149
|
plain " ex: ruhoh new the-blogist"
|
@@ -156,9 +160,16 @@ class Ruhoh
|
|
156
160
|
|
157
161
|
Ruhoh::Friend.say {
|
158
162
|
plain "Trying this command:"
|
159
|
-
cyan " git clone #{BlogScaffold} #{target_directory}"
|
160
163
|
|
161
|
-
if
|
164
|
+
if useHg
|
165
|
+
cyan " hg clone #{scaffold} #{target_directory}"
|
166
|
+
success = system('hg', 'clone', scaffold, target_directory)
|
167
|
+
else
|
168
|
+
cyan " git clone #{scaffold} #{target_directory}"
|
169
|
+
success = system('git', 'clone', scaffold, target_directory)
|
170
|
+
end
|
171
|
+
|
172
|
+
if success
|
162
173
|
green "Success! Now do..."
|
163
174
|
cyan " cd #{target_directory}"
|
164
175
|
cyan " rackup -p9292"
|
@@ -170,30 +181,6 @@ class Ruhoh
|
|
170
181
|
}
|
171
182
|
end
|
172
183
|
|
173
|
-
# Public: Create a new theme scaffold with the given name.
|
174
|
-
def theme
|
175
|
-
name = @args[1]
|
176
|
-
Ruhoh::Friend.say {
|
177
|
-
red "Please specify a theme name."
|
178
|
-
cyan "ex: ruhoh new theme the-rain"
|
179
|
-
exit
|
180
|
-
} if name.nil?
|
181
|
-
|
182
|
-
target_directory = File.expand_path(File.join(Ruhoh.paths.theme, '..', name.gsub(/\s/, '-').downcase))
|
183
|
-
|
184
|
-
if File.exist?(target_directory)
|
185
|
-
abort("Create new theme: \e[31mAborted!\e[0m") if ask("#{target_directory} already exists. Do you want to overwrite?", ['y', 'n']) == 'n'
|
186
|
-
end
|
187
|
-
|
188
|
-
FileUtils.mkdir target_directory unless File.exist?(target_directory)
|
189
|
-
FileUtils.cp_r "#{@paths.theme_template}/.", target_directory
|
190
|
-
|
191
|
-
Ruhoh::Friend.say {
|
192
|
-
green "New theme scaffold:"
|
193
|
-
green target_directory
|
194
|
-
}
|
195
|
-
end
|
196
|
-
|
197
184
|
# Public: Create a new layout file for the active theme.
|
198
185
|
def layout
|
199
186
|
name = @args[1]
|
@@ -208,11 +195,11 @@ class Ruhoh
|
|
208
195
|
abort("Create new layout: aborted!") if ask("#{filename} already exists. Do you want to overwrite?", ['y', 'n']) == 'n'
|
209
196
|
end
|
210
197
|
|
198
|
+
Ruhoh::DB.update(:scaffolds)
|
199
|
+
|
211
200
|
FileUtils.mkdir_p File.dirname(filename)
|
212
|
-
File.open(
|
213
|
-
|
214
|
-
page.puts template.read
|
215
|
-
end
|
201
|
+
File.open(filename, 'w:UTF-8') do |page|
|
202
|
+
page.puts Ruhoh::DB.scaffolds['layout.html'].to_s
|
216
203
|
end
|
217
204
|
|
218
205
|
Ruhoh::Friend.say {
|
data/lib/ruhoh/client/help.yml
CHANGED
data/lib/ruhoh/config.rb
CHANGED
@@ -14,8 +14,8 @@ class Ruhoh
|
|
14
14
|
:base_path
|
15
15
|
)
|
16
16
|
|
17
|
-
def self.generate
|
18
|
-
site_config = Ruhoh::Utils.parse_yaml_file(
|
17
|
+
def self.generate
|
18
|
+
site_config = Ruhoh::Utils.parse_yaml_file(Ruhoh.base, Ruhoh.names.config_data)
|
19
19
|
unless site_config
|
20
20
|
Ruhoh.log.error("Empty site_config.\nEnsure ./#{Ruhoh.names.config_data} exists and contains valid YAML")
|
21
21
|
return false
|
@@ -42,6 +42,7 @@ class Ruhoh
|
|
42
42
|
config.rss_limit = 20 if config.rss_limit.nil?
|
43
43
|
|
44
44
|
config.posts_permalink = site_config['posts']['permalink'] rescue nil
|
45
|
+
config.posts_permalink ||= "/:categories/:year/:month/:day/:title.html"
|
45
46
|
config.posts_layout = site_config['posts']['layout'] rescue nil
|
46
47
|
config.posts_layout = 'post' if config.posts_layout.nil?
|
47
48
|
excluded_posts = site_config['posts']['exclude'] rescue nil
|
data/lib/ruhoh/db.rb
CHANGED
@@ -9,44 +9,23 @@ require 'ruhoh/parsers/stylesheets'
|
|
9
9
|
require 'ruhoh/parsers/javascripts'
|
10
10
|
require 'ruhoh/parsers/payload'
|
11
11
|
require 'ruhoh/parsers/site'
|
12
|
+
require 'ruhoh/parsers/scaffolds'
|
12
13
|
|
13
14
|
class Ruhoh
|
14
15
|
# Public: Database class for interacting with "data" in Ruhoh.
|
15
16
|
class DB
|
16
|
-
WhiteList = [:site, :posts, :pages, :routes, :layouts, :partials, :widgets, :theme_config, :stylesheets, :javascripts, :payload]
|
17
|
+
WhiteList = [:site, :posts, :pages, :routes, :layouts, :partials, :widgets, :theme_config, :stylesheets, :javascripts, :payload, :scaffolds]
|
17
18
|
|
18
19
|
class << self
|
19
20
|
self.__send__ :attr_reader, *WhiteList
|
20
21
|
|
21
22
|
def update(name)
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
Ruhoh::Parsers::Site.generate
|
26
|
-
when :routes
|
27
|
-
Ruhoh::Parsers::Routes.generate
|
28
|
-
when :posts
|
29
|
-
Ruhoh::Parsers::Posts.generate
|
30
|
-
when :pages
|
31
|
-
Ruhoh::Parsers::Pages.generate
|
32
|
-
when :layouts
|
33
|
-
Ruhoh::Parsers::Layouts.generate
|
34
|
-
when :partials
|
35
|
-
Ruhoh::Parsers::Partials.generate
|
36
|
-
when :widgets
|
37
|
-
Ruhoh::Parsers::Widgets.generate
|
38
|
-
when :theme_config
|
39
|
-
Ruhoh::Parsers::ThemeConfig.generate
|
40
|
-
when :stylesheets
|
41
|
-
Ruhoh::Parsers::Stylesheets.generate
|
42
|
-
when :javascripts
|
43
|
-
Ruhoh::Parsers::Javascripts.generate
|
44
|
-
when :payload
|
45
|
-
Ruhoh::Parsers::Payload.generate
|
46
|
-
else
|
47
|
-
raise "Data type: '#{name}' is not a valid data type."
|
48
|
-
end
|
23
|
+
camelized_name = name.to_s.split('_').map {|a| a.capitalize}.join
|
24
|
+
self.instance_variable_set("@#{name}",
|
25
|
+
Ruhoh::Parsers.const_get(camelized_name).generate
|
49
26
|
)
|
27
|
+
rescue NameError
|
28
|
+
raise NameError, "Data type: '#{name}' is not a valid data type."
|
50
29
|
end
|
51
30
|
|
52
31
|
# Always regenerate a fresh payload since it
|
data/lib/ruhoh/page.rb
CHANGED
data/lib/ruhoh/parsers/pages.rb
CHANGED
@@ -67,13 +67,11 @@ class Ruhoh
|
|
67
67
|
url = name.split('/').map {|p| Ruhoh::Urls.to_url_slug(p) }.join('/')
|
68
68
|
url = "#{url}#{ext}".gsub(/index.html$/, '')
|
69
69
|
if page['permalink'] == 'pretty' || Ruhoh.config.pages_permalink == 'pretty'
|
70
|
-
url = url.gsub(/\.html$/, '
|
70
|
+
url = url.gsub(/\.html$/, '')
|
71
71
|
end
|
72
72
|
|
73
|
-
url = "#{Ruhoh.config.base_path}#{url}"
|
74
73
|
url = '/' if url.empty?
|
75
|
-
|
76
|
-
url
|
74
|
+
Ruhoh::Urls.to_url(url)
|
77
75
|
end
|
78
76
|
|
79
77
|
end # Pages
|
@@ -3,7 +3,11 @@ class Ruhoh
|
|
3
3
|
module Partials
|
4
4
|
|
5
5
|
def self.generate
|
6
|
-
self.
|
6
|
+
self.system_partials.merge(
|
7
|
+
self.global_partials
|
8
|
+
).merge(
|
9
|
+
self.theme_partials
|
10
|
+
)
|
7
11
|
end
|
8
12
|
|
9
13
|
def self.theme_partials
|
@@ -13,6 +17,10 @@ class Ruhoh
|
|
13
17
|
def self.global_partials
|
14
18
|
self.process(Ruhoh.paths.partials)
|
15
19
|
end
|
20
|
+
|
21
|
+
def self.system_partials
|
22
|
+
self.process(Ruhoh.paths.system_partials)
|
23
|
+
end
|
16
24
|
|
17
25
|
def self.process(path)
|
18
26
|
return {} unless File.exist?(path)
|
@@ -22,7 +30,8 @@ class Ruhoh
|
|
22
30
|
Dir.glob("**/*").each { |filename|
|
23
31
|
next if FileTest.directory?(filename)
|
24
32
|
next if ['.'].include? filename[0]
|
25
|
-
File.
|
33
|
+
name = filename.chomp(File.extname(filename))
|
34
|
+
File.open(filename, 'r:UTF-8') { |f| partials[name] = f.read }
|
26
35
|
}
|
27
36
|
}
|
28
37
|
partials
|
@@ -26,7 +26,7 @@ class Ruhoh
|
|
26
26
|
def self.determine_category_and_tag_urls
|
27
27
|
return nil unless Ruhoh::DB.routes && Ruhoh::DB.posts
|
28
28
|
categories_url = nil
|
29
|
-
[
|
29
|
+
[Ruhoh::Urls.to_url("categories"), Ruhoh::Urls.to_url("categories.html")].each { |url|
|
30
30
|
categories_url = url and break if Ruhoh::DB.routes.key?(url)
|
31
31
|
}
|
32
32
|
Ruhoh::DB.posts['categories'].each do |key, value|
|
@@ -34,7 +34,7 @@ class Ruhoh
|
|
34
34
|
end
|
35
35
|
|
36
36
|
tags_url = nil
|
37
|
-
[
|
37
|
+
[Ruhoh::Urls.to_url("tags"), Ruhoh::Urls.to_url("tags.html")].each { |url|
|
38
38
|
tags_url = url and break if Ruhoh::DB.routes.key?(url)
|
39
39
|
}
|
40
40
|
Ruhoh::DB.posts['tags'].each do |key, value|
|
data/lib/ruhoh/parsers/posts.rb
CHANGED
@@ -137,34 +137,31 @@ class Ruhoh
|
|
137
137
|
def self.permalink(post)
|
138
138
|
date = Date.parse(post['date'])
|
139
139
|
title = Ruhoh::Urls.to_url_slug(post['title'])
|
140
|
-
format = post['permalink'] || Ruhoh.config.posts_permalink
|
140
|
+
format = post['permalink'] || Ruhoh.config.posts_permalink
|
141
141
|
|
142
|
-
|
143
|
-
|
142
|
+
if format.include?(':')
|
143
|
+
filename = File.basename(post['id'], File.extname(post['id']))
|
144
|
+
category = Array(post['categories'])[0]
|
145
|
+
category = category.split('/').map {|c| Ruhoh::Urls.to_url_slug(c) }.join('/') if category
|
146
|
+
|
147
|
+
url = {
|
148
|
+
"year" => date.strftime("%Y"),
|
149
|
+
"month" => date.strftime("%m"),
|
150
|
+
"day" => date.strftime("%d"),
|
151
|
+
"title" => title,
|
152
|
+
"filename" => filename,
|
153
|
+
"i_day" => date.strftime("%d").to_i.to_s,
|
154
|
+
"i_month" => date.strftime("%m").to_i.to_s,
|
155
|
+
"categories" => category || '',
|
156
|
+
}.inject(format) { |result, token|
|
157
|
+
result.gsub(/:#{Regexp.escape token.first}/, token.last)
|
158
|
+
}.gsub(/\/+/, "/")
|
159
|
+
else
|
160
|
+
# Use the literal permalink if it is a non-tokenized string.
|
144
161
|
url = format.gsub(/^\//, '').split('/').map {|p| CGI::escape(p) }.join('/')
|
145
|
-
return "#{Ruhoh.config.base_path}#{url}"
|
146
162
|
end
|
147
163
|
|
148
|
-
|
149
|
-
category = Array(post['categories'])[0]
|
150
|
-
category = category.split('/').map {|c| Ruhoh::Urls.to_url_slug(c) }.join('/') if category
|
151
|
-
|
152
|
-
url = {
|
153
|
-
"year" => date.strftime("%Y"),
|
154
|
-
"month" => date.strftime("%m"),
|
155
|
-
"day" => date.strftime("%d"),
|
156
|
-
"title" => title,
|
157
|
-
"filename" => filename,
|
158
|
-
"i_day" => date.strftime("%d").to_i.to_s,
|
159
|
-
"i_month" => date.strftime("%m").to_i.to_s,
|
160
|
-
"categories" => category || '',
|
161
|
-
}.inject(format) { |result, token|
|
162
|
-
result.gsub(/:#{Regexp.escape token.first}/, token.last)
|
163
|
-
}.gsub(/\/+/, "/")
|
164
|
-
|
165
|
-
url = url.gsub(/^\//, '') #prep for prepending the base_path
|
166
|
-
url = "#{Ruhoh.config.base_path}#{url}"
|
167
|
-
url
|
164
|
+
Ruhoh::Urls.to_url(url)
|
168
165
|
end
|
169
166
|
|
170
167
|
def self.build_chronology(ordered_posts)
|
@@ -0,0 +1,35 @@
|
|
1
|
+
class Ruhoh
|
2
|
+
module Parsers
|
3
|
+
module Scaffolds
|
4
|
+
|
5
|
+
def self.generate
|
6
|
+
self.system_scaffolds.merge(
|
7
|
+
self.scaffolds
|
8
|
+
)
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.scaffolds
|
12
|
+
self.process(Ruhoh.paths.scaffolds)
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.system_scaffolds
|
16
|
+
self.process(Ruhoh.paths.system_scaffolds)
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.process(path)
|
20
|
+
return {} unless File.exist?(path)
|
21
|
+
|
22
|
+
scaffolds = {}
|
23
|
+
FileUtils.cd(path) {
|
24
|
+
Dir.glob("**/*").each { |filename|
|
25
|
+
next if FileTest.directory?(filename)
|
26
|
+
next if ['.'].include? filename[0]
|
27
|
+
File.open(filename, 'r:UTF-8') { |f| scaffolds[filename] = f.read }
|
28
|
+
}
|
29
|
+
}
|
30
|
+
scaffolds
|
31
|
+
end
|
32
|
+
|
33
|
+
end #Scaffolds
|
34
|
+
end #Parsers
|
35
|
+
end #Ruhoh
|
data/lib/ruhoh/paths.rb
CHANGED
@@ -14,6 +14,7 @@ class Ruhoh
|
|
14
14
|
:partials,
|
15
15
|
:plugins,
|
16
16
|
:posts,
|
17
|
+
:scaffolds,
|
17
18
|
:site_data,
|
18
19
|
:themes,
|
19
20
|
:widgets,
|
@@ -27,8 +28,11 @@ class Ruhoh
|
|
27
28
|
:theme_javascripts,
|
28
29
|
:theme_stylesheets,
|
29
30
|
:theme_widgets,
|
30
|
-
|
31
|
+
|
32
|
+
:system,
|
31
33
|
:system_dashboard_file,
|
34
|
+
:system_scaffolds,
|
35
|
+
:system_partials,
|
32
36
|
:system_widgets
|
33
37
|
)
|
34
38
|
|
@@ -46,6 +50,7 @@ class Ruhoh
|
|
46
50
|
paths.site_data = File.join(Ruhoh.base, Ruhoh.names.site_data)
|
47
51
|
paths.themes = File.join(Ruhoh.base, Ruhoh.names.themes)
|
48
52
|
paths.plugins = File.join(Ruhoh.base, Ruhoh.names.plugins)
|
53
|
+
paths.scaffolds = File.join(Ruhoh.base, Ruhoh.names.scaffolds)
|
49
54
|
|
50
55
|
paths.theme = File.join(Ruhoh.base, Ruhoh.names.themes, Ruhoh.config.theme)
|
51
56
|
paths.theme_dashboard_file= File.join(paths.theme, Ruhoh.names.dashboard_file)
|
@@ -59,8 +64,11 @@ class Ruhoh
|
|
59
64
|
|
60
65
|
return false unless self.theme_is_valid?(paths)
|
61
66
|
|
62
|
-
paths.
|
63
|
-
paths.
|
67
|
+
paths.system = File.join(Ruhoh::Root, Ruhoh.names.system)
|
68
|
+
paths.system_dashboard_file = File.join(paths.system, Ruhoh.names.dashboard_file)
|
69
|
+
paths.system_partials = File.join(paths.system, Ruhoh.names.partials)
|
70
|
+
paths.system_scaffolds = File.join(paths.system, Ruhoh.names.scaffolds)
|
71
|
+
paths.system_widgets = File.join(paths.system, Ruhoh.names.widgets)
|
64
72
|
|
65
73
|
paths
|
66
74
|
end
|
data/lib/ruhoh/previewer.rb
CHANGED
@@ -14,8 +14,9 @@ class Ruhoh
|
|
14
14
|
|
15
15
|
def call(env)
|
16
16
|
return favicon if env['PATH_INFO'] == '/favicon.ico'
|
17
|
-
|
18
|
-
|
17
|
+
# Always remove trailing slash if sent unless it's the root page.
|
18
|
+
env['PATH_INFO'].gsub!(/\/$/, '') unless env['PATH_INFO'] == "/"
|
19
|
+
return admin if env['PATH_INFO'] == Ruhoh.urls.dashboard
|
19
20
|
|
20
21
|
id = Ruhoh::DB.routes[env['PATH_INFO']]
|
21
22
|
raise "Page id not found for url: #{env['PATH_INFO']}" unless id
|
data/lib/ruhoh/urls.rb
CHANGED
@@ -28,8 +28,12 @@ class Ruhoh
|
|
28
28
|
urls
|
29
29
|
end
|
30
30
|
|
31
|
+
# Ruhoh.config.base_path is assumed to be well-formed.
|
32
|
+
# Always remove trailing slash.
|
33
|
+
# Returns String - normalized url with prepended base_path
|
31
34
|
def self.to_url(*args)
|
32
|
-
|
35
|
+
url = args.join('/').chomp('/').reverse.chomp('/').reverse
|
36
|
+
url = Ruhoh.config.base_path + url
|
33
37
|
end
|
34
38
|
|
35
39
|
def self.to_url_slug(title)
|
data/lib/ruhoh/version.rb
CHANGED
data/lib/ruhoh.rb
CHANGED
@@ -47,8 +47,10 @@ class Ruhoh
|
|
47
47
|
:plugins => 'plugins',
|
48
48
|
:posts => 'posts',
|
49
49
|
:javascripts => 'javascripts',
|
50
|
+
:scaffolds => 'scaffolds',
|
50
51
|
:site_data => 'site.yml',
|
51
52
|
:stylesheets => 'stylesheets',
|
53
|
+
:system => 'system',
|
52
54
|
:themes => 'themes',
|
53
55
|
:theme_config => 'theme.yml',
|
54
56
|
:widgets => 'widgets',
|
@@ -63,7 +65,7 @@ class Ruhoh
|
|
63
65
|
self.reset
|
64
66
|
@log.log_file = opts[:log_file] if opts[:log_file]
|
65
67
|
@base = opts[:source] if opts[:source]
|
66
|
-
@config = Ruhoh::Config.generate
|
68
|
+
@config = Ruhoh::Config.generate
|
67
69
|
!!@config
|
68
70
|
end
|
69
71
|
|