dryml 1.3.3 → 1.4.0.pre2
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/Gemfile +6 -0
- data/README +2 -0
- data/Rakefile +2 -1
- data/VERSION +1 -1
- data/cucumber.yml +9 -0
- data/dryml.gemspec +4 -2
- data/features/cookbook/01_simple_page_templates.feature +44 -0
- data/features/cookbook/02_defining_simple_tags.feature +375 -0
- data/features/cookbook/03_implicit_context.feature +229 -0
- data/features/cookbook/04_tag_attributes.feature +120 -0
- data/features/cookbook/05_repeated_and_optional_content.feature +241 -0
- data/features/cookbook/06_pseudo_parameters.feature +191 -0
- data/features/cookbook/07_nested_parameters.feature +147 -0
- data/features/cookbook/08_customizing_tags.feature +307 -0
- data/features/cookbook/09_aliasing_tags.feature +50 -0
- data/features/cookbook/10_polymorphic_tags.feature +168 -0
- data/features/cookbook/11_wrapping_content.feature +57 -0
- data/features/cookbook/12_local_and_scoped_variables.feature +102 -0
- data/features/doctest_examples.feature +187 -0
- data/features/merge_params.feature +36 -0
- data/features/replace_parameters.feature +21 -0
- data/features/static_tags.feature +91 -0
- data/features/step_definitions/contexts.rb +25 -0
- data/features/step_definitions/dom_comparison.rb +10 -0
- data/features/step_definitions/rendering.rb +21 -0
- data/features/support/env.rb +32 -0
- data/features/support/models/author.rb +18 -0
- data/features/support/models/blog_post.rb +37 -0
- data/features/support/models/discussion.rb +15 -0
- data/features/support/models/post.rb +12 -0
- data/features/support/strip_formatter.rb +14 -0
- data/lib/dryml/dryml_builder.rb +4 -14
- data/lib/dryml/dryml_doc.rb +6 -1
- data/lib/dryml/helper.rb +17 -1
- data/lib/dryml/part_context.rb +12 -15
- data/lib/dryml/railtie/template_handler.rb +1 -3
- data/lib/dryml/railtie.rb +1 -0
- data/lib/dryml/taglib.rb +24 -30
- data/lib/dryml/template.rb +32 -86
- data/lib/dryml/template_environment.rb +40 -17
- data/lib/dryml.rb +22 -11
- data/taglibs/core.dryml +18 -12
- data/taglibs/dryml.dryml +3 -0
- metadata +97 -56
data/lib/dryml/template.rb
CHANGED
@@ -14,8 +14,6 @@ module Dryml
|
|
14
14
|
|
15
15
|
CODE_ATTRIBUTE_CHAR = "&"
|
16
16
|
|
17
|
-
NO_METADATA_TAGS = %w(doctype if else unless repeat do with name type-name)
|
18
|
-
|
19
17
|
SPECIAL_ATTRIBUTES = %w(param merge merge-params merge-attrs
|
20
18
|
for-type
|
21
19
|
if unless repeat
|
@@ -53,7 +51,7 @@ module Dryml
|
|
53
51
|
|
54
52
|
unless @template_path.blank?
|
55
53
|
p = Pathname.new template_path
|
56
|
-
p = Pathname.new(Rails.root) + p unless p.absolute? || !Object.const_defined?(:Rails)
|
54
|
+
p = Pathname.new(Rails.root) + p unless p.absolute? || !Object.const_defined?(:Rails) || Rails.root.nil?
|
57
55
|
mtime = p.mtime rescue Time.now
|
58
56
|
|
59
57
|
if !@builder.ready?(mtime)
|
@@ -155,8 +153,10 @@ module Dryml
|
|
155
153
|
tag_newlines(el)
|
156
154
|
|
157
155
|
when "set-theme"
|
156
|
+
require_toplevel(el)
|
158
157
|
require_attribute(el, "name", /^#{DRYML_NAME}$/)
|
159
|
-
|
158
|
+
Rails.logger.debug "set-theme has been deprecated. Please use <include gem='hobo_#{el.attributes['name']}'/> instead."
|
159
|
+
@builder.add_build_instruction(:include, :gem => "hobo_#{el.attributes['name']}")
|
160
160
|
|
161
161
|
# return nothing - set_theme has no presence in the erb source
|
162
162
|
tag_newlines(el)
|
@@ -397,44 +397,9 @@ module Dryml
|
|
397
397
|
|
398
398
|
"#{start} " +
|
399
399
|
# reproduce any line breaks in the start-tag so that line numbers are preserved
|
400
|
-
tag_newlines(el) + "%>" +
|
401
|
-
wrap_tag_method_body_with_metadata(children_to_erb(el)) +
|
402
|
-
"<% output_buffer; end"
|
403
|
-
end
|
404
|
-
|
405
|
-
def wrap_source_with_metadata(content, kind, name, *args)
|
406
|
-
if (!include_source_metadata) || name.in?(NO_METADATA_TAGS)
|
407
|
-
content
|
408
|
-
else
|
409
|
-
metadata = [kind, name] + args + [@template_path]
|
410
|
-
"<% safe_concat(%(<!--[DRYML|#{metadata * '|'}[-->)) %>" +
|
411
|
-
content +
|
412
|
-
"<% safe_concat(%(<!--]DRYML]-->)) %>"
|
413
|
-
end
|
414
|
-
end
|
415
|
-
|
416
|
-
def wrap_tag_method_body_with_metadata(content)
|
417
|
-
name = @def_element.attributes['tag']
|
418
|
-
for_ = @def_element.attributes['for']
|
419
|
-
name += " for #{for_}" if for_
|
420
|
-
wrap_source_with_metadata(content, "def", name, element_line_num(@def_element))
|
400
|
+
tag_newlines(el) + "%>" + children_to_erb(el) + "<% output_buffer; end"
|
421
401
|
end
|
422
402
|
|
423
|
-
|
424
|
-
def wrap_tag_call_with_metadata(el, content)
|
425
|
-
name = el.expanded_name
|
426
|
-
param = el.attributes['param']
|
427
|
-
|
428
|
-
if param == "&true"
|
429
|
-
name += " param"
|
430
|
-
elsif param
|
431
|
-
name += " param='#{param}'"
|
432
|
-
end
|
433
|
-
|
434
|
-
wrap_source_with_metadata(content, "call", name, element_line_num(el))
|
435
|
-
end
|
436
|
-
|
437
|
-
|
438
403
|
def param_content_local_name(name)
|
439
404
|
"_#{ruby_name name}__default_content"
|
440
405
|
end
|
@@ -465,9 +430,11 @@ module Dryml
|
|
465
430
|
|
466
431
|
def simple_part_element(el, content)
|
467
432
|
part_name = el.attributes['part']
|
468
|
-
dom_id = el.attributes['id'] || part_name
|
469
433
|
part_name = ruby_name(part_name)
|
470
434
|
part_locals = el.attributes["part-locals"]
|
435
|
+
dom_id = el.attributes['id']
|
436
|
+
|
437
|
+
raise 'id should have been added elsewhere' if dom_id.nil?
|
471
438
|
|
472
439
|
part_src = "<% def #{part_name}_part(#{part_locals._?.gsub('@', '')}) #{tag_newlines(el)}; new_context do %>" +
|
473
440
|
content +
|
@@ -564,7 +531,6 @@ module Dryml
|
|
564
531
|
end
|
565
532
|
end
|
566
533
|
|
567
|
-
|
568
534
|
def tag_call(el)
|
569
535
|
name = call_name(el)
|
570
536
|
param_name = get_param_name(el)
|
@@ -608,8 +574,7 @@ module Dryml
|
|
608
574
|
end
|
609
575
|
|
610
576
|
call = apply_control_attributes(call, el)
|
611
|
-
|
612
|
-
wrap_tag_call_with_metadata(el, call)
|
577
|
+
maybe_make_part_call(el, "<% concat(#{call}) %>")
|
613
578
|
end
|
614
579
|
|
615
580
|
|
@@ -623,8 +588,6 @@ module Dryml
|
|
623
588
|
def parameter_tags_hash(el, containing_tag_name=nil)
|
624
589
|
call_type = nil
|
625
590
|
|
626
|
-
metadata_name = containing_tag_name || el.expanded_name
|
627
|
-
|
628
591
|
param_items = el.map do |node|
|
629
592
|
case node
|
630
593
|
when REXML::Text
|
@@ -649,7 +612,7 @@ module Dryml
|
|
649
612
|
end
|
650
613
|
|
651
614
|
if is_parameter_tag
|
652
|
-
parameter_tag_hash_item(e
|
615
|
+
parameter_tag_hash_item(e) + ", "
|
653
616
|
end
|
654
617
|
end
|
655
618
|
end.join
|
@@ -669,7 +632,7 @@ module Dryml
|
|
669
632
|
elsif is_code_attribute?(merge_params)
|
670
633
|
merge_params[1..-1]
|
671
634
|
else
|
672
|
-
merge_param_names = merge_params.split(/\s*,\s*/).*.gsub("-", "_")
|
635
|
+
merge_param_names = merge_params.split(/\s*,\s*/).*.gsub("-", "_").*.to_sym
|
673
636
|
"all_parameters & #{merge_param_names.inspect}"
|
674
637
|
end
|
675
638
|
"merge_parameter_hashes({#{param_items}}, (#{extra_params}) || {})"
|
@@ -685,52 +648,52 @@ module Dryml
|
|
685
648
|
end
|
686
649
|
|
687
650
|
|
688
|
-
def parameter_tag_hash_item(el
|
651
|
+
def parameter_tag_hash_item(el)
|
689
652
|
name = el.name.dup
|
690
653
|
if name.sub!(/^before-/, "")
|
691
|
-
before_parameter_tag_hash_item(name, el
|
654
|
+
before_parameter_tag_hash_item(name, el)
|
692
655
|
elsif name.sub!(/^after-/, "")
|
693
|
-
after_parameter_tag_hash_item(name, el
|
656
|
+
after_parameter_tag_hash_item(name, el)
|
694
657
|
elsif name.sub!(/^prepend-/, "")
|
695
|
-
prepend_parameter_tag_hash_item(name, el
|
658
|
+
prepend_parameter_tag_hash_item(name, el)
|
696
659
|
elsif name.sub!(/^append-/, "")
|
697
|
-
append_parameter_tag_hash_item(name, el
|
660
|
+
append_parameter_tag_hash_item(name, el)
|
698
661
|
else
|
699
662
|
hash_key = ruby_name name
|
700
663
|
hash_key += "_replacement" if el.attribute("replace")
|
701
664
|
if (param_name = get_param_name(el))
|
702
|
-
":#{hash_key} => merge_tag_parameter(#{param_proc(el
|
665
|
+
":#{hash_key} => merge_tag_parameter(#{param_proc(el)}, all_parameters[:#{param_name}])"
|
703
666
|
else
|
704
|
-
":#{hash_key} => #{param_proc(el
|
667
|
+
":#{hash_key} => #{param_proc(el)}"
|
705
668
|
end
|
706
669
|
end
|
707
670
|
end
|
708
671
|
|
709
672
|
|
710
|
-
def before_parameter_tag_hash_item(name, el
|
673
|
+
def before_parameter_tag_hash_item(name, el)
|
711
674
|
param_name = get_param_name(el)
|
712
675
|
dryml_exception("param declaration not allowed on 'before' parameters", el) if param_name
|
713
676
|
content = children_to_erb(el) + "<% concat(#{param_restore_local_name(name)}.call({}, {})) %>"
|
714
|
-
":#{ruby_name name}_replacement => #{replace_parameter_proc(el,
|
677
|
+
":#{ruby_name name}_replacement => #{replace_parameter_proc(el, content)}"
|
715
678
|
end
|
716
679
|
|
717
680
|
|
718
|
-
def after_parameter_tag_hash_item(name, el
|
681
|
+
def after_parameter_tag_hash_item(name, el)
|
719
682
|
param_name = get_param_name(el)
|
720
683
|
dryml_exception("param declaration not allowed on 'after' parameters", el) if param_name
|
721
684
|
content = "<% concat(#{param_restore_local_name(name)}.call({}, {})) %>" + children_to_erb(el)
|
722
|
-
":#{ruby_name name}_replacement => #{replace_parameter_proc(el,
|
685
|
+
":#{ruby_name name}_replacement => #{replace_parameter_proc(el, content)}"
|
723
686
|
end
|
724
687
|
|
725
688
|
|
726
|
-
def append_parameter_tag_hash_item(name, el
|
689
|
+
def append_parameter_tag_hash_item(name, el)
|
727
690
|
":#{ruby_name name} => proc { [{}, { :default => proc { |#{param_content_local_name(name)}| new_context { %>" +
|
728
691
|
param_content_element(name) + children_to_erb(el) +
|
729
692
|
"<% ; output_buffer } } } ] }"
|
730
693
|
end
|
731
694
|
|
732
695
|
|
733
|
-
def prepend_parameter_tag_hash_item(name, el
|
696
|
+
def prepend_parameter_tag_hash_item(name, el)
|
734
697
|
":#{ruby_name name} => proc { [{}, { :default => proc { |#{param_content_local_name(name)}| new_context { %>" +
|
735
698
|
children_to_erb(el) + param_content_element(name) +
|
736
699
|
"<% ; output_buffer } } } ] }"
|
@@ -739,8 +702,6 @@ module Dryml
|
|
739
702
|
|
740
703
|
def default_param_proc(el, containing_param_name=nil)
|
741
704
|
content = children_to_erb(el)
|
742
|
-
content = wrap_source_with_metadata(content, "param", containing_param_name,
|
743
|
-
element_line_num(el)) if containing_param_name
|
744
705
|
"proc { |#{param_content_local_name(el.dryml_name)}| new_context { %>#{content}<% ; output_buffer } #{tag_newlines(el)}}"
|
745
706
|
end
|
746
707
|
|
@@ -750,21 +711,14 @@ module Dryml
|
|
750
711
|
end
|
751
712
|
|
752
713
|
|
753
|
-
def
|
754
|
-
wrap_source_with_metadata(children_to_erb(el), "replace", name, element_line_num(el))
|
755
|
-
end
|
756
|
-
|
757
|
-
|
758
|
-
def param_proc(el, metadata_name_suffix)
|
759
|
-
metadata_name = "#{el.name} < #{metadata_name_suffix}"
|
760
|
-
|
714
|
+
def param_proc(el)
|
761
715
|
nl = tag_newlines(el)
|
762
716
|
|
763
717
|
if (repl = el.attribute("replace"))
|
764
718
|
dryml_exception("replace attribute must not have a value", el) if repl.has_rhs?
|
765
719
|
dryml_exception("replace parameters must not have attributes", el) if el.attributes.length > 1
|
766
720
|
|
767
|
-
replace_parameter_proc(el,
|
721
|
+
replace_parameter_proc(el, children_to_erb(el))
|
768
722
|
else
|
769
723
|
attributes = el.attributes.dup
|
770
724
|
# Providing one of 'with' or 'field' but not the other should cancel out the other
|
@@ -780,14 +734,13 @@ module Dryml
|
|
780
734
|
end
|
781
735
|
end.compact
|
782
736
|
|
783
|
-
nested_parameters_hash = parameter_tags_hash(el
|
737
|
+
nested_parameters_hash = parameter_tags_hash(el)
|
784
738
|
"proc { [{#{attribute_items * ', '}}, #{nested_parameters_hash}] #{nl}}"
|
785
739
|
end
|
786
740
|
end
|
787
741
|
|
788
742
|
|
789
|
-
def replace_parameter_proc(el,
|
790
|
-
content ||= wrap_replace_parameter(el, metadata_name)
|
743
|
+
def replace_parameter_proc(el, content=nil)
|
791
744
|
param_name = el.dryml_name.sub(/^(before|after|append|prepend)-/, "")
|
792
745
|
"proc { |#{param_restore_local_name(param_name)}| new_context { %>#{content}<% ; output_buffer } #{tag_newlines(el)}}"
|
793
746
|
end
|
@@ -796,7 +749,7 @@ module Dryml
|
|
796
749
|
def maybe_make_part_call(el, call)
|
797
750
|
part_name = el.attributes['part']
|
798
751
|
if part_name
|
799
|
-
part_id
|
752
|
+
part_id=(el.attributes['id'] ||= "\#{create_part_id('#{part_name}', '#{el.attributes['part-locals']}', binding)}")
|
800
753
|
|
801
754
|
"<% safe_concat(\"<div class='part-wrapper' id='#{attribute_to_ruby(part_id)[1..-2]}'>\") %>" +
|
802
755
|
part_element(el, call) +
|
@@ -854,17 +807,15 @@ module Dryml
|
|
854
807
|
|
855
808
|
def static_tag_to_method_call(el)
|
856
809
|
part = el.attributes["part"]
|
810
|
+
if part && !el.attributes["id"]
|
811
|
+
el.attributes["id"] = "\#{create_part_id('#{part}', '#{el.attributes['part-locals']}', binding)}"
|
812
|
+
end
|
857
813
|
attrs = el.attributes.map do |n, v|
|
858
814
|
next if n.in? SPECIAL_ATTRIBUTES
|
859
815
|
val = restore_erb_scriptlets(v).gsub('"', '\"').gsub(/<%=(.*?)%>/, '#{\1}')
|
860
816
|
%('#{n}' => "#{val}")
|
861
817
|
end.compact
|
862
818
|
|
863
|
-
# If there's a part but no id, the id defaults to the part name
|
864
|
-
if part && !el.attributes["id"]
|
865
|
-
attrs << ":id => '#{part}'"
|
866
|
-
end
|
867
|
-
|
868
819
|
# Convert the attributes hash to a call to merge_attrs if
|
869
820
|
# there's a merge-attrs attribute
|
870
821
|
attrs = if el.attributes['merge-attrs']
|
@@ -1029,11 +980,6 @@ module Dryml
|
|
1029
980
|
"#{name}_#{@gensym_counter}"
|
1030
981
|
end
|
1031
982
|
|
1032
|
-
def include_source_metadata
|
1033
|
-
@include_source_metadata = Rails.env.development? && !ENV['DRYML_EDITOR'].blank? if @include_source_metadata.nil?
|
1034
|
-
@include_source_metadata
|
1035
|
-
end
|
1036
|
-
|
1037
983
|
end
|
1038
984
|
|
1039
985
|
end
|
@@ -23,7 +23,6 @@ module Dryml
|
|
23
23
|
|
24
24
|
end
|
25
25
|
|
26
|
-
include ActionView::Helpers
|
27
26
|
include Helper ## FIXME remove
|
28
27
|
|
29
28
|
def initialize(view=nil)
|
@@ -105,6 +104,10 @@ module Dryml
|
|
105
104
|
end
|
106
105
|
|
107
106
|
|
107
|
+
def deunderscore_attributes(attrs)
|
108
|
+
HashWithIndifferentAccess[attrs.map{ |attr, value| [attr.to_s.gsub('_', '-'), value]}]
|
109
|
+
end
|
110
|
+
|
108
111
|
def add_classes!(attributes, *classes)
|
109
112
|
classes = classes.flatten.select{|x|x}
|
110
113
|
current = attributes[:class]
|
@@ -117,13 +120,28 @@ module Dryml
|
|
117
120
|
add_classes!(HashWithIndifferentAccess.new(attributes), classes)
|
118
121
|
end
|
119
122
|
|
123
|
+
def add_data_rapid!(attrs, tag, options)
|
124
|
+
data_rapid = ActiveSupport::JSON.decode(attrs["data_rapid"] || "{}")
|
125
|
+
attrs["data_rapid"] = data_rapid.update(tag => options).to_json
|
126
|
+
attrs
|
127
|
+
end
|
128
|
+
|
129
|
+
def add_data_rapid(attrs, tag, options)
|
130
|
+
add_data_rapid!(HashWithIndifferentAccess.new(attrs), tag, options)
|
131
|
+
end
|
120
132
|
|
121
133
|
def merge_attrs(attrs, overriding_attrs)
|
122
|
-
|
134
|
+
attrs = {}.update(attrs)
|
135
|
+
return attrs if overriding_attrs.nil?
|
123
136
|
attrs = attrs.with_indifferent_access unless attrs.is_a?(HashWithIndifferentAccess)
|
124
137
|
classes = overriding_attrs[:class]
|
125
|
-
|
126
|
-
|
138
|
+
add_classes!(attrs, *classes.split) if classes
|
139
|
+
if (data_rapid = overriding_attrs["data_rapid"])
|
140
|
+
attrs["data_rapid"]=ActiveSupport::JSON.decode(attrs["data_rapid"] || "{}").
|
141
|
+
update(ActiveSupport::JSON.decode(data_rapid)).to_json
|
142
|
+
end
|
143
|
+
|
144
|
+
attrs.update(overriding_attrs - [:class, :data_rapid])
|
127
145
|
end
|
128
146
|
|
129
147
|
|
@@ -229,7 +247,7 @@ module Dryml
|
|
229
247
|
found = poly_name
|
230
248
|
break
|
231
249
|
else
|
232
|
-
if call_type ==
|
250
|
+
if call_type == Object
|
233
251
|
found = name
|
234
252
|
break
|
235
253
|
else
|
@@ -270,7 +288,18 @@ module Dryml
|
|
270
288
|
def new_object_context(new_this)
|
271
289
|
new_context do
|
272
290
|
if new_this.respond_to?(:origin)
|
273
|
-
|
291
|
+
refl = (new_this.origin && new_this.origin_attribute.is_a?(Symbol) && new_this.origin.class.respond_to?(:reflections) && new_this.origin.class.reflections[new_this.origin_attribute])
|
292
|
+
if refl.nil? || refl.macro==:belongs_to || refl.macro==:has_one
|
293
|
+
@_this_parent, @_this_field = new_this.origin, new_this.origin_attribute
|
294
|
+
else
|
295
|
+
# See bug #989 for more discussion. The commented out
|
296
|
+
# section is more 'correct', but it is expensive and since
|
297
|
+
# nobody really ran into this before, setting to nil seems
|
298
|
+
# more appropriate.
|
299
|
+
@_this_parent, @_this_field = nil, nil
|
300
|
+
#@_this_parent = new_this.origin.send(new_this.origin_attribute)
|
301
|
+
#@_this_field = @_this_parent.index(new_this) || @_this_parent.length
|
302
|
+
end
|
274
303
|
else
|
275
304
|
@_this_parent, @_this_field = [nil, nil]
|
276
305
|
end
|
@@ -542,11 +571,10 @@ module Dryml
|
|
542
571
|
end
|
543
572
|
|
544
573
|
|
545
|
-
def
|
546
|
-
PartContext.
|
574
|
+
def part_contexts_storage_uncoded
|
575
|
+
PartContext.client_side_storage_uncoded(@_part_contexts, session)
|
547
576
|
end
|
548
577
|
|
549
|
-
|
550
578
|
def render_tag(tag_name, attributes)
|
551
579
|
method_name = tag_name.to_s.gsub('-', '_')
|
552
580
|
if respond_to?(method_name)
|
@@ -583,15 +611,10 @@ module Dryml
|
|
583
611
|
attr_string = " #{attrs.sort * ' '}" unless attrs.empty?
|
584
612
|
end
|
585
613
|
content = capture { new_context &block } if block_given?
|
586
|
-
|
587
|
-
|
588
|
-
else
|
589
|
-
"<#{name}#{attr_string}>".html_safe + content + "</#{name}>".html_safe
|
590
|
-
end
|
591
|
-
if content.is_a? ActionView::NonConcattingString
|
592
|
-
concat res
|
614
|
+
if empty
|
615
|
+
"<#{name}#{attr_string}#{scope.xmldoctype ? ' /' : ''}>".html_safe
|
593
616
|
else
|
594
|
-
|
617
|
+
"<#{name}#{attr_string}>".html_safe + content + "</#{name}>".html_safe
|
595
618
|
end
|
596
619
|
end
|
597
620
|
|
data/lib/dryml.rb
CHANGED
@@ -17,6 +17,7 @@ module Dryml
|
|
17
17
|
VERSION = File.read(File.expand_path('../../VERSION', __FILE__)).strip
|
18
18
|
@@root = Pathname.new File.expand_path('../..', __FILE__)
|
19
19
|
def self.root; @@root; end
|
20
|
+
EDIT_LINK_BASE = "https://github.com/tablatom/hobo_tree_table/edit/master/dryml"
|
20
21
|
|
21
22
|
class DrymlSyntaxError < RuntimeError; end
|
22
23
|
|
@@ -35,7 +36,6 @@ module Dryml
|
|
35
36
|
ID_SEPARATOR = '; dryml-tag: '
|
36
37
|
APPLICATION_TAGLIB = { :src => "taglibs/application" }
|
37
38
|
CORE_TAGLIB = { :src => "core", :plugin => "dryml" }
|
38
|
-
DEFAULT_IMPORTS = defined?(ApplicationHelper) ? [ApplicationHelper] : []
|
39
39
|
@cache = {}
|
40
40
|
extend self
|
41
41
|
attr_accessor :last_if
|
@@ -43,7 +43,7 @@ module Dryml
|
|
43
43
|
def precompile_taglibs
|
44
44
|
Dir.chdir(Rails.root) do
|
45
45
|
Dir["app/views/taglibs/**/*.dryml"].each do |f|
|
46
|
-
Taglib.get(:template_dir => File.dirname(f), :src => File.basename(f).remove(".dryml"))
|
46
|
+
Taglib.get(:template_dir => File.dirname(f), :src => File.basename(f).remove(".dryml"), :source_template => f)
|
47
47
|
end
|
48
48
|
end
|
49
49
|
end
|
@@ -78,11 +78,18 @@ module Dryml
|
|
78
78
|
end
|
79
79
|
end
|
80
80
|
|
81
|
-
def
|
81
|
+
def imports_for_view(view)
|
82
|
+
imports = []
|
83
|
+
imports << Sprockets::Helpers::RailsHelper if defined?(Sprockets) && defined?(Rails)
|
84
|
+
imports << ActionView::Helpers if defined?(ActionView)
|
85
|
+
imports + view.controller.class.modules_for_helpers(view.controller.class.all_helpers_from_path(view.controller.class.helpers_path))
|
86
|
+
end
|
87
|
+
|
88
|
+
def page_renderer(view, identifier, local_names=[], controller_path=nil, imports=nil)
|
82
89
|
controller_path ||= view.controller.controller_path
|
83
90
|
if identifier =~ /#{ID_SEPARATOR}/
|
84
91
|
identifier = identifier.split(ID_SEPARATOR).first
|
85
|
-
@cache[identifier] ||= make_renderer_class("", "", local_names, taglibs_for(controller_path))
|
92
|
+
@cache[identifier] ||= make_renderer_class("", "", local_names, taglibs_for(controller_path), imports_for_view(view))
|
86
93
|
@cache[identifier].new(view)
|
87
94
|
else
|
88
95
|
mtime = File.mtime(identifier)
|
@@ -92,7 +99,8 @@ module Dryml
|
|
92
99
|
(local_names - renderer_class.compiled_local_names).any? || # any new local names?
|
93
100
|
renderer_class.load_time < mtime) # cache out of date?
|
94
101
|
renderer_class = make_renderer_class(File.read(identifier), identifier,
|
95
|
-
local_names, taglibs_for(controller_path)
|
102
|
+
local_names, taglibs_for(controller_path),
|
103
|
+
imports_for_view(view))
|
96
104
|
renderer_class.load_time = mtime
|
97
105
|
@cache[identifier] = renderer_class
|
98
106
|
end
|
@@ -169,13 +177,15 @@ module Dryml
|
|
169
177
|
# "core", :plugin => "dryml" } is automatically
|
170
178
|
# added to this list.
|
171
179
|
# @param [ActionView::Base] view an ActionView instance
|
172
|
-
|
180
|
+
# @param [Array] A list of helper modules to import. For example,
|
181
|
+
# [ActionView::Base]
|
182
|
+
def render(template_src, locals={}, template_path=nil, included_taglibs=[], view=nil, imports=nil)
|
173
183
|
template_path ||= template_src
|
174
184
|
view ||= ActionView::Base.new(ActionController::Base.view_paths, {})
|
175
185
|
this = locals.delete(:this) || nil
|
176
186
|
|
177
187
|
renderer_class = Dryml::Template.build_cache[template_path]._?.environment ||
|
178
|
-
make_renderer_class(template_src, template_path, locals.keys)
|
188
|
+
make_renderer_class(template_src, template_path, locals.keys, included_taglibs, imports)
|
179
189
|
renderer_class.new(view).render_page(this, locals)
|
180
190
|
end
|
181
191
|
|
@@ -217,15 +227,16 @@ private
|
|
217
227
|
# "core", :plugin => "dryml" } is automatically
|
218
228
|
# added to this list.
|
219
229
|
#
|
220
|
-
def make_renderer_class(template_src, template_path, locals=[], taglibs=[])
|
230
|
+
def make_renderer_class(template_src, template_path, locals=[], taglibs=[], imports=nil)
|
221
231
|
renderer_class = Class.new(TemplateEnvironment)
|
222
|
-
compile_renderer_class(renderer_class, template_src, template_path, locals, taglibs)
|
232
|
+
compile_renderer_class(renderer_class, template_src, template_path, locals, taglibs, imports)
|
223
233
|
renderer_class
|
224
234
|
end
|
225
235
|
|
226
|
-
def compile_renderer_class(renderer_class, template_src, template_path, locals, taglibs=[])
|
236
|
+
def compile_renderer_class(renderer_class, template_src, template_path, locals, taglibs=[], imports=nil)
|
227
237
|
template = Dryml::Template.new(template_src, renderer_class, template_path)
|
228
|
-
|
238
|
+
|
239
|
+
imports.each {|m| template.import_module(m)} if imports
|
229
240
|
|
230
241
|
# the sum of all the names we've seen so far - eventually we'll be ready for all of 'em
|
231
242
|
all_local_names = renderer_class.compiled_local_names | locals
|
data/taglibs/core.dryml
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
-->
|
6
6
|
<def tag="call-tag" attrs="tag">
|
7
7
|
<%= Dryml.static_tags.include?(tag) ?
|
8
|
-
content_tag(tag, parameters.default, attributes) :
|
8
|
+
content_tag(tag, parameters.default, deunderscore_attributes(attributes)) :
|
9
9
|
send(tag.gsub('-', '_'), attributes, parameters) %>
|
10
10
|
</def>
|
11
11
|
|
@@ -25,7 +25,7 @@ For example, you might want to wrap an `<img>` tag in an `<a>` tag but only unde
|
|
25
25
|
<% parameter ||= :default %>
|
26
26
|
<%= if when_
|
27
27
|
if Dryml.static_tags.include?(tag)
|
28
|
-
content_tag(tag, parameters.default, attributes)
|
28
|
+
content_tag(tag, parameters.default, deunderscore_attributes(attributes))
|
29
29
|
else
|
30
30
|
send(tag.gsub('-', '_'), attributes, { parameter.to_sym => parameters[:default] })
|
31
31
|
end
|
@@ -115,32 +115,38 @@ collection is considered blank)
|
|
115
115
|
|
116
116
|
|
117
117
|
<!-- nodoc. Define core HTML tags defined in Rapid so that DRYML can be used without Rapid. -->
|
118
|
-
<def tag="html"><%=raw "<html#{tag_options(attributes, true)}>" -%><do param="default"/><%= raw "</html>" -%></def>
|
118
|
+
<def tag="html"><%=raw "<html#{tag_options(deunderscore_attributes(attributes), true)}>" -%><do param="default"/><%= raw "</html>" -%></def>
|
119
119
|
|
120
120
|
<!-- nodoc. Define core HTML tags defined in Rapid so that DRYML can be used without Rapid. -->
|
121
|
-
<def tag="table"><%=raw "<table#{tag_options(attributes, true)}>" -%><do param="default"/><%= raw "</table>" -%></def>
|
121
|
+
<def tag="table"><%=raw "<table#{tag_options(deunderscore_attributes(attributes), true)}>" -%><do param="default"/><%= raw "</table>" -%></def>
|
122
122
|
|
123
123
|
<!-- nodoc. Define core HTML tags defined in Rapid so that DRYML can be used without Rapid. -->
|
124
|
-
<def tag="a"><%=raw "<a#{tag_options(attributes, true)}>" -%><do param="default"/><%= raw "</a>" -%></def>
|
124
|
+
<def tag="a"><%=raw "<a#{tag_options(deunderscore_attributes(attributes), true)}>" -%><do param="default"/><%= raw "</a>" -%></def>
|
125
125
|
|
126
126
|
<!-- nodoc. Define core HTML tags defined in Rapid so that DRYML can be used without Rapid. -->
|
127
|
-
<def tag="section"><%=raw "<section#{tag_options(attributes, true)}>" -%><do param="default"/><%= raw "</section>" -%></def>
|
127
|
+
<def tag="section"><%=raw "<section#{tag_options(deunderscore_attributes(attributes), true)}>" -%><do param="default"/><%= raw "</section>" -%></def>
|
128
128
|
|
129
129
|
<!-- nodoc. Define core HTML tags defined in Rapid so that DRYML can be used without Rapid. -->
|
130
|
-
<def tag="header"><%=raw "<header#{tag_options(attributes, true)}>" -%><do param="default"/><%= raw "</header>" -%></def>
|
130
|
+
<def tag="header"><%=raw "<header#{tag_options(deunderscore_attributes(attributes), true)}>" -%><do param="default"/><%= raw "</header>" -%></def>
|
131
131
|
|
132
132
|
<!-- nodoc. Define core HTML tags defined in Rapid so that DRYML can be used without Rapid. -->
|
133
|
-
<def tag="footer"><%=raw "<footer#{tag_options(attributes, true)}>" -%><do param="default"/><%= raw "</footer>" -%></def>
|
133
|
+
<def tag="footer"><%=raw "<footer#{tag_options(deunderscore_attributes(attributes), true)}>" -%><do param="default"/><%= raw "</footer>" -%></def>
|
134
134
|
|
135
135
|
<!-- nodoc. Define core HTML tags defined in Rapid so that DRYML can be used without Rapid. -->
|
136
|
-
<def tag="form"><%=raw "<form#{tag_options(attributes, true)}>" -%><do param="default"/><%= raw "</form>" -%></def>
|
136
|
+
<def tag="form"><%=raw "<form#{tag_options(deunderscore_attributes(attributes), true)}>" -%><do param="default"/><%= raw "</form>" -%></def>
|
137
137
|
|
138
138
|
<!-- nodoc. Define core HTML tags defined in Rapid so that DRYML can be used without Rapid. -->
|
139
|
-
<def tag="submit"><%=raw "<submit#{tag_options(attributes, true)}>" -%><do param="default"/><%= raw "</submit>" -%></def>
|
139
|
+
<def tag="submit"><%=raw "<submit#{tag_options(deunderscore_attributes(attributes), true)}>" -%><do param="default"/><%= raw "</submit>" -%></def>
|
140
140
|
|
141
141
|
<!-- nodoc. Define core HTML tags defined in Rapid so that DRYML can be used without Rapid. -->
|
142
|
-
<def tag="input"><%=raw "<input#{tag_options(attributes, true)}>" -%><do param="default"/><%= raw "</input>" -%></def>
|
142
|
+
<def tag="input"><%=raw "<input#{tag_options(deunderscore_attributes(attributes), true)}>" -%><do param="default"/><%= raw "</input>" -%></def>
|
143
143
|
|
144
144
|
<!-- nodoc. Define core HTML tags defined in Rapid so that DRYML can be used without Rapid. -->
|
145
|
-
<def tag="link"><%=raw "<link#{tag_options(attributes, true)}>" -%><do param="default"/><%= raw "</link>" -%></def>
|
145
|
+
<def tag="link"><%=raw "<link#{tag_options(deunderscore_attributes(attributes), true)}>" -%><do param="default"/><%= raw "</link>" -%></def>
|
146
146
|
|
147
|
+
<!-- nodoc. Define core HTML tags defined in Rapid so that DRYML can be used without Rapid. -->
|
148
|
+
<def tag="img"><%=raw "<img#{tag_options(attributes, true)} />" -%></def>
|
149
|
+
|
150
|
+
<!-- nodoc: used to provide documentation for a tag without actually defining the tag -->
|
151
|
+
<def tag="fakedef">
|
152
|
+
</def>
|
data/taglibs/dryml.dryml
ADDED