@@ -117,6 +117,17 @@ func NewFuncMap() []template.FuncMap { | |||
} | |||
return "tab-size-8" | |||
}, | |||
"SubJumpablePath": func(str string) []string { | |||
var path []string | |||
index := strings.LastIndex(str, "/") | |||
if index != -1 && index != len(str) { | |||
path = append(path, string(str[0:index+1])) | |||
path = append(path, string(str[index+1:])) | |||
} else { | |||
path = append(path, str) | |||
} | |||
return path | |||
}, | |||
}} | |||
} | |||
@@ -1272,6 +1272,9 @@ footer .ui.language .menu { | |||
.repository.file.list #repo-files-table tr:hover { | |||
background-color: #ffffEE; | |||
} | |||
.repository.file.list #repo-files-table .jumpable-path { | |||
color: #888; | |||
} | |||
.repository.file.list #file-content .header .icon { | |||
font-size: 1em; | |||
margin-top: -2px; |
@@ -205,6 +205,9 @@ | |||
tr:hover { | |||
background-color: #ffffEE; | |||
} | |||
.jumpable-path { | |||
color: #888; | |||
} | |||
} | |||
#file-content { |
@@ -43,8 +43,21 @@ | |||
</td> | |||
{{else}} | |||
<td class="name"> | |||
<span class="octicon octicon-file-{{if or $entry.IsDir}}directory{{else}}text{{end}}"></span> | |||
<a href="{{EscapePound $.TreeLink}}/{{EscapePound $entry.Name}}">{{$entry.Name}}</a> | |||
{{if $entry.IsDir}} | |||
{{$subJumpablePathName := $entry.GetSubJumpablePathName}} | |||
{{$subJumpablePath := SubJumpablePath $subJumpablePathName}} | |||
<span class="octicon octicon-file-directory"></span> | |||
<a href="{{EscapePound $.TreeLink}}/{{EscapePound $subJumpablePathName}}"> | |||
{{if eq (len $subJumpablePath) 2}} | |||
<span class="jumpable-path">{{index $subJumpablePath 0}}</span>{{index $subJumpablePath 1}} | |||
{{else}} | |||
{{index $subJumpablePath 0}} | |||
{{end}} | |||
</a> | |||
{{else}} | |||
<span class="octicon octicon-file-text"></span> | |||
<a href="{{EscapePound $.TreeLink}}/{{EscapePound $entry.Name}}">{{$entry.Name}}</a> | |||
{{end}} | |||
</td> | |||
{{end}} | |||
<td class="message collapsing has-emoji"> |
@@ -94,6 +94,25 @@ func (te *TreeEntry) Blob() *Blob { | |||
} | |||
} | |||
// GetSubJumpablePathName return the full path of subdirectory jumpable ( contains only one directory ) | |||
func (te *TreeEntry) GetSubJumpablePathName() string { | |||
if te.IsSubModule() || !te.IsDir() { | |||
return "" | |||
} | |||
tree, err := te.ptree.SubTree(te.name) | |||
if err != nil { | |||
return te.name | |||
} | |||
entries, _ := tree.ListEntries() | |||
if len(entries) == 1 && entries[0].IsDir() { | |||
name := entries[0].GetSubJumpablePathName() | |||
if name != "" { | |||
return te.name + "/" + name | |||
} | |||
} | |||
return te.name | |||
} | |||
// Entries a list of entry | |||
type Entries []*TreeEntry | |||
@@ -3,10 +3,10 @@ | |||
"ignore": "test", | |||
"package": [ | |||
{ | |||
"checksumSHA1": "OWuUWQ8sWC8n+eTQttx+3vfES8g=", | |||
"checksumSHA1": "mIaKLz6373W+jDLjgE/Yzt/exeo=", | |||
"path": "code.gitea.io/git", | |||
"revision": "634abd6a61c350a95f6b146c3a5fc323282608ae", | |||
"revisionTime": "2016-12-22T08:49:21Z" | |||
"revision": "3d0fa331865619d2f3a7a0fcf23670a389310954", | |||
"revisionTime": "2016-12-28T14:57:51Z" | |||
}, | |||
{ | |||
"checksumSHA1": "dnGaLR7sd9D5YpQZP4QUGZiEq+c=", |