docubot 0.6.1 → 0.6.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (97) hide show
  1. data/bin/docubot +125 -125
  2. data/lib/docubot.rb +43 -43
  3. data/lib/docubot/bundle.rb +182 -182
  4. data/lib/docubot/converter.rb +28 -28
  5. data/lib/docubot/converters/haml.rb +9 -9
  6. data/lib/docubot/converters/markdown.rb +14 -14
  7. data/lib/docubot/index.rb +67 -67
  8. data/lib/docubot/link_tree.rb +111 -111
  9. data/lib/docubot/metasection.rb +61 -61
  10. data/lib/docubot/page.rb +167 -167
  11. data/lib/docubot/shells/default/0_License.md +59 -59
  12. data/lib/docubot/shells/default/Appendix/Glossary.md +4 -4
  13. data/lib/docubot/shells/default/Appendix/Index_Page.md +8 -8
  14. data/lib/docubot/shells/default/Appendix/Table of Contents.md +4 -4
  15. data/lib/docubot/shells/docubot-help/0_License.md +20 -20
  16. data/lib/docubot/shells/docubot-help/1_Getting_Started.md +47 -47
  17. data/lib/docubot/shells/docubot-help/2_Basic_Concepts/4 Adding Images.md +1 -1
  18. data/lib/docubot/shells/docubot-help/2_Basic_Concepts/index.md +5 -5
  19. data/lib/docubot/shells/docubot-help/3_Advanced_Topics/Controlling Glossary.md +2 -2
  20. data/lib/docubot/shells/docubot-help/3_Advanced_Topics/Controlling Indexing.md +9 -9
  21. data/lib/docubot/shells/docubot-help/3_Advanced_Topics/Controlling the Table of Contents.md +5 -5
  22. data/lib/docubot/shells/docubot-help/4_Appendix/Glossary.md +4 -4
  23. data/lib/docubot/shells/docubot-help/4_Appendix/Index_Page.md +5 -5
  24. data/lib/docubot/shells/docubot-help/4_Appendix/Table of Contents.md +7 -7
  25. data/lib/docubot/shells/docubot-help/index.txt +7 -7
  26. data/lib/docubot/snippet.rb +19 -19
  27. data/lib/docubot/snippets/glossary.rb +7 -7
  28. data/lib/docubot/snippets/index_entries.rb +6 -6
  29. data/lib/docubot/templates/_root/glossary.css +3 -3
  30. data/lib/docubot/templates/_root/glossary.js +57 -57
  31. data/lib/docubot/templates/index.haml +14 -14
  32. data/lib/docubot/templates/toc.haml +2 -2
  33. data/lib/docubot/templates/top.haml +32 -32
  34. data/lib/docubot/writers/chm/hhc.erb +1 -1
  35. data/lib/docubot/writers/chm/hhk.erb +2 -2
  36. data/lib/docubot/writers/html.rb +87 -87
  37. data/spec/_all.rb +12 -12
  38. data/spec/_helper.rb +16 -16
  39. data/spec/bundle.rb +339 -339
  40. data/spec/command.rb +3 -3
  41. data/spec/converters.rb +2 -2
  42. data/spec/global.rb +27 -27
  43. data/spec/glossary.rb +94 -94
  44. data/spec/index.rb +2 -2
  45. data/spec/page.rb +80 -80
  46. data/spec/samples/attributes/defaults.haml +34 -34
  47. data/spec/samples/attributes/explicit1.haml +42 -42
  48. data/spec/samples/attributes/explicit2.haml +41 -41
  49. data/spec/samples/attributes/hidden.haml +39 -39
  50. data/spec/samples/attributes/index.md +8 -8
  51. data/spec/samples/collisions/page1.md +2 -2
  52. data/spec/samples/collisions/page1.textile +2 -2
  53. data/spec/samples/collisions/page2.haml +3 -3
  54. data/spec/samples/collisions/page2.html +2 -2
  55. data/spec/samples/collisions/page2.txt +2 -2
  56. data/spec/samples/collisions/page3.md +2 -2
  57. data/spec/samples/files/index.md +1 -1
  58. data/spec/samples/glossary/Glossary.txt +4 -4
  59. data/spec/samples/glossary/Some Page.md +2 -2
  60. data/spec/samples/glossary/_glossary/Simple Term.md +2 -2
  61. data/spec/samples/glossary/_glossary/complex.haml +8 -8
  62. data/spec/samples/glossary/_glossary/project_x.md +3 -3
  63. data/spec/samples/hierarchy/1/1.1/1.1.1/index.haml +1 -1
  64. data/spec/samples/hierarchy/1/1.1/1.1.1/page.haml +3 -3
  65. data/spec/samples/hierarchy/1/1.1/page.haml +3 -3
  66. data/spec/samples/hierarchy/1/page.haml +3 -3
  67. data/spec/samples/hierarchy/2/2.1/2.1.1/page.haml +3 -3
  68. data/spec/samples/hierarchy/2/2.1/index.haml +1 -1
  69. data/spec/samples/hierarchy/2/2.1/page.haml +3 -3
  70. data/spec/samples/hierarchy/2/page.haml +3 -3
  71. data/spec/samples/hierarchy/main.haml +1 -1
  72. data/spec/samples/hierarchy/toc.md +1 -1
  73. data/spec/samples/links/index.txt +11 -11
  74. data/spec/samples/links/root.md +13 -13
  75. data/spec/samples/links/sub1/inner1.md +11 -11
  76. data/spec/samples/links/sub2.md +4 -4
  77. data/spec/samples/links/sub2/inner2.md +7 -7
  78. data/spec/samples/simplest/HTML.html +9 -9
  79. data/spec/samples/simplest/Haml.haml +12 -12
  80. data/spec/samples/simplest/Markdown.md +9 -9
  81. data/spec/samples/simplest/Text.txt +9 -9
  82. data/spec/samples/simplest/Textile.textile +9 -9
  83. data/spec/samples/templates/_templates/doubler.haml +6 -6
  84. data/spec/samples/templates/_templates/page.haml +1 -1
  85. data/spec/samples/templates/goaway.txt +2 -2
  86. data/spec/samples/templates/onepara_html.html +2 -2
  87. data/spec/samples/templates/onepara_md.md +4 -4
  88. data/spec/samples/templates/twopara_haml.haml +6 -6
  89. data/spec/samples/templates/twopara_textile.textile +5 -5
  90. data/spec/samples/titles/3_renamed.txt +1 -1
  91. data/spec/samples/titles/index.txt +1 -1
  92. data/spec/templates.rb +43 -43
  93. data/spec/toc.rb +128 -128
  94. data/spec/writer/chm.rb +2 -2
  95. data/spec/writer/html.rb +2 -2
  96. metadata +56 -25
  97. data/bin/docubot.bat +0 -1
@@ -1,14 +1,14 @@
1
- [External](http://www.google.com/)
2
- [Internal](#sub-id)
3
- [Internal](root.html#sub-id)
4
- [Internal](sub1/inner1.html)
5
- [Internal](sub2.html)
6
- [Internal](sub2/inner2.html)
7
- [Internal](sub1/../sub2/inner2.html)
8
- [BROKEN](fork.html)
9
- [BROKEN](sub1.html)
10
- [BROKEN](root.md)
11
- [BROKEN](sub1/inner1.md)
12
- [BROKEN](#GORKBO)
13
-
1
+ [External](http://www.google.com/)
2
+ [Internal](#sub-id)
3
+ [Internal](root.html#sub-id)
4
+ [Internal](sub1/inner1.html)
5
+ [Internal](sub2.html)
6
+ [Internal](sub2/inner2.html)
7
+ [Internal](sub1/../sub2/inner2.html)
8
+ [BROKEN](fork.html)
9
+ [BROKEN](sub1.html)
10
+ [BROKEN](root.md)
11
+ [BROKEN](sub1/inner1.md)
12
+ [BROKEN](#GORKBO)
13
+
14
14
  <div id="sub-id">Just in case</div>
@@ -1,11 +1,11 @@
1
- [External](http://phrogz.net)
2
- [Internal](../root.html)
3
- [Internal](../root.html#sub-id)
4
- [Internal](inner1.html)
5
- [Internal](../sub2.html)
6
- [Internal](../sub2/inner2.html)
7
- [File](../sub2/bozo.bin)
8
- [BROKEN](inner2.html)
9
- [BROKEN](../sub1)
10
- [BROKEN](sub1/inner1.md)
11
- [BROKEN](../root.html#GORKBO)
1
+ [External](http://phrogz.net)
2
+ [Internal](../root.html)
3
+ [Internal](../root.html#sub-id)
4
+ [Internal](inner1.html)
5
+ [Internal](../sub2.html)
6
+ [Internal](../sub2/inner2.html)
7
+ [File](../sub2/bozo.bin)
8
+ [BROKEN](inner2.html)
9
+ [BROKEN](../sub1)
10
+ [BROKEN](sub1/inner1.md)
11
+ [BROKEN](../root.html#GORKBO)
@@ -1,4 +1,4 @@
1
- [External](HTTP://NONEXISTENT.SITE)
2
- [File](sub2/bozo.bin)
3
- [BROKEN](sub2/GORKBO.bin)
4
- [SPACES](one%20two%20three.html)
1
+ [External](HTTP://NONEXISTENT.SITE)
2
+ [File](sub2/bozo.bin)
3
+ [BROKEN](sub2/GORKBO.bin)
4
+ [SPACES](one%20two%20three.html)
@@ -1,7 +1,7 @@
1
- [External](http://phrogz.net/tmp/gkhead.jpg)
2
- [Internal](../sub1/index.html) Even though there isn't an index.md file.
3
- [Internal](index.html) Even though there isn't an index.md file.
4
- [File](bozo.bin)
5
- [BROKEN](../index.html) Because the global root is not a valid link.
6
- [BROKEN](../sub1)
7
- [BROKEN](../index.md)
1
+ [External](http://phrogz.net/tmp/gkhead.jpg)
2
+ [Internal](../sub1/index.html) Even though there isn't an index.md file.
3
+ [Internal](index.html) Even though there isn't an index.md file.
4
+ [File](bozo.bin)
5
+ [BROKEN](../index.html) Because the global root is not a valid link.
6
+ [BROKEN](../sub1)
7
+ [BROKEN](../index.md)
@@ -1,10 +1,10 @@
1
- <h2>Hello World</h2>
2
-
3
- <p>It's the end of the world as we know it, and I feel fine. Because:</p>
4
-
5
- <ul>
6
- <li>I'm on my medication. Which is delicious.<ul>
7
- <li>I buy it from a store. A candy store.</li>
8
- </ul></li>
9
- <li>In the end, we're all going to go.</li>
1
+ <h2>Hello World</h2>
2
+
3
+ <p>It's the end of the world as we know it, and I feel fine. Because:</p>
4
+
5
+ <ul>
6
+ <li>I'm on my medication. Which is delicious.<ul>
7
+ <li>I buy it from a store. A candy store.</li>
8
+ </ul></li>
9
+ <li>In the end, we're all going to go.</li>
10
10
  </ul>
@@ -1,13 +1,13 @@
1
- %h2 Hello World
2
-
3
- %p
4
- It's the end of the world as we know it,
5
- and I feel fine. Because:
6
-
7
- %ul
8
- %li
9
- I'm on my medication.
10
- Which is delicious.
11
- %ul
12
- %li I buy it from a store. A candy store.
1
+ %h2 Hello World
2
+
3
+ %p
4
+ It's the end of the world as we know it,
5
+ and I feel fine. Because:
6
+
7
+ %ul
8
+ %li
9
+ I'm on my medication.
10
+ Which is delicious.
11
+ %ul
12
+ %li I buy it from a store. A candy store.
13
13
  %li In the end, we're all going to go.
@@ -1,10 +1,10 @@
1
- Hello World
2
- -----------
3
- It's the end of the world as we know it,
4
- and I feel fine. Because:
5
-
6
- * I'm on my medication.
7
- Which is delicious.
8
- * I buy it from a store.
9
- A candy store.
1
+ Hello World
2
+ -----------
3
+ It's the end of the world as we know it,
4
+ and I feel fine. Because:
5
+
6
+ * I'm on my medication.
7
+ Which is delicious.
8
+ * I buy it from a store.
9
+ A candy store.
10
10
  * In the end, we're all going to go.
@@ -1,10 +1,10 @@
1
- Hello World
2
- -----------
3
- It's the end of the world as we know it,
4
- and I feel fine. Because:
5
-
6
- * I'm on my medication.
7
- Which is delicious.
8
- * I buy it from a store.
9
- A candy store.
1
+ Hello World
2
+ -----------
3
+ It's the end of the world as we know it,
4
+ and I feel fine. Because:
5
+
6
+ * I'm on my medication.
7
+ Which is delicious.
8
+ * I buy it from a store.
9
+ A candy store.
10
10
  * In the end, we're all going to go.
@@ -1,10 +1,10 @@
1
- h2. Hello World
2
-
3
- It's the end of the world as we know it,
4
- and I feel fine. Because:
5
-
6
- * I'm on my medication.
7
- Which is delicious.
8
- ** I buy it from a store.
9
- A candy store.
1
+ h2. Hello World
2
+
3
+ It's the end of the world as we know it,
4
+ and I feel fine. Because:
5
+
6
+ * I'm on my medication.
7
+ Which is delicious.
8
+ ** I buy it from a store.
9
+ A candy store.
10
10
  * In the end, we're all going to go.
@@ -1,7 +1,7 @@
1
- #doubler
2
- - if page.multiplier
3
- - page.multiplier.to_i.times do
4
- = contents
5
- - else
6
- = contents
1
+ #doubler
2
+ - if page.multiplier
3
+ - page.multiplier.to_i.times do
4
+ = contents
5
+ - else
6
+ = contents
7
7
  = contents
@@ -1,2 +1,2 @@
1
- #pager
1
+ #pager
2
2
  = contents
@@ -1,3 +1,3 @@
1
- template: 404
2
- +++
1
+ template: 404
2
+ +++
3
3
  I DO NOT LIKE YOU
@@ -1,3 +1,3 @@
1
- title: 1*1
2
- +++
1
+ title: 1*1
2
+ +++
3
3
  <p>Para1</p>
@@ -1,5 +1,5 @@
1
- title : 1*2
2
- template : doubler
3
- multiplier : 3
4
- +++
1
+ title : 1*2
2
+ template : doubler
3
+ multiplier : 3
4
+ +++
5
5
  Para1
@@ -1,7 +1,7 @@
1
- title : 2*1
2
- template: page
3
- +++
4
- %p
5
- Para1
6
- %p
1
+ title : 2*1
2
+ template: page
3
+ +++
4
+ %p
5
+ Para1
6
+ %p
7
7
  Para2
@@ -1,6 +1,6 @@
1
- title: 2*2
2
- template: doubler
3
- +++
4
- p. Para1
5
-
1
+ title: 2*2
2
+ template: doubler
3
+ +++
4
+ p. Para1
5
+
6
6
  p. Para2
@@ -1,2 +1,2 @@
1
- title: Third One
1
+ title: Third One
2
2
  +++
@@ -1,2 +1,2 @@
1
- title : Title Changin'
1
+ title : Title Changin'
2
2
  +++
@@ -1,44 +1,44 @@
1
- #encoding: UTF-8
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
1
+ #encoding: UTF-8
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
44
  end
@@ -1,129 +1,129 @@
1
- #encoding: UTF-8
2
- require File.join(File.dirname(__FILE__), "_helper")
3
-
4
- describe "Simplest Table of Contents" do
5
- before do
6
- Dir.chdir SAMPLES/'simplest' do
7
- @bundle = DocuBot::Bundle.new( '.' )
8
- @toc = @bundle.toc
9
- @files = Dir['*']
10
- end
11
- end
12
-
13
- it "knows who its bundle is" do
14
- @toc.bundle.must_equal @bundle
15
- end
16
-
17
- it "preserves simple names as titles" do
18
- @toc.children.length.must_equal @files.length
19
- @files.each do |source_file|
20
- filename_without_extension = source_file.sub( /\.[^.]+$/, '' )
21
- @toc.children.find{ |node| node.title==filename_without_extension }.wont_be_nil
22
- end
23
- end
24
-
25
- it "preserves file system ordering" do
26
- @files.each_with_index do |source_file,i|
27
- filename_without_extension = source_file.sub( /\.[^.]+$/, '' )
28
- @toc.children[i].title.must_equal filename_without_extension
29
- end
30
- end
31
-
32
- it "has no parent or ancestors" do
33
- @toc.parent.must_be_nil
34
- @toc.ancestors.must_be_empty
35
- end
36
-
37
- it "is not the parent of any top-level links" do
38
- @toc.children.each{ |node| node.parent.wont_equal @toc }
39
- end
40
-
41
- it "is at depth 0 with no root" do
42
- @toc.depth.must_equal 0
43
- end
44
- end
45
-
46
- describe "Renamed Table of Contents" do
47
- it "honors the title of the root index file" do
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
106
- end
107
- end
108
-
109
- describe "ToC with Deep Hierarchy" do
110
- before do
111
- @bundle = DocuBot::Bundle.new SAMPLES/'hierarchy'
112
- end
113
-
114
- it "should match the expected hierarchy" do
115
- @bundle.toc[0].page.title.must_equal '1'
116
- @bundle.toc[0][0].page.title.must_equal '1.1'
117
- @bundle.toc[0][0][0].page.title.must_equal '1.1.1'
118
- @bundle.toc[0][0][0][0].page.title.must_equal '1.1.1p'
119
- @bundle.toc[0][0][1].page.title.must_equal '1.1p'
120
- @bundle.toc[0][1].page.title.must_equal '1p'
121
- @bundle.toc[1].page.title.must_equal '2'
122
- @bundle.toc[1][0].page.title.must_equal '2.1'
123
- @bundle.toc[1][0][0].page.title.must_equal '2.1.1'
124
- @bundle.toc[1][0][0][0].page.title.must_equal '2.1.1p'
125
- @bundle.toc[1][0][1].page.title.must_equal '2.1p'
126
- @bundle.toc[1][1].page.title.must_equal '2p'
127
- @bundle.toc[2].page.title.must_equal 'main'
128
- end
1
+ #encoding: UTF-8
2
+ require File.join(File.dirname(__FILE__), "_helper")
3
+
4
+ describe "Simplest Table of Contents" do
5
+ before do
6
+ Dir.chdir SAMPLES/'simplest' do
7
+ @bundle = DocuBot::Bundle.new( '.' )
8
+ @toc = @bundle.toc
9
+ @files = Dir['*']
10
+ end
11
+ end
12
+
13
+ it "knows who its bundle is" do
14
+ @toc.bundle.must_equal @bundle
15
+ end
16
+
17
+ it "preserves simple names as titles" do
18
+ @toc.children.length.must_equal @files.length
19
+ @files.each do |source_file|
20
+ filename_without_extension = source_file.sub( /\.[^.]+$/, '' )
21
+ @toc.children.find{ |node| node.title==filename_without_extension }.wont_be_nil
22
+ end
23
+ end
24
+
25
+ it "preserves file system ordering" do
26
+ @files.each_with_index do |source_file,i|
27
+ filename_without_extension = source_file.sub( /\.[^.]+$/, '' )
28
+ @toc.children[i].title.must_equal filename_without_extension
29
+ end
30
+ end
31
+
32
+ it "has no parent or ancestors" do
33
+ @toc.parent.must_be_nil
34
+ @toc.ancestors.must_be_empty
35
+ end
36
+
37
+ it "is not the parent of any top-level links" do
38
+ @toc.children.each{ |node| node.parent.wont_equal @toc }
39
+ end
40
+
41
+ it "is at depth 0 with no root" do
42
+ @toc.depth.must_equal 0
43
+ end
44
+ end
45
+
46
+ describe "Renamed Table of Contents" do
47
+ it "honors the title of the root index file" do
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
106
+ end
107
+ end
108
+
109
+ describe "ToC with Deep Hierarchy" do
110
+ before do
111
+ @bundle = DocuBot::Bundle.new SAMPLES/'hierarchy'
112
+ end
113
+
114
+ it "should match the expected hierarchy" do
115
+ @bundle.toc[0].page.title.must_equal '1'
116
+ @bundle.toc[0][0].page.title.must_equal '1.1'
117
+ @bundle.toc[0][0][0].page.title.must_equal '1.1.1'
118
+ @bundle.toc[0][0][0][0].page.title.must_equal '1.1.1p'
119
+ @bundle.toc[0][0][1].page.title.must_equal '1.1p'
120
+ @bundle.toc[0][1].page.title.must_equal '1p'
121
+ @bundle.toc[1].page.title.must_equal '2'
122
+ @bundle.toc[1][0].page.title.must_equal '2.1'
123
+ @bundle.toc[1][0][0].page.title.must_equal '2.1.1'
124
+ @bundle.toc[1][0][0][0].page.title.must_equal '2.1.1p'
125
+ @bundle.toc[1][0][1].page.title.must_equal '2.1p'
126
+ @bundle.toc[1][1].page.title.must_equal '2p'
127
+ @bundle.toc[2].page.title.must_equal 'main'
128
+ end
129
129
  end