@@ -11,6 +11,7 @@ import (
1111 "io"
1212 "net/http"
1313 "net/url"
14+ "path"
1415 "path/filepath"
1516 "strings"
1617
@@ -72,6 +73,7 @@ func MustEnableWiki(ctx *context.Context) {
7273// PageMeta wiki page meta information
7374type PageMeta struct {
7475 Name string
76+ IsDir bool
7577 SubURL string
7678 GitEntryName string
7779 UpdatedUnix timeutil.TimeStamp
@@ -190,8 +192,23 @@ func renderViewPage(ctx *context.Context) (*git.Repository, *git.TreeEntry) {
190192 return nil , nil
191193 }
192194
195+ reqPath := util .PathJoinRelX (ctx .PathParamRaw ("*" ))
196+ p , err := url .PathUnescape (reqPath )
197+ if err != nil {
198+ ctx .ServerError ("PathUnescape" , err )
199+ return nil , nil
200+ }
201+ dirPath , pageName := path .Split (p )
202+ pageName = strings .TrimSuffix (pageName , ".md" )
203+ treePath := wiki_service .WebDirPathToGitPath (wiki_service .WebPath (dirPath ))
204+ tree , err := commit .SubTree (treePath )
205+ if err != nil {
206+ ctx .ServerError ("SubTree" , err )
207+ return nil , nil
208+ }
209+
193210 // Get page list.
194- entries , err := commit .ListEntries ()
211+ entries , err := tree .ListEntries ()
195212 if err != nil {
196213 if wikiRepo != nil {
197214 wikiRepo .Close ()
@@ -227,13 +244,12 @@ func renderViewPage(ctx *context.Context) (*git.Repository, *git.TreeEntry) {
227244 ctx .Data ["Pages" ] = pages
228245
229246 // get requested page name
230- pageName := wiki_service .WebPathFromRequest (ctx .PathParamRaw ("*" ))
231247 if len (pageName ) == 0 {
232248 pageName = "Home"
233249 }
234250
235- _ , displayName := wiki_service .WebPathToUserTitle (pageName )
236- ctx .Data ["PageURL" ] = wiki_service .WebPathToURLPath (pageName )
251+ _ , displayName := wiki_service .WebPathToUserTitle (wiki_service . WebPath ( pageName ) )
252+ ctx .Data ["PageURL" ] = wiki_service .WebPathToURLPath (wiki_service . WebPath ( pageName ) )
237253 ctx .Data ["old_title" ] = displayName
238254 ctx .Data ["Title" ] = displayName
239255 ctx .Data ["title" ] = displayName
@@ -242,7 +258,7 @@ func renderViewPage(ctx *context.Context) (*git.Repository, *git.TreeEntry) {
242258 isFooter := pageName == "_Footer"
243259
244260 // lookup filename in wiki - get gitTree entry , real filename
245- entry , pageFilename , noEntry , isRaw := wikiEntryByName (ctx , commit , pageName )
261+ entry , pageFilename , noEntry , isRaw := wikiEntryByName (ctx , commit , wiki_service . WebPath ( p ) )
246262 if noEntry {
247263 ctx .Redirect (ctx .Repo .RepoLink + "/wiki/?action=_pages" )
248264 }
@@ -647,7 +663,8 @@ func WikiPages(ctx *context.Context) {
647663 return
648664 }
649665
650- treePath := "" // To support list sub folders' pages in the future
666+ dirPath := util .PathJoinRelX (ctx .PathParamRaw ("*" ))
667+ treePath := wiki_service .WebDirPathToGitPath (wiki_service .WebPath (dirPath ))
651668 tree , err := commit .SubTree (treePath )
652669 if err != nil {
653670 ctx .ServerError ("SubTree" , err )
@@ -669,22 +686,33 @@ func WikiPages(ctx *context.Context) {
669686
670687 pages := make ([]PageMeta , 0 , len (entries ))
671688 for _ , entry := range entries {
672- if ! entry .Entry .IsRegular () {
689+ if ! entry .Entry .IsRegular () && ! entry . Entry . IsDir () {
673690 continue
674691 }
675- wikiName , err := wiki_service .GitPathToWebPath (entry .Entry .Name ())
676- if err != nil {
677- if repo_model .IsErrWikiInvalidFileName (err ) {
678- continue
692+ var wikiName wiki_service.WebPath
693+ if entry .Entry .IsDir () {
694+ wikiName , err = wiki_service .GitDirPathToWebPath (entry .Entry .Name ())
695+ if err != nil {
696+ ctx .ServerError ("GitDirPathToWebPath" , err )
697+ return
698+ }
699+ } else {
700+ wikiName , err = wiki_service .GitPathToWebPath (entry .Entry .Name ())
701+ if err != nil {
702+ if repo_model .IsErrWikiInvalidFileName (err ) {
703+ continue
704+ }
705+ ctx .ServerError ("GitPathToWebPath" , err )
706+ return
679707 }
680- ctx .ServerError ("WikiFilenameToName" , err )
681- return
682708 }
683709 _ , displayName := wiki_service .WebPathToUserTitle (wikiName )
710+ urlPath := path .Join (string (dirPath ), string (wikiName ))
684711 pages = append (pages , PageMeta {
685712 Name : displayName ,
686- SubURL : wiki_service .WebPathToURLPath (wikiName ),
687- GitEntryName : entry .Entry .Name (),
713+ IsDir : entry .Entry .IsDir (),
714+ SubURL : wiki_service .WebPathToURLPath (wiki_service .WebPath (urlPath )),
715+ GitEntryName : path .Join (string (dirPath ), entry .Entry .Name ()),
688716 UpdatedUnix : timeutil .TimeStamp (entry .Commit .Author .When .Unix ()),
689717 })
690718 }
0 commit comments