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  }