mab 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (113) hide show
  1. checksums.yaml +15 -0
  2. data/Gemfile +5 -1
  3. data/Gemfile.lock +3 -3
  4. data/Rakefile +10 -2
  5. data/lib/mab.rb +1 -0
  6. data/lib/mab/indentation.rb +2 -2
  7. data/lib/mab/mixin.rb +57 -57
  8. data/lib/mab/rails.rb +20 -0
  9. data/lib/mab/version.rb +1 -1
  10. data/test/rails/Rakefile +7 -0
  11. data/test/rails/app/assets/images/rails.png +0 -0
  12. data/test/rails/app/assets/javascripts/application.js +15 -0
  13. data/test/rails/app/assets/stylesheets/application.css +13 -0
  14. data/test/rails/app/controllers/application_controller.rb +17 -0
  15. data/test/rails/app/helpers/application_helper.rb +2 -0
  16. data/test/rails/app/views/application/content_for.html.mab +6 -0
  17. data/test/rails/app/views/application/normal.html.mab +2 -0
  18. data/test/rails/app/views/application/variables.html.mab +2 -0
  19. data/test/rails/app/views/layouts/application.html.mab +15 -0
  20. data/test/rails/config.ru +4 -0
  21. data/test/rails/config/application.rb +54 -0
  22. data/test/rails/config/boot.rb +6 -0
  23. data/test/rails/config/environment.rb +5 -0
  24. data/test/rails/config/environments/development.rb +27 -0
  25. data/test/rails/config/environments/production.rb +67 -0
  26. data/test/rails/config/environments/test.rb +29 -0
  27. data/test/rails/config/initializers/backtrace_silencers.rb +7 -0
  28. data/test/rails/config/initializers/inflections.rb +15 -0
  29. data/test/rails/config/initializers/mime_types.rb +5 -0
  30. data/test/rails/config/initializers/secret_token.rb +7 -0
  31. data/test/rails/config/initializers/session_store.rb +8 -0
  32. data/test/rails/config/initializers/wrap_parameters.rb +14 -0
  33. data/test/rails/config/locales/en.yml +5 -0
  34. data/test/rails/config/routes.rb +3 -0
  35. data/test/rails/script/rails +6 -0
  36. data/test/rails/test/helper.rb +7 -0
  37. data/test/rails/test/test_mab.rb +40 -0
  38. data/test/test_mab_mixin.rb +10 -6
  39. metadata +46 -88
  40. data/bench.rb +0 -37
  41. data/mab-0.0.1.gem +0 -0
  42. data/markaby/CHANGELOG.rdoc +0 -106
  43. data/markaby/Markaby.gemspec +0 -109
  44. data/markaby/README.rdoc +0 -317
  45. data/markaby/Rakefile +0 -78
  46. data/markaby/VERSION +0 -1
  47. data/markaby/garlic.rb +0 -29
  48. data/markaby/init.rb +0 -6
  49. data/markaby/lib/markaby.rb +0 -30
  50. data/markaby/lib/markaby/builder.rb +0 -314
  51. data/markaby/lib/markaby/builder_tags.rb +0 -64
  52. data/markaby/lib/markaby/cssproxy.rb +0 -55
  53. data/markaby/lib/markaby/kernel_method.rb +0 -7
  54. data/markaby/lib/markaby/rails.rb +0 -75
  55. data/markaby/lib/markaby/rails/current.rb +0 -85
  56. data/markaby/lib/markaby/rails/deprecated.rb +0 -124
  57. data/markaby/lib/markaby/rails/rails_builder.rb +0 -91
  58. data/markaby/lib/markaby/sinatra.rb +0 -18
  59. data/markaby/lib/markaby/tags.rb +0 -200
  60. data/markaby/lib/markaby/tilt.rb +0 -8
  61. data/markaby/spec/markaby/builder_spec.rb +0 -118
  62. data/markaby/spec/markaby/css_proxy_test.rb +0 -47
  63. data/markaby/spec/markaby/fragment_test.rb +0 -10
  64. data/markaby/spec/markaby/markaby_other_static.mab +0 -1
  65. data/markaby/spec/markaby/markaby_spec.rb +0 -184
  66. data/markaby/spec/markaby/markaby_test.rb +0 -251
  67. data/markaby/spec/markaby/rails/spec_helper.rb +0 -29
  68. data/markaby/spec/markaby/rails/views/layouts/layout.mab +0 -11
  69. data/markaby/spec/markaby/rails/views/markaby/_a_partial.mab +0 -3
  70. data/markaby/spec/markaby/rails/views/markaby/_form_for_with_body_in_erb.erb +0 -1
  71. data/markaby/spec/markaby/rails/views/markaby/_partial_child_with_locals.mab +0 -1
  72. data/markaby/spec/markaby/rails/views/markaby/access_to_helpers.mab +0 -1
  73. data/markaby/spec/markaby/rails/views/markaby/broken.mab +0 -7
  74. data/markaby/spec/markaby/rails/views/markaby/commented_out_template.mab +0 -1
  75. data/markaby/spec/markaby/rails/views/markaby/correct_template_values.mab +0 -5
  76. data/markaby/spec/markaby/rails/views/markaby/double_output.mab +0 -8
  77. data/markaby/spec/markaby/rails/views/markaby/form_for.mab +0 -2
  78. data/markaby/spec/markaby/rails/views/markaby/form_for_with_fields.mab +0 -3
  79. data/markaby/spec/markaby/rails/views/markaby/form_for_with_multiple_fields.mab +0 -4
  80. data/markaby/spec/markaby/rails/views/markaby/no_values_passed.mab +0 -3
  81. data/markaby/spec/markaby/rails/views/markaby/partial_parent.mab +0 -1
  82. data/markaby/spec/markaby/rails/views/markaby/partial_parent_with_locals.mab +0 -7
  83. data/markaby/spec/markaby/rails/views/markaby/render_erb_without_explicit_render_call.erb +0 -1
  84. data/markaby/spec/markaby/rails/views/markaby/render_explicit_but_empty_markaby_layout.mab +0 -0
  85. data/markaby/spec/markaby/rails/views/markaby/render_mab_without_explicit_render_call.mab +0 -3
  86. data/markaby/spec/markaby/rails/views/markaby/render_with_ivar.mab +0 -3
  87. data/markaby/spec/markaby/rails/views/markaby/renders_erb.rhtml +0 -1
  88. data/markaby/spec/markaby/rails/views/markaby/renders_form_for_with_erb_body.mab +0 -3
  89. data/markaby/spec/markaby/rails/views/markaby/routes.mab +0 -1
  90. data/markaby/spec/markaby/rails/views/markaby/yielding.mab +0 -3
  91. data/markaby/spec/markaby/rails/views/markaby/yielding_content_for_with_block_helper.mab +0 -5
  92. data/markaby/spec/markaby/rails/views/markaby/yielding_two.mab +0 -7
  93. data/markaby/spec/markaby/rails/views/markaby/yielding_with_content_for.mab +0 -3
  94. data/markaby/spec/markaby/rails_test.rb +0 -380
  95. data/markaby/spec/markaby/rails_version_spec.rb +0 -37
  96. data/markaby/spec/markaby/sinatra/app.rb +0 -49
  97. data/markaby/spec/markaby/sinatra/sinatra_spec.rb +0 -67
  98. data/markaby/spec/markaby/sinatra/views/helpers.mab +0 -1
  99. data/markaby/spec/markaby/sinatra/views/layout.mab +0 -7
  100. data/markaby/spec/markaby/sinatra/views/markaby_template.mab +0 -0
  101. data/markaby/spec/markaby/sinatra/views/scope_instance_variables.mab +0 -3
  102. data/markaby/spec/markaby/sinatra/views/simple_html.mab +0 -4
  103. data/markaby/spec/markaby/sinatra/views/variables.mab +0 -3
  104. data/markaby/spec/markaby/tilt/erb.erb +0 -1
  105. data/markaby/spec/markaby/tilt/locals.mab +0 -1
  106. data/markaby/spec/markaby/tilt/markaby.mab +0 -1
  107. data/markaby/spec/markaby/tilt/markaby_other_static.mab +0 -1
  108. data/markaby/spec/markaby/tilt/render_twice.mab +0 -1
  109. data/markaby/spec/markaby/tilt/scope.mab +0 -1
  110. data/markaby/spec/markaby/tilt/yielding.mab +0 -2
  111. data/markaby/spec/markaby/tilt_spec.rb +0 -75
  112. data/markaby/spec/spec.opts +0 -2
  113. data/markaby/spec/spec_helper.rb +0 -44
@@ -1,78 +0,0 @@
1
- require 'rake'
2
- require 'rspec/core/rake_task'
3
- require 'rake/testtask'
4
- require 'rake/clean'
5
-
6
- begin
7
- require 'hanna/rdoctask'
8
-
9
- Rake::RDocTask.new do |rdoc|
10
- rdoc.rdoc_dir = 'doc/rdoc'
11
- rdoc.options << '--line-numbers'
12
- rdoc.rdoc_files.add(['README.rdoc', 'CHANGELOG.rdoc', 'lib/**/*.rb'])
13
- end
14
- rescue LoadError
15
- puts "Could not load hanna-rdoc. Please install with mislav-hanna package"
16
- end
17
-
18
- task :default => [:spec, :test]
19
-
20
- Rake::TestTask.new(:test) do |t|
21
- t.pattern = 'spec/markaby/*_test.rb'
22
- end
23
-
24
- RSpec::Core::RakeTask.new(:spec)
25
-
26
- begin
27
- require 'jeweler'
28
-
29
- Jeweler::Tasks.new do |gemspec|
30
- gemspec.name = "markaby"
31
- gemspec.summary = "Markup as Ruby, write HTML in your native Ruby tongue"
32
- gemspec.description = "Tim Fletcher and _why's ruby driven HTML templating system"
33
- gemspec.email = "scott@railsnewbie.com"
34
- gemspec.homepage = "http://markaby.github.com/markaby/"
35
- gemspec.authors = ["_why", "Tim Fletcher", "John Barton", "spox", "smtlaissezfaire"]
36
- gemspec.add_dependency 'builder', '>=2.0.0'
37
- end
38
- rescue LoadError
39
- puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
40
- end
41
-
42
- desc "List any Markaby specific warnings"
43
- task :warnings do
44
- `ruby -w test/test_markaby.rb 2>&1`.split(/\n/).each do |line|
45
- next unless line =~ /warning:/
46
- next if line =~ /builder-/
47
- puts line
48
- end
49
- end
50
-
51
- desc "Start a Markaby-aware IRB session"
52
- task :irb do
53
- sh 'irb -I lib -r markaby -r markaby/kernel_method'
54
- end
55
-
56
- namespace :gemspec do
57
- task :commit do
58
- sh "git add ."
59
- sh "git commit -m 'Update gemspec'"
60
- end
61
- end
62
-
63
- namespace :release do
64
- task :patch => [:spec, "version:bump:patch", :update_gemspec, :rerdoc, :tag_release, :build, :push_tags]
65
-
66
- task :update_gemspec => ["gemspec:generate", "gemspec:validate", "gemspec:commit"]
67
- task :tag_release do
68
- require File.dirname(__FILE__) + "/lib/markaby"
69
- version = "v#{Markaby::VERSION}"
70
- sh "git tag #{version}"
71
- end
72
-
73
- task :push_tags do
74
- sh "git push --tags"
75
- end
76
- end
77
-
78
- task :release => "release:patch"
@@ -1 +0,0 @@
1
- 0.7.2
@@ -1,29 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + "/lib/markaby/rails")
2
-
3
- garlic do
4
- # this plugin
5
- repo "markaby", :path => '.'
6
-
7
- # other repos
8
- repo "rails", :url => "git://github.com/rails/rails"
9
-
10
- # target railses
11
- RAILS_TAREGETS = Markaby::Rails::SUPPORTED_RAILS_VERSIONS.map do |version|
12
- "v#{version}"
13
- end
14
-
15
- RAILS_TAREGETS.each do |rails|
16
- # declare how to prepare, and run each CI target
17
- target "Rails: #{rails}", :tree_ish => rails do
18
- prepare do
19
- plugin "markaby", :clone => true # so we can work in targets
20
- end
21
-
22
- run do
23
- cd "vendor/plugins/markaby" do
24
- sh "rake"
25
- end
26
- end
27
- end
28
- end
29
- end
@@ -1,6 +0,0 @@
1
- $:.unshift File.expand_path(File.join(File.dirname(__FILE__), 'lib'))
2
-
3
- require 'markaby'
4
- require 'markaby/rails'
5
-
6
- Markaby::Rails.load
@@ -1,30 +0,0 @@
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 < StandardError; end
26
- end
27
-
28
- require 'builder' unless defined?(Builder)
29
- require 'markaby/builder'
30
- require 'markaby/cssproxy'
@@ -1,314 +0,0 @@
1
- require 'markaby/tags'
2
- require 'markaby/builder_tags'
3
-
4
- module Markaby
5
- RUBY_VERSION_ID = RUBY_VERSION.split(".").join.to_i
6
-
7
- # The Markaby::Builder class is the central gear in the system. When using
8
- # from Ruby code, this is the only class you need to instantiate directly.
9
- #
10
- # mab = Markaby::Builder.new
11
- # mab.html do
12
- # head { title "Boats.com" }
13
- # body do
14
- # h1 "Boats.com has great deals"
15
- # ul do
16
- # li "$49 for a canoe"
17
- # li "$39 for a raft"
18
- # li "$29 for a huge boot that floats and can fit 5 people"
19
- # end
20
- # end
21
- # end
22
- # puts mab.to_s
23
- #
24
- class Builder
25
- include Markaby::BuilderTags
26
-
27
- DEFAULT_OPTIONS = {
28
- :indent => 0,
29
- :output_helpers => true,
30
- :output_xml_instruction => true,
31
- :output_meta_tag => true,
32
- :auto_validation => true,
33
- :tagset => Markaby::XHTMLTransitional,
34
- :root_attributes => {
35
- :xmlns => 'http://www.w3.org/1999/xhtml',
36
- :'xml:lang' => 'en',
37
- :lang => 'en'
38
- }
39
- }
40
-
41
- @@options = DEFAULT_OPTIONS.dup
42
-
43
- def self.restore_defaults!
44
- @@options = DEFAULT_OPTIONS.dup
45
- end
46
-
47
- def self.set(option, value)
48
- @@options[option] = value
49
- end
50
-
51
- def self.get(option)
52
- @@options[option]
53
- end
54
-
55
- def self.ignored_helpers
56
- @@ignored_helpers ||= []
57
- end
58
-
59
- def self.ignore_helpers(*helpers)
60
- ignored_helpers.concat helpers
61
- end
62
-
63
- attr_accessor :output_helpers, :tagset
64
-
65
- # Create a Markaby builder object. Pass in a hash of variable assignments to
66
- # +assigns+ which will be available as instance variables inside tag construction
67
- # blocks. If an object is passed in to +helper+, its methods will be available
68
- # from those same blocks.
69
- #
70
- # Pass in a +block+ to new and the block will be evaluated.
71
- #
72
- # mab = Markaby::Builder.new {
73
- # html do
74
- # body do
75
- # h1 "Matching Mole"
76
- # end
77
- # end
78
- # }
79
- #
80
- def initialize(assigns = {}, helper = nil, &block)
81
- @streams = [Stream.new]
82
- @assigns = assigns.dup
83
- @_helper = helper
84
- @used_ids = {}
85
-
86
- @@options.each do |k, v|
87
- instance_variable_set("@#{k}", @assigns.delete(k) || v)
88
- end
89
-
90
- @assigns.each do |k, v|
91
- instance_variable_set("@#{k}", v)
92
- end
93
-
94
- if helper
95
- helper.instance_variables.each do |iv|
96
- instance_variable_set(iv, helper.instance_variable_get(iv))
97
- end
98
- end
99
-
100
- @builder = XmlMarkup.new(:indent => @indent, :target => @streams.last)
101
-
102
- text(capture(&block)) if block
103
- end
104
-
105
- def helper=(helper)
106
- @_helper = helper
107
- end
108
-
109
- def metaclass(&block)
110
- metaclass = class << self; self; end
111
- metaclass.class_eval(&block)
112
- end
113
-
114
- private :metaclass
115
-
116
- def locals=(locals)
117
- locals.each do |key, value|
118
- metaclass do
119
- define_method key do
120
- value
121
- end
122
- end
123
- end
124
- end
125
-
126
- # Returns a string containing the HTML stream. Internally, the stream is stored as an Array.
127
- def to_s
128
- @streams.last.to_s
129
- end
130
-
131
- # Write a +string+ to the HTML stream without escaping it.
132
- def text(string)
133
- @builder << string.to_s
134
- nil
135
- end
136
- alias_method :<<, :text
137
- alias_method :concat, :text
138
-
139
- # Captures the HTML code built inside the +block+. This is done by creating a new
140
- # stream for the builder object, running the block and passing back its stream as a string.
141
- #
142
- # >> Markaby::Builder.new.capture { h1 "TEST"; h2 "CAPTURE ME" }
143
- # => "<h1>TEST</h1><h2>CAPTURE ME</h2>"
144
- #
145
- def capture(&block)
146
- @streams.push(@builder.target = Stream.new)
147
- @builder.level += 1
148
- str = instance_eval(&block)
149
- str = @streams.last.join if @streams.last.any?
150
- @streams.pop
151
- @builder.level -= 1
152
- @builder.target = @streams.last
153
- str
154
- end
155
-
156
- # Create a tag named +tag+. Other than the first argument which is the tag name,
157
- # the arguments are the same as the tags implemented via method_missing.
158
- def tag!(tag, *args, &block)
159
- ele_id = nil
160
- if @auto_validation && @tagset
161
- if !@tagset.tagset.has_key?(tag)
162
- raise InvalidXhtmlError, "no element `#{tag}' for #{tagset.doctype}"
163
- elsif args.last.respond_to?(:to_hash)
164
- attrs = args.last.to_hash
165
-
166
- if @tagset.forms.include?(tag) && attrs[:id]
167
- attrs[:name] ||= attrs[:id]
168
- end
169
-
170
- attrs.each do |k, v|
171
- atname = k.to_s.downcase.intern
172
- unless k =~ /:/ or @tagset.tagset[tag].include? atname
173
- raise InvalidXhtmlError, "no attribute `#{k}' on #{tag} elements"
174
- end
175
- if atname == :id
176
- ele_id = v.to_s
177
- if @used_ids.has_key? ele_id
178
- raise InvalidXhtmlError, "id `#{ele_id}' already used (id's must be unique)."
179
- end
180
- end
181
- if AttrsBoolean.include? atname
182
- if v
183
- attrs[k] = atname.to_s
184
- else
185
- attrs.delete k
186
- end
187
- end
188
- end
189
- end
190
- end
191
-
192
- if block
193
- str = capture(&block)
194
- block = proc { text(str) }
195
- end
196
-
197
- f = fragment { @builder.tag!(tag, *args, &block) }
198
- @used_ids[ele_id] = f if ele_id
199
- f
200
- end
201
-
202
- private
203
-
204
- # This method is used to intercept calls to helper methods and instance
205
- # variables. Here is the order of interception:
206
- #
207
- # * If +sym+ is a helper method, the helper method is called
208
- # and output to the stream.
209
- # * If +sym+ is a Builder::XmlMarkup method, it is passed on to the builder object.
210
- # * If +sym+ is also the name of an instance variable, the
211
- # value of the instance variable is returned.
212
- # * If +sym+ has come this far and no +tagset+ is found, +sym+ and its arguments are passed to tag!
213
- # * If a tagset is found, though, +NoMethodError+ is raised.
214
- #
215
- # method_missing used to be the lynchpin in Markaby, but it's no longer used to handle
216
- # HTML tags. See html_tag for that.
217
- def method_missing(sym, *args, &block)
218
- if @_helper.respond_to?(sym, true) && !self.class.ignored_helpers.include?(sym)
219
- r = @_helper.send(sym, *args, &block)
220
- if @output_helpers && r.respond_to?(:to_str)
221
- fragment { @builder << r }
222
- else
223
- r
224
- end
225
- elsif @assigns.has_key?(sym)
226
- @assigns[sym]
227
- elsif @assigns.has_key?(stringy_key = sym.to_s)
228
- # Rails' ActionView assigns hash has string keys for
229
- # instance variables that are defined in the controller.
230
- @assigns[stringy_key]
231
- elsif instance_variables_for(self).include?(ivar = "@#{sym}".to_sym)
232
- instance_variable_get(ivar)
233
- elsif @_helper && instance_variables_for(@_helper).include?(ivar)
234
- @_helper.instance_variable_get(ivar)
235
- elsif instance_methods_for(::Builder::XmlMarkup).include?(sym)
236
- @builder.__send__(sym, *args, &block)
237
- elsif !@tagset
238
- tag!(sym, *args, &block)
239
- else
240
- super
241
- end
242
- end
243
-
244
- if RUBY_VERSION_ID >= 191
245
- def instance_variables_for(obj)
246
- obj.instance_variables
247
- end
248
-
249
- def instance_methods_for(obj)
250
- obj.instance_methods
251
- end
252
- else
253
- def instance_variables_for(obj)
254
- obj.instance_variables.map { |var| var.to_sym }
255
- end
256
-
257
- def instance_methods_for(obj)
258
- obj.instance_methods.map { |m| m.to_sym }
259
- end
260
- end
261
-
262
- def fragment
263
- stream = @streams.last
264
- start = stream.length
265
- yield
266
- length = stream.length - start
267
- Fragment.new(stream, start, length)
268
- end
269
- end
270
-
271
- class Stream < Array
272
- alias_method :to_s, :join
273
- end
274
-
275
- # Every tag method in Markaby returns a Fragment. If any method gets called on the Fragment,
276
- # the tag is removed from the Markaby stream and given back as a string. Usually the fragment
277
- # is never used, though, and the stream stays intact.
278
- #
279
- # For a more practical explanation, check out the README.
280
- class Fragment < ::Builder::BlankSlate
281
- def initialize(*args)
282
- @stream, @start, @length = args
283
- @transformed_stream = false
284
- end
285
-
286
- [:to_s, :inspect, :==].each do |method|
287
- undef_method method if method_defined?(method)
288
- end
289
-
290
- private
291
-
292
- def method_missing(*args, &block)
293
- transform_stream unless transformed_stream?
294
- @str.__send__(*args, &block)
295
- end
296
-
297
- def transform_stream
298
- @transformed_stream = true
299
-
300
- # We can't do @stream.slice!(@start, @length),
301
- # as it would invalidate the @starts and @lengths of other Fragment instances.
302
- @str = @stream[@start, @length].to_s
303
- @stream[@start, @length] = [nil] * @length
304
- end
305
-
306
- def transformed_stream?
307
- @transformed_stream
308
- end
309
- end
310
-
311
- class XmlMarkup < ::Builder::XmlMarkup
312
- attr_accessor :target, :level
313
- end
314
- end