proton 0.3.3 → 0.3.4
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +2 -66
- data/Rakefile +14 -0
- data/data/new_site/_layouts/default.haml +1 -1
- data/data/rack/Gemfile +1 -1
- data/lib/proton.rb +10 -9
- data/lib/proton/cacheable.rb +47 -0
- data/lib/proton/cli.rb +1 -1
- data/lib/proton/helpers.rb +17 -17
- data/lib/proton/page.rb +179 -75
- data/lib/proton/server.rb +5 -0
- data/lib/proton/version.rb +1 -1
- data/test/fixture/one/public/css/style.css +1 -1
- metadata +95 -101
- data/data/rack/Gemfile.lock +0 -40
data/README.md
CHANGED
@@ -1,72 +1,8 @@
|
|
1
1
|
# [Proton](http://sinefunc.com/proton?)
|
2
2
|
#### Proton is a website preprocessor.
|
3
3
|
|
4
|
-
http://sinefunc.com/proton/
|
5
|
-
|
6
|
-
- __HAML, Sass, Compass and more:__ Proton will let you write in HAML, SCSS,
|
7
|
-
Sass, and more by default. It also comes preloaded with
|
8
|
-
[Compass](http://compass-style.org).
|
9
|
-
|
10
|
-
- __Layouts and Partials:__ Proton lets you define your site's header and footer
|
11
|
-
layouts in a separate file, and even separate snippets of your site
|
12
|
-
into reuseable components (partials). Your code will be much cleaner and
|
13
|
-
DRYer!
|
14
|
-
|
15
|
-
- __Template languages:__ Proton lets you write your site in any template
|
16
|
-
language you need -- the translation will be taken care of for you.
|
17
|
-
Proton supports HAML, LessCSS, Markdown, SASS and Textile by default, and
|
18
|
-
more can be added through extensions.
|
19
|
-
|
20
|
-
- __Extendable:__ Proton is easily customizable with extensions. You can add
|
21
|
-
new helpers, new commands, support for new languages and many more by
|
22
|
-
simply adding the extensions to your project folder. Some are even
|
23
|
-
available as simple Ruby gems!
|
24
|
-
|
25
|
-
- __Design fast:__ Proton comes with a web server that lets you serve up
|
26
|
-
your site locally. Any changes to your files will be seen on your next
|
27
|
-
browser refresh!
|
28
|
-
|
29
|
-
- __Build your site as static HTMLs:__ You can export your site as plain
|
30
|
-
HTML files with one simple command.
|
31
|
-
|
32
|
-
Why use Proton?
|
33
|
-
---------------
|
34
|
-
|
35
|
-
It's like building a static site, but better! You can use Proton for:
|
36
|
-
|
37
|
-
- Building HTML prototypes
|
38
|
-
- Building sites with no dynamic logic
|
39
|
-
- Creating a blog where the entries are stored in a source repository
|
40
|
-
|
41
|
-
Installation
|
42
|
-
------------
|
43
|
-
|
44
|
-
gem install proton
|
45
|
-
|
46
|
-
Usage
|
47
|
-
-----
|
48
|
-
|
49
|
-
Here's how you can get started:
|
50
|
-
|
51
|
-
proton create <project_name>
|
52
|
-
cd <project_name>
|
53
|
-
proton build # <= Build the HTML files, or
|
54
|
-
proton start # <= Serve via a local web server
|
55
|
-
|
56
|
-
|
57
|
-
Testing
|
58
|
-
-------
|
59
|
-
|
60
|
-
Run tests:
|
61
|
-
|
62
|
-
rake test
|
63
|
-
|
64
|
-
To try it in a different Ruby version, you can use RVM + Bundler to make
|
65
|
-
things easier. For instance:
|
66
|
-
|
67
|
-
rvm use 1.8.7@proton --create # Create a gemset
|
68
|
-
bundle install # Install the needed gems on that set
|
69
|
-
rake test
|
4
|
+
* Website: http://sinefunc.com/proton/
|
5
|
+
* Documentation: http://sinefunc.com/proton/manual
|
70
6
|
|
71
7
|
Authors
|
72
8
|
-------
|
data/Rakefile
CHANGED
@@ -2,4 +2,18 @@ task :test do
|
|
2
2
|
Dir['test/**/*_test.rb'].each { |f| load f }
|
3
3
|
end
|
4
4
|
|
5
|
+
namespace :doc do
|
6
|
+
desc "Builds the docs in doc/."
|
7
|
+
task :update do
|
8
|
+
# gem install proscribe (~> 0.0.2)
|
9
|
+
system "proscribe build"
|
10
|
+
end
|
11
|
+
|
12
|
+
desc "Updates the online manual."
|
13
|
+
task :deploy => :update do
|
14
|
+
# http://github.com/rstacruz/git-update-ghpages
|
15
|
+
system "git update-ghpages sinefunc/proton -i doc --prefix manual"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
5
19
|
task :default => :test
|
data/data/rack/Gemfile
CHANGED
data/lib/proton.rb
CHANGED
@@ -51,15 +51,16 @@ class Proton
|
|
51
51
|
# An array of the allowed config filenames.
|
52
52
|
CONFIG_FILES = ['Protonfile', 'proton.conf', '.protonrc', 'hyde.conf', '.hyderc']
|
53
53
|
|
54
|
-
autoload :Project,
|
55
|
-
autoload :Page,
|
56
|
-
autoload :Meta,
|
57
|
-
autoload :Config,
|
58
|
-
autoload :CLI,
|
59
|
-
autoload :Set,
|
60
|
-
autoload :Layout,
|
61
|
-
autoload :Partial,
|
62
|
-
autoload :Helpers,
|
54
|
+
autoload :Project, "#{PREFIX}/proton/project"
|
55
|
+
autoload :Page, "#{PREFIX}/proton/page"
|
56
|
+
autoload :Meta, "#{PREFIX}/proton/meta"
|
57
|
+
autoload :Config, "#{PREFIX}/proton/config"
|
58
|
+
autoload :CLI, "#{PREFIX}/proton/cli"
|
59
|
+
autoload :Set, "#{PREFIX}/proton/set"
|
60
|
+
autoload :Layout, "#{PREFIX}/proton/layout"
|
61
|
+
autoload :Partial, "#{PREFIX}/proton/partial"
|
62
|
+
autoload :Helpers, "#{PREFIX}/proton/helpers"
|
63
|
+
autoload :Cacheable, "#{PREFIX}/proton/cacheable"
|
63
64
|
|
64
65
|
require "#{PREFIX}/proton/version"
|
65
66
|
|
@@ -0,0 +1,47 @@
|
|
1
|
+
class Proton
|
2
|
+
# Module: Cache
|
3
|
+
module Cacheable
|
4
|
+
def self.enable!
|
5
|
+
@enabled = true
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.disable!
|
9
|
+
@enabled = false
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.enabled?()
|
13
|
+
!! @enabled
|
14
|
+
end
|
15
|
+
|
16
|
+
# Enable by default
|
17
|
+
enable!
|
18
|
+
|
19
|
+
def self.cache(*args)
|
20
|
+
if enabled?
|
21
|
+
@cache ||= Hash.new
|
22
|
+
args = args.map { |s| s.to_s }.join('-')
|
23
|
+
@cache[args] ||= yield
|
24
|
+
else
|
25
|
+
yield
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def cache_method(*methods)
|
30
|
+
methods.each do |method|
|
31
|
+
alias_method :"real_#{method}", method
|
32
|
+
|
33
|
+
class_eval do
|
34
|
+
define_method(method) { |*args|
|
35
|
+
id = nil
|
36
|
+
id ||= self.file if respond_to?(:file)
|
37
|
+
id ||= self.to_s
|
38
|
+
|
39
|
+
Cacheable.cache self.class, method, id, args do
|
40
|
+
send :"real_#{method}", *args
|
41
|
+
end
|
42
|
+
}
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
data/lib/proton/cli.rb
CHANGED
data/lib/proton/helpers.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Module: Proton::Helpers
|
1
|
+
# Module: Proton::Helpers
|
2
2
|
# Helpers you can use in your pages.
|
3
3
|
#
|
4
4
|
# ## Creating your own helpers
|
@@ -10,7 +10,7 @@
|
|
10
10
|
class Proton
|
11
11
|
module Helpers
|
12
12
|
|
13
|
-
#
|
13
|
+
# Helper: partial (Helpers)
|
14
14
|
# Renders a partial.
|
15
15
|
#
|
16
16
|
# ## Usage
|
@@ -38,7 +38,7 @@ module Helpers
|
|
38
38
|
partial.to_html locals.merge(:page => self)
|
39
39
|
end
|
40
40
|
|
41
|
-
#
|
41
|
+
# Helper: rel (Helpers)
|
42
42
|
# Turns a path into a relative path.
|
43
43
|
#
|
44
44
|
# ## Usage
|
@@ -76,14 +76,14 @@ module Helpers
|
|
76
76
|
end
|
77
77
|
end
|
78
78
|
|
79
|
-
#
|
79
|
+
# Helper: content_for (Helpers)
|
80
80
|
# Content for.
|
81
81
|
#
|
82
82
|
# ## See also
|
83
83
|
#
|
84
|
-
# * {
|
85
|
-
# * {
|
86
|
-
# * {
|
84
|
+
# * {Helpers:has_content?}
|
85
|
+
# * {Helpers:content_for}
|
86
|
+
# * {Helpers:yield_content}
|
87
87
|
#
|
88
88
|
def content_for(key, &blk)
|
89
89
|
content_blocks[key.to_sym] = blk
|
@@ -94,31 +94,31 @@ module Helpers
|
|
94
94
|
$content_blocks[page.path] ||= Hash.new
|
95
95
|
end
|
96
96
|
|
97
|
-
#
|
97
|
+
# Helper: has_content? (Helpers)
|
98
98
|
# Checks if there's something defined for a given content block.
|
99
99
|
#
|
100
100
|
# ## Example
|
101
|
-
# See {
|
101
|
+
# See {Helpers:content_for} for an example.
|
102
102
|
#
|
103
103
|
# ## See also
|
104
|
-
# * {
|
105
|
-
# * {
|
106
|
-
# * {
|
104
|
+
# * {Helpers:has_content?}
|
105
|
+
# * {Helpers:content_for}
|
106
|
+
# * {Helpers:yield_content}
|
107
107
|
#
|
108
108
|
def has_content?(key)
|
109
109
|
content_blocks.member? key.to_sym
|
110
110
|
end
|
111
111
|
|
112
|
-
#
|
112
|
+
# Helper: yield_content (Helpers)
|
113
113
|
# Yield
|
114
114
|
#
|
115
115
|
# ## Example
|
116
|
-
# See {
|
116
|
+
# See {Helpers:content_for} for an example.
|
117
117
|
#
|
118
118
|
# ## See also
|
119
|
-
# * {
|
120
|
-
# * {
|
121
|
-
# * {
|
119
|
+
# * {Helpers:has_content?}
|
120
|
+
# * {Helpers:content_for}
|
121
|
+
# * {Helpers:yield_content}
|
122
122
|
#
|
123
123
|
def yield_content(key, *args)
|
124
124
|
content = content_blocks[key.to_sym]
|
data/lib/proton/page.rb
CHANGED
@@ -1,112 +1,131 @@
|
|
1
1
|
class Proton
|
2
|
-
#
|
2
|
+
# Class: Proton::Page
|
3
|
+
# A page.
|
4
|
+
#
|
5
|
+
# ## Common usage
|
3
6
|
#
|
4
7
|
# Getting pages from paths:
|
5
8
|
#
|
6
|
-
#
|
7
|
-
#
|
8
|
-
#
|
9
|
+
# # Feed it a URL path, not a filename.
|
10
|
+
# page = Proton::Page['/index.html'] # uses Proton.project
|
11
|
+
# page = Proton::Page['/index.html', project]
|
9
12
|
#
|
10
13
|
# Getting pages from files:
|
11
14
|
#
|
12
|
-
#
|
13
|
-
#
|
14
|
-
#
|
15
|
+
# # Feed it a file name, not a URL path.
|
16
|
+
# # Also, this does no sanity checks.
|
17
|
+
# page = Proton::Page.new('/home/rsc/index.html', project)
|
15
18
|
#
|
16
|
-
#
|
17
|
-
#
|
19
|
+
# page.exists?
|
20
|
+
# page.valid?
|
18
21
|
#
|
19
22
|
# Paths:
|
20
23
|
#
|
21
|
-
#
|
22
|
-
#
|
24
|
+
# page.filepath #=> "index.haml" -- path in the filesystem
|
25
|
+
# page.path #=> "/index.html" -- path as a RUL
|
23
26
|
#
|
24
27
|
# Meta:
|
25
28
|
#
|
26
|
-
#
|
27
|
-
#
|
29
|
+
# page.meta #=> OpenStruct of the metadata
|
30
|
+
# page.title #=> "Welcome to my site!"
|
28
31
|
#
|
29
|
-
#
|
30
|
-
#
|
32
|
+
# page.layout # Proton::Layout or nil
|
33
|
+
# page.layout?
|
31
34
|
#
|
32
35
|
# Types:
|
33
36
|
#
|
34
|
-
#
|
35
|
-
#
|
36
|
-
#
|
37
|
+
# page.html?
|
38
|
+
# page.mime_type #=> "text/html" or nil -- only for tilt? == true
|
39
|
+
# page.default_ext #=> "html"
|
37
40
|
#
|
38
41
|
# Contents:
|
39
42
|
#
|
40
|
-
#
|
41
|
-
#
|
42
|
-
#
|
43
|
-
#
|
43
|
+
# page.to_html
|
44
|
+
# page.to_html(locals={})
|
45
|
+
# page.content
|
46
|
+
# page.markup
|
44
47
|
#
|
45
48
|
# Traversion:
|
46
49
|
#
|
47
50
|
#
|
48
|
-
#
|
49
|
-
#
|
50
|
-
#
|
51
|
+
# # Pages (a Proton::Page or nil)
|
52
|
+
# page.parent
|
53
|
+
# page.next
|
51
54
|
#
|
52
|
-
#
|
53
|
-
#
|
54
|
-
#
|
55
|
-
#
|
55
|
+
# # Sets (a Proton::Set)
|
56
|
+
# page.children
|
57
|
+
# page.siblings
|
58
|
+
# page.breadcrumbs
|
56
59
|
#
|
57
|
-
#
|
58
|
-
#
|
59
|
-
#
|
60
|
-
#
|
61
|
-
#
|
60
|
+
# # Misc
|
61
|
+
# page.index? # if it's an index.html
|
62
|
+
# page.parent?
|
63
|
+
# page.root? # true if no parents
|
64
|
+
# page.depth
|
62
65
|
#
|
63
66
|
# Tilt:
|
64
67
|
#
|
65
|
-
#
|
66
|
-
#
|
68
|
+
# page.tilt? # true, if it's a dynamic file
|
69
|
+
# page.tilt_engine_name #=> 'RedCloth'
|
67
70
|
#
|
68
71
|
# Building:
|
69
72
|
#
|
70
|
-
#
|
71
|
-
#
|
73
|
+
# page.write
|
74
|
+
# page.write('~/foo.html')
|
72
75
|
#
|
73
76
|
class Page
|
77
|
+
# Attribute: project (Proton::Page)
|
78
|
+
# A reference to the project.
|
79
|
+
#
|
74
80
|
attr_reader :project
|
81
|
+
|
82
|
+
# Attribute: file (Proton::Page)
|
83
|
+
# The full path of the source file.
|
84
|
+
#
|
85
|
+
# ## Example
|
86
|
+
# page.filepath #=> "/index.haml"
|
87
|
+
# page.file #=> "/home/rsc/project/index.haml"
|
88
|
+
#
|
89
|
+
# ## See also
|
90
|
+
# - {Proton::Page.filepath}
|
91
|
+
#
|
75
92
|
attr_reader :file
|
76
93
|
|
77
94
|
def self.[](id, project=Proton.project)
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
95
|
+
Cacheable.cache(:lookup, id, project.root) do
|
96
|
+
site_path = root_path(project)
|
97
|
+
return nil if site_path.nil?
|
98
|
+
|
99
|
+
site = lambda { |*x| File.join site_path, *(x.compact) }
|
100
|
+
try = lambda { |_id| p = new(_id, project); p if p.exists? }
|
101
|
+
|
102
|
+
# For paths like '/' or '/hello/'
|
103
|
+
nonfile = File.basename(id).gsub('/','').empty?
|
104
|
+
|
105
|
+
# Account for:
|
106
|
+
# ~/mysite/site/about/us.html.haml
|
107
|
+
# about/us.html.haml => ~/mysite/site/about/us.html.haml
|
108
|
+
# about/us.html => ~/mysite/site/about/us.html.*
|
109
|
+
# about/us.html => ~/mysite/site/about/us.*
|
110
|
+
# about/us => ~/mysite/site/about/us/index.*
|
111
|
+
#
|
112
|
+
page = try[id]
|
113
|
+
page ||= try[site[id]]
|
114
|
+
unless nonfile
|
115
|
+
page ||= try[Dir[site["#{id}.*"]].first]
|
116
|
+
page ||= try[Dir[site["#{id.to_s.sub(/\.[^\.]*/,'')}.*"]].first]
|
117
|
+
end
|
118
|
+
page ||= try[Dir[site[id, "index.*"]].first]
|
101
119
|
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
120
|
+
# Subclass
|
121
|
+
if page && page.tilt? && page.meta[:type]
|
122
|
+
klass = Page.get_type(page.meta[:type])
|
123
|
+
raise Error, "#{page.filepath}: Class for type '#{page.meta[:type]}' not found" unless klass
|
124
|
+
page = klass.new(id, project)
|
125
|
+
end
|
108
126
|
|
109
|
-
|
127
|
+
page
|
128
|
+
end
|
110
129
|
end
|
111
130
|
|
112
131
|
def initialize(file, project=Proton.project)
|
@@ -128,7 +147,16 @@ class Page
|
|
128
147
|
path
|
129
148
|
end
|
130
149
|
|
131
|
-
#
|
150
|
+
# Attribute: filepath (Proton::Page)
|
151
|
+
# Returns a short filepath relative to the project path.
|
152
|
+
#
|
153
|
+
# ## Description
|
154
|
+
# This is different from {Proton::Page.file} as this only returns the
|
155
|
+
# path relative to the project's root instead of an absolute path.
|
156
|
+
#
|
157
|
+
# ## Example
|
158
|
+
# See {Proton::Page.file} for an example.
|
159
|
+
#
|
132
160
|
def filepath
|
133
161
|
root = project.root
|
134
162
|
fpath = file
|
@@ -136,6 +164,16 @@ class Page
|
|
136
164
|
fpath
|
137
165
|
end
|
138
166
|
|
167
|
+
# Attribute: title (Proton::Page)
|
168
|
+
# Returns the page title as a string.
|
169
|
+
#
|
170
|
+
# ## Description
|
171
|
+
# This attribute tries to infer the page's title based on metadata. If the
|
172
|
+
# `title` key is not in the page's header metadata, then it returns the
|
173
|
+
# path name instead.
|
174
|
+
#
|
175
|
+
# This is also aliased as `to_s`.
|
176
|
+
#
|
139
177
|
def title
|
140
178
|
(meta.title if tilt?) || path
|
141
179
|
end
|
@@ -159,8 +197,8 @@ class Page
|
|
159
197
|
mime_type == 'text/html'
|
160
198
|
end
|
161
199
|
|
162
|
-
#
|
163
|
-
#
|
200
|
+
# Attribute: mime_type (Proton::Page)
|
201
|
+
# The MIME type for the page, based on what template engine was used.
|
164
202
|
#
|
165
203
|
# ## Example
|
166
204
|
# Page['/style.css'].mime_type #=> 'text/css'
|
@@ -186,7 +224,7 @@ class Page
|
|
186
224
|
end
|
187
225
|
end
|
188
226
|
|
189
|
-
#
|
227
|
+
# Attribute: default_ext (Proton::Page)
|
190
228
|
# Returns a default extension for the page based on the page's MIME type.
|
191
229
|
#
|
192
230
|
# ## Example
|
@@ -222,7 +260,7 @@ class Page
|
|
222
260
|
@file and File.file?(@file||'') and valid?
|
223
261
|
end
|
224
262
|
|
225
|
-
#
|
263
|
+
# Ensures that the page is in the right folder.
|
226
264
|
def valid?
|
227
265
|
prefix = File.expand_path(root_path)
|
228
266
|
prefix == File.expand_path(@file)[0...prefix.size]
|
@@ -233,6 +271,9 @@ class Page
|
|
233
271
|
tilt(tilt_options).render(dup.extend(Helpers), locals, &blk)
|
234
272
|
end
|
235
273
|
|
274
|
+
# Method: to_html (Proton::Page)
|
275
|
+
# Returns the full HTML document for the page.
|
276
|
+
#
|
236
277
|
def to_html(locals={}, tilt_options={}, &blk)
|
237
278
|
html = content(locals, tilt_options, &blk)
|
238
279
|
html = layout.to_html(locals, tilt_options) { html } if layout?
|
@@ -253,11 +294,22 @@ class Page
|
|
253
294
|
!! layout
|
254
295
|
end
|
255
296
|
|
297
|
+
# Method: meta (Proton::Page)
|
298
|
+
# Returns the metadata for the page.
|
299
|
+
#
|
300
|
+
# ## Description
|
301
|
+
# This returns an instance of {Proton::Meta}.
|
302
|
+
#
|
256
303
|
def meta
|
257
304
|
@meta ||= Meta.new(parts.first)
|
258
305
|
end
|
259
306
|
|
307
|
+
# Method: write (Proton::Page)
|
260
308
|
# Writes to the given output file.
|
309
|
+
#
|
310
|
+
# ## Description
|
311
|
+
# This is the method used by `proton build`.
|
312
|
+
#
|
261
313
|
def write(out=nil)
|
262
314
|
out ||= project.path(:output, path)
|
263
315
|
FileUtils.mkdir_p File.dirname(out)
|
@@ -269,11 +321,14 @@ class Page
|
|
269
321
|
end
|
270
322
|
end
|
271
323
|
|
324
|
+
# Method: tilt? (Proton::Page)
|
272
325
|
# Checks if the file is supported by tilt.
|
326
|
+
#
|
273
327
|
def tilt?
|
274
328
|
!! tilt_engine
|
275
329
|
end
|
276
330
|
|
331
|
+
# Attribute: tilt_engine (Proton::Page)
|
277
332
|
# Returns the Tilt engine (eg Tilt::HamlEngine).
|
278
333
|
def tilt_engine
|
279
334
|
Tilt[@file]
|
@@ -283,7 +338,11 @@ class Page
|
|
283
338
|
tilt_engine.name.match(/:([^:]*)(?:Template?)$/)[1]
|
284
339
|
end
|
285
340
|
|
341
|
+
# Attribute: tilt (Proton::Page)
|
286
342
|
# Returns the tilt layout.
|
343
|
+
#
|
344
|
+
# This returns an instance of `Tilt`.
|
345
|
+
#
|
287
346
|
def tilt(tilt_options={})
|
288
347
|
if tilt?
|
289
348
|
parts
|
@@ -303,6 +362,16 @@ class Page
|
|
303
362
|
meta.send(meth)
|
304
363
|
end
|
305
364
|
|
365
|
+
# Attribute: parent (Proton::Page)
|
366
|
+
# Returns the page's parent page, or nil.
|
367
|
+
#
|
368
|
+
# ## Usage
|
369
|
+
# page.parent
|
370
|
+
#
|
371
|
+
# ## Description
|
372
|
+
# This will return the page's parent (also a {Proton::Page} instance), or
|
373
|
+
# `nil` if it's the page is already the root.
|
374
|
+
#
|
306
375
|
def parent
|
307
376
|
parts = path.split('/') # ['', 'about', 'index.html']
|
308
377
|
|
@@ -315,6 +384,9 @@ class Page
|
|
315
384
|
parent ||= try['/'] # Home
|
316
385
|
end
|
317
386
|
|
387
|
+
# Method: children (Proton::Page)
|
388
|
+
# Returns a Set of the page's subpages.
|
389
|
+
#
|
318
390
|
def children
|
319
391
|
files = if index?
|
320
392
|
# about/index.html => about/*
|
@@ -331,6 +403,9 @@ class Page
|
|
331
403
|
compact.sort
|
332
404
|
end
|
333
405
|
|
406
|
+
# Method: siblings (Proton::Page)
|
407
|
+
# Returns a Set of pages that share the same parent as the current page.
|
408
|
+
#
|
334
409
|
def siblings
|
335
410
|
pages = (p = parent and p.children)
|
336
411
|
return Set.new unless pages
|
@@ -338,10 +413,22 @@ class Page
|
|
338
413
|
Set.new(pages)
|
339
414
|
end
|
340
415
|
|
416
|
+
# Attribute: breadcrumbs (Proton::Page)
|
417
|
+
# Returns an array of the page's ancestors, including itself.
|
418
|
+
#
|
419
|
+
# ## Example
|
420
|
+
# Proton::Page['/about/company/contact.html'].breadcrumbs
|
421
|
+
#
|
422
|
+
# May look like:
|
423
|
+
# [ Page, Page, Page ]
|
424
|
+
#
|
341
425
|
def breadcrumbs
|
342
426
|
Set.new(parent? ? (parent.breadcrumbs + [self]) : [self])
|
343
427
|
end
|
344
428
|
|
429
|
+
# Method: index? (Proton::Page)
|
430
|
+
# Returns true if the page is and index page.
|
431
|
+
#
|
345
432
|
def index?
|
346
433
|
File.basename(path, '.*') == 'index'
|
347
434
|
end
|
@@ -349,7 +436,8 @@ class Page
|
|
349
436
|
# Method: parent? (Proton::Page)
|
350
437
|
# Returns true if the page has a parent.
|
351
438
|
#
|
352
|
-
#
|
439
|
+
# ## Description
|
440
|
+
# This is the opposite of {Proton::Page::root?}.
|
353
441
|
#
|
354
442
|
# ## See also
|
355
443
|
# - {Proton::Page::root?}
|
@@ -361,7 +449,8 @@ class Page
|
|
361
449
|
# Method: root? (Proton::Page)
|
362
450
|
# Returns true if the page is the home page.
|
363
451
|
#
|
364
|
-
#
|
452
|
+
# ## Description
|
453
|
+
# This is the opposite of {Proton::Page::parent?}.
|
365
454
|
#
|
366
455
|
# ## See also
|
367
456
|
# - {Proton::Page::parent?}
|
@@ -370,6 +459,18 @@ class Page
|
|
370
459
|
parent.nil?
|
371
460
|
end
|
372
461
|
|
462
|
+
# Attribute: depth (Proton::Page)
|
463
|
+
# Returns how deep the page is in the heirarchy.
|
464
|
+
#
|
465
|
+
# ## Description
|
466
|
+
# This counts the number of pages from the root page. This means:
|
467
|
+
#
|
468
|
+
# * The root page (eg, `/index.html`) has a depth of `1`
|
469
|
+
# * A child page of the root (eg, `/about.html`) has a depth of `2`
|
470
|
+
# * A child of that (eg, `/about/company.html`) has a depth of `3`
|
471
|
+
# * ...and so on
|
472
|
+
#
|
473
|
+
#
|
373
474
|
def depth
|
374
475
|
breadcrumbs.size
|
375
476
|
end
|
@@ -420,6 +521,9 @@ protected
|
|
420
521
|
end
|
421
522
|
end
|
422
523
|
|
524
|
+
extend Cacheable
|
525
|
+
cache_method :children, :siblings, :parent, :next, :breadcrumbs, :path, :tilt
|
526
|
+
|
423
527
|
def self.root_path(project, *a)
|
424
528
|
project.path(:site, *a)
|
425
529
|
end
|
data/lib/proton/server.rb
CHANGED
@@ -2,6 +2,11 @@ require 'cuba'
|
|
2
2
|
require 'rack'
|
3
3
|
require 'proton'
|
4
4
|
|
5
|
+
# The only time this file gets loaded is if you require it explicity, ie,
|
6
|
+
# in a config.ru. Disable caching for when it's ran as a development-time
|
7
|
+
# server.
|
8
|
+
Proton::Cacheable.disable!
|
9
|
+
|
5
10
|
# Module: Proton::Server
|
6
11
|
# The Proton server rack application.
|
7
12
|
|
data/lib/proton/version.rb
CHANGED
@@ -1 +1 @@
|
|
1
|
-
dir{color:#
|
1
|
+
dir{color:#321}
|
metadata
CHANGED
@@ -1,150 +1,149 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: proton
|
3
|
-
version: !ruby/object:Gem::Version
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.3.4
|
4
5
|
prerelease:
|
5
|
-
version: 0.3.3
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
7
|
+
authors:
|
8
8
|
- Rico Sta. Cruz
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
|
13
|
-
date: 2011-07-15 00:00:00 +08:00
|
12
|
+
date: 2011-08-01 00:00:00.000000000 +08:00
|
14
13
|
default_executable:
|
15
|
-
dependencies:
|
16
|
-
- !ruby/object:Gem::Dependency
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
17
16
|
name: shake
|
18
|
-
|
19
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
17
|
+
requirement: &2156733040 !ruby/object:Gem::Requirement
|
20
18
|
none: false
|
21
|
-
requirements:
|
19
|
+
requirements:
|
22
20
|
- - ~>
|
23
|
-
- !ruby/object:Gem::Version
|
24
|
-
version:
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '0.1'
|
25
23
|
type: :runtime
|
26
|
-
version_requirements: *id001
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: tilt
|
29
24
|
prerelease: false
|
30
|
-
|
25
|
+
version_requirements: *2156733040
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: tilt
|
28
|
+
requirement: &2156732540 !ruby/object:Gem::Requirement
|
31
29
|
none: false
|
32
|
-
requirements:
|
30
|
+
requirements:
|
33
31
|
- - ~>
|
34
|
-
- !ruby/object:Gem::Version
|
35
|
-
version: 1.
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 1.3.2
|
36
34
|
type: :runtime
|
37
|
-
version_requirements: *id002
|
38
|
-
- !ruby/object:Gem::Dependency
|
39
|
-
name: cuba
|
40
35
|
prerelease: false
|
41
|
-
|
36
|
+
version_requirements: *2156732540
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: cuba
|
39
|
+
requirement: &2156732080 !ruby/object:Gem::Requirement
|
42
40
|
none: false
|
43
|
-
requirements:
|
41
|
+
requirements:
|
44
42
|
- - ~>
|
45
|
-
- !ruby/object:Gem::Version
|
43
|
+
- !ruby/object:Gem::Version
|
46
44
|
version: 2.0.0
|
47
45
|
type: :runtime
|
48
|
-
version_requirements: *id003
|
49
|
-
- !ruby/object:Gem::Dependency
|
50
|
-
name: hashie
|
51
46
|
prerelease: false
|
52
|
-
|
47
|
+
version_requirements: *2156732080
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: hashie
|
50
|
+
requirement: &2156731620 !ruby/object:Gem::Requirement
|
53
51
|
none: false
|
54
|
-
requirements:
|
52
|
+
requirements:
|
55
53
|
- - ~>
|
56
|
-
- !ruby/object:Gem::Version
|
54
|
+
- !ruby/object:Gem::Version
|
57
55
|
version: 1.0.0
|
58
56
|
type: :runtime
|
59
|
-
version_requirements: *id004
|
60
|
-
- !ruby/object:Gem::Dependency
|
61
|
-
name: haml
|
62
57
|
prerelease: false
|
63
|
-
|
58
|
+
version_requirements: *2156731620
|
59
|
+
- !ruby/object:Gem::Dependency
|
60
|
+
name: haml
|
61
|
+
requirement: &2156731160 !ruby/object:Gem::Requirement
|
64
62
|
none: false
|
65
|
-
requirements:
|
63
|
+
requirements:
|
66
64
|
- - ~>
|
67
|
-
- !ruby/object:Gem::Version
|
65
|
+
- !ruby/object:Gem::Version
|
68
66
|
version: 3.1.1
|
69
67
|
type: :runtime
|
70
|
-
version_requirements: *id005
|
71
|
-
- !ruby/object:Gem::Dependency
|
72
|
-
name: sass
|
73
68
|
prerelease: false
|
74
|
-
|
69
|
+
version_requirements: *2156731160
|
70
|
+
- !ruby/object:Gem::Dependency
|
71
|
+
name: sass
|
72
|
+
requirement: &2156730700 !ruby/object:Gem::Requirement
|
75
73
|
none: false
|
76
|
-
requirements:
|
74
|
+
requirements:
|
77
75
|
- - ~>
|
78
|
-
- !ruby/object:Gem::Version
|
76
|
+
- !ruby/object:Gem::Version
|
79
77
|
version: 3.1.1
|
80
78
|
type: :runtime
|
81
|
-
version_requirements: *id006
|
82
|
-
- !ruby/object:Gem::Dependency
|
83
|
-
name: compass
|
84
79
|
prerelease: false
|
85
|
-
|
80
|
+
version_requirements: *2156730700
|
81
|
+
- !ruby/object:Gem::Dependency
|
82
|
+
name: compass
|
83
|
+
requirement: &2156730240 !ruby/object:Gem::Requirement
|
86
84
|
none: false
|
87
|
-
requirements:
|
85
|
+
requirements:
|
88
86
|
- - ~>
|
89
|
-
- !ruby/object:Gem::Version
|
87
|
+
- !ruby/object:Gem::Version
|
90
88
|
version: 0.11.1
|
91
89
|
type: :runtime
|
92
|
-
version_requirements: *id007
|
93
|
-
- !ruby/object:Gem::Dependency
|
94
|
-
name: RedCloth
|
95
90
|
prerelease: false
|
96
|
-
|
91
|
+
version_requirements: *2156730240
|
92
|
+
- !ruby/object:Gem::Dependency
|
93
|
+
name: RedCloth
|
94
|
+
requirement: &2156729780 !ruby/object:Gem::Requirement
|
97
95
|
none: false
|
98
|
-
requirements:
|
96
|
+
requirements:
|
99
97
|
- - ~>
|
100
|
-
- !ruby/object:Gem::Version
|
98
|
+
- !ruby/object:Gem::Version
|
101
99
|
version: 4.2.3
|
102
100
|
type: :runtime
|
103
|
-
version_requirements: *id008
|
104
|
-
- !ruby/object:Gem::Dependency
|
105
|
-
name: maruku
|
106
101
|
prerelease: false
|
107
|
-
|
102
|
+
version_requirements: *2156729780
|
103
|
+
- !ruby/object:Gem::Dependency
|
104
|
+
name: maruku
|
105
|
+
requirement: &2156729320 !ruby/object:Gem::Requirement
|
108
106
|
none: false
|
109
|
-
requirements:
|
107
|
+
requirements:
|
110
108
|
- - ~>
|
111
|
-
- !ruby/object:Gem::Version
|
109
|
+
- !ruby/object:Gem::Version
|
112
110
|
version: 0.6.0
|
113
111
|
type: :runtime
|
114
|
-
version_requirements: *id009
|
115
|
-
- !ruby/object:Gem::Dependency
|
116
|
-
name: less
|
117
112
|
prerelease: false
|
118
|
-
|
113
|
+
version_requirements: *2156729320
|
114
|
+
- !ruby/object:Gem::Dependency
|
115
|
+
name: less
|
116
|
+
requirement: &2156728940 !ruby/object:Gem::Requirement
|
119
117
|
none: false
|
120
|
-
requirements:
|
121
|
-
- -
|
122
|
-
- !ruby/object:Gem::Version
|
123
|
-
version:
|
118
|
+
requirements:
|
119
|
+
- - ! '>='
|
120
|
+
- !ruby/object:Gem::Version
|
121
|
+
version: '0'
|
124
122
|
type: :development
|
125
|
-
version_requirements: *id010
|
126
|
-
- !ruby/object:Gem::Dependency
|
127
|
-
name: maruku
|
128
123
|
prerelease: false
|
129
|
-
|
124
|
+
version_requirements: *2156728940
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: maruku
|
127
|
+
requirement: &2156728480 !ruby/object:Gem::Requirement
|
130
128
|
none: false
|
131
|
-
requirements:
|
132
|
-
- -
|
133
|
-
- !ruby/object:Gem::Version
|
134
|
-
version:
|
129
|
+
requirements:
|
130
|
+
- - ! '>='
|
131
|
+
- !ruby/object:Gem::Version
|
132
|
+
version: '0'
|
135
133
|
type: :development
|
136
|
-
|
137
|
-
|
138
|
-
|
134
|
+
prerelease: false
|
135
|
+
version_requirements: *2156728480
|
136
|
+
description: Proton lets you create static websites from a bunch of files written
|
137
|
+
in HAML, Textile, Sass, or any other templating language.
|
138
|
+
email:
|
139
139
|
- rico@sinefunc.com
|
140
|
-
executables:
|
140
|
+
executables:
|
141
141
|
- proton
|
142
142
|
extensions: []
|
143
|
-
|
144
143
|
extra_rdoc_files: []
|
145
|
-
|
146
|
-
files:
|
144
|
+
files:
|
147
145
|
- bin/proton
|
146
|
+
- lib/proton/cacheable.rb
|
148
147
|
- lib/proton/cli/helpers.rb
|
149
148
|
- lib/proton/cli.rb
|
150
149
|
- lib/proton/compass_support.rb
|
@@ -264,7 +263,6 @@ files:
|
|
264
263
|
- data/new_site/README.md
|
265
264
|
- data/rack/config.ru
|
266
265
|
- data/rack/Gemfile
|
267
|
-
- data/rack/Gemfile.lock
|
268
266
|
- HISTORY.md
|
269
267
|
- README.md
|
270
268
|
- TODO.md
|
@@ -273,30 +271,26 @@ files:
|
|
273
271
|
has_rdoc: true
|
274
272
|
homepage: http://github.com/sinefunc/proton
|
275
273
|
licenses: []
|
276
|
-
|
277
274
|
post_install_message:
|
278
275
|
rdoc_options: []
|
279
|
-
|
280
|
-
require_paths:
|
276
|
+
require_paths:
|
281
277
|
- lib
|
282
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
278
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
283
279
|
none: false
|
284
|
-
requirements:
|
285
|
-
- -
|
286
|
-
- !ruby/object:Gem::Version
|
287
|
-
version:
|
288
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
280
|
+
requirements:
|
281
|
+
- - ! '>='
|
282
|
+
- !ruby/object:Gem::Version
|
283
|
+
version: '0'
|
284
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
289
285
|
none: false
|
290
|
-
requirements:
|
291
|
-
- -
|
292
|
-
- !ruby/object:Gem::Version
|
293
|
-
version:
|
286
|
+
requirements:
|
287
|
+
- - ! '>='
|
288
|
+
- !ruby/object:Gem::Version
|
289
|
+
version: '0'
|
294
290
|
requirements: []
|
295
|
-
|
296
291
|
rubyforge_project:
|
297
292
|
rubygems_version: 1.6.2
|
298
293
|
signing_key:
|
299
294
|
specification_version: 3
|
300
295
|
summary: Prototyping tool / static site generator.
|
301
296
|
test_files: []
|
302
|
-
|
data/data/rack/Gemfile.lock
DELETED
@@ -1,40 +0,0 @@
|
|
1
|
-
GEM
|
2
|
-
specs:
|
3
|
-
RedCloth (4.2.3)
|
4
|
-
chunky_png (1.2.0)
|
5
|
-
compass (0.11.3)
|
6
|
-
chunky_png (~> 1.2)
|
7
|
-
fssm (>= 0.2.7)
|
8
|
-
sass (~> 3.1)
|
9
|
-
cuba (2.0.0)
|
10
|
-
rack (~> 1.2)
|
11
|
-
tilt (~> 1.2)
|
12
|
-
fssm (0.2.7)
|
13
|
-
haml (3.1.1)
|
14
|
-
hashie (1.0.0)
|
15
|
-
maruku (0.6.0)
|
16
|
-
syntax (>= 1.0.0)
|
17
|
-
proton (0.3.2)
|
18
|
-
RedCloth (~> 4.2.3)
|
19
|
-
compass (~> 0.11.1)
|
20
|
-
cuba (~> 2.0.0)
|
21
|
-
haml (~> 3.1.1)
|
22
|
-
hashie (~> 1.0.0)
|
23
|
-
maruku (~> 0.6.0)
|
24
|
-
sass (~> 3.1.1)
|
25
|
-
shake (~> 0.1)
|
26
|
-
tilt (~> 1.2.2)
|
27
|
-
rack (1.3.0)
|
28
|
-
rack-cache (1.0.2)
|
29
|
-
rack (>= 0.4)
|
30
|
-
sass (3.1.1)
|
31
|
-
shake (0.1.2)
|
32
|
-
syntax (1.0.0)
|
33
|
-
tilt (1.2.2)
|
34
|
-
|
35
|
-
PLATFORMS
|
36
|
-
ruby
|
37
|
-
|
38
|
-
DEPENDENCIES
|
39
|
-
proton (~> 0.3.2)
|
40
|
-
rack-cache (~> 1.0.0)
|