nesta 0.9.0 → 0.9.1
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile.lock +1 -1
- data/LICENSE +1 -1
- data/bin/nesta +5 -0
- data/lib/nesta/app.rb +18 -30
- data/lib/nesta/commands.rb +65 -13
- data/lib/nesta/models.rb +1 -7
- data/lib/nesta/navigation.rb +29 -0
- data/lib/nesta/nesta.rb +7 -0
- data/lib/nesta/version.rb +1 -1
- data/spec/commands_spec.rb +88 -4
- data/spec/page_spec.rb +12 -10
- data/views/categories.haml +3 -2
- data/views/comments.haml +3 -3
- data/views/error.haml +8 -9
- data/views/feed.haml +1 -1
- data/views/footer.haml +8 -0
- data/views/header.haml +4 -0
- data/views/index.haml +4 -2
- data/views/layout.haml +17 -20
- data/views/master.sass +128 -135
- data/views/mixins.sass +39 -0
- data/views/not_found.haml +8 -9
- data/views/page.haml +13 -16
- data/views/page_meta.haml +16 -0
- data/views/summaries.haml +12 -11
- metadata +10 -5
data/Gemfile.lock
CHANGED
data/LICENSE
CHANGED
data/bin/nesta
CHANGED
@@ -15,11 +15,13 @@ GLOBAL OPTIONS
|
|
15
15
|
|
16
16
|
COMMANDS
|
17
17
|
new <path> Create a new Nesta project.
|
18
|
+
demo:content Install example pages in ./content-demo.
|
18
19
|
theme:install <url> Install a theme from a git repository.
|
19
20
|
theme:enable <name> Make the theme active, updating config.yml.
|
20
21
|
theme:create <name> Makes a template for a new theme in ./themes.
|
21
22
|
|
22
23
|
OPTIONS FOR new
|
24
|
+
--git Create a new git repository for the project.
|
23
25
|
--heroku Include the heroku:config rake task.
|
24
26
|
--vlad Include config/deploy.rb.
|
25
27
|
|
@@ -29,6 +31,7 @@ exit 0
|
|
29
31
|
|
30
32
|
def self.parse_command_line
|
31
33
|
opts = GetoptLong.new(
|
34
|
+
['--git', GetoptLong::NO_ARGUMENT],
|
32
35
|
['--help', '-h', GetoptLong::NO_ARGUMENT],
|
33
36
|
['--heroku', GetoptLong::NO_ARGUMENT],
|
34
37
|
['--vlad', GetoptLong::NO_ARGUMENT]
|
@@ -51,6 +54,8 @@ exit 0
|
|
51
54
|
case command
|
52
55
|
when 'new'
|
53
56
|
Nesta::Commands::New.new(ARGV[0], options).execute
|
57
|
+
when 'demo:content'
|
58
|
+
Nesta::Commands::Demo::Content.new.execute
|
54
59
|
when /^theme:(create|enable|install)$/
|
55
60
|
command_cls = Nesta::Commands::Theme.const_get($1.capitalize.to_sym)
|
56
61
|
command_cls.new(ARGV[0], options).execute
|
data/lib/nesta/app.rb
CHANGED
@@ -1,14 +1,16 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
1
|
+
require 'sinatra/base'
|
2
|
+
require 'builder'
|
3
|
+
require 'haml'
|
4
|
+
require 'sass'
|
5
5
|
|
6
|
+
require File.expand_path('nesta', File.dirname(__FILE__))
|
6
7
|
require File.expand_path('cache', File.dirname(__FILE__))
|
7
8
|
require File.expand_path('config', File.dirname(__FILE__))
|
8
9
|
require File.expand_path('models', File.dirname(__FILE__))
|
10
|
+
require File.expand_path('navigation', File.dirname(__FILE__))
|
11
|
+
require File.expand_path('overrides', File.dirname(__FILE__))
|
9
12
|
require File.expand_path('path', File.dirname(__FILE__))
|
10
13
|
require File.expand_path('plugins', File.dirname(__FILE__))
|
11
|
-
require File.expand_path('overrides', File.dirname(__FILE__))
|
12
14
|
|
13
15
|
Nesta::Plugins.load_local_plugins
|
14
16
|
|
@@ -18,8 +20,10 @@ module Nesta
|
|
18
20
|
|
19
21
|
set :views, File.expand_path('../../views', File.dirname(__FILE__))
|
20
22
|
set :cache_enabled, Config.cache
|
23
|
+
set :haml, { :format => :html5 }
|
21
24
|
|
22
25
|
helpers Overrides::Renderers
|
26
|
+
helpers Navigation::Renderers
|
23
27
|
|
24
28
|
helpers do
|
25
29
|
def set_from_config(*variables)
|
@@ -42,26 +46,6 @@ module Nesta
|
|
42
46
|
end
|
43
47
|
end
|
44
48
|
|
45
|
-
def display_menu(menu, options = {})
|
46
|
-
defaults = { :class => nil, :levels => 2 }
|
47
|
-
options = defaults.merge(options)
|
48
|
-
if options[:levels] > 0
|
49
|
-
haml_tag :ul, :class => options[:class] do
|
50
|
-
menu.each do |item|
|
51
|
-
haml_tag :li do
|
52
|
-
if item.respond_to?(:each)
|
53
|
-
display_menu(item, :levels => (options[:levels] - 1))
|
54
|
-
else
|
55
|
-
haml_tag :a, :href => item.abspath do
|
56
|
-
haml_concat item.heading
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
49
|
def no_widow(text)
|
66
50
|
text.split[0...-1].join(" ") + " #{text.split[-1]}"
|
67
51
|
end
|
@@ -105,11 +89,16 @@ module Nesta
|
|
105
89
|
end
|
106
90
|
|
107
91
|
def local_stylesheet?
|
108
|
-
|
109
|
-
# themes that want to give the user the option to add their own
|
110
|
-
# CSS rules.
|
92
|
+
Nesta.deprecated('local_stylesheet?', 'use local_stylesheet_link_tag')
|
111
93
|
File.exist?(File.expand_path('views/local.sass', Nesta::App.root))
|
112
94
|
end
|
95
|
+
|
96
|
+
def local_stylesheet_link_tag(name)
|
97
|
+
pattern = File.expand_path("views/#{name}.s{a,c}ss", Nesta::App.root)
|
98
|
+
if Dir.glob(pattern).size > 0
|
99
|
+
haml_tag :link, :href => "/css/#{name}.css", :rel => "stylesheet"
|
100
|
+
end
|
101
|
+
end
|
113
102
|
end
|
114
103
|
|
115
104
|
not_found do
|
@@ -125,7 +114,7 @@ module Nesta
|
|
125
114
|
# If you want to change Nesta's behaviour, you have two options:
|
126
115
|
#
|
127
116
|
# 1. Create an app.rb file in your project's root directory.
|
128
|
-
# 2. Make a theme or a plugin, and put
|
117
|
+
# 2. Make a theme or a plugin, and put the relevant code in there.
|
129
118
|
#
|
130
119
|
# You can add new routes, or modify the behaviour of any of the
|
131
120
|
# default objects in app.rb, or replace any of the default view
|
@@ -161,7 +150,6 @@ module Nesta
|
|
161
150
|
@heading = @title
|
162
151
|
@title = "#{@title} - #{@subtitle}"
|
163
152
|
@articles = Page.find_articles[0..7]
|
164
|
-
@body_class = 'home'
|
165
153
|
cache haml(:index)
|
166
154
|
end
|
167
155
|
|
data/lib/nesta/commands.rb
CHANGED
@@ -28,6 +28,25 @@ module Nesta
|
|
28
28
|
def copy_templates(templates)
|
29
29
|
templates.each { |src, dest| copy_template(src, dest) }
|
30
30
|
end
|
31
|
+
|
32
|
+
def update_config_yaml(pattern, replacement)
|
33
|
+
configured = false
|
34
|
+
File.open(Nesta::Config.yaml_path, 'r+') do |file|
|
35
|
+
output = ''
|
36
|
+
file.each_line do |line|
|
37
|
+
if configured
|
38
|
+
output << line
|
39
|
+
else
|
40
|
+
output << line.sub(pattern, replacement)
|
41
|
+
configured = true if line =~ pattern
|
42
|
+
end
|
43
|
+
end
|
44
|
+
output << "#{replacement}\n" unless configured
|
45
|
+
file.pos = 0
|
46
|
+
file.print(output)
|
47
|
+
file.truncate(file.pos)
|
48
|
+
end
|
49
|
+
end
|
31
50
|
end
|
32
51
|
|
33
52
|
class New
|
@@ -50,6 +69,17 @@ module Nesta
|
|
50
69
|
@options['heroku'] || @options['vlad']
|
51
70
|
end
|
52
71
|
|
72
|
+
def create_repository
|
73
|
+
FileUtils.cd(@path) do
|
74
|
+
File.open('.gitignore', 'w') do |file|
|
75
|
+
file.puts %w[._* .*.swp .bundle .DS_Store .sass-cache].join("\n")
|
76
|
+
end
|
77
|
+
system('git', 'init')
|
78
|
+
system('git', 'add', '.')
|
79
|
+
system('git', 'commit', '-m', 'Initial commit')
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
53
83
|
def execute
|
54
84
|
make_directories
|
55
85
|
templates = {
|
@@ -62,6 +92,40 @@ module Nesta
|
|
62
92
|
templates['config/deploy.rb'] = "#{@path}/config/deploy.rb"
|
63
93
|
end
|
64
94
|
copy_templates(templates)
|
95
|
+
create_repository if @options['git']
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
module Demo
|
100
|
+
class Content
|
101
|
+
include Command
|
102
|
+
|
103
|
+
def initialize
|
104
|
+
@dir = 'content-demo'
|
105
|
+
end
|
106
|
+
|
107
|
+
def clone_or_update_repository
|
108
|
+
repository = 'git://github.com/gma/nesta-demo-content.git'
|
109
|
+
path = Nesta::Path.local(@dir)
|
110
|
+
if File.exist?(path)
|
111
|
+
FileUtils.cd(path) { system('git', 'pull', 'origin', 'master') }
|
112
|
+
else
|
113
|
+
system('git', 'clone', repository, path)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
def configure_git_to_ignore_repo
|
118
|
+
excludes = Nesta::Path.local('.git/info/exclude')
|
119
|
+
if File.exist?(excludes) && File.read(excludes).scan(@dir).empty?
|
120
|
+
File.open(excludes, 'a') { |file| file.puts @dir }
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
def execute
|
125
|
+
clone_or_update_repository
|
126
|
+
configure_git_to_ignore_repo
|
127
|
+
update_config_yaml(/^\s*#?\s*content:.*/, "content: #{@dir}")
|
128
|
+
end
|
65
129
|
end
|
66
130
|
end
|
67
131
|
|
@@ -115,19 +179,7 @@ module Nesta
|
|
115
179
|
end
|
116
180
|
|
117
181
|
def execute
|
118
|
-
|
119
|
-
configured = false
|
120
|
-
File.open(Nesta::Config.yaml_path, 'r+') do |file|
|
121
|
-
output = ''
|
122
|
-
file.each_line do |line|
|
123
|
-
output << line.sub(theme_config, "theme: #{@name}")
|
124
|
-
configured = true if line =~ theme_config
|
125
|
-
end
|
126
|
-
output << "theme: #{@name}\n" unless configured
|
127
|
-
file.pos = 0
|
128
|
-
file.print(output)
|
129
|
-
file.truncate(file.pos)
|
130
|
-
end
|
182
|
+
update_config_yaml(/^\s*#?\s*theme:.*/, "theme: #{@name}")
|
131
183
|
end
|
132
184
|
end
|
133
185
|
end
|
data/lib/nesta/models.rb
CHANGED
@@ -42,14 +42,8 @@ module Nesta
|
|
42
42
|
@@cache = {}
|
43
43
|
end
|
44
44
|
|
45
|
-
def self.deprecated(name, message)
|
46
|
-
if Nesta::App.environment != :test
|
47
|
-
$stderr.puts "DEPRECATION WARNING: #{name} is deprecated; #{message}"
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
45
|
def self.menu_items
|
52
|
-
deprecated(
|
46
|
+
Nesta.deprecated('Page.menu_items', 'see Menu.top_level and Menu.for_path')
|
53
47
|
Menu.top_level
|
54
48
|
end
|
55
49
|
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Nesta
|
2
|
+
module Navigation
|
3
|
+
module Renderers
|
4
|
+
def display_menu(menu, options = {})
|
5
|
+
defaults = { :class => nil, :levels => 2 }
|
6
|
+
options = defaults.merge(options)
|
7
|
+
if options[:levels] > 0
|
8
|
+
haml_tag :ul, :class => options[:class] do
|
9
|
+
menu.each do |item|
|
10
|
+
display_menu_item(item, options)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def display_menu_item(item, options = {})
|
17
|
+
haml_tag :li do
|
18
|
+
if item.respond_to?(:each)
|
19
|
+
display_menu(item, :levels => (options[:levels] - 1))
|
20
|
+
else
|
21
|
+
haml_tag :a, :href => item.abspath do
|
22
|
+
haml_concat item.heading
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/lib/nesta/nesta.rb
CHANGED
data/lib/nesta/version.rb
CHANGED
data/spec/commands_spec.rb
CHANGED
@@ -21,6 +21,10 @@ describe "nesta" do
|
|
21
21
|
File.exist?(project_path(file)).should be_true
|
22
22
|
end
|
23
23
|
|
24
|
+
def create_config_yaml(text)
|
25
|
+
File.open(Nesta::Config.yaml_path, 'w') { |f| f.puts(text) }
|
26
|
+
end
|
27
|
+
|
24
28
|
describe "new" do
|
25
29
|
def gemfile_source
|
26
30
|
File.read(project_path('Gemfile'))
|
@@ -54,6 +58,30 @@ describe "nesta" do
|
|
54
58
|
end
|
55
59
|
end
|
56
60
|
|
61
|
+
describe "--git" do
|
62
|
+
before(:each) do
|
63
|
+
@command = Nesta::Commands::New.new(@project_path, 'git' => '')
|
64
|
+
@command.stub!(:system)
|
65
|
+
end
|
66
|
+
|
67
|
+
it "should create a .gitignore file" do
|
68
|
+
@command.execute
|
69
|
+
File.read(project_path('.gitignore')).should match(/\.bundle/)
|
70
|
+
end
|
71
|
+
|
72
|
+
it "should create a git repo" do
|
73
|
+
@command.should_receive(:system).with('git', 'init')
|
74
|
+
@command.execute
|
75
|
+
end
|
76
|
+
|
77
|
+
it "should commit the blank project" do
|
78
|
+
@command.should_receive(:system).with('git', 'add', '.')
|
79
|
+
@command.should_receive(:system)
|
80
|
+
.with('git', 'commit', '-m', 'Initial commit')
|
81
|
+
@command.execute
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
57
85
|
describe "--heroku" do
|
58
86
|
before(:each) do
|
59
87
|
Nesta::Commands::New.new(@project_path, 'heroku' => '').execute
|
@@ -93,6 +121,66 @@ describe "nesta" do
|
|
93
121
|
end
|
94
122
|
end
|
95
123
|
|
124
|
+
describe "demo:content" do
|
125
|
+
before(:each) do
|
126
|
+
@config_path = project_path('config/config.yml')
|
127
|
+
FileUtils.mkdir_p(File.dirname(@config_path))
|
128
|
+
Nesta::Config.stub!(:yaml_path).and_return(@config_path)
|
129
|
+
create_config_yaml('content: path/to/content')
|
130
|
+
Nesta::App.stub!(:root).and_return(@project_path)
|
131
|
+
@repo_url = 'git://github.com/gma/nesta-demo-content.git'
|
132
|
+
@demo_path = project_path('content-demo')
|
133
|
+
@command = Nesta::Commands::Demo::Content.new
|
134
|
+
@command.stub!(:system)
|
135
|
+
end
|
136
|
+
|
137
|
+
it "should clone the repository" do
|
138
|
+
@command.should_receive(:system)
|
139
|
+
.with('git', 'clone', @repo_url, @demo_path)
|
140
|
+
@command.execute
|
141
|
+
end
|
142
|
+
|
143
|
+
it "should configure the content directory" do
|
144
|
+
@command.execute
|
145
|
+
File.read(@config_path).should match(/^content: content-demo/)
|
146
|
+
end
|
147
|
+
|
148
|
+
describe "when repository already exists" do
|
149
|
+
before(:each) do
|
150
|
+
FileUtils.mkdir_p(@demo_path)
|
151
|
+
end
|
152
|
+
|
153
|
+
it "should update the repository" do
|
154
|
+
@command.should_receive(:system).with('git', 'pull', 'origin', 'master')
|
155
|
+
@command.execute
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
describe "when site versioned with git" do
|
160
|
+
before(:each) do
|
161
|
+
@exclude_path = project_path('.git/info/exclude')
|
162
|
+
FileUtils.mkdir_p(File.dirname(@exclude_path))
|
163
|
+
File.open(@exclude_path, 'w') { |file| file.puts '# Excludes' }
|
164
|
+
end
|
165
|
+
|
166
|
+
it "should tell git to ignore content-demo" do
|
167
|
+
@command.execute
|
168
|
+
File.read(@exclude_path).should match(/content-demo/)
|
169
|
+
end
|
170
|
+
|
171
|
+
describe "and content-demo already ignored" do
|
172
|
+
before(:each) do
|
173
|
+
File.open(@exclude_path, 'w') { |file| file.puts 'content-demo' }
|
174
|
+
end
|
175
|
+
|
176
|
+
it "shouldn't tell git to ignore it twice" do
|
177
|
+
@command.execute
|
178
|
+
File.read(@exclude_path).scan('content-demo').size.should == 1
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
96
184
|
describe "theme:install" do
|
97
185
|
before(:each) do
|
98
186
|
@repo_url = 'git://github.com/gma/nesta-theme-mine.git'
|
@@ -151,10 +239,6 @@ describe "nesta" do
|
|
151
239
|
@command = Nesta::Commands::Theme::Enable.new(@name)
|
152
240
|
end
|
153
241
|
|
154
|
-
def create_config_yaml(text)
|
155
|
-
File.open(Nesta::Config.yaml_path, 'w') { |f| f.puts(text) }
|
156
|
-
end
|
157
|
-
|
158
242
|
shared_examples_for "command that configures the theme" do
|
159
243
|
it "should enable the theme" do
|
160
244
|
@command.execute
|
data/spec/page_spec.rb
CHANGED
@@ -112,13 +112,14 @@ describe "The home page" do
|
|
112
112
|
end
|
113
113
|
|
114
114
|
it "should display site title in h1 tag" do
|
115
|
-
|
116
|
-
body.should have_tag('
|
115
|
+
pending "Hpricot doesn't support HTML5"
|
116
|
+
body.should have_tag('hgroup h1', /My blog/)
|
117
117
|
end
|
118
118
|
|
119
|
-
it "should display site subtitle in
|
119
|
+
it "should display site subtitle in heading tag" do
|
120
|
+
pending "Hpricot doesn't support HTML5"
|
120
121
|
do_get
|
121
|
-
body.should have_tag('
|
122
|
+
body.should have_tag('hgroup h2', /about stuff/)
|
122
123
|
end
|
123
124
|
|
124
125
|
it "should set description meta tag" do
|
@@ -159,7 +160,7 @@ describe "The home page" do
|
|
159
160
|
|
160
161
|
it "should display link to article in h2 tag" do
|
161
162
|
body.should have_tag(
|
162
|
-
"
|
163
|
+
"h1 a[@href=#{@article.abspath}]", /^\s*#{@article.heading}$/)
|
163
164
|
end
|
164
165
|
|
165
166
|
it "should display article summary if available" do
|
@@ -227,7 +228,7 @@ describe "An article" do
|
|
227
228
|
|
228
229
|
it "should display the date" do
|
229
230
|
do_get
|
230
|
-
body.should have_tag("
|
231
|
+
body.should have_tag("time", @date)
|
231
232
|
end
|
232
233
|
|
233
234
|
it "should display the content" do
|
@@ -251,18 +252,19 @@ describe "An article" do
|
|
251
252
|
end
|
252
253
|
|
253
254
|
it "should link to each category" do
|
255
|
+
pending "Hpricot doesn't support HTML5"
|
254
256
|
do_get
|
255
|
-
body.should have_tag("
|
256
|
-
body.should have_tag("div.categories") do |categories|
|
257
|
+
body.should have_tag("nav.categories") do |categories|
|
257
258
|
categories.should have_tag("a[@href=/banana]", "Banana")
|
258
259
|
categories.should have_tag("a[@href=/the-apple]", "Apple")
|
259
260
|
end
|
260
261
|
end
|
261
262
|
|
262
263
|
it "should link to a category in breadcrumb" do
|
264
|
+
pending "Hpricot doesn't support HTML5"
|
263
265
|
do_get
|
264
266
|
body.should have_tag(
|
265
|
-
"
|
267
|
+
"nav.breadcrumb/a[@href=#{@category.abspath}]", @category.heading)
|
266
268
|
end
|
267
269
|
|
268
270
|
it "should contain category name in page title" do
|
@@ -342,7 +344,7 @@ describe "A page" do
|
|
342
344
|
it "should display links to articles" do
|
343
345
|
do_get
|
344
346
|
body.should have_tag(
|
345
|
-
"
|
347
|
+
"h1 a[@href='#{@article.abspath}']", /^\s*#{@article.heading}$/)
|
346
348
|
body.should_not have_tag("h3", @article2.heading)
|
347
349
|
end
|
348
350
|
end
|
data/views/categories.haml
CHANGED
data/views/comments.haml
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
- if short_name = Nesta::Config.disqus_short_name
|
2
2
|
#disqus_thread
|
3
3
|
- if Sinatra::Application.environment == :development
|
4
|
-
%script
|
4
|
+
%script(type="text/javascript")
|
5
5
|
var disqus_developer = true;
|
6
|
-
%script
|
6
|
+
%script(type="text/javascript" src="http://disqus.com/forums/#{short_name}/embed.js")
|
7
7
|
%noscript
|
8
|
-
%a
|
8
|
+
%a(href="http://disqus.com/forums/#{short_name}/?url=ref") View comments.
|
data/views/error.haml
CHANGED
@@ -1,13 +1,12 @@
|
|
1
|
-
.breadcrumb
|
2
|
-
%a
|
1
|
+
%nav.breadcrumb
|
2
|
+
%a(href="/") Home
|
3
3
|
|
4
4
|
#content
|
5
|
-
%
|
5
|
+
%section(role="main")
|
6
|
+
%h1 Sorry, something went wrong
|
6
7
|
|
7
|
-
|
8
|
-
|
9
|
-
|
8
|
+
%p
|
9
|
+
An error occurred whilst we were trying to serve your page. Please
|
10
|
+
bear with us, or try another page.
|
10
11
|
|
11
|
-
|
12
|
-
= haml :categories, :layout => false
|
13
|
-
= haml :feed, :layout => false
|
12
|
+
= haml :sidebar, :layout => false
|
data/views/feed.haml
CHANGED
data/views/footer.haml
ADDED
data/views/header.haml
ADDED
data/views/index.haml
CHANGED
@@ -1,5 +1,7 @@
|
|
1
|
+
%nav.breadcrumb Home
|
2
|
+
|
1
3
|
#content
|
2
|
-
%
|
3
|
-
|
4
|
+
%section.articles
|
5
|
+
= haml :summaries, :layout => false, :locals => { :pages => @articles }
|
4
6
|
|
5
7
|
= haml :sidebar, :layout => false
|
data/views/layout.haml
CHANGED
@@ -1,27 +1,24 @@
|
|
1
|
-
|
2
|
-
%html
|
1
|
+
<!DOCTYPE html>
|
2
|
+
%html(lang="en")
|
3
3
|
%head
|
4
|
-
%meta
|
4
|
+
%meta(charset="utf-8")
|
5
5
|
- if @description
|
6
|
-
%meta
|
6
|
+
%meta(name="description" content=@description)
|
7
7
|
- if @keywords
|
8
|
-
%meta
|
8
|
+
%meta(name="keywords" content=@keywords)
|
9
9
|
%title= @title
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
10
|
+
<!--[if ! lte IE 6]><!-->
|
11
|
+
%link(href="/css/master.css" media="screen" rel="stylesheet")
|
12
|
+
<!--<![endif]-->
|
13
|
+
/[if lte IE 6]
|
14
|
+
%link(rel="stylesheet" href="http://universal-ie6-css.googlecode.com/files/ie6.1.1.css" media="screen, projection")
|
15
|
+
/[if lt IE 9]
|
16
|
+
%script(src="//html5shim.googlecode.com/svn/trunk/html5.js")
|
17
|
+
= local_stylesheet_link_tag('local')
|
18
|
+
%link(href="/articles.xml" rel="alternate" type="application/atom+xml")
|
14
19
|
= haml :analytics, :layout => false
|
15
|
-
%body
|
20
|
+
%body
|
16
21
|
#container
|
17
|
-
|
18
|
-
%p.title= @heading
|
19
|
-
%p.subtitle= @subtitle
|
22
|
+
= haml :header, :layout => false
|
20
23
|
= yield
|
21
|
-
|
22
|
-
%p
|
23
|
-
Powered by
|
24
|
-
= succeed "," do
|
25
|
-
%a{ :href => "http://effectif.com/nesta" } nesta
|
26
|
-
designed by
|
27
|
-
%a{ :href => "http://effectif.com" } Graham Ashton
|
24
|
+
= haml :footer, :layout => false
|
data/views/master.sass
CHANGED
@@ -1,17 +1,21 @@
|
|
1
|
+
@import "mixins.sass"
|
2
|
+
|
1
3
|
// Variables
|
2
4
|
|
3
5
|
$content-width: 37em
|
4
6
|
|
5
|
-
$
|
6
|
-
$
|
7
|
-
$
|
8
|
-
$
|
9
|
-
$
|
7
|
+
$base-color: #262626
|
8
|
+
$background-color: #fff
|
9
|
+
$tint: #f1f1f3
|
10
|
+
$border-color: #99d
|
11
|
+
$link-color: #3F63DA
|
12
|
+
$visited-link-color: darken($link-color, 15%)
|
13
|
+
$hover-link-color: lighten($link-color, 15%)
|
14
|
+
$active-link-color: darken($link-color, 50%)
|
15
|
+
$nav-link-color: desaturate($link-color, 55%)
|
16
|
+
$meta-color: #999
|
10
17
|
|
11
|
-
$
|
12
|
-
$h2-scale: 1.64
|
13
|
-
$h3-scale: 1.45
|
14
|
-
$h4-scale: 1.18
|
18
|
+
$border-style: 1px dashed $border-color
|
15
19
|
|
16
20
|
// Reset
|
17
21
|
|
@@ -21,36 +25,29 @@ $h4-scale: 1.18
|
|
21
25
|
|
22
26
|
// Typography
|
23
27
|
|
24
|
-
|
25
|
-
|
26
|
-
$vertical-rhythm: 1.5em
|
27
|
-
$base-vertical-margin: 1.5em
|
28
|
-
|
29
|
-
@mixin adjust-font-size($scale, $top-weight: 1, $bottom-weight: 1)
|
30
|
-
$average-margin: $base-vertical-margin / $scale
|
31
|
-
margin-top: $average-margin * $top-weight
|
32
|
-
margin-bottom: $average-margin * $bottom-weight
|
33
|
-
|
34
|
-
$line-height: $vertical-rhythm / $scale
|
35
|
-
@if $line-height < 1
|
36
|
-
line-height: $line-height * 2
|
37
|
-
@else
|
38
|
-
line-height: $line-height
|
39
|
-
|
40
|
-
font-size: 100% * $scale
|
41
|
-
|
42
|
-
@mixin border-radius($radius)
|
43
|
-
-webkit-border-radius: $radius
|
44
|
-
-moz-border-radius: $radius
|
45
|
-
border-radius: $radius
|
28
|
+
@mixin text-shadow
|
29
|
+
text-shadow: 0 2px 3px #ddd
|
46
30
|
|
47
31
|
body
|
48
|
-
font: $base-font
|
32
|
+
font: ($base-font * 1.05) Georgia, serif
|
49
33
|
line-height: $vertical-rhythm
|
50
34
|
color: $base-color
|
51
35
|
|
36
|
+
header[role=banner]
|
37
|
+
h1,
|
38
|
+
h2
|
39
|
+
margin: 0
|
40
|
+
line-height: 1.2em
|
41
|
+
font-weight: normal
|
42
|
+
h1
|
43
|
+
font-size: 327%
|
44
|
+
@include text-shadow
|
45
|
+
h2
|
46
|
+
color: $meta-color
|
47
|
+
font-size: 1em
|
48
|
+
|
52
49
|
h1, h2, h3, h4, h5, h6
|
53
|
-
font-family:
|
50
|
+
font-family: Georgia, serif
|
54
51
|
h1
|
55
52
|
@include adjust-font-size($h1-scale, 0.6, 0.4)
|
56
53
|
font-weight: normal
|
@@ -75,10 +72,10 @@ li
|
|
75
72
|
|
76
73
|
blockquote
|
77
74
|
margin: $base-vertical-margin 0
|
78
|
-
|
79
|
-
padding-left: 1em
|
75
|
+
padding: 0 $base-vertical-margin
|
80
76
|
|
81
77
|
font-style: italic
|
78
|
+
color: $base-color + #555
|
82
79
|
|
83
80
|
pre
|
84
81
|
padding: ($vertical-rhythm / 2) 1em
|
@@ -89,31 +86,36 @@ img
|
|
89
86
|
|
90
87
|
// Layout
|
91
88
|
|
89
|
+
article, aside, footer, header, nav, section
|
90
|
+
display: block
|
91
|
+
|
92
92
|
div#container
|
93
93
|
width: 54em
|
94
94
|
margin: 0 auto
|
95
|
+
padding: 1em 1em 0 1em
|
95
96
|
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
padding: 0.5em 1.1em
|
97
|
+
nav.breadcrumb
|
98
|
+
margin-top: $vertical-rhythm
|
99
|
+
color: $meta-color
|
100
|
+
padding: 0.5em 0
|
101
101
|
|
102
102
|
font-size: 0.909em
|
103
103
|
|
104
104
|
div#content
|
105
|
+
position: relative
|
105
106
|
width: $content-width
|
106
107
|
float: left
|
107
|
-
padding: 1px
|
108
|
+
padding: 1px 0
|
108
109
|
|
109
110
|
div#sidebar
|
110
111
|
width: 12em
|
111
112
|
margin-left: 40em
|
112
113
|
padding: 1px 1em
|
113
114
|
|
114
|
-
|
115
|
+
footer.branding
|
115
116
|
clear: both
|
116
|
-
|
117
|
+
color: $meta-color
|
118
|
+
@include adjust-font-size($base-scale)
|
117
119
|
p
|
118
120
|
width: $content-width
|
119
121
|
margin: 0
|
@@ -121,118 +123,110 @@ div#container
|
|
121
123
|
|
122
124
|
// The visuals
|
123
125
|
|
124
|
-
|
125
|
-
|
126
|
-
text-
|
126
|
+
a
|
127
|
+
border-bottom: 1px dotted $link-color
|
128
|
+
text-decoration: none
|
129
|
+
color: $link-color
|
130
|
+
@include transition(color 0.25s 0 ease)
|
131
|
+
&:visited
|
132
|
+
color: $visited-link-color
|
133
|
+
border-bottom-color: $visited-link-color
|
134
|
+
&:hover
|
135
|
+
color: $hover-link-color
|
136
|
+
border-bottom-color: $hover-link-color
|
137
|
+
&:active
|
138
|
+
color: $active-link-color
|
139
|
+
border-bottom-color: $active-link-color
|
140
|
+
|
141
|
+
nav.categories,
|
142
|
+
div.feed,
|
143
|
+
article p.meta
|
144
|
+
a
|
145
|
+
color: $nav-link-color
|
146
|
+
border-bottom-color: $background-color
|
147
|
+
&:hover a
|
148
|
+
color: $link-color
|
149
|
+
a:hover
|
150
|
+
color: $hover-link-color
|
151
|
+
|
152
|
+
article p.meta
|
153
|
+
a
|
154
|
+
@include transition(border-bottom-color 0.5s 0 ease)
|
155
|
+
a:hover
|
156
|
+
border-bottom-color: $hover-link-color
|
157
|
+
|
158
|
+
article h1 a
|
159
|
+
border-bottom: none
|
127
160
|
|
128
161
|
body
|
129
|
-
background: $background-
|
130
|
-
|
131
|
-
&.home h1
|
132
|
-
@include adjust-font-size($h1-scale, 1, -1)
|
133
|
-
|
134
|
-
div#header
|
135
|
-
p.title,
|
136
|
-
p.subtitle
|
137
|
-
margin: 0
|
138
|
-
line-height: 1.2em
|
139
|
-
font-weight: normal
|
140
|
-
p.title
|
141
|
-
font-size: 327%
|
142
|
-
text-shadow: -1px 2px 1px $tint
|
143
|
-
p.subtitle
|
144
|
-
font-size: 1em
|
145
|
-
@include dark-tint-text
|
146
|
-
|
147
|
-
div#content
|
148
|
-
position: relative
|
149
|
-
@include border-radius(0.5em)
|
150
|
-
background-color: white
|
151
|
-
|
152
|
-
div.date
|
153
|
-
position: absolute
|
154
|
-
right: 40em
|
155
|
-
top: $vertical-rhythm * 3
|
156
|
-
text-align: right
|
157
|
-
@include dark-tint-text
|
158
|
-
|
159
|
-
h2
|
160
|
-
background: $background-tint - #111
|
161
|
-
margin-left: (-2em / $h2-scale) * $base-scale
|
162
|
-
margin-right: 0
|
163
|
-
padding-left: 1em
|
164
|
-
padding-right: 1em
|
165
|
-
|
166
|
-
text-shadow: 0 1px 0 $tint + #333
|
162
|
+
background: $background-color
|
167
163
|
|
168
|
-
|
169
|
-
ul
|
170
|
-
margin-left: 1.5em
|
171
|
-
|
164
|
+
article
|
172
165
|
img
|
173
166
|
max-width: 100%
|
174
167
|
margin-bottom: $base-vertical-margin
|
175
168
|
|
176
169
|
code,
|
177
170
|
pre
|
178
|
-
background-color: $
|
171
|
+
background-color: $tint
|
179
172
|
code
|
180
173
|
padding: 1px 3px
|
181
174
|
pre
|
182
|
-
border-left:
|
175
|
+
border-left: $border-style
|
176
|
+
background-color: $tint
|
183
177
|
code
|
184
178
|
padding: 0
|
185
179
|
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
margin-left: -1.5em
|
193
|
-
padding-left: 1.5em
|
194
|
-
background-color: rgba(255, 255, 255, 0.8)
|
195
|
-
|
196
|
-
list-style: none
|
197
|
-
|
198
|
-
h2
|
199
|
-
margin-left: 0
|
200
|
-
margin-right: 0
|
201
|
-
padding: 0
|
202
|
-
background: none
|
180
|
+
footer
|
181
|
+
border-top: $border-style
|
182
|
+
p.meta
|
183
|
+
@include adjust-font-size(0.909, 0.1, 1.9)
|
184
|
+
font-style: italic
|
185
|
+
color: $meta-color
|
203
186
|
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
top: $vertical-rhythm * 1.5
|
187
|
+
// Pages of content
|
188
|
+
article[role="main"]
|
189
|
+
h1, h2
|
190
|
+
@include text-shadow
|
209
191
|
|
210
|
-
p.read_more
|
211
|
-
@include adjust-font-size(0.909, 0, 0)
|
212
|
-
|
213
|
-
div.categories
|
214
|
-
margin-left: -1em
|
215
|
-
margin-right: -1em
|
216
|
-
border-top: 1px solid $background-tint - #0a0a0a
|
217
|
-
padding: 0.5em 1em
|
218
|
-
background: $background-tint
|
219
|
-
a
|
220
|
-
margin-right: 0.25em
|
221
|
-
|
222
192
|
div#disqus_thread
|
223
193
|
img
|
224
194
|
max-width: none
|
225
195
|
ul#dsq-comments
|
226
196
|
margin-left: 0
|
227
197
|
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
198
|
+
// Pages/articles assigned to this page
|
199
|
+
section.pages,
|
200
|
+
section.articles
|
201
|
+
& > ol
|
202
|
+
margin-left: 0
|
203
|
+
li
|
204
|
+
position: relative
|
205
|
+
list-style: none
|
206
|
+
article
|
207
|
+
ol li
|
208
|
+
list-style: decimal
|
209
|
+
ul li
|
210
|
+
list-style: disc
|
211
|
+
|
212
|
+
header[role=main] h1
|
213
|
+
@include adjust-font-size($h1-scale, 1.5, 0.5)
|
214
|
+
header h1
|
215
|
+
@include adjust-font-size($h2-scale, 1.5, 0.5)
|
216
|
+
|
217
|
+
article
|
218
|
+
h1
|
219
|
+
text-shadow: none
|
220
|
+
p.read_more
|
221
|
+
@include adjust-font-size(1, 0, 0)
|
222
|
+
margin-top: -$base-vertical-margin
|
223
|
+
footer
|
224
|
+
border-top: none
|
225
|
+
|
226
|
+
nav.categories
|
227
|
+
h1
|
228
|
+
@include adjust-font-size(1, 2, 0)
|
229
|
+
|
236
230
|
ul.menu
|
237
231
|
list-style: none
|
238
232
|
ul
|
@@ -241,6 +235,5 @@ div#sidebar
|
|
241
235
|
& > ul
|
242
236
|
@include adjust-font-size(0.909, 0, 0)
|
243
237
|
|
244
|
-
|
245
|
-
|
246
|
-
margin: $base-vertical-margin 0
|
238
|
+
div.feed
|
239
|
+
margin: $base-vertical-margin 0
|
data/views/mixins.sass
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
// Default ratios between font sizes; used to maintain the type hierarchy.
|
2
|
+
// http://www.markboulton.co.uk/journal/comments/five-simple-steps-to-better-typography-part-4
|
3
|
+
|
4
|
+
$h1-scale: 2.18
|
5
|
+
$h2-scale: 1.64
|
6
|
+
$h3-scale: 1.45
|
7
|
+
$h4-scale: 1.18
|
8
|
+
|
9
|
+
// Variables used in calculations used to maintain vertical rhythm.
|
10
|
+
// http://webtypography.net/Rhythm_and_Proportion/Vertical_Motion/2.2.2/
|
11
|
+
|
12
|
+
$base-scale: 0.88
|
13
|
+
$base-font: $base-scale * 1em
|
14
|
+
$vertical-rhythm: 1.75em
|
15
|
+
$base-vertical-margin: 1.75em
|
16
|
+
|
17
|
+
@mixin adjust-font-size($scale, $top-weight: 1, $bottom-weight: 1)
|
18
|
+
$average-margin: $base-vertical-margin / $scale
|
19
|
+
margin-top: $average-margin * $top-weight
|
20
|
+
margin-bottom: $average-margin * $bottom-weight
|
21
|
+
|
22
|
+
$line-height: $vertical-rhythm / $scale
|
23
|
+
@if $line-height < 1
|
24
|
+
line-height: $line-height * 2
|
25
|
+
@else
|
26
|
+
line-height: $line-height
|
27
|
+
|
28
|
+
font-size: 100% * $scale
|
29
|
+
|
30
|
+
@mixin border-radius($radius)
|
31
|
+
-webkit-border-radius: $radius
|
32
|
+
-moz-border-radius: $radius
|
33
|
+
border-radius: $radius
|
34
|
+
|
35
|
+
@mixin transition($definition)
|
36
|
+
-moz-transition: $definition
|
37
|
+
-o-transition: $definition
|
38
|
+
-webkit-transition: $definition
|
39
|
+
transition: $definition
|
data/views/not_found.haml
CHANGED
@@ -1,13 +1,12 @@
|
|
1
|
-
.breadcrumb
|
2
|
-
%a
|
1
|
+
%nav.breadcrumb
|
2
|
+
%a(href="/") Home
|
3
3
|
|
4
4
|
#content
|
5
|
-
%
|
5
|
+
%section(role="main")
|
6
|
+
%h1 Page not found
|
6
7
|
|
7
|
-
|
8
|
-
|
9
|
-
|
8
|
+
%p
|
9
|
+
Please try another page or, if you think something is wrong with
|
10
|
+
our site, do get in touch and let us know.
|
10
11
|
|
11
|
-
|
12
|
-
= haml :categories, :layout => false
|
13
|
-
= haml :feed, :layout => false
|
12
|
+
= haml :sidebar, :layout => false
|
data/views/page.haml
CHANGED
@@ -1,28 +1,25 @@
|
|
1
|
-
.breadcrumb
|
2
|
-
%a
|
1
|
+
%nav.breadcrumb
|
2
|
+
%a(href="/") Home
|
3
3
|
>
|
4
4
|
- if @page.parent
|
5
|
-
%a{
|
5
|
+
%a(href="#{@page.parent.abspath}")= @page.parent.heading
|
6
6
|
>
|
7
7
|
= @page.heading
|
8
8
|
|
9
9
|
#content
|
10
|
-
|
11
|
-
|
10
|
+
%article(role="main")
|
11
|
+
~ @page.to_html(self)
|
12
12
|
|
13
|
-
|
13
|
+
%section.pages
|
14
|
+
= haml :summaries, :layout => false, :locals => { :pages => @page.pages }
|
14
15
|
|
15
|
-
|
16
|
+
- unless @page.articles.empty?
|
17
|
+
%section.articles
|
18
|
+
%header
|
19
|
+
%h1= "Articles on #{@page.heading}"
|
20
|
+
= haml :summaries, :layout => false, :locals => { :pages => @page.articles, :heading => :h3 }
|
16
21
|
|
17
|
-
|
18
|
-
%h2= "Articles on #{@page.heading}"
|
19
|
-
= haml :summaries, :layout => false, :locals => { :pages => @page.articles, :heading => :h3 }
|
20
|
-
|
21
|
-
- unless @page.categories.empty?
|
22
|
-
.categories
|
23
|
-
%strong Categories:
|
24
|
-
- @page.categories.each do |category|
|
25
|
-
%a{ :href => category.abspath }= category.heading
|
22
|
+
= haml :page_meta, :layout => false, :locals => { :page => @page }
|
26
23
|
|
27
24
|
= haml :comments, :layout => false
|
28
25
|
|
@@ -0,0 +1,16 @@
|
|
1
|
+
- if page.date
|
2
|
+
%footer
|
3
|
+
%p.meta
|
4
|
+
Published
|
5
|
+
- if page.date
|
6
|
+
on
|
7
|
+
%time(datetime="#{page.date.to_s}" pubdate=true)= format_date(page.date)
|
8
|
+
- if (! page.categories.empty?)
|
9
|
+
in
|
10
|
+
- page.categories.each do |category|
|
11
|
+
- if category != page.categories[-1]
|
12
|
+
= succeed ',' do
|
13
|
+
%a(href="#{category.abspath}")= category.heading
|
14
|
+
- else
|
15
|
+
%a(href="#{category.abspath}")= category.heading
|
16
|
+
|
data/views/summaries.haml
CHANGED
@@ -1,14 +1,15 @@
|
|
1
1
|
- unless pages.empty?
|
2
|
-
%ol
|
2
|
+
%ol
|
3
3
|
- pages.each do |page|
|
4
4
|
%li
|
5
|
-
|
6
|
-
%
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
5
|
+
%article
|
6
|
+
%header
|
7
|
+
%h1
|
8
|
+
%a(href="#{page.abspath}")= page.heading
|
9
|
+
- if page.summary.nil? || page.summary.empty?
|
10
|
+
~ page.body
|
11
|
+
- else
|
12
|
+
~ page.summary
|
13
|
+
%p.read_more
|
14
|
+
%a(href="#{page.abspath}")= page.read_more
|
15
|
+
= haml :page_meta, :layout => false, :locals => { :page => page }
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 9
|
8
|
-
-
|
9
|
-
version: 0.9.
|
8
|
+
- 1
|
9
|
+
version: 0.9.1
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Graham Ashton
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-12-
|
17
|
+
date: 2010-12-31 00:00:00 +00:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -217,6 +217,7 @@ files:
|
|
217
217
|
- lib/nesta/commands.rb
|
218
218
|
- lib/nesta/config.rb
|
219
219
|
- lib/nesta/models.rb
|
220
|
+
- lib/nesta/navigation.rb
|
220
221
|
- lib/nesta/nesta.rb
|
221
222
|
- lib/nesta/overrides.rb
|
222
223
|
- lib/nesta/path.rb
|
@@ -246,11 +247,15 @@ files:
|
|
246
247
|
- views/comments.haml
|
247
248
|
- views/error.haml
|
248
249
|
- views/feed.haml
|
250
|
+
- views/footer.haml
|
251
|
+
- views/header.haml
|
249
252
|
- views/index.haml
|
250
253
|
- views/layout.haml
|
251
254
|
- views/master.sass
|
255
|
+
- views/mixins.sass
|
252
256
|
- views/not_found.haml
|
253
257
|
- views/page.haml
|
258
|
+
- views/page_meta.haml
|
254
259
|
- views/sidebar.haml
|
255
260
|
- views/sitemap.builder
|
256
261
|
- views/summaries.haml
|
@@ -268,7 +273,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
268
273
|
requirements:
|
269
274
|
- - ">="
|
270
275
|
- !ruby/object:Gem::Version
|
271
|
-
hash:
|
276
|
+
hash: 3521966817245856409
|
272
277
|
segments:
|
273
278
|
- 0
|
274
279
|
version: "0"
|
@@ -277,7 +282,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
277
282
|
requirements:
|
278
283
|
- - ">="
|
279
284
|
- !ruby/object:Gem::Version
|
280
|
-
hash:
|
285
|
+
hash: 3521966817245856409
|
281
286
|
segments:
|
282
287
|
- 0
|
283
288
|
version: "0"
|