docubot 0.3.3 → 0.4
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.
- data/bin/docubot +5 -1
- data/lib/docubot.rb +4 -2
- data/lib/docubot/bundle.rb +109 -61
- data/lib/docubot/converter.rb +4 -1
- data/lib/docubot/converters/haml.rb +1 -1
- data/lib/docubot/glossary.rb +3 -0
- data/lib/docubot/link_tree.rb +109 -0
- data/lib/docubot/metasection.rb +61 -0
- data/lib/docubot/page.rb +40 -118
- data/lib/docubot/shells/docubot-help/3_Advanced_Topics/Controlling the Table of Contents.md +2 -4
- data/lib/docubot/shells/nvphysx/_templates/_root/common.css +10 -5
- data/lib/docubot/shells/nvphysx/_templates/_root/glossary.css +1 -0
- data/lib/docubot/shells/nvphysx/_templates/_root/glossary.js +11 -1
- data/lib/docubot/shells/nvphysx/_templates/section.haml +9 -0
- data/lib/docubot/templates/index.haml +13 -20
- data/lib/docubot/templates/section.haml +1 -4
- data/lib/docubot/templates/toc.haml +2 -11
- data/lib/docubot/templates/top.haml +7 -4
- data/lib/docubot/writers/chm.rb +6 -5
- data/lib/docubot/writers/chm/hhc.erb +35 -12
- data/lib/docubot/writers/chm/hhk.erb +1 -1
- data/lib/docubot/writers/chm/hhp.erb +2 -2
- data/lib/docubot/writers/html.rb +33 -23
- data/spec/_all.rb +1 -0
- data/spec/_helper.rb +10 -0
- data/spec/bundle.rb +193 -2
- data/spec/global.rb +28 -0
- data/spec/glossary.rb +13 -11
- data/spec/page.rb +35 -9
- data/spec/samples/attributes/defaults.haml +34 -0
- data/spec/samples/attributes/explicit1.haml +43 -0
- data/spec/samples/attributes/explicit2.haml +42 -0
- data/spec/samples/attributes/hidden.haml +40 -0
- data/spec/samples/attributes/index.md +8 -0
- data/spec/samples/collisions/page1.md +3 -0
- data/spec/samples/collisions/page1.textile +3 -0
- data/spec/samples/collisions/page2.haml +4 -0
- data/spec/samples/collisions/page2.html +3 -0
- data/spec/samples/collisions/page2.txt +3 -0
- data/spec/samples/collisions/page3.bin +1 -0
- data/spec/samples/collisions/page3.md +3 -0
- data/spec/samples/{link_test/sub2/bozo.bin → files/BUILDING.txt} +0 -0
- data/spec/samples/{titletest/1 First One.txt → files/_static/Thumbs.db} +0 -0
- data/spec/samples/{titletest/2_Second_One.txt → files/_static/foo.ai} +0 -0
- data/spec/samples/{titletest/4 Fourth_One.txt → files/_static/foo.png} +0 -0
- data/spec/samples/{titletest/5_Fifth One.txt → files/_static/foo.psd} +0 -0
- data/spec/samples/files/another.md +0 -0
- data/spec/samples/files/common.css +0 -0
- data/spec/samples/files/first.textile +0 -0
- data/spec/samples/files/index.md +2 -0
- data/spec/samples/files/section/foo.jpg +0 -0
- data/spec/samples/files/section/page.haml +0 -0
- data/spec/samples/files/section/sub section/Thumbs.db b/data/spec/samples/files/section/sub → section/Thumbs.db +0 -0
- data/spec/samples/files/section/sub section/foo.gif b/data/spec/samples/files/section/sub → section/foo.gif +0 -0
- data/spec/samples/files/section/sub section/page.txt b/data/spec/samples/files/section/sub → section/page.txt +0 -0
- data/spec/samples/{link_test → links}/index.txt +0 -0
- data/spec/samples/{link_test → links}/root.md +0 -0
- data/spec/samples/{link_test → links}/sub1/inner1.md +0 -0
- data/spec/samples/{link_test → links}/sub2.md +0 -0
- data/spec/samples/links/sub2/bozo.bin +0 -0
- data/spec/samples/{link_test → links}/sub2/inner2.md +0 -0
- data/spec/samples/templates/_templates/404.haml +1 -0
- data/spec/samples/templates/_templates/doubler.haml +7 -0
- data/spec/samples/templates/_templates/page.haml +2 -0
- data/spec/samples/templates/goaway.txt +3 -0
- data/spec/samples/templates/onepara_html.html +3 -0
- data/spec/samples/templates/onepara_md.md +5 -0
- data/spec/samples/templates/twopara_haml.haml +7 -0
- data/spec/samples/templates/twopara_textile.textile +6 -0
- data/spec/samples/titles/1 First One.txt b/data/spec/samples/titles/1 First → One.txt +0 -0
- data/spec/samples/titles/2_Second_One.txt +0 -0
- data/spec/samples/{titletest → titles}/3_renamed.txt +0 -0
- data/spec/samples/titles/4 Fourth_One.txt b/data/spec/samples/titles/4 → Fourth_One.txt +0 -0
- data/spec/samples/titles/5_Fifth One.txt b/data/spec/samples/titles/5_Fifth → One.txt +0 -0
- data/spec/samples/titles/911.txt +0 -0
- data/spec/samples/titles/index.txt +2 -0
- data/spec/templates.rb +42 -0
- data/spec/toc.rb +64 -30
- metadata +53 -14
- data/spec/samples/titletest/index.txt +0 -2
data/spec/page.rb
CHANGED
@@ -1,24 +1,50 @@
|
|
1
1
|
#encoding: UTF-8
|
2
2
|
require File.join(File.dirname(__FILE__), "_helper")
|
3
3
|
|
4
|
-
describe "
|
4
|
+
describe "Validating page titles" do
|
5
5
|
before do
|
6
|
-
@bundle = DocuBot::Bundle.new( SAMPLES/'
|
6
|
+
@bundle = DocuBot::Bundle.new( SAMPLES/'titles' )
|
7
7
|
@toc = @bundle.toc
|
8
8
|
end
|
9
9
|
it "knows who its bundle is" do
|
10
|
-
@toc.
|
10
|
+
@toc.children.each{ |node| node.page.bundle.must_equal @bundle }
|
11
11
|
end
|
12
|
-
it "ignores leading numbers for the titles" do
|
13
|
-
@toc.
|
12
|
+
it "ignores leading numbers for the titles (unless all numbers)" do
|
13
|
+
@toc.children.each{ |node| node.page.title.must_match /(?:^\D|^\d+$)/ }
|
14
14
|
end
|
15
15
|
it "honors pages specifying their title" do
|
16
|
-
@toc.
|
17
|
-
@toc.
|
16
|
+
@toc.children.find{ |page| page.title =~ /renamed/i }.must_be_nil
|
17
|
+
@toc.children.find{ |page| page.title == 'Third One' }.wont_be_nil
|
18
18
|
end
|
19
19
|
it "replaces underscores with spaces in the title" do
|
20
20
|
%w[ First Second Third Fourth Fifth ].each_with_index do |name,i|
|
21
|
-
@toc.
|
21
|
+
@toc.children[i].page.title.must_equal "#{name} One"
|
22
22
|
end
|
23
23
|
end
|
24
|
-
|
24
|
+
it "doesn't change names of files that are all numbers" do
|
25
|
+
@toc.children.find{ |node| node.page.title == '911' }.wont_be_nil
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe "Traversing page hierarchy" do
|
30
|
+
before do
|
31
|
+
@out, @err = capture_io do
|
32
|
+
@bundle = DocuBot::Bundle.new( SAMPLES/'links' )
|
33
|
+
end
|
34
|
+
end
|
35
|
+
it "should have #pages returning an array" do
|
36
|
+
@bundle.pages.must_be_kind_of Array
|
37
|
+
@bundle.pages.length.must_equal 6
|
38
|
+
end
|
39
|
+
it "every item should be a Page" do
|
40
|
+
@bundle.pages.each do |page|
|
41
|
+
page.must_be_kind_of DocuBot::Page
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
describe "Testing user variables" do
|
47
|
+
it "should identify if a variable has been defined"
|
48
|
+
it "should inherit variables from the global"
|
49
|
+
it "should override variables from the global"
|
50
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
This page specifies no attributes; what defaults will it get?
|
2
|
+
|
3
|
+
%h2#h1 Heading 1
|
4
|
+
%p#p1-1 Paragraph Number 1.1
|
5
|
+
%p#p1-2 Paragraph Number 1.2
|
6
|
+
%ul
|
7
|
+
%li A list of items
|
8
|
+
%li A list of items
|
9
|
+
%li A list of items
|
10
|
+
|
11
|
+
%h3#h1-1 Heading 1.1
|
12
|
+
%p#p1-1-1 Paragraph Number 1.1.1
|
13
|
+
|
14
|
+
%h2#h2 Heading 2
|
15
|
+
%h3#h2-1 Heading 2.1
|
16
|
+
%h4#h2-1-1 Heading 2.1.1
|
17
|
+
%h5#h2-1-1-1 Heading 2.1.1.1
|
18
|
+
%p#p2-1-1-1-1 Paragraph Number 2.1.1.1.1
|
19
|
+
|
20
|
+
%h3#h2-2 Heading 2.2
|
21
|
+
%p#p2-2-1 Paragraph Number 2.2.1
|
22
|
+
%dl
|
23
|
+
%dt#dt1 Giggity
|
24
|
+
%dd#dd1 Quagmire
|
25
|
+
%dt#dt2 Zanzibar
|
26
|
+
%dd#dd2 The Best
|
27
|
+
|
28
|
+
%p#p2-2-2 Paragraph Number 2.2.2
|
29
|
+
|
30
|
+
%h1#h0 Heading 0
|
31
|
+
%p#p0-1
|
32
|
+
Paragraph 0.1
|
33
|
+
Whoa, this heading is larger than any other before it!
|
34
|
+
|
@@ -0,0 +1,43 @@
|
|
1
|
+
title: Jiggly Awesome
|
2
|
+
keywords: explicit, metasection, attributes/specifying
|
3
|
+
no-index: headings, definitions
|
4
|
+
auto-section:false
|
5
|
+
toc: #h1, #h1-1, #div
|
6
|
+
auto-id : true
|
7
|
+
+++
|
8
|
+
%h2#h1 Heading 1
|
9
|
+
%p#p1-1 Paragraph Number 1.1
|
10
|
+
%p#p1-2 Paragraph Number 1.2
|
11
|
+
%ul
|
12
|
+
%li A list of items
|
13
|
+
%li A list of items
|
14
|
+
%li A list of items
|
15
|
+
|
16
|
+
%h3#h1-1 Heading 1.1
|
17
|
+
%p#p1-1-1 Paragraph Number 1.1.1
|
18
|
+
|
19
|
+
%h2#h2 Heading 2
|
20
|
+
%h3#h2-1 Heading 2.1
|
21
|
+
%h4#h2-1-1 Heading 2.1.1
|
22
|
+
%h5#h2-1-1-1 Heading 2.1.1.1
|
23
|
+
%p#p2-1-1-1-1 Paragraph Number 2.1.1.1.1
|
24
|
+
|
25
|
+
%h3#h2-2 Heading 2.2
|
26
|
+
%p#p2-2-1 Paragraph Number 2.2.1
|
27
|
+
%dl
|
28
|
+
%dt#dt1 Giggity
|
29
|
+
%dd#dd1 Quagmire
|
30
|
+
%dt#dt2 Zanzibar
|
31
|
+
%dd#dd2 The Best
|
32
|
+
|
33
|
+
%p#p2-2-2 Paragraph Number 2.2.2
|
34
|
+
|
35
|
+
%h1#h0 Heading 0
|
36
|
+
%p#p0-1
|
37
|
+
Paragraph 0.1
|
38
|
+
Whoa, this heading is larger than any other before it!
|
39
|
+
|
40
|
+
#div
|
41
|
+
Text content
|
42
|
+
%b is
|
43
|
+
cool.
|
@@ -0,0 +1,42 @@
|
|
1
|
+
title: Combo the Other
|
2
|
+
keywords: explicit, metasection, attributes/specifying
|
3
|
+
no-index: headings
|
4
|
+
auto-section:true
|
5
|
+
toc: Heading 1, #h1-1, Giggity, #h0
|
6
|
+
+++
|
7
|
+
%h2#h1 Heading 1
|
8
|
+
%p#p1-1 Paragraph Number 1.1
|
9
|
+
%p#p1-2 Paragraph Number 1.2
|
10
|
+
%ul
|
11
|
+
%li A list of items
|
12
|
+
%li A list of items
|
13
|
+
%li A list of items
|
14
|
+
|
15
|
+
%h3#h1-1 Heading 1.1
|
16
|
+
%p#p1-1-1 Paragraph Number 1.1.1
|
17
|
+
|
18
|
+
%h2#h2 Heading 2
|
19
|
+
%h3#h2-1 Heading 2.1
|
20
|
+
%h4#h2-1-1 Heading 2.1.1
|
21
|
+
%h5#h2-1-1-1 Heading 2.1.1.1
|
22
|
+
%p#p2-1-1-1-1 Paragraph Number 2.1.1.1.1
|
23
|
+
|
24
|
+
%h3#h2-2 Heading 2.2
|
25
|
+
%p#p2-2-1 Paragraph Number 2.2.1
|
26
|
+
%dl
|
27
|
+
%dt Giggity
|
28
|
+
%dd#dd1 Quagmire
|
29
|
+
%dt#dt2 Zanzibar
|
30
|
+
%dd#dd2 The Best
|
31
|
+
|
32
|
+
%p#p2-2-2 Paragraph Number 2.2.2
|
33
|
+
|
34
|
+
%h1#h0 Heading 0
|
35
|
+
%p#p0-1
|
36
|
+
Paragraph 0.1
|
37
|
+
Whoa, this heading is larger than any other before it!
|
38
|
+
|
39
|
+
#div
|
40
|
+
Text content
|
41
|
+
%b is
|
42
|
+
cool.
|
@@ -0,0 +1,40 @@
|
|
1
|
+
auto-id: true
|
2
|
+
hide: true
|
3
|
+
toc: Heading 1, Heading 2
|
4
|
+
+++
|
5
|
+
%h2 Heading 1
|
6
|
+
%p Paragraph Number 1.1
|
7
|
+
%p Paragraph Number 1.2
|
8
|
+
%ul
|
9
|
+
%li A list of items
|
10
|
+
%li A list of items
|
11
|
+
%li A list of items
|
12
|
+
|
13
|
+
%h3 Heading 1.1
|
14
|
+
%p Paragraph Number 1.1.1
|
15
|
+
|
16
|
+
%h2 Heading 2
|
17
|
+
%h3 Heading 2.1
|
18
|
+
%h4 Heading 2.1.1
|
19
|
+
%h5 Heading 2.1.1.1
|
20
|
+
%p Paragraph Number 2.1.1.1.1
|
21
|
+
|
22
|
+
%h3 Heading 2.2
|
23
|
+
%p Paragraph Number 2.2.1
|
24
|
+
%dl
|
25
|
+
%dt#dt1 Giggity
|
26
|
+
%dd#dd1 Quagmire
|
27
|
+
%dt Zanzibar
|
28
|
+
%dd The Best
|
29
|
+
|
30
|
+
%p Paragraph Number 2.2.2
|
31
|
+
|
32
|
+
%h1 Heading 0
|
33
|
+
%p
|
34
|
+
Paragraph 0.1
|
35
|
+
Whoa, this heading is larger than any other before it!
|
36
|
+
|
37
|
+
#div
|
38
|
+
Text content
|
39
|
+
%b is
|
40
|
+
cool.
|
@@ -0,0 +1,8 @@
|
|
1
|
+
title : Friggles® The Cat, ©2009
|
2
|
+
author :Gavin Kistner
|
3
|
+
default: All About Mr. Friggles
|
4
|
+
quotes:"It's all about Mr. Benjamin", "I have never seen this cat before in my life!"
|
5
|
+
author.email : !@phrogz.net
|
6
|
+
author website :http://phrogz.net
|
7
|
+
awesome : true
|
8
|
+
+++
|
@@ -0,0 +1 @@
|
|
1
|
+
(Some unrecognized file type.)
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1 @@
|
|
1
|
+
%p Oops! The page you were looking for was not found. (Tee hee!)
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
data/spec/templates.rb
CHANGED
@@ -1,2 +1,44 @@
|
|
1
1
|
#encoding: UTF-8
|
2
2
|
require File.join(File.dirname(__FILE__), "_helper")
|
3
|
+
|
4
|
+
describe "Variety Hour" do
|
5
|
+
before do
|
6
|
+
@bundle = DocuBot::Bundle.new( SAMPLES/'templates' )
|
7
|
+
@page_by_title = Hash[ *@bundle.pages.map{ |p| [p.title,p] }.flatten ]
|
8
|
+
end
|
9
|
+
|
10
|
+
it "uses the 'page' template if not specified" do
|
11
|
+
@page_by_title.must_include '1*1'
|
12
|
+
html = @page_by_title['1*1'].to_html
|
13
|
+
html.must_include 'pager'
|
14
|
+
html.scan(/<p>/).length.must_equal 1
|
15
|
+
end
|
16
|
+
|
17
|
+
it "passes the page for use by another specified template" do
|
18
|
+
@page_by_title.must_include '1*2'
|
19
|
+
html = @page_by_title['1*2'].to_html
|
20
|
+
html.must_include 'doubler'
|
21
|
+
html.scan(/<p>/).length.must_equal 3
|
22
|
+
end
|
23
|
+
|
24
|
+
it "can use the 'page' template explicitly" do
|
25
|
+
@page_by_title.must_include '2*1'
|
26
|
+
html = @page_by_title['2*1'].to_html
|
27
|
+
html.must_include 'page'
|
28
|
+
html.scan(/<p>/).length.must_equal 2
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should have templates handle missing attributes" do
|
32
|
+
@page_by_title.must_include '2*2'
|
33
|
+
html = @page_by_title['2*2'].to_html
|
34
|
+
html.must_include 'doubler'
|
35
|
+
html.scan(/<p>/).length.must_equal 4
|
36
|
+
end
|
37
|
+
|
38
|
+
it "can have templates that do not include contents" do
|
39
|
+
@page_by_title.must_include 'goaway'
|
40
|
+
html = @page_by_title['goaway'].to_html
|
41
|
+
html.must_include 'Oops!'
|
42
|
+
html.wont_include 'I DO NOT LIKE YOU'
|
43
|
+
end
|
44
|
+
end
|
data/spec/toc.rb
CHANGED
@@ -14,32 +14,18 @@ describe "Simplest Table of Contents" do
|
|
14
14
|
@toc.bundle.must_equal @bundle
|
15
15
|
end
|
16
16
|
|
17
|
-
it "responds to queries for undefined attributes" do
|
18
|
-
@toc.never_defined_attribute?.must_equal false
|
19
|
-
@toc.never_defined_attribute.must_be_nil
|
20
|
-
end
|
21
|
-
|
22
|
-
it "responds to queries for defined attributes" do
|
23
|
-
@toc.title?.must_equal true
|
24
|
-
@toc.title.wont_be_nil
|
25
|
-
end
|
26
|
-
|
27
|
-
it "defaults to the name 'Table of Contents'" do
|
28
|
-
@toc.title.must_equal "Table of Contents"
|
29
|
-
end
|
30
|
-
|
31
17
|
it "preserves simple names as titles" do
|
32
|
-
@toc.
|
18
|
+
@toc.children.length.must_equal @files.length
|
33
19
|
@files.each do |source_file|
|
34
20
|
filename_without_extension = source_file.sub( /\.[^.]+$/, '' )
|
35
|
-
@toc.
|
21
|
+
@toc.children.find{ |node| node.title==filename_without_extension }.wont_be_nil
|
36
22
|
end
|
37
23
|
end
|
38
24
|
|
39
25
|
it "preserves file system ordering" do
|
40
26
|
@files.each_with_index do |source_file,i|
|
41
27
|
filename_without_extension = source_file.sub( /\.[^.]+$/, '' )
|
42
|
-
@toc.
|
28
|
+
@toc.children[i].title.must_equal filename_without_extension
|
43
29
|
end
|
44
30
|
end
|
45
31
|
|
@@ -48,26 +34,74 @@ describe "Simplest Table of Contents" do
|
|
48
34
|
@toc.ancestors.must_be_empty
|
49
35
|
end
|
50
36
|
|
51
|
-
it "is the parent of
|
52
|
-
@toc.
|
37
|
+
it "is not the parent of any top-level links" do
|
38
|
+
@toc.children.each{ |node| node.parent.wont_equal @toc }
|
53
39
|
end
|
54
40
|
|
55
|
-
it "is not a leaf" do
|
56
|
-
@toc.leaf?.must_equal false
|
57
|
-
end
|
58
|
-
|
59
41
|
it "is at depth 0 with no root" do
|
60
42
|
@toc.depth.must_equal 0
|
61
|
-
|
62
|
-
end
|
63
|
-
|
64
|
-
it "raises an error setting a non-standard attribute" do
|
65
|
-
proc{ @toc.title = "Yo!" }.must_raise(NoMethodError)
|
66
|
-
end
|
43
|
+
end
|
67
44
|
end
|
68
45
|
|
69
46
|
describe "Renamed Table of Contents" do
|
70
47
|
it "honors the title of the root index file" do
|
71
|
-
DocuBot::Bundle.new(SAMPLES/'
|
48
|
+
DocuBot::Bundle.new(SAMPLES/'titles').global.title.must_equal "Title Changin'"
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe "Sub-page Links in the Table of Contents" do
|
53
|
+
before do
|
54
|
+
@out, @err = capture_io do
|
55
|
+
@bundle = DocuBot::Bundle.new SAMPLES/'attributes'
|
56
|
+
@toc = @bundle.toc
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
it "should find pages by html link" do
|
61
|
+
e1 = @toc.find('explicit1.html')
|
62
|
+
e1.wont_be_nil
|
63
|
+
e1.page.wont_be_nil
|
64
|
+
e1.page.file == 'explicit1.haml'
|
65
|
+
end
|
66
|
+
|
67
|
+
it "should not have entries for hidden pages" do
|
68
|
+
@bundle.pages_by_title['hidden'].wont_be_empty
|
69
|
+
hidden = @bundle.page_by_html_path['hidden.html']
|
70
|
+
hidden.wont_be_nil
|
71
|
+
@toc.find('hidden.html').must_be_nil
|
72
|
+
@toc.descendants.select{ |node| node.link['hidden.html'] }.must_be_empty
|
73
|
+
end
|
74
|
+
|
75
|
+
it "should warn about failed TOC requests" do
|
76
|
+
# explicit2.haml has an existing ID on the element for "Heading 1",
|
77
|
+
# so it can't update the HTML id or the TOC request to match.
|
78
|
+
@err.must_include "Heading 1"
|
79
|
+
end
|
80
|
+
|
81
|
+
it "should have sub-entries" do
|
82
|
+
e2 = @toc.find('explicit2.html')
|
83
|
+
|
84
|
+
e2.children.length.must_equal 3
|
85
|
+
|
86
|
+
# The first sub-link is not "Heading 1" because explicit2.haml has an existing ID on that element
|
87
|
+
# and so cannot (at this time) change either the HTML id or the TOC request to match.
|
88
|
+
# It is ignored.
|
89
|
+
kid = e2.children[0]
|
90
|
+
kid.title.must_equal "Heading 1.1"
|
91
|
+
kid.link.must_equal 'explicit2.html#h1-1'
|
92
|
+
kid.page.must_equal e2.page
|
93
|
+
|
94
|
+
kid = e2.children[1]
|
95
|
+
kid.title.must_equal "Giggity"
|
96
|
+
kid.file.must_equal 'explicit2.html'
|
97
|
+
# No assumptions are made about the generated id.
|
98
|
+
kid.page.must_equal e2.page
|
99
|
+
|
100
|
+
kid = e2.children[2]
|
101
|
+
kid.title.must_equal "Heading 0"
|
102
|
+
kid.file.must_equal 'explicit2.html'
|
103
|
+
kid.anchor.must_equal 'h0'
|
104
|
+
kid.link.must_equal 'explicit2.html#h0'
|
105
|
+
kid.page.must_equal e2.page
|
72
106
|
end
|
73
107
|
end
|