Merge pull request #2528 from andreynering/diff-sintax-highlight-733
Enable syntax highlighting on diff view
This commit is contained in:
		
						commit
						f15a2f9b25
					
				|  | @ -26,6 +26,7 @@ import ( | |||
| 	"github.com/gogits/gogs/modules/base" | ||||
| 	"github.com/gogits/gogs/modules/log" | ||||
| 	"github.com/gogits/gogs/modules/process" | ||||
| 	"github.com/gogits/gogs/modules/template/highlight" | ||||
| ) | ||||
| 
 | ||||
| type DiffLineType uint8 | ||||
|  | @ -160,12 +161,20 @@ type DiffFile struct { | |||
| 	IsBin              bool | ||||
| 	IsRenamed          bool | ||||
| 	Sections           []*DiffSection | ||||
| 	HighlightClass     string | ||||
| } | ||||
| 
 | ||||
| func (diffFile *DiffFile) GetType() int { | ||||
| 	return int(diffFile.Type) | ||||
| } | ||||
| 
 | ||||
| func (diffFile *DiffFile) GetHighlightClass() string { | ||||
| 	if diffFile.HighlightClass == "" { | ||||
| 		diffFile.HighlightClass = highlight.FileNameToHighlightClass(diffFile.Name) | ||||
| 	} | ||||
| 	return diffFile.HighlightClass | ||||
| } | ||||
| 
 | ||||
| type Diff struct { | ||||
| 	TotalAddition, TotalDeletion int | ||||
| 	Files                        []*DiffFile | ||||
|  |  | |||
|  | @ -1,70 +1,70 @@ | |||
| package models | ||||
| 
 | ||||
| import ( | ||||
|   dmp "github.com/sergi/go-diff/diffmatchpatch" | ||||
|   "html/template" | ||||
|   "testing" | ||||
| 	dmp "github.com/sergi/go-diff/diffmatchpatch" | ||||
| 	"html/template" | ||||
| 	"testing" | ||||
| ) | ||||
| 
 | ||||
| func assertEqual(t *testing.T, s1 string, s2 template.HTML) { | ||||
|   if s1 != string(s2) { | ||||
|     t.Errorf("%s should be equal %s", s2, s1) | ||||
|   } | ||||
| 	if s1 != string(s2) { | ||||
| 		t.Errorf("%s should be equal %s", s2, s1) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func assertLineEqual(t *testing.T, d1 *DiffLine, d2 *DiffLine) { | ||||
|   if d1 != d2 { | ||||
|     t.Errorf("%v should be equal %v", d1, d2) | ||||
|   } | ||||
| 	if d1 != d2 { | ||||
| 		t.Errorf("%v should be equal %v", d1, d2) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func TestDiffToHTML(t *testing.T) { | ||||
|   assertEqual(t, "foo <span class=\"added-code\">bar</span> biz", diffToHTML([]dmp.Diff{ | ||||
|     dmp.Diff{dmp.DiffEqual, "foo "}, | ||||
|     dmp.Diff{dmp.DiffInsert, "bar"}, | ||||
|     dmp.Diff{dmp.DiffDelete, " baz"}, | ||||
|     dmp.Diff{dmp.DiffEqual, " biz"}, | ||||
|   }, DIFF_LINE_ADD)) | ||||
| 	assertEqual(t, "foo <span class=\"added-code\">bar</span> biz", diffToHTML([]dmp.Diff{ | ||||
| 		dmp.Diff{dmp.DiffEqual, "foo "}, | ||||
| 		dmp.Diff{dmp.DiffInsert, "bar"}, | ||||
| 		dmp.Diff{dmp.DiffDelete, " baz"}, | ||||
| 		dmp.Diff{dmp.DiffEqual, " biz"}, | ||||
| 	}, DIFF_LINE_ADD)) | ||||
| 
 | ||||
|   assertEqual(t, "foo <span class=\"removed-code\">bar</span> biz", diffToHTML([]dmp.Diff{ | ||||
|     dmp.Diff{dmp.DiffEqual, "foo "}, | ||||
|     dmp.Diff{dmp.DiffDelete, "bar"}, | ||||
|     dmp.Diff{dmp.DiffInsert, " baz"}, | ||||
|     dmp.Diff{dmp.DiffEqual, " biz"}, | ||||
|   }, DIFF_LINE_DEL)) | ||||
| 	assertEqual(t, "foo <span class=\"removed-code\">bar</span> biz", diffToHTML([]dmp.Diff{ | ||||
| 		dmp.Diff{dmp.DiffEqual, "foo "}, | ||||
| 		dmp.Diff{dmp.DiffDelete, "bar"}, | ||||
| 		dmp.Diff{dmp.DiffInsert, " baz"}, | ||||
| 		dmp.Diff{dmp.DiffEqual, " biz"}, | ||||
| 	}, DIFF_LINE_DEL)) | ||||
| } | ||||
| 
 | ||||
| // test if GetLine is return the correct lines
 | ||||
| func TestGetLine(t *testing.T) { | ||||
|   ds := DiffSection{Lines: []*DiffLine{ | ||||
|     &DiffLine{LeftIdx: 28,  RightIdx:   28, Type: DIFF_LINE_PLAIN}, | ||||
|     &DiffLine{LeftIdx: 29,  RightIdx:   29, Type: DIFF_LINE_PLAIN}, | ||||
|     &DiffLine{LeftIdx: 30,  RightIdx:   30, Type: DIFF_LINE_PLAIN}, | ||||
|     &DiffLine{LeftIdx: 31,  RightIdx:    0, Type: DIFF_LINE_DEL}, | ||||
|     &DiffLine{LeftIdx:  0,  RightIdx:   31, Type: DIFF_LINE_ADD}, | ||||
|     &DiffLine{LeftIdx:  0,  RightIdx:   32, Type: DIFF_LINE_ADD}, | ||||
|     &DiffLine{LeftIdx: 32,  RightIdx:   33, Type: DIFF_LINE_PLAIN}, | ||||
|     &DiffLine{LeftIdx: 33,  RightIdx:    0, Type: DIFF_LINE_DEL}, | ||||
|     &DiffLine{LeftIdx: 34,  RightIdx:    0, Type: DIFF_LINE_DEL}, | ||||
|     &DiffLine{LeftIdx: 35,  RightIdx:    0, Type: DIFF_LINE_DEL}, | ||||
|     &DiffLine{LeftIdx: 36,  RightIdx:    0, Type: DIFF_LINE_DEL}, | ||||
|     &DiffLine{LeftIdx:  0,  RightIdx:   34, Type: DIFF_LINE_ADD}, | ||||
|     &DiffLine{LeftIdx:  0,  RightIdx:   35, Type: DIFF_LINE_ADD}, | ||||
|     &DiffLine{LeftIdx:  0,  RightIdx:   36, Type: DIFF_LINE_ADD}, | ||||
|     &DiffLine{LeftIdx:  0,  RightIdx:   37, Type: DIFF_LINE_ADD}, | ||||
|     &DiffLine{LeftIdx: 37,  RightIdx:   38, Type: DIFF_LINE_PLAIN}, | ||||
|     &DiffLine{LeftIdx: 38,  RightIdx:   39, Type: DIFF_LINE_PLAIN}, | ||||
|   }} | ||||
| 	ds := DiffSection{Lines: []*DiffLine{ | ||||
| 		&DiffLine{LeftIdx: 28, RightIdx: 28, Type: DIFF_LINE_PLAIN}, | ||||
| 		&DiffLine{LeftIdx: 29, RightIdx: 29, Type: DIFF_LINE_PLAIN}, | ||||
| 		&DiffLine{LeftIdx: 30, RightIdx: 30, Type: DIFF_LINE_PLAIN}, | ||||
| 		&DiffLine{LeftIdx: 31, RightIdx: 0, Type: DIFF_LINE_DEL}, | ||||
| 		&DiffLine{LeftIdx: 0, RightIdx: 31, Type: DIFF_LINE_ADD}, | ||||
| 		&DiffLine{LeftIdx: 0, RightIdx: 32, Type: DIFF_LINE_ADD}, | ||||
| 		&DiffLine{LeftIdx: 32, RightIdx: 33, Type: DIFF_LINE_PLAIN}, | ||||
| 		&DiffLine{LeftIdx: 33, RightIdx: 0, Type: DIFF_LINE_DEL}, | ||||
| 		&DiffLine{LeftIdx: 34, RightIdx: 0, Type: DIFF_LINE_DEL}, | ||||
| 		&DiffLine{LeftIdx: 35, RightIdx: 0, Type: DIFF_LINE_DEL}, | ||||
| 		&DiffLine{LeftIdx: 36, RightIdx: 0, Type: DIFF_LINE_DEL}, | ||||
| 		&DiffLine{LeftIdx: 0, RightIdx: 34, Type: DIFF_LINE_ADD}, | ||||
| 		&DiffLine{LeftIdx: 0, RightIdx: 35, Type: DIFF_LINE_ADD}, | ||||
| 		&DiffLine{LeftIdx: 0, RightIdx: 36, Type: DIFF_LINE_ADD}, | ||||
| 		&DiffLine{LeftIdx: 0, RightIdx: 37, Type: DIFF_LINE_ADD}, | ||||
| 		&DiffLine{LeftIdx: 37, RightIdx: 38, Type: DIFF_LINE_PLAIN}, | ||||
| 		&DiffLine{LeftIdx: 38, RightIdx: 39, Type: DIFF_LINE_PLAIN}, | ||||
| 	}} | ||||
| 
 | ||||
|   assertLineEqual(t, ds.GetLine(DIFF_LINE_ADD, 31), ds.Lines[4]) | ||||
|   assertLineEqual(t, ds.GetLine(DIFF_LINE_DEL, 31), ds.Lines[3]) | ||||
| 	assertLineEqual(t, ds.GetLine(DIFF_LINE_ADD, 31), ds.Lines[4]) | ||||
| 	assertLineEqual(t, ds.GetLine(DIFF_LINE_DEL, 31), ds.Lines[3]) | ||||
| 
 | ||||
|   assertLineEqual(t, ds.GetLine(DIFF_LINE_ADD, 33), ds.Lines[11]) | ||||
|   assertLineEqual(t, ds.GetLine(DIFF_LINE_ADD, 34), ds.Lines[12]) | ||||
|   assertLineEqual(t, ds.GetLine(DIFF_LINE_ADD, 35), ds.Lines[13]) | ||||
|   assertLineEqual(t, ds.GetLine(DIFF_LINE_ADD, 36), ds.Lines[14]) | ||||
|   assertLineEqual(t, ds.GetLine(DIFF_LINE_DEL, 34), ds.Lines[7]) | ||||
|   assertLineEqual(t, ds.GetLine(DIFF_LINE_DEL, 35), ds.Lines[8]) | ||||
|   assertLineEqual(t, ds.GetLine(DIFF_LINE_DEL, 36), ds.Lines[9]) | ||||
|   assertLineEqual(t, ds.GetLine(DIFF_LINE_DEL, 37), ds.Lines[10]) | ||||
| 	assertLineEqual(t, ds.GetLine(DIFF_LINE_ADD, 33), ds.Lines[11]) | ||||
| 	assertLineEqual(t, ds.GetLine(DIFF_LINE_ADD, 34), ds.Lines[12]) | ||||
| 	assertLineEqual(t, ds.GetLine(DIFF_LINE_ADD, 35), ds.Lines[13]) | ||||
| 	assertLineEqual(t, ds.GetLine(DIFF_LINE_ADD, 36), ds.Lines[14]) | ||||
| 	assertLineEqual(t, ds.GetLine(DIFF_LINE_DEL, 34), ds.Lines[7]) | ||||
| 	assertLineEqual(t, ds.GetLine(DIFF_LINE_DEL, 35), ds.Lines[8]) | ||||
| 	assertLineEqual(t, ds.GetLine(DIFF_LINE_DEL, 36), ds.Lines[9]) | ||||
| 	assertLineEqual(t, ds.GetLine(DIFF_LINE_DEL, 37), ds.Lines[10]) | ||||
| } | ||||
|  |  | |||
|  | @ -2,7 +2,7 @@ | |||
| // Use of this source code is governed by a MIT-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| package template | ||||
| package highlight | ||||
| 
 | ||||
| import ( | ||||
| 	"path" | ||||
|  | @ -12,10 +12,12 @@ body { | |||
| img { | ||||
|   border-radius: 3px; | ||||
| } | ||||
| pre { | ||||
| pre, | ||||
| code { | ||||
|   font: 12px Consolas, "Liberation Mono", Menlo, Courier, monospace; | ||||
| } | ||||
| pre.raw { | ||||
| pre.raw, | ||||
| code.raw { | ||||
|   padding: 7px 12px; | ||||
|   margin: 10px 0; | ||||
|   background-color: #f8f8f8; | ||||
|  | @ -25,7 +27,8 @@ pre.raw { | |||
|   line-height: 1.5; | ||||
|   overflow: auto; | ||||
| } | ||||
| pre.wrap { | ||||
| pre.wrap, | ||||
| code.wrap { | ||||
|   white-space: pre-wrap; | ||||
|   /* CSS 3 */ | ||||
|   word-break: break-word; | ||||
|  | @ -387,6 +390,11 @@ footer .container .links > *:first-child { | |||
|     width: 95%; | ||||
|   } | ||||
| } | ||||
| /* Overrides some styles of the Highlight.js plugin */ | ||||
| .hljs { | ||||
|   background: inherit !important; | ||||
|   padding: 0 !important; | ||||
| } | ||||
| .markdown { | ||||
|   overflow: hidden; | ||||
|   font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif; | ||||
|  |  | |||
|  | @ -8,7 +8,7 @@ body { | |||
| img { | ||||
| 	border-radius: 3px; | ||||
| } | ||||
| pre { | ||||
| pre, code { | ||||
| 	font: 12px Consolas, "Liberation Mono", Menlo, Courier, monospace; | ||||
| 	&.raw { | ||||
| 		padding: 7px 12px; | ||||
|  | @ -375,3 +375,9 @@ footer { | |||
| 		width: 95%; | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| /* Overrides some styles of the Highlight.js plugin */ | ||||
| .hljs { | ||||
| 	background: inherit !important; | ||||
| 	padding: 0 !important; | ||||
| } | ||||
|  |  | |||
|  | @ -28,7 +28,7 @@ import ( | |||
| 	"github.com/gogits/gogs/modules/middleware" | ||||
| 	"github.com/gogits/gogs/modules/setting" | ||||
| 	"github.com/gogits/gogs/modules/ssh" | ||||
| 	"github.com/gogits/gogs/modules/template" | ||||
| 	"github.com/gogits/gogs/modules/template/highlight" | ||||
| 	"github.com/gogits/gogs/modules/user" | ||||
| ) | ||||
| 
 | ||||
|  | @ -56,7 +56,7 @@ func NewServices() { | |||
| // GlobalInit is for global configuration reload-able.
 | ||||
| func GlobalInit() { | ||||
| 	setting.NewContext() | ||||
| 	template.NewContext() | ||||
| 	highlight.NewContext() | ||||
| 	log.Trace("Custom path: %s", setting.CustomPath) | ||||
| 	log.Trace("Log path: %s", setting.LogRootPath) | ||||
| 	models.LoadConfigs() | ||||
|  |  | |||
|  | @ -183,6 +183,7 @@ func Diff(ctx *middleware.Context) { | |||
| 		ctx.Data["BeforeSourcePath"] = setting.AppSubUrl + "/" + path.Join(userName, repoName, "src", parents[0]) | ||||
| 	} | ||||
| 	ctx.Data["RawPath"] = setting.AppSubUrl + "/" + path.Join(userName, repoName, "raw", commitID) | ||||
| 	ctx.Data["RequireHighlightJS"] = true | ||||
| 	ctx.HTML(200, DIFF) | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -362,6 +362,7 @@ func ViewPullFiles(ctx *middleware.Context) { | |||
| 	ctx.Data["SourcePath"] = setting.AppSubUrl + "/" + path.Join(headTarget, "src", endCommitID) | ||||
| 	ctx.Data["BeforeSourcePath"] = setting.AppSubUrl + "/" + path.Join(headTarget, "src", startCommitID) | ||||
| 	ctx.Data["RawPath"] = setting.AppSubUrl + "/" + path.Join(headTarget, "raw", endCommitID) | ||||
| 	ctx.Data["RequireHighlightJS"] = true | ||||
| 
 | ||||
| 	ctx.HTML(200, PULL_FILES) | ||||
| } | ||||
|  | @ -538,6 +539,7 @@ func CompareAndPullRequest(ctx *middleware.Context) { | |||
| 	ctx.Data["Title"] = ctx.Tr("repo.pulls.compare_changes") | ||||
| 	ctx.Data["PageIsComparePull"] = true | ||||
| 	ctx.Data["IsDiffCompare"] = true | ||||
| 	ctx.Data["RequireHighlightJS"] = true | ||||
| 	renderAttachmentSettings(ctx) | ||||
| 
 | ||||
| 	headUser, headRepo, headGitRepo, prInfo, baseBranch, headBranch := ParseCompareInfo(ctx) | ||||
|  |  | |||
|  | @ -19,6 +19,7 @@ import ( | |||
| 	"github.com/gogits/gogs/modules/log" | ||||
| 	"github.com/gogits/gogs/modules/middleware" | ||||
| 	"github.com/gogits/gogs/modules/template" | ||||
| 	"github.com/gogits/gogs/modules/template/highlight" | ||||
| ) | ||||
| 
 | ||||
| const ( | ||||
|  | @ -79,7 +80,7 @@ func Home(ctx *middleware.Context) { | |||
| 			ctx.Data["FileSize"] = blob.Size() | ||||
| 			ctx.Data["IsFile"] = true | ||||
| 			ctx.Data["FileName"] = blob.Name() | ||||
| 			ctx.Data["HighlightClass"] = template.FileNameToHighlightClass(blob.Name()) | ||||
| 			ctx.Data["HighlightClass"] = highlight.FileNameToHighlightClass(blob.Name()) | ||||
| 			ctx.Data["FileLink"] = rawLink + "/" + treename | ||||
| 
 | ||||
| 			buf := make([]byte, 1024) | ||||
|  |  | |||
|  | @ -76,13 +76,13 @@ | |||
| 														<span rel="{{if $line.LeftIdx}}diff-{{Sha1 $file.Name}}L{{$line.LeftIdx}}{{end}}">{{if $line.LeftIdx}}{{$line.LeftIdx}}{{end}}</span> | ||||
| 													</td> | ||||
| 													<td class="lines-code halfwidth"> | ||||
| 														<pre class="wrap">{{if $line.LeftIdx}}{{$section.GetComputedInlineDiffFor $line}}{{end}}</pre> | ||||
| 														<pre><code class="wrap {{if $file.GetHighlightClass}}language-{{$file.GetHighlightClass}}{{else}}nohighlight{{end}}">{{if $line.LeftIdx}}{{$section.GetComputedInlineDiffFor $line}}{{end}}</code></pre> | ||||
| 													</td> | ||||
| 													<td class="lines-num lines-num-new"> | ||||
| 														<span rel="{{if $line.RightIdx}}diff-{{Sha1 $file.Name}}R{{$line.RightIdx}}{{end}}">{{if $line.RightIdx}}{{$line.RightIdx}}{{end}}</span> | ||||
| 													</td> | ||||
| 													<td class="lines-code halfwidth"> | ||||
| 														<pre class="wrap">{{if $line.RightIdx}}{{$section.GetComputedInlineDiffFor $line}}{{end}}</pre> | ||||
| 														<pre><code class="wrap {{if $file.GetHighlightClass}}language-{{$file.GetHighlightClass}}{{else}}nohighlight{{end}}">{{if $line.RightIdx}}{{$section.GetComputedInlineDiffFor $line}}{{end}}</code></pre> | ||||
| 													</td> | ||||
| 												</tr> | ||||
| 											{{end}} | ||||
|  | @ -104,7 +104,7 @@ | |||
| 													</td> | ||||
| 													{{end}} | ||||
| 													<td class="lines-code"> | ||||
| 														<pre>{{$section.GetComputedInlineDiffFor $line}}</pre> | ||||
| 														<pre><code class="{{if $file.GetHighlightClass}}language-{{$file.GetHighlightClass}}{{else}}nohighlight{{end}}">{{$section.GetComputedInlineDiffFor $line}}</code></pre> | ||||
| 													</td> | ||||
| 												</tr> | ||||
| 											{{end}} | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue