ruhoh 1.0.0.alpha → 1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +2 -3
- data/history.json +17 -0
- data/lib/ruhoh/client/client.rb +5 -1
- data/lib/ruhoh/compiler.rb +19 -1
- data/lib/ruhoh/compilers/rss.rb +5 -2
- data/lib/ruhoh/compilers/theme.rb +32 -27
- data/lib/ruhoh/config.rb +13 -1
- data/lib/ruhoh/db.rb +4 -1
- data/lib/ruhoh/page.rb +1 -1
- data/lib/ruhoh/parsers/javascripts.rb +8 -20
- data/lib/ruhoh/parsers/pages.rb +4 -2
- data/lib/ruhoh/parsers/payload.rb +4 -2
- data/lib/ruhoh/parsers/posts.rb +4 -2
- data/lib/ruhoh/parsers/stylesheets.rb +9 -21
- data/lib/ruhoh/parsers/theme_config.rb +30 -0
- data/lib/ruhoh/paths.rb +14 -14
- data/lib/ruhoh/previewer.rb +2 -1
- data/lib/ruhoh/program.rb +9 -0
- data/lib/ruhoh/templaters/base_helpers.rb +4 -0
- data/lib/ruhoh/urls.rb +8 -8
- data/lib/ruhoh/version.rb +1 -1
- data/lib/ruhoh.rb +32 -11
- data/ruhoh.gemspec +1 -0
- data/widgets/comments/config.yml +1 -0
- data/widgets/comments/layouts/facebook.html +2 -2
- data/widgets/comments/layouts/intensedebate.html +1 -1
- data/widgets/comments/layouts/livefyre.html +1 -1
- metadata +49 -18
data/README.md
CHANGED
data/history.json
CHANGED
@@ -1,4 +1,21 @@
|
|
1
1
|
[
|
2
|
+
{
|
3
|
+
"version" : "1.0",
|
4
|
+
"date" : "22.08.2012",
|
5
|
+
"changes" : [
|
6
|
+
"Ruhoh.setup is now broken out into modular setup routines.",
|
7
|
+
"Themes now port over ALL static assets to production when compiling. Change from whitelist to blacklist."
|
8
|
+
],
|
9
|
+
"features" : [
|
10
|
+
"Add support for base_path which allows all urls to be prepended with a base_path if set.",
|
11
|
+
"Support for absolute links to third party domains for javascript and stylesheets within theme.yml",
|
12
|
+
"Add urls.theme variable to the payload",
|
13
|
+
"Add ?to_json contextual helper"
|
14
|
+
],
|
15
|
+
"bugs" : [
|
16
|
+
"Themes now correctly port over assets to production when compiling"
|
17
|
+
]
|
18
|
+
},
|
2
19
|
{
|
3
20
|
"version" : "1.0.0.alpha",
|
4
21
|
"date" : "05.06.2012",
|
data/lib/ruhoh/client/client.rb
CHANGED
@@ -17,7 +17,11 @@ class Ruhoh
|
|
17
17
|
exit
|
18
18
|
} unless self.respond_to?(cmd)
|
19
19
|
|
20
|
-
|
20
|
+
unless ['help','blog','compile'].include?(cmd)
|
21
|
+
Ruhoh.setup
|
22
|
+
Ruhoh.setup_paths
|
23
|
+
Ruhoh.setup_urls
|
24
|
+
end
|
21
25
|
|
22
26
|
self.__send__(cmd)
|
23
27
|
end
|
data/lib/ruhoh/compiler.rb
CHANGED
@@ -26,6 +26,7 @@ class Ruhoh
|
|
26
26
|
def self.run(target, page)
|
27
27
|
self.pages(target, page)
|
28
28
|
self.media(target, page)
|
29
|
+
self.javascripts(target, page)
|
29
30
|
end
|
30
31
|
|
31
32
|
def self.pages(target, page)
|
@@ -43,11 +44,28 @@ class Ruhoh
|
|
43
44
|
|
44
45
|
def self.media(target, page)
|
45
46
|
return unless FileTest.directory? Ruhoh.paths.media
|
46
|
-
|
47
|
+
url = Ruhoh.urls.media.gsub(/^\//, '')
|
48
|
+
media = Ruhoh::Utils.url_to_path(url, target)
|
47
49
|
FileUtils.mkdir_p media
|
48
50
|
FileUtils.cp_r File.join(Ruhoh.paths.media, '.'), media
|
49
51
|
end
|
50
52
|
|
53
|
+
# Create all the javascripts.
|
54
|
+
# Javascripts may be registered from either a theme or a widget.
|
55
|
+
# Technically the theme compiler may create javascripts relative to the theme.
|
56
|
+
# This ensures the widget javascripts are created as well.
|
57
|
+
def self.javascripts(target, page)
|
58
|
+
Ruhoh::DB.javascripts.each do |type, assets|
|
59
|
+
assets.each do |asset|
|
60
|
+
url = asset['url'].gsub(/^\//, '')
|
61
|
+
next unless File.exist?(asset['id'])
|
62
|
+
file_path = Ruhoh::Utils.url_to_path(File.dirname(url), target)
|
63
|
+
FileUtils.mkdir_p file_path
|
64
|
+
FileUtils.cp(asset['id'], file_path)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
51
69
|
end #Defaults
|
52
70
|
|
53
71
|
end #Compiler
|
data/lib/ruhoh/compilers/rss.rb
CHANGED
@@ -10,13 +10,16 @@ class Ruhoh
|
|
10
10
|
# render the content to save to disk. This will be a problem when
|
11
11
|
# posts numbers expand. Merge this in later.
|
12
12
|
def self.run(target, page)
|
13
|
+
num_posts = Ruhoh.config.rss_limit
|
14
|
+
posts = Ruhoh::DB.posts['chronological'].first(num_posts)
|
15
|
+
|
13
16
|
feed = Nokogiri::XML::Builder.new do |xml|
|
14
17
|
xml.rss(:version => '2.0') {
|
15
18
|
xml.channel {
|
16
19
|
xml.title_ Ruhoh::DB.site['title']
|
17
20
|
xml.link_ Ruhoh::DB.site['config']['production_url']
|
18
|
-
xml.pubDate_ Time.now
|
19
|
-
|
21
|
+
xml.pubDate_ Time.now
|
22
|
+
posts.each do |post_id|
|
20
23
|
post = Ruhoh::DB.posts['dictionary'][post_id]
|
21
24
|
page.change(post_id)
|
22
25
|
xml.item {
|
@@ -3,39 +3,44 @@ class Ruhoh
|
|
3
3
|
module Theme
|
4
4
|
|
5
5
|
def self.run(target, page)
|
6
|
-
self.
|
7
|
-
self.javascripts(target, page)
|
8
|
-
self.media(target, page)
|
9
|
-
end
|
10
|
-
|
11
|
-
def self.stylesheets(target, page)
|
12
|
-
Ruhoh::DB.stylesheets.each do |type, assets|
|
13
|
-
assets.each do |asset|
|
14
|
-
next unless File.exist?(asset['id'])
|
15
|
-
file_path = Ruhoh::Utils.url_to_path(File.dirname(asset['url']), target)
|
16
|
-
FileUtils.mkdir_p file_path
|
17
|
-
FileUtils.cp(asset['id'], file_path)
|
18
|
-
end
|
19
|
-
end
|
6
|
+
self.copy(target, page)
|
20
7
|
end
|
21
8
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
9
|
+
# Copies all theme assets over to the compiled site.
|
10
|
+
# Note the compiled assets are namespaced at /assets/<theme-name>/
|
11
|
+
# theme.yml may specify exclusion rules for excluding assets.
|
12
|
+
def self.copy(target, page)
|
13
|
+
url = Ruhoh.urls.theme.gsub(/^\//, '')
|
14
|
+
theme = Ruhoh::Utils.url_to_path(url, target)
|
15
|
+
FileUtils.mkdir_p theme
|
16
|
+
|
17
|
+
self.files.each do |file|
|
18
|
+
original_file = File.join(Ruhoh.paths.theme, file)
|
19
|
+
compiled_file = File.join(theme, file)
|
20
|
+
FileUtils.mkdir_p File.dirname(compiled_file)
|
21
|
+
FileUtils.cp_r original_file, compiled_file
|
30
22
|
end
|
31
23
|
end
|
32
24
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
FileUtils.
|
25
|
+
# Returns list of all files from the theme that need to be
|
26
|
+
# compiled to the production environment.
|
27
|
+
# Returns Array of relative filepaths
|
28
|
+
def self.files
|
29
|
+
FileUtils.cd(Ruhoh.paths.theme) {
|
30
|
+
return Dir["**/*"].select { |filepath|
|
31
|
+
next unless self.is_valid_asset?(filepath)
|
32
|
+
true
|
33
|
+
}
|
34
|
+
}
|
38
35
|
end
|
36
|
+
|
37
|
+
# Checks a given asset filepath against any user-defined exclusion rules in theme.yml
|
38
|
+
def self.is_valid_asset?(filepath)
|
39
|
+
return false if FileTest.directory?(filepath)
|
40
|
+
Ruhoh::DB.theme_config["exclude"].each {|regex| return false if filepath =~ regex }
|
41
|
+
true
|
42
|
+
end
|
43
|
+
|
39
44
|
end #Theme
|
40
45
|
end #Compiler
|
41
46
|
end #Ruhoh
|
data/lib/ruhoh/config.rb
CHANGED
@@ -9,7 +9,9 @@ class Ruhoh
|
|
9
9
|
:posts_exclude,
|
10
10
|
:posts_layout,
|
11
11
|
:posts_permalink,
|
12
|
-
:
|
12
|
+
:rss_limit,
|
13
|
+
:theme,
|
14
|
+
:base_path
|
13
15
|
)
|
14
16
|
|
15
17
|
def self.generate(path_to_config)
|
@@ -27,8 +29,18 @@ class Ruhoh
|
|
27
29
|
|
28
30
|
config = Config.new
|
29
31
|
config.theme = theme
|
32
|
+
|
30
33
|
config.env = site_config['env'] || nil
|
34
|
+
|
35
|
+
config.base_path = '/'
|
36
|
+
if site_config['base_path']
|
37
|
+
config.base_path = site_config['base_path'].to_s
|
38
|
+
config.base_path += "/" unless config.base_path[-1] == '/'
|
39
|
+
end
|
31
40
|
|
41
|
+
config.rss_limit = site_config['rss']['limit'] rescue nil
|
42
|
+
config.rss_limit = 20 if config.rss_limit.nil?
|
43
|
+
|
32
44
|
config.posts_permalink = site_config['posts']['permalink'] rescue nil
|
33
45
|
config.posts_layout = site_config['posts']['layout'] rescue nil
|
34
46
|
config.posts_layout = 'post' if config.posts_layout.nil?
|
data/lib/ruhoh/db.rb
CHANGED
@@ -4,6 +4,7 @@ require 'ruhoh/parsers/routes'
|
|
4
4
|
require 'ruhoh/parsers/layouts'
|
5
5
|
require 'ruhoh/parsers/partials'
|
6
6
|
require 'ruhoh/parsers/widgets'
|
7
|
+
require 'ruhoh/parsers/theme_config'
|
7
8
|
require 'ruhoh/parsers/stylesheets'
|
8
9
|
require 'ruhoh/parsers/javascripts'
|
9
10
|
require 'ruhoh/parsers/payload'
|
@@ -12,7 +13,7 @@ require 'ruhoh/parsers/site'
|
|
12
13
|
class Ruhoh
|
13
14
|
# Public: Database class for interacting with "data" in Ruhoh.
|
14
15
|
class DB
|
15
|
-
WhiteList = [:site, :posts, :pages, :routes, :layouts, :partials, :widgets, :stylesheets, :javascripts, :payload]
|
16
|
+
WhiteList = [:site, :posts, :pages, :routes, :layouts, :partials, :widgets, :theme_config, :stylesheets, :javascripts, :payload]
|
16
17
|
|
17
18
|
class << self
|
18
19
|
self.__send__ :attr_reader, *WhiteList
|
@@ -34,6 +35,8 @@ class Ruhoh
|
|
34
35
|
Ruhoh::Parsers::Partials.generate
|
35
36
|
when :widgets
|
36
37
|
Ruhoh::Parsers::Widgets.generate
|
38
|
+
when :theme_config
|
39
|
+
Ruhoh::Parsers::ThemeConfig.generate
|
37
40
|
when :stylesheets
|
38
41
|
Ruhoh::Parsers::Stylesheets.generate
|
39
42
|
when :javascripts
|
data/lib/ruhoh/page.rb
CHANGED
@@ -8,20 +8,20 @@ class Ruhoh
|
|
8
8
|
# Generates mappings to all registered javascripts.
|
9
9
|
# Returns Hash with layout names as keys and Array of asset Objects as values
|
10
10
|
def self.generate
|
11
|
-
|
12
|
-
assets = self.
|
13
|
-
assets[Ruhoh.names.widgets] = self.widget_javascripts(theme_config)
|
11
|
+
assets = self.theme_javascripts
|
12
|
+
assets[Ruhoh.names.widgets] = self.widget_javascripts
|
14
13
|
assets
|
15
14
|
end
|
16
15
|
|
17
|
-
def self.theme_javascripts
|
18
|
-
return {} unless theme_config[Ruhoh.names.javascripts].is_a? Hash
|
16
|
+
def self.theme_javascripts
|
17
|
+
return {} unless Ruhoh::DB.theme_config[Ruhoh.names.javascripts].is_a? Hash
|
19
18
|
assets = {}
|
20
|
-
theme_config[Ruhoh.names.javascripts].each do |key, value|
|
19
|
+
Ruhoh::DB.theme_config[Ruhoh.names.javascripts].each do |key, value|
|
21
20
|
next if key == Ruhoh.names.widgets # Widgets are handled separately.
|
22
21
|
assets[key] = Array(value).map { |v|
|
22
|
+
url = (v =~ /^(http:|https:)?\/\//i) ? v : "#{Ruhoh.urls.theme_javascripts}/#{v}"
|
23
23
|
{
|
24
|
-
"url" =>
|
24
|
+
"url" => url,
|
25
25
|
"id" => File.join(Ruhoh.paths.theme_javascripts, v)
|
26
26
|
}
|
27
27
|
}
|
@@ -35,7 +35,7 @@ class Ruhoh
|
|
35
35
|
# This differs from the auto-stylesheet inclusion relative to themes,
|
36
36
|
# which is handled in the stylesheet parser.
|
37
37
|
# Make sure there are some standards with this.
|
38
|
-
def self.widget_javascripts
|
38
|
+
def self.widget_javascripts
|
39
39
|
assets = []
|
40
40
|
Ruhoh::DB.widgets.each_value do |widget|
|
41
41
|
next unless widget[Ruhoh.names.javascripts]
|
@@ -50,18 +50,6 @@ class Ruhoh
|
|
50
50
|
assets
|
51
51
|
end
|
52
52
|
|
53
|
-
def self.theme_config
|
54
|
-
theme_config = Ruhoh::Utils.parse_yaml_file(Ruhoh.paths.theme_config_data)
|
55
|
-
if theme_config.nil?
|
56
|
-
Ruhoh::Friend.say{
|
57
|
-
yellow "WARNING: theme.yml config file not found:"
|
58
|
-
yellow " #{Ruhoh.paths.theme_config_data}"
|
59
|
-
}
|
60
|
-
return {}
|
61
|
-
end
|
62
|
-
return {} unless theme_config.is_a? Hash
|
63
|
-
theme_config
|
64
|
-
end
|
65
53
|
end #Javascripts
|
66
54
|
end #Parsers
|
67
55
|
end #Ruhoh
|
data/lib/ruhoh/parsers/pages.rb
CHANGED
@@ -65,10 +65,12 @@ class Ruhoh
|
|
65
65
|
name = page['id'].gsub(Regexp.new("#{ext}$"), '')
|
66
66
|
ext = '.html' if Ruhoh::Converter.extensions.include?(ext)
|
67
67
|
url = name.split('/').map {|p| Ruhoh::Urls.to_url_slug(p) }.join('/')
|
68
|
-
url = "
|
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
|
+
|
73
|
+
url = "#{Ruhoh.config.base_path}#{url}"
|
72
74
|
url = '/' if url.empty?
|
73
75
|
|
74
76
|
url
|
@@ -11,10 +11,12 @@ class Ruhoh
|
|
11
11
|
"site" => Ruhoh::DB.site,
|
12
12
|
'page' => {},
|
13
13
|
"urls" => {
|
14
|
+
"theme" => Ruhoh.urls.theme,
|
14
15
|
"theme_stylesheets" => Ruhoh.urls.theme_stylesheets,
|
15
16
|
"theme_javascripts" => Ruhoh.urls.theme_javascripts,
|
16
17
|
"theme_media" => Ruhoh.urls.theme_media,
|
17
18
|
"media" => Ruhoh.urls.media,
|
19
|
+
"base_path" => Ruhoh.config.base_path,
|
18
20
|
}
|
19
21
|
}
|
20
22
|
end
|
@@ -24,7 +26,7 @@ class Ruhoh
|
|
24
26
|
def self.determine_category_and_tag_urls
|
25
27
|
return nil unless Ruhoh::DB.routes && Ruhoh::DB.posts
|
26
28
|
categories_url = nil
|
27
|
-
[
|
29
|
+
["#{Ruhoh.config.base_path}categories/", "#{Ruhoh.config.base_path}categories.html"].each { |url|
|
28
30
|
categories_url = url and break if Ruhoh::DB.routes.key?(url)
|
29
31
|
}
|
30
32
|
Ruhoh::DB.posts['categories'].each do |key, value|
|
@@ -32,7 +34,7 @@ class Ruhoh
|
|
32
34
|
end
|
33
35
|
|
34
36
|
tags_url = nil
|
35
|
-
[
|
37
|
+
["#{Ruhoh.config.base_path}tags/", "#{Ruhoh.config.base_path}tags.html"].each { |url|
|
36
38
|
tags_url = url and break if Ruhoh::DB.routes.key?(url)
|
37
39
|
}
|
38
40
|
Ruhoh::DB.posts['tags'].each do |key, value|
|
data/lib/ruhoh/parsers/posts.rb
CHANGED
@@ -138,11 +138,11 @@ class Ruhoh
|
|
138
138
|
date = Date.parse(post['date'])
|
139
139
|
title = Ruhoh::Urls.to_url_slug(post['title'])
|
140
140
|
format = post['permalink'] || Ruhoh.config.posts_permalink || "/:categories/:year/:month/:day/:title.html"
|
141
|
-
|
141
|
+
|
142
142
|
# Use the literal permalink if it is a non-tokenized string.
|
143
143
|
unless format.include?(':')
|
144
144
|
url = format.gsub(/^\//, '').split('/').map {|p| CGI::escape(p) }.join('/')
|
145
|
-
return "
|
145
|
+
return "#{Ruhoh.config.base_path}#{url}"
|
146
146
|
end
|
147
147
|
|
148
148
|
filename = File.basename(post['id'], File.extname(post['id']))
|
@@ -162,6 +162,8 @@ class Ruhoh
|
|
162
162
|
result.gsub(/:#{Regexp.escape token.first}/, token.last)
|
163
163
|
}.gsub(/\/+/, "/")
|
164
164
|
|
165
|
+
url = url.gsub(/^\//, '') #prep for prepending the base_path
|
166
|
+
url = "#{Ruhoh.config.base_path}#{url}"
|
165
167
|
url
|
166
168
|
end
|
167
169
|
|
@@ -10,23 +10,23 @@ class Ruhoh
|
|
10
10
|
# Generates mappings to all registered stylesheets.
|
11
11
|
# Returns Hash with layout names as keys and Array of asset Objects as values
|
12
12
|
def self.generate
|
13
|
-
|
14
|
-
assets = self.
|
15
|
-
assets[Ruhoh.names.widgets] = self.widget_stylesheets(theme_config)
|
13
|
+
assets = self.theme_stylesheets
|
14
|
+
assets[Ruhoh.names.widgets] = self.widget_stylesheets
|
16
15
|
assets
|
17
16
|
end
|
18
17
|
|
19
18
|
# Create mappings for stylesheets registered to the theme layouts.
|
20
19
|
# Themes register stylesheets relative to their layouts.
|
21
20
|
# Returns Hash with layout names as keys and Array of asset Objects as values.
|
22
|
-
def self.theme_stylesheets
|
23
|
-
return {} unless theme_config[Ruhoh.names.stylesheets].is_a? Hash
|
21
|
+
def self.theme_stylesheets
|
22
|
+
return {} unless Ruhoh::DB.theme_config[Ruhoh.names.stylesheets].is_a? Hash
|
24
23
|
assets = {}
|
25
|
-
theme_config[Ruhoh.names.stylesheets].each do |key, value|
|
24
|
+
Ruhoh::DB.theme_config[Ruhoh.names.stylesheets].each do |key, value|
|
26
25
|
next if key == Ruhoh.names.widgets # Widgets are handled separately.
|
27
26
|
assets[key] = Array(value).map { |v|
|
27
|
+
url = (v =~ /^(http:|https:)?\/\//i) ? v : "#{Ruhoh.urls.theme_stylesheets}/#{v}"
|
28
28
|
{
|
29
|
-
"url" =>
|
29
|
+
"url" => url,
|
30
30
|
"id" => File.join(Ruhoh.paths.theme_stylesheets, v)
|
31
31
|
}
|
32
32
|
}
|
@@ -41,11 +41,11 @@ class Ruhoh
|
|
41
41
|
# Themes may also specify an explicit widget stylesheet to load.
|
42
42
|
#
|
43
43
|
# Returns Array of asset objects.
|
44
|
-
def self.widget_stylesheets
|
44
|
+
def self.widget_stylesheets
|
45
45
|
assets = []
|
46
46
|
Ruhoh::DB.widgets.each_key do |name|
|
47
47
|
default_name = "#{name}.css"
|
48
|
-
stylesheet = theme_config[Ruhoh.names.stylesheets][Ruhoh.names.widgets][name] rescue default_name
|
48
|
+
stylesheet = Ruhoh::DB.theme_config[Ruhoh.names.stylesheets][Ruhoh.names.widgets][name] rescue default_name
|
49
49
|
stylesheet ||= default_name
|
50
50
|
file = File.join(Ruhoh.paths.theme_widgets, name, Ruhoh.names.stylesheets, stylesheet)
|
51
51
|
next unless File.exists?(file)
|
@@ -58,18 +58,6 @@ class Ruhoh
|
|
58
58
|
assets
|
59
59
|
end
|
60
60
|
|
61
|
-
def self.theme_config
|
62
|
-
theme_config = Ruhoh::Utils.parse_yaml_file(Ruhoh.paths.theme_config_data)
|
63
|
-
if theme_config.nil?
|
64
|
-
Ruhoh::Friend.say{
|
65
|
-
yellow "WARNING: theme.yml config file not found:"
|
66
|
-
yellow " #{Ruhoh.paths.theme_config_data}"
|
67
|
-
}
|
68
|
-
return {}
|
69
|
-
end
|
70
|
-
return {} unless theme_config.is_a? Hash
|
71
|
-
theme_config
|
72
|
-
end
|
73
61
|
end #Stylesheets
|
74
62
|
end #Parsers
|
75
63
|
end #Ruhoh
|
@@ -0,0 +1,30 @@
|
|
1
|
+
class Ruhoh
|
2
|
+
module Parsers
|
3
|
+
module ThemeConfig
|
4
|
+
|
5
|
+
def self.generate
|
6
|
+
config = Ruhoh::Utils.parse_yaml_file(Ruhoh.paths.theme_config_data)
|
7
|
+
if config.nil?
|
8
|
+
Ruhoh::Friend.say{
|
9
|
+
yellow "WARNING: theme.yml config file not found:"
|
10
|
+
yellow " #{Ruhoh.paths.theme_config_data}"
|
11
|
+
}
|
12
|
+
return {}
|
13
|
+
end
|
14
|
+
return {} unless config.is_a? Hash
|
15
|
+
|
16
|
+
config["exclude"] = Array(config['exclude']).compact.map do |node|
|
17
|
+
is_last = node[0] == "*"
|
18
|
+
node = node.chomp("*").reverse.chomp("*").reverse
|
19
|
+
node = Regexp.escape("#{node}")
|
20
|
+
node = is_last ? "#{node}$" : "^#{node}"
|
21
|
+
|
22
|
+
Regexp.new(node, true)
|
23
|
+
end
|
24
|
+
|
25
|
+
config
|
26
|
+
end
|
27
|
+
|
28
|
+
end #ThemeConfig
|
29
|
+
end #Parsers
|
30
|
+
end #Ruhoh
|
data/lib/ruhoh/paths.rb
CHANGED
@@ -32,22 +32,22 @@ class Ruhoh
|
|
32
32
|
:system_widgets
|
33
33
|
)
|
34
34
|
|
35
|
-
def self.generate
|
35
|
+
def self.generate
|
36
36
|
paths = Paths.new
|
37
|
-
paths.base = base
|
38
|
-
paths.config_data = File.join(base, Ruhoh.names.config_data)
|
39
|
-
paths.pages = File.join(base, Ruhoh.names.pages)
|
40
|
-
paths.posts = File.join(base, Ruhoh.names.posts)
|
41
|
-
paths.partials = File.join(base, Ruhoh.names.partials)
|
42
|
-
paths.media = File.join(base, Ruhoh.names.media)
|
43
|
-
paths.widgets = File.join(base, Ruhoh.names.widgets)
|
44
|
-
paths.compiled = File.join(base, Ruhoh.names.compiled)
|
45
|
-
paths.dashboard_file = File.join(base, Ruhoh.names.dashboard_file)
|
46
|
-
paths.site_data = File.join(base, Ruhoh.names.site_data)
|
47
|
-
paths.themes = File.join(base, Ruhoh.names.themes)
|
48
|
-
paths.plugins = File.join(base, Ruhoh.names.plugins)
|
37
|
+
paths.base = Ruhoh.base
|
38
|
+
paths.config_data = File.join(Ruhoh.base, Ruhoh.names.config_data)
|
39
|
+
paths.pages = File.join(Ruhoh.base, Ruhoh.names.pages)
|
40
|
+
paths.posts = File.join(Ruhoh.base, Ruhoh.names.posts)
|
41
|
+
paths.partials = File.join(Ruhoh.base, Ruhoh.names.partials)
|
42
|
+
paths.media = File.join(Ruhoh.base, Ruhoh.names.media)
|
43
|
+
paths.widgets = File.join(Ruhoh.base, Ruhoh.names.widgets)
|
44
|
+
paths.compiled = File.join(Ruhoh.base, Ruhoh.names.compiled)
|
45
|
+
paths.dashboard_file = File.join(Ruhoh.base, Ruhoh.names.dashboard_file)
|
46
|
+
paths.site_data = File.join(Ruhoh.base, Ruhoh.names.site_data)
|
47
|
+
paths.themes = File.join(Ruhoh.base, Ruhoh.names.themes)
|
48
|
+
paths.plugins = File.join(Ruhoh.base, Ruhoh.names.plugins)
|
49
49
|
|
50
|
-
paths.theme = File.join(base, Ruhoh.names.themes, config.theme)
|
50
|
+
paths.theme = File.join(Ruhoh.base, Ruhoh.names.themes, Ruhoh.config.theme)
|
51
51
|
paths.theme_dashboard_file= File.join(paths.theme, Ruhoh.names.dashboard_file)
|
52
52
|
paths.theme_config_data = File.join(paths.theme, Ruhoh.names.theme_config)
|
53
53
|
paths.theme_layouts = File.join(paths.theme, Ruhoh.names.layouts)
|
data/lib/ruhoh/previewer.rb
CHANGED
@@ -14,7 +14,8 @@ class Ruhoh
|
|
14
14
|
|
15
15
|
def call(env)
|
16
16
|
return favicon if env['PATH_INFO'] == '/favicon.ico'
|
17
|
-
|
17
|
+
env['PATH_INFO'] += "/" unless (env['PATH_INFO'] =~ /\.\w+$/ || env['PATH_INFO'][-1] == "/")
|
18
|
+
return admin if env['PATH_INFO'] == "#{Ruhoh.urls.dashboard}/"
|
18
19
|
|
19
20
|
id = Ruhoh::DB.routes[env['PATH_INFO']]
|
20
21
|
raise "Page id not found for url: #{env['PATH_INFO']}" unless id
|
data/lib/ruhoh/program.rb
CHANGED
@@ -18,7 +18,12 @@ class Ruhoh
|
|
18
18
|
|
19
19
|
Ruhoh.setup
|
20
20
|
Ruhoh.config.env = opts[:env]
|
21
|
+
Ruhoh.setup_paths
|
22
|
+
Ruhoh.setup_urls
|
23
|
+
Ruhoh.setup_plugins unless opts[:enable_plugins] == false
|
24
|
+
|
21
25
|
Ruhoh::DB.update_all
|
26
|
+
|
22
27
|
Ruhoh::Watch.start if opts[:watch]
|
23
28
|
Rack::Builder.new {
|
24
29
|
use Rack::Lint
|
@@ -51,6 +56,10 @@ class Ruhoh
|
|
51
56
|
def self.compile(target)
|
52
57
|
Ruhoh.setup
|
53
58
|
Ruhoh.config.env = 'production'
|
59
|
+
Ruhoh.setup_paths
|
60
|
+
Ruhoh.setup_urls
|
61
|
+
Ruhoh.setup_plugins
|
62
|
+
|
54
63
|
Ruhoh::DB.update_all
|
55
64
|
Ruhoh::Compiler.compile(target)
|
56
65
|
end
|
data/lib/ruhoh/urls.rb
CHANGED
@@ -14,22 +14,22 @@ class Ruhoh
|
|
14
14
|
:theme_widgets
|
15
15
|
)
|
16
16
|
|
17
|
-
def self.generate
|
17
|
+
def self.generate
|
18
18
|
urls = Urls.new
|
19
19
|
urls.media = self.to_url(Ruhoh.names.assets, Ruhoh.names.media)
|
20
20
|
urls.widgets = self.to_url(Ruhoh.names.assets, Ruhoh.names.widgets)
|
21
21
|
urls.dashboard = self.to_url(Ruhoh.names.dashboard_file.split('.')[0])
|
22
22
|
|
23
|
-
urls.theme = self.to_url(Ruhoh.names.assets, config.theme)
|
24
|
-
urls.theme_media = self.to_url(Ruhoh.names.assets, config.theme, Ruhoh.names.media)
|
25
|
-
urls.theme_javascripts = self.to_url(Ruhoh.names.assets, config.theme, Ruhoh.names.javascripts)
|
26
|
-
urls.theme_stylesheets = self.to_url(Ruhoh.names.assets, config.theme, Ruhoh.names.stylesheets)
|
27
|
-
urls.theme_widgets = self.to_url(Ruhoh.names.assets, config.theme, Ruhoh.names.widgets)
|
23
|
+
urls.theme = self.to_url(Ruhoh.names.assets, Ruhoh.config.theme)
|
24
|
+
urls.theme_media = self.to_url(Ruhoh.names.assets, Ruhoh.config.theme, Ruhoh.names.media)
|
25
|
+
urls.theme_javascripts = self.to_url(Ruhoh.names.assets, Ruhoh.config.theme, Ruhoh.names.javascripts)
|
26
|
+
urls.theme_stylesheets = self.to_url(Ruhoh.names.assets, Ruhoh.config.theme, Ruhoh.names.stylesheets)
|
27
|
+
urls.theme_widgets = self.to_url(Ruhoh.names.assets, Ruhoh.config.theme, Ruhoh.names.widgets)
|
28
28
|
urls
|
29
29
|
end
|
30
|
-
|
30
|
+
|
31
31
|
def self.to_url(*args)
|
32
|
-
args.
|
32
|
+
Ruhoh.config.base_path + args.join('/')
|
33
33
|
end
|
34
34
|
|
35
35
|
def self.to_url_slug(title)
|
data/lib/ruhoh/version.rb
CHANGED
data/lib/ruhoh.rb
CHANGED
@@ -30,7 +30,7 @@ class Ruhoh
|
|
30
30
|
|
31
31
|
class << self
|
32
32
|
attr_accessor :log
|
33
|
-
attr_reader :config, :names, :paths, :root, :urls
|
33
|
+
attr_reader :config, :names, :paths, :root, :urls, :base
|
34
34
|
end
|
35
35
|
|
36
36
|
@log = Ruhoh::Logger.new
|
@@ -63,28 +63,49 @@ class Ruhoh
|
|
63
63
|
self.reset
|
64
64
|
@log.log_file = opts[:log_file] if opts[:log_file]
|
65
65
|
@base = opts[:source] if opts[:source]
|
66
|
-
|
67
|
-
|
68
|
-
@paths = Ruhoh::Paths.generate(@config, @base)
|
69
|
-
@urls = Ruhoh::Urls.generate(@config)
|
70
|
-
|
71
|
-
return false unless(@config && @paths && @urls)
|
72
|
-
|
73
|
-
self.setup_plugins unless opts[:enable_plugins] == false
|
74
|
-
true
|
66
|
+
@config = Ruhoh::Config.generate(@names.config_data)
|
67
|
+
!!@config
|
75
68
|
end
|
76
69
|
|
77
70
|
def self.reset
|
78
71
|
@base = Dir.getwd
|
79
72
|
end
|
80
73
|
|
74
|
+
def self.setup_paths
|
75
|
+
self.ensure_config
|
76
|
+
@paths = Ruhoh::Paths.generate
|
77
|
+
end
|
78
|
+
|
79
|
+
def self.setup_urls
|
80
|
+
self.ensure_config
|
81
|
+
@urls = Ruhoh::Urls.generate
|
82
|
+
end
|
83
|
+
|
81
84
|
def self.setup_plugins
|
85
|
+
self.ensure_paths
|
82
86
|
plugins = Dir[File.join(self.paths.plugins, "**/*.rb")]
|
83
87
|
plugins.each {|f| require f } unless plugins.empty?
|
84
88
|
end
|
85
89
|
|
86
90
|
def self.ensure_setup
|
87
|
-
|
91
|
+
return if Ruhoh.config && Ruhoh.paths && Ruhoh.urls
|
92
|
+
raise 'Ruhoh has not been fully setup. Please call: Ruhoh.setup'
|
93
|
+
end
|
94
|
+
|
95
|
+
def self.ensure_config
|
96
|
+
return if Ruhoh.config
|
97
|
+
raise 'Ruhoh has not setup config. Please call: Ruhoh.setup'
|
98
|
+
end
|
99
|
+
|
100
|
+
def self.ensure_paths
|
101
|
+
return if Ruhoh.config && Ruhoh.paths
|
102
|
+
raise 'Ruhoh has not setup paths. Please call: Ruhoh.setup'
|
88
103
|
end
|
89
104
|
|
105
|
+
def self.ensure_urls
|
106
|
+
return if Ruhoh.config && Ruhoh.urls
|
107
|
+
raise 'Ruhoh has not setup urls. Please call: Ruhoh.setup + Ruhoh.setup_urls'
|
108
|
+
end
|
109
|
+
|
110
|
+
|
90
111
|
end # Ruhoh
|
data/ruhoh.gemspec
CHANGED
data/widgets/comments/config.yml
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
var js, fjs = d.getElementsByTagName(s)[0];
|
4
4
|
if (d.getElementById(id)) return;
|
5
5
|
js = d.createElement(s); js.id = id;
|
6
|
-
js.src = "//connect.facebook.net/en_US/all.js#xfbml=1&appId={{ site.config.
|
6
|
+
js.src = "//connect.facebook.net/en_US/all.js#xfbml=1&appId={{ site.config.facebook.appid }}";
|
7
7
|
fjs.parentNode.insertBefore(js, fjs);
|
8
8
|
}(document, 'script', 'facebook-jssdk'));</script>
|
9
|
-
<div class="fb-comments" data-href="{{ site.production_url }}" data-num-posts="{{ config.
|
9
|
+
<div class="fb-comments" data-href="{{ site.production_url }}" data-num-posts="{{ config.facebook.num_posts }}" data-width="{{ config.facebook.width }}" data-colorscheme="{{ config.facebook.colorscheme }}"></div>
|
@@ -1,6 +1,6 @@
|
|
1
1
|
<script type='text/javascript' src='http://zor.livefyre.com/wjs/v1.0/javascripts/livefyre_init.js'></script>
|
2
2
|
<script type='text/javascript'>
|
3
3
|
var fyre = LF({
|
4
|
-
site_id: {{ config.
|
4
|
+
site_id: {{ config.livefyre.site_id }}
|
5
5
|
});
|
6
6
|
</script>
|
metadata
CHANGED
@@ -1,19 +1,19 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruhoh
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
5
|
-
prerelease:
|
4
|
+
version: '1.0'
|
5
|
+
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Jade Dominguez
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-08-22 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rack
|
16
|
-
requirement:
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,15 @@ dependencies:
|
|
21
21
|
version: '1.4'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '1.4'
|
25
30
|
- !ruby/object:Gem::Dependency
|
26
31
|
name: mustache
|
27
|
-
requirement:
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
28
33
|
none: false
|
29
34
|
requirements:
|
30
35
|
- - ~>
|
@@ -32,10 +37,15 @@ dependencies:
|
|
32
37
|
version: '0.99'
|
33
38
|
type: :runtime
|
34
39
|
prerelease: false
|
35
|
-
version_requirements:
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0.99'
|
36
46
|
- !ruby/object:Gem::Dependency
|
37
47
|
name: directory_watcher
|
38
|
-
requirement:
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
39
49
|
none: false
|
40
50
|
requirements:
|
41
51
|
- - ~>
|
@@ -43,10 +53,15 @@ dependencies:
|
|
43
53
|
version: '1.4'
|
44
54
|
type: :runtime
|
45
55
|
prerelease: false
|
46
|
-
version_requirements:
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.4'
|
47
62
|
- !ruby/object:Gem::Dependency
|
48
63
|
name: redcarpet
|
49
|
-
requirement:
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
50
65
|
none: false
|
51
66
|
requirements:
|
52
67
|
- - ~>
|
@@ -54,10 +69,15 @@ dependencies:
|
|
54
69
|
version: '2.1'
|
55
70
|
type: :runtime
|
56
71
|
prerelease: false
|
57
|
-
version_requirements:
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ~>
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '2.1'
|
58
78
|
- !ruby/object:Gem::Dependency
|
59
79
|
name: psych
|
60
|
-
requirement:
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
61
81
|
none: false
|
62
82
|
requirements:
|
63
83
|
- - ~>
|
@@ -65,10 +85,15 @@ dependencies:
|
|
65
85
|
version: '1.3'
|
66
86
|
type: :runtime
|
67
87
|
prerelease: false
|
68
|
-
version_requirements:
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ~>
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '1.3'
|
69
94
|
- !ruby/object:Gem::Dependency
|
70
95
|
name: nokogiri
|
71
|
-
requirement:
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
72
97
|
none: false
|
73
98
|
requirements:
|
74
99
|
- - ~>
|
@@ -76,7 +101,12 @@ dependencies:
|
|
76
101
|
version: '1.5'
|
77
102
|
type: :runtime
|
78
103
|
prerelease: false
|
79
|
-
version_requirements:
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ~>
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '1.5'
|
80
110
|
description: Ruhoh is a Universal API for your static blog.
|
81
111
|
email: plusjade@gmail.com
|
82
112
|
executables:
|
@@ -113,6 +143,7 @@ files:
|
|
113
143
|
- lib/ruhoh/parsers/routes.rb
|
114
144
|
- lib/ruhoh/parsers/site.rb
|
115
145
|
- lib/ruhoh/parsers/stylesheets.rb
|
146
|
+
- lib/ruhoh/parsers/theme_config.rb
|
116
147
|
- lib/ruhoh/parsers/widgets.rb
|
117
148
|
- lib/ruhoh/paths.rb
|
118
149
|
- lib/ruhoh/previewer.rb
|
@@ -175,12 +206,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
175
206
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
176
207
|
none: false
|
177
208
|
requirements:
|
178
|
-
- - ! '
|
209
|
+
- - ! '>='
|
179
210
|
- !ruby/object:Gem::Version
|
180
|
-
version:
|
211
|
+
version: '0'
|
181
212
|
requirements: []
|
182
213
|
rubyforge_project:
|
183
|
-
rubygems_version: 1.8.
|
214
|
+
rubygems_version: 1.8.24
|
184
215
|
signing_key:
|
185
216
|
specification_version: 3
|
186
217
|
summary: Ruby based library to process your Ruhoh static blog.
|