Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Creation of nested_layouts project

  • Loading branch information...
commit c112087b2fe500e67f1f29b903cc5a9f67b802f0 0 parents
@moklett authored
3  README
@@ -0,0 +1,3 @@
+= Nested Layouts
+
+An extension for Radiant CMS which provides tags for creating nested layouts.
120 Rakefile
@@ -0,0 +1,120 @@
+# I think this is the one that should be moved to the extension Rakefile template
+
+# In rails 1.2, plugins aren't available in the path until they're loaded.
+# Check to see if the rspec plugin is installed first and require
+# it if it is. If not, use the gem version.
+
+# Determine where the RSpec plugin is by loading the boot
+unless defined? RADIANT_ROOT
+ ENV["RAILS_ENV"] = "test"
+ case
+ when ENV["RADIANT_ENV_FILE"]
+ require File.dirname(ENV["RADIANT_ENV_FILE"]) + "/boot"
+ when File.dirname(__FILE__) =~ %r{vendor/radiant/vendor/extensions}
+ require "#{File.expand_path(File.dirname(__FILE__) + "/../../../../../")}/config/boot"
+ else
+ require "#{File.expand_path(File.dirname(__FILE__) + "/../../../")}/config/boot"
+ end
+end
+
+require 'rake'
+require 'rake/rdoctask'
+require 'rake/testtask'
+
+rspec_base = File.expand_path(RADIANT_ROOT + '/vendor/plugins/rspec/lib')
+$LOAD_PATH.unshift(rspec_base) if File.exist?(rspec_base)
+require 'spec/rake/spectask'
+# require 'spec/translator'
+
+# Cleanup the RADIANT_ROOT constant so specs will load the environment
+Object.send(:remove_const, :RADIANT_ROOT)
+
+extension_root = File.expand_path(File.dirname(__FILE__))
+
+task :default => :spec
+task :stats => "spec:statsetup"
+
+desc "Run all specs in spec directory"
+Spec::Rake::SpecTask.new(:spec) do |t|
+ t.spec_opts = ['--options', "\"#{extension_root}/spec/spec.opts\""]
+ t.spec_files = FileList['spec/**/*_spec.rb']
+end
+
+namespace :spec do
+ desc "Run all specs in spec directory with RCov"
+ Spec::Rake::SpecTask.new(:rcov) do |t|
+ t.spec_opts = ['--options', "\"#{extension_root}/spec/spec.opts\""]
+ t.spec_files = FileList['spec/**/*_spec.rb']
+ t.rcov = true
+ t.rcov_opts = ['--exclude', 'spec', '--rails']
+ end
+
+ desc "Print Specdoc for all specs"
+ Spec::Rake::SpecTask.new(:doc) do |t|
+ t.spec_opts = ["--format", "specdoc", "--dry-run"]
+ t.spec_files = FileList['spec/**/*_spec.rb']
+ end
+
+ [:models, :controllers, :views, :helpers].each do |sub|
+ desc "Run the specs under spec/#{sub}"
+ Spec::Rake::SpecTask.new(sub) do |t|
+ t.spec_opts = ['--options', "\"#{extension_root}/spec/spec.opts\""]
+ t.spec_files = FileList["spec/#{sub}/**/*_spec.rb"]
+ end
+ end
+
+ # Hopefully no one has written their extensions in pre-0.9 style
+ # desc "Translate specs from pre-0.9 to 0.9 style"
+ # task :translate do
+ # translator = ::Spec::Translator.new
+ # dir = RAILS_ROOT + '/spec'
+ # translator.translate(dir, dir)
+ # end
+
+ # Setup specs for stats
+ task :statsetup do
+ require 'code_statistics'
+ ::STATS_DIRECTORIES << %w(Model\ specs spec/models)
+ ::STATS_DIRECTORIES << %w(View\ specs spec/views)
+ ::STATS_DIRECTORIES << %w(Controller\ specs spec/controllers)
+ ::STATS_DIRECTORIES << %w(Helper\ specs spec/views)
+ ::CodeStatistics::TEST_TYPES << "Model specs"
+ ::CodeStatistics::TEST_TYPES << "View specs"
+ ::CodeStatistics::TEST_TYPES << "Controller specs"
+ ::CodeStatistics::TEST_TYPES << "Helper specs"
+ ::STATS_DIRECTORIES.delete_if {|a| a[0] =~ /test/}
+ end
+
+ namespace :db do
+ namespace :fixtures do
+ desc "Load fixtures (from spec/fixtures) into the current environment's database. Load specific fixtures using FIXTURES=x,y"
+ task :load => :environment do
+ require 'active_record/fixtures'
+ ActiveRecord::Base.establish_connection(RAILS_ENV.to_sym)
+ (ENV['FIXTURES'] ? ENV['FIXTURES'].split(/,/) : Dir.glob(File.join(RAILS_ROOT, 'spec', 'fixtures', '*.{yml,csv}'))).each do |fixture_file|
+ Fixtures.create_fixtures('spec/fixtures', File.basename(fixture_file, '.*'))
+ end
+ end
+ end
+ end
+end
+
+desc 'Generate documentation for the nested_layouts extension.'
+Rake::RDocTask.new(:rdoc) do |rdoc|
+ rdoc.rdoc_dir = 'rdoc'
+ rdoc.title = 'NestedLayoutsExtension'
+ rdoc.options << '--line-numbers' << '--inline-source'
+ rdoc.rdoc_files.include('README')
+ rdoc.rdoc_files.include('lib/**/*.rb')
+end
+
+# For extensions that are in transition
+desc 'Test the nested_layouts extension.'
+Rake::TestTask.new(:test) do |t|
+ t.libs << 'lib'
+ t.pattern = 'test/**/*_test.rb'
+ t.verbose = true
+end
+
+# Load any custom rakefiles for extension
+Dir[File.dirname(__FILE__) + '/tasks/*.rake'].sort.each { |f| require f }
41 lib/nested_layout_tags.rb
@@ -0,0 +1,41 @@
+module NestedLayoutTags
+ include Radiant::Taggable
+
+ class TagError < StandardError; end
+
+ tag 'inside_layout' do |tag|
+ if name = tag.attr['name']
+ # Prepare the stacks
+ tag.globals.nested_layouts_content_stack ||= []
+ tag.globals.nested_layouts_layout_stack ||= []
+
+ # Find the layout
+ name.strip!
+ if layout = Layout.find_by_name(name)
+ # Track this layout on the stack
+ tag.globals.nested_layouts_layout_stack << name
+
+ # Save contents of inside_layout for later insertion
+ tag.globals.nested_layouts_content_stack << tag.expand
+
+ # Set the page layout that Radiant should use for rendering, which is different than the actual
+ # page's layout when layouts are nested. The final/highest +inside_layout+ tag will set or
+ # overwrite this value for the last time.
+ tag.globals.page.layout = layout
+ tag.globals.page.render
+ else
+ raise TagError.new(%{Error (nested_layouts): Parent layout "#{name.strip}" not found for "inside_layout" tag})
+ end
+ else
+ raise TagError.new(%{Error (nested_layouts): "inside_layout" tag must contain a "name" attribute})
+ end
+ end
+
+ tag 'content_for_layout' do |tag|
+ tag.globals.nested_layouts_content_stack ||= []
+
+ # return the saved content if any, or mimic a default +<r:content/>+ tag (render the body part)
+ tag.globals.nested_layouts_content_stack.pop || tag.globals.page.render_snippet(tag.locals.page.part('body'))
+ end
+
+end
16 lib/tasks/nested_layouts_extension_tasks.rake
@@ -0,0 +1,16 @@
+namespace :radiant do
+ namespace :extensions do
+ namespace :nested_layouts do
+
+ desc "Runs the migration of the Nested Layouts extension"
+ task :migrate => :environment do
+ puts "This extension does not affect the database. Nothing done."
+ end
+
+ desc "Copies public assets of the Nested Layouts to the instance public/ directory."
+ task :update => :environment do
+ puts "This extension has no public assets. Nothing done."
+ end
+ end
+ end
+end
14 nested_layouts_extension.rb
@@ -0,0 +1,14 @@
+class NestedLayoutsExtension < Radiant::Extension
+ version "0.1"
+ description "An extension for Radiant CMS which provides tags for creating nested layouts. "
+ url "http://webadvocate.com/radiant-nested-layouts-extension"
+
+ def activate
+ require 'lib/nested_layout_tags.rb'
+ Page.send :include, NestedLayoutTags
+ end
+
+ def deactivate
+ end
+
+end
66 spec/models/nested_layout_tags_spec.rb
@@ -0,0 +1,66 @@
+require File.dirname(__FILE__) + '/../spec_helper'
+
+describe "Nested Layout Tags" do
+ scenario :pages
+
+ before :each do
+ setup_page_and_layouts
+ end
+
+ it 'should render without layout' do
+ @page.layout = nil
+ @page.render.should == 'Hello World!'
+ end
+
+ it 'should render within layout using normal +content+ tag' do
+ @page.layout = @layouts[:traditional]
+ @page.render.should == %{<html><body>Hello World!</body></html>}
+ end
+
+ it 'should render within layout using the +content_for_layout+ tag' do
+ @page.layout = @layouts[:master]
+ @page.render.should == %{<html><body>Hello World!</body></html>}
+ end
+
+ it 'should render within layout nested 1 deep' do
+ @page.layout = @layouts[:nest1]
+ @page.render.should == %{<html><body><div id="nest1">Hello World!</div></body></html>}
+ end
+
+ it 'should render within layout nested 2 deep' do
+ @page.layout = @layouts[:nest2]
+ @page.render.should == %{<html><body><div id="nest1"><div id="nest2">Hello World!</div></div></body></html>}
+ end
+end
+
+def setup_page_and_layouts
+ @page = Page.new(
+ :title => "Home"
+ )
+ @page.parts.build(
+ :name => "body",
+ :content => "Hello World!"
+ )
+ @page.save
+
+ @layouts = {
+ :traditional => Layout.create(
+ :name => "traditional",
+ :content => %{<html><body><r:content/></body></html>}
+ ),
+ :master => Layout.create(
+ :name => "master",
+ :content => %{<html><body><r:content_for_layout/></body></html>}
+ ),
+ :nest1 => Layout.create(
+ :name => "nest1",
+ :content => %{<r:inside_layout name="master"><div id="nest1"><r:content_for_layout/></div></r:inside_layout>}
+ ),
+ :nest2 => Layout.create(
+ :name => "nest2",
+ :content => %{<r:inside_layout name="nest1"><div id="nest2"><r:content_for_layout/></div></r:inside_layout>}
+ )
+
+ }
+end
+
6 spec/spec.opts
@@ -0,0 +1,6 @@
+--colour
+--format
+progress
+--loadby
+mtime
+--reverse
37 spec/spec_helper.rb
@@ -0,0 +1,37 @@
+unless defined? RADIANT_ROOT
+ ENV["RAILS_ENV"] = "test"
+ case
+ when ENV["RADIANT_ENV_FILE"]
+ require ENV["RADIANT_ENV_FILE"]
+ when File.dirname(__FILE__) =~ %r{vendor/radiant/vendor/extensions}
+ require "#{File.expand_path(File.dirname(__FILE__) + "/../../../../../../")}/config/environment"
+ else
+ require "#{File.expand_path(File.dirname(__FILE__) + "/../../../../")}/config/environment"
+ end
+end
+require "#{RADIANT_ROOT}/spec/spec_helper"
+
+if File.directory?(File.dirname(__FILE__) + "/scenarios")
+ Scenario.load_paths.unshift File.dirname(__FILE__) + "/scenarios"
+end
+if File.directory?(File.dirname(__FILE__) + "/matchers")
+ Dir[File.dirname(__FILE__) + "/matchers/*.rb"].each {|file| require file }
+end
+
+Spec::Runner.configure do |config|
+ # config.use_transactional_fixtures = true
+ # config.use_instantiated_fixtures = false
+ # config.fixture_path = RAILS_ROOT + '/spec/fixtures'
+
+ # You can declare fixtures for each behaviour like this:
+ # describe "...." do
+ # fixtures :table_a, :table_b
+ #
+ # Alternatively, if you prefer to declare them only once, you can
+ # do so here, like so ...
+ #
+ # config.global_fixtures = :table_a, :table_b
+ #
+ # If you declare global fixtures, be aware that they will be declared
+ # for all of your examples, even those that don't use them.
+end
Please sign in to comment.
Something went wrong with that request. Please try again.