gtx


  1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
package main

import (
	"fmt"
	"html/template"
	"regexp"
	"strings"
)

// Helps target file specific diff blocks.
var diffanchor = regexp.MustCompile(`b\/(.*?)$`)

// 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 decide if value contained in slice.
// https://stackoverflow.com/questions/38654383/how-to-search-for-an-element-in-a-golang-slice
func contains(s []string, n string) bool {
	for _, v := range s {
		if v == n {
			return true
		}
	}

	return false
}

// Helps clear duplicates in slice.
// https://stackoverflow.com/questions/66643946/how-to-remove-duplicates-strings-or-int-from-slice-in-go
func dedupe(input []string) []string {
	set := make(map[string]void)
	list := []string{}

	for _, v := range input {
		if _, ok := set[v]; !ok {
			set[v] = void{}
			list = append(list, v)
		}
	}

	return list
}

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/<a id="$1">$1</a>`)
			line = fmt.Sprintf("<strong>%s</strong>", line)
		}

		line = xline.ReplaceAllString(line, "<em>$1</em>")

		if strings.HasPrefix(line, "@@") {
			if a != "" && !strings.HasPrefix(a, "---") {
				repl := fmt.Sprintf(`<a href="commit/%s/%s.html#L$1">-$1</a>,`, d.Parent, a)
				line = aline.ReplaceAllString(line, repl)
			}

			if b != "" && !strings.HasPrefix(b, "+++") {
				repl := fmt.Sprintf(`<a href="commit/%s/%s.html#L$1">+$1</a>,`, d.Commit.Hash, b)
				line = bline.ReplaceAllString(line, repl)
			}
		}

		if strings.HasPrefix(line, "---") {
			a = strings.TrimPrefix(line, "--- a/")
			line = fmt.Sprintf("<mark>%s</mark>", line)
		} else if strings.HasPrefix(line, "-") {
			line = fmt.Sprintf("<del>%s</del>", line)
		}

		if strings.HasPrefix(line, "+++") {
			b = strings.TrimPrefix(line, "+++ b/")
			line = fmt.Sprintf("<mark>%s</mark>", line)
		} else if strings.HasPrefix(line, "+") {
			line = fmt.Sprintf("<ins>%s</ins>", 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(`<a href="commit/%s/diff-%s.html#%s">%s</a>`, 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"))
}