package main
import (
"fmt"
"html/template"
"regexp"
"strings"
)
// Match diff body @@ del, ins line numbers.
var aline = regexp.MustCompile(`\-(.*?),`)
var bline = regexp.MustCompile(`\+(.*?),`)
// Match diff body keywords.
var xline = regexp.MustCompile(`^(deleted|index|new|rename|similarity)`)
// Helps target file specific diff blocks.
var diffanchor = regexp.MustCompile(`b\/(.*?)$`)
func diffbodyparser(d diff) template.HTML {
var results []string
feed := strings.Split(strings.TrimSuffix(template.HTMLEscapeString(d.Body), "\n"), "\n")
var a, b string
for _, line := range feed {
if strings.HasPrefix(line, "diff") {
line = diffanchor.ReplaceAllString(line, `b/$1`)
line = fmt.Sprintf("%s", line)
}
line = xline.ReplaceAllString(line, "$1")
if strings.HasPrefix(line, "@@") {
if a != "" && !strings.HasPrefix(a, "---") {
repl := fmt.Sprintf(`-$1,`, d.Parent, a)
line = aline.ReplaceAllString(line, repl)
}
if b != "" && !strings.HasPrefix(b, "+++") {
repl := fmt.Sprintf(`+$1,`, d.Commit.Hash, b)
line = bline.ReplaceAllString(line, repl)
}
}
if strings.HasPrefix(line, "---") {
a = strings.TrimPrefix(line, "--- a/")
line = fmt.Sprintf("%s", line)
} else if strings.HasPrefix(line, "-") {
line = fmt.Sprintf("%s", line)
}
if strings.HasPrefix(line, "+++") {
b = strings.TrimPrefix(line, "+++ b/")
line = fmt.Sprintf("%s", line)
} else if strings.HasPrefix(line, "+") {
line = fmt.Sprintf("%s", line)
}
results = append(results, line)
}
return template.HTML(strings.Join(results, "\n"))
}
func diffstatbodyparser(o overview) template.HTML {
var results []string
feed := strings.Split(strings.TrimSuffix(o.Body, "\n"), "\n")
for i, line := range feed {
if i < len(feed)-1 {
// Link files to corresponding diff.
columns := strings.Split(line, "|")
files := strings.Split(columns[0], "=>")
a := strings.TrimSpace(files[len(files)-1])
b := fmt.Sprintf(`%s`, o.Hash, o.Parent, a, a)
l := strings.LastIndex(line, a)
line = line[:l] + strings.Replace(line[l:], a, b, 1)
}
results = append(results, line)
}
return template.HTML(strings.Join(results, "\n"))
}