jam 0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/HISTORY +21 -0
- data/MANIFEST +52 -0
- data/README +39 -0
- data/TODO +22 -0
- data/bin/jam +0 -0
- data/demo/array.rb +16 -0
- data/demo/attribute.rb +24 -0
- data/demo/demi/fixtures/ex1.html +10 -0
- data/demo/demi/fixtures/samples.yaml +19 -0
- data/demo/demi/integration/01_jam.rd +41 -0
- data/demo/demi/integration/02_xpath.rd +41 -0
- data/demo/demi/integration/samples.rd +28 -0
- data/demo/demi/unit/hpricot.rd +150 -0
- data/demo/demi/unit/libxml.rd +75 -0
- data/demo/demi/unit/nokogiri.rd +148 -0
- data/demo/demi/unit/rexml.rd +63 -0
- data/demo/hash.rb +20 -0
- data/demo/helloworld.rb +12 -0
- data/demo/object.rb +19 -0
- data/demo/table.rb +24 -0
- data/js/jquery.jam.js +230 -0
- data/lib/jam.rb +2 -0
- data/lib/jam/cherry.rb +1 -0
- data/lib/jam/css2xpath.rb +104 -0
- data/lib/jam/css_to_xpath.rb +132 -0
- data/lib/jam/engine.rb +169 -0
- data/lib/jam/hpricot.rb +137 -0
- data/lib/jam/libxml.rb +151 -0
- data/lib/jam/nokogiri.rb +167 -0
- data/lib/jam/rexml.rb +135 -0
- data/lib/jam/template.rb +224 -0
- data/meta/abstract +2 -0
- data/meta/author +1 -0
- data/meta/created +1 -0
- data/meta/homepage +1 -0
- data/meta/package +1 -0
- data/meta/project +1 -0
- data/meta/status +1 -0
- data/meta/summary +1 -0
- data/meta/timestamp +1 -0
- data/meta/title +1 -0
- data/meta/version +1 -0
- metadata +103 -0
data/HISTORY
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
= Jam Change History
|
2
|
+
|
3
|
+
== 0.2 / 2009-06-15
|
4
|
+
|
5
|
+
This release cleans up the code and adds support for
|
6
|
+
extensions. Currently only Nokigiri is supported as
|
7
|
+
a backend engine.
|
8
|
+
|
9
|
+
Changes:
|
10
|
+
|
11
|
+
* Rewrote the backend to support #jam extensions.
|
12
|
+
|
13
|
+
== 0.1 / 2009-06-01
|
14
|
+
|
15
|
+
This is the first version of Jam, as extracted from the
|
16
|
+
Cherry project.
|
17
|
+
|
18
|
+
Changes:
|
19
|
+
|
20
|
+
* Happy Birthday!
|
21
|
+
|
data/MANIFEST
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
#!mast bin demo js lib meta test [A-Z]*
|
2
|
+
bin
|
3
|
+
bin/jam
|
4
|
+
demo
|
5
|
+
demo/array.rb
|
6
|
+
demo/attribute.rb
|
7
|
+
demo/demi
|
8
|
+
demo/demi/fixtures
|
9
|
+
demo/demi/fixtures/ex1.html
|
10
|
+
demo/demi/fixtures/samples.yaml
|
11
|
+
demo/demi/integration
|
12
|
+
demo/demi/integration/01_jam.rd
|
13
|
+
demo/demi/integration/02_xpath.rd
|
14
|
+
demo/demi/integration/samples.rd
|
15
|
+
demo/demi/unit
|
16
|
+
demo/demi/unit/hpricot.rd
|
17
|
+
demo/demi/unit/libxml.rd
|
18
|
+
demo/demi/unit/nokogiri.rd
|
19
|
+
demo/demi/unit/rexml.rd
|
20
|
+
demo/hash.rb
|
21
|
+
demo/helloworld.rb
|
22
|
+
demo/object.rb
|
23
|
+
demo/table.rb
|
24
|
+
js
|
25
|
+
js/jquery.jam.js
|
26
|
+
lib
|
27
|
+
lib/jam
|
28
|
+
lib/jam/cherry.rb
|
29
|
+
lib/jam/css2xpath.rb
|
30
|
+
lib/jam/css_to_xpath.rb
|
31
|
+
lib/jam/engine.rb
|
32
|
+
lib/jam/hpricot.rb
|
33
|
+
lib/jam/libxml.rb
|
34
|
+
lib/jam/nokogiri.rb
|
35
|
+
lib/jam/rexml.rb
|
36
|
+
lib/jam/template.rb
|
37
|
+
lib/jam.rb
|
38
|
+
meta
|
39
|
+
meta/abstract
|
40
|
+
meta/author
|
41
|
+
meta/created
|
42
|
+
meta/homepage
|
43
|
+
meta/package
|
44
|
+
meta/project
|
45
|
+
meta/status
|
46
|
+
meta/summary
|
47
|
+
meta/timestamp
|
48
|
+
meta/title
|
49
|
+
meta/version
|
50
|
+
TODO
|
51
|
+
README
|
52
|
+
HISTORY
|
data/README
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
= Jam
|
2
|
+
|
3
|
+
http://jam.rubyforge.org
|
4
|
+
|
5
|
+
Jam is a data-driven templater system. Jam provides 100% sepearation between
|
6
|
+
logic and presentation.
|
7
|
+
|
8
|
+
Jam can operate on the back-end via Ruby or on the front-end via Javascript/jQuery
|
9
|
+
off-loading some of the back-end work load, while also providing 100% SOC
|
10
|
+
(Seperation of Concern).
|
11
|
+
|
12
|
+
|
13
|
+
== Examples
|
14
|
+
|
15
|
+
Here is an example of usage in Javascript.
|
16
|
+
|
17
|
+
data = {
|
18
|
+
hello: "Hello, World!"
|
19
|
+
}
|
20
|
+
|
21
|
+
$.jam(data)
|
22
|
+
|
23
|
+
Jam templates are especially useful when filled via AJAX with JSON data.
|
24
|
+
For this reason a shortcut is provided.
|
25
|
+
|
26
|
+
$.jam_ajax('http://somewhere/data.json')
|
27
|
+
|
28
|
+
|
29
|
+
== TODO
|
30
|
+
|
31
|
+
Jam will likely witch from jQuery to Swizzle on the Javascript side in the future.
|
32
|
+
|
33
|
+
|
34
|
+
= License
|
35
|
+
|
36
|
+
Jam - Ruby/Javascript Templates
|
37
|
+
|
38
|
+
Copyright (c) 2007,2008 Tiger Ops
|
39
|
+
|
data/TODO
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
= TODO
|
2
|
+
|
3
|
+
== Tag Erasing
|
4
|
+
|
5
|
+
Add erase attribute, jam="erase" or erase="true" or other?
|
6
|
+
This will be used to to remove the tag from the xml/xhtml.
|
7
|
+
|
8
|
+
== Punt Adapter Support to Cherry?
|
9
|
+
|
10
|
+
It would be much easier to create cherry, and then use that
|
11
|
+
to provide different backend adapters.
|
12
|
+
|
13
|
+
I may limit direct support to Nokogiri and let Cherry handle
|
14
|
+
the others. Hpricot adapter works pretty well though (despite
|
15
|
+
the unit test bombing). So maybe support Hpricot directly too.
|
16
|
+
I'd like to support LibXML-Ruby directly since I helped with
|
17
|
+
that project for so long, but it's API is not quite as easy
|
18
|
+
to support. So... get Nokogiri working first at least.
|
19
|
+
|
20
|
+
|
21
|
+
|
22
|
+
|
data/bin/jam
ADDED
File without changes
|
data/demo/array.rb
ADDED
data/demo/attribute.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'jam'
|
2
|
+
|
3
|
+
tmpl = Jam::Template.new <<-END
|
4
|
+
<example id="a"></example>]
|
5
|
+
END
|
6
|
+
|
7
|
+
data = { 'a/@class' => "test" }
|
8
|
+
|
9
|
+
out = tmpl.render(data)
|
10
|
+
|
11
|
+
puts out
|
12
|
+
|
13
|
+
# nested example
|
14
|
+
|
15
|
+
tmpl = Jam::Template.new <<-END
|
16
|
+
<example id="a"></example>]
|
17
|
+
END
|
18
|
+
|
19
|
+
data = { :a => { '@class' => "test" } }
|
20
|
+
|
21
|
+
out = tmpl.render(data)
|
22
|
+
|
23
|
+
puts out
|
24
|
+
|
@@ -0,0 +1,19 @@
|
|
1
|
+
---
|
2
|
+
|
3
|
+
- data:
|
4
|
+
a: A
|
5
|
+
b: B
|
6
|
+
template:
|
7
|
+
<x><y><m id="a">dummy</m><n id="b">dummy</n></y></x>
|
8
|
+
result:
|
9
|
+
<x><y><m id="a">A</m><n id="b">B</n></y></x>
|
10
|
+
|
11
|
+
- data:
|
12
|
+
a: [ A, B, C ]
|
13
|
+
template:
|
14
|
+
<x><y><m id="a">dummy</m></y></x>
|
15
|
+
result:
|
16
|
+
<x><y><m id="a">A</m><m id="a">B</m><m id="a">C</m></y></x>
|
17
|
+
|
18
|
+
|
19
|
+
|
@@ -0,0 +1,41 @@
|
|
1
|
+
= Jam Template Interpolation
|
2
|
+
|
3
|
+
Load the template library.
|
4
|
+
|
5
|
+
require 'jam'
|
6
|
+
|
7
|
+
== Hash
|
8
|
+
|
9
|
+
Template rendering with a basic hash.
|
10
|
+
|
11
|
+
tmpl = Jam::Template.new <<-EOS
|
12
|
+
<x><y><m id="a">dummy</m><n id="b">dummy</n></y></x>
|
13
|
+
EOS
|
14
|
+
|
15
|
+
data = {
|
16
|
+
:a => "A",
|
17
|
+
:b => "B"
|
18
|
+
}
|
19
|
+
|
20
|
+
out = tmpl.expand(data).gsub(/\n\s*/,'')
|
21
|
+
|
22
|
+
out.should == %{<x><y><m id="a">A</m><n id="b">B</n></y></x>}
|
23
|
+
|
24
|
+
== Lists
|
25
|
+
|
26
|
+
Template rendering with an Array.
|
27
|
+
|
28
|
+
tmpl = Jam::Template.new <<-EOS
|
29
|
+
<x><y><m id="a">dummy</m></y></x>
|
30
|
+
EOS
|
31
|
+
|
32
|
+
data = {
|
33
|
+
:a => [ "A", "B", "C" ]
|
34
|
+
}
|
35
|
+
|
36
|
+
out = tmpl.expand(data).gsub(/\n\s*/,'')
|
37
|
+
|
38
|
+
out.should == %{<x><y><m id="a">A</m><m id="a">B</m><m id="a">C</m></y></x>}
|
39
|
+
|
40
|
+
QED.
|
41
|
+
|
@@ -0,0 +1,41 @@
|
|
1
|
+
= Jam Template Interpolation
|
2
|
+
|
3
|
+
Load the template library.
|
4
|
+
|
5
|
+
require 'jam'
|
6
|
+
|
7
|
+
== Hash
|
8
|
+
|
9
|
+
Template rendering with a basic hash.
|
10
|
+
|
11
|
+
tmpl = Jam::Template.new <<-EOS
|
12
|
+
<x><y><m id="a">dummy</m><n id="b">dummy</n></y></x>
|
13
|
+
EOS
|
14
|
+
|
15
|
+
data = {
|
16
|
+
:a => "A",
|
17
|
+
:b => "B"
|
18
|
+
}
|
19
|
+
|
20
|
+
out = tmpl.expand(data).gsub(/\n\s*/,'')
|
21
|
+
|
22
|
+
out.should == %{<x><y><m id="a">A</m><n id="b">B</n></y></x>}
|
23
|
+
|
24
|
+
== Lists
|
25
|
+
|
26
|
+
Template rendering with an Array.
|
27
|
+
|
28
|
+
tmpl = Jam::Template.new <<-EOS
|
29
|
+
<x><y><m id="a">dummy</m></y></x>
|
30
|
+
EOS
|
31
|
+
|
32
|
+
data = {
|
33
|
+
:a => [ "A", "B", "C" ]
|
34
|
+
}
|
35
|
+
|
36
|
+
out = tmpl.expand(data).gsub(/\n\s*/,'')
|
37
|
+
|
38
|
+
out.should == %{<x><y><m id="a">A</m><m id="a">B</m><m id="a">C</m></y></x>}
|
39
|
+
|
40
|
+
QED.
|
41
|
+
|
@@ -0,0 +1,28 @@
|
|
1
|
+
= Jam Template Interpolation
|
2
|
+
|
3
|
+
Load the template library.
|
4
|
+
|
5
|
+
require 'jam'
|
6
|
+
|
7
|
+
== Nokogiri
|
8
|
+
|
9
|
+
Run samples through Nokogiri adapter.
|
10
|
+
|
11
|
+
table('samples.yaml') do |sample|
|
12
|
+
tmp = Jam::Template.new(sample['template'])
|
13
|
+
out = tmp.expand(sample['data']).gsub(/\n\s*/,'')
|
14
|
+
out.should == sample['result']
|
15
|
+
end
|
16
|
+
|
17
|
+
== Hpricot
|
18
|
+
|
19
|
+
Run samples through Hpricot adapter.
|
20
|
+
|
21
|
+
table('samples.yaml') do |sample|
|
22
|
+
tmp = Jam::Template.new(sample['template'])
|
23
|
+
out = tmp.expand(sample['data']).gsub(/\n\s*/,'')
|
24
|
+
out.should == sample['result']
|
25
|
+
end
|
26
|
+
|
27
|
+
QED.
|
28
|
+
|
@@ -0,0 +1,150 @@
|
|
1
|
+
= Unit Tests for Jam Hpricot Adapter
|
2
|
+
|
3
|
+
Require adapter.
|
4
|
+
|
5
|
+
require "jam/hpricot"
|
6
|
+
|
7
|
+
This automatically requires 'hpricot' too.
|
8
|
+
|
9
|
+
== Jam::Hpricot
|
10
|
+
|
11
|
+
Support objects for following tests.
|
12
|
+
|
13
|
+
@xml = "<root><a>A</a><b>B</b><c>C</c></root>"
|
14
|
+
@eng = Jam::Hpricot.new
|
15
|
+
|
16
|
+
BEFORE: We will resuse this XML document.
|
17
|
+
|
18
|
+
before {
|
19
|
+
@doc = @eng.document(@xml)
|
20
|
+
}
|
21
|
+
|
22
|
+
=== #append
|
23
|
+
|
24
|
+
Append should be able to append an XML node.
|
25
|
+
|
26
|
+
node = @doc.search('root')
|
27
|
+
node2 = node.search('a').dup
|
28
|
+
|
29
|
+
@eng.append(node, node2)
|
30
|
+
|
31
|
+
out = node.to_s.gsub(/\n\s*/,'')
|
32
|
+
out.should == '<root><a>A</a><b>B</b><c>C</c><a>A</a></root>'
|
33
|
+
|
34
|
+
Append should be able to append a set of nodes.
|
35
|
+
|
36
|
+
node = @doc.search('root')
|
37
|
+
nodeset = @doc.search('root/*')
|
38
|
+
|
39
|
+
@eng.append(node, nodeset)
|
40
|
+
|
41
|
+
out = node.to_s.gsub(/\n\s*/,'')
|
42
|
+
out.should == '<root><a>A</a><b>B</b><c>C</c><a>A</a><b>B</b><c>C</c></root>'
|
43
|
+
|
44
|
+
Append should be able to append an XML text fragment.
|
45
|
+
|
46
|
+
node = @doc.search('root')
|
47
|
+
|
48
|
+
@eng.append(node, '<d>D</d>')
|
49
|
+
|
50
|
+
out = node.to_s.gsub(/\n\s*/,'')
|
51
|
+
out.should == '<root><a>A</a><b>B</b><c>C</c><d>D</d></root>'
|
52
|
+
|
53
|
+
=== #replace_content_with_text
|
54
|
+
|
55
|
+
It should replace node children with given text.
|
56
|
+
|
57
|
+
node = @doc.search('root')
|
58
|
+
|
59
|
+
@eng.replace_content_with_text(node, 'H')
|
60
|
+
|
61
|
+
out = node.to_s.gsub(/\n\s*/,'')
|
62
|
+
out.should == '<root>H</root>'
|
63
|
+
|
64
|
+
It should be able to replace the children of each node of a NodeSet with text.
|
65
|
+
|
66
|
+
node = @doc.root
|
67
|
+
nodeset = @doc.root.children
|
68
|
+
|
69
|
+
@eng.replace_content_with_text(nodeset, 'H')
|
70
|
+
|
71
|
+
out = node.to_s.gsub(/\n\s*/,'')
|
72
|
+
out.should == '<root><a>H</a><b>H</b><c>H</c></root>'
|
73
|
+
|
74
|
+
=== #cleanup
|
75
|
+
|
76
|
+
This will clean a document, or node, of any elements that request it.
|
77
|
+
|
78
|
+
doc = @eng.document('<root><a jam="erase">This is text.</a></root>')
|
79
|
+
|
80
|
+
@eng.cleanup(doc)
|
81
|
+
|
82
|
+
out = doc.root.to_s.gsub(/\n\s*/,'')
|
83
|
+
out.should == '<root>This is text.</root>'
|
84
|
+
|
85
|
+
|
86
|
+
== Hpricot::Doc
|
87
|
+
|
88
|
+
=== #jam
|
89
|
+
|
90
|
+
Jam data into a Hpricot Document.
|
91
|
+
|
92
|
+
xml = Hpricot(%{
|
93
|
+
<root><x><m id="a">dummy</m><n id="b">dummy</n></x></root>
|
94
|
+
})
|
95
|
+
|
96
|
+
data = {
|
97
|
+
:a => "A",
|
98
|
+
:b => "B"
|
99
|
+
}
|
100
|
+
|
101
|
+
out = xml.jam(data)
|
102
|
+
out = out.root.to_s.gsub(/\n\s*/,'')
|
103
|
+
|
104
|
+
out.should == %{<root><x><m id="a">A</m><n id="b">B</n></x></root>}
|
105
|
+
|
106
|
+
== Hpricot::Elem
|
107
|
+
|
108
|
+
=== #jam
|
109
|
+
|
110
|
+
Jam data into a Hpricot Node.
|
111
|
+
|
112
|
+
xml = Hpricot(%{
|
113
|
+
<root><x><m id="a">dummy</m><n id="b">dummy</n></x></root>
|
114
|
+
})
|
115
|
+
|
116
|
+
node = xml.root
|
117
|
+
|
118
|
+
data = {
|
119
|
+
:a => "A",
|
120
|
+
:b => "B"
|
121
|
+
}
|
122
|
+
|
123
|
+
out = node.jam(data)
|
124
|
+
out = out.to_s.gsub(/\n\s*/,'')
|
125
|
+
|
126
|
+
out.should == %{<root><x><m id="a">A</m><n id="b">B</n></x></root>}
|
127
|
+
|
128
|
+
== Hpricot::Elements
|
129
|
+
|
130
|
+
=== #jam
|
131
|
+
|
132
|
+
Jam data into a Hpricot Elements.
|
133
|
+
|
134
|
+
xml = Hpricot(%{
|
135
|
+
<root><x><m id="a" class="q">dummy</m><n id="b" class="q">dummy</n></x></root>
|
136
|
+
})
|
137
|
+
|
138
|
+
nodeset = xml.search('.q')
|
139
|
+
|
140
|
+
p nodeset.search('#a')
|
141
|
+
|
142
|
+
data = { :a => "A", :b => "B" }
|
143
|
+
|
144
|
+
out = nodeset.jam(data)
|
145
|
+
out = out.to_s.gsub(/\n\s*/,'')
|
146
|
+
|
147
|
+
out.should == %{<m class="q" id="a">A</m><n class="q" id="b">B</n>}
|
148
|
+
|
149
|
+
QED.
|
150
|
+
|