github.com/nhannv/mattermost-server@v5.11.1+incompatible/utils/markdown/inspect.go (about)

     1  // Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved.
     2  // See License.txt for license information.
     3  
     4  package markdown
     5  
     6  // Inspect traverses the markdown tree in depth-first order. If f returns true, Inspect invokes f
     7  // recursively for each child of the block or inline, followed by a call of f(nil).
     8  func Inspect(markdown string, f func(interface{}) bool) {
     9  	document, referenceDefinitions := Parse(markdown)
    10  	InspectBlock(document, func(block Block) bool {
    11  		if !f(block) {
    12  			return false
    13  		}
    14  		switch v := block.(type) {
    15  		case *Paragraph:
    16  			for _, inline := range MergeInlineText(v.ParseInlines(referenceDefinitions)) {
    17  				InspectInline(inline, func(inline Inline) bool {
    18  					return f(inline)
    19  				})
    20  			}
    21  		}
    22  		return true
    23  	})
    24  }
    25  
    26  // InspectBlock traverses the blocks in depth-first order, starting with block. If f returns true,
    27  // InspectBlock invokes f recursively for each child of the block, followed by a call of f(nil).
    28  func InspectBlock(block Block, f func(Block) bool) {
    29  	if !f(block) {
    30  		return
    31  	}
    32  	switch v := block.(type) {
    33  	case *Document:
    34  		for _, child := range v.Children {
    35  			InspectBlock(child, f)
    36  		}
    37  	case *List:
    38  		for _, child := range v.Children {
    39  			InspectBlock(child, f)
    40  		}
    41  	case *ListItem:
    42  		for _, child := range v.Children {
    43  			InspectBlock(child, f)
    44  		}
    45  	case *BlockQuote:
    46  		for _, child := range v.Children {
    47  			InspectBlock(child, f)
    48  		}
    49  	}
    50  	f(nil)
    51  }
    52  
    53  // InspectInline traverses the blocks in depth-first order, starting with block. If f returns true,
    54  // InspectInline invokes f recursively for each child of the block, followed by a call of f(nil).
    55  func InspectInline(inline Inline, f func(Inline) bool) {
    56  	if !f(inline) {
    57  		return
    58  	}
    59  	switch v := inline.(type) {
    60  	case *InlineImage:
    61  		for _, child := range v.Children {
    62  			InspectInline(child, f)
    63  		}
    64  	case *InlineLink:
    65  		for _, child := range v.Children {
    66  			InspectInline(child, f)
    67  		}
    68  	case *ReferenceImage:
    69  		for _, child := range v.Children {
    70  			InspectInline(child, f)
    71  		}
    72  	case *ReferenceLink:
    73  		for _, child := range v.Children {
    74  			InspectInline(child, f)
    75  		}
    76  	}
    77  	f(nil)
    78  }