ruhoh 1.0 → 1.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 +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
|
|