package format
import (
)
const (
contextLines = 2
)
type DiffConfig struct {
A string
B string
From string
To string
}
func ( DiffConfig) string {
:= strings.SplitAfter(.A, "\n")
:= strings.SplitAfter(.B, "\n")
:= difflib.NewMatcher(, ).GetGroupedOpCodes(contextLines)
if len() == 0 {
return ""
}
:= new(bytes.Buffer)
:= func( string, ...interface{}) {
.WriteString(fmt.Sprintf(, ...))
}
:= func( string, string) {
.WriteString( + )
}
if hasWhitespaceDiffLines(, , ) {
= visibleWhitespaceLine()
}
formatHeader(, )
for , := range {
formatRangeLine(, )
for , := range {
, := [.I1:.I2], [.J1:.J2]
switch .Tag {
case 'e':
formatLines(, " ", )
case 'r':
formatLines(, "-", )
formatLines(, "+", )
case 'd':
formatLines(, "-", )
case 'i':
formatLines(, "+", )
}
}
}
return .String()
}
func ( [][]difflib.OpCode, , []string) bool {
for , := range {
, := new(bytes.Buffer), new(bytes.Buffer)
for , := range {
if .Tag == 'e' {
continue
}
for , := range [.I1:.I2] {
.WriteString()
}
for , := range [.J1:.J2] {
.WriteString()
}
}
if removeWhitespace(.String()) == removeWhitespace(.String()) {
return true
}
}
return false
}
func ( string) string {
var []rune
for , := range {
if !unicode.IsSpace() {
= append(, )
}
}
return string()
}
func ( func(string, string)) func(string, string) {
:= func( rune) rune {
switch {
case '\n':
case ' ':
return '·'
case '\t':
return '▷'
case '\v':
return '▽'
case '\r':
return '↵'
case '\f':
return '↓'
default:
if unicode.IsSpace() {
return '�'
}
}
return
}
return func(, string) {
(, strings.Map(, ))
}
}
func ( func(string, ...interface{}), DiffConfig) {
if .From != "" || .To != "" {
("--- %s\n", .From)
("+++ %s\n", .To)
}
}
func ( func(string, ...interface{}), []difflib.OpCode) {
, := [0], [len()-1]
:= formatRangeUnified(.I1, .I2)
:= formatRangeUnified(.J1, .J2)
("@@ -%s +%s @@\n", , )
}
func (, int) string {
:= + 1
:= -
if == 1 {
return fmt.Sprintf("%d", )
}
if == 0 {
--
}
return fmt.Sprintf("%d,%d", , )
}
func ( func(string, string), string, []string) {
for , := range {
(, )
}
if !strings.HasSuffix([len()-1], "\n") {
("", "\n")
}
}