commaparty 0.0.1pre → 0.0.1
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.
- checksums.yaml +4 -4
- data/.travis.yml +5 -0
- data/README.md +23 -31
- data/Rakefile +5 -0
- data/commaparty.gemspec +1 -0
- data/lib/commaparty/destructure_element.rb +6 -14
- data/lib/commaparty/markup.rb +26 -14
- data/lib/commaparty/parse_attributes.rb +17 -0
- data/lib/commaparty/parse_body.rb +30 -0
- data/lib/commaparty/parse_tag.rb +6 -2
- data/lib/commaparty/version.rb +1 -1
- data/lib/commaparty/xml.rb +2 -9
- data/lib/commaparty.rb +4 -0
- data/spec/commaparty/destructure_element_spec.rb +26 -12
- data/spec/commaparty/markup_spec.rb +40 -8
- data/spec/commaparty/parse_attributes_spec.rb +21 -0
- data/spec/commaparty/parse_body_spec.rb +36 -0
- data/spec/commaparty/parse_tag_spec.rb +24 -12
- data/spec/commaparty_spec.rb +48 -0
- metadata +27 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fb1260fe51a78f3ddb15ecaf6dde6b7bf4454153
|
4
|
+
data.tar.gz: 20b13794581d73bc1c5320e13823db4f9110785e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d740c51a965cb0432cf7115707abedcb8865f855460aa527eab4688e9678b553be9143898919799e17f889fd30d22f8db462c939a4ae43675ec6768d64b84e06
|
7
|
+
data.tar.gz: 79977c9adcd41ff2140d07156ad2f9874d54e1b4c8edffc062027765292c2388335ba63f8c5aad710582b9a7e7290d16f4efb2dc29fe3659f897fa422bdd8ef1
|
data/.travis.yml
ADDED
data/README.md
CHANGED
@@ -1,9 +1,12 @@
|
|
1
1
|
CommaParty
|
2
2
|
======
|
3
|
+
[](https://travis-ci.org/ecmendenhall/commaparty)
|
4
|
+
|
3
5
|
CommaParty is a Ruby implementation of Clojure's
|
4
6
|
[Hiccup](https://github.com/weavejester/hiccup/) HTML generation library.
|
5
7
|
It uses arrays to represent elements, and hashes to represent an element's
|
6
|
-
attributes. Unlike in Clojure, you have to use a lot of commas everywhere
|
8
|
+
attributes. Unlike in Clojure, you have to use a lot of commas everywhere all
|
9
|
+
the time.
|
7
10
|
|
8
11
|
Install
|
9
12
|
-------
|
@@ -25,42 +28,31 @@ Syntax
|
|
25
28
|
Here is a basic example of commaparty syntax:
|
26
29
|
|
27
30
|
```ruby
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
"<span class=\"foo\">bar</span>"
|
31
|
+
[1] pry(main)> require 'commaparty'
|
32
|
+
=> true
|
33
|
+
[2] pry(main)> CommaParty.markup([:span, {class: "foo"}, "bar"])
|
34
|
+
=> "<span class=\"foo\">bar</span>"
|
32
35
|
```
|
33
36
|
|
34
|
-
The first element of the
|
35
|
-
attribute can optionally be a
|
37
|
+
The first element of the array is used as the element name. The second
|
38
|
+
attribute can optionally be a hash, in which case it is used to supply
|
36
39
|
the element's attributes. Every other element is considered part of the
|
37
40
|
tag's body.
|
38
41
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
```clojure
|
43
|
-
user=> (html [:script])
|
44
|
-
"<script></script>"
|
45
|
-
user=> (html [:p])
|
46
|
-
"<p />"
|
47
|
-
```
|
42
|
+
It provides a CSS-like shortcut for denoting `id` and `class`
|
43
|
+
attributes:
|
48
44
|
|
49
|
-
|
50
|
-
|
45
|
+
```ruby
|
46
|
+
[1] pry(main)> CommaParty.markup([:'div#foo.bar.baz', "bang"])
|
47
|
+
=> "<div class=\"bar baz\" id=\"foo\">bang</div>"
|
48
|
+
```
|
51
49
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
```
|
50
|
+
If the body of the element is an array, its contents will be expanded out
|
51
|
+
into the element body. This makes working with methods like `map` more
|
52
|
+
convenient:
|
56
53
|
|
57
|
-
If the body of the element is a seq, its contents will be expanded out
|
58
|
-
into the element body. This makes working with forms like `map` and
|
59
|
-
`for` more convenient:
|
60
54
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
"<ul><li>1</li><li>2</li><li>3</li></ul>"
|
66
|
-
```
|
55
|
+
```ruby
|
56
|
+
[2] pry(main)> CommaParty.markup([:ul, (1..4).map {|n| [:li, n]}])
|
57
|
+
=> "<ul>\n<li>1</li>\n<li>2</li>\n<li>3</li>\n<li>4</li>\n</ul>"
|
58
|
+
```
|
data/Rakefile
CHANGED
data/commaparty.gemspec
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'commaparty/parse_attributes'
|
2
|
+
require 'commaparty/parse_body'
|
1
3
|
require 'commaparty/parse_tag'
|
2
4
|
|
3
5
|
module CommaParty
|
@@ -14,22 +16,12 @@ module CommaParty
|
|
14
16
|
private
|
15
17
|
|
16
18
|
def normalize_element(element)
|
17
|
-
tag, tag_attributes = CommaParty::ParseTag.new(element
|
18
|
-
|
19
|
-
|
19
|
+
tag, tag_attributes = CommaParty::ParseTag.new(element).call
|
20
|
+
attributes = CommaParty::ParseAttributes.new(element).call
|
21
|
+
body = CommaParty::ParseBody.new(element).call
|
20
22
|
[tag,
|
21
23
|
attributes.merge(tag_attributes),
|
22
|
-
|
23
|
-
end
|
24
|
-
|
25
|
-
def safe_tagname(tag)
|
26
|
-
"#{tag.to_s}_".to_sym
|
27
|
-
end
|
28
|
-
|
29
|
-
def attribute(element)
|
30
|
-
if element.first && element.first.is_a?(Hash)
|
31
|
-
element.shift
|
32
|
-
end
|
24
|
+
body]
|
33
25
|
end
|
34
26
|
|
35
27
|
end
|
data/lib/commaparty/markup.rb
CHANGED
@@ -4,32 +4,44 @@ require 'commaparty/destructure_element'
|
|
4
4
|
module CommaParty
|
5
5
|
class Markup
|
6
6
|
|
7
|
-
def initialize(
|
8
|
-
@hiccup = hiccup
|
7
|
+
def initialize(hiccup)
|
8
|
+
@hiccup = [hiccup]
|
9
9
|
end
|
10
10
|
|
11
11
|
def call
|
12
|
-
build(
|
12
|
+
build(@hiccup).doc.to_html
|
13
|
+
end
|
14
|
+
|
15
|
+
def builder
|
16
|
+
build(@hiccup)
|
17
|
+
end
|
18
|
+
|
19
|
+
def hiccup
|
20
|
+
@hiccup.flatten(1)
|
13
21
|
end
|
14
22
|
|
15
23
|
private
|
16
24
|
|
17
|
-
def build(
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
create_child(root, element)
|
22
|
-
end
|
25
|
+
def build(elements)
|
26
|
+
Nokogiri::XML::Builder.new do |doc|
|
27
|
+
elements.each do |element|
|
28
|
+
create_child(doc, element)
|
23
29
|
end
|
24
|
-
end
|
30
|
+
end
|
25
31
|
end
|
26
32
|
|
27
33
|
def create_child(node, element)
|
28
34
|
tag, attributes, children = CommaParty::DestructureElement.new(element).call
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
35
|
+
node.send(tag, attributes) {|n| make_nodes(n, children) }
|
36
|
+
end
|
37
|
+
|
38
|
+
def make_nodes(parent, children)
|
39
|
+
children.each do |child|
|
40
|
+
if child.is_a?(String) || child.is_a?(Fixnum) || child.nil?
|
41
|
+
parent << child.to_s
|
42
|
+
else
|
43
|
+
create_child(parent, child)
|
44
|
+
end
|
33
45
|
end
|
34
46
|
end
|
35
47
|
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module CommaParty
|
2
|
+
class ParseBody
|
3
|
+
|
4
|
+
def initialize(element)
|
5
|
+
@element = element
|
6
|
+
end
|
7
|
+
|
8
|
+
def call
|
9
|
+
if nested?
|
10
|
+
body.flatten(1)
|
11
|
+
else
|
12
|
+
body
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def body
|
17
|
+
@body ||=
|
18
|
+
if @element[1].is_a?(Hash)
|
19
|
+
@element[2..-1]
|
20
|
+
else
|
21
|
+
@element[1..-1]
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def nested?
|
26
|
+
body[0].is_a?(Array) && !body[0][0].is_a?(Symbol)
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
data/lib/commaparty/parse_tag.rb
CHANGED
@@ -2,11 +2,11 @@ module CommaParty
|
|
2
2
|
class ParseTag
|
3
3
|
|
4
4
|
def initialize(tag)
|
5
|
-
@tag = tag
|
5
|
+
@tag = tag[0]
|
6
6
|
end
|
7
7
|
|
8
8
|
def call
|
9
|
-
[
|
9
|
+
[safe_tag_name, attributes]
|
10
10
|
end
|
11
11
|
|
12
12
|
private
|
@@ -32,5 +32,9 @@ module CommaParty
|
|
32
32
|
@tag.to_s.match(/([^\.,#,\b]+)/).captures.first.to_sym
|
33
33
|
end
|
34
34
|
|
35
|
+
def safe_tag_name
|
36
|
+
"#{tag_name.to_s}_".to_sym
|
37
|
+
end
|
38
|
+
|
35
39
|
end
|
36
40
|
end
|
data/lib/commaparty/version.rb
CHANGED
data/lib/commaparty/xml.rb
CHANGED
@@ -9,20 +9,13 @@ module CommaParty
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def initialize(markup)
|
12
|
-
@markup = CommaParty::Markup.new(markup)
|
12
|
+
@markup = CommaParty::Markup.new(markup)
|
13
13
|
end
|
14
14
|
|
15
15
|
def call
|
16
|
-
|
16
|
+
@markup.builder.to_xml
|
17
17
|
end
|
18
18
|
|
19
|
-
private
|
20
|
-
|
21
|
-
def build(markup)
|
22
|
-
Nokogiri::XML::Builder.new do |doc|
|
23
|
-
doc << markup
|
24
|
-
end.to_xml
|
25
|
-
end
|
26
19
|
end
|
27
20
|
|
28
21
|
end
|
data/lib/commaparty.rb
CHANGED
@@ -5,38 +5,52 @@ describe CommaParty::DestructureElement do
|
|
5
5
|
|
6
6
|
describe 'Normalizing elements' do
|
7
7
|
it 'destructures an element with tag only' do
|
8
|
-
tag, attributes,
|
8
|
+
tag, attributes, body = described_class.new([:lol]).call
|
9
9
|
expect(tag).to eq(:lol_)
|
10
10
|
expect(attributes).to eq({})
|
11
|
-
expect(
|
11
|
+
expect(body).to eq([])
|
12
12
|
end
|
13
13
|
|
14
|
-
it 'destructures an element with tag, attributes, and
|
15
|
-
tag, attributes,
|
14
|
+
it 'destructures an element with tag, attributes, and body' do
|
15
|
+
tag, attributes, body = described_class.new([:lol, {id: "the-id"}, "lol"]).call
|
16
16
|
expect(tag).to eq(:lol_)
|
17
17
|
expect(attributes).to eq({id: "the-id"})
|
18
|
-
expect(
|
18
|
+
expect(body).to eq(["lol"])
|
19
19
|
end
|
20
20
|
|
21
21
|
it 'destructures an element with tag and attributes only' do
|
22
|
-
tag, attributes,
|
22
|
+
tag, attributes, body = described_class.new([:lol, {id: "the-id"}]).call
|
23
23
|
expect(tag).to eq(:lol_)
|
24
24
|
expect(attributes).to eq({id: "the-id"})
|
25
|
-
expect(
|
25
|
+
expect(body).to eq([])
|
26
26
|
end
|
27
27
|
|
28
|
-
it 'destructures an element with tag and
|
29
|
-
tag, attributes,
|
28
|
+
it 'destructures an element with tag and body only' do
|
29
|
+
tag, attributes, body = described_class.new([:lol, 'wut']).call
|
30
30
|
expect(tag).to eq(:lol_)
|
31
31
|
expect(attributes).to eq({})
|
32
|
-
expect(
|
32
|
+
expect(body).to eq(['wut'])
|
33
33
|
end
|
34
34
|
|
35
35
|
it 'destructures an element with sibling children' do
|
36
|
-
tag, attributes,
|
36
|
+
tag, attributes, body = described_class.new([:lol, {}, [:div, {lol: 'wut'}], [:ul], [:other]]).call
|
37
37
|
expect(tag).to eq(:lol_)
|
38
38
|
expect(attributes).to eq({})
|
39
|
-
expect(
|
39
|
+
expect(body).to eq([[:div, {lol: 'wut'}], [:ul], [:other]])
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'destructures an element with an array of children' do
|
43
|
+
tag, attributes, body = described_class.new([:ul, ["one", "two", "three"].map {|n| [:li, n]}]).call
|
44
|
+
expect(tag).to eq(:ul_)
|
45
|
+
expect(attributes).to eq({})
|
46
|
+
expect(body).to eq([[:li, "one"], [:li, "two"], [:li, "three"]])
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'destructures an element with a tag in the body' do
|
50
|
+
tag, attributes, body = described_class.new([:p, [:em, "hello"]]).call
|
51
|
+
expect(tag).to eq(:p_)
|
52
|
+
expect(attributes).to eq({})
|
53
|
+
expect(body).to eq([[:em, "hello"]])
|
40
54
|
end
|
41
55
|
end
|
42
56
|
end
|
@@ -7,37 +7,69 @@ describe CommaParty::Markup do
|
|
7
7
|
|
8
8
|
it 'generates a single tag' do
|
9
9
|
html = described_class.new([:tag]).call
|
10
|
-
expect(html).to eq("<tag></tag
|
10
|
+
expect(html).to eq("<tag></tag>\n")
|
11
11
|
end
|
12
12
|
|
13
13
|
it 'generates a single tag with an attribute' do
|
14
14
|
html = described_class.new([:tag, {attribute: 'something'}]).call
|
15
|
-
expect(html).to eq("<tag attribute=\"something\"></tag
|
15
|
+
expect(html).to eq("<tag attribute=\"something\"></tag>\n")
|
16
16
|
end
|
17
17
|
|
18
18
|
it 'generates a single tag with a value' do
|
19
19
|
html = described_class.new([:tag, 'value']).call
|
20
|
-
expect(html).to eq("<tag>value</tag
|
20
|
+
expect(html).to eq("<tag>value</tag>\n")
|
21
21
|
end
|
22
22
|
|
23
23
|
it 'generates two sibling tags' do
|
24
|
-
html = described_class.new([:tag1], [:tag2]).call
|
25
|
-
expect(html).to eq("<tag1></tag1><tag2></tag2
|
24
|
+
html = described_class.new([:div, [:tag1], [:tag2]]).call
|
25
|
+
expect(html).to eq("<div>\n<tag1></tag1><tag2></tag2>\n</div>\n")
|
26
26
|
end
|
27
27
|
|
28
28
|
it 'generates nested tags' do
|
29
29
|
html = described_class.new([:theparent, [:tag1], [:tag2]]).call
|
30
|
-
expect(html).to eq("<theparent><tag1></tag1><tag2></tag2></theparent
|
30
|
+
expect(html).to eq("<theparent><tag1></tag1><tag2></tag2></theparent>\n")
|
31
31
|
end
|
32
32
|
|
33
33
|
it 'handles tags with the same names as ruby methods' do
|
34
34
|
html = described_class.new([:parent]).call
|
35
|
-
expect(html).to eq("<parent></parent
|
35
|
+
expect(html).to eq("<parent></parent>\n")
|
36
36
|
end
|
37
37
|
|
38
38
|
it 'handles tags with shortcut syntax' do
|
39
39
|
html = described_class.new([:'tag.one.two.three#id']).call
|
40
|
-
expect(html).to eq("<tag class=\"one two three\" id=\"id\"></tag
|
40
|
+
expect(html).to eq("<tag class=\"one two three\" id=\"id\"></tag>\n")
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'handles seqs in the tag body' do
|
44
|
+
html = described_class.new([:ul, ["one", "two", "three"].map {|n| [:li, n]}]).call
|
45
|
+
expect(html).to eq("<ul>\n<li>one</li>\n<li>two</li>\n<li>three</li>\n</ul>\n")
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'handles nils in the tag body' do
|
49
|
+
html = described_class.new([:div, nil]).call
|
50
|
+
expect(html).to eq("<div></div>\n")
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
describe 'Generating builders' do
|
55
|
+
|
56
|
+
it 'returns a Nokogiri builder' do
|
57
|
+
builder = described_class.new([:div]).builder
|
58
|
+
expect(builder.class).to eq(Nokogiri::XML::Builder)
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'produces the same XML' do
|
62
|
+
markup = described_class.new([:div, [:span, 'lol']])
|
63
|
+
expect(markup.builder.doc.to_html).to eq(markup.call)
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
|
68
|
+
describe 'Retrieving hiccup' do
|
69
|
+
|
70
|
+
it 'returns its hiccup' do
|
71
|
+
hiccup = described_class.new([:div, [:ul, (1..3).map {|n| [:li, n]}]]).hiccup
|
72
|
+
expect(hiccup).to eq([:div, [:ul, [[:li, 1], [:li, 2], [:li, 3]]]])
|
41
73
|
end
|
42
74
|
|
43
75
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'rspec'
|
2
|
+
require 'commaparty/parse_attributes'
|
3
|
+
|
4
|
+
describe CommaParty::ParseAttributes do
|
5
|
+
|
6
|
+
it 'extracts attributes when explicitly included' do
|
7
|
+
attributes = described_class.new([:tag, {attribute: 'value'}]).call
|
8
|
+
expect(attributes).to eq({attribute: 'value'})
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'extracts attributes when not explicitly included' do
|
12
|
+
attributes = described_class.new([:tag]).call
|
13
|
+
expect(attributes).to eq({})
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'extracts default attributes when the tag has a body' do
|
17
|
+
attributes = described_class.new([:tag, 'body']).call
|
18
|
+
expect(attributes).to eq({})
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'rspec'
|
2
|
+
require 'commaparty/parse_body'
|
3
|
+
|
4
|
+
describe CommaParty::ParseBody do
|
5
|
+
|
6
|
+
it 'returns [] for tags with no body' do
|
7
|
+
body = described_class.new([:tag]).call
|
8
|
+
expect(body).to eq([])
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'returns the body for tags with a body' do
|
12
|
+
body = described_class.new([:tag, 'body']).call
|
13
|
+
expect(body).to eq(['body'])
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'returns [] for tags with attributes and no body' do
|
17
|
+
body = described_class.new([:tag, {}]).call
|
18
|
+
expect(body).to eq([])
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'returns the body for tags with attributes and a body' do
|
22
|
+
body = described_class.new([:tag, {}, 'body']).call
|
23
|
+
expect(body).to eq(['body'])
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'returns the body for tags with attributes and a body' do
|
27
|
+
body = described_class.new([:p, [:em, "hello"]]).call
|
28
|
+
expect(body).to eq([[:em, 'hello']])
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'returns the body for tags with attributes and a body' do
|
32
|
+
body = described_class.new([:p, "Hello ", [:em, "World!"]]).call
|
33
|
+
expect(body).to eq(["Hello ", [:em, "World!"]])
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
@@ -6,40 +6,52 @@ describe CommaParty::ParseTag do
|
|
6
6
|
describe 'Tag shortcuts' do
|
7
7
|
|
8
8
|
it 'parses tags without shortcut syntax' do
|
9
|
-
tag, attributes = described_class.new(:boring).call
|
10
|
-
expect(tag).to eq(:
|
9
|
+
tag, attributes = described_class.new([:boring]).call
|
10
|
+
expect(tag).to eq(:boring_)
|
11
11
|
expect(attributes).to eq({})
|
12
12
|
end
|
13
13
|
|
14
14
|
it 'parses tags with a class shortcut' do
|
15
|
-
tag, attributes = described_class.new(:'exciting.class').call
|
16
|
-
expect(tag).to eq(:
|
15
|
+
tag, attributes = described_class.new([:'exciting.class']).call
|
16
|
+
expect(tag).to eq(:exciting_)
|
17
17
|
expect(attributes).to eq({class: 'class'})
|
18
18
|
end
|
19
19
|
|
20
20
|
it 'parses tags with an id shortcut' do
|
21
|
-
tag, attributes = described_class.new(:'exciting#id').call
|
22
|
-
expect(tag).to eq(:
|
21
|
+
tag, attributes = described_class.new([:'exciting#id']).call
|
22
|
+
expect(tag).to eq(:exciting_)
|
23
23
|
expect(attributes).to eq({id: 'id'})
|
24
24
|
end
|
25
25
|
|
26
26
|
it 'parses tags with a class shortcut and id shortcut' do
|
27
|
-
tag, attributes = described_class.new(:'exciting.class#id').call
|
28
|
-
expect(tag).to eq(:
|
27
|
+
tag, attributes = described_class.new([:'exciting.class#id']).call
|
28
|
+
expect(tag).to eq(:exciting_)
|
29
29
|
expect(attributes).to eq({class: 'class', id: 'id'})
|
30
30
|
end
|
31
31
|
|
32
32
|
it 'handles different orders' do
|
33
|
-
tag, attributes = described_class.new(:'exciting#id.class').call
|
34
|
-
expect(tag).to eq(:
|
33
|
+
tag, attributes = described_class.new([:'exciting#id.class']).call
|
34
|
+
expect(tag).to eq(:exciting_)
|
35
35
|
expect(attributes).to eq({class: 'class', id: 'id'})
|
36
36
|
end
|
37
37
|
|
38
38
|
it 'handles multiple classes' do
|
39
|
-
tag, attributes = described_class.new(:'exciting.one.two').call
|
40
|
-
expect(tag).to eq(:
|
39
|
+
tag, attributes = described_class.new([:'exciting.one.two']).call
|
40
|
+
expect(tag).to eq(:exciting_)
|
41
41
|
expect(attributes).to eq({class: 'one two'})
|
42
42
|
end
|
43
|
+
|
44
|
+
it 'handles tags with attributes' do
|
45
|
+
tag, attributes = described_class.new([:tag, {}]).call
|
46
|
+
expect(tag).to eq(:tag_)
|
47
|
+
expect(attributes).to eq({})
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'handles tags with attributes and values' do
|
51
|
+
tag, attributes = described_class.new([:tag, {}, 'value']).call
|
52
|
+
expect(tag).to eq(:tag_)
|
53
|
+
expect(attributes).to eq({})
|
54
|
+
end
|
43
55
|
end
|
44
56
|
|
45
57
|
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'commaparty'
|
2
|
+
|
3
|
+
describe CommaParty do
|
4
|
+
|
5
|
+
it 'has a helpful html method' do
|
6
|
+
expect(CommaParty.html([:tag])).to match("<html><tag></tag></html>\n")
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'has a helpful xml method' do
|
10
|
+
expect(CommaParty.xml([:tag])).to match("<tag/>\n")
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'has a helpful markup method' do
|
14
|
+
expect(CommaParty.markup([:tag])).to match("<tag></tag>\n")
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'has a helpful builder method' do
|
18
|
+
builder = CommaParty.builder([:tag])
|
19
|
+
expect(builder.class).to eq(Nokogiri::XML::Builder)
|
20
|
+
expect(builder.doc.to_html).to eq(CommaParty.markup([:tag]))
|
21
|
+
end
|
22
|
+
|
23
|
+
context 'converts ruby syntax to html string' do
|
24
|
+
it { expect(CommaParty.markup [:script]).to eq "<script></script>\n" }
|
25
|
+
it { expect(CommaParty.markup [:p, "hello"]).to eq "<p>hello</p>\n" }
|
26
|
+
it { expect(CommaParty.markup [:p, [:em, "hello"]]).to eq "<p><em>hello</em></p>\n" }
|
27
|
+
it { expect(CommaParty.markup [:span, {:class => "foo"}, "bar"]).to eq "<span class=\"foo\">bar</span>\n" }
|
28
|
+
it { expect(CommaParty.markup [:div, {id: "email", class: "selected starred"}, "..."]).to eq "<div id=\"email\" class=\"selected starred\">...</div>\n" }
|
29
|
+
it { expect(CommaParty.markup [:a, {:href => "http://github.com"}, "GitHub"]).to eq "<a href=\"http://github.com\">GitHub</a>\n"}
|
30
|
+
|
31
|
+
context 'collections' do
|
32
|
+
it { expect(CommaParty.markup [:ul, ['a','b'].map { |x| [:li, x]}]).to eq "<ul>\n<li>a</li>\n<li>b</li>\n</ul>\n"}
|
33
|
+
it { expect(CommaParty.markup [:ul, (11...13).map { |n| [:li, n]}]).to eq "<ul>\n<li>11</li>\n<li>12</li>\n</ul>\n"}
|
34
|
+
end
|
35
|
+
|
36
|
+
context 'css shorthand' do
|
37
|
+
it { expect(CommaParty.markup [:'p.hi', "hello"]).to eq "<p class=\"hi\">hello</p>\n" }
|
38
|
+
it { expect(CommaParty.markup [:'p#hi', "hello"]).to eq "<p id=\"hi\">hello</p>\n" }
|
39
|
+
it { expect(CommaParty.markup [:'p.hi.greet.left', "hello"]).to eq "<p class=\"hi greet left\">hello</p>\n" }
|
40
|
+
it { expect(CommaParty.markup [:'p#hi.greet.left', "hello"]).to eq "<p class=\"greet left\" id=\"hi\">hello</p>\n" }
|
41
|
+
end
|
42
|
+
|
43
|
+
context 'different shaped trees' do
|
44
|
+
it { expect(CommaParty.markup [:p, "Hello ", [:em, "World!"]]).to eq "<p>Hello <em>World!</em></p>\n" }
|
45
|
+
it { expect(CommaParty.markup [:div, [:p, "Hello"], [:em, "World!"]]).to eq "<div>\n<p>Hello</p>\n<em>World!</em>\n</div>\n" }
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: commaparty
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Connor Mendenhall
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-03-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nokogiri
|
@@ -66,6 +66,20 @@ dependencies:
|
|
66
66
|
- - '>='
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: pry-nav
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - '>='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
69
83
|
description: A ruby implementation of Clojure's Hiccup markup generation library.
|
70
84
|
email:
|
71
85
|
- ecmendenhall@gmail.com
|
@@ -74,6 +88,7 @@ extensions: []
|
|
74
88
|
extra_rdoc_files: []
|
75
89
|
files:
|
76
90
|
- .gitignore
|
91
|
+
- .travis.yml
|
77
92
|
- Gemfile
|
78
93
|
- LICENSE.txt
|
79
94
|
- README.md
|
@@ -83,14 +98,19 @@ files:
|
|
83
98
|
- lib/commaparty/destructure_element.rb
|
84
99
|
- lib/commaparty/html.rb
|
85
100
|
- lib/commaparty/markup.rb
|
101
|
+
- lib/commaparty/parse_attributes.rb
|
102
|
+
- lib/commaparty/parse_body.rb
|
86
103
|
- lib/commaparty/parse_tag.rb
|
87
104
|
- lib/commaparty/version.rb
|
88
105
|
- lib/commaparty/xml.rb
|
89
106
|
- spec/commaparty/destructure_element_spec.rb
|
90
107
|
- spec/commaparty/html_spec.rb
|
91
108
|
- spec/commaparty/markup_spec.rb
|
109
|
+
- spec/commaparty/parse_attributes_spec.rb
|
110
|
+
- spec/commaparty/parse_body_spec.rb
|
92
111
|
- spec/commaparty/parse_tag_spec.rb
|
93
112
|
- spec/commaparty/xml_spec.rb
|
113
|
+
- spec/commaparty_spec.rb
|
94
114
|
homepage: https://github.com/ecmendenhall/commaparty
|
95
115
|
licenses:
|
96
116
|
- MIT
|
@@ -106,9 +126,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
106
126
|
version: '0'
|
107
127
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
108
128
|
requirements:
|
109
|
-
- - '
|
129
|
+
- - '>='
|
110
130
|
- !ruby/object:Gem::Version
|
111
|
-
version:
|
131
|
+
version: '0'
|
112
132
|
requirements: []
|
113
133
|
rubyforge_project:
|
114
134
|
rubygems_version: 2.0.3
|
@@ -119,5 +139,8 @@ test_files:
|
|
119
139
|
- spec/commaparty/destructure_element_spec.rb
|
120
140
|
- spec/commaparty/html_spec.rb
|
121
141
|
- spec/commaparty/markup_spec.rb
|
142
|
+
- spec/commaparty/parse_attributes_spec.rb
|
143
|
+
- spec/commaparty/parse_body_spec.rb
|
122
144
|
- spec/commaparty/parse_tag_spec.rb
|
123
145
|
- spec/commaparty/xml_spec.rb
|
146
|
+
- spec/commaparty_spec.rb
|