docubot 0.3 → 0.3.2
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/docubot +0 -0
- data/lib/docubot/bundle.rb +75 -11
- data/lib/docubot/glossary.rb +19 -14
- data/lib/docubot/page.rb +114 -56
- data/lib/docubot/shells/nvphysx/0_License.md +3 -0
- data/lib/docubot/shells/nvphysx/1_Getting_Started.haml +51 -0
- data/lib/docubot/shells/nvphysx/Appendix/Glossary.md +7 -0
- data/lib/docubot/shells/nvphysx/_glossary/APEX.md +1 -0
- data/lib/docubot/shells/nvphysx/_glossary/NVIDIA.md +1 -0
- data/lib/docubot/shells/nvphysx/_glossary/PhysX.textile +3 -0
- data/lib/docubot/shells/nvphysx/_static/NVBadge_3D.png +0 -0
- data/lib/docubot/shells/nvphysx/_static/PhysXbyNV_Black.png +0 -0
- data/lib/docubot/shells/nvphysx/_templates/_root/bg_green_bar_revised.gif +0 -0
- data/lib/docubot/shells/nvphysx/_templates/_root/close.png +0 -0
- data/lib/docubot/shells/nvphysx/_templates/_root/common.css +264 -0
- data/lib/docubot/shells/nvphysx/_templates/_root/glossary.css +4 -0
- data/lib/docubot/shells/nvphysx/_templates/_root/glossary.js +24 -0
- data/lib/docubot/shells/nvphysx/_templates/_root/nvdevtools.js +31 -0
- data/lib/docubot/shells/nvphysx/_templates/_root/nvidia-logo.gif +0 -0
- data/lib/docubot/shells/nvphysx/_templates/_root/right-sidebar.png +0 -0
- data/lib/docubot/shells/nvphysx/_templates/top.haml +28 -0
- data/lib/docubot/shells/nvphysx/index.txt +5 -0
- data/lib/docubot/snippet.rb +1 -0
- data/lib/docubot/snippets/glossary.rb +1 -0
- data/lib/docubot/templates/_root/glossary.css +4 -0
- data/lib/docubot/templates/_root/glossary.js +58 -0
- data/lib/docubot/templates/glossary.haml +3 -2
- data/lib/docubot/templates/top.haml +4 -0
- data/lib/docubot/writers/chm.rb +6 -3
- data/lib/docubot/writers/html.rb +1 -1
- data/spec/_all.rb +12 -0
- data/spec/_helper.rb +6 -0
- data/spec/bundle.rb +142 -0
- data/spec/command.rb +3 -0
- data/spec/converters.rb +2 -0
- data/spec/glossary.rb +93 -0
- data/spec/index.rb +2 -0
- data/spec/page.rb +24 -0
- data/spec/samples/glossary/Glossary.txt +5 -0
- data/spec/samples/glossary/Some Page.md +3 -0
- data/spec/samples/glossary/_glossary/Simple Term.md +3 -0
- data/spec/samples/glossary/_glossary/complex.haml +8 -0
- data/spec/samples/glossary/_glossary/project_x.md +4 -0
- data/spec/samples/link_test/index.txt +11 -0
- data/spec/samples/link_test/root.md +14 -0
- data/spec/samples/link_test/sub1/inner1.md +11 -0
- data/spec/samples/link_test/sub2.md +3 -0
- data/{test/site1_html/toc.css → spec/samples/link_test/sub2/bozo.bin} +0 -0
- data/spec/samples/link_test/sub2/inner2.md +7 -0
- data/spec/samples/simplest/HTML.html +10 -0
- data/spec/samples/simplest/Haml.haml +13 -0
- data/spec/samples/simplest/Markdown.md +10 -0
- data/spec/samples/simplest/Text.txt +10 -0
- data/spec/samples/simplest/Textile.textile +10 -0
- data/test/site1_html/toc.js b/data/spec/samples/titletest/1 First → One.txt +0 -0
- data/spec/samples/titletest/2_Second_One.txt +0 -0
- data/spec/samples/titletest/3_renamed.txt +2 -0
- data/spec/samples/titletest/4 Fourth_One.txt b/data/spec/samples/titletest/4 → Fourth_One.txt +0 -0
- data/spec/samples/titletest/5_Fifth One.txt b/data/spec/samples/titletest/5_Fifth → One.txt +0 -0
- data/spec/samples/titletest/index.txt +2 -0
- data/spec/templates.rb +2 -0
- data/spec/toc.rb +73 -0
- data/spec/writer/chm.rb +2 -0
- data/spec/writer/html.rb +2 -0
- metadata +74 -35
- data/test/all.rb +0 -8
- data/test/site1/A Slight Change of Heart/1 Ze First Page in Ze Section.md +0 -1
- data/test/site1/A Slight Change of Heart/2 Another Page in the Section.md +0 -1
- data/test/site1/A Slight Change of Heart/3_more_crap.haml +0 -17
- data/test/site1/appendices/gkheadftw.html +0 -2
- data/test/site1/appendices/index.md +0 -2
- data/test/site1/headers.md +0 -10
- data/test/site1/preamble.haml +0 -4
- data/test/site1/raw.textile +0 -10
- data/test/site1_html/A Slight Change of Heart/1 Ze First Page in Ze Section.html +0 -30
- data/test/site1_html/A Slight Change of Heart/2 Another Page in the Section.html +0 -30
- data/test/site1_html/A Slight Change of Heart/3_more_crap.html +0 -42
- data/test/site1_html/A Slight Change of Heart/3_more_crap.html#frist-post +0 -29
- data/test/site1_html/A Slight Change of Heart/3_more_crap.html#moar +0 -29
- data/test/site1_html/A Slight Change of Heart/index.html +0 -28
- data/test/site1_html/_index.html +0 -17
- data/test/site1_html/_toc.html +0 -73
- data/test/site1_html/appendices/gkheadftw.html +0 -32
- data/test/site1_html/appendices/index.html +0 -28
- data/test/site1_html/common.css +0 -108
- data/test/site1_html/glossary-terms.js +0 -1
- data/test/site1_html/headers.html +0 -42
- data/test/site1_html/preamble.html +0 -36
- data/test/site1_html/raw.html +0 -33
@@ -3,6 +3,9 @@
|
|
3
3
|
%head
|
4
4
|
%meta(http-equiv='Content-Type' content='text/html; charset=utf-8')
|
5
5
|
%link{:rel=>'stylesheet', :type=>'text/css', :href=>"#{root}common.css", :media=>'all'}
|
6
|
+
%link{:rel=>'stylesheet', :type=>'text/css', :href=>"#{root}glossary.css", :media=>'all'}
|
7
|
+
%script{:type=>'text/javascript', :src=>"#{root}glossary-terms.js"}
|
8
|
+
%script{:type=>'text/javascript', :src=>"#{root}glossary.js"}
|
6
9
|
%title= page.title
|
7
10
|
%body{ :class=>page.style }
|
8
11
|
#content
|
@@ -19,6 +22,7 @@
|
|
19
22
|
- if page.author?
|
20
23
|
#author= page.author
|
21
24
|
#pagebody
|
25
|
+
#glossary-box
|
22
26
|
#mainbody= contents
|
23
27
|
#pagefooter
|
24
28
|
Copyright ©#{Time.now.year}#{ " #{global.company}" if global.company? }.
|
data/lib/docubot/writers/chm.rb
CHANGED
@@ -14,7 +14,8 @@ class DocuBot::CHMWriter < DocuBot::HTMLWriter
|
|
14
14
|
write_hhc
|
15
15
|
write_hhk
|
16
16
|
write_hhp
|
17
|
-
puts "...%.2fs to write the CHM support files" % (
|
17
|
+
puts "...%.2fs to write the CHM support files" % (Time.now-lap)
|
18
|
+
lap = Time.now
|
18
19
|
|
19
20
|
# This will fail if a handle is open to it on Windows
|
20
21
|
begin
|
@@ -26,12 +27,14 @@ class DocuBot::CHMWriter < DocuBot::HTMLWriter
|
|
26
27
|
end
|
27
28
|
end
|
28
29
|
`hhc.exe "#{FileUtils.win_path @hhp}"`.gsub( /[\r\n]+/, "\n" )
|
29
|
-
puts "...%.2fs to create the CHM" % (
|
30
|
+
puts "...%.2fs to create the CHM" % (Time.now-lap)
|
31
|
+
lap = Time.now
|
30
32
|
|
31
33
|
# Clean out the intermediary files
|
32
34
|
FileUtils.rm( [ @hhc, @hhp, @hhk ] )
|
33
35
|
FileUtils.rm_r( @html_path )
|
34
|
-
puts "...%.2fs to clean up temporary files" % (
|
36
|
+
puts "...%.2fs to clean up temporary files" % (Time.now-lap)
|
37
|
+
lap = Time.now
|
35
38
|
|
36
39
|
# Spin a new thread so it doesn't hold up the Ruby process, but sleep long enough for it to get going.
|
37
40
|
Thread.new{ `hh.exe "#{FileUtils.win_path @chm_path}"` }
|
data/lib/docubot/writers/html.rb
CHANGED
@@ -37,7 +37,7 @@ class DocuBot::HTMLWriter < DocuBot::Writer
|
|
37
37
|
template = Haml::Engine.new( IO.read( template ), HAML_OPTIONS )
|
38
38
|
@bundle.toc.descendants.each do |page|
|
39
39
|
next if page.sublink?
|
40
|
-
contents = page.to_html
|
40
|
+
contents = page.to_html
|
41
41
|
root = "../" * page.depth
|
42
42
|
html = template.render( o, :page=>page, :contents=>contents, :global=>@bundle.toc, :root=>root )
|
43
43
|
FileUtils.mkdir_p( File.dirname( page.html_path ) )
|
data/spec/_all.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
#encoding: UTF-8
|
2
|
+
$: << '..'
|
3
|
+
require 'spec/bundle'
|
4
|
+
require 'spec/toc'
|
5
|
+
require 'spec/converters'
|
6
|
+
require 'spec/page'
|
7
|
+
require 'spec/glossary'
|
8
|
+
require 'spec/index'
|
9
|
+
require 'spec/templates'
|
10
|
+
require 'spec/command'
|
11
|
+
require 'spec/writer/html'
|
12
|
+
require 'spec/writer/chm'
|
data/spec/_helper.rb
ADDED
data/spec/bundle.rb
ADDED
@@ -0,0 +1,142 @@
|
|
1
|
+
#encoding: UTF-8
|
2
|
+
require File.join(File.dirname(__FILE__), "_helper")
|
3
|
+
|
4
|
+
describe "AbusedBundle" do
|
5
|
+
it 'requires a valid path' do
|
6
|
+
proc{ DocuBot::Bundle.new }.must_raise(ArgumentError)
|
7
|
+
proc{ DocuBot::Bundle.new "does not exist" }.must_raise(RuntimeError)
|
8
|
+
DocuBot::Bundle.new(SAMPLES/'empty').wont_be_nil
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "Bundle from empty directory" do
|
13
|
+
before do
|
14
|
+
@out, @err = capture_io do
|
15
|
+
@bundle = DocuBot::Bundle.new SAMPLES/'empty'
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should have an empty TOC" do
|
20
|
+
@bundle.toc.wont_be_nil
|
21
|
+
@bundle.toc.pages.must_be_empty
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should have an empty index" do
|
25
|
+
@bundle.index.wont_be_nil
|
26
|
+
@bundle.index.entries.must_be_empty
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should have an empty glossary" do
|
30
|
+
@bundle.glossary.wont_be_nil
|
31
|
+
@bundle.glossary.entries.must_be_empty
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should have an empty external link list" do
|
35
|
+
@bundle.external_links.wont_be_nil
|
36
|
+
@bundle.external_links.must_be_empty
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should have an empty internal link list" do
|
40
|
+
@bundle.internal_links.wont_be_nil
|
41
|
+
@bundle.internal_links.must_be_empty
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should have an empty file link list" do
|
45
|
+
@bundle.file_links.wont_be_nil
|
46
|
+
@bundle.file_links.must_be_empty
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should have an empty broken link list" do
|
50
|
+
@bundle.broken_links.wont_be_nil
|
51
|
+
@bundle.broken_links.must_be_empty
|
52
|
+
end
|
53
|
+
|
54
|
+
it "should produce no warnings" do
|
55
|
+
@err.must_be_empty
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
|
60
|
+
|
61
|
+
describe "Gathering links" do
|
62
|
+
before do
|
63
|
+
@out, @err = capture_io do
|
64
|
+
@bundle = DocuBot::Bundle.new SAMPLES/'link_test'
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
it "should have link collections be pages hashed to arrays of strings" do
|
69
|
+
%w[ external_links internal_links file_links broken_links ].each do |method|
|
70
|
+
collection = @bundle.send(method)
|
71
|
+
collection.must_be_kind_of Hash
|
72
|
+
collection.keys.each do |key|
|
73
|
+
key.must_be_kind_of DocuBot::Page
|
74
|
+
end
|
75
|
+
collection.values.each do |value|
|
76
|
+
value.must_be_kind_of Array
|
77
|
+
value.each do |item|
|
78
|
+
item.must_be_kind_of String
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
it "should identify (but not validate) external links" do
|
85
|
+
known_external = %w[ http://www.google.com/ http://phrogz.net http://phrogz.net/tmp/gkhead.jpg HTTP://NONEXISTENT.SITE ]
|
86
|
+
all_external = @bundle.external_links.values.flatten
|
87
|
+
known_external.each do |link|
|
88
|
+
all_external.must_include link
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
it "should identify and warn about broken internal links" do
|
93
|
+
known_broken = %w[
|
94
|
+
fork.html sub1.html root.md sub1/inner1.md
|
95
|
+
inner2.html ../sub1 sub1/inner1.md
|
96
|
+
../index.html ../sub1 ../index.md
|
97
|
+
sub2/GORKBO.bin
|
98
|
+
]
|
99
|
+
all_broken = @bundle.broken_links.values.flatten
|
100
|
+
known_broken.each do |link|
|
101
|
+
all_broken.must_include link
|
102
|
+
@err.must_include link
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
it "should identify valid links to pages or sections" do
|
107
|
+
known_internal = %w[
|
108
|
+
sub1/inner1.html sub2.html sub2/inner2.html sub1/../sub2/inner2.html
|
109
|
+
../root.html inner1.html ../sub2.html ../sub2/inner2.html
|
110
|
+
../sub1/index.html index.html
|
111
|
+
]
|
112
|
+
all_internal = @bundle.internal_links.values.flatten
|
113
|
+
known_internal.each do |link|
|
114
|
+
all_internal.must_include link
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
it "should identify valid links to internal files" do
|
119
|
+
known_file_links = %w[ ../sub2/bozo.bin bozo.bin sub2/bozo.bin ]
|
120
|
+
all_file_links = @bundle.file_links.values.flatten
|
121
|
+
known_file_links.each do |link|
|
122
|
+
all_file_links.must_include link
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
it "should identify and warn about invalid sub-page anchors" do
|
127
|
+
known_broken = %w[ #GORKBO ../root.html#GORKBO ]
|
128
|
+
all_broken = @bundle.broken_links.values.flatten
|
129
|
+
known_broken.each do |link|
|
130
|
+
all_broken.must_include link
|
131
|
+
@err.must_include link
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
it "should identify valid sub-page anchors" do
|
136
|
+
known_internal = %w[ #sub-id root.html#sub-id ../root.html#sub-id ]
|
137
|
+
all_internal = @bundle.internal_links.values.flatten
|
138
|
+
known_internal.each do |link|
|
139
|
+
all_internal.must_include link
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
data/spec/command.rb
ADDED
data/spec/converters.rb
ADDED
data/spec/glossary.rb
ADDED
@@ -0,0 +1,93 @@
|
|
1
|
+
#encoding: UTF-8
|
2
|
+
require File.join(File.dirname(__FILE__), "_helper")
|
3
|
+
|
4
|
+
describe "Glossary Scanner" do
|
5
|
+
before do
|
6
|
+
@public_terms = [ "Simple Term", "Complex Term" ]
|
7
|
+
@hidden_terms = [ "Secret Term"]
|
8
|
+
@all_terms = @public_terms + @hidden_terms
|
9
|
+
@expected_paragraphs = {
|
10
|
+
"Simple Term" => 2,
|
11
|
+
"Complex Term" => 3
|
12
|
+
}
|
13
|
+
@out, @err = capture_io do
|
14
|
+
@bundle = DocuBot::Bundle.new SAMPLES/'glossary'
|
15
|
+
@glossary = @bundle.glossary
|
16
|
+
@page = @bundle.toc.every_page.find{ |page| page.title=='Glossary' }
|
17
|
+
@fulldoc = Nokogiri::HTML( @page.to_html )
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# No _glossary folder handled in the Bundle spec for empty site
|
22
|
+
|
23
|
+
it "should have one internal entry for each term defined in _glossary" do
|
24
|
+
@glossary.entries.size.must_equal @all_terms.length
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should honor page titles as terms" do
|
28
|
+
@all_terms.each do |term|
|
29
|
+
@glossary.entries[term].wont_be_nil
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
it "uses DocuBot::Page instances for the definitions" do
|
34
|
+
@glossary.entries.values.each do |defn|
|
35
|
+
defn.must_be_kind_of DocuBot::Page
|
36
|
+
end
|
37
|
+
@glossary.entries["Secret Term"].hide.must_equal true
|
38
|
+
end
|
39
|
+
|
40
|
+
it "supports iterating over the entries with each" do
|
41
|
+
count = 0
|
42
|
+
@glossary.each do |page,defn|
|
43
|
+
page.must_be_kind_of String
|
44
|
+
defn.must_be_kind_of DocuBot::Page
|
45
|
+
count += 1
|
46
|
+
end
|
47
|
+
count.must_equal @all_terms.length
|
48
|
+
end
|
49
|
+
|
50
|
+
|
51
|
+
it "uses converters for page content" do
|
52
|
+
@expected_paragraphs.each do |term,paras|
|
53
|
+
@glossary.entries[term].nokodoc.xpath('//p').length.must_equal paras
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
it "supports a glossary template that generates HTML for terms" do
|
58
|
+
definitions = @fulldoc.xpath('//dt')
|
59
|
+
@expected_paragraphs.each do |term,paras|
|
60
|
+
dt = definitions.find{ |node| node.inner_text==term }
|
61
|
+
dt.wont_be_nil
|
62
|
+
dt.next_element.xpath('.//p').length.must_equal paras
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
it "does not include hidden pages in the output" do
|
67
|
+
definitions = @fulldoc.xpath('//dt')
|
68
|
+
@hidden_terms.each do |term|
|
69
|
+
@fulldoc.at_xpath("//dt[text()='#{term}']").must_be_nil
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
describe "Glossary Snippet" do
|
75
|
+
before do
|
76
|
+
@out, @err = capture_io do
|
77
|
+
@bundle = DocuBot::Bundle.new SAMPLES/'glossary'
|
78
|
+
@glossary = @bundle.glossary
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
it "should know about missing terms" do
|
83
|
+
@glossary.missing_terms.must_include "crazy term"
|
84
|
+
end
|
85
|
+
|
86
|
+
it "should not mistake alternate text for a missing term" do
|
87
|
+
@glossary.missing_terms.wont_include "more complex term"
|
88
|
+
end
|
89
|
+
|
90
|
+
it "should warn about missing terms" do
|
91
|
+
@err.must_include "crazy term"
|
92
|
+
end
|
93
|
+
end
|
data/spec/index.rb
ADDED
data/spec/page.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
#encoding: UTF-8
|
2
|
+
require File.join(File.dirname(__FILE__), "_helper")
|
3
|
+
|
4
|
+
describe "Pages from 'titletest'" do
|
5
|
+
before do
|
6
|
+
@bundle = DocuBot::Bundle.new( SAMPLES/'titletest' )
|
7
|
+
@toc = @bundle.toc
|
8
|
+
end
|
9
|
+
it "knows who its bundle is" do
|
10
|
+
@toc.pages.each{ |page| page.bundle.must_equal @bundle }
|
11
|
+
end
|
12
|
+
it "ignores leading numbers for the titles" do
|
13
|
+
@toc.pages.each{ |page| page.title.must_match /^\D/ }
|
14
|
+
end
|
15
|
+
it "honors pages specifying their title" do
|
16
|
+
@toc.pages.find{ |page| page.title =~ /renamed/i }.must_be_nil
|
17
|
+
@toc.pages.find{ |page| page.title == 'Third One' }.wont_be_nil
|
18
|
+
end
|
19
|
+
it "replaces underscores with spaces in the title" do
|
20
|
+
%w[ First Second Third Fourth Fifth ].each_with_index do |name,i|
|
21
|
+
@toc.pages[i].title.must_equal "#{name} One"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
The global root of the site is not a valid link.
|
2
|
+
|
3
|
+
| external | valid | file | broken |
|
4
|
+
-----------------+----------+-------+------+--------+
|
5
|
+
| root.md | 1 | 6 | 0 | 5 |
|
6
|
+
| sub1/inner1.md | 1 | 5 | 1 | 4 |
|
7
|
+
| sub2/inner2.md | 1 | 2 | 1 | 3 |
|
8
|
+
| sub2.md | 1 | 0 | 1 | 1 |
|
9
|
+
-----------------+----------+-------+------+--------+
|
10
|
+
TOTALS | 4 | 13 | 3 | 13 |
|
11
|
+
+----------+-------+------+--------+
|
@@ -0,0 +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
|
+
|
14
|
+
<div id="sub-id">Just in case</div>
|
@@ -0,0 +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)
|
File without changes
|
@@ -0,0 +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)
|