code.gitea.io/gitea@v1.19.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) ast.Node {
    17  	details := NewDetails()
    18  	summary := NewSummary()
    19  
    20  	summary.AppendChild(summary, ast.NewString([]byte(translation.NewLocale(lang).Tr("toc"))))
    21  	details.AppendChild(details, summary)
    22  	ul := ast.NewList('-')
    23  	details.AppendChild(details, ul)
    24  	currentLevel := 6
    25  	for _, header := range toc {
    26  		if header.Level < currentLevel {
    27  			currentLevel = header.Level
    28  		}
    29  	}
    30  	for _, header := range toc {
    31  		for currentLevel > header.Level {
    32  			ul = ul.Parent().(*ast.List)
    33  			currentLevel--
    34  		}
    35  		for currentLevel < header.Level {
    36  			newL := ast.NewList('-')
    37  			ul.AppendChild(ul, newL)
    38  			currentLevel++
    39  			ul = newL
    40  		}
    41  		li := ast.NewListItem(currentLevel * 2)
    42  		a := ast.NewLink()
    43  		a.Destination = []byte(fmt.Sprintf("#%s", url.PathEscape(header.ID)))
    44  		a.AppendChild(a, ast.NewString([]byte(header.Text)))
    45  		li.AppendChild(li, a)
    46  		ul.AppendChild(ul, li)
    47  	}
    48  
    49  	return details
    50  }