* render code view server side * remove debug print * fix multiline selection bug * change string concatenation to bytes.Buffer for efficiency * Fix newlines added by previous for hljs * fix selection highlighting * make css changes in .lessmaster
@@ -1316,6 +1316,8 @@ footer .ui.language .menu { | |||||
.repository.file.list #file-content .code-view .lines-num .hljs li, | .repository.file.list #file-content .code-view .lines-num .hljs li, | ||||
.repository.file.list #file-content .code-view .lines-code .hljs li { | .repository.file.list #file-content .code-view .lines-code .hljs li { | ||||
padding-left: 5px; | padding-left: 5px; | ||||
display: inline-block; | |||||
width: 100%; | |||||
} | } | ||||
.repository.file.list #file-content .code-view .lines-num pre li.active, | .repository.file.list #file-content .code-view .lines-num pre li.active, | ||||
.repository.file.list #file-content .code-view .lines-code pre li.active, | .repository.file.list #file-content .code-view .lines-code pre li.active, | ||||
@@ -1088,7 +1088,7 @@ $(window).load(function () { | |||||
b = c; | b = c; | ||||
} | } | ||||
var classes = []; | var classes = []; | ||||
for (i = a; i <= b; i++) { | |||||
for (var i = a; i <= b; i++) { | |||||
classes.push('.L' + i); | classes.push('.L' + i); | ||||
} | } | ||||
$list.filter(classes.join(',')).addClass('active'); | $list.filter(classes.join(',')).addClass('active'); | ||||
@@ -1102,22 +1102,6 @@ $(window).load(function () { | |||||
// Code view. | // Code view. | ||||
if ($('.code-view .linenums').length > 0) { | if ($('.code-view .linenums').length > 0) { | ||||
var $block = $('.code-view .linenums'); | |||||
var lines = $block.html().split("\n"); | |||||
$block.html(''); | |||||
var $num_list = $('.code-view .lines-num'); | |||||
// Building blocks. | |||||
var $toappendblock = []; | |||||
var $toappendnum_list = []; | |||||
for (var i = 0; i < lines.length; i++) { | |||||
$toappendblock.push('<li class="L' + (i + 1) + '" rel="L' + (i + 1) + '">' + lines[i] + '</li>'); | |||||
$toappendnum_list.push('<span id="L' + (i + 1) + '">' + (i + 1) + '</span>'); | |||||
} | |||||
$block.append($toappendblock.join('')); | |||||
$num_list.append($toappendnum_list.join('')); | |||||
$(document).on('click', '.lines-num span', function (e) { | $(document).on('click', '.lines-num span', function (e) { | ||||
var $select = $(this); | var $select = $(this); | ||||
var $list = $select.parent().siblings('.lines-code').find('ol.linenums > li'); | var $list = $select.parent().siblings('.lines-code').find('ol.linenums > li'); | ||||
@@ -251,6 +251,8 @@ | |||||
padding: 0 !important; | padding: 0 !important; | ||||
li { | li { | ||||
padding-left: 5px; | padding-left: 5px; | ||||
display: inline-block; | |||||
width: 100%; | |||||
&.active { | &.active { | ||||
background: #ffffdd; | background: #ffffdd; | ||||
} | } | ||||
@@ -5,11 +5,14 @@ | |||||
package repo | package repo | ||||
import ( | import ( | ||||
"fmt" | |||||
"bytes" | "bytes" | ||||
"io/ioutil" | "io/ioutil" | ||||
"path" | "path" | ||||
"strings" | "strings" | ||||
htmltemplate "html/template" | |||||
"github.com/Unknwon/paginater" | "github.com/Unknwon/paginater" | ||||
"github.com/gogits/git-module" | "github.com/gogits/git-module" | ||||
@@ -116,14 +119,27 @@ func Home(ctx *context.Context) { | |||||
if readmeExist { | if readmeExist { | ||||
ctx.Data["FileContent"] = string(markdown.Render(buf, path.Dir(treeLink), ctx.Repo.Repository.ComposeMetas())) | ctx.Data["FileContent"] = string(markdown.Render(buf, path.Dir(treeLink), ctx.Repo.Repository.ComposeMetas())) | ||||
} else { | } else { | ||||
filecontent := "" | |||||
if err, content := template.ToUtf8WithErr(buf); err != nil { | if err, content := template.ToUtf8WithErr(buf); err != nil { | ||||
if err != nil { | if err != nil { | ||||
log.Error(4, "Convert content encoding: %s", err) | log.Error(4, "Convert content encoding: %s", err) | ||||
} | } | ||||
ctx.Data["FileContent"] = string(buf) | |||||
filecontent = string(buf) | |||||
} else { | } else { | ||||
ctx.Data["FileContent"] = content | |||||
filecontent = content | |||||
} | |||||
var output bytes.Buffer | |||||
lines := strings.Split(filecontent, "\n") | |||||
for index, line := range lines { | |||||
output.WriteString(fmt.Sprintf(`<li class="L%d" rel="L%d">%s</li>`, index+1, index+1, htmltemplate.HTMLEscapeString(line)) + "\n") | |||||
} | |||||
ctx.Data["FileContent"] = htmltemplate.HTML(output.String()) | |||||
output.Reset() | |||||
for i := 0; i < len(lines); i++ { | |||||
output.WriteString(fmt.Sprintf(`<span id="L%d">%d</span>`, i+1, i+1)) | |||||
} | } | ||||
ctx.Data["LineNums"] = htmltemplate.HTML(output.String()) | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -44,7 +44,7 @@ | |||||
{{if .IsFileTooLarge}} | {{if .IsFileTooLarge}} | ||||
<td><strong>{{.i18n.Tr "repo.file_too_large"}}</strong></td> | <td><strong>{{.i18n.Tr "repo.file_too_large"}}</strong></td> | ||||
{{else}} | {{else}} | ||||
<td class="lines-num"></td> | |||||
<td class="lines-num">{{.LineNums}}</td> | |||||
<td class="lines-code"><pre><code class="{{.HighlightClass}}"><ol class="linenums">{{.FileContent}}</ol></code></pre></td> | <td class="lines-code"><pre><code class="{{.HighlightClass}}"><ol class="linenums">{{.FileContent}}</ol></code></pre></td> | ||||
{{end}} | {{end}} | ||||
</tr> | </tr> | ||||