|
@@ -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"
|
|
|
|
|
@@ -47,10 +47,10 @@ const (
|
|
|
)
|
|
|
|
|
|
type DiffLine struct {
|
|
|
- LeftIdx int
|
|
|
- RightIdx int
|
|
|
- Type DiffLineType
|
|
|
- Content string
|
|
|
+ LeftIdx int
|
|
|
+ RightIdx int
|
|
|
+ Type DiffLineType
|
|
|
+ Content string
|
|
|
ParsedContent template.HTML
|
|
|
}
|
|
|
|
|
@@ -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)
|
|
|
}
|
|
|
}
|
|
|
|