|
|
|
@ -8,18 +8,18 @@ import (
|
|
|
|
|
"bufio" |
|
|
|
|
"bytes" |
|
|
|
|
"fmt" |
|
|
|
|
"html" |
|
|
|
|
"html/template" |
|
|
|
|
"io" |
|
|
|
|
"io/ioutil" |
|
|
|
|
"os" |
|
|
|
|
"os/exec" |
|
|
|
|
"strings" |
|
|
|
|
"html/template" |
|
|
|
|
"html" |
|
|
|
|
|
|
|
|
|
"github.com/Unknwon/com" |
|
|
|
|
"github.com/sergi/go-diff/diffmatchpatch" |
|
|
|
|
"golang.org/x/net/html/charset" |
|
|
|
|
"golang.org/x/text/transform" |
|
|
|
|
"github.com/sergi/go-diff/diffmatchpatch" |
|
|
|
|
|
|
|
|
|
"github.com/gogits/git-module" |
|
|
|
|
|
|
|
|
@ -63,18 +63,29 @@ type DiffSection struct {
|
|
|
|
|
Lines []*DiffLine |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func diffToHtml(diffRecord []diffmatchpatch.Diff, lineType DiffLineType) template.HTML { |
|
|
|
|
result := "" |
|
|
|
|
for _, s := range diffRecord { |
|
|
|
|
if s.Type == diffmatchpatch.DiffInsert && lineType == DIFF_LINE_ADD { |
|
|
|
|
result = result + "<span class=\"added-code\">"+html.EscapeString(s.Text)+"</span>" |
|
|
|
|
} else if s.Type == diffmatchpatch.DiffDelete && lineType == DIFF_LINE_DEL { |
|
|
|
|
result = result + "<span class=\"removed-code\">"+html.EscapeString(s.Text)+"</span>" |
|
|
|
|
} else if s.Type == diffmatchpatch.DiffEqual { |
|
|
|
|
result = result + html.EscapeString(s.Text) |
|
|
|
|
var ( |
|
|
|
|
addedCodePrefix = []byte("<span class=\"added-code\">") |
|
|
|
|
removedCodePrefix = []byte("<span class=\"removed-code\">") |
|
|
|
|
codeTagSuffix = []byte("</span>") |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
func diffToHTML(diffs []diffmatchpatch.Diff, lineType DiffLineType) template.HTML { |
|
|
|
|
var buf bytes.Buffer |
|
|
|
|
for i := range diffs { |
|
|
|
|
if diffs[i].Type == diffmatchpatch.DiffInsert && lineType == DIFF_LINE_ADD { |
|
|
|
|
buf.Write(addedCodePrefix) |
|
|
|
|
buf.WriteString(html.EscapeString(diffs[i].Text)) |
|
|
|
|
buf.Write(codeTagSuffix) |
|
|
|
|
} else if diffs[i].Type == diffmatchpatch.DiffDelete && lineType == DIFF_LINE_DEL { |
|
|
|
|
buf.Write(removedCodePrefix) |
|
|
|
|
buf.WriteString(html.EscapeString(diffs[i].Text)) |
|
|
|
|
buf.Write(codeTagSuffix) |
|
|
|
|
} else if diffs[i].Type == diffmatchpatch.DiffEqual { |
|
|
|
|
buf.WriteString(html.EscapeString(diffs[i].Text)) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return template.HTML(result) |
|
|
|
|
|
|
|
|
|
return template.HTML(buf.Bytes()) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// get an specific line by type (add or del) and file line number
|
|
|
|
@ -89,11 +100,11 @@ func (diffSection *DiffSection) GetLine(lineType DiffLineType, idx int) *DiffLin
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if lineType == DIFF_LINE_DEL { |
|
|
|
|
if diffLine.RightIdx == 0 && diffLine.LeftIdx == idx - difference { |
|
|
|
|
if diffLine.RightIdx == 0 && diffLine.LeftIdx == idx-difference { |
|
|
|
|
return diffLine |
|
|
|
|
} |
|
|
|
|
} else if lineType == DIFF_LINE_ADD { |
|
|
|
|
if diffLine.LeftIdx == 0 && diffLine.RightIdx == idx + difference { |
|
|
|
|
if diffLine.LeftIdx == 0 && diffLine.RightIdx == idx+difference { |
|
|
|
|
return diffLine |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -107,11 +118,9 @@ func (diffSection *DiffSection) ComputeLinesDiff() {
|
|
|
|
|
var compareDiffLine *DiffLine |
|
|
|
|
var diff1, diff2 string |
|
|
|
|
|
|
|
|
|
// default content: as is
|
|
|
|
|
diffLine.ParsedContent = template.HTML(html.EscapeString(diffLine.Content[1:])) |
|
|
|
|
|
|
|
|
|
// just compute diff for adds and removes
|
|
|
|
|
if diffLine.Type != DIFF_LINE_ADD && diffLine.Type != DIFF_LINE_DEL { |
|
|
|
|
diffLine.ParsedContent = template.HTML(html.EscapeString(diffLine.Content[1:])) |
|
|
|
|
continue |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -136,7 +145,7 @@ func (diffSection *DiffSection) ComputeLinesDiff() {
|
|
|
|
|
diffRecord := dmp.DiffMain(diff1[1:], diff2[1:], true) |
|
|
|
|
diffRecord = dmp.DiffCleanupSemantic(diffRecord) |
|
|
|
|
|
|
|
|
|
diffLine.ParsedContent = diffToHtml(diffRecord, diffLine.Type) |
|
|
|
|
diffLine.ParsedContent = diffToHTML(diffRecord, diffLine.Type) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|