erector 0.9.0.pre1 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gemtest +0 -0
 - data/Gemfile +1 -1
 - data/README.txt +3 -2
 - data/Rakefile +39 -18
 - data/VERSION.yml +1 -2
 - data/bin/erector +6 -0
 - data/lib/erector/abstract_widget.rb +15 -14
 - data/lib/erector/caching.rb +2 -2
 - data/lib/erector/convenience.rb +33 -1
 - data/lib/erector/erect/erect.rb +2 -1
 - data/lib/erector/externals.rb +10 -10
 - data/lib/erector/html_widget.rb +1 -81
 - data/lib/erector/needs.rb +3 -2
 - data/lib/erector/rails/railtie.rb +2 -0
 - data/lib/erector/rails3.rb +4 -1
 - data/lib/erector/sass.rb +13 -2
 - data/lib/erector/widget.rb +1 -1
 - data/lib/erector/xml_widget.rb +2 -2
 - data/spec/erector/convenience_spec.rb +4 -4
 - data/spec/erector/needs_spec.rb +32 -13
 - data/spec/erector/widget_spec.rb +11 -0
 - data/spec/erector/xml_widget_spec.rb +2 -3
 - data/spec/rails2/rails_app/Gemfile +2 -1
 - data/spec/rails2/rails_app/Gemfile.lock +34 -31
 - data/spec/rails2/rails_app/app/helpers/rails_helpers_spec_helper.rb +3 -0
 - data/spec/rails2/rails_app/app/helpers/test_helper.rb +3 -0
 - data/spec/rails2/rails_app/log/test.log +916 -2176
 - data/spec/rails2/rails_app/spec/render_spec.rb +1 -1
 - data/spec/rails_root/Gemfile +2 -1
 - data/spec/rails_root/Gemfile.lock +126 -0
 - data/spec/rails_root/app/views/layouts/widget_as_layout.rb +8 -0
 - data/spec/rails_root/app/views/test/render_with_widget_as_layout.rb +5 -0
 - data/spec/rails_root/app/views/test/render_with_widget_as_layout_using_content_for.rb +8 -0
 - data/spec/rails_root/log/test.log +1974 -2147
 - data/spec/rails_root/spec/rails_helpers_spec.rb +8 -0
 - data/spec/rails_root/spec/render_spec.rb +29 -1
 - data/spec/web/article_spec.rb +234 -0
 - metadata +107 -76
 - data/spec/rails2/rails_app/vendor/plugins/rails_xss/MIT-LICENSE +0 -20
 - data/spec/rails2/rails_app/vendor/plugins/rails_xss/README.markdown +0 -90
 - data/spec/rails2/rails_app/vendor/plugins/rails_xss/Rakefile +0 -23
 - data/spec/rails2/rails_app/vendor/plugins/rails_xss/init.rb +0 -7
 - data/spec/rails2/rails_app/vendor/plugins/rails_xss/lib/rails_xss.rb +0 -3
 - data/spec/rails2/rails_app/vendor/plugins/rails_xss/lib/rails_xss/action_view.rb +0 -87
 - data/spec/rails2/rails_app/vendor/plugins/rails_xss/lib/rails_xss/erubis.rb +0 -33
 - data/spec/rails2/rails_app/vendor/plugins/rails_xss/lib/rails_xss/string_ext.rb +0 -52
 - data/spec/rails2/rails_app/vendor/plugins/rails_xss/lib/tasks/rails_xss_tasks.rake +0 -4
 - data/spec/rails2/rails_app/vendor/plugins/rails_xss/test/active_record_helper_test.rb +0 -74
 - data/spec/rails2/rails_app/vendor/plugins/rails_xss/test/asset_tag_helper_test.rb +0 -49
 - data/spec/rails2/rails_app/vendor/plugins/rails_xss/test/caching_test.rb +0 -43
 - data/spec/rails2/rails_app/vendor/plugins/rails_xss/test/date_helper_test.rb +0 -29
 - data/spec/rails2/rails_app/vendor/plugins/rails_xss/test/deprecated_output_safety_test.rb +0 -112
 - data/spec/rails2/rails_app/vendor/plugins/rails_xss/test/erb_util_test.rb +0 -36
 - data/spec/rails2/rails_app/vendor/plugins/rails_xss/test/form_helper_test.rb +0 -1447
 - data/spec/rails2/rails_app/vendor/plugins/rails_xss/test/form_tag_helper_test.rb +0 -354
 - data/spec/rails2/rails_app/vendor/plugins/rails_xss/test/output_safety_test.rb +0 -115
 - data/spec/rails2/rails_app/vendor/plugins/rails_xss/test/rails_xss_test.rb +0 -23
 - data/spec/rails2/rails_app/vendor/plugins/rails_xss/test/test_helper.rb +0 -5
 - data/spec/rails2/rails_app/vendor/plugins/rails_xss/test/text_helper_test.rb +0 -17
 - data/spec/rails_root/log/development.log +0 -17
 
    
        data/.gemtest
    ADDED
    
    | 
         
            File without changes
         
     | 
    
        data/Gemfile
    CHANGED
    
    
    
        data/README.txt
    CHANGED
    
    | 
         @@ -2,6 +2,7 @@ 
     | 
|
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            * http://erector.rubyforge.org
         
     | 
| 
       4 
4 
     | 
    
         
             
            * mailto:erector@googlegroups.com
         
     | 
| 
      
 5 
     | 
    
         
            +
            * http://github.com/pivotal/erector
         
     | 
| 
       5 
6 
     | 
    
         
             
            * http://www.pivotaltracker.com/projects/482
         
     | 
| 
       6 
7 
     | 
    
         | 
| 
       7 
8 
     | 
    
         
             
            == DESCRIPTION
         
     | 
| 
         @@ -44,8 +45,8 @@ check it out. 
     | 
|
| 
       44 
45 
     | 
    
         | 
| 
       45 
46 
     | 
    
         
             
            == REQUIREMENTS
         
     | 
| 
       46 
47 
     | 
    
         | 
| 
       47 
     | 
    
         
            -
            The gem depends on rake and treetop, although this is just for using the command-line tool, 
     | 
| 
       48 
     | 
    
         
            -
            so deployed applications won't need these. The Rails-dependent code is now separated so 
     | 
| 
      
 48 
     | 
    
         
            +
            The gem depends on rake and treetop, although this is just for using the command-line tool,
         
     | 
| 
      
 49 
     | 
    
         
            +
            so deployed applications won't need these. The Rails-dependent code is now separated so
         
     | 
| 
       49 
50 
     | 
    
         
             
            you can use Erector cleanly in a non-Rails app.
         
     | 
| 
       50 
51 
     | 
    
         | 
| 
       51 
52 
     | 
    
         
             
            == INSTALL
         
     | 
    
        data/Rakefile
    CHANGED
    
    | 
         @@ -7,6 +7,9 @@ rescue LoadError 
     | 
|
| 
       7 
7 
     | 
    
         
             
              warn "Couldn't find psych; continuing."
         
     | 
| 
       8 
8 
     | 
    
         
             
            end
         
     | 
| 
       9 
9 
     | 
    
         | 
| 
      
 10 
     | 
    
         
            +
            require "bundler"
         
     | 
| 
      
 11 
     | 
    
         
            +
            Bundler.setup
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
       10 
13 
     | 
    
         
             
            require 'rake'
         
     | 
| 
       11 
14 
     | 
    
         
             
            require 'rake/testtask'
         
     | 
| 
       12 
15 
     | 
    
         | 
| 
         @@ -31,6 +34,7 @@ begin 
     | 
|
| 
       31 
34 
     | 
    
         
             
                  "VERSION.yml",
         
     | 
| 
       32 
35 
     | 
    
         
             
                  "lib/**/*",
         
     | 
| 
       33 
36 
     | 
    
         
             
                  "bin/erector",
         
     | 
| 
      
 37 
     | 
    
         
            +
                  ".gemtest",
         
     | 
| 
       34 
38 
     | 
    
         
             
                ]
         
     | 
| 
       35 
39 
     | 
    
         
             
                gemspec.executables = ["erector"]
         
     | 
| 
       36 
40 
     | 
    
         
             
                specs = Dir.glob("spec/**/*") #.reject { |file| file =~ %r{spec/rails2/} }
         
     | 
| 
         @@ -50,6 +54,7 @@ begin 
     | 
|
| 
       50 
54 
     | 
    
         
             
              end
         
     | 
| 
       51 
55 
     | 
    
         | 
| 
       52 
56 
     | 
    
         
             
              Jeweler::RubyforgeTasks.new do |rubyforge|
         
     | 
| 
      
 57 
     | 
    
         
            +
                rubyforge.project = "erector"
         
     | 
| 
       53 
58 
     | 
    
         
             
                rubyforge.doc_task = "rdoc"
         
     | 
| 
       54 
59 
     | 
    
         
             
                rubyforge.remote_doc_path = "rdoc"
         
     | 
| 
       55 
60 
     | 
    
         
             
              end
         
     | 
| 
         @@ -69,7 +74,9 @@ end 
     | 
|
| 
       69 
74 
     | 
    
         | 
| 
       70 
75 
     | 
    
         
             
            desc "Build the web site from the .rb files in web/"
         
     | 
| 
       71 
76 
     | 
    
         
             
            task :web do
         
     | 
| 
       72 
     | 
    
         
            -
              files = Dir["web/*.rb"] 
     | 
| 
      
 77 
     | 
    
         
            +
              files = Dir["web/*.rb"].select do |filename|
         
     | 
| 
      
 78 
     | 
    
         
            +
                File.read(filename) =~ (/\< Page/)
         
     | 
| 
      
 79 
     | 
    
         
            +
              end
         
     | 
| 
       73 
80 
     | 
    
         
             
              require 'erector'
         
     | 
| 
       74 
81 
     | 
    
         
             
              require 'erector/erect/erect'
         
     | 
| 
       75 
82 
     | 
    
         
             
              $: << "."
         
     | 
| 
         @@ -85,11 +92,8 @@ task :clean_rdoc do 
     | 
|
| 
       85 
92 
     | 
    
         
             
              FileUtils.rm_rf("rdoc")
         
     | 
| 
       86 
93 
     | 
    
         
             
            end
         
     | 
| 
       87 
94 
     | 
    
         | 
| 
       88 
     | 
    
         
            -
             
     | 
| 
       89 
     | 
    
         
            -
            task : 
     | 
| 
       90 
     | 
    
         
            -
             
     | 
| 
       91 
     | 
    
         
            -
            desc "Publish web site to RubyForge"
         
     | 
| 
       92 
     | 
    
         
            -
            task :publish_web do
         
     | 
| 
      
 95 
     | 
    
         
            +
            desc "Publish web site and docs to RubyForge"
         
     | 
| 
      
 96 
     | 
    
         
            +
            task :publish => [:web, :docs] do
         
     | 
| 
       93 
97 
     | 
    
         
             
              config = YAML.load(File.read(File.expand_path("~/.rubyforge/user-config.yml")))
         
     | 
| 
       94 
98 
     | 
    
         
             
              host = "#{config["username"]}@rubyforge.org"
         
     | 
| 
       95 
99 
     | 
    
         
             
              rubyforge_name = "erector"
         
     | 
| 
         @@ -98,19 +102,27 @@ task :publish_web do 
     | 
|
| 
       98 
102 
     | 
    
         
             
              rdoc_dir = "rdoc"
         
     | 
| 
       99 
103 
     | 
    
         
             
              rsync_args = '--archive --verbose --delete'
         
     | 
| 
       100 
104 
     | 
    
         | 
| 
      
 105 
     | 
    
         
            +
              puts "== Publishing web site to RubyForge"
         
     | 
| 
       101 
106 
     | 
    
         
             
              sh %{rsync #{rsync_args} --exclude=#{rdoc_dir} #{local_dir}/ #{host}:#{remote_dir}}
         
     | 
| 
      
 107 
     | 
    
         
            +
             
     | 
| 
      
 108 
     | 
    
         
            +
              puts "== Publishing rdoc to RubyForge"
         
     | 
| 
      
 109 
     | 
    
         
            +
              sh %{rsync #{rsync_args} #{rdoc_dir}/ #{host}:#{remote_dir}/rdoc}
         
     | 
| 
       102 
110 
     | 
    
         
             
            end
         
     | 
| 
       103 
111 
     | 
    
         | 
| 
      
 112 
     | 
    
         
            +
             
     | 
| 
      
 113 
     | 
    
         
            +
            begin
         
     | 
| 
       104 
114 
     | 
    
         
             
            require 'rdoc/task'
         
     | 
| 
       105 
     | 
    
         
            -
            RDoc::Task.new(:rdoc) do |rdoc|
         
     | 
| 
       106 
     | 
    
         
            -
             
     | 
| 
       107 
     | 
    
         
            -
             
     | 
| 
       108 
     | 
    
         
            -
             
     | 
| 
       109 
     | 
    
         
            -
             
     | 
| 
       110 
     | 
    
         
            -
             
     | 
| 
       111 
     | 
    
         
            -
             
     | 
| 
       112 
     | 
    
         
            -
             
     | 
| 
       113 
     | 
    
         
            -
               
     | 
| 
      
 115 
     | 
    
         
            +
              RDoc::Task.new(:rdoc) do |rdoc|
         
     | 
| 
      
 116 
     | 
    
         
            +
                rdoc.rdoc_dir = 'rdoc'
         
     | 
| 
      
 117 
     | 
    
         
            +
                rdoc.title    = "Erector #{Erector::VERSION}"
         
     | 
| 
      
 118 
     | 
    
         
            +
                rdoc.options <<
         
     | 
| 
      
 119 
     | 
    
         
            +
                  "--main=README.txt"
         
     | 
| 
      
 120 
     | 
    
         
            +
                rdoc.rdoc_files.include('README.txt')
         
     | 
| 
      
 121 
     | 
    
         
            +
                rdoc.rdoc_files.include('lib/**/*.rb')
         
     | 
| 
      
 122 
     | 
    
         
            +
                rdoc.rdoc_files.include('bin/**/*')
         
     | 
| 
      
 123 
     | 
    
         
            +
              end
         
     | 
| 
      
 124 
     | 
    
         
            +
            rescue LoadError => e
         
     | 
| 
      
 125 
     | 
    
         
            +
              puts "#{e.class}: #{e.message}"
         
     | 
| 
       114 
126 
     | 
    
         
             
            end
         
     | 
| 
       115 
127 
     | 
    
         | 
| 
       116 
128 
     | 
    
         
             
            desc "Regenerate unicode.rb from UnicodeData.txt from unicode.org.  Only needs to be run when there is a new version of the Unicode specification"
         
     | 
| 
         @@ -146,6 +158,7 @@ namespace :spec do 
     | 
|
| 
       146 
158 
     | 
    
         
             
                spec.pattern = 'spec/erect/*_spec.rb'
         
     | 
| 
       147 
159 
     | 
    
         
             
              end
         
     | 
| 
       148 
160 
     | 
    
         | 
| 
      
 161 
     | 
    
         
            +
             
     | 
| 
       149 
162 
     | 
    
         
             
              desc "Run specs for erector's Rails integration."
         
     | 
| 
       150 
163 
     | 
    
         
             
              RSpec::Core::RakeTask.new(:rails) do |spec|
         
     | 
| 
       151 
164 
     | 
    
         
             
                spec.pattern = 'spec/rails_root/spec/*_spec.rb'
         
     | 
| 
         @@ -153,9 +166,11 @@ namespace :spec do 
     | 
|
| 
       153 
166 
     | 
    
         | 
| 
       154 
167 
     | 
    
         
             
              desc "Run specs for erector's Rails integration under Rails 2."
         
     | 
| 
       155 
168 
     | 
    
         
             
              task :rails2 do
         
     | 
| 
       156 
     | 
    
         
            -
                 
     | 
| 
      
 169 
     | 
    
         
            +
                rails_app = "#{here}/spec/rails2/rails_app"
         
     | 
| 
      
 170 
     | 
    
         
            +
                gemfile = "#{rails_app}/Gemfile"
         
     | 
| 
      
 171 
     | 
    
         
            +
                Dir.chdir(rails_app) do
         
     | 
| 
       157 
172 
     | 
    
         
             
                  # Bundler.with_clean_env do
         
     | 
| 
       158 
     | 
    
         
            -
                    sh "BUNDLE_GEMFILE=' 
     | 
| 
      
 173 
     | 
    
         
            +
                    sh "BUNDLE_GEMFILE='#{gemfile}' bundle exec rake rails2"
         
     | 
| 
       159 
174 
     | 
    
         
             
                  # end
         
     | 
| 
       160 
175 
     | 
    
         
             
                end
         
     | 
| 
       161 
176 
     | 
    
         
             
              end
         
     | 
| 
         @@ -165,7 +180,13 @@ namespace :spec do 
     | 
|
| 
       165 
180 
     | 
    
         
             
                gemfile = "#{here}/Gemfile-rails31"
         
     | 
| 
       166 
181 
     | 
    
         
             
                sh "BUNDLE_GEMFILE='#{gemfile}' bundle exec rake spec:core spec:erect spec:rails"
         
     | 
| 
       167 
182 
     | 
    
         
             
              end
         
     | 
| 
      
 183 
     | 
    
         
            +
             
     | 
| 
      
 184 
     | 
    
         
            +
              desc "Run specs for the Erector web site."
         
     | 
| 
      
 185 
     | 
    
         
            +
              RSpec::Core::RakeTask.new(:web) do |spec|
         
     | 
| 
      
 186 
     | 
    
         
            +
                spec.pattern = 'spec/web/*_spec.rb'
         
     | 
| 
      
 187 
     | 
    
         
            +
              end
         
     | 
| 
      
 188 
     | 
    
         
            +
             
     | 
| 
       168 
189 
     | 
    
         
             
            end
         
     | 
| 
       169 
190 
     | 
    
         | 
| 
       170 
191 
     | 
    
         
             
            desc "Run most specs"
         
     | 
| 
       171 
     | 
    
         
            -
            task :spec => ['spec:core', 'spec:erect', 'spec:rails', 'spec:rails2']
         
     | 
| 
      
 192 
     | 
    
         
            +
            task :spec => ['spec:core', 'spec:erect', 'spec:rails', 'spec:rails2', 'spec:web']
         
     | 
    
        data/VERSION.yml
    CHANGED
    
    
    
        data/bin/erector
    CHANGED
    
    
| 
         @@ -85,12 +85,12 @@ module Erector 
     | 
|
| 
       85 
85 
     | 
    
         
             
                # content_method_name:: in case you want to call a method other than
         
     | 
| 
       86 
86 
     | 
    
         
             
                #                       #content, pass its name in here.
         
     | 
| 
       87 
87 
     | 
    
         
             
                #
         
     | 
| 
       88 
     | 
    
         
            -
                def  
     | 
| 
       89 
     | 
    
         
            -
                   
     | 
| 
      
 88 
     | 
    
         
            +
                def emit(options = {})
         
     | 
| 
      
 89 
     | 
    
         
            +
                  _emit(options).to_s
         
     | 
| 
       90 
90 
     | 
    
         
             
                end
         
     | 
| 
       91 
91 
     | 
    
         | 
| 
       92 
     | 
    
         
            -
                # alias for # 
     | 
| 
       93 
     | 
    
         
            -
                # @deprecated Please use {# 
     | 
| 
      
 92 
     | 
    
         
            +
                # alias for #emit
         
     | 
| 
      
 93 
     | 
    
         
            +
                # @deprecated Please use {#emit} instead
         
     | 
| 
       94 
94 
     | 
    
         
             
                def to_s(*args)
         
     | 
| 
       95 
95 
     | 
    
         
             
                  unless defined? @@already_warned_to_s
         
     | 
| 
       96 
96 
     | 
    
         
             
                    $stderr.puts "Erector::Widget#to_s is deprecated. Please use #to_html instead. Called from #{caller.first}"
         
     | 
| 
         @@ -103,9 +103,9 @@ module Erector 
     | 
|
| 
       103 
103 
     | 
    
         
             
                # #render / #to_html only it returns an array, for theoretical performance
         
     | 
| 
       104 
104 
     | 
    
         
             
                # improvements when using a Rack server (like Sinatra or Rails Metal).
         
     | 
| 
       105 
105 
     | 
    
         
             
                #
         
     | 
| 
       106 
     | 
    
         
            -
                # # Options: see # 
     | 
| 
      
 106 
     | 
    
         
            +
                # # Options: see #emit
         
     | 
| 
       107 
107 
     | 
    
         
             
                def to_a(options = {})
         
     | 
| 
       108 
     | 
    
         
            -
                   
     | 
| 
      
 108 
     | 
    
         
            +
                  _emit(options).to_a
         
     | 
| 
       109 
109 
     | 
    
         
             
                end
         
     | 
| 
       110 
110 
     | 
    
         | 
| 
       111 
111 
     | 
    
         
             
                # Template method which must be overridden by all widget subclasses.
         
     | 
| 
         @@ -142,7 +142,7 @@ module Erector 
     | 
|
| 
       142 
142 
     | 
    
         
             
                # the second argument is a hash used to populate its instance variables.
         
     | 
| 
       143 
143 
     | 
    
         
             
                # If the first argument is an instance then the hash must be unspecified
         
     | 
| 
       144 
144 
     | 
    
         
             
                # (or empty). If a block is passed to this method, then it gets set as the
         
     | 
| 
       145 
     | 
    
         
            -
                #  
     | 
| 
      
 145 
     | 
    
         
            +
                # emited widget's block, and will be executed when that widget calls
         
     | 
| 
       146 
146 
     | 
    
         
             
                # +call_block+ or calls +super+ from inside its +content+ method.
         
     | 
| 
       147 
147 
     | 
    
         
             
                #
         
     | 
| 
       148 
148 
     | 
    
         
             
                # This is the preferred way to call one widget from inside another. This
         
     | 
| 
         @@ -150,12 +150,12 @@ module Erector 
     | 
|
| 
       150 
150 
     | 
    
         
             
                # performance than using +capture+ or +to_html+.
         
     | 
| 
       151 
151 
     | 
    
         
             
                def widget(target, assigns = {}, options = {}, &block)
         
     | 
| 
       152 
152 
     | 
    
         
             
                  if target.is_a? Class
         
     | 
| 
       153 
     | 
    
         
            -
                    target.new(assigns, &block). 
     | 
| 
      
 153 
     | 
    
         
            +
                    target.new(assigns, &block)._emit_via(self, options)
         
     | 
| 
       154 
154 
     | 
    
         
             
                  else
         
     | 
| 
       155 
155 
     | 
    
         
             
                    unless assigns.empty?
         
     | 
| 
       156 
156 
     | 
    
         
             
                      raise "Unexpected second parameter. Did you mean to pass in assigns when you instantiated the #{target.class.to_s}?"
         
     | 
| 
       157 
157 
     | 
    
         
             
                    end
         
     | 
| 
       158 
     | 
    
         
            -
                    target. 
     | 
| 
      
 158 
     | 
    
         
            +
                    target._emit_via(self, options, &block)
         
     | 
| 
       159 
159 
     | 
    
         
             
                  end
         
     | 
| 
       160 
160 
     | 
    
         
             
                end
         
     | 
| 
       161 
161 
     | 
    
         | 
| 
         @@ -163,7 +163,7 @@ module Erector 
     | 
|
| 
       163 
163 
     | 
    
         
             
                # output string to a string and returns it as raw text. If at all possible
         
     | 
| 
       164 
164 
     | 
    
         
             
                # you should avoid this method since it hurts performance, and use
         
     | 
| 
       165 
165 
     | 
    
         
             
                # +widget+ instead.
         
     | 
| 
       166 
     | 
    
         
            -
                def  
     | 
| 
      
 166 
     | 
    
         
            +
                def capture_content
         
     | 
| 
       167 
167 
     | 
    
         
             
                  original, @_output = output, Output.new
         
     | 
| 
       168 
168 
     | 
    
         
             
                  yield
         
     | 
| 
       169 
169 
     | 
    
         
             
                  original.widgets.concat(output.widgets) # todo: test!!!
         
     | 
| 
         @@ -171,11 +171,12 @@ module Erector 
     | 
|
| 
       171 
171 
     | 
    
         
             
                ensure
         
     | 
| 
       172 
172 
     | 
    
         
             
                  @_output = original
         
     | 
| 
       173 
173 
     | 
    
         
             
                end
         
     | 
| 
      
 174 
     | 
    
         
            +
                alias_method :capture, :capture_content
         
     | 
| 
       174 
175 
     | 
    
         | 
| 
       175 
176 
     | 
    
         
             
                protected
         
     | 
| 
       176 
177 
     | 
    
         
             
                # executes this widget's #content method, which emits stuff onto the
         
     | 
| 
       177 
178 
     | 
    
         
             
                # output stream
         
     | 
| 
       178 
     | 
    
         
            -
                def  
     | 
| 
      
 179 
     | 
    
         
            +
                def _emit(options = {}, &block)
         
     | 
| 
       179 
180 
     | 
    
         
             
                  @_block   = block if block
         
     | 
| 
       180 
181 
     | 
    
         
             
                  @_parent  = options[:parent]  || parent
         
     | 
| 
       181 
182 
     | 
    
         
             
                  @_helpers = options[:helpers] || parent
         
     | 
| 
         @@ -195,9 +196,9 @@ module Erector 
     | 
|
| 
       195 
196 
     | 
    
         
             
                  output
         
     | 
| 
       196 
197 
     | 
    
         
             
                end
         
     | 
| 
       197 
198 
     | 
    
         | 
| 
       198 
     | 
    
         
            -
                # same as  
     | 
| 
       199 
     | 
    
         
            -
                def  
     | 
| 
       200 
     | 
    
         
            -
                   
     | 
| 
      
 199 
     | 
    
         
            +
                # same as _emit, but using a parent widget's output stream and helpers
         
     | 
| 
      
 200 
     | 
    
         
            +
                def _emit_via(parent, options = {}, &block)
         
     | 
| 
      
 201 
     | 
    
         
            +
                  _emit(options.merge(:parent  => parent,
         
     | 
| 
       201 
202 
     | 
    
         
             
                                        :output  => parent.output,
         
     | 
| 
       202 
203 
     | 
    
         
             
                                        :helpers => parent.helpers), &block)
         
     | 
| 
       203 
204 
     | 
    
         
             
                end
         
     | 
    
        data/lib/erector/caching.rb
    CHANGED
    
    | 
         @@ -74,7 +74,7 @@ module Erector 
     | 
|
| 
       74 
74 
     | 
    
         
             
                end
         
     | 
| 
       75 
75 
     | 
    
         | 
| 
       76 
76 
     | 
    
         
             
            protected
         
     | 
| 
       77 
     | 
    
         
            -
                def  
     | 
| 
      
 77 
     | 
    
         
            +
                def _emit(options = {})
         
     | 
| 
       78 
78 
     | 
    
         
             
                  if should_cache?
         
     | 
| 
       79 
79 
     | 
    
         
             
                    cache[self.class, assigns, options[:content_method_name]] ||= super
         
     | 
| 
       80 
80 
     | 
    
         
             
                  else
         
     | 
| 
         @@ -82,7 +82,7 @@ protected 
     | 
|
| 
       82 
82 
     | 
    
         
             
                  end
         
     | 
| 
       83 
83 
     | 
    
         
             
                end
         
     | 
| 
       84 
84 
     | 
    
         | 
| 
       85 
     | 
    
         
            -
                def  
     | 
| 
      
 85 
     | 
    
         
            +
                def _emit_via(parent, options = {})
         
     | 
| 
       86 
86 
     | 
    
         
             
                  if should_cache?
         
     | 
| 
       87 
87 
     | 
    
         
             
                    parent.output << cache[self.class, assigns, options[:content_method_name]] ||= parent.capture { super }
         
     | 
| 
       88 
88 
     | 
    
         
             
                    parent.output.widgets << self.class # todo: test!!!
         
     | 
    
        data/lib/erector/convenience.rb
    CHANGED
    
    | 
         @@ -4,7 +4,7 @@ module Erector 
     | 
|
| 
       4 
4 
     | 
    
         
             
                # You may just want to call to_html(:prettyprint => true)
         
     | 
| 
       5 
5 
     | 
    
         
             
                # so you can pass in other rendering options as well.
         
     | 
| 
       6 
6 
     | 
    
         
             
                def to_pretty(options = {})
         
     | 
| 
       7 
     | 
    
         
            -
                   
     | 
| 
      
 7 
     | 
    
         
            +
                  emit(options.merge(:prettyprint => true))
         
     | 
| 
       8 
8 
     | 
    
         
             
                end
         
     | 
| 
       9 
9 
     | 
    
         | 
| 
       10 
10 
     | 
    
         
             
                # Render (like to_html) but stripping all tags and inserting some
         
     | 
| 
         @@ -57,6 +57,38 @@ module Erector 
     | 
|
| 
       57 
57 
     | 
    
         
             
                  a href, ({:href => href}.merge(options))
         
     | 
| 
       58 
58 
     | 
    
         
             
                end
         
     | 
| 
       59 
59 
     | 
    
         | 
| 
      
 60 
     | 
    
         
            +
                # Emits a javascript block inside a +script+ tag, wrapped in CDATA
         
     | 
| 
      
 61 
     | 
    
         
            +
                # doohickeys like all the cool JS kids do.
         
     | 
| 
      
 62 
     | 
    
         
            +
                def javascript(value = nil, attributes = {})
         
     | 
| 
      
 63 
     | 
    
         
            +
                  if value.is_a?(Hash)
         
     | 
| 
      
 64 
     | 
    
         
            +
                    attributes = value
         
     | 
| 
      
 65 
     | 
    
         
            +
                    value      = nil
         
     | 
| 
      
 66 
     | 
    
         
            +
                  elsif block_given? && value
         
     | 
| 
      
 67 
     | 
    
         
            +
                    raise ArgumentError, "You can't pass both a block and a value to javascript -- please choose one."
         
     | 
| 
      
 68 
     | 
    
         
            +
                  end
         
     | 
| 
      
 69 
     | 
    
         
            +
             
     | 
| 
      
 70 
     | 
    
         
            +
                  script(attributes.merge(:type => "text/javascript")) do
         
     | 
| 
      
 71 
     | 
    
         
            +
                    # Shouldn't this be a "cdata" HtmlPart?
         
     | 
| 
      
 72 
     | 
    
         
            +
                    # (maybe, but the syntax is specific to javascript; it isn't
         
     | 
| 
      
 73 
     | 
    
         
            +
                    # really a generic XML CDATA section.  Specifically,
         
     | 
| 
      
 74 
     | 
    
         
            +
                    # ]]> within value is not treated as ending the
         
     | 
| 
      
 75 
     | 
    
         
            +
                    # CDATA section by Firefox2 when parsing text/html,
         
     | 
| 
      
 76 
     | 
    
         
            +
                    # although I guess we could refuse to generate ]]>
         
     | 
| 
      
 77 
     | 
    
         
            +
                    # there, for the benefit of XML/XHTML parsers).
         
     | 
| 
      
 78 
     | 
    
         
            +
                    output << raw("\n// <![CDATA[\n")
         
     | 
| 
      
 79 
     | 
    
         
            +
                    if block_given?
         
     | 
| 
      
 80 
     | 
    
         
            +
                      yield
         
     | 
| 
      
 81 
     | 
    
         
            +
                    else
         
     | 
| 
      
 82 
     | 
    
         
            +
                      output << raw(value)
         
     | 
| 
      
 83 
     | 
    
         
            +
                    end
         
     | 
| 
      
 84 
     | 
    
         
            +
                    output << raw("\n// ]]>")
         
     | 
| 
      
 85 
     | 
    
         
            +
                    output.append_newline # this forces a newline even if we're not in pretty mode
         
     | 
| 
      
 86 
     | 
    
         
            +
                  end
         
     | 
| 
      
 87 
     | 
    
         
            +
             
     | 
| 
      
 88 
     | 
    
         
            +
                  output << raw("\n")
         
     | 
| 
      
 89 
     | 
    
         
            +
                end
         
     | 
| 
      
 90 
     | 
    
         
            +
             
     | 
| 
      
 91 
     | 
    
         
            +
             
     | 
| 
       60 
92 
     | 
    
         
             
                # makes a unique id based on the widget's class name and object id
         
     | 
| 
       61 
93 
     | 
    
         
             
                # that you can use as the HTML id of an emitted element
         
     | 
| 
       62 
94 
     | 
    
         
             
                def dom_id
         
     | 
    
        data/lib/erector/erect/erect.rb
    CHANGED
    
    | 
         @@ -1,5 +1,6 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            require "optparse"
         
     | 
| 
       2 
2 
     | 
    
         
             
            require "erector/erect/erected"  # pull this out so we don't recreate the grammar every time
         
     | 
| 
      
 3 
     | 
    
         
            +
            require "fileutils"
         
     | 
| 
       3 
4 
     | 
    
         | 
| 
       4 
5 
     | 
    
         
             
            module Erector
         
     | 
| 
       5 
6 
     | 
    
         | 
| 
         @@ -129,7 +130,7 @@ module Erector 
     | 
|
| 
       129 
130 
     | 
    
         
             
                        widget = widget_class.new
         
     | 
| 
       130 
131 
     | 
    
         
             
                        #todo: skip if it's missing a no-arg constructor
         
     | 
| 
       131 
132 
     | 
    
         
             
                        dir = output_dir || File.dirname(file)
         
     | 
| 
       132 
     | 
    
         
            -
                        FileUtils.mkdir_p(dir)
         
     | 
| 
      
 133 
     | 
    
         
            +
                        ::FileUtils.mkdir_p(dir)
         
     | 
| 
       133 
134 
     | 
    
         
             
                        output_file = "#{dir}/#{filename}.html"
         
     | 
| 
       134 
135 
     | 
    
         
             
                        File.open(output_file, "w") do |f|
         
     | 
| 
       135 
136 
     | 
    
         
             
                          f.puts widget.to_html
         
     | 
    
        data/lib/erector/externals.rb
    CHANGED
    
    | 
         @@ -2,8 +2,8 @@ module Erector 
     | 
|
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
              # Externals are a mechanism by which a widget can declare page-level
         
     | 
| 
       4 
4 
     | 
    
         
             
              # resources upon which it depends. They are not emitted during the widget's
         
     | 
| 
       5 
     | 
    
         
            -
              # normal  
     | 
| 
       6 
     | 
    
         
            -
              # all the widgets it  
     | 
| 
      
 5 
     | 
    
         
            +
              # normal emiting process. Rather, the Erector::Widget::Page keeps track of
         
     | 
| 
      
 6 
     | 
    
         
            +
              # all the widgets it emits, then goes back and inserts the proper tags for
         
     | 
| 
       7 
7 
     | 
    
         
             
              # all the externals inside its HEAD element.
         
     | 
| 
       8 
8 
     | 
    
         
             
              module Externals
         
     | 
| 
       9 
9 
     | 
    
         
             
                def self.included(base)
         
     | 
| 
         @@ -83,21 +83,21 @@ module Erector 
     | 
|
| 
       83 
83 
     | 
    
         
             
                  end
         
     | 
| 
       84 
84 
     | 
    
         
             
                end
         
     | 
| 
       85 
85 
     | 
    
         | 
| 
       86 
     | 
    
         
            -
                def render_with_externals( 
     | 
| 
      
 86 
     | 
    
         
            +
                def render_with_externals(options_to_external_emiter = {})
         
     | 
| 
       87 
87 
     | 
    
         
             
                  output = Erector::Output.new
         
     | 
| 
       88 
     | 
    
         
            -
                  self.to_a(:output => output) #  
     | 
| 
      
 88 
     | 
    
         
            +
                  self.to_a(:output => output) # emit all the externals onto this new output buffer
         
     | 
| 
       89 
89 
     | 
    
         
             
                  nested_widgets = output.widgets.to_a
         
     | 
| 
       90 
     | 
    
         
            -
                   
     | 
| 
       91 
     | 
    
         
            -
                   
     | 
| 
       92 
     | 
    
         
            -
                  externals =  
     | 
| 
      
 90 
     | 
    
         
            +
                  options_to_external_emiter = {:classes => nested_widgets}.merge(options_to_external_emiter)
         
     | 
| 
      
 91 
     | 
    
         
            +
                  emiter = ExternalRenderer.new(options_to_external_emiter)
         
     | 
| 
      
 92 
     | 
    
         
            +
                  externals = emiter.to_a(:output => output)
         
     | 
| 
       93 
93 
     | 
    
         
             
                  output.to_a
         
     | 
| 
       94 
94 
     | 
    
         
             
                end
         
     | 
| 
       95 
95 
     | 
    
         | 
| 
       96 
     | 
    
         
            -
                def render_externals( 
     | 
| 
      
 96 
     | 
    
         
            +
                def render_externals(options_to_external_emiter = {})
         
     | 
| 
       97 
97 
     | 
    
         
             
                  output_for_externals = Erector::Output.new
         
     | 
| 
       98 
98 
     | 
    
         
             
                  nested_widgets = output.widgets
         
     | 
| 
       99 
     | 
    
         
            -
                  externalizer = ExternalRenderer.new({:classes => nested_widgets}.merge( 
     | 
| 
       100 
     | 
    
         
            -
                  externalizer. 
     | 
| 
      
 99 
     | 
    
         
            +
                  externalizer = ExternalRenderer.new({:classes => nested_widgets}.merge(options_to_external_emiter))
         
     | 
| 
      
 100 
     | 
    
         
            +
                  externalizer._emit(:output => output_for_externals)
         
     | 
| 
       101 
101 
     | 
    
         
             
                  output_for_externals.to_a
         
     | 
| 
       102 
102 
     | 
    
         
             
                end
         
     | 
| 
       103 
103 
     | 
    
         
             
              end
         
     | 
    
        data/lib/erector/html_widget.rb
    CHANGED
    
    | 
         @@ -61,7 +61,7 @@ module Erector 
     | 
|
| 
       61 
61 
     | 
    
         
             
                include Erector::HTML
         
     | 
| 
       62 
62 
     | 
    
         
             
                include Erector::Convenience
         
     | 
| 
       63 
63 
     | 
    
         
             
                include Erector::JQuery
         
     | 
| 
       64 
     | 
    
         
            -
                include Erector::Sass 
     | 
| 
      
 64 
     | 
    
         
            +
                include Erector::Sass
         
     | 
| 
       65 
65 
     | 
    
         | 
| 
       66 
66 
     | 
    
         
             
                tag 'area', :self_closing
         
     | 
| 
       67 
67 
     | 
    
         
             
                tag 'base', :self_closing
         
     | 
| 
         @@ -194,39 +194,6 @@ module Erector 
     | 
|
| 
       194 
194 
     | 
    
         
             
                tag 'video'
         
     | 
| 
       195 
195 
     | 
    
         | 
| 
       196 
196 
     | 
    
         | 
| 
       197 
     | 
    
         
            -
                # Emits a javascript block inside a +script+ tag, wrapped in CDATA
         
     | 
| 
       198 
     | 
    
         
            -
                # doohickeys like all the cool JS kids do.
         
     | 
| 
       199 
     | 
    
         
            -
                def javascript(value = nil, attributes = {})
         
     | 
| 
       200 
     | 
    
         
            -
                  if value.is_a?(Hash)
         
     | 
| 
       201 
     | 
    
         
            -
                    attributes = value
         
     | 
| 
       202 
     | 
    
         
            -
                    value      = nil
         
     | 
| 
       203 
     | 
    
         
            -
                  elsif block_given? && value
         
     | 
| 
       204 
     | 
    
         
            -
                    raise ArgumentError, "You can't pass both a block and a value to javascript -- please choose one."
         
     | 
| 
       205 
     | 
    
         
            -
                  end
         
     | 
| 
       206 
     | 
    
         
            -
             
     | 
| 
       207 
     | 
    
         
            -
                  script(attributes.merge(:type => "text/javascript")) do
         
     | 
| 
       208 
     | 
    
         
            -
                    # Shouldn't this be a "cdata" HtmlPart?
         
     | 
| 
       209 
     | 
    
         
            -
                    # (maybe, but the syntax is specific to javascript; it isn't
         
     | 
| 
       210 
     | 
    
         
            -
                    # really a generic XML CDATA section.  Specifically,
         
     | 
| 
       211 
     | 
    
         
            -
                    # ]]> within value is not treated as ending the
         
     | 
| 
       212 
     | 
    
         
            -
                    # CDATA section by Firefox2 when parsing text/html,
         
     | 
| 
       213 
     | 
    
         
            -
                    # although I guess we could refuse to generate ]]>
         
     | 
| 
       214 
     | 
    
         
            -
                    # there, for the benefit of XML/XHTML parsers).
         
     | 
| 
       215 
     | 
    
         
            -
                    output << raw("\n// <![CDATA[\n")
         
     | 
| 
       216 
     | 
    
         
            -
                    if block_given?
         
     | 
| 
       217 
     | 
    
         
            -
                      yield
         
     | 
| 
       218 
     | 
    
         
            -
                    else
         
     | 
| 
       219 
     | 
    
         
            -
                      output << raw(value)
         
     | 
| 
       220 
     | 
    
         
            -
                    end
         
     | 
| 
       221 
     | 
    
         
            -
                    output << raw("\n// ]]>")
         
     | 
| 
       222 
     | 
    
         
            -
                    output.append_newline # this forces a newline even if we're not in pretty mode
         
     | 
| 
       223 
     | 
    
         
            -
                  end
         
     | 
| 
       224 
     | 
    
         
            -
             
     | 
| 
       225 
     | 
    
         
            -
                  output << raw("\n")
         
     | 
| 
       226 
     | 
    
         
            -
                end
         
     | 
| 
       227 
     | 
    
         
            -
             
     | 
| 
       228 
     | 
    
         
            -
             
     | 
| 
       229 
     | 
    
         
            -
             
     | 
| 
       230 
197 
     | 
    
         
             
                # alias for AbstractWidget#render
         
     | 
| 
       231 
198 
     | 
    
         
             
                def to_html(options = {})
         
     | 
| 
       232 
199 
     | 
    
         
             
                  raise "Erector::Widget#to_html takes an options hash, not a symbol. Try calling \"to_html(:content_method_name=> :#{options})\"" if options.is_a? Symbol
         
     | 
| 
         @@ -243,53 +210,6 @@ module Erector 
     | 
|
| 
       243 
210 
     | 
    
         
             
                  to_html(*args)
         
     | 
| 
       244 
211 
     | 
    
         
             
                end
         
     | 
| 
       245 
212 
     | 
    
         | 
| 
       246 
     | 
    
         
            -
             
     | 
| 
       247 
     | 
    
         
            -
                # Emits an XML instruction, which looks like this: <?xml version=\"1.0\" encoding=\"UTF-8\"?>
         
     | 
| 
       248 
     | 
    
         
            -
                def instruct(attributes={:version => "1.0", :encoding => "UTF-8"})
         
     | 
| 
       249 
     | 
    
         
            -
                  output << raw("<?xml#{format_sorted(sort_for_xml_declaration(attributes))}?>")
         
     | 
| 
       250 
     | 
    
         
            -
                end
         
     | 
| 
       251 
     | 
    
         
            -
             
     | 
| 
       252 
     | 
    
         
            -
                # Emits an XML/HTML comment (<!-- ... -->) surrounding +text+ and/or
         
     | 
| 
       253 
     | 
    
         
            -
                # the output of +block+. see
         
     | 
| 
       254 
     | 
    
         
            -
                # http://www.w3.org/TR/html4/intro/sgmltut.html#h-3.2.4
         
     | 
| 
       255 
     | 
    
         
            -
                #
         
     | 
| 
       256 
     | 
    
         
            -
                # If +text+ is an Internet Explorer conditional comment condition such as
         
     | 
| 
       257 
     | 
    
         
            -
                # "[if IE]", the output includes the opening condition and closing
         
     | 
| 
       258 
     | 
    
         
            -
                # "[endif]". See http://www.quirksmode.org/css/condcom.html
         
     | 
| 
       259 
     | 
    
         
            -
                #
         
     | 
| 
       260 
     | 
    
         
            -
                # Since "Authors should avoid putting two or more adjacent hyphens inside
         
     | 
| 
       261 
     | 
    
         
            -
                # comments," we emit a warning if you do that.
         
     | 
| 
       262 
     | 
    
         
            -
                def comment(text = '')
         
     | 
| 
       263 
     | 
    
         
            -
                  puts "Warning: Authors should avoid putting two or more adjacent hyphens inside comments." if text =~ /--/
         
     | 
| 
       264 
     | 
    
         
            -
             
     | 
| 
       265 
     | 
    
         
            -
                  conditional = text =~ /\[if .*\]/
         
     | 
| 
       266 
     | 
    
         
            -
             
     | 
| 
       267 
     | 
    
         
            -
                  rawtext "<!--"
         
     | 
| 
       268 
     | 
    
         
            -
                  rawtext text
         
     | 
| 
       269 
     | 
    
         
            -
                  rawtext ">" if conditional
         
     | 
| 
       270 
     | 
    
         
            -
             
     | 
| 
       271 
     | 
    
         
            -
                  if block_given?
         
     | 
| 
       272 
     | 
    
         
            -
                    rawtext "\n"
         
     | 
| 
       273 
     | 
    
         
            -
                    yield
         
     | 
| 
       274 
     | 
    
         
            -
                    rawtext "\n"
         
     | 
| 
       275 
     | 
    
         
            -
                  end
         
     | 
| 
       276 
     | 
    
         
            -
             
     | 
| 
       277 
     | 
    
         
            -
                  rawtext "<![endif]" if conditional
         
     | 
| 
       278 
     | 
    
         
            -
                  rawtext "-->\n"
         
     | 
| 
       279 
     | 
    
         
            -
                end
         
     | 
| 
       280 
     | 
    
         
            -
             
     | 
| 
       281 
     | 
    
         
            -
                protected
         
     | 
| 
       282 
     | 
    
         
            -
             
     | 
| 
       283 
     | 
    
         
            -
                def sort_for_xml_declaration(attributes)
         
     | 
| 
       284 
     | 
    
         
            -
                  # correct order is "version, encoding, standalone" (XML 1.0 section 2.8).
         
     | 
| 
       285 
     | 
    
         
            -
                  # But we only try to put version before encoding for now.
         
     | 
| 
       286 
     | 
    
         
            -
                  stringized = []
         
     | 
| 
       287 
     | 
    
         
            -
                  attributes.each do |key, value|
         
     | 
| 
       288 
     | 
    
         
            -
                    stringized << [key.to_s, value]
         
     | 
| 
       289 
     | 
    
         
            -
                  end
         
     | 
| 
       290 
     | 
    
         
            -
                  stringized.sort{|a, b| b <=> a}
         
     | 
| 
       291 
     | 
    
         
            -
                end
         
     | 
| 
       292 
     | 
    
         
            -
             
     | 
| 
       293 
213 
     | 
    
         
             
              end
         
     | 
| 
       294 
214 
     | 
    
         | 
| 
       295 
215 
     | 
    
         
             
              public
         
     |