Markaby 0.6.3
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/.gitignore +4 -0
- data/CHANGELOG.rdoc +43 -0
- data/Markaby.gemspec +100 -0
- data/README.rdoc +262 -0
- data/Rakefile +48 -0
- data/VERSION +1 -0
- data/garlic.rb +29 -0
- data/init.rb +6 -0
- data/lib/markaby/builder.rb +275 -0
- data/lib/markaby/builder_tags.rb +64 -0
- data/lib/markaby/cssproxy.rb +55 -0
- data/lib/markaby/kernel_method.rb +7 -0
- data/lib/markaby/rails/current.rb +41 -0
- data/lib/markaby/rails/deprecated.rb +122 -0
- data/lib/markaby/rails.rb +68 -0
- data/lib/markaby/tags.rb +193 -0
- data/lib/markaby/tilt.rb +21 -0
- data/lib/markaby.rb +30 -0
- data/spec/markaby/builder_spec.rb +40 -0
- data/spec/markaby/css_proxy_spec.rb +44 -0
- data/spec/markaby/fragment_spec.rb +7 -0
- data/spec/markaby/markaby_other_static.mab +1 -0
- data/spec/markaby/markaby_spec.rb +207 -0
- data/spec/markaby/rails/spec_helper.rb +20 -0
- data/spec/markaby/rails/views/markaby/_a_partial.mab +3 -0
- data/spec/markaby/rails/views/markaby/_partial_child_with_locals.mab +1 -0
- data/spec/markaby/rails/views/markaby/access_to_helpers.mab +1 -0
- data/spec/markaby/rails/views/markaby/broken.mab +7 -0
- data/spec/markaby/rails/views/markaby/correct_template_values.mab +5 -0
- data/spec/markaby/rails/views/markaby/no_values_passed.mab +3 -0
- data/spec/markaby/rails/views/markaby/partial_parent.mab +1 -0
- data/spec/markaby/rails/views/markaby/partial_parent_with_locals.mab +7 -0
- data/spec/markaby/rails/views/markaby/render_erb_without_explicit_render_call.erb +1 -0
- data/spec/markaby/rails/views/markaby/render_explicit_but_empty_markaby_layout.mab +0 -0
- data/spec/markaby/rails/views/markaby/render_mab_without_explicit_render_call.mab +3 -0
- data/spec/markaby/rails/views/markaby/render_with_ivar.mab +3 -0
- data/spec/markaby/rails/views/markaby/renders_erb.rhtml +1 -0
- data/spec/markaby/rails_spec.rb +190 -0
- data/spec/markaby/rails_version_spec.rb +37 -0
- data/spec/markaby/tilt/erb.erb +1 -0
- data/spec/markaby/tilt/locals.mab +1 -0
- data/spec/markaby/tilt/markaby.mab +1 -0
- data/spec/markaby/tilt/markaby_other_static.mab +1 -0
- data/spec/markaby/tilt/render_twice.mab +1 -0
- data/spec/markaby/tilt/scope.mab +1 -0
- data/spec/markaby/tilt/yielding.mab +2 -0
- data/spec/markaby/tilt_spec.rb +86 -0
- data/spec/markaby/xml_markup_spec.rb +9 -0
- data/spec/spec.opts +2 -0
- data/spec/spec_helper.rb +39 -0
- metadata +126 -0
    
        data/lib/markaby/tags.rb
    ADDED
    
    | @@ -0,0 +1,193 @@ | |
| 1 | 
            +
            module Markaby
         | 
| 2 | 
            +
              FORM_TAGS         = [ :form, :input, :select, :textarea ]
         | 
| 3 | 
            +
              SELF_CLOSING_TAGS = [ :base, :meta, :link, :hr, :br, :param, :img, :area, :input, :col, :frame ]
         | 
| 4 | 
            +
             | 
| 5 | 
            +
              # Common sets of attributes.
         | 
| 6 | 
            +
              AttrCore   = [:id, :class, :style, :title]
         | 
| 7 | 
            +
              AttrI18n   = [:lang, 'xml:lang'.intern, :dir]
         | 
| 8 | 
            +
              AttrEvents = [:onclick,
         | 
| 9 | 
            +
                            :ondblclick,
         | 
| 10 | 
            +
                            :onmousedown,
         | 
| 11 | 
            +
                            :onmouseup,
         | 
| 12 | 
            +
                            :onmouseover,
         | 
| 13 | 
            +
                            :onmousemove,
         | 
| 14 | 
            +
                            :onmouseout,
         | 
| 15 | 
            +
                            :onkeypress,
         | 
| 16 | 
            +
                            :onkeydown,
         | 
| 17 | 
            +
                            :onkeyup]
         | 
| 18 | 
            +
              AttrFocus  = [:accesskey, :tabindex, :onfocus, :onblur]
         | 
| 19 | 
            +
              AttrHAlign = [:align, :char, :charoff]
         | 
| 20 | 
            +
              AttrVAlign = [:valign]
         | 
| 21 | 
            +
              Attrs      = AttrCore + AttrI18n + AttrEvents
         | 
| 22 | 
            +
             | 
| 23 | 
            +
              # All the tags and attributes from XHTML 1.0 Strict
         | 
| 24 | 
            +
              class XHTMLStrict
         | 
| 25 | 
            +
                class << self
         | 
| 26 | 
            +
                  attr_accessor :tags, :tagset, :forms, :self_closing, :doctype
         | 
| 27 | 
            +
                end
         | 
| 28 | 
            +
                
         | 
| 29 | 
            +
                @doctype = ['-//W3C//DTD XHTML 1.0 Strict//EN', 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd']
         | 
| 30 | 
            +
                @tagset  = {
         | 
| 31 | 
            +
                  :html       => AttrI18n + [:id, :xmlns],
         | 
| 32 | 
            +
                  :head       => AttrI18n + [:id, :profile],
         | 
| 33 | 
            +
                  :title      => AttrI18n + [:id],
         | 
| 34 | 
            +
                  :base       => [:href, :id],
         | 
| 35 | 
            +
                  :meta       => AttrI18n + [:id, :http, :name, :content, :scheme, 'http-equiv'.intern],
         | 
| 36 | 
            +
                  :link       => Attrs    + [:charset, :href, :hreflang, :type, :rel, :rev, :media],
         | 
| 37 | 
            +
                  :style      => AttrI18n + [:id, :type, :media, :title, 'xml:space'.intern],
         | 
| 38 | 
            +
                  :script     => [:id, :charset, :type, :src, :defer, 'xml:space'.intern],
         | 
| 39 | 
            +
                  :noscript   => Attrs,
         | 
| 40 | 
            +
                  :body       => Attrs + [:onload, :onunload],
         | 
| 41 | 
            +
                  :div        => Attrs,
         | 
| 42 | 
            +
                  :p          => Attrs,
         | 
| 43 | 
            +
                  :ul         => Attrs,
         | 
| 44 | 
            +
                  :ol         => Attrs,
         | 
| 45 | 
            +
                  :li         => Attrs,
         | 
| 46 | 
            +
                  :dl         => Attrs,
         | 
| 47 | 
            +
                  :dt         => Attrs,
         | 
| 48 | 
            +
                  :dd         => Attrs,
         | 
| 49 | 
            +
                  :address    => Attrs,
         | 
| 50 | 
            +
                  :hr         => Attrs,
         | 
| 51 | 
            +
                  :pre        => Attrs + ['xml:space'.intern],
         | 
| 52 | 
            +
                  :blockquote => Attrs + [:cite],
         | 
| 53 | 
            +
                  :ins        => Attrs + [:cite, :datetime],
         | 
| 54 | 
            +
                  :del        => Attrs + [:cite, :datetime],
         | 
| 55 | 
            +
                  :a          => Attrs + AttrFocus + [:charset, :type, :name, :href, :hreflang, :rel, :rev, :shape, :coords],
         | 
| 56 | 
            +
                  :span       => Attrs,
         | 
| 57 | 
            +
                  :bdo        => AttrCore + AttrEvents + [:lang, 'xml:lang'.intern, :dir],
         | 
| 58 | 
            +
                  :br         => AttrCore,
         | 
| 59 | 
            +
                  :em         => Attrs,
         | 
| 60 | 
            +
                  :strong     => Attrs,
         | 
| 61 | 
            +
                  :dfn        => Attrs,
         | 
| 62 | 
            +
                  :code       => Attrs,
         | 
| 63 | 
            +
                  :samp       => Attrs,
         | 
| 64 | 
            +
                  :kbd        => Attrs,
         | 
| 65 | 
            +
                  :var        => Attrs,
         | 
| 66 | 
            +
                  :cite       => Attrs,
         | 
| 67 | 
            +
                  :abbr       => Attrs,
         | 
| 68 | 
            +
                  :acronym    => Attrs,
         | 
| 69 | 
            +
                  :q          => Attrs + [:cite],
         | 
| 70 | 
            +
                  :sub        => Attrs,
         | 
| 71 | 
            +
                  :sup        => Attrs,
         | 
| 72 | 
            +
                  :tt         => Attrs,
         | 
| 73 | 
            +
                  :i          => Attrs,
         | 
| 74 | 
            +
                  :b          => Attrs,
         | 
| 75 | 
            +
                  :big        => Attrs,
         | 
| 76 | 
            +
                  :small      => Attrs,
         | 
| 77 | 
            +
                  :object     => Attrs + [:declare, :classid, :codebase, :data, :type, :codetype, :archive, :standby, :height, :width, :usemap, :name, :tabindex],
         | 
| 78 | 
            +
                  :param      => [:id, :name, :value, :valuetype, :type],
         | 
| 79 | 
            +
                  :img        => Attrs + [:src, :alt, :longdesc, :height, :width, :usemap, :ismap],
         | 
| 80 | 
            +
                  :map        => AttrI18n + AttrEvents + [:id, :class, :style, :title, :name],
         | 
| 81 | 
            +
                  :area       => Attrs + AttrFocus + [:shape, :coords, :href, :nohref, :alt],
         | 
| 82 | 
            +
                  :form       => Attrs + [:action, :method, :enctype, :onsubmit, :onreset, :accept, :accept],
         | 
| 83 | 
            +
                  :label      => Attrs + [:for, :accesskey, :onfocus, :onblur],
         | 
| 84 | 
            +
                  :input      => Attrs + AttrFocus + [:type, :name, :value, :checked, :disabled, :readonly, :size, :maxlength, :src, :alt, :usemap, :onselect, :onchange, :accept],
         | 
| 85 | 
            +
                  :select     => Attrs + [:name, :size, :multiple, :disabled, :tabindex, :onfocus, :onblur, :onchange],
         | 
| 86 | 
            +
                  :optgroup   => Attrs + [:disabled, :label],
         | 
| 87 | 
            +
                  :option     => Attrs + [:selected, :disabled, :label, :value],
         | 
| 88 | 
            +
                  :textarea   => Attrs + AttrFocus + [:name, :rows, :cols, :disabled, :readonly, :onselect, :onchange],
         | 
| 89 | 
            +
                  :fieldset   => Attrs,
         | 
| 90 | 
            +
                  :legend     => Attrs + [:accesskey],
         | 
| 91 | 
            +
                  :button     => Attrs + AttrFocus + [:name, :value, :type, :disabled],
         | 
| 92 | 
            +
                  :table      => Attrs + [:summary, :width, :border, :frame, :rules, :cellspacing, :cellpadding],
         | 
| 93 | 
            +
                  :caption    => Attrs,
         | 
| 94 | 
            +
                  :colgroup   => Attrs + AttrHAlign + AttrVAlign + [:span, :width],
         | 
| 95 | 
            +
                  :col        => Attrs + AttrHAlign + AttrVAlign + [:span, :width],
         | 
| 96 | 
            +
                  :thead      => Attrs + AttrHAlign + AttrVAlign,
         | 
| 97 | 
            +
                  :tfoot      => Attrs + AttrHAlign + AttrVAlign,
         | 
| 98 | 
            +
                  :tbody      => Attrs + AttrHAlign + AttrVAlign,
         | 
| 99 | 
            +
                  :tr         => Attrs + AttrHAlign + AttrVAlign,
         | 
| 100 | 
            +
                  :th         => Attrs + AttrHAlign + AttrVAlign + [:abbr, :axis, :headers, :scope, :rowspan, :colspan],
         | 
| 101 | 
            +
                  :td         => Attrs + AttrHAlign + AttrVAlign + [:abbr, :axis, :headers, :scope, :rowspan, :colspan],
         | 
| 102 | 
            +
                  :h1         => Attrs,
         | 
| 103 | 
            +
                  :h2         => Attrs,
         | 
| 104 | 
            +
                  :h3         => Attrs,
         | 
| 105 | 
            +
                  :h4         => Attrs,
         | 
| 106 | 
            +
                  :h5         => Attrs,
         | 
| 107 | 
            +
                  :h6         => Attrs
         | 
| 108 | 
            +
                }
         | 
| 109 | 
            +
             | 
| 110 | 
            +
                @tags         = @tagset.keys
         | 
| 111 | 
            +
                @forms        = @tags & FORM_TAGS
         | 
| 112 | 
            +
                @self_closing = @tags & SELF_CLOSING_TAGS
         | 
| 113 | 
            +
              end
         | 
| 114 | 
            +
             | 
| 115 | 
            +
              # Additional tags found in XHTML 1.0 Transitional
         | 
| 116 | 
            +
              class XHTMLTransitional
         | 
| 117 | 
            +
                class << self
         | 
| 118 | 
            +
                  attr_accessor :tags, :tagset, :forms, :self_closing, :doctype
         | 
| 119 | 
            +
                end
         | 
| 120 | 
            +
                
         | 
| 121 | 
            +
                @doctype = ['-//W3C//DTD XHTML 1.0 Transitional//EN', 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd']
         | 
| 122 | 
            +
                @tagset = XHTMLStrict.tagset.merge({
         | 
| 123 | 
            +
                  :strike   => Attrs,
         | 
| 124 | 
            +
                  :center   => Attrs,
         | 
| 125 | 
            +
                  :dir      => Attrs + [:compact],
         | 
| 126 | 
            +
                  :noframes => Attrs,
         | 
| 127 | 
            +
                  :basefont => [:id, :size, :color, :face], 
         | 
| 128 | 
            +
                  :u        => Attrs,
         | 
| 129 | 
            +
                  :menu     => Attrs + [:compact],
         | 
| 130 | 
            +
                  :iframe   => AttrCore + [:longdesc, :name, :src, :frameborder, :marginwidth, :marginheight, :scrolling, :align, :height, :width],
         | 
| 131 | 
            +
                  :font     => AttrCore + AttrI18n + [:size, :color, :face],
         | 
| 132 | 
            +
                  :s        => Attrs,
         | 
| 133 | 
            +
                  :applet   => AttrCore + [:codebase, :archive, :code, :object, :alt, :name, :width, :height, :align, :hspace, :vspace],
         | 
| 134 | 
            +
                  :isindex  => AttrCore + AttrI18n + [:prompt]
         | 
| 135 | 
            +
                })
         | 
| 136 | 
            +
             | 
| 137 | 
            +
                # Additional attributes found in XHTML 1.0 Transitional
         | 
| 138 | 
            +
                additional_tags = {
         | 
| 139 | 
            +
                  :script => [:language],
         | 
| 140 | 
            +
                  :a      => [:target],
         | 
| 141 | 
            +
                  :td     => [:bgcolor, :nowrap, :width, :height],
         | 
| 142 | 
            +
                  :p      => [:align],
         | 
| 143 | 
            +
                  :h5     => [:align],
         | 
| 144 | 
            +
                  :h3     => [:align],
         | 
| 145 | 
            +
                  :li     => [:type, :value],
         | 
| 146 | 
            +
                  :div    => [:align],
         | 
| 147 | 
            +
                  :pre    => [:width],
         | 
| 148 | 
            +
                  :body   => [:background, :bgcolor, :text, :link, :vlink, :alink],
         | 
| 149 | 
            +
                  :ol     => [:type, :compact, :start],
         | 
| 150 | 
            +
                  :h4     => [:align],
         | 
| 151 | 
            +
                  :h2     => [:align],
         | 
| 152 | 
            +
                  :object => [:align, :border, :hspace, :vspace],
         | 
| 153 | 
            +
                  :img    => [:name, :align, :border, :hspace, :vspace],
         | 
| 154 | 
            +
                  :link   => [:target],
         | 
| 155 | 
            +
                  :legend => [:align],
         | 
| 156 | 
            +
                  :dl     => [:compact],
         | 
| 157 | 
            +
                  :input  => [:align],
         | 
| 158 | 
            +
                  :h6     => [:align],
         | 
| 159 | 
            +
                  :hr     => [:align, :noshade, :size, :width],
         | 
| 160 | 
            +
                  :base   => [:target],
         | 
| 161 | 
            +
                  :ul     => [:type, :compact],
         | 
| 162 | 
            +
                  :br     => [:clear],
         | 
| 163 | 
            +
                  :form   => [:name, :target],
         | 
| 164 | 
            +
                  :area   => [:target],
         | 
| 165 | 
            +
                  :h1     => [:align]
         | 
| 166 | 
            +
                }
         | 
| 167 | 
            +
                
         | 
| 168 | 
            +
                additional_tags.each do |k, v|
         | 
| 169 | 
            +
                  @tagset[k] += v
         | 
| 170 | 
            +
                end
         | 
| 171 | 
            +
             | 
| 172 | 
            +
                @tags = @tagset.keys
         | 
| 173 | 
            +
                @forms = @tags & FORM_TAGS
         | 
| 174 | 
            +
                @self_closing = @tags & SELF_CLOSING_TAGS
         | 
| 175 | 
            +
              end
         | 
| 176 | 
            +
             | 
| 177 | 
            +
              # Additional tags found in XHTML 1.0 Frameset
         | 
| 178 | 
            +
              class XHTMLFrameset
         | 
| 179 | 
            +
                class << self
         | 
| 180 | 
            +
                  attr_accessor :tags, :tagset, :forms, :self_closing, :doctype
         | 
| 181 | 
            +
                end
         | 
| 182 | 
            +
                
         | 
| 183 | 
            +
                @doctype = ['-//W3C//DTD XHTML 1.0 Frameset//EN', 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd']
         | 
| 184 | 
            +
                @tagset = XHTMLTransitional.tagset.merge({
         | 
| 185 | 
            +
                  :frameset => AttrCore + [:rows, :cols, :onload, :onunload],
         | 
| 186 | 
            +
                  :frame    => AttrCore + [:longdesc, :name, :src, :frameborder, :marginwidth, :marginheight, :noresize, :scrolling]
         | 
| 187 | 
            +
                })
         | 
| 188 | 
            +
             | 
| 189 | 
            +
                @tags = @tagset.keys
         | 
| 190 | 
            +
                @forms = @tags & FORM_TAGS
         | 
| 191 | 
            +
                @self_closing = @tags & SELF_CLOSING_TAGS
         | 
| 192 | 
            +
              end
         | 
| 193 | 
            +
            end
         | 
    
        data/lib/markaby/tilt.rb
    ADDED
    
    | @@ -0,0 +1,21 @@ | |
| 1 | 
            +
            require 'tilt'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Markaby
         | 
| 4 | 
            +
              module Tilt
         | 
| 5 | 
            +
                class Template < ::Tilt::Template
         | 
| 6 | 
            +
                  def evaluate(scope, locals, &block)
         | 
| 7 | 
            +
                    builder = Markaby::Builder.new({}, scope)
         | 
| 8 | 
            +
                    builder.locals = locals
         | 
| 9 | 
            +
                    builder.instance_eval(data, __FILE__, __LINE__)
         | 
| 10 | 
            +
                    builder.to_s
         | 
| 11 | 
            +
                  end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                  def compile!; end
         | 
| 14 | 
            +
                end
         | 
| 15 | 
            +
              end
         | 
| 16 | 
            +
            end
         | 
| 17 | 
            +
             | 
| 18 | 
            +
            module Tilt
         | 
| 19 | 
            +
              MarkabyTemplate = Markaby::Tilt::Template
         | 
| 20 | 
            +
              register "mab", MarkabyTemplate
         | 
| 21 | 
            +
            end
         | 
    
        data/lib/markaby.rb
    ADDED
    
    | @@ -0,0 +1,30 @@ | |
| 1 | 
            +
            # = About lib/markaby.rb
         | 
| 2 | 
            +
            #
         | 
| 3 | 
            +
            # By requiring <tt>lib/markaby</tt>, you can load Markaby's dependency (the Builder library,)
         | 
| 4 | 
            +
            # as well as the full set of Markaby classes.
         | 
| 5 | 
            +
            #
         | 
| 6 | 
            +
            # For a full list of features and instructions, see the README.
         | 
| 7 | 
            +
            $:.unshift File.expand_path(File.dirname(__FILE__))
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            # Markaby is a module containing all of the great Markaby classes that
         | 
| 10 | 
            +
            # do such an excellent job.
         | 
| 11 | 
            +
            # 
         | 
| 12 | 
            +
            # * Markaby::Builder: the class for actually calling the Ruby methods
         | 
| 13 | 
            +
            #   which write the HTML.
         | 
| 14 | 
            +
            # * Markaby::CSSProxy: a class which adds element classes and IDs to
         | 
| 15 | 
            +
            #   elements when used within Markaby::Builder.
         | 
| 16 | 
            +
            # * Markaby::MetAid: metaprogramming helper methods.
         | 
| 17 | 
            +
            # * Markaby::Tags: lists the roles of various XHTML tags to help Builder
         | 
| 18 | 
            +
            #   use these tags as they are intended.
         | 
| 19 | 
            +
            # * Markaby::Template: a class for hooking Markaby into Rails as a
         | 
| 20 | 
            +
            #   proper templating language.
         | 
| 21 | 
            +
            module Markaby
         | 
| 22 | 
            +
              version_file = File.expand_path(File.dirname(__FILE__) + "/../VERSION")
         | 
| 23 | 
            +
              VERSION      = File.read(version_file).strip
         | 
| 24 | 
            +
             | 
| 25 | 
            +
              class InvalidXhtmlError < Exception; end
         | 
| 26 | 
            +
            end
         | 
| 27 | 
            +
             | 
| 28 | 
            +
            require 'builder' unless defined?(Builder)
         | 
| 29 | 
            +
            require 'markaby/builder'
         | 
| 30 | 
            +
            require 'markaby/cssproxy'
         | 
| @@ -0,0 +1,40 @@ | |
| 1 | 
            +
            require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            class BuilderTest < Test::Unit::TestCase
         | 
| 4 | 
            +
              def setup
         | 
| 5 | 
            +
                Markaby::Builder.restore_defaults!
         | 
| 6 | 
            +
              end
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              def teardown
         | 
| 9 | 
            +
                Markaby::Builder.restore_defaults!
         | 
| 10 | 
            +
              end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
              def test_method_missing_is_private
         | 
| 13 | 
            +
                assert Markaby::Builder.private_instance_methods.include?("method_missing")
         | 
| 14 | 
            +
              end
         | 
| 15 | 
            +
              
         | 
| 16 | 
            +
              # setting options
         | 
| 17 | 
            +
              def test_should_be_able_to_restore_defaults_after_setting
         | 
| 18 | 
            +
                Markaby::Builder.set :indent, 2
         | 
| 19 | 
            +
                Markaby::Builder.restore_defaults!
         | 
| 20 | 
            +
                
         | 
| 21 | 
            +
                assert_equal 0, Markaby::Builder.get(:indent)
         | 
| 22 | 
            +
              end
         | 
| 23 | 
            +
              
         | 
| 24 | 
            +
              def test_should_be_able_set_global_options
         | 
| 25 | 
            +
                Markaby::Builder.set :indent, 2
         | 
| 26 | 
            +
                assert_equal 2, Markaby::Builder.get(:indent)
         | 
| 27 | 
            +
              end
         | 
| 28 | 
            +
              
         | 
| 29 | 
            +
              # internal clobbering by passed in assigns
         | 
| 30 | 
            +
              def test_internal_helpers_ivar_should_not_be_overwritten_by_assigns
         | 
| 31 | 
            +
                helper = Class.new do
         | 
| 32 | 
            +
                  def some_method
         | 
| 33 | 
            +
                    "a value"
         | 
| 34 | 
            +
                  end
         | 
| 35 | 
            +
                end.new
         | 
| 36 | 
            +
                
         | 
| 37 | 
            +
                builder = Markaby::Builder.new({:helpers => nil}, helper)
         | 
| 38 | 
            +
                assert_equal "a value", builder.some_method
         | 
| 39 | 
            +
              end
         | 
| 40 | 
            +
            end
         | 
| @@ -0,0 +1,44 @@ | |
| 1 | 
            +
            require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            class CssProxyTest < Test::Unit::TestCase
         | 
| 4 | 
            +
              def test_method_missing_is_private
         | 
| 5 | 
            +
                assert Markaby::CssProxy.private_instance_methods.include?("method_missing")
         | 
| 6 | 
            +
              end
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              def mock_builder
         | 
| 9 | 
            +
                mock_builder = Class.new do
         | 
| 10 | 
            +
                  def tag!(*args); end
         | 
| 11 | 
            +
                end.new
         | 
| 12 | 
            +
              end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
              def test_responds_to_everything
         | 
| 15 | 
            +
                proxy = Markaby::CssProxy.new(mock_builder, 'stream', :sym)
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                assert proxy.respond_to?(:any_method)
         | 
| 18 | 
            +
                assert proxy.respond_to?(:foobarbazasdfasdfadfs)
         | 
| 19 | 
            +
              end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
              def test_does_not_respond_to_method_missing
         | 
| 22 | 
            +
                proxy = Markaby::CssProxy.new(mock_builder, 'stream', :sym)
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                assert !proxy.respond_to?(:method_missing)
         | 
| 25 | 
            +
              end
         | 
| 26 | 
            +
             | 
| 27 | 
            +
              def test_does_respond_to_private_instance_methods_with_private_flag_set_to_true
         | 
| 28 | 
            +
                proxy = Markaby::CssProxy.new(mock_builder, 'stream', :sym)
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                assert proxy.respond_to?(:method_missing, true)
         | 
| 31 | 
            +
              end
         | 
| 32 | 
            +
             | 
| 33 | 
            +
              def test_does_not_respond_to_private_instance_methods_with_private_flag_set_to_false
         | 
| 34 | 
            +
                proxy = Markaby::CssProxy.new(mock_builder, 'stream', :sym)
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                assert !proxy.respond_to?(:method_missing, false)
         | 
| 37 | 
            +
              end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
              def test_respond_to_should_always_return_boolean
         | 
| 40 | 
            +
                proxy = Markaby::CssProxy.new(mock_builder, 'stream', :sym)
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                assert_equal proxy.respond_to?(:method_missing, :a_value), true
         | 
| 43 | 
            +
              end
         | 
| 44 | 
            +
            end
         | 
| @@ -0,0 +1 @@ | |
| 1 | 
            +
            text "_why?"
         | 
| @@ -0,0 +1,207 @@ | |
| 1 | 
            +
            require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            class MarkabyTest < Test::Unit::TestCase
         | 
| 4 | 
            +
              def teardown
         | 
| 5 | 
            +
                Markaby::Builder.restore_defaults!
         | 
| 6 | 
            +
              end
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              def test_simple
         | 
| 9 | 
            +
                assert_equal "<hr/>", mab { hr }
         | 
| 10 | 
            +
                assert_equal "<hr/><br/>", mab { hr; br }
         | 
| 11 | 
            +
                assert_equal "<p>foo</p>", mab { p 'foo' }
         | 
| 12 | 
            +
                assert_equal "<p>foo</p>", mab { p { 'foo' } }
         | 
| 13 | 
            +
              end
         | 
| 14 | 
            +
              
         | 
| 15 | 
            +
              def test_classes_and_ids
         | 
| 16 | 
            +
                assert_equal %{<div class="one"></div>}, mab { div.one '' }
         | 
| 17 | 
            +
                assert_equal %{<div class="one two"></div>}, mab { div.one.two '' }
         | 
| 18 | 
            +
                assert_equal %{<div id="three"></div>}, mab { div.three! '' }
         | 
| 19 | 
            +
                assert_equal %{<hr class="hidden"/>}, mab { hr.hidden }
         | 
| 20 | 
            +
                assert_equal %{<input class="foo" name="bar" id="bar"/>}, mab { input.foo :id => 'bar' }
         | 
| 21 | 
            +
              end
         | 
| 22 | 
            +
              
         | 
| 23 | 
            +
              def test_escaping
         | 
| 24 | 
            +
                assert_equal "<h1>Apples & Oranges</h1>", mab { h1 'Apples & Oranges' }
         | 
| 25 | 
            +
                assert_equal "<h1>Apples & Oranges</h1>", mab { h1 { 'Apples & Oranges' } }
         | 
| 26 | 
            +
                assert_equal "<h1 class=\"fruits&floots\">Apples</h1>", mab { h1 'Apples', :class => 'fruits&floots' }
         | 
| 27 | 
            +
              end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
              def test_capture
         | 
| 30 | 
            +
                builder = Markaby::Builder.new
         | 
| 31 | 
            +
                assert builder.to_s.empty?
         | 
| 32 | 
            +
                assert_equal "<h1>TEST</h1>", builder.capture { h1 'TEST' }
         | 
| 33 | 
            +
                assert builder.to_s.empty?
         | 
| 34 | 
            +
                assert mab { capture { h1 'hello world' }; nil }.empty?
         | 
| 35 | 
            +
                assert_equal mab { div { h1 'TEST' } }, mab { div { capture { h1 'TEST' } } }
         | 
| 36 | 
            +
              end
         | 
| 37 | 
            +
             | 
| 38 | 
            +
              def test_ivars
         | 
| 39 | 
            +
                html = "<div><h1>Steve</h1><div><h2>Gerald</h2></div><h3>Gerald</h3></div>"
         | 
| 40 | 
            +
                assert_equal html, mab { div { @name = 'Steve'; h1 @name; div { @name = 'Gerald'; h2 @name }; h3 @name } }
         | 
| 41 | 
            +
                assert_equal html, mab { div { @name = 'Steve'; h1 @name; self << capture { div { @name = 'Gerald'; h2 @name } }; h3 @name } }
         | 
| 42 | 
            +
                assert_equal html, mab(:name => 'Steve') { div { h1 @name; self << capture { div { @name = 'Gerald'; h2 @name } }; h3 @name } }
         | 
| 43 | 
            +
              end
         | 
| 44 | 
            +
             | 
| 45 | 
            +
              def test_ivars_without_at_symbol 
         | 
| 46 | 
            +
                assert_equal "<h1>Hello World</h1>", mab { @message = 'Hello World'; h1 message } 
         | 
| 47 | 
            +
              end 
         | 
| 48 | 
            +
              
         | 
| 49 | 
            +
              def spec_helpers
         | 
| 50 | 
            +
                Markaby::Builder.ignored_helpers.clear
         | 
| 51 | 
            +
                assert_equal %{squirrels}, mab({}, MarkabyTestHelpers) { pluralize('squirrel') }
         | 
| 52 | 
            +
                assert_equal %{<a href="">edit</a>}, mab({}, MarkabyTestHelpers) { link_to('edit') }
         | 
| 53 | 
            +
                assert mab({}, MarkabyTestHelpers) { @output_helpers = false; link_to('edit'); nil }.empty?
         | 
| 54 | 
            +
                Markaby::Builder.ignore_helpers :pluralize
         | 
| 55 | 
            +
                assert_exception(NoMethodError, "undefined method `pluralize'", {}, MarkabyTestHelpers) { pluralize('squirrel') }
         | 
| 56 | 
            +
              end
         | 
| 57 | 
            +
              
         | 
| 58 | 
            +
              def test_uses_helper_instance_variable
         | 
| 59 | 
            +
                helper = Module.new do
         | 
| 60 | 
            +
                  @some_ivar = :ivar_value
         | 
| 61 | 
            +
                end
         | 
| 62 | 
            +
                
         | 
| 63 | 
            +
                builder = Markaby::Builder.new({}, helper)
         | 
| 64 | 
            +
                assert_equal :ivar_value, builder.some_ivar
         | 
| 65 | 
            +
              end
         | 
| 66 | 
            +
             | 
| 67 | 
            +
              it "can assign helpers after instantiation" do
         | 
| 68 | 
            +
                helper = mock 'helper', :foo => :bar
         | 
| 69 | 
            +
             | 
| 70 | 
            +
                builder = Markaby::Builder.new
         | 
| 71 | 
            +
                builder.helper = helper
         | 
| 72 | 
            +
                assert_equal :bar, builder.foo
         | 
| 73 | 
            +
              end
         | 
| 74 | 
            +
             | 
| 75 | 
            +
              it "should be able to set a local" do
         | 
| 76 | 
            +
                builder = Markaby::Builder.new
         | 
| 77 | 
            +
                builder.locals = { :foo => "bar" }
         | 
| 78 | 
            +
                builder.foo.should == "bar"
         | 
| 79 | 
            +
              end
         | 
| 80 | 
            +
             | 
| 81 | 
            +
              it "should be able to set a different local value" do
         | 
| 82 | 
            +
                builder = Markaby::Builder.new
         | 
| 83 | 
            +
                builder.locals = { :foo => "baz" }
         | 
| 84 | 
            +
                builder.foo.should == "baz"
         | 
| 85 | 
            +
              end
         | 
| 86 | 
            +
             | 
| 87 | 
            +
              it "should assign the correct key" do
         | 
| 88 | 
            +
                builder = Markaby::Builder.new
         | 
| 89 | 
            +
                builder.locals = { :key => :value }
         | 
| 90 | 
            +
                builder.key.should == :value
         | 
| 91 | 
            +
              end
         | 
| 92 | 
            +
             | 
| 93 | 
            +
              it "should be able to assign multiple locals" do
         | 
| 94 | 
            +
                builder = Markaby::Builder.new
         | 
| 95 | 
            +
             | 
| 96 | 
            +
                builder.locals = { :one => "two", :three => "four" }
         | 
| 97 | 
            +
             | 
| 98 | 
            +
                builder.one.should == "two"
         | 
| 99 | 
            +
                builder.three.should == "four"
         | 
| 100 | 
            +
              end
         | 
| 101 | 
            +
             | 
| 102 | 
            +
              def test_builder_bang_methods
         | 
| 103 | 
            +
                assert_equal "<?xml version=\"1.0\" encoding=\"UTF-8\"?>", mab { instruct! }
         | 
| 104 | 
            +
              end
         | 
| 105 | 
            +
             | 
| 106 | 
            +
              def test_fragments
         | 
| 107 | 
            +
                assert_equal %{<div><h1>Monkeys</h1><h2>Giraffes <small>Miniature</small> and <strong>Large</strong></h2><h3>Donkeys</h3><h4>Parakeet <b><i>Innocent IV</i></b> in Classic Chartreuse</h4></div>}, 
         | 
| 108 | 
            +
                    mab { div { h1 "Monkeys"; h2 { "Giraffes #{small 'Miniature' } and #{strong 'Large'}" }; h3 "Donkeys"; h4 { "Parakeet #{b { i 'Innocent IV' }} in Classic Chartreuse" } } }
         | 
| 109 | 
            +
                assert_equal %{<div><h1>Monkeys</h1><h2>Giraffes <strong>Miniature</strong></h2><h3>Donkeys</h3></div>}, 
         | 
| 110 | 
            +
                    mab { div { h1 "Monkeys"; h2 { "Giraffes #{strong 'Miniature' }" }; h3 "Donkeys" } }
         | 
| 111 | 
            +
                assert_equal %{<div><h1>Monkeys</h1><h2>Giraffes <small>Miniature</small> and <strong>Large</strong></h2><h3>Donkeys</h3><h4>Parakeet <strong>Large</strong> as well...</h4></div>}, 
         | 
| 112 | 
            +
                    mab { div { @a = small 'Miniature'; @b = strong 'Large'; h1 "Monkeys"; h2 { "Giraffes #{@a} and #{@b}" }; h3 "Donkeys"; h4 { "Parakeet #{@b} as well..." } } }
         | 
| 113 | 
            +
              end
         | 
| 114 | 
            +
             | 
| 115 | 
            +
              def test_invalid_xhtml
         | 
| 116 | 
            +
                assert_exception(NoMethodError, "undefined method `dav'") { dav {} }
         | 
| 117 | 
            +
                assert_exception(Markaby::InvalidXhtmlError, "no attribute `styl' on div elements") { div(:styl => 'ok') {} }
         | 
| 118 | 
            +
                assert_exception(Markaby::InvalidXhtmlError, "no attribute `class' on tbody elements") { tbody.okay {} }
         | 
| 119 | 
            +
              end
         | 
| 120 | 
            +
             | 
| 121 | 
            +
              def test_full_doc_transitional
         | 
| 122 | 
            +
                doc = mab { xhtml_transitional { head { title 'OKay' } } }    
         | 
| 123 | 
            +
                assert doc =~ /^<\?xml version="1.0" encoding="UTF-8"\?>/
         | 
| 124 | 
            +
                assert doc.include?(%{"-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">})
         | 
| 125 | 
            +
                assert doc.include?(%{<title>OKay</title>})
         | 
| 126 | 
            +
              end
         | 
| 127 | 
            +
             | 
| 128 | 
            +
              def test_full_doc_strict
         | 
| 129 | 
            +
                doc = mab { xhtml_strict { head { title 'OKay' } } }
         | 
| 130 | 
            +
                assert doc =~ /^<\?xml version="1.0" encoding="UTF-8"\?>/
         | 
| 131 | 
            +
                assert doc.include?(%{"-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">})
         | 
| 132 | 
            +
                assert doc.include?(%{<title>OKay</title>})
         | 
| 133 | 
            +
              end
         | 
| 134 | 
            +
              
         | 
| 135 | 
            +
              def test_full_doc_frameset
         | 
| 136 | 
            +
                doc = mab { xhtml_frameset { head { title 'OKay' } } }
         | 
| 137 | 
            +
                assert doc =~ /^<\?xml version="1.0" encoding="UTF-8"\?>/
         | 
| 138 | 
            +
                assert doc.include?(%{"-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">})
         | 
| 139 | 
            +
                assert doc.include?(%{<title>OKay</title>})
         | 
| 140 | 
            +
              end
         | 
| 141 | 
            +
             | 
| 142 | 
            +
              def test_root_attributes_can_be_changed
         | 
| 143 | 
            +
                doc = mab { xhtml_strict(:lang => 'fr') { head { title { 'Salut!' } } } }
         | 
| 144 | 
            +
                assert doc.include?(%{"-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">})
         | 
| 145 | 
            +
                assert doc.include?(%{<title>Salut!</title>})
         | 
| 146 | 
            +
                assert doc.include?(%{ lang="fr"})
         | 
| 147 | 
            +
              end
         | 
| 148 | 
            +
              
         | 
| 149 | 
            +
              def version_file
         | 
| 150 | 
            +
                File.expand_path(File.dirname(__FILE__) + "/../../VERSION")
         | 
| 151 | 
            +
              end
         | 
| 152 | 
            +
              
         | 
| 153 | 
            +
              def test_markaby_should_have_correct_version
         | 
| 154 | 
            +
                assert_equal Markaby::VERSION, File.read(version_file).strip
         | 
| 155 | 
            +
              end
         | 
| 156 | 
            +
             | 
| 157 | 
            +
              def test_duplicate_usage_of_same_id
         | 
| 158 | 
            +
                assert_raises Markaby::InvalidXhtmlError do
         | 
| 159 | 
            +
                  mab do
         | 
| 160 | 
            +
                    p.one!
         | 
| 161 | 
            +
                    p.one!
         | 
| 162 | 
            +
                  end
         | 
| 163 | 
            +
                end
         | 
| 164 | 
            +
              end
         | 
| 165 | 
            +
              
         | 
| 166 | 
            +
              # auto validation
         | 
| 167 | 
            +
              
         | 
| 168 | 
            +
              def test_tagging_with_invalid_tag_should_raise_error
         | 
| 169 | 
            +
                assert_raises Markaby::InvalidXhtmlError do
         | 
| 170 | 
            +
                  mab do
         | 
| 171 | 
            +
                    tag! :an_invalid_tag
         | 
| 172 | 
            +
                  end
         | 
| 173 | 
            +
                end
         | 
| 174 | 
            +
              end
         | 
| 175 | 
            +
              
         | 
| 176 | 
            +
              def test_self_closing_html_tag_with_block_throws_errors
         | 
| 177 | 
            +
                assert_raises Markaby::InvalidXhtmlError do
         | 
| 178 | 
            +
                  mab do
         | 
| 179 | 
            +
                    html_tag :img do
         | 
| 180 | 
            +
                    end
         | 
| 181 | 
            +
                  end
         | 
| 182 | 
            +
                end
         | 
| 183 | 
            +
              end
         | 
| 184 | 
            +
              
         | 
| 185 | 
            +
              def test_local_assigning
         | 
| 186 | 
            +
                builder = Markaby::Builder.new(:variable => :a_value)
         | 
| 187 | 
            +
                
         | 
| 188 | 
            +
                assert_equal :a_value, builder.variable
         | 
| 189 | 
            +
              end
         | 
| 190 | 
            +
             | 
| 191 | 
            +
              def test_local_assignment_with_strings
         | 
| 192 | 
            +
                builder = Markaby::Builder.new("variable" => :a_value)
         | 
| 193 | 
            +
                assert_equal :a_value, builder.variable
         | 
| 194 | 
            +
              end
         | 
| 195 | 
            +
             | 
| 196 | 
            +
              def test_local_assignment_prefers_symbols_to_strings
         | 
| 197 | 
            +
                builder = Markaby::Builder.new("variable" => "string_value", :variable => :symbol_value)
         | 
| 198 | 
            +
                assert_equal :symbol_value, builder.variable
         | 
| 199 | 
            +
              end
         | 
| 200 | 
            +
             | 
| 201 | 
            +
              def test_method_missing_should_call_tag_if_no_tagset_present
         | 
| 202 | 
            +
                Markaby::Builder.set(:tagset, nil)
         | 
| 203 | 
            +
             | 
| 204 | 
            +
                builder = Markaby::Builder.new
         | 
| 205 | 
            +
                assert_equal "<something/>", builder.something
         | 
| 206 | 
            +
              end
         | 
| 207 | 
            +
            end
         | 
| @@ -0,0 +1,20 @@ | |
| 1 | 
            +
            require 'test/unit'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            unless defined?(RUNNING_RAILS)
         | 
| 4 | 
            +
              MARKABY_ROOT    = File.join(File.dirname(__FILE__), "..", "..", "..")
         | 
| 5 | 
            +
              rails_root      = File.join(MARKABY_ROOT, "..", "..", "..")
         | 
| 6 | 
            +
              RAILS_BOOT_FILE = File.join(rails_root, "config", "boot.rb")
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              RUNNING_RAILS = File.exists?(RAILS_BOOT_FILE) ? true : false
         | 
| 9 | 
            +
            end
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            if RUNNING_RAILS
         | 
| 12 | 
            +
              require RAILS_BOOT_FILE
         | 
| 13 | 
            +
              Rails::Initializer.run
         | 
| 14 | 
            +
              require 'action_controller/test_process'
         | 
| 15 | 
            +
              
         | 
| 16 | 
            +
              $:.unshift MARKABY_ROOT
         | 
| 17 | 
            +
              require 'init'
         | 
| 18 | 
            +
            else
         | 
| 19 | 
            +
              warn "Skipping rails specific tests"
         | 
| 20 | 
            +
            end
         | 
| @@ -0,0 +1 @@ | |
| 1 | 
            +
            li author
         | 
| @@ -0,0 +1 @@ | |
| 1 | 
            +
            link_to "bar", "/foo"
         | 
| @@ -0,0 +1 @@ | |
| 1 | 
            +
            render :partial => "a_partial"
         | 
| @@ -0,0 +1 @@ | |
| 1 | 
            +
            hello, from erb
         | 
| 
            File without changes
         | 
| @@ -0,0 +1 @@ | |
| 1 | 
            +
            Hello, from erb!
         |