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 }