brite 0.5

Sign up to get free protection for your applications and to get access to all the features.
data/HISTORY ADDED
@@ -0,0 +1,16 @@
1
+ = RELEASE HISTORY
2
+
3
+ == 0.5 / 2008-10-25
4
+
5
+ Brite (formerly Webrite) has been completely rewritten from the ground-up,
6
+ applying a number of ideas gathered from other systems and adding further
7
+ innovations. This is still an early release, and in need of features
8
+ and overt tire-kicking, but hey I'm already using to generate a pretty
9
+ damn nice looking site.
10
+
11
+ Changes:
12
+
13
+ * 1 Monumentously Important Enhancment
14
+
15
+ * Happy Rebirthday!
16
+
data/LICENSE ADDED
@@ -0,0 +1,23 @@
1
+ The MIT License
2
+
3
+ Copyright (c) 2009 Thomas Sawyer
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
22
+
23
+
data/MANIFEST ADDED
@@ -0,0 +1,28 @@
1
+ #!mast bin lib meta test [A-Z]*
2
+ bin/brite
3
+ lib/brite/command.rb
4
+ lib/brite/config.rb
5
+ lib/brite/layout.rb
6
+ lib/brite/page.rb
7
+ lib/brite/part.rb
8
+ lib/brite/post.rb
9
+ lib/brite/site.rb
10
+ lib/brite/template.rb
11
+ meta/authors
12
+ meta/contact
13
+ meta/copyright
14
+ meta/description
15
+ meta/homepage
16
+ meta/license
17
+ meta/name
18
+ meta/repository
19
+ meta/requires
20
+ meta/ruby
21
+ meta/subtitle
22
+ meta/suite
23
+ meta/summary
24
+ meta/title
25
+ meta/version
26
+ LICENSE
27
+ README
28
+ HISTORY
data/README ADDED
@@ -0,0 +1,42 @@
1
+ = Brite
2
+
3
+ (The BrightLite of Static Website Generators)
4
+
5
+ * home: http://proutils.github.com/brite
6
+ * source: http://github.com/proutils/brite
7
+
8
+
9
+ == DESCRIPTION
10
+
11
+ Brite is an inovative static website/blog generation utility
12
+ which is extremely easy to use as it is versitle.
13
+
14
+ == FEATURES/ISSUES
15
+
16
+ * Awesome
17
+ * Extra Cool
18
+ * And Dyn-o-mite!
19
+
20
+
21
+ == SYNOPSIS
22
+
23
+ For now please see the Brite website and API documentation.
24
+
25
+
26
+ == HOW TO INSTALL
27
+
28
+ You know the routine ;)
29
+
30
+ $ sudop gem install brite
31
+
32
+ If you're old fashion and want to install to a site
33
+ location, see Setup.rb (http://protuils.github.com/setup).
34
+
35
+
36
+ == COPYRIGHT/LICENSE
37
+
38
+ Brite is Copyright (c) 2009 Thomas Sawyer
39
+
40
+ It is distributed under the terms of the MIT license.
41
+
42
+
data/bin/brite ADDED
@@ -0,0 +1,3 @@
1
+ #! /usr/bin/ruby
2
+ require 'brite/command'
3
+ Brite::Command.start
@@ -0,0 +1,85 @@
1
+ require 'brite/site'
2
+
3
+ module Brite
4
+
5
+ # Webrite command line interface.
6
+
7
+ class Command
8
+
9
+ def self.start
10
+ new.start
11
+ end
12
+
13
+ def initialize(argv=nil)
14
+ @argv ||= ARGV.dup
15
+
16
+ @noharm = @argv.delete('--dryrun') || @argv.delete('--noharm')
17
+ @debug = @argv.delete('--debug')
18
+
19
+ @argv.reject!{ |e| e =~ /^-/ }
20
+
21
+ @location = @argv.shift || '.'
22
+ #@output = @argv.shift
23
+ end
24
+
25
+ #
26
+ def start
27
+ begin
28
+ site.build
29
+ rescue => e
30
+ @debug ? raise(e) : puts(e.message)
31
+ end
32
+ end
33
+
34
+ def site
35
+ Site.new(
36
+ :location => @location,
37
+ :output => @output,
38
+ :noharm => @noharm,
39
+ :trace => @trace
40
+ )
41
+ end
42
+ end
43
+
44
+ #
45
+ # Command to generate a single part to standard out.
46
+ #
47
+
48
+ class PartCommand
49
+
50
+ def self.start
51
+ new.start
52
+ end
53
+
54
+ def initialize(argv=nil)
55
+ @argv ||= ARGV.dup
56
+ end
57
+
58
+ def start
59
+ render(parts)
60
+ end
61
+
62
+ # render a single part to stdout.
63
+
64
+ def render(parts)
65
+ $stdout << Page.new(parts).to_html
66
+ end
67
+
68
+ private
69
+
70
+ def parts
71
+ parts = []
72
+ @argv.each do |x|
73
+ if /^-/ =~ x
74
+ parts << [x.sub(/-{1,2}/,'')]
75
+ else
76
+ parts.last < x
77
+ end
78
+ end
79
+ Hash[*parts]
80
+ end
81
+
82
+ end
83
+
84
+ end
85
+
@@ -0,0 +1,30 @@
1
+ require 'ostruct'
2
+
3
+ module Brite
4
+
5
+ # Configuration
6
+ class Config
7
+
8
+ #
9
+ DEFAULTS = {
10
+ :stencil => 'rhtml',
11
+ #:format => 'html',
12
+ :pagelayout => 'page',
13
+ :postlayout => 'post',
14
+ :maxchars => 500,
15
+ }
16
+
17
+ attr :defaults
18
+
19
+ def initialize
20
+ if File.exist?('.config/defaults')
21
+ custom_defaults = YAML.load(File.new('.config/defaults'))
22
+ else
23
+ custom_defaults = {}
24
+ end
25
+ @defaults = OpenStruct.new(DEFAULTS.merge(custom_defaults))
26
+ end
27
+ end
28
+
29
+ end
30
+
@@ -0,0 +1,36 @@
1
+ module Brite
2
+
3
+ # Layout class
4
+ class Layout < Page
5
+ undef_method :save
6
+
7
+ #def to_contextual_attributes
8
+ # { 'site'=>site.to_h }
9
+ #end
10
+
11
+ #
12
+ def render(attributes={})
13
+ #attributes = to_contextual_attributes
14
+ #attributes['content'] = content if content
15
+
16
+ output = parts.map{ |part| part.render(stencil, attributes) }.join("\n")
17
+
18
+ #@content = output
19
+
20
+ attributes = attributes.merge('content'=>output)
21
+
22
+ if layout
23
+ output = site.lookup_layout(layout).render(attributes)
24
+ end
25
+
26
+ output
27
+ end
28
+
29
+ # Layouts have no default layout.
30
+ def default_layout
31
+ nil
32
+ end
33
+
34
+ end
35
+
36
+ end
data/lib/brite/page.rb ADDED
@@ -0,0 +1,235 @@
1
+ require 'brite/part'
2
+
3
+ module Brite
4
+
5
+ # Page class
6
+ class Page
7
+
8
+ attr :file
9
+
10
+ # Template type (rhtml or liquid)
11
+ attr :stencil
12
+
13
+ # Layout name (relative filename less extension)
14
+ attr :layout
15
+
16
+ # Author
17
+ attr :author
18
+
19
+ # Title of page/post
20
+ attr :title
21
+
22
+ # Publish date
23
+ attr :date
24
+
25
+ # Tags (labels)
26
+ attr :tags
27
+
28
+ # Category ("a glorified tag")
29
+ attr :category
30
+
31
+ # rendered output text
32
+ attr :content
33
+
34
+ # output extension (defualt is 'html')
35
+ attr :extension
36
+
37
+ #
38
+ def initialize(site, file)
39
+ @site = site
40
+ @file = file
41
+ @parts = []
42
+ parse
43
+ end
44
+
45
+ def name
46
+ @name ||= file.chomp(File.extname(file))
47
+ end
48
+
49
+ #
50
+ def url
51
+ @url ||= name + extension
52
+ end
53
+
54
+ #
55
+ def extension
56
+ @extension ||= '.html'
57
+ end
58
+
59
+ #
60
+ def root
61
+ '../' * file.count('/')
62
+ end
63
+
64
+ # TODO
65
+ #def next
66
+ # self
67
+ #end
68
+
69
+ # TODO
70
+ #def previous
71
+ # self
72
+ #end
73
+
74
+ #
75
+ def to_h
76
+ {
77
+ 'url' => url,
78
+ 'author' => author,
79
+ 'title' => title,
80
+ 'date' => date,
81
+ 'tags' => tags,
82
+ 'category' => category,
83
+ 'content' => content
84
+ }
85
+ end
86
+
87
+ #
88
+ def save(output=nil)
89
+ output ||= Dir.pwd # TODO
90
+ text = render
91
+ fname = file.chomp(File.extname(file)) + extension
92
+ if dryrun
93
+ puts "[DRYRUN] write #{fname}"
94
+ else
95
+ puts "write #{fname}"
96
+ File.open(fname, 'w'){ |f| f << text }
97
+ end
98
+ end
99
+
100
+ def to_contextual_attributes
101
+ { 'site'=>site.to_h, 'page'=>to_h, 'root'=>root }
102
+ end
103
+
104
+ #
105
+ def to_liquid
106
+ to_contextual_attributes
107
+ end
108
+
109
+ protected
110
+
111
+ # TODO: Should validate front matter before anything processing.
112
+ #
113
+ def render(inherit={})
114
+ attributes = to_contextual_attributes
115
+
116
+ attributes = attributes.merge(inherit)
117
+
118
+ #attributes['content'] = content if content
119
+
120
+ output = parts.map{ |part| part.render(stencil, attributes) }.join("\n")
121
+
122
+ @content = output
123
+
124
+ attributes = attributes.merge('content'=>output)
125
+ if layout
126
+ renout = site.lookup_layout(layout)
127
+ raise "No such layout -- #{layout}" unless renout
128
+ output = renout.render(attributes)
129
+ end
130
+
131
+ output
132
+ end
133
+
134
+ private
135
+
136
+ #
137
+ def site
138
+ @site
139
+ end
140
+
141
+ #
142
+ def parts
143
+ @parts
144
+ end
145
+
146
+ #
147
+ def dryrun
148
+ site.dryrun
149
+ end
150
+
151
+ #
152
+ def parse
153
+ hold = []
154
+ text = File.read(file)
155
+ sect = text.split(/^\-\-\-/)
156
+
157
+ if sect.size == 1
158
+ @prop = {}
159
+ @parts << Part.new(sect[0], site.defaults.format)
160
+ else
161
+ void = sect.shift
162
+ head = sect.shift
163
+ head = YAML::load(head)
164
+
165
+ parse_header(head)
166
+
167
+ sect.each do |body|
168
+ index = body.index("\n")
169
+ format = body[0...index].strip
170
+ format = site.defaults.format if format.empty?
171
+ text = body[index+1..-1]
172
+ @parts << Part.new(text, format)
173
+ end
174
+ end
175
+
176
+ end
177
+
178
+ #
179
+ def parse_header(head)
180
+ @stencil = head['stencil'] || site.defaults.stencil
181
+ @author = head['author'] || 'Anonymous'
182
+ @title = head['title']
183
+ @date = head['date']
184
+ @category = head['category']
185
+ @extension = head['extension']
186
+
187
+ self.tags = head['tags']
188
+ self.layout = head['layout']
189
+ end
190
+
191
+ def layout=(layout)
192
+ if FalseClass === layout
193
+ @layout = nil
194
+ else
195
+ @layout = layout || default_layout
196
+ end
197
+ end
198
+
199
+ #
200
+ def tags=(entry)
201
+ return entry unless entry
202
+ case entry
203
+ when String, Symbol
204
+ entry = entry.to_s.strip
205
+ if entry.index(/[,;]/)
206
+ entry = entry.split(/[,;]/)
207
+ else
208
+ entry = entry.split(/\s+/)
209
+ end
210
+ else
211
+ entry = entry.to_a.flatten
212
+ end
213
+ @tags = entry.map{ |e| e.strip }
214
+ end
215
+
216
+ # Default layout is different for pages vs. posts, so we
217
+ # use this method to differntiation them.
218
+ def default_layout
219
+ site.defaults.pagelayout
220
+ end
221
+
222
+ public
223
+
224
+ def to_s
225
+ file
226
+ end
227
+
228
+ def inspect
229
+ "<#{self.class}: #{file}>"
230
+ end
231
+
232
+ end
233
+
234
+ end
235
+
data/lib/brite/part.rb ADDED
@@ -0,0 +1,31 @@
1
+ module Brite
2
+
3
+ # A Part is the section of a page. Pages can be segmented into
4
+ # parts using the '--- FORMAT' notation.
5
+ #
6
+ class Part
7
+ # Markup format (html, rdoc, markdown, textile)
8
+ attr :format
9
+
10
+ # Body of text as given in the part.
11
+ attr :text
12
+
13
+ #
14
+ def initialize(text, format=nil)
15
+ @format = format
16
+ @text = text
17
+ end
18
+
19
+ #
20
+ def render(type, attributes)
21
+ template_engine.render(type, format, text, attributes)
22
+ end
23
+
24
+ #
25
+ def template_engine
26
+ TemplateEngine
27
+ end
28
+ end
29
+
30
+ end
31
+
data/lib/brite/post.rb ADDED
@@ -0,0 +1,37 @@
1
+ require 'brite/page'
2
+
3
+ module Brite
4
+
5
+ # Post class
6
+ class Post < Page
7
+
8
+ def default_layout
9
+ site.defaults.postlayout
10
+ end
11
+
12
+ #def to_contextual_attributes
13
+ # { 'site' => site.to_h, 'post' => to_h }
14
+ #end
15
+
16
+ =begin
17
+ #
18
+ def render(content=nil)
19
+ attributes = to_contextual_attributes
20
+ #attributes['page']['content'] = content if content
21
+
22
+ output = parts.map{ |part| part.render(stencil, attributes) }.join("\n")
23
+
24
+ # content
25
+ @content = output
26
+
27
+ if layout
28
+ output = site.lookup_layout(layout).render(output)
29
+ end
30
+ output
31
+ end
32
+ =end
33
+
34
+ end
35
+
36
+ end
37
+
data/lib/brite/site.rb ADDED
@@ -0,0 +1,137 @@
1
+ ##
2
+ # "entia non sunt multiplicanda praeter necessitatem"
3
+ # --Ockham's razor
4
+ ##
5
+
6
+ require 'brite/config'
7
+ require 'brite/page'
8
+ require 'brite/post'
9
+ require 'brite/layout'
10
+ require 'brite/template'
11
+
12
+ #
13
+ module Brite
14
+
15
+ # Site class
16
+ class Site
17
+
18
+ # Location of site.
19
+ attr :location
20
+ attr :output
21
+
22
+ attr :layouts
23
+ attr :pages
24
+ attr :posts
25
+
26
+ attr :dryrun
27
+ attr :verbose
28
+
29
+ def initialize(options={})
30
+ @location = options[:location] || Dir.pwd
31
+ @output = options[:output] || Dir.pwd
32
+ @dryrun = options[:dryrun]
33
+
34
+ @layouts = []
35
+ @pages = []
36
+ @posts = []
37
+ end
38
+
39
+ def tags
40
+ @tags ||= posts.map{ |p| p.tags }.flatten.uniq.sort
41
+ end
42
+
43
+ def posts_by_tag
44
+ @posts_by_tag ||= (
45
+ chart ||= Hash.new{|h,k|h[k]=[]}
46
+ posts.each do |post|
47
+ post.tags.each do |tag|
48
+ chart[tag] << post
49
+ end
50
+ end
51
+ chart
52
+ )
53
+ end
54
+
55
+ def verbose?
56
+ true
57
+ end
58
+
59
+ def build
60
+ Dir.chdir(location) do
61
+ sort_files
62
+ if verbose?
63
+ puts "Layouts: " + layouts.join(", ")
64
+ puts "Pages: " + pages.join(", ")
65
+ puts "Posts: " + posts.join(", ")
66
+ puts
67
+ end
68
+ render
69
+ end
70
+ end
71
+
72
+ def lookup_layout(name)
73
+ layouts.find{ |l| name == l.name }
74
+ end
75
+
76
+ def sort_files
77
+ files = Dir['**/*']
78
+ files.each do |file|
79
+ temp = false
80
+ name = File.basename(file)
81
+ ext = File.extname(file)
82
+ case ext
83
+ when '.layout'
84
+ layouts << Layout.new(self, file)
85
+ when '.page' #*%w{.markdown .rdoc .textile .whtml}
86
+ pages << Page.new(self, file)
87
+ when '.post'
88
+ posts << Post.new(self, file)
89
+ end
90
+ end
91
+ posts.sort!{ |a,b| b.date <=> a.date }
92
+ end
93
+
94
+ def render
95
+ render_posts # renger posts first, so pages can use them
96
+ render_pages
97
+ end
98
+
99
+ def render_pages
100
+ pages.each do |page|
101
+ page.save(output)
102
+ end
103
+ end
104
+
105
+ def render_posts
106
+ posts.each do |post|
107
+ post.save(output)
108
+ end
109
+ end
110
+
111
+ def config
112
+ @config ||= Config.new
113
+ end
114
+
115
+ def defaults
116
+ config.defaults
117
+ end
118
+
119
+ def to_h
120
+ pbt = {}
121
+ posts_by_tag.each do |tag, posts|
122
+ pbt[tag] = posts.map{ |p| p.to_h }
123
+ end
124
+ {
125
+ 'posts' => posts.map{ |p| p.to_h },
126
+ 'posts_by_tag' => pbt, #posts_by_tag, #.map{ |t, ps| [t, ps.map{|p|p.to_h}] }
127
+ 'tags' => tags
128
+ }
129
+ end
130
+
131
+ def to_liquid
132
+ to_h
133
+ end
134
+
135
+ end
136
+
137
+ end
@@ -0,0 +1,215 @@
1
+ require 'tilt'
2
+
3
+ module Brite
4
+
5
+ # Stencil controls rendering to a variety
6
+ # of back-end templating and markup systems.
7
+ #
8
+ module TemplateEngine
9
+ extend self
10
+
11
+ #
12
+ def render(stencil, format, text, attributes)
13
+ text = render_format(format, text)
14
+ text = render_stencil(stencil, text, attributes)
15
+ text
16
+ end
17
+
18
+ #def render_format(format, text)
19
+ # case format
20
+ # when 'rdoc'
21
+ # rdoc(text)
22
+ # when 'markdown'
23
+ # rdiscount(text)
24
+ # when 'textile'
25
+ # redcloth(text)
26
+ # when 'haml'
27
+ # haml(text)
28
+ # else # html
29
+ # text
30
+ # end
31
+ #end
32
+
33
+ # Format Rendering
34
+ # ----------------
35
+
36
+ #
37
+ def render_format(format, text)
38
+ case format
39
+ when /^coderay/
40
+ coderay(text, format)
41
+ when 'rdoc' # TODO: Remove when next version of tilt is released.
42
+ rdoc(text)
43
+ else
44
+ if engine = Tilt[format]
45
+ engine.new{text}.render #(context)
46
+ else
47
+ text
48
+ end
49
+ end
50
+ end
51
+
52
+ #
53
+ #def redcloth(input)
54
+ # RedCloth.new(input).to_html
55
+ #end
56
+
57
+ #def bluecloth(input)
58
+ # BlueCloth.new(input).to_html
59
+ #end
60
+
61
+ #def rdiscount(input)
62
+ # RDiscount.new(input).to_html
63
+ #end
64
+
65
+ def rdoc(input)
66
+ markup = RDoc::Markup::ToHtml.new
67
+ markup.convert(input)
68
+ end
69
+
70
+ #def haml(input)
71
+ # Haml::Engine.new(input).render
72
+ #end
73
+
74
+ def coderay(input, format)
75
+ require 'coderay'
76
+ format = format.split('.')[1] || :ruby #:plaintext
77
+ tokens = CodeRay.scan(input, format.to_sym) #:ruby
78
+ tokens.div()
79
+ end
80
+
81
+ # Stencil Rendering
82
+ # -----------------
83
+
84
+ #
85
+ #def render_stencil(stencil, text, attributes)
86
+ # case stencil
87
+ # when 'rhtml'
88
+ # erb(text, attributes)
89
+ # when 'liquid'
90
+ # liquid(text, attributes)
91
+ # else
92
+ # text
93
+ # end
94
+ #end
95
+
96
+ #
97
+ def render_stencil(stencil, text, attributes)
98
+ if engine = Tilt[stencil]
99
+ engine.new{text}.render(nil, attributes)
100
+ else
101
+ text
102
+ end
103
+ end
104
+
105
+ #
106
+ #def erb(input, attributes)
107
+ # template = ERB.new(input)
108
+ # context = TemplateContext.new(attributes)
109
+ # result = template.result(context.__binding__)
110
+ # result
111
+ #end
112
+
113
+ #def liquid(input, attributes)
114
+ # template = Liquid::Template.parse(input)
115
+ # result = template.render(attributes, :filters => [TemplateFilters])
116
+ # result
117
+ #end
118
+
119
+ # Require Dependencies
120
+ # --------------------
121
+
122
+ # TODO: Load engines only if used.
123
+
124
+ begin ; require 'rubygems' ; rescue LoadError ; end
125
+ begin ; require 'erb' ; rescue LoadError ; end
126
+ begin ; require 'redcloth' ; rescue LoadError ; end
127
+ begin ; require 'bluecloth' ; rescue LoadError ; end
128
+ begin ; require 'rdiscount' ; rescue LoadError ; end
129
+
130
+ begin
131
+ require 'liquid'
132
+ #Liquid::Template.register_filter(TemplateFilters)
133
+ rescue LoadError
134
+ end
135
+
136
+ begin
137
+ require 'haml'
138
+ #Haml::Template.options[:format] = :html5
139
+ rescue LoadError
140
+ end
141
+
142
+ begin
143
+ require 'rdoc/markup'
144
+ require 'rdoc/markup/to_html'
145
+ rescue LoadError
146
+ end
147
+
148
+ end
149
+
150
+ #
151
+ #
152
+ #
153
+
154
+ #module TemplateFilters
155
+
156
+ # NOTE: HTML truncate did not work well.
157
+
158
+ # # HTML comment regular expression
159
+ # REM_RE = %r{<\!--(.*?)-->}
160
+ #
161
+ # # HTML tag regular expression
162
+ # TAG_RE = %r{</?\w+((\s+\w+(\s*=\s*(?:"(.|\n)*?"|'(.|\n)*?'|[^'">\s]+))?)+\s*|\s*)/?>} #'
163
+ #
164
+ # #
165
+ # def truncate_html(html, limit)
166
+ # return html unless limit
167
+ #
168
+ # mask = html.gsub(REM_RE){ |m| "\0" * m.size }
169
+ # mask = mask.gsub(TAG_RE){ |m| "\0" * m.size }
170
+ #
171
+ # i, x = 0, 0
172
+ #
173
+ # while i < mask.size && x < limit
174
+ # x += 1 if mask[i] != "\0"
175
+ # i += 1
176
+ # end
177
+ #
178
+ # while x > 0 && mask[x,1] == "\0"
179
+ # x -= 1
180
+ # end
181
+ #
182
+ # return html[0..x]
183
+ # end
184
+
185
+ #end
186
+
187
+ # = Clean Rendering Context
188
+ #
189
+ # The TemplateContext is is used by ERB.
190
+
191
+ class TemplateContext
192
+ #include TemplateFilters
193
+
194
+ instance_methods(true).each{ |m| private m unless m =~ /^__/ }
195
+
196
+ def initialize(attributes={})
197
+ @attributes = attributes
198
+ end
199
+
200
+ def __binding__
201
+ binding
202
+ end
203
+
204
+ def to_h
205
+ @attributes
206
+ end
207
+
208
+ def method_missing(s, *a)
209
+ s = s.to_s
210
+ @attributes.key?(s) ? @attributes[s] : super
211
+ end
212
+ end
213
+
214
+ end
215
+
data/meta/authors ADDED
@@ -0,0 +1 @@
1
+ Thomas Sawyer
data/meta/contact ADDED
@@ -0,0 +1 @@
1
+ http://googlegroups.com/group/proutils
data/meta/copyright ADDED
@@ -0,0 +1 @@
1
+ Copyright (c) 2006,2009 Thomas Sawyer
data/meta/description ADDED
@@ -0,0 +1,4 @@
1
+ Brite is a remarkably easy to use, light-weight website
2
+ generator. It supports a variety of backend rendering engines
3
+ including rhtml via eruby, textile via redcloth, markdown
4
+ via rdiscount, with others on the way.
data/meta/homepage ADDED
@@ -0,0 +1 @@
1
+ http://proutils.github.com/brite
data/meta/license ADDED
@@ -0,0 +1 @@
1
+ GPL
data/meta/name ADDED
@@ -0,0 +1 @@
1
+ brite
data/meta/repository ADDED
@@ -0,0 +1 @@
1
+ git://github.com/proutils/brite.git
data/meta/requires ADDED
@@ -0,0 +1 @@
1
+ tilt
data/meta/ruby ADDED
@@ -0,0 +1,2 @@
1
+ - 1.8.6
2
+ - 1.8.7
data/meta/subtitle ADDED
@@ -0,0 +1 @@
1
+ Light Up Your Site
data/meta/suite ADDED
@@ -0,0 +1 @@
1
+ proutils
data/meta/summary ADDED
@@ -0,0 +1 @@
1
+ Super Simple Static Site Generation
data/meta/title ADDED
@@ -0,0 +1 @@
1
+ Brite
data/meta/version ADDED
@@ -0,0 +1 @@
1
+ 0.5
metadata ADDED
@@ -0,0 +1,101 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: brite
3
+ version: !ruby/object:Gem::Version
4
+ version: "0.5"
5
+ platform: ruby
6
+ authors:
7
+ - Thomas Sawyer
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-11-17 00:00:00 -05:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: tilt
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: "0"
24
+ version:
25
+ description: |-
26
+ Brite is a remarkably easy to use, light-weight website
27
+ generator. It supports a variety of backend rendering engines
28
+ including rhtml via eruby, textile via redcloth, markdown
29
+ via rdiscount, with others on the way.
30
+ email: http://googlegroups.com/group/proutils
31
+ executables:
32
+ - brite
33
+ extensions: []
34
+
35
+ extra_rdoc_files:
36
+ - README
37
+ - MANIFEST
38
+ - LICENSE
39
+ - HISTORY
40
+ files:
41
+ - bin/brite
42
+ - lib/brite/command.rb
43
+ - lib/brite/config.rb
44
+ - lib/brite/layout.rb
45
+ - lib/brite/page.rb
46
+ - lib/brite/part.rb
47
+ - lib/brite/post.rb
48
+ - lib/brite/site.rb
49
+ - lib/brite/template.rb
50
+ - meta/authors
51
+ - meta/contact
52
+ - meta/copyright
53
+ - meta/description
54
+ - meta/homepage
55
+ - meta/license
56
+ - meta/name
57
+ - meta/repository
58
+ - meta/requires
59
+ - meta/ruby
60
+ - meta/subtitle
61
+ - meta/suite
62
+ - meta/summary
63
+ - meta/title
64
+ - meta/version
65
+ - LICENSE
66
+ - README
67
+ - HISTORY
68
+ - MANIFEST
69
+ has_rdoc: true
70
+ homepage: http://proutils.github.com/brite
71
+ licenses: []
72
+
73
+ post_install_message:
74
+ rdoc_options:
75
+ - --title
76
+ - Brite API
77
+ - --main
78
+ - README
79
+ require_paths:
80
+ - lib
81
+ required_ruby_version: !ruby/object:Gem::Requirement
82
+ requirements:
83
+ - - ">="
84
+ - !ruby/object:Gem::Version
85
+ version: "0"
86
+ version:
87
+ required_rubygems_version: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - ">="
90
+ - !ruby/object:Gem::Version
91
+ version: "0"
92
+ version:
93
+ requirements: []
94
+
95
+ rubyforge_project: brite
96
+ rubygems_version: 1.3.5
97
+ signing_key:
98
+ specification_version: 3
99
+ summary: Super Simple Static Site Generation
100
+ test_files: []
101
+