dolores-cml 0.3.0

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.
@@ -0,0 +1,25 @@
1
+ module CML
2
+ module Tags
3
+ class Option < Tag
4
+ Template = <<-HTML.freeze
5
+ <option {{value}} {{selected}}>{{label}}</option>
6
+ HTML
7
+
8
+ def wrapper(parsed)
9
+ parsed
10
+ end
11
+
12
+ def value
13
+ (@attrs["value"] || @attrs["label"]).to_s
14
+ end
15
+
16
+ def data
17
+ super.merge({
18
+ "value" => @attrs["value"] ? "value=\"#{@attrs["value"]}\"" : "",
19
+ "selected" => @attrs["selected"] ? "selected=\"selected\"" : "",
20
+ "label" => (@attrs["label"] || @cml.inner_html).to_s
21
+ })
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,29 @@
1
+ module CML
2
+ module Tags
3
+ class Radio < Tag
4
+ Template = <<-HTML.freeze
5
+ <label><input name="{{name}}" type="radio" value="{{value}}" class="{{classes}}" {{checked}}/> {{label}}</label>
6
+ HTML
7
+
8
+ #Radios should always be grouped, but for consistency with checkboxes, we check
9
+ def grouped?
10
+ @cml.parent && @cml.parent.name == "radios"
11
+ end
12
+
13
+ def wrapper(parsed)
14
+ grouped? ? parsed : super
15
+ end
16
+
17
+ def value
18
+ (@attrs["value"] || @attrs["label"]).to_s
19
+ end
20
+
21
+ def data
22
+ super.merge({
23
+ "checked" => @attrs["checked"] ? "checked=\"checked\"" : "",
24
+ "label" => @attrs["label"].to_s
25
+ })
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,24 @@
1
+ module CML
2
+ module Tags
3
+ class Radios < Tag
4
+ Template = <<-HTML.freeze
5
+ {{legend}}
6
+ {% for radio in radios %}
7
+ {{radio}}
8
+ {% endfor %}
9
+ HTML
10
+
11
+ def data
12
+ super.merge({"radios" => children})
13
+ end
14
+
15
+ def children
16
+ @cml.xpath("cml:radio").map do |c|
17
+ c["name"] ||= name
18
+ c["validates"] ||= @attrs["validates"].to_s
19
+ Radio.new(c, @opts)
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,42 @@
1
+ module CML
2
+ module Tags
3
+ class Ratings < Tag
4
+ Template = <<-HTML.freeze
5
+ {{label}}
6
+ <table>
7
+ <thead>
8
+ <tr>
9
+ <th></th>
10
+ {% for rating in ratings limit:10 %}
11
+ <th>{{forloop.index}}</th>
12
+ {% endfor %}
13
+ <th></th>
14
+ </tr>
15
+ </thead>
16
+ <tbody>
17
+ <tr>
18
+ <td>{{from}}</td>
19
+ {% for rating in ratings limit:10 %}
20
+ <td>{{rating}}</td>
21
+ {% endfor %}
22
+ <td>{{to}}</td>
23
+ </tr>
24
+ </tbody>
25
+ </table>
26
+ HTML
27
+
28
+ def data
29
+ super.merge({"ratings" => ratings, "from" => @attrs["from"].to_s, "to" => @attrs["to"].to_s})
30
+ end
31
+
32
+ def ratings
33
+ @cml.xpath("cml:rating").map do |c|
34
+ c["name"] ||= prefix
35
+ c["validates"] ||= @attrs["validates"]
36
+ c["value"] ||= @attrs["label"]
37
+ Radio.new(c).convert
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,23 @@
1
+ module CML
2
+ module Tags
3
+ class Select < Tag
4
+ Template = <<-HTML.freeze
5
+ {{label}}
6
+ <select name="{{name}}" class="{{classes}}">{% for option in options %}
7
+ {{option}}{% endfor %}
8
+ </select>
9
+ HTML
10
+
11
+ def children
12
+ default = @cml["default"] ? [Option.new("<cml:option value=\"\">#{@cml["default"]}</cml:option>", @opts)] : []
13
+ default + @cml.xpath("cml:option").map do |c|
14
+ Option.new(c, @opts)
15
+ end
16
+ end
17
+
18
+ def data
19
+ super.merge({"options" => children})
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,10 @@
1
+ module CML
2
+ module Tags
3
+ class Text < Tag
4
+ Template = <<-HTML.freeze
5
+ {{label}}
6
+ <input name="{{name}}" type="text" value="{{value}}" class="{{classes}}"/>
7
+ HTML
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ module CML
2
+ module Tags
3
+ class Textarea < Tag
4
+ Template = <<-HTML.freeze
5
+ {{label}}
6
+ <textarea name="{{name}}" class="{{classes}}">{{value}}</textarea>
7
+ HTML
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,21 @@
1
+ module CML
2
+ module Tags
3
+ class Unknown < Tag
4
+ Template = <<-HTML.freeze
5
+ {{content}}
6
+ HTML
7
+
8
+ def validate?
9
+ false
10
+ end
11
+
12
+ def wrapper_classes
13
+ super + " unknown"
14
+ end
15
+
16
+ def data
17
+ super.merge({"content" => @cml.inner_html})
18
+ end
19
+ end
20
+ end
21
+ end
data/lib/cml.rb ADDED
@@ -0,0 +1,9 @@
1
+ require 'rubygems'
2
+ require 'nokogiri'
3
+ require 'json'
4
+ require 'liquid'
5
+
6
+ require 'cml/parser'
7
+ require 'cml/liquid_filters'
8
+ require 'cml/tag'
9
+ Dir[File.dirname(__FILE__) + '/cml/tags/*.rb'].each {|dir| require dir }
@@ -0,0 +1,53 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe "CML Complex" do
4
+ it "parses" do
5
+ @p = Parser.new(File.read(File.dirname(__FILE__) + "/fixtures/complex.cml"), {:prefix => "u12345"})
6
+ @p.to_html.should sorta_match(<<-HTML)
7
+ <div class="cml" id="u12345">
8
+ <h1>This is my name</h1>
9
+ <p>This is a description about me</p>
10
+ <div class="select">
11
+ <label>Awesome</label>
12
+ <select name="u12345[awesome]" class="awesome validates-required">
13
+ <option value="">Choose an option</option>
14
+ <option>Awesome</option>
15
+ <option>Cool</option>
16
+ <option>Rad</option>
17
+ <option>Neat</option>
18
+ </select>
19
+ <p class="instructions">Just be cool about it</p>
20
+ </div>
21
+ <div class="text">
22
+ <label>Opinion</label>
23
+ <input name="u12345[opinion]" class="opinion validates-minLength:30 large" type="text" value="">
24
+ </div>
25
+ <div class="text">
26
+ <label>Email</label>
27
+ <input name="u12345[email]" class="email validates-required validates-email" type="text" value="">
28
+ </div>
29
+ <div class="rad">
30
+ <div class="checkbox">
31
+ <label><input name="u12345[you_sure]" class="you_sure" type="checkbox" value="yes"> You sure?</label>
32
+ </div>
33
+ </div>
34
+ <div class="group only-if:awesome">
35
+
36
+ <div class="checkboxes">
37
+ <h2 class="legend">Cool checkboxes</h2>
38
+
39
+ <label>
40
+ <input name="u12345[rad][]" class="rad" type="checkbox" value="Wanna do it?">
41
+ Wanna do it?</label>
42
+
43
+ <label>
44
+ <input name="u12345[rad][]" class="rad" type="checkbox" value="Sure?">
45
+ Sure?</label>
46
+ <p class=\"instructions\">This <i>is</i> cool</p>
47
+ </div>
48
+ <input type="hidden" name="u12345[secret]" value="cool" class="secret" />
49
+ </div>
50
+ </div>
51
+ HTML
52
+ end
53
+ end
@@ -0,0 +1,57 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
2
+ require File.expand_path(File.dirname(__FILE__) + "/../../lib/cml/converters/jsawesome")
3
+
4
+ describe "JSAwesome Converter" do
5
+ it "converts" do
6
+ json = "[[
7
+ [\"text_field\", \"default value\"],
8
+ [\"#text_area\", \"\"],
9
+ [\"single_select\", [\"boo\", \"~yah\"]],
10
+ [\"^check\", [\"One|totally_rad\", [\"two\",true], \"three\"]],
11
+ [\"*radio\", [\"a\", \"b\", [\"c\", true]]],
12
+ [\"_hidden\",\"hot\"],
13
+ [[\"^single_check\"],[\"^Edge|edge_case\", false]]
14
+ ],
15
+ {\"text_field\": \"JSAwesome\",
16
+ \"text_area\": {
17
+ \"required\":true,
18
+ \"validation\": [\"\\d+\", \"Field must contain atleast one digit\"],
19
+ \"label\": \"Input some text with atleast one digit\"
20
+ },
21
+ \"single_select\": {
22
+ \"required\":true
23
+ },
24
+ \"gold\": {
25
+ \"rando\": \"so_cool\",
26
+ \"check\": \"check_gold\",
27
+ \"_awesome_gold_strict\": true,
28
+ \"text_field\": \"awesome_gold\",
29
+ \"_awesome_gold_regex\": [\"\\\\.asdf\\\\.\", \"i\"]
30
+ }}]"
31
+ @c = Converters::JSAwesome.new(json)
32
+ @c.convert.should sorta_match(<<-HTML)
33
+ <cml:text name="text_field" label="JSAwesome" default="default value">
34
+ <gold src="awesome_gold" flags="i" regex="\\.asdf\\." strict="true" />
35
+ </cml:text>
36
+ <cml:textarea name="text_area" validates="required" label="Input some text with atleast one digit" />
37
+ <cml:select label="Single select" validates="required">
38
+ <cml:option label="Boo" />
39
+ <cml:option label="Yah" />
40
+ </cml:select>
41
+ <cml:checkboxes label="Check" gold="true">
42
+ <cml:checkbox label="One" name="totally_rad" />
43
+ <cml:checkbox label="Two" checked="true" />
44
+ <cml:checkbox label="Three" />
45
+ </cml:checkboxes>
46
+ <cml:radios label="Radio">
47
+ <cml:radio label="A" />
48
+ <cml:radio label="B" />
49
+ <cml:radio label="C" checked="true" />
50
+ </cml:radios>
51
+ <cml:hidden label="Hidden" value="hot" />
52
+ <cml:checkbox label="Single check" />
53
+ <cml:checkbox label="Edge" name="edge_case" default="false" />
54
+ <cml:meta name="rando" gold="so_cool"/>
55
+ HTML
56
+ end
57
+ end
@@ -0,0 +1,22 @@
1
+ <h1>This is my name</h1>
2
+ <p>This is a description about me</p>
3
+ <cml:select label="Awesome" validates="required" default="Choose an option" instructions="Just be cool about it">
4
+ <cml:gold src="awesome_gold" regex="\\.asdf\\." flags="i" strict="true" />
5
+ <cml:option label="Awesome" />
6
+ <cml:option label="Cool" />
7
+ <cml:option label="Rad" />
8
+ <cml:option label="Neat" />
9
+ </cml:select>
10
+ <cml:text label="Opinion" validates="minLength:30" class="large" />
11
+ <cml:text label="Email" validates="required email" />
12
+ <div class="rad">
13
+ <cml:checkbox label="You sure?" value="yes" gold="true" />
14
+ </div>
15
+ <cml:group only-if="awesome">
16
+ <cml:checkboxes label="Cool checkboxes" name="rad">
17
+ <cml:instructions>This <i>is</i> great</cml:instructions>
18
+ <cml:checkbox label="Wanna do it?"/>
19
+ <cml:checkbox label="Sure?"/>
20
+ </cml:checkboxes>
21
+ <cml:hidden name="secret" value="cool"/>
22
+ </cml:group>
@@ -0,0 +1,10 @@
1
+ <cml:select label="Awesome">
2
+ <cml:gold src="awesome_gold" regex="\\.asdf\\." flags="i" strict="true" />
3
+ <cml:option label="Awesome" />
4
+ <cml:option label="Rad" />
5
+ <cml:option label="Rad" />
6
+ <cml:option label="Neat" />
7
+ </cml:select>
8
+ <cml:text label="Opinion" validates="minLength:30" class="large" />
9
+ <cml:text label="Awesome" validates="required email" />
10
+ <cml:checkbox label="" value="yes" gold="true" />
data/spec/meta_spec.rb ADDED
@@ -0,0 +1,31 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe "CML Gold" do
4
+ it "should give me da gold & fields" do
5
+ cml = <<-HTML
6
+ <cml:checkboxes label="Checkboxes" aggregation="all">
7
+ <cml:gold src="awesome_gold" regex="\\.asdf\\." flags="i" strict="true" />
8
+ <cml:checkbox label="Wanna do it?" />
9
+ <cml:checkbox label="Sure?" />
10
+ </cml:checkboxes>
11
+ <cml:checkbox label="No way">
12
+ <cml:gold />
13
+ </cml:checkbox>
14
+ <cml:text name="cool" gold="true" aggregation="agg" />
15
+ <cml:textarea name="sweet" gold="sweetness" />
16
+ HTML
17
+ @p = Parser.new(cml, :prefix => "u12345")
18
+ @p.golds.should == {
19
+ "_awesome_gold_strict" => "true",
20
+ "sweet" => "sweetness",
21
+ "no_way" => "no_way_gold",
22
+ "checkboxes" => "awesome_gold",
23
+ "_awesome_gold_regex" => ["\\.asdf\\.", "i"],
24
+ "cool" => "cool_gold"
25
+ }
26
+ @p.fields.should == {
27
+ "checkboxes"=>"all",
28
+ "cool"=>"agg"
29
+ }
30
+ end
31
+ end
@@ -0,0 +1,41 @@
1
+ class SortaMatch
2
+ def initialize(dom1,dom2)
3
+ @nodes1 = Nokogiri::HTML(dom1).xpath("//*").to_a
4
+ @nodes2 = Nokogiri::HTML(dom2).xpath("//*").to_a
5
+ @children = []
6
+ @nodes1.each_with_index { |d,i| @children << [d,@nodes2[i]] }
7
+ end
8
+
9
+ def missed
10
+ [present(@nodes1[@i]), present(@nodes2[@i])]
11
+ end
12
+
13
+ def present(node)
14
+ node ? "<#{node.name}#{node.attributes.map {|k,v| " #{k}=\"#{v}\""}}>#{node.children.first if first_text?(node)}" : @why
15
+ end
16
+
17
+ def first_text?(node)
18
+ node.children.first && node.children.first.text?
19
+ end
20
+
21
+ def matches?
22
+ @i = 0
23
+ @children.detect do |a,b|
24
+ if a.nil? || b.nil?
25
+ @why = "missing"
26
+ elsif !a.text?
27
+ if a.name != b.name
28
+ @why = "tag"
29
+ elsif a.attributes.map {|k,v| [k.to_s,v.to_s]} != b.attributes.map {|k,v| [k.to_s,v.to_s]}
30
+ @why = "attributes"
31
+ elsif first_text?(b) && a.children.first.to_s.strip != b.children.first.to_s.strip
32
+ @why = "text"
33
+ end
34
+ else
35
+ @why = nil
36
+ end
37
+ @i += 1 unless @why
38
+ @why
39
+ end.nil?
40
+ end
41
+ end
@@ -0,0 +1,26 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
2
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
+ require 'cml'
4
+ require 'spec'
5
+ require 'sorta_match'
6
+ #require 'spec/autorun'
7
+ include CML
8
+
9
+ Spec::Runner.configure do |config|
10
+
11
+ end
12
+
13
+ Spec::Matchers.define :sorta_match do |expected|
14
+ match do |actual|
15
+ @sm = SortaMatch.new(expected, actual)
16
+ @sm.matches?
17
+ end
18
+
19
+ failure_message_for_should do |actual|
20
+ "Expected DOM's to sorta match but they had these differences:\n #{@sm.missed.inspect}"
21
+ end
22
+ end
23
+
24
+ def convert(html)
25
+ Nokogiri::HTML.fragment(html)
26
+ end
@@ -0,0 +1,98 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe "CML Radio" do
4
+ it "should render basic checkbox" do
5
+ cml = <<-HTML
6
+ <cml:checkbox label="Check"/>
7
+ HTML
8
+ @p = Parser.new(cml, :prefix => "u12345")
9
+ @p.to_html.should sorta_match(<<-HTML)
10
+ <div class="cml" id="u12345">
11
+ <div class="checkbox">
12
+ <label><input type="checkbox" value="true" name="u12345[check]" class="check"/> Check</label>
13
+ </div>
14
+ </div>
15
+ HTML
16
+ end
17
+
18
+ it "should render checkbox custom value" do
19
+ cml = <<-HTML
20
+ <cml:checkbox label="Check" value="yes"/>
21
+ HTML
22
+ @p = Parser.new(cml, :prefix => "u12345")
23
+ @p.to_html.should sorta_match(<<-HTML)
24
+ <div class="cml" id="u12345">
25
+ <div class="checkbox">
26
+ <label><input type="checkbox" value="yes" name="u12345[check]" class="check"/> Check</label>
27
+ </div>
28
+ </div>
29
+ HTML
30
+ end
31
+
32
+ it "should render default checkbox" do
33
+ cml = <<-HTML
34
+ <cml:checkbox label="Check" default="false"/>
35
+ HTML
36
+ @p = Parser.new(cml, :prefix => "u12345")
37
+ @p.to_html.should sorta_match(<<-HTML)
38
+ <div class="cml" id="u12345">
39
+ <div class="checkbox">
40
+ <input type="hidden" value="false" name="u12345[check]" class="check"/>
41
+ <label><input type="checkbox" value="true" name="u12345[check]" class="check"/> Check</label>
42
+ </div>
43
+ </div>
44
+ HTML
45
+ end
46
+
47
+ it "should render checkbox with instructions attribute" do
48
+ cml = <<-HTML
49
+ <cml:checkbox label="Rad" instructions="Please be careful when you are selecting these."/>
50
+ HTML
51
+ @p = Parser.new(cml, :prefix => "u12345")
52
+ @p.to_html.should sorta_match(<<-HTML)
53
+ <div class="cml" id="u12345">
54
+ <div class="checkbox">
55
+ <label>
56
+ <input type="checkbox" value="true" name="u12345[rad]" class="rad"/> Rad
57
+ </label>
58
+ <p class="instructions">Please be careful when you are selecting these.</p>
59
+ </div>
60
+ </div>
61
+ HTML
62
+ end
63
+
64
+ it "should render gold" do
65
+ cml = <<-HTML
66
+ <cml:checkbox label="Rad">
67
+ <cml:gold src="rad_gold"/>
68
+ </cml:checkbox>
69
+ HTML
70
+ @p = Parser.new(cml, :prefix => "u12345")
71
+ @p.tags[0].should be_gold
72
+ @p.to_html.should sorta_match(<<-HTML)
73
+ <div class="cml" id="u12345">
74
+ <div class="checkbox">
75
+ <label><input type="checkbox" value="true" name="u12345[rad]" class="rad"/> Rad</label>
76
+ </div>
77
+ </div>
78
+ HTML
79
+ end
80
+
81
+ it "should render checkbox nested" do
82
+ cml = <<-HTML
83
+ <div class="rando">
84
+ <cml:checkbox label="Rad"/>
85
+ </div>
86
+ HTML
87
+ @p = Parser.new(cml, :prefix => "u12345")
88
+ @p.to_html.should sorta_match(<<-HTML)
89
+ <div class="cml" id="u12345">
90
+ <div class="rando">
91
+ <div class="checkbox">
92
+ <label><input type="checkbox" value="true" name="u12345[rad]" class="rad"/> Rad</label>
93
+ </div>
94
+ </div>
95
+ </div>
96
+ HTML
97
+ end
98
+ end
@@ -0,0 +1,30 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe "CML Checkboxes" do
4
+ it "should render basic checkboxes" do
5
+ cml = <<-HTML
6
+ <cml:checkboxes label="Cool checkboxes">
7
+ <cml:checkbox label="Wanna do it?"/>
8
+ <cml:checkbox label="Sure?"/>
9
+ <cml:checkbox label="Not really..." value="nope" checked="true"/>
10
+ </cml:checkboxes>
11
+ HTML
12
+ @p = Parser.new(cml, :prefix => "u12345")
13
+ @p.to_html.should sorta_match(<<-HTML)
14
+ <div class="cml" id="u12345">
15
+ <div class="checkboxes">
16
+ <h2 class="legend">Cool checkboxes</h2>
17
+ <label>
18
+ <input type="checkbox" value="Wanna do it?" name="u12345[cool_checkboxes][]" class="cool_checkboxes"/> Wanna do it?
19
+ </label>
20
+ <label>
21
+ <input type="checkbox" value="Sure?" name="u12345[cool_checkboxes][]" class="cool_checkboxes"/> Sure?
22
+ </label>
23
+ <label>
24
+ <input type="checkbox" value="nope" checked="checked" name="u12345[cool_checkboxes][]" class="cool_checkboxes"/> Sure?
25
+ </label>
26
+ </div>
27
+ </div>
28
+ HTML
29
+ end
30
+ end
@@ -0,0 +1,35 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe "CML Select" do
4
+ it "should render group" do
5
+ cml = <<-HTML
6
+ <cml:group only-if="awesome[1]">
7
+ <cml:checkboxes label="Cool checkboxes" name="rad">
8
+ <cml:checkbox label="Wanna do it?"/>
9
+ <cml:checkbox label="Sure?"/>
10
+ </cml:checkboxes>
11
+ <cml:text label="Something"/>
12
+ </cml:group>
13
+ HTML
14
+ @p = Parser.new(cml, :prefix => "u12345")
15
+ @p.to_html.should sorta_match(<<-HTML)
16
+ <div class="cml" id="u12345">
17
+ <div class="group only-if:awesome[1]">
18
+ <div class="checkboxes">
19
+ <h2 class="legend">Cool checkboxes</h2>
20
+ <label>
21
+ <input name="u12345[rad][]" class="rad" type="checkbox" value="Wanna do it?" /> Wanna do it?
22
+ </label>
23
+ <label>
24
+ <input name="u12345[rad][]" class="rad" type="checkbox" value="Sure?" /> Sure?
25
+ </label>
26
+ </div>
27
+ <div class="text">
28
+ <label>Something</label>
29
+ <input name="u12345[something]" class="something" type="text" value="" />
30
+ </div>
31
+ </div>
32
+ </div>
33
+ HTML
34
+ end
35
+ end
@@ -0,0 +1,15 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe "CML Hidden" do
4
+ it "should render basic hidden field" do
5
+ cml = <<-HTML
6
+ <cml:hidden name="secret" value="shit"/>
7
+ HTML
8
+ @p = Parser.new(cml, :prefix => "u12345")
9
+ @p.to_html.should sorta_match(<<-HTML)
10
+ <div class="cml" id="u12345">
11
+ <input type="hidden" value="shit" name="u12345[secret]" class="secret"/>
12
+ </div>
13
+ HTML
14
+ end
15
+ end
@@ -0,0 +1,14 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe "CML Hidden" do
4
+ it "should render basic hidden field" do
5
+ cml = <<-HTML
6
+ <cml:meta name="secret" gold="true"/>
7
+ HTML
8
+ @p = Parser.new(cml, :prefix => "u12345")
9
+ @p.to_html.should sorta_match(<<-HTML)
10
+ <div class="cml" id="u12345">
11
+ </div>
12
+ HTML
13
+ end
14
+ end