dryml 1.3.0.RC4 → 1.3.0.pre10
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/Rakefile +11 -6
- data/VERSION +1 -1
- data/dryml.gemspec +1 -3
- data/lib/dryml/dryml_builder.rb +2 -43
- data/lib/dryml/dryml_doc.rb +3 -12
- data/lib/dryml/dryml_generator.rb +0 -1
- data/lib/dryml/extensions/action_controller/dryml_methods.rb +8 -1
- data/lib/dryml/helper.rb +4 -4
- data/lib/dryml/part_context.rb +12 -12
- data/lib/dryml/railtie/page_tag_handler.rb +13 -0
- data/lib/dryml/railtie/page_tag_resolver.rb +5 -9
- data/lib/dryml/railtie.rb +0 -7
- data/lib/dryml/tag_parameters.rb +1 -1
- data/lib/dryml/taglib.rb +20 -33
- data/lib/dryml/template.rb +17 -22
- data/lib/dryml/template_environment.rb +16 -25
- data/lib/dryml.rb +248 -210
- data/taglibs/core.dryml +5 -15
- data/test/dryml.rdoctest +1 -1
- metadata +37 -9
- data/ext/mkrf_conf.rb +0 -9
data/Rakefile
CHANGED
@@ -2,17 +2,22 @@ require 'rake'
|
|
2
2
|
require 'rake/rdoctask'
|
3
3
|
require 'rake/testtask'
|
4
4
|
|
5
|
+
$:.unshift File.expand_path('../lib', __FILE__)
|
6
|
+
$:.unshift File.expand_path('../../hobo_support/lib', __FILE__)
|
7
|
+
require 'dryml' # to get VERSION
|
8
|
+
|
5
9
|
RUBY = File.join(Config::CONFIG['bindir'], Config::CONFIG['ruby_install_name']).sub(/.*\s.*/m, '"\&"')
|
6
10
|
RUBYDOCTEST = ENV['RUBYDOCTEST'] || "#{RUBY} -S rubydoctest"
|
7
11
|
|
12
|
+
desc "Default Task"
|
13
|
+
task :default => [ :test ]
|
14
|
+
|
8
15
|
# --- Testing --- #
|
9
16
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
exit(1) if !system("#{RUBYDOCTEST} #{files}")
|
15
|
-
end
|
17
|
+
desc "Run all tests"
|
18
|
+
task :test do |t|
|
19
|
+
files=Dir['test/*.rdoctest'].map {|f| File.expand_path(f)}.join(' ')
|
20
|
+
exit(1) if !system("#{RUBYDOCTEST} #{files}")
|
16
21
|
end
|
17
22
|
|
18
23
|
# --- RDOC --- #
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.3.0.
|
1
|
+
1.3.0.pre10
|
data/dryml.gemspec
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
name = File.basename( __FILE__, '.gemspec' )
|
2
2
|
version = File.read(File.expand_path('../VERSION', __FILE__)).strip
|
3
|
-
require 'date'
|
4
3
|
|
5
4
|
Gem::Specification.new do |s|
|
6
5
|
|
@@ -11,7 +10,7 @@ Gem::Specification.new do |s|
|
|
11
10
|
s.summary = "The Don't Repeat Yourself Markup Language"
|
12
11
|
s.description = "The Don't Repeat Yourself Markup Language"
|
13
12
|
|
14
|
-
s.add_runtime_dependency('actionpack', ["
|
13
|
+
s.add_runtime_dependency('actionpack', [">= 3.0.0"])
|
15
14
|
s.add_runtime_dependency('hobo_support', ["= #{version}"])
|
16
15
|
s.add_development_dependency('rubydoctest', [">= 0"])
|
17
16
|
|
@@ -25,5 +24,4 @@ Gem::Specification.new do |s|
|
|
25
24
|
s.rdoc_options = ["--charset=UTF-8"]
|
26
25
|
s.require_paths = ["lib"]
|
27
26
|
|
28
|
-
s.extensions = 'ext/mkrf_conf.rb'
|
29
27
|
end
|
data/lib/dryml/dryml_builder.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'erubis'
|
2
|
-
|
3
1
|
module Dryml
|
4
2
|
|
5
3
|
class DRYMLBuilder
|
@@ -60,49 +58,10 @@ module Dryml
|
|
60
58
|
end
|
61
59
|
|
62
60
|
|
63
|
-
class Erubis < ::Erubis::Eruby
|
64
|
-
def add_preamble(src)
|
65
|
-
|
66
|
-
end
|
67
|
-
|
68
|
-
def add_text(src, text)
|
69
|
-
return if text.empty?
|
70
|
-
src << "self.output_buffer.safe_concat('" << escape_text(text) << "');"
|
71
|
-
end
|
72
|
-
|
73
|
-
BLOCK_EXPR = /\s+(do|\{)(\s*\|[^|]*\|)?\s*\Z/
|
74
|
-
|
75
|
-
def add_expr_literal(src, code)
|
76
|
-
if code =~ BLOCK_EXPR
|
77
|
-
src << 'self.output_buffer.append= ' << code << ";\nself.output_buffer;"
|
78
|
-
else
|
79
|
-
src << 'self.output_buffer.append= (' << code << ");\nself.output_buffer;"
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
def add_stmt(src, code)
|
84
|
-
# skip fallback code - it utterly destroys DRYML-generated ERB
|
85
|
-
super
|
86
|
-
end
|
87
|
-
|
88
|
-
def add_expr_escaped(src, code)
|
89
|
-
if code =~ BLOCK_EXPR
|
90
|
-
src << "self.output_buffer.safe_append= " << code << ";\nself.output_buffer;"
|
91
|
-
else
|
92
|
-
src << "self.output_buffer.safe_concat((" << code << ").to_s);"
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
|
-
def add_postamble(src)
|
97
|
-
# NOTE: we can't just add a 'self.output_buffer' here because this parser
|
98
|
-
# is used to compile taglibs which don't HAVE one
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
61
|
def erb_process(erb_src)
|
103
62
|
trim_mode = ActionView::TemplateHandlers::ERB.erb_trim_mode
|
104
|
-
erb =
|
105
|
-
res = erb.src
|
63
|
+
erb = ERB.new(erb_src, nil, trim_mode, "output_buffer")
|
64
|
+
res = erb.src.split(';')[1..-2].join(';')
|
106
65
|
if res.respond_to? :force_encoding
|
107
66
|
res.force_encoding(erb_src.encoding)
|
108
67
|
end
|
data/lib/dryml/dryml_doc.rb
CHANGED
@@ -32,21 +32,15 @@ require 'rexml/xpath'
|
|
32
32
|
|
33
33
|
def initialize(home, filename, name=nil)
|
34
34
|
@name = name || filename.sub(/.dryml$/, '')[home.length+1..-1]
|
35
|
-
@source = File.read(filename)
|
36
35
|
@doc = Dryml::Parser::Document.new(File.read(filename), filename)
|
37
36
|
parse_tag_defs
|
38
37
|
end
|
39
38
|
|
40
|
-
attr_reader :name, :doc, :tag_defs
|
39
|
+
attr_reader :name, :doc, :tag_defs
|
41
40
|
|
42
41
|
def comment
|
43
42
|
first_node = doc[0][0]
|
44
|
-
if first_node.is_a?(REXML::Comment)
|
45
|
-
doc.restore_erb_scriptlets(first_node.to_s.strip)
|
46
|
-
elsif first_node.to_s.strip.starts_with?("[![DRYML-ERB")
|
47
|
-
text = doc.restore_erb_scriptlets(first_node.to_s.strip)
|
48
|
-
text.match(/<%#(.*?)%>/m)[1] rescue nil
|
49
|
-
end
|
43
|
+
doc.restore_erb_scriptlets(first_node.to_s.strip) if first_node.is_a?(REXML::Comment)
|
50
44
|
end
|
51
45
|
|
52
46
|
include CommentMethods
|
@@ -83,7 +77,7 @@ require 'rexml/xpath'
|
|
83
77
|
doc.restore_erb_scriptlets(node.to_s).strip
|
84
78
|
end
|
85
79
|
|
86
|
-
# The contents of the XML
|
80
|
+
# The contents of the XML comment, if any, immediately above the tag definition
|
87
81
|
def comment
|
88
82
|
@comment ||= begin
|
89
83
|
space = node.previous_sibling and
|
@@ -92,9 +86,6 @@ require 'rexml/xpath'
|
|
92
86
|
|
93
87
|
if comment_node.is_a?(REXML::Comment)
|
94
88
|
doc.restore_erb_scriptlets(comment_node.to_s.strip)
|
95
|
-
elsif space.to_s.strip.starts_with?("[![DRYML-ERB")
|
96
|
-
text = doc.restore_erb_scriptlets(space.to_s.strip)
|
97
|
-
text.match(/.*<%#(.*?)%>$/m)[1] rescue nil
|
98
89
|
end
|
99
90
|
end
|
100
91
|
end
|
@@ -4,12 +4,19 @@ ActionController::Base.class_eval do
|
|
4
4
|
append_view_path Dryml::Railtie::PageTagResolver.new(self)
|
5
5
|
end
|
6
6
|
|
7
|
-
|
7
|
+
# dryml does not use layouts
|
8
|
+
def action_has_layout?
|
9
|
+
false
|
10
|
+
end
|
8
11
|
|
9
12
|
def dryml_context
|
10
13
|
@this
|
11
14
|
end
|
12
15
|
|
16
|
+
def dryml_fallback_tag(tag_name)
|
17
|
+
@dryml_fallback_tag = tag_name
|
18
|
+
end
|
19
|
+
|
13
20
|
def call_dryml_tag(tag, options={})
|
14
21
|
# TODO: Figure out what this bit is all about :-)
|
15
22
|
if options[:with]
|
data/lib/dryml/helper.rb
CHANGED
@@ -31,7 +31,7 @@ module Dryml::Helper
|
|
31
31
|
end
|
32
32
|
res
|
33
33
|
end
|
34
|
-
|
34
|
+
|
35
35
|
def first_item?
|
36
36
|
if scope.repeat_collection.respond_to? :each_pair
|
37
37
|
this == scope.repeat_collection.first.try.last
|
@@ -39,8 +39,8 @@ module Dryml::Helper
|
|
39
39
|
this == scope.repeat_collection.first
|
40
40
|
end
|
41
41
|
end
|
42
|
-
|
43
|
-
|
42
|
+
|
43
|
+
|
44
44
|
def last_item?
|
45
45
|
if scope.repeat_collection.respond_to? :each_pair
|
46
46
|
this == scope.repeat_collection.last.try.last
|
@@ -49,7 +49,7 @@ module Dryml::Helper
|
|
49
49
|
end
|
50
50
|
end
|
51
51
|
|
52
|
-
|
52
|
+
def param_name_for(path)
|
53
53
|
field_path = field_path.to_s.split(".") if field_path.is_one_of?(String, Symbol)
|
54
54
|
attrs = path.rest.map{|part| "[#{part.to_s.sub /\?$/, ''}]"}.join
|
55
55
|
"#{path.first}#{attrs}"
|
data/lib/dryml/part_context.rb
CHANGED
@@ -21,8 +21,8 @@
|
|
21
21
|
"hoboParts['#{dom_id}'] = (#{code});\n"
|
22
22
|
end.join
|
23
23
|
end
|
24
|
-
|
25
|
-
|
24
|
+
|
25
|
+
|
26
26
|
def self.pre_marshal(x)
|
27
27
|
if x.is_a?(ActiveRecord::Base) && x.respond_to?(:typed_id)
|
28
28
|
TypedId.new(x.typed_id)
|
@@ -40,19 +40,19 @@
|
|
40
40
|
c.form_field_path = environment.form_field_path
|
41
41
|
end
|
42
42
|
end
|
43
|
-
|
44
|
-
|
43
|
+
|
44
|
+
|
45
45
|
def self.for_refresh(encoded_context, page_this, session)
|
46
46
|
new do |c|
|
47
47
|
c.unmarshal(encoded_context, page_this, session)
|
48
48
|
end
|
49
49
|
end
|
50
|
-
|
51
|
-
|
50
|
+
|
51
|
+
|
52
52
|
def initialize
|
53
53
|
yield self
|
54
54
|
end
|
55
|
-
|
55
|
+
|
56
56
|
attr_accessor :part_name, :locals, :this, :this_field, :this_id, :form_field_path
|
57
57
|
|
58
58
|
|
@@ -72,20 +72,20 @@
|
|
72
72
|
raise TamperedWithPartContext unless digest == generate_digest(data, session)
|
73
73
|
|
74
74
|
context = Marshal.load(Base64.decode64(data))
|
75
|
-
|
75
|
+
|
76
76
|
part_name, this_id, locals, form_field_path = context
|
77
77
|
|
78
78
|
if RAILS_DEFAULT_LOGGER
|
79
79
|
RAILS_DEFAULT_LOGGER.info "Call part: #{part_name}. this-id = #{this_id}, locals = #{locals.inspect}"
|
80
80
|
RAILS_DEFAULT_LOGGER.info " : form_field_path = #{form_field_path.inspect}" if form_field_path
|
81
81
|
end
|
82
|
-
|
82
|
+
|
83
83
|
self.part_name = part_name
|
84
84
|
self.this_id = this_id
|
85
85
|
self.locals = restore_locals(locals)
|
86
86
|
self.form_field_path = form_field_path
|
87
|
-
|
88
|
-
parse_this_id(page_this)
|
87
|
+
|
88
|
+
parse_this_id(page_this)
|
89
89
|
end
|
90
90
|
|
91
91
|
|
@@ -121,7 +121,7 @@
|
|
121
121
|
def restore_locals(locals)
|
122
122
|
locals.map do |l|
|
123
123
|
if l.is_a?(TypedId)
|
124
|
-
Hobo::Model.find_by_typed_id(
|
124
|
+
Hobo::Model.find_by_typed_id(this_id)
|
125
125
|
else
|
126
126
|
l
|
127
127
|
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Dryml
|
2
|
+
class Railtie
|
3
|
+
class PageTagHandler < ActionView::Template::Handler
|
4
|
+
|
5
|
+
self.default_format = Mime::HTML
|
6
|
+
|
7
|
+
def self.call(template)
|
8
|
+
"ActionView::Template::Text.new(%q(#{template.source}), Mime::HTML).render"
|
9
|
+
end
|
10
|
+
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -8,16 +8,12 @@ module Dryml
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def find_templates(name, prefix, partial, details)
|
11
|
-
tag_name = @
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
Dryml::Railtie::TemplateHandler, details)]
|
16
|
-
else
|
17
|
-
[]
|
18
|
-
end
|
11
|
+
tag_name = @dryml_fallback_tag || name.dasherize + '-page'
|
12
|
+
text = @controller.call_dryml_tag(tag_name)
|
13
|
+
return [] unless text
|
14
|
+
[ActionView::Template.new(text, "dryml-tag:#{tag_name}", Dryml::Railtie::PageTagHandler, details)]
|
19
15
|
end
|
20
16
|
|
21
|
-
|
17
|
+
end
|
22
18
|
end
|
23
19
|
end
|
data/lib/dryml/railtie.rb
CHANGED
@@ -15,12 +15,5 @@ module Dryml
|
|
15
15
|
ActionView::Template.register_template_handler("dryml", Dryml::Railtie::TemplateHandler)
|
16
16
|
end
|
17
17
|
|
18
|
-
initializer 'dryml' do |app|
|
19
|
-
app.config.to_prepare do
|
20
|
-
Dryml.clear_cache
|
21
|
-
Dryml::Taglib.clear_cache
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
18
|
end
|
26
19
|
end
|
data/lib/dryml/tag_parameters.rb
CHANGED
data/lib/dryml/taglib.rb
CHANGED
@@ -24,40 +24,27 @@
|
|
24
24
|
|
25
25
|
private
|
26
26
|
|
27
|
-
# Requirements for hobo-plugin for loading a taglib when the plugin is loaded as a gem:
|
28
|
-
# - the plugin must define the <gem_name>.camelize.constantize.root() method
|
29
|
-
# - the root() method must return a Pathname object (like Hobo.root, Dryml.root, Rails.root, etc.)
|
30
|
-
# - the taglibs must be available in the 'taglibs' dir in the gem root
|
31
|
-
# You can include the taglib with <include gem='gem_name'/> if the taglib name has the same gem name.
|
32
|
-
# If the plugin defines different taglibs you must also specify the src attribute of the taglib that you want
|
33
|
-
# to include: <include gem='gem_name' src='taglib_name'/>'
|
34
|
-
|
35
27
|
def taglib_filename(options)
|
36
|
-
plugin
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
end
|
57
|
-
src = options[:src] || gem || plugin
|
58
|
-
taglib_file = taglibs_path.join "#{src}.dryml"
|
59
|
-
raise DrymlException, "No such taglib: #{src} #{options.inspect} #{taglib_file}" unless taglib_file.exist?
|
60
|
-
taglib_file.to_s
|
28
|
+
plugin = options[:plugin]
|
29
|
+
rails_root = Object.const_defined?(:Rails) ? Rails.root : "."
|
30
|
+
base = if plugin == "dryml"
|
31
|
+
"#{Dryml.root}/taglibs"
|
32
|
+
elsif plugin == "hobo"
|
33
|
+
"#{Hobo.root}/lib/hobo/rapid/taglibs"
|
34
|
+
elsif options[:src] =~ /\//
|
35
|
+
"#{rails_root}/app/views"
|
36
|
+
elsif options[:template_dir] =~ /^#{Hobo.root}/
|
37
|
+
options[:template_dir]
|
38
|
+
elsif options[:absolute_template_path]
|
39
|
+
options[:absolute_template_path]
|
40
|
+
else
|
41
|
+
"#{rails_root}/#{options[:template_dir].gsub(/^\//, '')}" # remove leading / if there is one
|
42
|
+
end
|
43
|
+
|
44
|
+
src = options[:src] || plugin
|
45
|
+
filename = "#{base}/#{src}.dryml"
|
46
|
+
raise DrymlException, "No such taglib: #{base} #{options.inspect} #{filename}" unless File.exists?(filename)
|
47
|
+
filename
|
61
48
|
end
|
62
49
|
|
63
50
|
end
|
data/lib/dryml/template.rb
CHANGED
@@ -51,7 +51,7 @@ module Dryml
|
|
51
51
|
def compile(local_names=[], auto_taglibs=[])
|
52
52
|
now = Time.now
|
53
53
|
|
54
|
-
unless @template_path.
|
54
|
+
unless @template_path.ends_with?(EMPTY_PAGE)
|
55
55
|
p = Pathname.new template_path
|
56
56
|
p = Pathname.new(Rails.root) + p unless p.absolute? || !Object.const_defined?(:Rails)
|
57
57
|
mtime = p.mtime rescue Time.now
|
@@ -133,7 +133,6 @@ module Dryml
|
|
133
133
|
when scriplet_rex
|
134
134
|
t
|
135
135
|
when /\S+/
|
136
|
-
t.gsub!(/(\(|\))/){"\\#{$1}"}
|
137
136
|
"<% safe_concat %(#{t}) %>"
|
138
137
|
else
|
139
138
|
t
|
@@ -190,7 +189,7 @@ module Dryml
|
|
190
189
|
require_toplevel(el)
|
191
190
|
require_attribute(el, "as", /^#{DRYML_NAME}$/, true)
|
192
191
|
options = {}
|
193
|
-
%w(src module plugin
|
192
|
+
%w(src module plugin as).each do |attr|
|
194
193
|
options[attr.to_sym] = el.attributes[attr] if el.attributes[attr]
|
195
194
|
end
|
196
195
|
@builder.add_build_instruction(:include, options)
|
@@ -251,11 +250,7 @@ module Dryml
|
|
251
250
|
_tag_context(attributes) do
|
252
251
|
attributes.delete :with
|
253
252
|
attributes.delete :field
|
254
|
-
|
255
|
-
call_polymorphic_tag('#{name}', for_klass, attributes, parameters) { #{name}__base(attributes.except, parameters) }
|
256
|
-
else
|
257
|
-
call_polymorphic_tag('#{name}', attributes, parameters) { #{name}__base(attributes.except, parameters) }
|
258
|
-
end
|
253
|
+
call_polymorphic_tag('#{name}', attributes, parameters) { #{name}__base(attributes.except, parameters) }
|
259
254
|
end
|
260
255
|
end
|
261
256
|
)
|
@@ -276,9 +271,7 @@ module Dryml
|
|
276
271
|
# It's a symbolic type name - look up the Ruby type name
|
277
272
|
klass = HoboFields.to_class(for_type) or
|
278
273
|
dryml_exception("No such type in polymorphic tag definition: '#{for_type}'", el)
|
279
|
-
|
280
|
-
# so we add an exception to pick the right datetime type
|
281
|
-
klass == ActiveSupport::TimeWithZone ? 'datetime' : klass.name
|
274
|
+
klass.name
|
282
275
|
else
|
283
276
|
for_type
|
284
277
|
end.underscore.gsub('/', '__')
|
@@ -402,17 +395,17 @@ module Dryml
|
|
402
395
|
"<% output_buffer; end"
|
403
396
|
end
|
404
397
|
|
398
|
+
|
405
399
|
def wrap_source_with_metadata(content, kind, name, *args)
|
406
400
|
if (!include_source_metadata) || name.in?(NO_METADATA_TAGS)
|
407
401
|
content
|
408
402
|
else
|
409
403
|
metadata = [kind, name] + args + [@template_path]
|
410
|
-
"
|
411
|
-
content +
|
412
|
-
"<% safe_concat(%(<!--]DRYML]-->)) %>"
|
404
|
+
"<!--[DRYML|#{metadata * '|'}[-->" + content + "<!--]DRYML]-->"
|
413
405
|
end
|
414
406
|
end
|
415
407
|
|
408
|
+
|
416
409
|
def wrap_tag_method_body_with_metadata(content)
|
417
410
|
name = @def_element.attributes['tag']
|
418
411
|
for_ = @def_element.attributes['for']
|
@@ -554,7 +547,7 @@ module Dryml
|
|
554
547
|
'this_type'
|
555
548
|
elsif t =~ /^[A-Z]/
|
556
549
|
t
|
557
|
-
elsif t =~ /^[a-z]/ && defined?
|
550
|
+
elsif t =~ /^[a-z]/ && defined? HoboFields.to_class
|
558
551
|
klass = HoboFields.to_class(t)
|
559
552
|
klass.name
|
560
553
|
elsif is_code_attribute?(t)
|
@@ -726,14 +719,14 @@ module Dryml
|
|
726
719
|
def append_parameter_tag_hash_item(name, el, metadata_name)
|
727
720
|
":#{ruby_name name} => proc { [{}, { :default => proc { |#{param_content_local_name(name)}| new_context { %>" +
|
728
721
|
param_content_element(name) + children_to_erb(el) +
|
729
|
-
"<%
|
722
|
+
"<% } } } ] }"
|
730
723
|
end
|
731
724
|
|
732
725
|
|
733
726
|
def prepend_parameter_tag_hash_item(name, el, metadata_name)
|
734
727
|
":#{ruby_name name} => proc { [{}, { :default => proc { |#{param_content_local_name(name)}| new_context { %>" +
|
735
728
|
children_to_erb(el) + param_content_element(name) +
|
736
|
-
"<%
|
729
|
+
"<% } } } ] }"
|
737
730
|
end
|
738
731
|
|
739
732
|
|
@@ -741,7 +734,7 @@ module Dryml
|
|
741
734
|
content = children_to_erb(el)
|
742
735
|
content = wrap_source_with_metadata(content, "param", containing_param_name,
|
743
736
|
element_line_num(el)) if containing_param_name
|
744
|
-
"proc { |#{param_content_local_name(el.dryml_name)}| new_context { %>#{content}<%
|
737
|
+
"proc { |#{param_content_local_name(el.dryml_name)}| new_context { %>#{content}<% } #{tag_newlines(el)}}"
|
745
738
|
end
|
746
739
|
|
747
740
|
|
@@ -755,8 +748,8 @@ module Dryml
|
|
755
748
|
end
|
756
749
|
|
757
750
|
|
758
|
-
def param_proc(el,
|
759
|
-
metadata_name = "#{el.name}
|
751
|
+
def param_proc(el, metadata_name_prefix)
|
752
|
+
metadata_name = "#{metadata_name_prefix}><#{el.name}"
|
760
753
|
|
761
754
|
nl = tag_newlines(el)
|
762
755
|
|
@@ -789,7 +782,7 @@ module Dryml
|
|
789
782
|
def replace_parameter_proc(el, metadata_name, content=nil)
|
790
783
|
content ||= wrap_replace_parameter(el, metadata_name)
|
791
784
|
param_name = el.dryml_name.sub(/^(before|after|append|prepend)-/, "")
|
792
|
-
"proc { |#{param_restore_local_name(param_name)}| new_context { %>#{content}<%
|
785
|
+
"proc { |#{param_restore_local_name(param_name)}| new_context { %>#{content}<% } #{tag_newlines(el)}}"
|
793
786
|
end
|
794
787
|
|
795
788
|
|
@@ -817,7 +810,7 @@ module Dryml
|
|
817
810
|
items = attributes.map do |n,v|
|
818
811
|
dryml_exception("invalid attribute name '#{n}' (remember to use '-' rather than '_')", el) unless n =~ DRYML_NAME_RX
|
819
812
|
|
820
|
-
next if n.in?(SPECIAL_ATTRIBUTES
|
813
|
+
next if n.in?(SPECIAL_ATTRIBUTES) || n =~ /^without-/
|
821
814
|
next if el.attributes['part'] && n == 'id' # The id is rendered on the <div class="part-wrapper"> instead
|
822
815
|
|
823
816
|
":#{ruby_name n} => #{attribute_to_ruby(v)}"
|
@@ -1030,6 +1023,8 @@ module Dryml
|
|
1030
1023
|
end
|
1031
1024
|
|
1032
1025
|
def include_source_metadata
|
1026
|
+
# disabled for now -- we're still getting broken rendering with this feature on
|
1027
|
+
return false
|
1033
1028
|
@include_source_metadata = Rails.env.development? && !ENV['DRYML_EDITOR'].blank? if @include_source_metadata.nil?
|
1034
1029
|
@include_source_metadata
|
1035
1030
|
end
|
@@ -26,9 +26,10 @@ module Dryml
|
|
26
26
|
include ActionView::Helpers
|
27
27
|
include Helper ## FIXME remove
|
28
28
|
|
29
|
-
def initialize(view=nil)
|
30
|
-
unless view.nil?
|
29
|
+
def initialize(view_name=nil, view=nil)
|
30
|
+
unless view_name.nil? && view.nil?
|
31
31
|
@view = view
|
32
|
+
@_view_name = view_name
|
32
33
|
@_erb_binding = binding
|
33
34
|
@_part_contexts = {}
|
34
35
|
@_scoped_variables = ScopedVariables.new
|
@@ -48,7 +49,7 @@ module Dryml
|
|
48
49
|
end
|
49
50
|
end
|
50
51
|
|
51
|
-
for attr in [:erb_binding, :part_contexts,
|
52
|
+
for attr in [:erb_binding, :part_contexts, :view_name,
|
52
53
|
:this, :this_parent, :this_field, :this_key,
|
53
54
|
:form_this, :form_field_path, :form_field_names]
|
54
55
|
class_eval "def #{attr}; @_#{attr}; end"
|
@@ -188,20 +189,6 @@ module Dryml
|
|
188
189
|
end
|
189
190
|
end
|
190
191
|
|
191
|
-
def parse_for_type(attributes)
|
192
|
-
t = attributes[:for_type]
|
193
|
-
if t.nil?
|
194
|
-
nil
|
195
|
-
elsif t.is_a?(Class)
|
196
|
-
t
|
197
|
-
elsif t =~ /^[A-Z]/
|
198
|
-
t.constantize
|
199
|
-
elsif t =~ /^[a-z]/ && defined?(HoboFields.to_class)
|
200
|
-
HoboFields.to_class(t)
|
201
|
-
else
|
202
|
-
nil
|
203
|
-
end
|
204
|
-
end
|
205
192
|
|
206
193
|
def call_polymorphic_tag(name, *args)
|
207
194
|
name = name.to_s.gsub('-', '_')
|
@@ -219,13 +206,11 @@ module Dryml
|
|
219
206
|
|
220
207
|
def find_polymorphic_tag(name, call_type=nil)
|
221
208
|
call_type ||= (this.respond_to?(:member_class) && this.member_class) || this_type
|
209
|
+
|
222
210
|
begin
|
223
211
|
found = nil
|
224
212
|
while true
|
225
|
-
#
|
226
|
-
# so we add an exception to pick the right datetime type
|
227
|
-
type_name = ( call_type == ActiveSupport::TimeWithZone ? 'datetime' : call_type.name.to_s).underscore.gsub('/', '__')
|
228
|
-
if respond_to?(poly_name = "#{name}__for_#{type_name}")
|
213
|
+
if respond_to?(poly_name = "#{name}__for_#{call_type.name.to_s.underscore.gsub('/', '__')}")
|
229
214
|
found = poly_name
|
230
215
|
break
|
231
216
|
else
|
@@ -260,8 +245,7 @@ module Dryml
|
|
260
245
|
@_form_field_path, @_form_field_paths_by_object ]
|
261
246
|
@_this_type = nil
|
262
247
|
res = nil
|
263
|
-
|
264
|
-
Rails.logger.error("new_context: #{caller.first}") if !outer_res.blank? && outer_res.to_s != res.to_s
|
248
|
+
@view.with_output_buffer { res = yield }
|
265
249
|
@_this, @_this_parent, @_this_field, @_this_type, @_form_field_path, @_form_field_paths_by_object = ctx
|
266
250
|
res.to_s
|
267
251
|
end
|
@@ -347,14 +331,13 @@ module Dryml
|
|
347
331
|
|
348
332
|
|
349
333
|
def with_form_context(form_this=this, form_field_path=[form_this.class.name.underscore])
|
350
|
-
ctx = [@_form_this, @_form_field_path, @_form_field_paths_by_object]
|
351
334
|
@_form_this = form_this
|
352
335
|
@_form_field_path = form_field_path
|
353
336
|
@_form_field_paths_by_object = { form_this => form_field_path }
|
354
337
|
res = scope.new_scope :in_form => true, :form_field_names => [] do
|
355
338
|
yield
|
356
339
|
end
|
357
|
-
@_form_this
|
340
|
+
@_form_this = @_form_field_path = @_form_field_paths_by_object = nil
|
358
341
|
res
|
359
342
|
end
|
360
343
|
|
@@ -542,6 +525,14 @@ module Dryml
|
|
542
525
|
end
|
543
526
|
|
544
527
|
|
528
|
+
|
529
|
+
|
530
|
+
def part_contexts_javascripts
|
531
|
+
storage = part_contexts_storage
|
532
|
+
storage.blank? ? "" : "<script type=\"text/javascript\">\n#{storage}</script>\n"
|
533
|
+
end
|
534
|
+
|
535
|
+
|
545
536
|
def part_contexts_storage
|
546
537
|
PartContext.client_side_storage(@_part_contexts, session)
|
547
538
|
end
|