brite 0.6.0 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (71) hide show
  1. data/.ruby +56 -0
  2. data/COPYING.rdoc +30 -0
  3. data/HISTORY.rdoc +16 -2
  4. data/README.rdoc +35 -27
  5. data/bin/brite-server +1 -1
  6. data/lib/brite.rb +2 -1
  7. data/lib/brite.yml +56 -0
  8. data/lib/brite/command.rb +100 -55
  9. data/lib/brite/config.rb +122 -40
  10. data/lib/brite/controller.rb +46 -104
  11. data/lib/brite/layout.rb +27 -13
  12. data/lib/brite/model.rb +107 -0
  13. data/lib/brite/page.rb +229 -0
  14. data/lib/brite/part.rb +88 -0
  15. data/lib/brite/post.rb +41 -0
  16. data/lib/brite/server.rb +88 -93
  17. data/lib/brite/site.rb +150 -0
  18. data/lib/brite/version.rb +21 -0
  19. data/test/fixture/brite.yml +3 -0
  20. data/test/fixture/example-page.page +8 -0
  21. data/test/fixture/example-post.post +9 -0
  22. data/test/helper.rb +5 -0
  23. data/test/test_config.rb +23 -0
  24. data/test/test_page.rb +28 -0
  25. data/test/test_site.rb +37 -0
  26. metadata +104 -109
  27. data/LICENSE +0 -205
  28. data/Syckfile +0 -76
  29. data/lib/brite/meta/data.rb +0 -26
  30. data/lib/brite/meta/package +0 -8
  31. data/lib/brite/meta/profile +0 -19
  32. data/lib/brite/models/model.rb +0 -97
  33. data/lib/brite/models/page.rb +0 -142
  34. data/lib/brite/models/post.rb +0 -9
  35. data/lib/brite/models/site.rb +0 -46
  36. data/lib/brite/rackup.rb +0 -6
  37. data/lib/plugins/sow/brite/awesome/Sowfile +0 -11
  38. data/lib/plugins/sow/brite/awesome/about.page +0 -28
  39. data/lib/plugins/sow/brite/awesome/assets/custom.less +0 -96
  40. data/lib/plugins/sow/brite/awesome/assets/fade.png +0 -0
  41. data/lib/plugins/sow/brite/awesome/assets/highlight.css +0 -96
  42. data/lib/plugins/sow/brite/awesome/assets/highlight.js +0 -1
  43. data/lib/plugins/sow/brite/awesome/assets/jquery.js +0 -19
  44. data/lib/plugins/sow/brite/awesome/assets/jquery.tabs.js +0 -1
  45. data/lib/plugins/sow/brite/awesome/assets/reset.css +0 -57
  46. data/lib/plugins/sow/brite/awesome/assets/ruby.png +0 -0
  47. data/lib/plugins/sow/brite/awesome/brite.yaml +0 -3
  48. data/lib/plugins/sow/brite/awesome/history.page +0 -15
  49. data/lib/plugins/sow/brite/awesome/index.page +0 -18
  50. data/lib/plugins/sow/brite/awesome/legal.page +0 -28
  51. data/lib/plugins/sow/brite/awesome/logs.page +0 -14
  52. data/lib/plugins/sow/brite/awesome/page.layout +0 -75
  53. data/lib/plugins/sow/brite/blog1/.rsync-filter +0 -12
  54. data/lib/plugins/sow/brite/blog1/2011/01/sample.html +0 -293
  55. data/lib/plugins/sow/brite/blog1/2011/01/sample.post +0 -44
  56. data/lib/plugins/sow/brite/blog1/Sowfile +0 -10
  57. data/lib/plugins/sow/brite/blog1/assets/images/bg.jpg +0 -0
  58. data/lib/plugins/sow/brite/blog1/assets/images/icon.jpg +0 -0
  59. data/lib/plugins/sow/brite/blog1/assets/styles/class.css +0 -15
  60. data/lib/plugins/sow/brite/blog1/assets/styles/id.css +0 -85
  61. data/lib/plugins/sow/brite/blog1/assets/styles/misc.css +0 -0
  62. data/lib/plugins/sow/brite/blog1/assets/styles/print.css +0 -76
  63. data/lib/plugins/sow/brite/blog1/assets/styles/reset.css +0 -77
  64. data/lib/plugins/sow/brite/blog1/assets/styles/tag.css +0 -68
  65. data/lib/plugins/sow/brite/blog1/brite.yml +0 -3
  66. data/lib/plugins/sow/brite/blog1/index.page +0 -23
  67. data/lib/plugins/sow/brite/blog1/page.layout +0 -88
  68. data/lib/plugins/sow/brite/blog1/post.layout +0 -25
  69. data/meta/data.rb +0 -26
  70. data/meta/package +0 -8
  71. data/meta/profile +0 -19
@@ -0,0 +1,107 @@
1
+ module Brite
2
+
3
+ # Base class for all site classes.
4
+ #
5
+ class Model
6
+
7
+ #
8
+ def initialize(site, file, data={})
9
+ @site = site
10
+ @files = file
11
+
12
+ update(date)
13
+ end
14
+
15
+ attr_reader :site
16
+
17
+ attr_reader :file
18
+
19
+ #
20
+ def config
21
+ site.config
22
+ end
23
+
24
+ #
25
+ # Render partial template.
26
+ #
27
+ def part(path)
28
+ @part ||= (
29
+ partial = site.lookup_partial(path.to_s)
30
+ #if path
31
+ # partial = site.parts.find{ |part|
32
+ # part.name == path
33
+ # }
34
+ raise "no such part -- #{path} from #{file}" unless partial
35
+ partial.render
36
+ #else
37
+ # Part::Manager.new(self)
38
+ #end
39
+ )
40
+ end
41
+
42
+ #
43
+ def update(data)
44
+ data.each do |k,v|
45
+ self[k] = v
46
+ end
47
+ end
48
+
49
+ # Add entry to settings data.
50
+ def [](k)
51
+ instance_variable_get("@#{k}")
52
+ end
53
+
54
+ # Add entry to settings data.
55
+ def []=(k,v)
56
+ if respond_to?("#{k}=")
57
+ __send__("#{k}=", v)
58
+ else
59
+ instance_variable_set("@#{k}", v)
60
+ end
61
+ end
62
+
63
+ #def to_ary
64
+ # p caller
65
+ # raise
66
+ #end
67
+
68
+ #
69
+ def method_missing(name, *a, &b)
70
+ instance_variable_get("@#{name}")
71
+ end
72
+
73
+ # Returns a Binding for this instance.
74
+ def to_binding(&block)
75
+ binding
76
+ end
77
+
78
+ # Returns a Hash of rendering fields.
79
+ def to_h
80
+ hash = {}
81
+ fields = rendering_fields
82
+ fields.each do |field|
83
+ hash[field.to_s] = __send__(field)
84
+ end
85
+ hash
86
+ end
87
+
88
+ # Returns an Array of attribute/method names to be visible to the page
89
+ # rendering.
90
+ def rendering_fields
91
+ list = []
92
+ instance_variables.each do |iv|
93
+ name = iv.to_s.sub('@','')
94
+ next if name.start_with?('_')
95
+ list << name
96
+ end
97
+ list
98
+ end
99
+
100
+ #
101
+ #def singleton_class
102
+ # (class << self; self; end)
103
+ #end
104
+
105
+ end
106
+
107
+ end
@@ -0,0 +1,229 @@
1
+ require 'brite/model'
2
+
3
+ module Brite
4
+
5
+ # Models a site page.
6
+ class Page < Model
7
+
8
+ # New Page.
9
+ def initialize(site, file, copy={})
10
+ @site = site
11
+ @file = file
12
+
13
+ initialize_defaults
14
+
15
+ update(copy)
16
+
17
+ @_template = Neapolitan.file(file, :stencil=>site.config.stencil) #site.page_defaults)
18
+
19
+ update(@_template.metadata)
20
+ end
21
+
22
+ #
23
+ def initialize_defaults
24
+ @tags = []
25
+ @author = site.config.author
26
+ @route = site.config.page_route
27
+ @layout = site.config.page_layout
28
+
29
+ @extension = '.html'
30
+
31
+ # these are filled-out as needed, but the instance variable
32
+ # must define up front to ensure #to_h will pick them up.
33
+ # Probably this should be done in a different way in the future.
34
+ @output = nil
35
+ @path = nil
36
+ @name = nil
37
+ @url = nil
38
+ @root = nil
39
+ end
40
+
41
+ # Instance of Site class to which this page belongs.
42
+ attr_reader :site
43
+
44
+ # The `.page` file.
45
+ attr_reader :file
46
+
47
+ # Author of page.
48
+ attr_accessor :author
49
+
50
+ # Title of page/post.
51
+ attr_accessor :title
52
+
53
+ # Publish date.
54
+ attr_accessor :date
55
+
56
+ def date
57
+ @date ||= date_from_filename(file) || Time.now
58
+ end
59
+
60
+ # Category ("a glorified tag")
61
+ attr_accessor :category
62
+
63
+ # Is this page a draft? If so it will not be rendered.
64
+ attr_accessor :draft
65
+
66
+ # Query alias for #draft.
67
+ alias_method :draft?, :draft
68
+
69
+ # Output route.
70
+ attr_accessor :route
71
+
72
+ # Layout to use for page.
73
+ attr_accessor :layout
74
+
75
+ # Tags (labels)
76
+ attr_accessor :tags
77
+
78
+ #
79
+ def tags=(entry)
80
+ case entry
81
+ when String, Symbol
82
+ entry = entry.to_s.strip
83
+ if entry.index(/[,;]/)
84
+ entry = entry.split(/[,;]/)
85
+ else
86
+ entry = entry.split(/\s+/)
87
+ end
88
+ else
89
+ entry = entry.to_a.flatten
90
+ end
91
+ @tags = entry.map{ |e| e.strip }
92
+ end
93
+
94
+ # The page's route, which is effectively the "Save As" output file.
95
+ def output
96
+ @output ||= calculate_output
97
+ end
98
+
99
+ # Set route directly, relative to file, overriding any slug.
100
+ def output=(path)
101
+ @output = path.sub(/^\//,'')
102
+ end
103
+
104
+ # Setting the peramlink is the same as setting output.
105
+ alias_method :permalink=, :output=
106
+
107
+ # Same as output but prefixed with `/`.
108
+ def permalink
109
+ '/' + output
110
+ end
111
+
112
+ alias_method :url, :permalink
113
+
114
+ #
115
+ #def url
116
+ # @url ||= config.url ? File.join(config.url, output) : permalink
117
+ #end
118
+
119
+ # The `name` is same as `output` but without any file extension.
120
+ def name
121
+ @name ||= output.chomp(extension)
122
+ end
123
+
124
+ #
125
+ #attr_accessor :relative_url do
126
+ # output #File.join(root, output)
127
+ #end
128
+
129
+ # THINK: Is there any reason to have #work ?
130
+ # Working directory of file being rendering.
131
+ #def work
132
+ # @work ||= '/' + File.dirname(file)
133
+ #end
134
+
135
+ # Relative path difference between the route and the site's root.
136
+ # The return value is a string of `..` paths, e.g. `"../../"`.
137
+ #
138
+ # @return [String] multiples of `../`.
139
+ def root
140
+ #@root ||= '../' * file.count('/')
141
+ @root ||= '../' * (output.count('/') - (output.scan('../').length*2))
142
+ end
143
+
144
+ # Output extension (defualts to 'html').
145
+ def extension
146
+ @extension #||= '.html'
147
+ end
148
+
149
+ # Set output extension.
150
+ #
151
+ # @param [String] extname
152
+ # The file extension.
153
+ #
154
+ def extension=(extname)
155
+ @extension = (
156
+ e = (extname || 'html').to_s
157
+ e = '.' + e unless e.start_with?('.')
158
+ e
159
+ )
160
+ end
161
+
162
+ # TODO: Summary is being set externally, is there a way to fix ?
163
+
164
+ # Summary is the rendering of the first part.
165
+ attr_accessor :summary
166
+
167
+ # Renders page template.
168
+ def to_s
169
+ render
170
+ end
171
+
172
+ #
173
+ def inspect
174
+ "#<#{self.class} #{@file}>"
175
+ end
176
+
177
+ private
178
+
179
+ #
180
+ def date_from_filename(file)
181
+ if md = (/^\d\d\d\d-\d\d-\d\d/.match(file))
182
+ md[1]
183
+ else
184
+ File.mtime(file)
185
+ end
186
+ end
187
+
188
+ #
189
+ def calculate_output
190
+ path = file.chomp(File.extname(file))
191
+ name = File.basename(path)
192
+
193
+ out = route.dup
194
+ out = date.strftime(out) if out.index('%')
195
+ out = out.sub(':path', path)
196
+ out = out.sub(':name', name)
197
+ out = out + extension
198
+ out
199
+ end
200
+
201
+ # Render page or post.
202
+ #
203
+ # @param [Neapolitan::Template] template
204
+ # Template to be rendered.
205
+ #
206
+ # @param [Model] model
207
+ # Page or Post model to use for rendering.
208
+ #
209
+ def render
210
+ render = @_template.render(self) #, &body)
211
+
212
+ self.summary = render.summary # TODO: make part of neapolitan?
213
+
214
+ result = render.to_s
215
+
216
+ if layout
217
+ if layout_object = site.lookup_layout(layout)
218
+ result = layout_object.render(self){ result }
219
+ #else
220
+ # raise "No such layout -- #{layout}" unless layout
221
+ end
222
+ end
223
+
224
+ result.to_s.strip
225
+ end
226
+
227
+ end
228
+
229
+ end
@@ -0,0 +1,88 @@
1
+ module Brite
2
+
3
+ # In you templates:
4
+ #
5
+ # <%= part.some_part_name %>
6
+ #
7
+ class Part < Model
8
+
9
+ # New Page.
10
+ def initialize(site, file, copy={})
11
+ @site = site
12
+ @file = file
13
+
14
+ initialize_defaults
15
+
16
+ update(copy)
17
+
18
+ @_template = Neapolitan.file(file, :stencil=>site.config.stencil) #site.page_defaults)
19
+
20
+ update(@_template.metadata)
21
+ end
22
+
23
+ #
24
+ def initialize_defaults
25
+ @layout = nil
26
+
27
+ @part = nil
28
+ @name = nil
29
+ @basename = nil
30
+ end
31
+
32
+ #
33
+ def name
34
+ @name ||= file.chomp('.part')
35
+ end
36
+
37
+ #
38
+ def basename
39
+ @basename ||= File.basename(name)
40
+ end
41
+
42
+ # Render page or post template.
43
+ #
44
+ def render
45
+ render = @_template.render(self) #, &body)
46
+
47
+ result = render.to_s
48
+
49
+ if layout
50
+ if layout_object = site.lookup_layout(layout)
51
+ result = layout_object.render(self){ result }
52
+ #else
53
+ # raise "No such layout -- #{layout}"
54
+ end
55
+ end
56
+
57
+ result.to_s.strip
58
+ end
59
+
60
+ #
61
+ class Manager
62
+
63
+ def initialize(model)
64
+ @model = model
65
+ @site = model.site
66
+
67
+ @parts = {}
68
+ model.site.parts.each do |part|
69
+ @parts[part.basename] = part
70
+ end
71
+ end
72
+
73
+ #
74
+ def to_h
75
+ @parts
76
+ end
77
+
78
+ #
79
+ def method_missing(name, *args, &block)
80
+ @parts[name.to_s].render
81
+ end
82
+
83
+ end
84
+
85
+ end
86
+
87
+ end
88
+
@@ -0,0 +1,41 @@
1
+ require 'brite/page'
2
+
3
+ module Brite
4
+
5
+ # Models a blog post. A post is essentially the same as a page,
6
+ # but carries a relatition with other posts that a page does not.
7
+ #
8
+ class Post < Page
9
+
10
+ #
11
+ def initialize_defaults
12
+ super
13
+
14
+ @route = site.config.post_route
15
+ @layout = site.config.post_layout #@site.config.find_layout(@site.config.post_layout)
16
+
17
+ @previous_post = nil
18
+ @next_post = nil
19
+ end
20
+
21
+ # This assumes `site.posts` is sorted by date.
22
+ #
23
+ # @todo Rename to back_post.
24
+ def previous_post
25
+ @previous_post ||= (
26
+ index = site.posts.index(self)
27
+ index == 0 ? nil : site.posts[index - 1]
28
+ )
29
+ end
30
+
31
+ # This assumes `site.posts` is sorted by date.
32
+ def next_post
33
+ @next_post ||= (
34
+ index = site.posts.index(self)
35
+ site.posts[index + 1]
36
+ )
37
+ end
38
+
39
+ end
40
+
41
+ end