brite 0.6.0 → 0.7.0
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/.ruby +56 -0
- data/COPYING.rdoc +30 -0
- data/HISTORY.rdoc +16 -2
- data/README.rdoc +35 -27
- data/bin/brite-server +1 -1
- data/lib/brite.rb +2 -1
- data/lib/brite.yml +56 -0
- data/lib/brite/command.rb +100 -55
- data/lib/brite/config.rb +122 -40
- data/lib/brite/controller.rb +46 -104
- data/lib/brite/layout.rb +27 -13
- data/lib/brite/model.rb +107 -0
- data/lib/brite/page.rb +229 -0
- data/lib/brite/part.rb +88 -0
- data/lib/brite/post.rb +41 -0
- data/lib/brite/server.rb +88 -93
- data/lib/brite/site.rb +150 -0
- data/lib/brite/version.rb +21 -0
- data/test/fixture/brite.yml +3 -0
- data/test/fixture/example-page.page +8 -0
- data/test/fixture/example-post.post +9 -0
- data/test/helper.rb +5 -0
- data/test/test_config.rb +23 -0
- data/test/test_page.rb +28 -0
- data/test/test_site.rb +37 -0
- metadata +104 -109
- data/LICENSE +0 -205
- data/Syckfile +0 -76
- data/lib/brite/meta/data.rb +0 -26
- data/lib/brite/meta/package +0 -8
- data/lib/brite/meta/profile +0 -19
- data/lib/brite/models/model.rb +0 -97
- data/lib/brite/models/page.rb +0 -142
- data/lib/brite/models/post.rb +0 -9
- data/lib/brite/models/site.rb +0 -46
- data/lib/brite/rackup.rb +0 -6
- data/lib/plugins/sow/brite/awesome/Sowfile +0 -11
- data/lib/plugins/sow/brite/awesome/about.page +0 -28
- data/lib/plugins/sow/brite/awesome/assets/custom.less +0 -96
- data/lib/plugins/sow/brite/awesome/assets/fade.png +0 -0
- data/lib/plugins/sow/brite/awesome/assets/highlight.css +0 -96
- data/lib/plugins/sow/brite/awesome/assets/highlight.js +0 -1
- data/lib/plugins/sow/brite/awesome/assets/jquery.js +0 -19
- data/lib/plugins/sow/brite/awesome/assets/jquery.tabs.js +0 -1
- data/lib/plugins/sow/brite/awesome/assets/reset.css +0 -57
- data/lib/plugins/sow/brite/awesome/assets/ruby.png +0 -0
- data/lib/plugins/sow/brite/awesome/brite.yaml +0 -3
- data/lib/plugins/sow/brite/awesome/history.page +0 -15
- data/lib/plugins/sow/brite/awesome/index.page +0 -18
- data/lib/plugins/sow/brite/awesome/legal.page +0 -28
- data/lib/plugins/sow/brite/awesome/logs.page +0 -14
- data/lib/plugins/sow/brite/awesome/page.layout +0 -75
- data/lib/plugins/sow/brite/blog1/.rsync-filter +0 -12
- data/lib/plugins/sow/brite/blog1/2011/01/sample.html +0 -293
- data/lib/plugins/sow/brite/blog1/2011/01/sample.post +0 -44
- data/lib/plugins/sow/brite/blog1/Sowfile +0 -10
- data/lib/plugins/sow/brite/blog1/assets/images/bg.jpg +0 -0
- data/lib/plugins/sow/brite/blog1/assets/images/icon.jpg +0 -0
- data/lib/plugins/sow/brite/blog1/assets/styles/class.css +0 -15
- data/lib/plugins/sow/brite/blog1/assets/styles/id.css +0 -85
- data/lib/plugins/sow/brite/blog1/assets/styles/misc.css +0 -0
- data/lib/plugins/sow/brite/blog1/assets/styles/print.css +0 -76
- data/lib/plugins/sow/brite/blog1/assets/styles/reset.css +0 -77
- data/lib/plugins/sow/brite/blog1/assets/styles/tag.css +0 -68
- data/lib/plugins/sow/brite/blog1/brite.yml +0 -3
- data/lib/plugins/sow/brite/blog1/index.page +0 -23
- data/lib/plugins/sow/brite/blog1/page.layout +0 -88
- data/lib/plugins/sow/brite/blog1/post.layout +0 -25
- data/meta/data.rb +0 -26
- data/meta/package +0 -8
- data/meta/profile +0 -19
data/lib/brite/config.rb
CHANGED
@@ -7,32 +7,48 @@ module Brite
|
|
7
7
|
class Config
|
8
8
|
|
9
9
|
# Configuration file name glob.
|
10
|
-
CONFIG_FILE
|
10
|
+
CONFIG_FILE = '{.brite,brite.yml,brite.yaml}'
|
11
11
|
|
12
12
|
# Default URL, which is just for testing purposes.
|
13
|
-
DEFAULT_URL
|
13
|
+
DEFAULT_URL = 'http://0.0.0.0:3000'
|
14
14
|
|
15
15
|
# Default stencil.
|
16
|
-
DEFAULT_STENCIL
|
16
|
+
DEFAULT_STENCIL = 'erb'
|
17
17
|
|
18
18
|
# Default format.
|
19
|
-
DEFAULT_FORMAT
|
19
|
+
DEFAULT_FORMAT = nil #html
|
20
20
|
|
21
21
|
# Default page layout file name (less `.layout` extension).
|
22
|
-
DEFAULT_PAGE_LAYOUT
|
22
|
+
DEFAULT_PAGE_LAYOUT = 'page'
|
23
23
|
|
24
24
|
# Default post layout file name (less `.layout` extension).
|
25
|
-
DEFAULT_POST_LAYOUT
|
25
|
+
DEFAULT_POST_LAYOUT = 'post'
|
26
26
|
|
27
|
-
#
|
27
|
+
# Default page route (`:path`).
|
28
|
+
DEFAULT_PAGE_ROUTE = ':path'
|
29
|
+
|
30
|
+
# Default post route (`:path`).
|
31
|
+
DEFAULT_POST_ROUTE = ':path'
|
32
|
+
|
33
|
+
# Default author for pages and posts.
|
34
|
+
DEFAULT_AUTHOR = 'Anonymous'
|
35
|
+
|
36
|
+
# Default location of layouts.
|
37
|
+
DEFAULT_LAYOUT_PATH = ['assets/layouts']
|
38
|
+
|
39
|
+
# Default location of partials.
|
40
|
+
DEFAULT_PARTIAL_PATH = ['assets/partials']
|
41
|
+
|
42
|
+
# Location of brite project files. By necessity the configuration file
|
43
|
+
# will be located in this directory.
|
28
44
|
attr :location
|
29
45
|
|
46
|
+
# Configuration file.
|
47
|
+
attr :file
|
48
|
+
|
30
49
|
# Site's absolute URL. Where possible links are relative,
|
31
50
|
# but it is not alwasy possible. So a URL should *ALWAYS*
|
32
51
|
# be provided for the site.
|
33
|
-
#--
|
34
|
-
# TODO: Allow +url+ to be set via the command line when generating the site.
|
35
|
-
#++
|
36
52
|
attr_accessor :url
|
37
53
|
|
38
54
|
# Defaut section template engine.
|
@@ -47,23 +63,51 @@ module Brite
|
|
47
63
|
# Default post layout file name (less extension).
|
48
64
|
attr_accessor :post_layout
|
49
65
|
|
66
|
+
# Default page route.
|
67
|
+
attr_accessor :page_route
|
68
|
+
|
69
|
+
# Default post route.
|
70
|
+
attr_accessor :post_route
|
71
|
+
|
72
|
+
# Default author.
|
73
|
+
attr_accessor :author
|
74
|
+
|
75
|
+
# Paths to look for layouts.
|
76
|
+
attr_accessor :layout_path
|
77
|
+
|
78
|
+
# Paths to look for layouts.
|
79
|
+
attr_accessor :partial_path
|
80
|
+
|
50
81
|
# New instance of Config.
|
51
82
|
def initialize(location=nil)
|
52
|
-
@location
|
83
|
+
@location = location || Dir.pwd
|
84
|
+
@file = Dir.glob(File.join(@location, CONFIG_FILE)).first
|
85
|
+
|
86
|
+
@url = DEFAULT_URL
|
87
|
+
@stencil = DEFAULT_STENCIL
|
88
|
+
@format = DEFAULT_FORMAT
|
89
|
+
|
90
|
+
@page_layout = DEFAULT_PAGE_LAYOUT
|
91
|
+
@post_layout = DEFAULT_POST_LAYOUT
|
53
92
|
|
54
|
-
@
|
55
|
-
@
|
56
|
-
@format = DEFAULT_FORMAT
|
93
|
+
@page_route = DEFAULT_PAGE_ROUTE
|
94
|
+
@post_route = DEFAULT_POST_ROUTE
|
57
95
|
|
58
|
-
@
|
59
|
-
|
96
|
+
@author = DEFAULT_AUTHOR
|
97
|
+
|
98
|
+
@layout_path = DEFAULT_LAYOUT_PATH
|
99
|
+
@partial_path = DEFAULT_PARTIAL_PATH
|
100
|
+
|
101
|
+
@custom = {}
|
60
102
|
|
61
103
|
configure
|
62
104
|
end
|
63
105
|
|
106
|
+
#
|
64
107
|
# Load configuration file.
|
108
|
+
#
|
65
109
|
def configure
|
66
|
-
if file
|
110
|
+
if file
|
67
111
|
data = YAML.load(File.new(file))
|
68
112
|
data.each do |k,v|
|
69
113
|
__send__("#{k}=", v)
|
@@ -71,32 +115,70 @@ module Brite
|
|
71
115
|
end
|
72
116
|
end
|
73
117
|
|
74
|
-
#
|
75
|
-
#
|
76
|
-
#
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
#
|
82
|
-
|
83
|
-
#
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
#
|
90
|
-
#
|
91
|
-
#
|
92
|
-
|
93
|
-
|
94
|
-
|
118
|
+
#
|
119
|
+
# Make sure layout_path is a list.
|
120
|
+
#
|
121
|
+
def layout_path=(path)
|
122
|
+
@layout_path = [path].flatten
|
123
|
+
end
|
124
|
+
|
125
|
+
#
|
126
|
+
# Make sure partial_path is a list.
|
127
|
+
#
|
128
|
+
def partial_path=(path)
|
129
|
+
@partial_path = [path].flatten
|
130
|
+
end
|
131
|
+
|
132
|
+
=begin
|
133
|
+
#
|
134
|
+
# Locate a layout looking in layout paths.
|
135
|
+
#
|
136
|
+
def find_layout(name)
|
137
|
+
# look for layout in layout_path locations
|
138
|
+
file = nil
|
139
|
+
@layout_path.find do |path|
|
140
|
+
file = Dir.glob(File.join(path, "#{name}.layout")).first
|
141
|
+
end
|
142
|
+
# fallback to site's root location
|
143
|
+
if !file
|
144
|
+
file = Dir.glob(File.join(@location, "#{name}.layout")).first
|
145
|
+
end
|
146
|
+
# if not found raise an error
|
147
|
+
raise "Cannot locate layout #{name}." unless file
|
148
|
+
# return layout file
|
149
|
+
file
|
150
|
+
end
|
151
|
+
=end
|
152
|
+
|
153
|
+
#
|
154
|
+
# Provide access to POM.
|
155
|
+
#
|
156
|
+
# @todo Will become GemDo in future ?
|
157
|
+
#
|
158
|
+
def pom=(set)
|
95
159
|
return unless set
|
96
|
-
require '
|
160
|
+
require 'pom'
|
97
161
|
Brite::Context.class_eval do
|
98
162
|
def project
|
99
|
-
@project ||=
|
163
|
+
@project ||= POM::Project.new
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
#
|
169
|
+
alias_method :gemdo=, :pom=
|
170
|
+
|
171
|
+
#
|
172
|
+
def method_missing(s, v=nil, *a, &b)
|
173
|
+
s = s.to_s
|
174
|
+
case s
|
175
|
+
when /=$/
|
176
|
+
@custom[s.chomp('=')] = v
|
177
|
+
else
|
178
|
+
if @custom.key?(s)
|
179
|
+
@custom[s]
|
180
|
+
else
|
181
|
+
super(s.to_sym, v, *a, &b)
|
100
182
|
end
|
101
183
|
end
|
102
184
|
end
|
data/lib/brite/controller.rb
CHANGED
@@ -1,159 +1,101 @@
|
|
1
1
|
require 'neapolitan'
|
2
2
|
require 'brite/config'
|
3
3
|
require 'brite/layout'
|
4
|
-
require 'brite/
|
5
|
-
require 'brite/
|
6
|
-
require 'brite/
|
4
|
+
require 'brite/site'
|
5
|
+
require 'brite/page'
|
6
|
+
require 'brite/post'
|
7
|
+
require 'brite/part'
|
7
8
|
|
8
9
|
module Brite
|
9
10
|
|
10
11
|
# The Controller class is the primary Brite class, handling
|
11
12
|
# the generation of site files.
|
13
|
+
#
|
12
14
|
class Controller
|
13
15
|
|
14
16
|
# New Controller.
|
17
|
+
#
|
18
|
+
# @param [Hash] options
|
19
|
+
# Controller options.
|
20
|
+
#
|
21
|
+
# @option options [String] :location
|
22
|
+
# Location of brite project.
|
23
|
+
#
|
24
|
+
# @option options [String] :output
|
25
|
+
# Redirect all output to this directory.
|
26
|
+
#
|
15
27
|
def initialize(options={})
|
16
28
|
@location = options[:location] || Dir.pwd
|
17
29
|
@output = options[:output]
|
18
|
-
|
19
|
-
|
20
|
-
@trace = options[:trace]
|
21
|
-
|
22
|
-
@layouts = []
|
30
|
+
#@dryrun = options[:dryrun]
|
31
|
+
#@trace = options[:trace]
|
23
32
|
|
24
|
-
|
25
|
-
end
|
26
|
-
|
27
|
-
# Returns an instance of Site.
|
28
|
-
def initialize_site
|
29
|
-
@site = Site.new(:url=>url)
|
30
|
-
|
31
|
-
Dir.chdir(location) do
|
32
|
-
files = Dir['**/*']
|
33
|
-
files.each do |file|
|
34
|
-
name = File.basename(file)
|
35
|
-
ext = File.extname(file)
|
36
|
-
case ext
|
37
|
-
when '.layout'
|
38
|
-
layouts << Layout.new(self, file)
|
39
|
-
when '.page' #*%w{.markdown .rdoc .textile .whtml}
|
40
|
-
@site.pages << initialize_page(file)
|
41
|
-
when '.post'
|
42
|
-
@site.posts << initialize_post(file)
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
@site.posts.sort!{ |a,b| b.date <=> a.date }
|
47
|
-
@site
|
48
|
-
end
|
49
|
-
|
50
|
-
# Returns an instance of Page.
|
51
|
-
#++
|
52
|
-
# TODO: Limit Neapolitan to Markup formats only.
|
53
|
-
#--
|
54
|
-
def initialize_page(file)
|
55
|
-
template = Neapolitan.file(file, :stencil=>config.stencil)
|
56
|
-
settings = template.header
|
57
|
-
|
58
|
-
settings[:site] = site
|
59
|
-
settings[:file] = file
|
60
|
-
|
61
|
-
Page.new(settings){ |page| render(template, page) }
|
62
|
-
end
|
63
|
-
|
64
|
-
# Returns an instance of Post.
|
65
|
-
def initialize_post(file)
|
66
|
-
template = Neapolitan.file(file, :stencil=>config.stencil)
|
67
|
-
settings = template.header
|
68
|
-
|
69
|
-
settings[:site] = site
|
70
|
-
settings[:file] = file
|
71
|
-
|
72
|
-
Post.new(settings){ |post| render(template, post) }
|
33
|
+
@site = Site.new(location, :url=>options[:url])
|
73
34
|
end
|
74
35
|
|
75
36
|
# Returns an instance of Site.
|
76
37
|
attr :site
|
77
38
|
|
78
|
-
#
|
39
|
+
# Directory of site files on disk.
|
79
40
|
attr :location
|
80
41
|
|
81
|
-
#
|
42
|
+
# Where to save results. Usually the templates are shadowed, which means
|
43
|
+
# the ouput is the same a location.
|
82
44
|
attr :output
|
83
45
|
|
84
|
-
|
85
|
-
def
|
86
|
-
|
87
|
-
end
|
88
|
-
|
89
|
-
# Is `trace` mode on?
|
90
|
-
def trace?
|
91
|
-
@trace
|
92
|
-
end
|
93
|
-
|
94
|
-
# Returns an Array of Layouts.
|
95
|
-
def layouts
|
96
|
-
@layouts
|
97
|
-
end
|
46
|
+
## Returns an Array of Layouts.
|
47
|
+
#def layouts
|
48
|
+
# @site.layouts
|
49
|
+
#end
|
98
50
|
|
99
51
|
# Access to configuration file data.
|
100
52
|
def config
|
101
|
-
|
53
|
+
site.config
|
102
54
|
end
|
103
55
|
|
104
56
|
# URL of site as set in initializer or configuration file.
|
105
57
|
def url
|
106
|
-
|
58
|
+
site.url
|
107
59
|
end
|
108
60
|
|
109
|
-
#
|
110
|
-
def
|
111
|
-
|
112
|
-
# scope.merge!(attributes)
|
113
|
-
#else
|
114
|
-
# scope = to_scope
|
115
|
-
#end
|
116
|
-
|
117
|
-
render = template.render(model) #, &body)
|
118
|
-
|
119
|
-
model.summary = render.summary # TODO: make part of neapolitan?
|
120
|
-
|
121
|
-
result = render.to_s
|
122
|
-
|
123
|
-
if model.layout
|
124
|
-
layout = lookup_layout(model.layout)
|
125
|
-
raise "No such layout -- #{layout}" unless layout
|
126
|
-
result = layout.render(model){ result }
|
127
|
-
end
|
128
|
-
|
129
|
-
result.to_s.strip
|
61
|
+
# Is `dryrun` mode on? Checks the global variable `$DRYRUN`.
|
62
|
+
def dryrun?
|
63
|
+
$DRYRUN #@dryrun
|
130
64
|
end
|
131
65
|
|
132
|
-
#
|
133
|
-
def
|
134
|
-
|
66
|
+
# Is `trace` mode on? Checks global variable `$TRACE`.
|
67
|
+
def trace?
|
68
|
+
$TRACE #@trace
|
135
69
|
end
|
136
70
|
|
137
|
-
# Build site.
|
71
|
+
# Build the site.
|
138
72
|
def build
|
139
73
|
if trace?
|
140
|
-
puts "Layouts: " + layouts.map{ |layout| layout.name }.join(", ")
|
141
|
-
puts "
|
142
|
-
puts "
|
74
|
+
puts "Layouts: " + site.layouts.map{ |layout| layout.name }.join(", ")
|
75
|
+
puts "Parts: " + site.parts.map{ |part| part.name }.join(", ")
|
76
|
+
puts "Pages: " + site.pages.map{ |page| page.file }.join(", ")
|
77
|
+
puts "Posts: " + site.posts.map{ |post| post.file }.join(", ")
|
143
78
|
puts
|
144
79
|
end
|
80
|
+
|
145
81
|
Dir.chdir(location) do
|
146
82
|
site.posts.each do |post|
|
83
|
+
puts "Rendering #{post.file}" if $DEBUG
|
147
84
|
save(post)
|
148
85
|
end
|
149
86
|
site.pages.each do |page|
|
87
|
+
puts "Rendering #{page.file}" if $DEBUG
|
150
88
|
save(page)
|
151
89
|
end
|
152
90
|
end
|
153
|
-
puts "#{site.pages.size + site.posts.size} Files: #{site.pages.size} Pages, #{site.posts.size} Posts"
|
91
|
+
puts "\n#{site.pages.size + site.posts.size} Files: #{site.pages.size} Pages, #{site.posts.size} Posts"
|
154
92
|
end
|
155
93
|
|
156
94
|
# Save page/post redering to disk.
|
95
|
+
#
|
96
|
+
# @param [Model] model
|
97
|
+
# The {Page} or {Post} to save to disk.
|
98
|
+
#
|
157
99
|
def save(model)
|
158
100
|
file = output ? File.join(output, model.output) : model.output
|
159
101
|
text = model.to_s
|
data/lib/brite/layout.rb
CHANGED
@@ -1,35 +1,49 @@
|
|
1
|
+
require 'brite/model'
|
2
|
+
|
1
3
|
module Brite
|
2
4
|
|
3
5
|
# Layout class
|
4
|
-
class Layout
|
6
|
+
class Layout < Model
|
5
7
|
|
6
8
|
#
|
7
|
-
def initialize(
|
8
|
-
@
|
9
|
-
@file
|
10
|
-
|
11
|
-
@
|
9
|
+
def initialize(site, file)
|
10
|
+
@site = site
|
11
|
+
@file = file
|
12
|
+
|
13
|
+
@name = file.chomp('.layout')
|
14
|
+
@path = File.expand_path(file)
|
12
15
|
end
|
13
16
|
|
14
|
-
|
17
|
+
#
|
18
|
+
attr :site
|
15
19
|
|
20
|
+
#
|
16
21
|
attr :file
|
17
22
|
|
23
|
+
#
|
24
|
+
attr :name
|
25
|
+
|
26
|
+
#
|
18
27
|
attr :path
|
19
28
|
|
20
|
-
|
29
|
+
# TODO: merge layout header ?
|
21
30
|
|
22
|
-
#
|
31
|
+
# Render layout.
|
23
32
|
def render(model, &content)
|
24
|
-
template = Neapolitan.file(path, :stencil=>
|
33
|
+
template = Neapolitan.file(path, :stencil=>site.config.stencil)
|
34
|
+
|
35
|
+
# update the model's metadata
|
36
|
+
#model.update(template.metadata)
|
25
37
|
|
26
38
|
result = template.render(model, &content).to_s
|
27
39
|
|
28
|
-
|
40
|
+
layout_name = template.metadata['layout']
|
41
|
+
|
42
|
+
if layout_name
|
43
|
+
layout = site.lookup_layout(layout_name)
|
29
44
|
|
30
|
-
if layout
|
31
|
-
layout = controller.lookup_layout(layout)
|
32
45
|
raise "No such layout -- #{layout}" unless layout
|
46
|
+
|
33
47
|
result = layout.render(model){ result }
|
34
48
|
end
|
35
49
|
|