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  }