2020-04-24 16:22:36 +03:00
// Copyright 2020 The Gitea Authors. All rights reserved.
2022-11-27 21:20:29 +03:00
// SPDX-License-Identifier: MIT
2020-04-24 16:22:36 +03:00
package markdown
import (
"fmt"
"net/url"
2022-06-26 17:19:22 +03:00
"code.gitea.io/gitea/modules/translation"
2022-04-03 12:46:48 +03:00
2020-04-24 16:22:36 +03:00
"github.com/yuin/goldmark/ast"
)
2024-11-04 13:59:50 +03:00
// Header holds the data about a header.
type Header struct {
Level int
Text string
ID string
}
func createTOCNode ( toc [ ] Header , lang string , detailsAttrs map [ string ] string ) ast . Node {
2020-04-24 16:22:36 +03:00
details := NewDetails ( )
summary := NewSummary ( )
2023-04-17 22:05:19 +03:00
for k , v := range detailsAttrs {
details . SetAttributeString ( k , [ ] byte ( v ) )
}
2024-02-15 00:48:45 +03:00
summary . AppendChild ( summary , ast . NewString ( [ ] byte ( translation . NewLocale ( lang ) . TrString ( "toc" ) ) ) )
2020-04-24 16:22:36 +03:00
details . AppendChild ( details , summary )
ul := ast . NewList ( '-' )
details . AppendChild ( details , ul )
currentLevel := 6
for _ , header := range toc {
if header . Level < currentLevel {
currentLevel = header . Level
}
}
for _ , header := range toc {
for currentLevel > header . Level {
ul = ul . Parent ( ) . ( * ast . List )
currentLevel --
}
for currentLevel < header . Level {
newL := ast . NewList ( '-' )
ul . AppendChild ( ul , newL )
currentLevel ++
ul = newL
}
li := ast . NewListItem ( currentLevel * 2 )
a := ast . NewLink ( )
2023-04-17 22:05:19 +03:00
a . Destination = [ ] byte ( fmt . Sprintf ( "#%s" , url . QueryEscape ( header . ID ) ) )
2020-04-24 16:22:36 +03:00
a . AppendChild ( a , ast . NewString ( [ ] byte ( header . Text ) ) )
li . AppendChild ( li , a )
ul . AppendChild ( ul , li )
}
return details
}