github.com/kata-containers/tests@v0.0.0-20240307153542-772105b56064/cmd/check-markdown/node.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  	bf "gopkg.in/russross/blackfriday.v2"
    11  )
    12  
    13  // handleNode processes the specified node.
    14  func (d *Doc) handleNode(node *bf.Node) error {
    15  	var err error
    16  
    17  	switch node.Type {
    18  	case bf.Heading:
    19  		err = d.handleHeading(node)
    20  	case bf.Link:
    21  		err = d.handleLink(node)
    22  	case bf.Text:
    23  		// handle blackfriday deficiencies
    24  		headings, err := d.forceCreateHeadings(node)
    25  		if err != nil {
    26  			return err
    27  		}
    28  
    29  		for _, heading := range headings {
    30  			err := d.addHeading(heading)
    31  			if err != nil {
    32  				return err
    33  			}
    34  		}
    35  
    36  	default:
    37  		return nil
    38  	}
    39  
    40  	return err
    41  }
    42  
    43  // makeHeading creates a heading from the specified node.
    44  func (d *Doc) makeHeading(node *bf.Node) (Heading, error) {
    45  	if err := checkNode(node, bf.Heading); err != nil {
    46  		return Heading{}, err
    47  	}
    48  
    49  	name, mdName, err := headingName(node)
    50  	if err != nil {
    51  		return Heading{}, d.Errorf("failed to get heading name: %v", err)
    52  	}
    53  
    54  	data := node.HeadingData
    55  
    56  	heading, err := newHeading(name, mdName, data.Level)
    57  	if err != nil {
    58  		return Heading{}, err
    59  	}
    60  
    61  	return heading, nil
    62  }
    63  
    64  // handleHeading processes the heading represented by the specified node.
    65  func (d *Doc) handleHeading(node *bf.Node) error {
    66  	if err := checkNode(node, bf.Heading); err != nil {
    67  		return err
    68  	}
    69  
    70  	heading, err := d.makeHeading(node)
    71  	if err != nil {
    72  		return err
    73  	}
    74  
    75  	return d.addHeading(heading)
    76  }
    77  
    78  func (d *Doc) handleLink(node *bf.Node) error {
    79  	if err := checkNode(node, bf.Link); err != nil {
    80  		return err
    81  	}
    82  
    83  	address := string(node.Destination)
    84  
    85  	description, err := linkDescription(node)
    86  	if err != nil {
    87  		return d.Errorf("failed to get link name: %v", err)
    88  	}
    89  
    90  	link, err := newLink(d, address, description)
    91  	if err != nil {
    92  		return err
    93  	}
    94  
    95  	return d.addLink(link)
    96  }
    97  
    98  // handleIntraDocLinks checks the links between documents are correct.
    99  //
   100  // For example, if a document refers to "foo.md#section-bar", this function
   101  // will ensure that "section-bar" exists in external file "foo.md".
   102  func handleIntraDocLinks() error {
   103  	for _, doc := range docs {
   104  		for addr, linkList := range doc.Links {
   105  			for _, link := range linkList {
   106  				err := doc.checkLink(addr, link, true)
   107  				if err != nil {
   108  					return doc.Errorf("intra-doc link invalid: %v", err)
   109  				}
   110  			}
   111  		}
   112  	}
   113  
   114  	return nil
   115  }