h2o 0.2 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.autotest +11 -0
- data/.gitignore +1 -0
- data/.project +17 -0
- data/README.md +0 -0
- data/Rakefile +32 -0
- data/TODO.md +5 -0
- data/VERSION +1 -0
- data/benchmark/parser.rb +57 -0
- data/benchmark/source.html +4212 -0
- data/example/h2o/base.html +0 -1
- data/example/h2o/index.html +10 -0
- data/example/h2o/layout.html +11 -0
- data/example/request.html +0 -0
- data/example/server +1 -1
- data/h2o.gemspec +101 -41
- data/init.rb +1 -0
- data/lib/.DS_Store +0 -0
- data/lib/core_ext/object.rb +0 -0
- data/lib/h2o.rb +29 -39
- data/lib/h2o/constants.rb +2 -2
- data/lib/h2o/context.rb +3 -10
- data/lib/h2o/error.rb +9 -0
- data/lib/h2o/filters/default.rb +0 -0
- data/lib/h2o/nodes.rb +5 -1
- data/lib/h2o/tags.rb +1 -6
- data/lib/h2o/tags/block.rb +0 -30
- data/lib/h2o/tags/extends.rb +33 -0
- data/lib/h2o/tags/for.rb +7 -6
- data/lib/h2o/tags/with.rb +0 -0
- data/lib/h2o/template.rb +33 -0
- data/spec/fixtures/_partial.html +0 -0
- data/spec/fixtures/a.html +1 -0
- data/spec/fixtures/b.html +0 -0
- data/spec/fixtures/deep/folder/c.html +0 -0
- data/spec/h2o/context_spec.rb +134 -0
- data/spec/h2o/default.html +93 -0
- data/spec/h2o/file_loader_spec.rb +35 -0
- data/spec/h2o/filters_spec.rb +57 -0
- data/spec/h2o/parser_spec.rb +78 -0
- data/spec/h2o/tags/block_spec.rb +26 -0
- data/spec/h2o/tags/for_spec.rb +65 -0
- data/spec/h2o/tags/if_spec.rb +58 -0
- data/spec/spec.opts +4 -0
- data/spec/spec_helper.rb +24 -0
- metadata +81 -27
- data/lib/h2o/errors.rb +0 -7
- data/lib/h2o/tags/recurse.rb +0 -55
data/example/h2o/base.html
CHANGED
data/example/request.html
CHANGED
File without changes
|
data/example/server
CHANGED
data/h2o.gemspec
CHANGED
@@ -1,43 +1,103 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
1
6
|
Gem::Specification.new do |s|
|
2
|
-
s.name
|
3
|
-
s.version
|
4
|
-
|
5
|
-
s.
|
6
|
-
s.
|
7
|
-
s.
|
8
|
-
s.description =
|
9
|
-
s.
|
10
|
-
s.
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
7
|
+
s.name = %q{h2o}
|
8
|
+
s.version = "0.3.0"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Taylor luk"]
|
12
|
+
s.date = %q{2010-08-30}
|
13
|
+
s.description = %q{h2o is a django inspired template that offers natural template syntax and easy to integrate.}
|
14
|
+
s.email = %q{subjective@gmail.com}
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"README.md"
|
17
|
+
]
|
18
|
+
s.files = [
|
19
|
+
".autotest",
|
20
|
+
".gitignore",
|
21
|
+
".project",
|
22
|
+
"README.md",
|
23
|
+
"Rakefile",
|
24
|
+
"TODO.md",
|
25
|
+
"VERSION",
|
26
|
+
"benchmark/parser.rb",
|
27
|
+
"benchmark/source.html",
|
28
|
+
"example/erb/base.html",
|
29
|
+
"example/h2o/base.html",
|
30
|
+
"example/h2o/index.html",
|
31
|
+
"example/h2o/inherit.html",
|
32
|
+
"example/h2o/layout.html",
|
33
|
+
"example/liquid/base.html",
|
34
|
+
"example/request.html",
|
35
|
+
"example/run.rb",
|
36
|
+
"example/server",
|
37
|
+
"example/server.bat",
|
38
|
+
"example/server.rb",
|
39
|
+
"h2o.gemspec",
|
40
|
+
"init.rb",
|
41
|
+
"lib/.DS_Store",
|
42
|
+
"lib/core_ext/object.rb",
|
43
|
+
"lib/h2o.rb",
|
44
|
+
"lib/h2o/constants.rb",
|
45
|
+
"lib/h2o/context.rb",
|
46
|
+
"lib/h2o/datatype.rb",
|
47
|
+
"lib/h2o/error.rb",
|
48
|
+
"lib/h2o/filters.rb",
|
49
|
+
"lib/h2o/filters/default.rb",
|
50
|
+
"lib/h2o/nodes.rb",
|
51
|
+
"lib/h2o/parser.rb",
|
52
|
+
"lib/h2o/tags.rb",
|
53
|
+
"lib/h2o/tags/block.rb",
|
54
|
+
"lib/h2o/tags/extends.rb",
|
55
|
+
"lib/h2o/tags/for.rb",
|
56
|
+
"lib/h2o/tags/if.rb",
|
57
|
+
"lib/h2o/tags/with.rb",
|
58
|
+
"lib/h2o/template.rb",
|
59
|
+
"spec/fixtures/_partial.html",
|
60
|
+
"spec/fixtures/a.html",
|
61
|
+
"spec/fixtures/b.html",
|
62
|
+
"spec/fixtures/deep/folder/c.html",
|
63
|
+
"spec/h2o/context_spec.rb",
|
64
|
+
"spec/h2o/default.html",
|
65
|
+
"spec/h2o/file_loader_spec.rb",
|
66
|
+
"spec/h2o/filters_spec.rb",
|
67
|
+
"spec/h2o/parser_spec.rb",
|
68
|
+
"spec/h2o/tags/block_spec.rb",
|
69
|
+
"spec/h2o/tags/for_spec.rb",
|
70
|
+
"spec/h2o/tags/if_spec.rb",
|
71
|
+
"spec/spec.opts",
|
72
|
+
"spec/spec_helper.rb"
|
73
|
+
]
|
74
|
+
s.homepage = %q{http://www.h2o-template.org}
|
75
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
76
|
+
s.require_paths = ["lib"]
|
77
|
+
s.rubygems_version = %q{1.3.7}
|
78
|
+
s.summary = %q{h2o is a django inspired template}
|
79
|
+
s.test_files = [
|
80
|
+
"spec/h2o/context_spec.rb",
|
81
|
+
"spec/h2o/file_loader_spec.rb",
|
82
|
+
"spec/h2o/filters_spec.rb",
|
83
|
+
"spec/h2o/parser_spec.rb",
|
84
|
+
"spec/h2o/tags/block_spec.rb",
|
85
|
+
"spec/h2o/tags/for_spec.rb",
|
86
|
+
"spec/h2o/tags/if_spec.rb",
|
87
|
+
"spec/spec_helper.rb"
|
88
|
+
]
|
89
|
+
|
90
|
+
if s.respond_to? :specification_version then
|
91
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
92
|
+
s.specification_version = 3
|
93
|
+
|
94
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
95
|
+
s.add_runtime_dependency(%q<schacon-git>, [">= 0"])
|
96
|
+
else
|
97
|
+
s.add_dependency(%q<schacon-git>, [">= 0"])
|
98
|
+
end
|
99
|
+
else
|
100
|
+
s.add_dependency(%q<schacon-git>, [">= 0"])
|
101
|
+
end
|
43
102
|
end
|
103
|
+
|
data/init.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/lib/h2o'
|
data/lib/.DS_Store
ADDED
Binary file
|
data/lib/core_ext/object.rb
CHANGED
File without changes
|
data/lib/h2o.rb
CHANGED
@@ -1,43 +1,33 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
require 'pathname'
|
2
|
+
require 'core_ext/object'
|
3
|
+
require 'h2o/constants'
|
3
4
|
|
4
|
-
|
5
|
-
attr_reader :context
|
6
|
-
|
7
|
-
def initialize (filename, env = {})
|
8
|
-
@file = Pathname.new(filename)
|
9
|
-
env[:search_path] = @file.dirname
|
10
|
-
@nodelist = Template.load(@file, env)
|
11
|
-
end
|
12
|
-
|
13
|
-
def render (context = {})
|
14
|
-
@context = Context.new(context)
|
15
|
-
output_stream = []
|
16
|
-
@nodelist.render(@context, output_stream)
|
17
|
-
output_stream.join
|
18
|
-
end
|
5
|
+
$:.unshift File.dirname(__FILE__) unless $:.include?(File.dirname(__FILE__))
|
19
6
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
7
|
+
module H2o
|
8
|
+
autoload :Template, 'h2o/template'
|
9
|
+
autoload :FileLoader, 'h2o/file_loader'
|
10
|
+
autoload :Error, 'h2o/error'
|
11
|
+
autoload :Context, 'h2o/context'
|
12
|
+
autoload :Parser, 'h2o/parser'
|
13
|
+
autoload :Node, 'h2o/nodes'
|
14
|
+
autoload :DataObject, 'h2o/context'
|
15
|
+
autoload :Filters, 'h2o/filters'
|
16
|
+
autoload :Tags, 'h2o/tags'
|
17
|
+
|
18
|
+
module Tags
|
19
|
+
require 'h2o/tags/if'
|
20
|
+
require 'h2o/tags/for'
|
21
|
+
require 'h2o/tags/with'
|
22
|
+
require 'h2o/tags/block'
|
23
|
+
require 'h2o/tags/extends'
|
30
24
|
end
|
31
|
-
end
|
32
|
-
|
33
|
-
require File.dirname(__FILE__) + '/core_ext/object'
|
34
|
-
|
35
|
-
require File.dirname(__FILE__) + '/h2o/constants'
|
36
|
-
require File.dirname(__FILE__) + '/h2o/errors'
|
37
|
-
require File.dirname(__FILE__) + '/h2o/nodes'
|
38
|
-
require File.dirname(__FILE__) + '/h2o/tags'
|
39
|
-
require File.dirname(__FILE__) + '/h2o/parser'
|
40
|
-
require File.dirname(__FILE__) + '/h2o/context'
|
41
|
-
require File.dirname(__FILE__) + '/h2o/filters'
|
42
|
-
|
43
25
|
|
26
|
+
def self.loader
|
27
|
+
@loader
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.loader=(loader)
|
31
|
+
@loader = loader
|
32
|
+
end
|
33
|
+
end
|
data/lib/h2o/constants.rb
CHANGED
data/lib/h2o/context.rb
CHANGED
@@ -111,7 +111,7 @@ module H2o
|
|
111
111
|
|
112
112
|
class DataObject
|
113
113
|
INTERNAL_METHOD = /^__/
|
114
|
-
@@required_methods = [:__send__, :__id__, :object_id, :respond_to?, :extend, :methods, :class, :nil?, :is_a
|
114
|
+
@@required_methods = [:__send__, :__id__, :object_id, :respond_to?, :extend, :methods, :class, :nil?, :is_a?, :to_h2o]
|
115
115
|
|
116
116
|
def respond_to?(method)
|
117
117
|
method_name = method.to_s
|
@@ -129,21 +129,14 @@ module H2o
|
|
129
129
|
end
|
130
130
|
|
131
131
|
class BlockContext < DataObject
|
132
|
-
|
133
|
-
def self.h2o_safe_methods
|
134
|
-
[:super]
|
135
|
-
end
|
136
|
-
|
137
|
-
def to_h2o
|
138
|
-
self
|
139
|
-
end
|
132
|
+
h2o_expose :super, :depth, :name
|
140
133
|
|
141
134
|
def initialize(block, context, stream, index)
|
142
135
|
@block, @context, @stream, @index = block, context, stream, index
|
143
136
|
end
|
144
137
|
|
145
138
|
def super
|
146
|
-
@block.parent.render(@context, @stream, @index-1) if @block.parent
|
139
|
+
@block.parent.render(@context, @stream, @index-1) if @block.parent.stack_size > @index.abs
|
147
140
|
nil
|
148
141
|
end
|
149
142
|
|
data/lib/h2o/error.rb
ADDED
data/lib/h2o/filters/default.rb
CHANGED
File without changes
|
data/lib/h2o/nodes.rb
CHANGED
data/lib/h2o/tags.rb
CHANGED
@@ -12,11 +12,6 @@ module H2o
|
|
12
12
|
end
|
13
13
|
|
14
14
|
class Tag < Node; end
|
15
|
+
|
15
16
|
end
|
16
17
|
end
|
17
|
-
|
18
|
-
require File.dirname(__FILE__) + '/tags/if'
|
19
|
-
require File.dirname(__FILE__) + '/tags/for'
|
20
|
-
require File.dirname(__FILE__) + '/tags/block'
|
21
|
-
require File.dirname(__FILE__) + '/tags/with'
|
22
|
-
require File.dirname(__FILE__) + '/tags/recurse'
|
data/lib/h2o/tags/block.rb
CHANGED
@@ -30,35 +30,5 @@ module H2o
|
|
30
30
|
end
|
31
31
|
Tags.register(self, :block)
|
32
32
|
end
|
33
|
-
|
34
|
-
class Extends < Tag
|
35
|
-
Syntax = /\"(.*?)\"|\'(.*?)\'/
|
36
|
-
|
37
|
-
def initialize parser, argstring
|
38
|
-
unless parser.first?
|
39
|
-
raise SyntaxError, "extend tag needs to be at the beginning of the document"
|
40
|
-
end
|
41
|
-
# parser the entire subtemplate
|
42
|
-
parser.parse()
|
43
|
-
|
44
|
-
# load the parent template into nodelist
|
45
|
-
@nodelist = Template.load(argstring[1...-1], parser.env)
|
46
|
-
|
47
|
-
blocks = @nodelist.parser.storage[:blocks] || {}
|
48
|
-
|
49
|
-
(parser.storage[:blocks] || []).each do |name, block|
|
50
|
-
if blocks.include? name
|
51
|
-
blocks[name].add_layer(block)
|
52
|
-
block.parent = blocks[name]
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
def render context, stream
|
58
|
-
@nodelist.render(context, stream)
|
59
|
-
end
|
60
|
-
|
61
|
-
Tags.register(self, :extends)
|
62
|
-
end
|
63
33
|
end
|
64
34
|
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module H2o
|
2
|
+
module Tags
|
3
|
+
class Extends < Tag
|
4
|
+
Syntax = /\"(.*?)\"|\'(.*?)\'/
|
5
|
+
|
6
|
+
def initialize parser, argstring
|
7
|
+
unless parser.first?
|
8
|
+
raise SyntaxError, "extend tag needs to be at the beginning of the document"
|
9
|
+
end
|
10
|
+
# parser the entire subtemplate
|
11
|
+
parser.parse()
|
12
|
+
|
13
|
+
# load the parent template into nodelist
|
14
|
+
@nodelist = Template.load(argstring[1...-1], parser.env)
|
15
|
+
|
16
|
+
blocks = @nodelist.parser.storage[:blocks] || {}
|
17
|
+
|
18
|
+
(parser.storage[:blocks] || []).each do |name, block|
|
19
|
+
if blocks.include? name
|
20
|
+
blocks[name].add_layer(block)
|
21
|
+
block.parent = blocks[name]
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def render context, stream
|
27
|
+
@nodelist.render(context, stream)
|
28
|
+
end
|
29
|
+
|
30
|
+
Tags.register(self, :extends)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
data/lib/h2o/tags/for.rb
CHANGED
@@ -29,20 +29,20 @@ module H2o
|
|
29
29
|
length = 0
|
30
30
|
|
31
31
|
if iteratable.respond_to?(:each)
|
32
|
-
length = iteratable.size ||
|
32
|
+
length = iteratable.size || iteratable.length
|
33
33
|
end
|
34
34
|
|
35
35
|
if length > 0
|
36
36
|
parent = context[:loop]
|
37
|
+
index = 0
|
37
38
|
# Main iteration
|
38
39
|
context.stack do
|
39
|
-
iteratable.
|
40
|
-
|
41
|
-
|
42
|
-
if args.first.is_a? Array
|
43
|
-
key, value = value
|
40
|
+
iteratable.each do |item|
|
41
|
+
if item.is_a?(Array)
|
42
|
+
key, value = item
|
44
43
|
else
|
45
44
|
key = index
|
45
|
+
value = item
|
46
46
|
end
|
47
47
|
|
48
48
|
is_even = index % 2 != 0
|
@@ -61,6 +61,7 @@ module H2o
|
|
61
61
|
:odd => !is_even
|
62
62
|
}
|
63
63
|
@body.render(context, stream)
|
64
|
+
index += 1
|
64
65
|
end
|
65
66
|
end
|
66
67
|
else
|