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")) }