docubot 0.3.3 → 0.4
Sign up to get free protection for your applications and to get access to all the features.
- 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
|