1414package tableofcontents
1515
1616import (
17+ "strings"
1718 "testing"
1819
1920 qt "github.com/frankban/quicktest"
@@ -127,21 +128,9 @@ func TestTocMissingParent(t *testing.T) {
127128 got := string (tocHTML )
128129 c .Assert (got , qt .Equals , `<nav id="TableOfContents">
129130 <ul>
130- <li>
131- <ul>
132- <li><a href="#h2">H2</a></li>
133- </ul>
134- </li>
135- <li>
136- <ul>
137- <li>
138- <ul>
139- <li><a href="#h3">H3</a></li>
140- <li><a href="#h3">H3</a></li>
141- </ul>
142- </li>
143- </ul>
144- </li>
131+ <li><a href="#h2">H2</a></li>
132+ <li><a href="#h3">H3</a></li>
133+ <li><a href="#h3">H3</a></li>
145134 </ul>
146135</nav>` , qt .Commentf (got ))
147136
@@ -158,23 +147,157 @@ func TestTocMissingParent(t *testing.T) {
158147 got = string (tocHTML )
159148 c .Assert (got , qt .Equals , `<nav id="TableOfContents">
160149 <ol>
161- <li>
162- <ol>
163- <li><a href="#h2">H2</a></li>
164- </ol>
150+ <li><a href="#h2">H2</a></li>
151+ <li><a href="#h3">H3</a></li>
152+ <li><a href="#h3">H3</a></li>
153+ </ol>
154+ </nav>` , qt .Commentf (got ))
155+ }
156+
157+ func TestTocMissingIntermediateLevels (t * testing.T ) {
158+ c := qt .New (t )
159+
160+ type item struct {
161+ title string
162+ id string
163+ row int
164+ level int
165+ }
166+
167+ for _ , test := range []struct {
168+ name string
169+ items []item
170+ expected string
171+ }{
172+ {
173+ name : "h2 to h4" ,
174+ items : []item {
175+ {title : "H2" , id : "h2" , level : 1 },
176+ {title : "H4" , id : "h4" , level : 3 },
177+ },
178+ expected : `<nav id="TableOfContents">
179+ <ul>
180+ <li><a href="#h2">H2</a>
181+ <ul>
182+ <li><a href="#h4">H4</a></li>
183+ </ul>
165184 </li>
166- <li>
167- <ol>
168- <li>
169- <ol>
170- <li><a href="#h3">H3</a></li>
171- <li><a href="#h3">H3</a></li>
172- </ol>
173- </li>
174- </ol>
185+ </ul>
186+ </nav>` ,
187+ },
188+ {
189+ name : "h2 to h5" ,
190+ items : []item {
191+ {title : "H2" , id : "h2" , level : 1 },
192+ {title : "H5" , id : "h5" , level : 4 },
193+ },
194+ expected : `<nav id="TableOfContents">
195+ <ul>
196+ <li><a href="#h2">H2</a>
197+ <ul>
198+ <li><a href="#h5">H5</a></li>
199+ </ul>
175200 </li>
176- </ol>
201+ </ul>
202+ </nav>` ,
203+ },
204+ {
205+ name : "h2 to h6" ,
206+ items : []item {
207+ {title : "H2" , id : "h2" , level : 1 },
208+ {title : "H6" , id : "h6" , level : 5 },
209+ },
210+ expected : `<nav id="TableOfContents">
211+ <ul>
212+ <li><a href="#h2">H2</a>
213+ <ul>
214+ <li><a href="#h6">H6</a></li>
215+ </ul>
216+ </li>
217+ </ul>
218+ </nav>` ,
219+ },
220+ {
221+ name : "h3 to h5" ,
222+ items : []item {
223+ {title : "H3" , id : "h3" , level : 2 },
224+ {title : "H5" , id : "h5" , level : 4 },
225+ },
226+ expected : `<nav id="TableOfContents">
227+ <ul>
228+ <li><a href="#h3">H3</a>
229+ <ul>
230+ <li><a href="#h5">H5</a></li>
231+ </ul>
232+ </li>
233+ </ul>
234+ </nav>` ,
235+ },
236+ {
237+ name : "starts at h4" ,
238+ items : []item {
239+ {title : "H4" , id : "h4" , level : 3 },
240+ },
241+ expected : `<nav id="TableOfContents">
242+ <ul>
243+ <li><a href="#h4">H4</a></li>
244+ </ul>
245+ </nav>` ,
246+ },
247+ {
248+ name : "starts at h6" ,
249+ items : []item {
250+ {title : "H6" , id : "h6" , level : 5 },
251+ },
252+ expected : `<nav id="TableOfContents">
253+ <ul>
254+ <li><a href="#h6">H6</a></li>
255+ </ul>
256+ </nav>` ,
257+ },
258+ } {
259+ c .Run (test .name , func (c * qt.C ) {
260+ toc := & Fragments {}
261+ for _ , item := range test .items {
262+ toc .addAt (& Heading {Title : item .title , ID : item .id }, item .row , item .level )
263+ }
264+
265+ tocHTML , err := toc .ToHTML (2 , - 1 , false )
266+ c .Assert (err , qt .IsNil )
267+ got := string (tocHTML )
268+ c .Assert (got , qt .Equals , test .expected , qt .Commentf (got ))
269+ c .Assert (got , qt .Not (qt .Contains ), "<li>\n " )
270+ c .Assert (hasListItemWithoutAnchor (got ), qt .Equals , false )
271+ })
272+ }
273+
274+ toc := & Fragments {}
275+ toc .addAt (& Heading {Title : "H2" , ID : "h2" }, 0 , 1 )
276+ toc .addAt (& Heading {Title : "H4" , ID : "h4" }, 0 , 3 )
277+
278+ tocHTML , err := toc .ToHTML (2 , 3 , false )
279+ c .Assert (err , qt .IsNil )
280+ got := string (tocHTML )
281+ c .Assert (got , qt .Equals , `<nav id="TableOfContents">
282+ <ul>
283+ <li><a href="#h2">H2</a></li>
284+ </ul>
177285</nav>` , qt .Commentf (got ))
286+ c .Assert (got , qt .Not (qt .Contains ), "<li>\n " )
287+ c .Assert (hasListItemWithoutAnchor (got ), qt .Equals , false )
288+ }
289+
290+ func hasListItemWithoutAnchor (s string ) bool {
291+ for {
292+ i := strings .Index (s , "<li>" )
293+ if i == - 1 {
294+ return false
295+ }
296+ s = s [i + len ("<li>" ):]
297+ if ! strings .HasPrefix (strings .TrimLeft (s , " \n \t \r " ), "<a " ) {
298+ return true
299+ }
300+ }
178301}
179302
180303func TestTocMisc (t * testing.T ) {
0 commit comments