github.com/errata-ai/vale/v3@v3.4.2/internal/lint/fragment.go (about)

     1  package lint
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  
     7  	"github.com/errata-ai/vale/v3/internal/core"
     8  )
     9  
    10  func coalesce(comments []Comment) []Comment {
    11  	var joined []Comment
    12  
    13  	buf := bytes.Buffer{}
    14  	for i, comment := range comments {
    15  		if comment.Scope == "text.comment.block" { //nolint:gocritic
    16  			joined = append(joined, comment)
    17  		} else if i == 0 || comments[i-1].Line != comment.Line-1 {
    18  			if buf.Len() > 0 {
    19  				// We have comments to merge ...
    20  				last := joined[len(joined)-1]
    21  				last.Text += buf.String()
    22  				joined[len(joined)-1] = last
    23  				buf.Reset()
    24  			}
    25  			joined = append(joined, comment)
    26  		} else {
    27  			buf.WriteString(comment.Text)
    28  		}
    29  	}
    30  
    31  	if buf.Len() > 0 {
    32  		last := joined[len(joined)-1]
    33  		last.Text += buf.String()
    34  		joined[len(joined)-1] = last
    35  		buf.Reset()
    36  	}
    37  
    38  	return joined
    39  }
    40  
    41  func adjustAlerts(last int, ctx Comment, alerts []core.Alert) []core.Alert {
    42  	for i := range alerts {
    43  		if i >= last {
    44  			alerts[i].Line += ctx.Line - 1
    45  			alerts[i].Span = []int{alerts[i].Span[0] + ctx.Offset, alerts[i].Span[1] + ctx.Offset}
    46  		}
    47  	}
    48  	return alerts
    49  }
    50  
    51  func (l *Linter) lintFragments(f *core.File) error {
    52  	var err error
    53  
    54  	// We want to set up our processing servers as if we were dealing with
    55  	// a directory since we likely have many fragments to convert.
    56  	l.HasDir = true
    57  
    58  	last := 0
    59  	for _, comment := range coalesce(getComments(f.Content, f.RealExt)) {
    60  		f.SetText(comment.Text)
    61  
    62  		switch f.NormedExt {
    63  		case ".md":
    64  			err = l.lintMarkdown(f)
    65  		case ".rst":
    66  			err = l.lintRST(f)
    67  		case ".adoc":
    68  			err = l.lintADoc(f)
    69  		case ".org":
    70  			err = l.lintOrg(f)
    71  		default:
    72  			return fmt.Errorf("unsupported markup format '%s'", f.NormedExt)
    73  		}
    74  
    75  		size := len(f.Alerts)
    76  		if size != last {
    77  			f.Alerts = adjustAlerts(last, comment, f.Alerts)
    78  		}
    79  		last = size
    80  	}
    81  
    82  	return err
    83  }