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.
Files changed (80) hide show
  1. data/bin/docubot +5 -1
  2. data/lib/docubot.rb +4 -2
  3. data/lib/docubot/bundle.rb +109 -61
  4. data/lib/docubot/converter.rb +4 -1
  5. data/lib/docubot/converters/haml.rb +1 -1
  6. data/lib/docubot/glossary.rb +3 -0
  7. data/lib/docubot/link_tree.rb +109 -0
  8. data/lib/docubot/metasection.rb +61 -0
  9. data/lib/docubot/page.rb +40 -118
  10. data/lib/docubot/shells/docubot-help/3_Advanced_Topics/Controlling the Table of Contents.md +2 -4
  11. data/lib/docubot/shells/nvphysx/_templates/_root/common.css +10 -5
  12. data/lib/docubot/shells/nvphysx/_templates/_root/glossary.css +1 -0
  13. data/lib/docubot/shells/nvphysx/_templates/_root/glossary.js +11 -1
  14. data/lib/docubot/shells/nvphysx/_templates/section.haml +9 -0
  15. data/lib/docubot/templates/index.haml +13 -20
  16. data/lib/docubot/templates/section.haml +1 -4
  17. data/lib/docubot/templates/toc.haml +2 -11
  18. data/lib/docubot/templates/top.haml +7 -4
  19. data/lib/docubot/writers/chm.rb +6 -5
  20. data/lib/docubot/writers/chm/hhc.erb +35 -12
  21. data/lib/docubot/writers/chm/hhk.erb +1 -1
  22. data/lib/docubot/writers/chm/hhp.erb +2 -2
  23. data/lib/docubot/writers/html.rb +33 -23
  24. data/spec/_all.rb +1 -0
  25. data/spec/_helper.rb +10 -0
  26. data/spec/bundle.rb +193 -2
  27. data/spec/global.rb +28 -0
  28. data/spec/glossary.rb +13 -11
  29. data/spec/page.rb +35 -9
  30. data/spec/samples/attributes/defaults.haml +34 -0
  31. data/spec/samples/attributes/explicit1.haml +43 -0
  32. data/spec/samples/attributes/explicit2.haml +42 -0
  33. data/spec/samples/attributes/hidden.haml +40 -0
  34. data/spec/samples/attributes/index.md +8 -0
  35. data/spec/samples/collisions/page1.md +3 -0
  36. data/spec/samples/collisions/page1.textile +3 -0
  37. data/spec/samples/collisions/page2.haml +4 -0
  38. data/spec/samples/collisions/page2.html +3 -0
  39. data/spec/samples/collisions/page2.txt +3 -0
  40. data/spec/samples/collisions/page3.bin +1 -0
  41. data/spec/samples/collisions/page3.md +3 -0
  42. data/spec/samples/{link_test/sub2/bozo.bin → files/BUILDING.txt} +0 -0
  43. data/spec/samples/{titletest/1 First One.txt → files/_static/Thumbs.db} +0 -0
  44. data/spec/samples/{titletest/2_Second_One.txt → files/_static/foo.ai} +0 -0
  45. data/spec/samples/{titletest/4 Fourth_One.txt → files/_static/foo.png} +0 -0
  46. data/spec/samples/{titletest/5_Fifth One.txt → files/_static/foo.psd} +0 -0
  47. data/spec/samples/files/another.md +0 -0
  48. data/spec/samples/files/common.css +0 -0
  49. data/spec/samples/files/first.textile +0 -0
  50. data/spec/samples/files/index.md +2 -0
  51. data/spec/samples/files/section/foo.jpg +0 -0
  52. data/spec/samples/files/section/page.haml +0 -0
  53. data/spec/samples/files/section/sub section/Thumbs.db b/data/spec/samples/files/section/sub → section/Thumbs.db +0 -0
  54. data/spec/samples/files/section/sub section/foo.gif b/data/spec/samples/files/section/sub → section/foo.gif +0 -0
  55. data/spec/samples/files/section/sub section/page.txt b/data/spec/samples/files/section/sub → section/page.txt +0 -0
  56. data/spec/samples/{link_test → links}/index.txt +0 -0
  57. data/spec/samples/{link_test → links}/root.md +0 -0
  58. data/spec/samples/{link_test → links}/sub1/inner1.md +0 -0
  59. data/spec/samples/{link_test → links}/sub2.md +0 -0
  60. data/spec/samples/links/sub2/bozo.bin +0 -0
  61. data/spec/samples/{link_test → links}/sub2/inner2.md +0 -0
  62. data/spec/samples/templates/_templates/404.haml +1 -0
  63. data/spec/samples/templates/_templates/doubler.haml +7 -0
  64. data/spec/samples/templates/_templates/page.haml +2 -0
  65. data/spec/samples/templates/goaway.txt +3 -0
  66. data/spec/samples/templates/onepara_html.html +3 -0
  67. data/spec/samples/templates/onepara_md.md +5 -0
  68. data/spec/samples/templates/twopara_haml.haml +7 -0
  69. data/spec/samples/templates/twopara_textile.textile +6 -0
  70. data/spec/samples/titles/1 First One.txt b/data/spec/samples/titles/1 First → One.txt +0 -0
  71. data/spec/samples/titles/2_Second_One.txt +0 -0
  72. data/spec/samples/{titletest → titles}/3_renamed.txt +0 -0
  73. data/spec/samples/titles/4 Fourth_One.txt b/data/spec/samples/titles/4 → Fourth_One.txt +0 -0
  74. data/spec/samples/titles/5_Fifth One.txt b/data/spec/samples/titles/5_Fifth → One.txt +0 -0
  75. data/spec/samples/titles/911.txt +0 -0
  76. data/spec/samples/titles/index.txt +2 -0
  77. data/spec/templates.rb +42 -0
  78. data/spec/toc.rb +64 -30
  79. metadata +53 -14
  80. data/spec/samples/titletest/index.txt +0 -2
@@ -3,22 +3,45 @@
3
3
  <HEAD>
4
4
  <meta name="GENERATOR" content="Microsoft&reg; HTML Help Workshop 4.1">
5
5
  <!-- Sitemap 1.0 -->
6
- <%@write_section = lambda do |page| %>
6
+ <%
7
+ ICON = {
8
+ :book => 1,
9
+ :folder => 5,
10
+ :question => 9,
11
+ :page => 11,
12
+ :internet => 13,
13
+ :info => 17,
14
+ :shortcut => 19,
15
+ :letter => 23,
16
+ :attachment => 25,
17
+ :contact => 27,
18
+ :sound => 29,
19
+ :cd => 31,
20
+ :movie => 33,
21
+ :list => 35,
22
+ :idea => 37,
23
+ :note => 39,
24
+ :tool => 41
25
+ }
26
+
27
+ @write_section = lambda do |node|
28
+ %>
7
29
  <UL>
8
- <%page.pages.each do |child|%>
9
- <%next if child.hide%>
30
+ <%node.children.each do |child|
31
+ icon = if child.anchor
32
+ ICON[:info]
33
+ elsif child.page.icon
34
+ ICON[ child.page.icon.downcase.to_sym ] || child.page.icon
35
+ else
36
+ child.leaf? ? ICON[:page] : ICON[:book]
37
+ end
38
+ %>
10
39
  <LI> <OBJECT type="text/sitemap">
11
40
  <param name="Name" value="<%=CGI.escapeHTML child.title%>">
12
- <param name="Local" value="<%=FileUtils.win_path( @html_path / child.html_path ).gsub('&','%26')%>">
13
- <%if child.icon?
14
- %><param name="ImageNumber" value="<%=child.icon%>"><%
15
- elsif child.sublink?
16
- %><param name="ImageNumber" value="17"><%
17
- elsif child.leaf?
18
- %><param name="ImageNumber" value="11"><%
19
- end%>
41
+ <param name="Local" value="<%=FileUtils.win_path( @html_path / child.link ).gsub('&','%26')%>">
42
+ <param name="ImageNumber" value="<%=icon%>">
20
43
  </OBJECT>
21
- <%@write_section[child] unless child.pages.empty?%>
44
+ <%@write_section[child] unless child.children.empty?%>
22
45
  <%end%>
23
46
  </UL>
24
47
  <%end%>
@@ -8,7 +8,7 @@
8
8
  <param name="FrameName" value="right">
9
9
  </OBJECT>
10
10
  <UL>
11
- <%@toc.index.each do |entry,pages|%>
11
+ <%@global.index.each do |entry,pages|%>
12
12
  <LI> <OBJECT type="text/sitemap">
13
13
  <param name="Name" value="<%=entry%>">
14
14
  <param name="Local" value="<%=FileUtils.win_path( @html_path/pages.first.html_path )%>">
@@ -7,11 +7,11 @@ Index file="<%=FileUtils.win_path @hhk%>"
7
7
  <%end%>Display compile progress=No
8
8
  Full-text search=Yes
9
9
  Language=0x409 English (United States)
10
- Title=<%=@toc.title%>
10
+ Title=<%=@global.title%>
11
11
 
12
12
 
13
13
  [FILES]
14
- <%@toc.descendants.each do |page|
14
+ <%@bundle.pages.each do |page|
15
15
  %><%=FileUtils.win_path( @html_path/page.html_path) %>
16
16
  <%end
17
17
  @bundle.extras.each do |file|
@@ -12,6 +12,8 @@ class DocuBot::HTMLWriter < DocuBot::Writer
12
12
 
13
13
  master_templates = DocuBot::TEMPLATE_DIR
14
14
  source_templates = source/'_templates'
15
+ master_root = master_templates/'_root'
16
+ source_root = source_templates/'_root'
15
17
 
16
18
  # Copy any files found in the source directory that weren't made into pages
17
19
  @bundle.extras.each do |file|
@@ -33,26 +35,34 @@ class DocuBot::HTMLWriter < DocuBot::Writer
33
35
  o = Object.new
34
36
 
35
37
  # Write out every page
36
- template = File.exists?( source_templates/'top.haml' ) ? source_templates/'top.haml' : master_templates/'top.haml'
37
- template = Haml::Engine.new( IO.read( template ), HAML_OPTIONS )
38
- @bundle.toc.descendants.each do |page|
39
- next if page.sublink?
40
- contents = page.to_html
41
- root = "../" * page.depth
42
- html = template.render( o, :page=>page, :contents=>contents, :global=>@bundle.toc, :root=>root )
43
- FileUtils.mkdir_p( File.dirname( page.html_path ) )
44
- File.open( page.html_path, 'w' ){ |f| f << html }
45
- end
38
+ top = File.exists?( source_templates/'top.haml' ) ? source_templates/'top.haml' : master_templates/'top.haml'
39
+ top = Haml::Engine.new( IO.read( top ), HAML_OPTIONS )
40
+ @bundle.toc.descendants.each do |node|
41
+ next if node.anchor
42
+
43
+ contents = node.page.to_html
44
+ template = node.page.template # Call page.to_html first to ensure page.template is set
46
45
 
47
- # Write out the TOC and Index (even though the CHM won't use them, others may)
48
- { 'toc.haml'=>'_toc.html', 'index.haml'=>'_index.html' }.each do |haml,output|
49
- File.open( output, 'w' ) do |f|
50
- template = File.exists?( source_templates/haml ) ? source_templates/haml : master_templates/haml
51
- template = Haml::Engine.new( IO.read( template ), HAML_OPTIONS )
52
- f << template.render( o, :toc=>@bundle.toc, :global=>@bundle.toc, :root=>'' )
53
- end
46
+ custom_js = "#{template}.js"
47
+ custom_js = nil unless File.exists?( source_root/custom_js ) || File.exists?( master_root/custom_js )
48
+
49
+ custom_css = "#{template}.css"
50
+ custom_css = nil unless File.exists?( source_root/custom_css ) || File.exists?( master_root/custom_css )
51
+
52
+ variables = {
53
+ :page => node.page,
54
+ :contents => contents,
55
+ :global => @bundle.global,
56
+ :root => node.root,
57
+ :breadcrumb => node.ancestors,
58
+ :custom_js => custom_js,
59
+ :custom_css => custom_css
60
+ }
61
+ html = top.render( o, variables )
62
+ FileUtils.mkdir_p( File.dirname( node.file ) )
63
+ File.open( node.file, 'w' ){ |f| f << html }
54
64
  end
55
-
65
+
56
66
  File.open( 'glossary-terms.js', 'w' ){ |f| f << @bundle.glossary.to_js }
57
67
  end
58
68
 
@@ -61,13 +71,13 @@ class DocuBot::HTMLWriter < DocuBot::Writer
61
71
  end
62
72
 
63
73
  module Haml::Helpers
64
- def li_pages_for( page )
65
- page.pages.each do |child|
66
- haml_tag :li do
67
- haml_tag :a, :href=>child.html_path do
74
+ def li_pages_for( node )
75
+ node.children.each do |child|
76
+ haml_tag :li, :class=>(child.anchor ? 'sublink' : child.children.empty? ? 'section' : 'page' ) do
77
+ haml_tag :a, :href=>child.link do
68
78
  haml_concat child.title
69
79
  end
70
- unless child.pages.empty?
80
+ unless child.children.empty?
71
81
  haml_tag :ul do
72
82
  li_pages_for child
73
83
  end
@@ -1,5 +1,6 @@
1
1
  #encoding: UTF-8
2
2
  $: << '..'
3
+ require 'spec/global'
3
4
  require 'spec/bundle'
4
5
  require 'spec/toc'
5
6
  require 'spec/converters'
@@ -4,3 +4,13 @@ require 'minitest/spec'
4
4
  require 'docubot'
5
5
  SAMPLES = File.dirname(__FILE__)/'samples'
6
6
  MiniTest::Unit.autorun
7
+
8
+ class MiniTest::Spec
9
+ class << self
10
+ alias_method :__it__, :it
11
+ end
12
+ def self.it desc, &block
13
+ block ||= proc{ skip "(no tests defined)" }
14
+ __it__( desc, &block )
15
+ end
16
+ end
@@ -18,7 +18,7 @@ describe "Bundle from empty directory" do
18
18
 
19
19
  it "should have an empty TOC" do
20
20
  @bundle.toc.wont_be_nil
21
- @bundle.toc.pages.must_be_empty
21
+ @bundle.toc.descendants.must_be_empty
22
22
  end
23
23
 
24
24
  it "should have an empty index" do
@@ -61,7 +61,7 @@ end
61
61
  describe "Gathering links" do
62
62
  before do
63
63
  @out, @err = capture_io do
64
- @bundle = DocuBot::Bundle.new SAMPLES/'link_test'
64
+ @bundle = DocuBot::Bundle.new SAMPLES/'links'
65
65
  end
66
66
  end
67
67
 
@@ -140,3 +140,194 @@ describe "Gathering links" do
140
140
  end
141
141
  end
142
142
  end
143
+
144
+ describe "Identifying Conflicts" do
145
+ it "should raise when multiple pages will write to the same html" do
146
+ proc{
147
+ @bundle = DocuBot::Bundle.new( SAMPLES/'collisions' )
148
+ }.must_raise(DocuBot::Bundle::PageCollision)
149
+ end
150
+
151
+ it "should include the title and filename of every conflicting page" do
152
+ begin
153
+ @bundle = DocuBot::Bundle.new( SAMPLES/'collisions' )
154
+ rescue DocuBot::Bundle::PageCollision => e
155
+ e.message.must_include "page1.md"
156
+ e.message.must_include "page1.textile"
157
+ e.message.must_include "Page 1 (from Markdown)"
158
+ e.message.must_include "Page 1 (from Textile)"
159
+ e.message.must_include "page2.html"
160
+ e.message.must_include "page2.txt"
161
+ e.message.must_include "page2.haml"
162
+ e.message.must_include "Page 2 (from html)"
163
+ e.message.must_include "Page 2 (from text)"
164
+ e.message.must_include "Page 2 (from haml)"
165
+ e.message.wont_include "page3.md"
166
+ e.message.wont_include "page3.bin"
167
+ e.message.wont_include "Page 3"
168
+ end
169
+ end
170
+
171
+ end
172
+
173
+ describe "Bundle with Extra Files" do
174
+ before do
175
+ @out, @err = capture_io do
176
+ @bundle = DocuBot::Bundle.new( SAMPLES/'files' )
177
+ end
178
+ end
179
+
180
+ it "should keep track of extra files seen" do
181
+ @bundle.extras.wont_be_nil
182
+ static_files = %w[ common.css _static/foo.png section/foo.jpg ]
183
+ static_files << "section/sub section/foo.gif"
184
+ static_files.each do |path|
185
+ @bundle.extras.must_include path
186
+ end
187
+ end
188
+
189
+ it "should not count page sources as extra files" do
190
+ page_files = %w[ index.md another.md first.textile section/page.haml ]
191
+ page_files << "section/sub section/page.txt"
192
+ page_files.each do |path|
193
+ @bundle.extras.wont_include path
194
+ end
195
+ end
196
+
197
+ it "should skip files specified by global glob matches" do
198
+ @bundle.global.ignore.as_list.must_equal %w[ **/*.psd **/*.ai **/Thumbs.db BUILDING.txt ]
199
+ bad_files = %w[ _static/foo.ai _static/foo.psd _static/Thumbs.db ]
200
+ bad_files << "section/sub section/Thumbs.db"
201
+ bad_files.each do |path|
202
+ @bundle.extras.wont_include path
203
+ end
204
+ end
205
+
206
+ it "should not count ignored files as the source for pages" do
207
+ @bundle.pages.find{ |page| page.file == 'BUILDING.txt' }.must_be_nil
208
+ @bundle.page_by_file_path['BUILDING.txt'].must_be_nil
209
+ end
210
+ end
211
+
212
+ describe "Pages in bundles" do
213
+ before do
214
+ @titles = [ 'First One', 'Second One', 'Third One', 'Fourth One', 'Fifth One', '911' ]
215
+ Dir.chdir SAMPLES/'links' do
216
+ @files = Dir['**/*'] - %w[ index.txt sub2/bozo.bin ]
217
+ @htmls = @files.map{ |path|
218
+ path[/\.[^.]+$/] ? path.gsub(/\.[^.]+$/,'.html') : path/'index.html'
219
+ }
220
+ end
221
+ @out, @err = capture_io do
222
+ @titles_bundle = DocuBot::Bundle.new SAMPLES/'titles'
223
+ @links_bundle = DocuBot::Bundle.new SAMPLES/'links'
224
+ end
225
+ end
226
+
227
+ it "should allow you to find arrays of pages by title" do
228
+ @titles_bundle.pages_by_title.wont_be_nil
229
+ @titles.each do |page_title|
230
+ pages = @titles_bundle.pages_by_title[page_title]
231
+ pages.must_be_kind_of Array
232
+ pages.length.must_equal 1
233
+ pages.first.must_be_kind_of DocuBot::Page
234
+ end
235
+ end
236
+
237
+ it "should return an empty array for a non-existent page" do
238
+ pages = @titles_bundle.pages_by_title['NONE SUCH']
239
+ pages.must_be_kind_of Array
240
+ pages.length.must_equal 0
241
+ end
242
+
243
+ it "should not include the main index file in the titles" do
244
+ pages = @titles_bundle.pages_by_title["Title Changin'"]
245
+ pages.must_be_kind_of Array
246
+ pages.length.must_equal 0
247
+ end
248
+
249
+ it "should give access to pages by source file path" do
250
+ @links_bundle.page_by_file_path.wont_be_nil
251
+ @files.each do |path|
252
+ @links_bundle.page_by_file_path[path].must_be_kind_of DocuBot::Page
253
+ end
254
+ end
255
+
256
+ it "should return nil for an unfound file path" do
257
+ @links_bundle.page_by_file_path['NONE SUCH'].must_be_nil
258
+ end
259
+
260
+ it "should not include raw files in the file paths" do
261
+ @links_bundle.page_by_file_path['sub2/bozo.bin'].must_be_nil
262
+ end
263
+
264
+ it "should give access to pages by html file path" do
265
+ @links_bundle.page_by_html_path.wont_be_nil
266
+ @htmls.each do |path|
267
+ p path unless @links_bundle.page_by_html_path[path]
268
+ @links_bundle.page_by_html_path[path].wont_be_nil
269
+ @links_bundle.page_by_html_path[path].must_be_kind_of DocuBot::Page
270
+ end
271
+ end
272
+
273
+ it "should return nil for an unfound html path" do
274
+ @links_bundle.page_by_html_path['NONE SUCH'].must_be_nil
275
+ end
276
+
277
+ it "should not include raw files in the html paths" do
278
+ @links_bundle.page_by_html_path['sub2/bozo.bin'].must_be_nil
279
+ end
280
+ end
281
+
282
+ describe "Global bundle attributes" do
283
+ before do
284
+ @out, @err = capture_io do
285
+ @bundle = DocuBot::Bundle.new SAMPLES/'attributes'
286
+ end
287
+ end
288
+
289
+ it "should have a global object" do
290
+ @bundle.global.wont_be_nil
291
+ end
292
+
293
+ it "should be indexable by method and return strings" do
294
+ @bundle.global.author.must_equal "Gavin Kistner"
295
+ @bundle.global.default.must_equal "All About Mr. Friggles"
296
+ @bundle.global.quotes.must_equal %q{"It's all about Mr. Benjamin", "I have never seen this cat before in my life!"}
297
+ @bundle.global.awesome.must_equal "true"
298
+ end
299
+
300
+ it "should be indexable by string" do
301
+ @bundle.global['author.email'].must_equal "!@phrogz.net"
302
+ @bundle.global['author website'].must_equal "http://phrogz.net"
303
+ end
304
+
305
+ it "should use utf8 for the strings" do
306
+ if Object.const_defined? :Encoding
307
+ Encoding.compatible?( @bundle.global.title, "UTF-8™")
308
+ end
309
+ @bundle.global.title.must_equal "Friggles® The Cat, ©2009"
310
+ end
311
+
312
+ it "should allow casting values to boolean" do
313
+ @bundle.global.awesome.as_boolean.must_equal true
314
+ end
315
+
316
+ it "should allow casting values to arrays of strings" do
317
+ quotes = @bundle.global.quotes.as_list
318
+ quotes.must_be_kind_of Array
319
+ quotes.must_equal [ "It's all about Mr. Benjamin", "I have never seen this cat before in my life!" ]
320
+ end
321
+ end
322
+
323
+ describe "Page attributes" do
324
+ before do
325
+ @out, @err = capture_io do
326
+ @bundle = DocuBot::Bundle.new SAMPLES/'attributes'
327
+ end
328
+ end
329
+
330
+ it "does something" do
331
+
332
+ end
333
+ end
@@ -0,0 +1,28 @@
1
+ #encoding: UTF-8
2
+ require File.join(File.dirname(__FILE__), "_helper")
3
+
4
+ # http://www.w3.org/TR/html4/types.html#type-id
5
+ # We disallow colons or periods in the ID because they mess up CSS selectors
6
+ # We require an octothorpe at the front because it makes life easier
7
+ VALID_ID = /#[a-z][\w-]*/i
8
+
9
+ describe "Generating IDs from Text" do
10
+ it "must create a valid identifier from a variety of input" do
11
+ DocuBot.id_from_text("foo").must_match VALID_ID
12
+ DocuBot.id_from_text("foo-bar").must_match VALID_ID
13
+ DocuBot.id_from_text("Foo-Bar").must_match VALID_ID
14
+ DocuBot.id_from_text("foo bar").must_match VALID_ID
15
+ DocuBot.id_from_text(" foo").must_match VALID_ID
16
+ DocuBot.id_from_text("foo ").must_match VALID_ID
17
+ DocuBot.id_from_text(" foo ").must_match VALID_ID
18
+ DocuBot.id_from_text("foo:bar").must_match VALID_ID
19
+ DocuBot.id_from_text("foo.bar").must_match VALID_ID
20
+ DocuBot.id_from_text("foo!bar").must_match VALID_ID
21
+ DocuBot.id_from_text("foo?!bar").must_match VALID_ID
22
+ DocuBot.id_from_text("foo(bar)").must_match VALID_ID
23
+ DocuBot.id_from_text("(foo)bar").must_match VALID_ID
24
+ DocuBot.id_from_text("!foo bar").must_match VALID_ID
25
+ DocuBot.id_from_text("foo: bar").must_match VALID_ID
26
+ DocuBot.id_from_text("!!!").wont_match VALID_ID
27
+ end
28
+ end
@@ -13,8 +13,8 @@ describe "Glossary Scanner" do
13
13
  @out, @err = capture_io do
14
14
  @bundle = DocuBot::Bundle.new SAMPLES/'glossary'
15
15
  @glossary = @bundle.glossary
16
- @page = @bundle.toc.every_page.find{ |page| page.title=='Glossary' }
17
- @fulldoc = Nokogiri::HTML( @page.to_html )
16
+ @page = @bundle.pages_by_title['Glossary'].first
17
+ @fulldoc = Nokogiri::HTML::DocumentFragment.parse( @page.to_html )
18
18
  end
19
19
  end
20
20
 
@@ -34,9 +34,9 @@ describe "Glossary Scanner" do
34
34
  @glossary.entries.values.each do |defn|
35
35
  defn.must_be_kind_of DocuBot::Page
36
36
  end
37
- @glossary.entries["Secret Term"].hide.must_equal true
37
+ @glossary.entries["Secret Term"].hide.as_boolean.must_equal true
38
38
  end
39
-
39
+
40
40
  it "supports iterating over the entries with each" do
41
41
  count = 0
42
42
  @glossary.each do |page,defn|
@@ -47,26 +47,28 @@ describe "Glossary Scanner" do
47
47
  count.must_equal @all_terms.length
48
48
  end
49
49
 
50
-
51
50
  it "uses converters for page content" do
52
51
  @expected_paragraphs.each do |term,paras|
53
- @glossary.entries[term].nokodoc.xpath('//p').length.must_equal paras
52
+ @glossary.entries[term].nokodoc.xpath('.//p').length.must_equal paras
54
53
  end
55
54
  end
56
55
 
57
56
  it "supports a glossary template that generates HTML for terms" do
58
- definitions = @fulldoc.xpath('//dt')
57
+ definitions = @fulldoc.xpath('.//dt')
59
58
  @expected_paragraphs.each do |term,paras|
60
59
  dt = definitions.find{ |node| node.inner_text==term }
61
60
  dt.wont_be_nil
62
- dt.next_element.xpath('.//p').length.must_equal paras
61
+ if dt.next_element.xpath('.//p').length != paras
62
+ puts dt.next_element.to_html
63
+ end
64
+ dt.next_element.xpath('.//p').length.must_equal paras
63
65
  end
64
66
  end
65
-
67
+
66
68
  it "does not include hidden pages in the output" do
67
- definitions = @fulldoc.xpath('//dt')
69
+ definitions = @fulldoc.xpath('.//dt')
68
70
  @hidden_terms.each do |term|
69
- @fulldoc.at_xpath("//dt[text()='#{term}']").must_be_nil
71
+ @fulldoc.at_xpath(".//dt[text()='#{term}']").must_be_nil
70
72
  end
71
73
  end
72
74
  end