code.gitea.io/gitea@v1.22.3/modules/markup/markdown/toc.go (about) 1 // Copyright 2020 The Gitea Authors. All rights reserved. 2 // SPDX-License-Identifier: MIT 3 4 package markdown 5 6 import ( 7 "fmt" 8 "net/url" 9 10 "code.gitea.io/gitea/modules/markup" 11 "code.gitea.io/gitea/modules/translation" 12 13 "github.com/yuin/goldmark/ast" 14 ) 15 16 func createTOCNode(toc []markup.Header, lang string, detailsAttrs map[string]string) ast.Node { 17 details := NewDetails() 18 summary := NewSummary() 19 20 for k, v := range detailsAttrs { 21 details.SetAttributeString(k, []byte(v)) 22 } 23 24 summary.AppendChild(summary, ast.NewString([]byte(translation.NewLocale(lang).TrString("toc")))) 25 details.AppendChild(details, summary) 26 ul := ast.NewList('-') 27 details.AppendChild(details, ul) 28 currentLevel := 6 29 for _, header := range toc { 30 if header.Level < currentLevel { 31 currentLevel = header.Level 32 } 33 } 34 for _, header := range toc { 35 for currentLevel > header.Level { 36 ul = ul.Parent().(*ast.List) 37 currentLevel-- 38 } 39 for currentLevel < header.Level { 40 newL := ast.NewList('-') 41 ul.AppendChild(ul, newL) 42 currentLevel++ 43 ul = newL 44 } 45 li := ast.NewListItem(currentLevel * 2) 46 a := ast.NewLink() 47 a.Destination = []byte(fmt.Sprintf("#%s", url.QueryEscape(header.ID))) 48 a.AppendChild(a, ast.NewString([]byte(header.Text))) 49 li.AppendChild(li, a) 50 ul.AppendChild(ul, li) 51 } 52 53 return details 54 }