github.com/dmaizel/tests@v0.0.0-20210728163746-cae6a2d9cee8/cmd/check-markdown/toc.go (about) 1 // 2 // Copyright (c) 2019 Intel Corporation 3 // 4 // SPDX-License-Identifier: Apache-2.0 5 // 6 7 package main 8 9 import ( 10 "fmt" 11 "strings" 12 13 bf "gopkg.in/russross/blackfriday.v2" 14 ) 15 16 // displayTOC displays a table of contents entry for the specified node. 17 func (d *Doc) displayTOC(node *bf.Node) error { 18 switch node.Type { 19 case bf.Heading: 20 return d.displayTOCEntryFromNode(node) 21 case bf.Text: 22 // handle blackfriday deficiencies 23 headings, err := d.forceCreateHeadings(node) 24 if err != nil { 25 return err 26 } 27 28 for _, heading := range headings { 29 err := d.displayTOCEntryFromHeading(heading) 30 if err != nil { 31 return err 32 } 33 } 34 } 35 36 return nil 37 } 38 39 // displayTOCEntryFromHeading displays a table of contents entry 40 // for the specified heading. 41 func (d *Doc) displayTOCEntryFromHeading(heading Heading) error { 42 const indentSpaces = 4 43 44 prefix := "" 45 46 level := heading.Level 47 48 // Indent needs to be zero for top level headings 49 level-- 50 51 if level > 0 { 52 prefix = strings.Repeat(" ", level*indentSpaces) 53 } 54 55 entry := fmt.Sprintf("[%s](%s%s)", heading.MDName, anchorPrefix, heading.LinkName) 56 57 fmt.Printf("%s%s %s\n", prefix, listPrefix, entry) 58 59 return nil 60 } 61 62 // displayTOCEntryFromHeading displays a table of contents entry 63 // for the specified heading. 64 func (d *Doc) displayTOCEntryFromNode(node *bf.Node) error { 65 if err := checkNode(node, bf.Heading); err != nil { 66 return err 67 } 68 69 heading, err := d.makeHeading(node) 70 if err != nil { 71 return err 72 } 73 74 return d.displayTOCEntryFromHeading(heading) 75 }