express_templates 0.2.0 → 0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +10 -6
- data/lib/core_extensions/proc.rb +42 -0
- data/lib/express_templates.rb +7 -2
- data/lib/express_templates/compiler.rb +27 -0
- data/lib/express_templates/components.rb +7 -4
- data/lib/express_templates/components/base.rb +54 -0
- data/lib/express_templates/components/capabilities/conditionality.rb +52 -0
- data/lib/express_templates/components/capabilities/configurable.rb +91 -0
- data/lib/express_templates/components/capabilities/iterating.rb +80 -0
- data/lib/express_templates/components/capabilities/parenting.rb +74 -0
- data/lib/express_templates/components/capabilities/rendering.rb +93 -0
- data/lib/express_templates/components/capabilities/templating.rb +196 -0
- data/lib/express_templates/components/capabilities/wrapping.rb +100 -0
- data/lib/express_templates/components/column.rb +13 -0
- data/lib/express_templates/components/container.rb +7 -0
- data/lib/express_templates/components/form_rails_support.rb +19 -0
- data/lib/express_templates/components/row.rb +28 -0
- data/lib/express_templates/expander.rb +51 -35
- data/lib/express_templates/indenter.rb +44 -0
- data/lib/express_templates/macro.rb +44 -0
- data/lib/express_templates/markup.rb +9 -0
- data/lib/express_templates/{components → markup}/html_tag.rb +9 -3
- data/lib/express_templates/markup/tag.rb +118 -0
- data/lib/express_templates/markup/wrapper.rb +88 -0
- data/lib/express_templates/{components → markup}/yielder.rb +2 -2
- data/lib/express_templates/renderer.rb +3 -8
- data/lib/express_templates/template/handler.rb +1 -1
- data/lib/express_templates/version.rb +1 -1
- data/lib/tasks/{gara_tasks.rake → express_templates.rake} +0 -0
- data/test/compiler_test.rb +9 -0
- data/test/components/base_test.rb +77 -0
- data/test/components/column_test.rb +11 -0
- data/test/components/conditionality_test.rb +37 -0
- data/test/components/configurable_test.rb +43 -0
- data/test/components/container_test.rb +49 -0
- data/test/components/iterating_test.rb +85 -0
- data/test/components/row_test.rb +16 -0
- data/test/core_extensions/proc_test.rb +41 -0
- data/test/dummy/log/test.log +72489 -0
- data/test/expander_test.rb +55 -13
- data/test/{gara_test.rb → express_templates_test.rb} +0 -0
- data/test/handler_test.rb +4 -4
- data/test/indenter_test.rb +25 -0
- data/test/markup/tag_test.rb +127 -0
- data/test/markup/wrapper_test.rb +42 -0
- data/test/markup/yielder_test.rb +9 -0
- data/test/performance_test.rb +2 -2
- data/test/test_helper.rb +6 -0
- metadata +78 -24
- data/lib/express_templates/component.rb +0 -92
- data/lib/express_templates/components/wrapper.rb +0 -51
- data/lib/express_templates/html5_emitter.rb +0 -45
- data/test/component_test.rb +0 -77
- data/test/wrapper_test.rb +0 -23
@@ -1,92 +0,0 @@
|
|
1
|
-
module ExpressTemplates
|
2
|
-
class Component
|
3
|
-
|
4
|
-
attr_accessor :children
|
5
|
-
|
6
|
-
INDENT = ' '
|
7
|
-
|
8
|
-
def initialize(*children_or_options)
|
9
|
-
@children = []
|
10
|
-
@options = {}.with_indifferent_access
|
11
|
-
_process(*children_or_options)
|
12
|
-
end
|
13
|
-
|
14
|
-
def self.macro_name
|
15
|
-
@macro_name ||= to_s.split('::').last.underscore
|
16
|
-
end
|
17
|
-
|
18
|
-
def macro_name ; self.class.macro_name end
|
19
|
-
|
20
|
-
def html_options
|
21
|
-
@options.each_pair.map do |name, value|
|
22
|
-
%Q(#{name}=\\"#{value}\\")
|
23
|
-
end.join(" ")
|
24
|
-
end
|
25
|
-
|
26
|
-
def start_tag
|
27
|
-
"<#{macro_name}#{html_options.empty? ? '' : ' '+html_options}>"
|
28
|
-
end
|
29
|
-
|
30
|
-
def close_tag
|
31
|
-
"</#{macro_name}>"
|
32
|
-
end
|
33
|
-
|
34
|
-
def add_css_class(css_class)
|
35
|
-
@options['class'] ||= ''
|
36
|
-
@options['class'] = (@options['class'].split + [css_class]).join(" ")
|
37
|
-
end
|
38
|
-
|
39
|
-
def method_missing(name, *args)
|
40
|
-
add_css_class(name)
|
41
|
-
_process(*args) unless args.empty?
|
42
|
-
return self
|
43
|
-
end
|
44
|
-
|
45
|
-
def compile
|
46
|
-
ruby_fragments = @children.map do |child|
|
47
|
-
if child.respond_to?(:compile)
|
48
|
-
child.compile
|
49
|
-
else
|
50
|
-
%Q("#{child}")
|
51
|
-
end
|
52
|
-
end
|
53
|
-
ruby_fragments.unshift %Q("#{start_tag}")
|
54
|
-
ruby_fragments.push %Q("#{close_tag}")
|
55
|
-
ruby_fragments.reject {|frag| frag.empty? }.join("+")
|
56
|
-
end
|
57
|
-
|
58
|
-
def to_template(depth = 0)
|
59
|
-
template_fragments = @children.map do |child|
|
60
|
-
if child.kind_of?(ExpressTemplates::Component)
|
61
|
-
child.to_template(depth+1)
|
62
|
-
else
|
63
|
-
child
|
64
|
-
end
|
65
|
-
end
|
66
|
-
indent = INDENT*(depth+1)
|
67
|
-
macro_name + _blockify(template_fragments.join("\n#{indent}"), depth)
|
68
|
-
end
|
69
|
-
|
70
|
-
private
|
71
|
-
def _indent(code)
|
72
|
-
code.split("\n").map {|line| INDENT + line }.join("\n")
|
73
|
-
end
|
74
|
-
|
75
|
-
def _blockify(code, depth)
|
76
|
-
indent = INDENT*depth
|
77
|
-
code.empty? ? code : " {\n#{_indent(code)}\n}\n"
|
78
|
-
end
|
79
|
-
|
80
|
-
def _process(*children_or_options)
|
81
|
-
children_or_options.each do |child_or_option|
|
82
|
-
if child_or_option.kind_of?(Hash)
|
83
|
-
@options.merge!(child_or_option)
|
84
|
-
else
|
85
|
-
@children << child_or_option
|
86
|
-
end
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
|
91
|
-
end
|
92
|
-
end
|
@@ -1,51 +0,0 @@
|
|
1
|
-
module ExpressTemplates
|
2
|
-
module Components
|
3
|
-
# wrap locals and helpers for evaluation during render
|
4
|
-
class Wrapper
|
5
|
-
|
6
|
-
attr_accessor :name, :args
|
7
|
-
|
8
|
-
def initialize(name, *args)
|
9
|
-
@name = name
|
10
|
-
@args = args
|
11
|
-
end
|
12
|
-
|
13
|
-
def compile
|
14
|
-
# insure nils do not blow up view
|
15
|
-
%Q("\#\{#{_compile}\}")
|
16
|
-
end
|
17
|
-
|
18
|
-
def to_template
|
19
|
-
_compile
|
20
|
-
end
|
21
|
-
|
22
|
-
def children
|
23
|
-
[]
|
24
|
-
end
|
25
|
-
|
26
|
-
private
|
27
|
-
def _compile
|
28
|
-
if @args.empty?
|
29
|
-
return name
|
30
|
-
else
|
31
|
-
args_string = args.slice(0..-2).map(&:inspect).join(', ')
|
32
|
-
last_arg = ''
|
33
|
-
if args.last.is_a?(Hash) # expand a hash
|
34
|
-
unless args.last.empty?
|
35
|
-
# This approach has limitations - will only work on structures of
|
36
|
-
# immediate values
|
37
|
-
last_arg = args.last.inspect.match(/^\{(.*)\}$/)[1]
|
38
|
-
last_arg.gsub!(/:(\w+)=>/, '\1: ') # use ruby 2 hash syntax
|
39
|
-
else
|
40
|
-
last_arg = "{}" # empty hash
|
41
|
-
end
|
42
|
-
else
|
43
|
-
last_arg = args.last.inspect
|
44
|
-
end
|
45
|
-
args_string << (args_string.empty? ? last_arg : ", #{last_arg}")
|
46
|
-
return "#{name}(#{args_string})"
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
@@ -1,45 +0,0 @@
|
|
1
|
-
module ExpressTemplates
|
2
|
-
|
3
|
-
HTML5_TAGS = [ :a, :abbr, :address, :area, :article, :aside, :audio,
|
4
|
-
:b, :base, :bdi, :bdo, :blockquote, :body, :br, :button,
|
5
|
-
:canvas, :caption, :cite, :code, :col, :colgroup,
|
6
|
-
:data, :datalist, :dd, :del, :details, :dfn, :div, :dl, :dt,
|
7
|
-
:em, :embed,
|
8
|
-
:fieldset, :figcaption, :figure, :footer, :form,
|
9
|
-
:h1, :h2, :h3, :h4, :h5, :h6, :head, :header, :hr, :html,
|
10
|
-
:i, :iframe, :img, :input, :ins,
|
11
|
-
:kbd, :keygen,
|
12
|
-
:label, :legend, :li, :link,
|
13
|
-
:main, :map, :mark, :math, :menu, :menuitem, :meta, :meter,
|
14
|
-
:nav, :noscript,
|
15
|
-
:object, :ol, :optgroup, :option, :output,
|
16
|
-
:p, :param, :pre, :progress,
|
17
|
-
:q,
|
18
|
-
:rp, :rt, :ruby,
|
19
|
-
:s, :samp, :script, :section, :select, :small, :source,
|
20
|
-
:span, :strong, :style, :sub, :sup, :summary, :svg,
|
21
|
-
:table, :tbody, :td, :textarea, :tfoot, :th, :thead, :time, :title,
|
22
|
-
:tr, :track,
|
23
|
-
:u, :ul,
|
24
|
-
:var, :video,
|
25
|
-
:wbr]
|
26
|
-
|
27
|
-
module Html5Emitter
|
28
|
-
|
29
|
-
HTML5_TAGS.each do |tag|
|
30
|
-
define_method(tag) do |*args, &block|
|
31
|
-
if block
|
32
|
-
content_tag(tag, capture(&block), *args)
|
33
|
-
else
|
34
|
-
# adjust args because content_tag expects options in the
|
35
|
-
# second position when have nil content
|
36
|
-
if args.first.is_a?(Hash)
|
37
|
-
content_tag(tag, *(args.unshift(nil)))
|
38
|
-
else
|
39
|
-
content_tag(tag, *args)
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
data/test/component_test.rb
DELETED
@@ -1,77 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
class ComponentTest < ActiveSupport::TestCase
|
4
|
-
|
5
|
-
class Bare < ExpressTemplates::Component ; end
|
6
|
-
class Sub < ExpressTemplates::Component ; end
|
7
|
-
|
8
|
-
def bare_component(*args)
|
9
|
-
Bare.new(*args)
|
10
|
-
end
|
11
|
-
|
12
|
-
def sub_component(*args)
|
13
|
-
Sub.new(*args)
|
14
|
-
end
|
15
|
-
|
16
|
-
|
17
|
-
test "#macro_name returns the name of the class" do
|
18
|
-
assert_equal 'bare', bare_component.macro_name
|
19
|
-
end
|
20
|
-
|
21
|
-
test "#compile returns a string" do
|
22
|
-
assert_kind_of String, bare_component.compile
|
23
|
-
end
|
24
|
-
|
25
|
-
test "has no children" do
|
26
|
-
assert_empty bare_component.children
|
27
|
-
end
|
28
|
-
|
29
|
-
def bare_with_2_children
|
30
|
-
component = bare_component "child1", "child2"
|
31
|
-
end
|
32
|
-
|
33
|
-
test "can be created with children" do
|
34
|
-
assert_equal 2, bare_with_2_children.children.size
|
35
|
-
assert_equal "child2", bare_with_2_children.children.last
|
36
|
-
end
|
37
|
-
|
38
|
-
test "#compile on bare_with_2_children yields '\"<bare>\"+\"child1\"+\"child2\"+\"</bare>\"'" do
|
39
|
-
assert_equal '"<bare>"+"child1"+"child2"+"</bare>"', bare_with_2_children.compile
|
40
|
-
end
|
41
|
-
|
42
|
-
test "#start_tag is my macro_name as an xml start tag" do
|
43
|
-
assert_equal "<#{bare_component.macro_name}>", bare_component.start_tag
|
44
|
-
end
|
45
|
-
|
46
|
-
test "#close_tag is my macro_name as an xml close tag" do
|
47
|
-
assert_equal "</#{bare_component.macro_name}>", bare_component.close_tag
|
48
|
-
end
|
49
|
-
|
50
|
-
def component_with_subcomponent
|
51
|
-
bare_component sub_component
|
52
|
-
end
|
53
|
-
|
54
|
-
test "#compile on component_with_subcomponent returns a string which when eval'd looks like '<bare><sub></sub></bare>'" do
|
55
|
-
assert_equal '<bare><sub></sub></bare>', eval(component_with_subcomponent.compile)
|
56
|
-
end
|
57
|
-
|
58
|
-
test "#to_template on bare_component returns 'bare'" do
|
59
|
-
assert_equal 'bare', bare_component.to_template
|
60
|
-
end
|
61
|
-
|
62
|
-
test "#to_template on component_with_subcomponent returns 'bare {\n sub\n}\n'" do
|
63
|
-
assert_equal "bare {\n sub\n}\n", component_with_subcomponent.to_template
|
64
|
-
end
|
65
|
-
|
66
|
-
test "#to_template on nested components indents properly'" do
|
67
|
-
expected = %Q(bare {
|
68
|
-
sub {
|
69
|
-
sub
|
70
|
-
}
|
71
|
-
}
|
72
|
-
)
|
73
|
-
assert_equal expected, Bare.new(Sub.new(Sub.new)).to_template
|
74
|
-
end
|
75
|
-
|
76
|
-
|
77
|
-
end
|
data/test/wrapper_test.rb
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
class WrapperTest < ActiveSupport::TestCase
|
4
|
-
|
5
|
-
test "name compiles to just name" do
|
6
|
-
assert_equal '"#{foo}"', ExpressTemplates::Components::Wrapper.new('foo').compile
|
7
|
-
end
|
8
|
-
|
9
|
-
test "simple args are preserved" do
|
10
|
-
wrapper = ExpressTemplates::Components::Wrapper.new('foo', "xyzzy", 'bar', "baz", 1, false, 3)
|
11
|
-
assert_equal '"#{foo("xyzzy", "bar", "baz", 1, false, 3)}"', wrapper.compile
|
12
|
-
end
|
13
|
-
|
14
|
-
test "args are preserved" do
|
15
|
-
wrapper = ExpressTemplates::Components::Wrapper.new('foo', "xyzzy", bar: "baz")
|
16
|
-
assert_equal '"#{foo("xyzzy", bar: "baz")}"', wrapper.compile
|
17
|
-
end
|
18
|
-
|
19
|
-
test "something returning nil when wrapped and compiled, evals to an empty string" do
|
20
|
-
assert_equal '', eval(ExpressTemplates::Components::Wrapper.new('nil').compile)
|
21
|
-
end
|
22
|
-
|
23
|
-
end
|