github.com/dmaizel/tests@v0.0.0-20210728163746-cae6a2d9cee8/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 }