diff --git a/application/source/document/html.go b/application/source/document/html.go index 1bbc2de1b8575c8bbf6760927b3c7ac90c4d2a73..0eea67d0c82b01f4800e1008092eebddcd871df8 100644 --- a/application/source/document/html.go +++ b/application/source/document/html.go @@ -14,11 +14,13 @@ import ( "github.com/gomarkdown/markdown/ast" markdownHTML "github.com/gomarkdown/markdown/html" "github.com/gomarkdown/markdown/parser" + "github.com/gosimple/slug" "github.com/mattn/go-shellwords" "github.com/tdewolff/minify/v2" minHTML "github.com/tdewolff/minify/v2/html" "github.com/yuin/goldmark" "github.com/yuin/goldmark/extension" + goldmarkParser "github.com/yuin/goldmark/parser" goldmarkHTML "github.com/yuin/goldmark/renderer/html" "gitlab.schukai.com/oss/utilities/documentation-manager/environment" "gitlab.schukai.com/oss/utilities/documentation-manager/translations" @@ -223,7 +225,7 @@ func buildTree(body string) *Tree[DocumentNode] { obj := newTree[DocumentNode]() ptr := obj - doc.Find("h1,h2,h3,h4").Each(func(k int, s *goquery.Selection) { + doc.Find("h1,h2,h3,h4,h5,h6").Each(func(k int, s *goquery.Selection) { e := s.Get(0) t := []rune(e.DataAtom.String()) l := t[1:len(t)] @@ -234,7 +236,15 @@ func buildTree(body string) *Tree[DocumentNode] { aID, found := s.Attr("id") if !found { - aID = "rel-" + e.DataAtom.String() + + if title, err := s.Html(); err == nil { + aID = slug.Make(title) + } else { + aID = "" + e.DataAtom.String() + "-" + randomID() + } + + s.SetAttr("id", aID) + } payload := DocumentNode{ @@ -589,8 +599,21 @@ func renderHook(w io.Writer, node ast.Node, entering bool) (ast.WalkStatus, bool func createHtmlFromMarkdown(text string) string { md := goldmark.New( - goldmark.WithExtensions(extension.GFM), - goldmark.WithParserOptions(), + goldmark.WithExtensions( + extension.GFM, + extension.DefinitionList, + extension.Footnote, + extension.Typographer, + extension.Linkify, + extension.Table, + extension.Strikethrough, + extension.TaskList), + goldmark.WithParserOptions( + goldmarkParser.WithAutoHeadingID(), + goldmarkParser.WithAttribute(), + goldmarkParser.WithHeadingAttribute(), + ), + goldmark.WithRendererOptions( goldmarkHTML.WithUnsafe(), ), diff --git a/application/source/go.mod b/application/source/go.mod index 8c78711699d04406da7904d167c4b2a7a4377ce3..07a06531beac401570114188686a5560a1534d3f 100644 --- a/application/source/go.mod +++ b/application/source/go.mod @@ -24,6 +24,8 @@ require ( github.com/go-chi/chi/v5 v5.0.7 // indirect github.com/go-chi/docgen v1.2.0 // indirect github.com/go-chi/httprate v0.5.3 // indirect + github.com/gosimple/slug v1.13.1 // indirect + github.com/gosimple/unidecode v1.0.1 // indirect github.com/tdewolff/parse/v2 v2.6.5 // indirect github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect go.uber.org/atomic v1.9.0 // indirect diff --git a/application/source/go.sum b/application/source/go.sum index af98c806bad3eaa228dead0c43087b75275ad970..dfefe4262d57d2fa390c6cd8272900c9473ad394 100644 --- a/application/source/go.sum +++ b/application/source/go.sum @@ -29,6 +29,10 @@ github.com/gookit/color v1.5.1 h1:Vjg2VEcdHpwq+oY63s/ksHrgJYCTo0bwWvmmYWdE9fQ= github.com/gookit/color v1.5.1/go.mod h1:wZFzea4X8qN6vHOSP2apMb4/+w/orMznEzYsIHPaqKM= github.com/gookit/color v1.5.2 h1:uLnfXcaFjlrDnQDT+NCBcfhrXqYTx/rcCa6xn01Y8yI= github.com/gookit/color v1.5.2/go.mod h1:w8h4bGiHeeBpvQVePTutdbERIUf3oJE5lZ8HM0UgXyg= +github.com/gosimple/slug v1.13.1 h1:bQ+kpX9Qa6tHRaK+fZR0A0M2Kd7Pa5eHPPsb1JpHD+Q= +github.com/gosimple/slug v1.13.1/go.mod h1:UiRaFH+GEilHstLUmcBgWcI42viBN7mAb818JrYOeFQ= +github.com/gosimple/unidecode v1.0.1 h1:hZzFTMMqSswvf0LBJZCZgThIZrpDHFXux9KeGmn6T/o= +github.com/gosimple/unidecode v1.0.1/go.mod h1:CP0Cr1Y1kogOtx0bJblKzsVWrqYaqfNOnHzpgWw4Awc= github.com/jessevdk/go-flags v1.5.0 h1:1jKYvbxEjfUl0fmqTCOfonvskHHXMjBySTLW4y9LFvc= github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8=