startups 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +12 -0
- data/LICENSE +20 -0
- data/Manifest +29 -0
- data/README +29 -0
- data/Rakefile +16 -0
- data/TODO +5 -0
- data/lib/startups.rb +3 -0
- data/rails_generators/startup_content/USAGE +11 -0
- data/rails_generators/startup_content/startup_content_generator.rb +94 -0
- data/rails_generators/startup_content/templates/content_controller.rb +7 -0
- data/rails_generators/startup_content/templates/content_controller_test.rb +14 -0
- data/rails_generators/startup_content/templates/content_helper.rb +3 -0
- data/rails_generators/startup_content/templates/example.html.erb +3 -0
- data/rails_generators/startup_content/templates/help.html.erb +3 -0
- data/rails_generators/startup_content/templates/home.html.erb +4 -0
- data/rails_generators/startup_layout/USAGE +11 -0
- data/rails_generators/startup_layout/startup_layout_generator.rb +42 -0
- data/rails_generators/startup_layout/templates/app/helpers/layout_helper.rb +71 -0
- data/rails_generators/startup_layout/templates/app/views/layouts/_startup_layout_footer.html.erb +6 -0
- data/rails_generators/startup_layout/templates/app/views/layouts/_startup_layout_header.html.erb +4 -0
- data/rails_generators/startup_layout/templates/app/views/layouts/startup_layout.html.erb +40 -0
- data/rails_generators/startup_layout/templates/app/views/layouts/startup_layout_shway.html.erb +39 -0
- data/rails_generators/startup_layout/templates/public/stylesheets/startup_layout.css +33 -0
- data/rails_generators/startup_layout/templates/public/stylesheets/startup_layout_reset.css +47 -0
- data/rails_generators/startup_nav/USAGE +12 -0
- data/rails_generators/startup_nav/startup_nav_generator.rb +65 -0
- data/rails_generators/startup_nav/templates/_nav.html.erb +8 -0
- data/rails_generators/startup_nav/templates/nav.css +34 -0
- data/rails_generators/startup_nav/templates/nav_helper.rb +39 -0
- data/startups.gemspec +30 -0
- metadata +93 -0
data/CHANGELOG
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
0.0.0 (Aug 13th, 2009)
|
2
|
+
|
3
|
+
* just getting started. Added the nav startup.
|
4
|
+
|
5
|
+
0.0.1 (Oct 16th, 2009)
|
6
|
+
|
7
|
+
* Added the content and layout startups.
|
8
|
+
* Tweaked all the startups to play nice.
|
9
|
+
* Added better wireframe styles
|
10
|
+
* Added examples.
|
11
|
+
* Generating all 3 startups will get you a working example with 3 pages.
|
12
|
+
|
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2009 Ryan Owens
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Manifest
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
CHANGELOG
|
2
|
+
lib/startups.rb
|
3
|
+
LICENSE
|
4
|
+
Manifest
|
5
|
+
rails_generators/startup_content/startup_content_generator.rb
|
6
|
+
rails_generators/startup_content/templates/content_controller.rb
|
7
|
+
rails_generators/startup_content/templates/content_controller_test.rb
|
8
|
+
rails_generators/startup_content/templates/content_helper.rb
|
9
|
+
rails_generators/startup_content/templates/example.html.erb
|
10
|
+
rails_generators/startup_content/templates/help.html.erb
|
11
|
+
rails_generators/startup_content/templates/home.html.erb
|
12
|
+
rails_generators/startup_content/USAGE
|
13
|
+
rails_generators/startup_layout/startup_layout_generator.rb
|
14
|
+
rails_generators/startup_layout/templates/app/helpers/layout_helper.rb
|
15
|
+
rails_generators/startup_layout/templates/app/views/layouts/_startup_layout_footer.html.erb
|
16
|
+
rails_generators/startup_layout/templates/app/views/layouts/_startup_layout_header.html.erb
|
17
|
+
rails_generators/startup_layout/templates/app/views/layouts/startup_layout.html.erb
|
18
|
+
rails_generators/startup_layout/templates/app/views/layouts/startup_layout_shway.html.erb
|
19
|
+
rails_generators/startup_layout/templates/public/stylesheets/startup_layout.css
|
20
|
+
rails_generators/startup_layout/templates/public/stylesheets/startup_layout_reset.css
|
21
|
+
rails_generators/startup_layout/USAGE
|
22
|
+
rails_generators/startup_nav/startup_nav_generator.rb
|
23
|
+
rails_generators/startup_nav/templates/_nav.html.erb
|
24
|
+
rails_generators/startup_nav/templates/nav.css
|
25
|
+
rails_generators/startup_nav/templates/nav_helper.rb
|
26
|
+
rails_generators/startup_nav/USAGE
|
27
|
+
Rakefile
|
28
|
+
README
|
29
|
+
TODO
|
data/README
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
= search_scope
|
2
|
+
|
3
|
+
Rails gem with collection of Rails "startups" for features such as navigation and forms with customizable error handling.
|
4
|
+
|
5
|
+
== Install
|
6
|
+
|
7
|
+
gem install startups
|
8
|
+
|
9
|
+
== Usage
|
10
|
+
|
11
|
+
After installing the gem, you can use the startup generators in your Rails app.
|
12
|
+
|
13
|
+
From your rails app's root directory, type:
|
14
|
+
script/generate startup_nav
|
15
|
+
|
16
|
+
#TODO script/destroy should also work?
|
17
|
+
|
18
|
+
== Included Generators
|
19
|
+
|
20
|
+
* startup_nav: generates the files needed for a simple, easily styled navigation.
|
21
|
+
* startup_content: generated a content controller for home and other non-rest pages. A basic layout and stylesheet is also provided.
|
22
|
+
|
23
|
+
* COMING SOON: startup_form: generates the files needed for generic forms with customizable error handling.
|
24
|
+
** updating this to use formatastic
|
25
|
+
|
26
|
+
For more information, run:
|
27
|
+
script/generate startup_nav --help
|
28
|
+
|
29
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
require 'echoe'
|
4
|
+
|
5
|
+
Echoe.new('startups', '0.0.1') do |p|
|
6
|
+
p.project = "startups"
|
7
|
+
p.description = "A collection of Rails \"startups\" for features such as a standard layout, navigation and forms with customizable error handling."
|
8
|
+
p.url = "http://rubyforge.org/projects/startups"
|
9
|
+
p.author = 'Ryan Owens'
|
10
|
+
p.email = "ryan (at) infoether (dot) com"
|
11
|
+
p.ignore_pattern = ["tmp/*", "script/*", "startups_notes.txt", "*.tmproj"]
|
12
|
+
p.development_dependencies = []
|
13
|
+
end
|
14
|
+
|
15
|
+
Dir["#{File.dirname(__FILE__)}/tasks/*.rake"].sort.each { |ext| load ext }
|
16
|
+
|
data/TODO
ADDED
data/lib/startups.rb
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
Description:
|
2
|
+
The startup_content generator creates a content controller for home and other non-rest pages.
|
3
|
+
|
4
|
+
Examples:
|
5
|
+
script/generate startup_content
|
6
|
+
|
7
|
+
|
8
|
+
#TODO UPDATE THIS OUTPUT
|
9
|
+
Template: app/views/layouts/application.html.erb
|
10
|
+
Stylesheet: public/stylesheets/startup.css
|
11
|
+
Helper: app/helpers/startup_helper.rb
|
@@ -0,0 +1,94 @@
|
|
1
|
+
class StartupContentGenerator < Rails::Generator::Base
|
2
|
+
|
3
|
+
def manifest
|
4
|
+
record do |m|
|
5
|
+
m.directory 'app/helpers'
|
6
|
+
m.directory 'app/controllers'
|
7
|
+
m.directory 'app/views/content'
|
8
|
+
m.directory 'test/functional'
|
9
|
+
|
10
|
+
m.file "content_controller.rb", "app/controllers/content_controller.rb"
|
11
|
+
m.file "home.html.erb", "app/views/content/home.html.erb"
|
12
|
+
m.file "help.html.erb", "app/views/content/help.html.erb"
|
13
|
+
m.file "example.html.erb", "app/views/content/example.html.erb"
|
14
|
+
m.file "content_helper.rb", "app/helpers/content_helper.rb"
|
15
|
+
m.file "content_controller_test.rb", "test/functional/content_controller_test.rb"
|
16
|
+
|
17
|
+
m.route %{
|
18
|
+
map.with_options(:controller => "content") do |content_map|
|
19
|
+
content_map.help 'help', :action => 'help'
|
20
|
+
content_map.placeholder 'placeholder/:name', :action => 'placeholder'
|
21
|
+
end }
|
22
|
+
m.route 'map.root :controller => "content", :action => "home"'
|
23
|
+
|
24
|
+
# example
|
25
|
+
# m.route :name => 'version', :controller => 'version', :action => 'display_version'
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
protected
|
30
|
+
|
31
|
+
def banner
|
32
|
+
<<-EOS
|
33
|
+
Creates content controller for home and other non-rest pages.
|
34
|
+
|
35
|
+
USAGE: #{$0} #{spec.name}
|
36
|
+
EOS
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
|
42
|
+
#TODO put this somewhere else, or figure out a better way to do it so I don't have to copy it for other generators.
|
43
|
+
#modified from: http://patshaughnessy.net/2009/9/2/rails-generator-tutorial-part-2-writing-a-custom-manifest-action
|
44
|
+
module Rails
|
45
|
+
module Generator
|
46
|
+
module Commands
|
47
|
+
|
48
|
+
class Base
|
49
|
+
def route_code(route_options)
|
50
|
+
if route_options.is_a? Hash
|
51
|
+
"map.#{route_options[:name]} '#{route_options[:name]}', :controller => '#{route_options[:controller]}', :action => '#{route_options[:action]}'"
|
52
|
+
else
|
53
|
+
route_options.to_s.gsub("\n ","\n").strip
|
54
|
+
end
|
55
|
+
end
|
56
|
+
def route_code_log_message(route_options)
|
57
|
+
code = route_code(route_options)
|
58
|
+
if code.index "\n"
|
59
|
+
code = code[0,code.index("\n")]
|
60
|
+
code = "#{code} ... end" if code.index ' do '
|
61
|
+
end
|
62
|
+
code
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
# Here's a readable version of the long string used above in route_code;
|
67
|
+
# but it should be kept on one line to avoid inserting extra whitespace
|
68
|
+
# into routes.rb when the generator is run:
|
69
|
+
# "map.#{route_options[:name]} '#{route_options[:name]}',
|
70
|
+
# :controller => '#{route_options[:controller]}',
|
71
|
+
# :action => '#{route_options[:action]}'"
|
72
|
+
|
73
|
+
class Create
|
74
|
+
def route(route_options)
|
75
|
+
sentinel = 'ActionController::Routing::Routes.draw do |map|'
|
76
|
+
logger.route route_code_log_message(route_options)
|
77
|
+
#TODO add something here to prevent duplicating the route. Like file_contains? or something.
|
78
|
+
gsub_file 'config/routes.rb', /(#{Regexp.escape(sentinel)})/mi do |m|
|
79
|
+
"#{m}\n #{route_code(route_options)}\n"
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
class Destroy
|
85
|
+
def route(route_options)
|
86
|
+
logger.remove_route route_code_log_message(route_options)
|
87
|
+
to_remove = "\n #{route_code(route_options)}"
|
88
|
+
gsub_file 'config/routes.rb', /(#{to_remove})/mi, ''
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
Description:
|
2
|
+
The startup_layout generator creates a basic layout with the necessary helpers, stylesheet etc.
|
3
|
+
For now, the startup_nav startup is a prerequisite.
|
4
|
+
|
5
|
+
Examples:
|
6
|
+
script/generate startup_layout
|
7
|
+
|
8
|
+
#TODO UPDATE THIS OUTPUT
|
9
|
+
Template: app/views/layouts/application.html.erb
|
10
|
+
Stylesheet: public/stylesheets/startup.css
|
11
|
+
Helper: app/helpers/startup_helper.rb
|
@@ -0,0 +1,42 @@
|
|
1
|
+
class StartupLayoutGenerator < Rails::Generator::Base
|
2
|
+
|
3
|
+
def manifest
|
4
|
+
record do |m|
|
5
|
+
m.directory 'public/stylesheets'
|
6
|
+
m.directory 'app/helpers'
|
7
|
+
m.directory 'app/views/layouts'
|
8
|
+
|
9
|
+
m.file "app/helpers/layout_helper.rb", "app/helpers/layout_helper.rb"
|
10
|
+
|
11
|
+
#TODO add checks here for other startups so the layout can include eg. the nav stuff, etc.
|
12
|
+
#TODO possibly add shway versions of things as well.
|
13
|
+
m.template "app/views/layouts/startup_layout.html.erb", "app/views/layouts/application.html.erb"#, :assigns => { :foo => 'foo' }
|
14
|
+
m.file "app/views/layouts/_startup_layout_footer.html.erb", "app/views/layouts/_footer.html.erb"
|
15
|
+
m.file "app/views/layouts/_startup_layout_header.html.erb", "app/views/layouts/_header.html.erb"
|
16
|
+
|
17
|
+
m.file "public/stylesheets/startup_layout_reset.css", "public/stylesheets/reset.css"
|
18
|
+
m.file "public/stylesheets/startup_layout.css", "public/stylesheets/application.css"
|
19
|
+
|
20
|
+
remove_file 'public/index.html'
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
protected
|
25
|
+
|
26
|
+
def remove_file(relative_destination)
|
27
|
+
destination = destination_path('public/index.html')
|
28
|
+
if File.exist?(destination)
|
29
|
+
logger.rm relative_destination
|
30
|
+
FileUtils.rm(destination)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def banner
|
35
|
+
<<-EOS
|
36
|
+
Creates a basic layout with the necessary helpers, stylesheet etc.
|
37
|
+
|
38
|
+
USAGE: #{$0} #{spec.name}
|
39
|
+
EOS
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
module LayoutHelper
|
2
|
+
|
3
|
+
attr_accessor :title, :heading, :heading_image, :body_class, :crumbs
|
4
|
+
|
5
|
+
#for any options that match setter methods, set them. Raise errors for the rest.
|
6
|
+
def layout_options(options={})
|
7
|
+
return if options.blank?
|
8
|
+
options = options.clone
|
9
|
+
options.keys.each do |key|
|
10
|
+
#if there is a layout_ version of the setter, call it
|
11
|
+
layout_setter = "layout_#{key}=".intern
|
12
|
+
if self.respond_to? layout_setter
|
13
|
+
self.send layout_setter, options.delete(key)
|
14
|
+
next
|
15
|
+
end
|
16
|
+
setter = "#{key}=".intern
|
17
|
+
#if there is a setter, call it
|
18
|
+
if self.respond_to? setter
|
19
|
+
self.send setter, options.delete(key)
|
20
|
+
next
|
21
|
+
end
|
22
|
+
#if there is a no setter, but there is a method, call it with *args
|
23
|
+
#TODO write some tests for varying method signatures
|
24
|
+
if self.respond_to?(key) && (method(key).arity == 1 || method(key).arity <= -2)
|
25
|
+
self.send key, *options.delete(key)
|
26
|
+
next
|
27
|
+
end
|
28
|
+
#if there was no setter and no method available, raise
|
29
|
+
raise "No setter or method was found for the layout_option: #{key}"
|
30
|
+
end
|
31
|
+
nil
|
32
|
+
end
|
33
|
+
|
34
|
+
def layout_title
|
35
|
+
#NOTE: @selected_nav_title may get set by the nav startup if it's installed. Using the instance var makes it easier to mix and match the startups.
|
36
|
+
@title || @selected_nav_title || @heading || 'Default Title (CHANGEME)'
|
37
|
+
end
|
38
|
+
|
39
|
+
def layout_heading(text=@heading,options={})
|
40
|
+
options[:img] = @heading_image unless options.has_key? :img
|
41
|
+
if options[:img].blank?
|
42
|
+
text.blank? ? nil : %{<h1>#{text}</h1>}
|
43
|
+
#TODO make sifrd an option
|
44
|
+
# text.blank? ? nil : %{<h1 class="sifrd">#{text}</h1>}
|
45
|
+
else
|
46
|
+
%{<h1>#{image_tag(options[:img], :alt => text)}</h1>} unless text.blank?
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def layout_crumbs
|
51
|
+
return if @crumbs.blank?
|
52
|
+
html = []
|
53
|
+
html << '<div class="crumbs">'
|
54
|
+
@crumbs.each do |crumb|
|
55
|
+
html << crumb
|
56
|
+
html << '<span>»</span>'
|
57
|
+
end
|
58
|
+
html << '</div>'
|
59
|
+
html.join
|
60
|
+
end
|
61
|
+
|
62
|
+
def layout_body_tag
|
63
|
+
class_att = body_class ? %{ class="#{body_class}"} : nil
|
64
|
+
if @layout_nav
|
65
|
+
%{<body id="#{@layout_nav}"#{class_att}>}
|
66
|
+
else
|
67
|
+
'<body>'
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
data/rails_generators/startup_layout/templates/app/views/layouts/_startup_layout_footer.html.erb
ADDED
@@ -0,0 +1,6 @@
|
|
1
|
+
<div id="footer">
|
2
|
+
<div id="footer_content">
|
3
|
+
<%# NOTE: the const_defined? check is here to allow this to function if the nav startup wasn't installed, and should be removed after the initial setup. %>
|
4
|
+
<%= render :partial => 'layouts/footer_nav' if Object.const_defined? :NavHelper %>
|
5
|
+
</div>
|
6
|
+
</div>
|
@@ -0,0 +1,40 @@
|
|
1
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
2
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
3
|
+
<head>
|
4
|
+
<title><%%= layout_title %></title>
|
5
|
+
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
|
6
|
+
<meta http-equiv="cache-control" content="no-cache"> <!-- tells browser not to cache -->
|
7
|
+
<meta http-equiv="expires" content="0"> <!-- says that the cache expires 'now' -->
|
8
|
+
<meta http-equiv="pragma" content="no-cache"> <!-- says not to use cached stuff, if there is any -->
|
9
|
+
<%%= javascript_include_tag :defaults %>
|
10
|
+
<%%= stylesheet_link_tag 'reset' %>
|
11
|
+
<%%# NOTE: the const_defined? check is here to allow this to function if the nav startup wasn't installed, and should be removed after the initial setup. %>
|
12
|
+
<%%= stylesheet_link_tag 'nav' if Object.const_defined? :NavHelper %>
|
13
|
+
<%%= stylesheet_link_tag 'application' %>
|
14
|
+
</head>
|
15
|
+
|
16
|
+
<%%= layout_body_tag %>
|
17
|
+
<div id="all">
|
18
|
+
<%%= render :partial => 'layouts/header' unless @omit_header %>
|
19
|
+
<div id="content">
|
20
|
+
<%%= layout_crumbs %>
|
21
|
+
<%%= layout_heading %>
|
22
|
+
<%% if flash[:notice] %>
|
23
|
+
<div class="notice confirm">
|
24
|
+
<%%= flash[:notice] %>
|
25
|
+
</div>
|
26
|
+
<%% end %>
|
27
|
+
<%% if flash[:error ] %>
|
28
|
+
<div class='notice error'>
|
29
|
+
<%%= flash[:error ]%>
|
30
|
+
</div>
|
31
|
+
<%% end %>
|
32
|
+
<%%#= fancy_heading unless @heading.blank? && @right_heading.blank? %>
|
33
|
+
<%%= yield %>
|
34
|
+
</div>
|
35
|
+
<%%= render :partial => 'layouts/footer' %>
|
36
|
+
</div>
|
37
|
+
|
38
|
+
</body>
|
39
|
+
|
40
|
+
</html>
|
data/rails_generators/startup_layout/templates/app/views/layouts/startup_layout_shway.html.erb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
<% presenter do |p| %>
|
2
|
+
|
3
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
4
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
5
|
+
<head>
|
6
|
+
<title><%= p.layout_title %></title>
|
7
|
+
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
|
8
|
+
<meta http-equiv="cache-control" content="no-cache"> <!-- tells browser not to cache -->
|
9
|
+
<meta http-equiv="expires" content="0"> <!-- says that the cache expires 'now' -->
|
10
|
+
<meta http-equiv="pragma" content="no-cache"> <!-- says not to use cached stuff, if there is any -->
|
11
|
+
<%= default_head_contents %>
|
12
|
+
<%= stylesheet_link_tag 'application' %>
|
13
|
+
</head>
|
14
|
+
|
15
|
+
<%= p.layout_body_tag %>
|
16
|
+
<div class="all">
|
17
|
+
<%= render :partial => 'layouts/header' unless @omit_header %>
|
18
|
+
<div class="content">
|
19
|
+
<% if flash[:notice ] %>
|
20
|
+
<div id='flash-notice'>
|
21
|
+
<%= flash[:notice ]%>
|
22
|
+
</div>
|
23
|
+
<% end %>
|
24
|
+
<% if flash[:error ] %>
|
25
|
+
<div id='flash-error'>
|
26
|
+
<%= flash[:error ]%>
|
27
|
+
</div>
|
28
|
+
<% end %>
|
29
|
+
<%#= fancy_heading unless @heading.blank? && @right_heading.blank? %>
|
30
|
+
<%= yield %>
|
31
|
+
</div>
|
32
|
+
<%= render :partial => 'layouts/footer' %>
|
33
|
+
</div>
|
34
|
+
|
35
|
+
</body>
|
36
|
+
|
37
|
+
</html>
|
38
|
+
|
39
|
+
<% end %>
|
@@ -0,0 +1,33 @@
|
|
1
|
+
html,body {background-color:white;font-family:Helvetica, Verdana, Arial, sans-serif;font-size:12px;height:100%;line-height:18px;margin:0px;padding:0px;}
|
2
|
+
|
3
|
+
h1 {font-size: 18px; margin: 10px 0;}
|
4
|
+
h2 {font-size: 14px; font-weight: bold;}
|
5
|
+
h3 {font-size: 12px; font-weight: bold;}
|
6
|
+
|
7
|
+
a {color:#5d5e5e;text-decoration: none;}
|
8
|
+
a:link {color:#5d5e5e;}
|
9
|
+
a:active,
|
10
|
+
a:hover {color:#5d5e5e; text-decoration: underline;}
|
11
|
+
a:visited {color:#5d5e5e;}
|
12
|
+
|
13
|
+
#all {background-color:white;color:#5d5e5e;min-height:100%;position:relative;}
|
14
|
+
|
15
|
+
.crumbs {font-size:10px;font-weight:normal;font-style:italic;text-transform:none;height:10px;padding:0;margin:0;}
|
16
|
+
.crumbs a {padding:0;margin:0;}
|
17
|
+
.crumbs span {font-size:12px;margin-left:5px;margin-right:5px;}
|
18
|
+
|
19
|
+
#content {overflow:auto;padding:10px 20px 0px 55px;padding-bottom:30px;width:950px;} /* bottom padding needs to match footer height */
|
20
|
+
#content_link {color:#5d5e5e;text-decoration:none;}
|
21
|
+
#content_link_underline {color:#5d5e5e;text-decoration:underline;}
|
22
|
+
|
23
|
+
#masthead {color:#a0a1a2;height:40px;padding-top:15px;width:100%;border-bottom:1px solid #e0e1e2;}
|
24
|
+
#masthead a {}
|
25
|
+
#masthead a:active {color:#5d5e5e;text-decoration:underline;}
|
26
|
+
#masthead a:hover {color:#5d5e5e;text-decoration:underline;}
|
27
|
+
#masthead a:link {color:#a0a1a2;text-decoration:none;}
|
28
|
+
#masthead a:visited {color:#a0a1a2;text-decoration:none;}
|
29
|
+
#masthead_link {color:#a0a1a2;text-decoration:none;}
|
30
|
+
#masthead_link_underline {color:#5d5e5e;text-decoration:underline;}
|
31
|
+
|
32
|
+
#footer {bottom:0px;color:#a0a1a2;height:30px;position:absolute;width:100%;border-top:1px solid #e0e1e2;font-size:10px;}
|
33
|
+
#footer_content {padding:5px 20px;padding-bottom:0px;width:950px;overflow:auto;}
|
@@ -0,0 +1,47 @@
|
|
1
|
+
/* reset reload by Eric Meyer: http://meyerweb.com/eric/thoughts/2007/05/01/reset-reloaded/ */
|
2
|
+
html, body, div, span, applet, object, iframe,
|
3
|
+
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
|
4
|
+
a, abbr, acronym, address, big, cite, code,
|
5
|
+
del, dfn, em, font, img, ins, kbd, q, s, samp,
|
6
|
+
small, strike, strong, sub, sup, tt, var,
|
7
|
+
dl, dt, dd, ol, ul, li,
|
8
|
+
fieldset, form, label, legend,
|
9
|
+
table, caption, tbody, tfoot, thead, tr, th, td {
|
10
|
+
margin: 0;
|
11
|
+
padding: 0;
|
12
|
+
border: 0;
|
13
|
+
outline: 0;
|
14
|
+
font-weight: inherit;
|
15
|
+
font-style: inherit;
|
16
|
+
font-size: 100%;
|
17
|
+
font-family: inherit;
|
18
|
+
vertical-align: baseline;
|
19
|
+
}
|
20
|
+
/* remember to define focus styles! */
|
21
|
+
:focus {
|
22
|
+
outline: 0;
|
23
|
+
}
|
24
|
+
body {
|
25
|
+
line-height: 1;
|
26
|
+
color: black;
|
27
|
+
background: white;
|
28
|
+
}
|
29
|
+
ol, ul {
|
30
|
+
list-style: none;
|
31
|
+
}
|
32
|
+
/* tables still need 'cellspacing="0"' in the markup */
|
33
|
+
table {
|
34
|
+
border-collapse: separate;
|
35
|
+
border-spacing: 0;
|
36
|
+
}
|
37
|
+
caption, th, td {
|
38
|
+
text-align: left;
|
39
|
+
font-weight: normal;
|
40
|
+
}
|
41
|
+
blockquote:before, blockquote:after,
|
42
|
+
q:before, q:after {
|
43
|
+
content: "";
|
44
|
+
}
|
45
|
+
blockquote, q {
|
46
|
+
quotes: "" "";
|
47
|
+
}
|
@@ -0,0 +1,12 @@
|
|
1
|
+
Description:
|
2
|
+
The startup_nav generator creates generic navigation with a customizable helper and stylesheet.
|
3
|
+
|
4
|
+
With no arguments, a top_nav partial and helper_method will be generated.
|
5
|
+
All arguments given to the generator will add additional nav partial and helper method.
|
6
|
+
|
7
|
+
Examples:
|
8
|
+
script/generate startup_nav
|
9
|
+
|
10
|
+
Template: app/views/layouts/_top_nav.html.erb
|
11
|
+
Stylesheet: public/stylesheets/nav.css
|
12
|
+
Helper: app/helpers/nav_helper.rb
|
@@ -0,0 +1,65 @@
|
|
1
|
+
class StartupNavGenerator < Rails::Generator::Base
|
2
|
+
|
3
|
+
def manifest
|
4
|
+
record do |m|
|
5
|
+
m.directory 'app/views/layouts'
|
6
|
+
m.directory 'public/stylesheets'
|
7
|
+
m.directory 'app/helpers'
|
8
|
+
|
9
|
+
#add top and footer by default
|
10
|
+
unless @args.include? "top"
|
11
|
+
@args << "top"
|
12
|
+
@args << "footer"
|
13
|
+
end
|
14
|
+
|
15
|
+
m.template "nav.css", "public/stylesheets/nav.css", :assigns => { :names => @args }
|
16
|
+
m.template "nav_helper.rb", "app/helpers/nav_helper.rb", :assigns => { :names => @args }
|
17
|
+
@args.each do |name|
|
18
|
+
m.template "_nav.html.erb", "app/views/layouts/_#{name}_nav.html.erb", :assigns => { :name => name }
|
19
|
+
end
|
20
|
+
# m.file "nav.css", "public/stylesheets/nav.css"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def generate_nav(name)
|
25
|
+
end
|
26
|
+
|
27
|
+
protected
|
28
|
+
|
29
|
+
def banner
|
30
|
+
<<-EOS
|
31
|
+
Creates generic navigation with a customizable helper and stylesheet.
|
32
|
+
|
33
|
+
USAGE: #{$0} #{spec.name}
|
34
|
+
EOS
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
|
41
|
+
# def initialize(runtime_args, runtime_options = {})
|
42
|
+
# super
|
43
|
+
# @name = @args.first || 'application'
|
44
|
+
# end
|
45
|
+
|
46
|
+
# def file_name
|
47
|
+
# @name.underscore
|
48
|
+
# end
|
49
|
+
|
50
|
+
# protected
|
51
|
+
|
52
|
+
# def add_options!(opt)
|
53
|
+
# opt.separator ''
|
54
|
+
# opt.separator 'Options:'
|
55
|
+
# opt.on("--haml", "Generate HAML for view, and SASS for stylesheet.") { |v| options[:haml] = v }
|
56
|
+
# end
|
57
|
+
|
58
|
+
# def banner
|
59
|
+
# <<-EOS
|
60
|
+
# Creates generic layout, stylesheet, and helper files.
|
61
|
+
#
|
62
|
+
# USAGE: #{$0} #{spec.name} [layout_name]
|
63
|
+
# EOS
|
64
|
+
# end
|
65
|
+
|
@@ -0,0 +1,8 @@
|
|
1
|
+
<%- css_id = (name.to_s == 'top') ? 'nav' : "#{name}_nav" -%>
|
2
|
+
<ul id="<%= css_id %>">
|
3
|
+
<%% layout_nav_items.each do |nav_item|
|
4
|
+
next unless nav_item[:placement] == :top
|
5
|
+
%>
|
6
|
+
<li><%%= link_to(nav_item[:label], nav_item[:url], :id => "nav_#{nav_item[:id]}") %></li>
|
7
|
+
<%% end %>
|
8
|
+
</ul>
|
@@ -0,0 +1,34 @@
|
|
1
|
+
<% names.each do |name|
|
2
|
+
css_id = (name.to_s == 'top') ? 'nav' : "#{name}_nav"
|
3
|
+
selected_color = (name.to_s == 'footer') ? '#5d5e5e' : 'black'
|
4
|
+
%>
|
5
|
+
|
6
|
+
/************
|
7
|
+
<%= css_id.upcase %> STYLES
|
8
|
+
************/
|
9
|
+
<% if name.to_s == 'footer' %>
|
10
|
+
#footer_nav {list-style-type:none;float:right;}
|
11
|
+
#footer_nav li {float:left;margin-right:20px;}
|
12
|
+
#footer_nav a {display:block;position:relative;text-decoration:none;text-transform:uppercase;}
|
13
|
+
#footer_nav a:active {color:#5d5e5e;text-decoration:underline;}
|
14
|
+
#footer_nav a:hover {color:#5d5e5e;text-decoration:underline;}
|
15
|
+
#footer_nav a:link {color:#a0a1a2;text-decoration:none;}
|
16
|
+
#footer_nav a:visited {color:#a0a1a2;text-decoration:none;}
|
17
|
+
<% else %>
|
18
|
+
#<%= css_id %> a {display:block;height:20px;padding:5px 10px;position:relative;text-decoration:none;text-transform:uppercase;}
|
19
|
+
#<%= css_id %> a:active {color:#5d5e5e;text-decoration:none;}
|
20
|
+
#<%= css_id %> a:hover {color:#5d5e5e;text-decoration:none;}
|
21
|
+
#<%= css_id %> a:link {color:#a0a1a2;text-decoration:none;}
|
22
|
+
#<%= css_id %> a:visited {color:#a0a1a2;text-decoration:none;}
|
23
|
+
#<%= css_id %> li {float:left;}
|
24
|
+
#<%= css_id %> {list-style-type:none;margin-left:22px;overflow:auto;}
|
25
|
+
<% end %>
|
26
|
+
|
27
|
+
/* any additional menu items need to be added here for them to be styled correctly when selected. */
|
28
|
+
body#home a#<%= css_id %>_home,
|
29
|
+
body#example a#<%= css_id %>_example,
|
30
|
+
body#help a#<%= css_id %>_help {
|
31
|
+
color:<%= selected_color %>;font-weight:bold;
|
32
|
+
}
|
33
|
+
|
34
|
+
<% end %>
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module NavHelper
|
2
|
+
|
3
|
+
#change the hash below to include the actual items you need in your navs. Use the :placement option to specify which nav an item goes in if there are multiple navs.
|
4
|
+
def layout_nav_items
|
5
|
+
@layout_nav_items ||= [
|
6
|
+
<%- names.each do |name| -%>
|
7
|
+
#nav items for :<%= name %>
|
8
|
+
{:id => :home, :label => 'Home', :url => root_path, :placement => :<%= name %>, :title => 'Home Page'},
|
9
|
+
{:id => :help, :label => 'Help', :url => help_path, :placement => :<%= name %>},
|
10
|
+
{:id => :example, :label => 'Example', :url => placeholder_path(:example), :placement => :<%= name %>, :title => 'Placeholder Example Page'},
|
11
|
+
<%- end -%>
|
12
|
+
]
|
13
|
+
end
|
14
|
+
|
15
|
+
|
16
|
+
attr_accessor :layout_nav
|
17
|
+
|
18
|
+
def layout_nav=(value)
|
19
|
+
@layout_nav = value
|
20
|
+
@selected_nav_title = (selected_nav_item ? selected_nav_item[:title] : nil)
|
21
|
+
end
|
22
|
+
|
23
|
+
def layout_nav_ids
|
24
|
+
@layout_nav_ids ||= layout_nav_items.collect{|nav_item|nav_item[:id]}
|
25
|
+
end
|
26
|
+
|
27
|
+
def selected_nav_item
|
28
|
+
@selected_nav_item ||= layout_nav_item(layout_nav)
|
29
|
+
end
|
30
|
+
|
31
|
+
def layout_nav_item(nav_id)
|
32
|
+
nav_id = nav_id.intern if nav_id.respond_to? :intern
|
33
|
+
layout_nav_items.each do |nav_item|
|
34
|
+
return nav_item if nav_item[:id] == nav_id
|
35
|
+
end
|
36
|
+
nil
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
data/startups.gemspec
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{startups}
|
5
|
+
s.version = "0.0.1"
|
6
|
+
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = ["Ryan Owens"]
|
9
|
+
s.date = %q{2009-10-16}
|
10
|
+
s.description = %q{A collection of Rails "startups" for features such as a standard layout, navigation and forms with customizable error handling.}
|
11
|
+
s.email = %q{ryan (at) infoether (dot) com}
|
12
|
+
s.extra_rdoc_files = ["CHANGELOG", "lib/startups.rb", "LICENSE", "README", "TODO"]
|
13
|
+
s.files = ["CHANGELOG", "lib/startups.rb", "LICENSE", "Manifest", "rails_generators/startup_content/startup_content_generator.rb", "rails_generators/startup_content/templates/content_controller.rb", "rails_generators/startup_content/templates/content_controller_test.rb", "rails_generators/startup_content/templates/content_helper.rb", "rails_generators/startup_content/templates/example.html.erb", "rails_generators/startup_content/templates/help.html.erb", "rails_generators/startup_content/templates/home.html.erb", "rails_generators/startup_content/USAGE", "rails_generators/startup_layout/startup_layout_generator.rb", "rails_generators/startup_layout/templates/app/helpers/layout_helper.rb", "rails_generators/startup_layout/templates/app/views/layouts/_startup_layout_footer.html.erb", "rails_generators/startup_layout/templates/app/views/layouts/_startup_layout_header.html.erb", "rails_generators/startup_layout/templates/app/views/layouts/startup_layout.html.erb", "rails_generators/startup_layout/templates/app/views/layouts/startup_layout_shway.html.erb", "rails_generators/startup_layout/templates/public/stylesheets/startup_layout.css", "rails_generators/startup_layout/templates/public/stylesheets/startup_layout_reset.css", "rails_generators/startup_layout/USAGE", "rails_generators/startup_nav/startup_nav_generator.rb", "rails_generators/startup_nav/templates/_nav.html.erb", "rails_generators/startup_nav/templates/nav.css", "rails_generators/startup_nav/templates/nav_helper.rb", "rails_generators/startup_nav/USAGE", "Rakefile", "README", "TODO", "startups.gemspec"]
|
14
|
+
s.homepage = %q{http://rubyforge.org/projects/startups}
|
15
|
+
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Startups", "--main", "README"]
|
16
|
+
s.require_paths = ["lib"]
|
17
|
+
s.rubyforge_project = %q{startups}
|
18
|
+
s.rubygems_version = %q{1.3.5}
|
19
|
+
s.summary = %q{A collection of Rails "startups" for features such as a standard layout, navigation and forms with customizable error handling.}
|
20
|
+
|
21
|
+
if s.respond_to? :specification_version then
|
22
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
23
|
+
s.specification_version = 3
|
24
|
+
|
25
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
26
|
+
else
|
27
|
+
end
|
28
|
+
else
|
29
|
+
end
|
30
|
+
end
|
metadata
ADDED
@@ -0,0 +1,93 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: startups
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Ryan Owens
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-10-16 00:00:00 -04:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description: A collection of Rails "startups" for features such as a standard layout, navigation and forms with customizable error handling.
|
17
|
+
email: ryan (at) infoether (dot) com
|
18
|
+
executables: []
|
19
|
+
|
20
|
+
extensions: []
|
21
|
+
|
22
|
+
extra_rdoc_files:
|
23
|
+
- CHANGELOG
|
24
|
+
- lib/startups.rb
|
25
|
+
- LICENSE
|
26
|
+
- README
|
27
|
+
- TODO
|
28
|
+
files:
|
29
|
+
- CHANGELOG
|
30
|
+
- lib/startups.rb
|
31
|
+
- LICENSE
|
32
|
+
- Manifest
|
33
|
+
- rails_generators/startup_content/startup_content_generator.rb
|
34
|
+
- rails_generators/startup_content/templates/content_controller.rb
|
35
|
+
- rails_generators/startup_content/templates/content_controller_test.rb
|
36
|
+
- rails_generators/startup_content/templates/content_helper.rb
|
37
|
+
- rails_generators/startup_content/templates/example.html.erb
|
38
|
+
- rails_generators/startup_content/templates/help.html.erb
|
39
|
+
- rails_generators/startup_content/templates/home.html.erb
|
40
|
+
- rails_generators/startup_content/USAGE
|
41
|
+
- rails_generators/startup_layout/startup_layout_generator.rb
|
42
|
+
- rails_generators/startup_layout/templates/app/helpers/layout_helper.rb
|
43
|
+
- rails_generators/startup_layout/templates/app/views/layouts/_startup_layout_footer.html.erb
|
44
|
+
- rails_generators/startup_layout/templates/app/views/layouts/_startup_layout_header.html.erb
|
45
|
+
- rails_generators/startup_layout/templates/app/views/layouts/startup_layout.html.erb
|
46
|
+
- rails_generators/startup_layout/templates/app/views/layouts/startup_layout_shway.html.erb
|
47
|
+
- rails_generators/startup_layout/templates/public/stylesheets/startup_layout.css
|
48
|
+
- rails_generators/startup_layout/templates/public/stylesheets/startup_layout_reset.css
|
49
|
+
- rails_generators/startup_layout/USAGE
|
50
|
+
- rails_generators/startup_nav/startup_nav_generator.rb
|
51
|
+
- rails_generators/startup_nav/templates/_nav.html.erb
|
52
|
+
- rails_generators/startup_nav/templates/nav.css
|
53
|
+
- rails_generators/startup_nav/templates/nav_helper.rb
|
54
|
+
- rails_generators/startup_nav/USAGE
|
55
|
+
- Rakefile
|
56
|
+
- README
|
57
|
+
- TODO
|
58
|
+
- startups.gemspec
|
59
|
+
has_rdoc: true
|
60
|
+
homepage: http://rubyforge.org/projects/startups
|
61
|
+
licenses: []
|
62
|
+
|
63
|
+
post_install_message:
|
64
|
+
rdoc_options:
|
65
|
+
- --line-numbers
|
66
|
+
- --inline-source
|
67
|
+
- --title
|
68
|
+
- Startups
|
69
|
+
- --main
|
70
|
+
- README
|
71
|
+
require_paths:
|
72
|
+
- lib
|
73
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
74
|
+
requirements:
|
75
|
+
- - ">="
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: "0"
|
78
|
+
version:
|
79
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - ">="
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: "1.2"
|
84
|
+
version:
|
85
|
+
requirements: []
|
86
|
+
|
87
|
+
rubyforge_project: startups
|
88
|
+
rubygems_version: 1.3.5
|
89
|
+
signing_key:
|
90
|
+
specification_version: 3
|
91
|
+
summary: A collection of Rails "startups" for features such as a standard layout, navigation and forms with customizable error handling.
|
92
|
+
test_files: []
|
93
|
+
|