sitemap.go (1947B)
1 package main 2 3 import ( 4 "sort" 5 "strings" 6 ) 7 8 func findRootPage(pages []Page) (root *Page) { 9 for i, p := range pages { 10 if p.Path == "/" { 11 root = &pages[i] 12 break 13 } 14 } 15 return 16 } 17 18 func readPageDepth(p Page) (depth int) { 19 if p.Path == "/" { 20 depth = 0 21 } else { 22 depth = len(strings.Split(p.Path, "/")[1:]) 23 } 24 return 25 } 26 27 // BuildCrumbs will generate a `[]*Page`, where each item is a pointer to the Page 28 // found `pages`, who's `.Path` matches a crumb in `p.Path`. 29 // "crumbs" referring to https://en.wikipedia.org/wiki/Breadcrumb_navigation 30 func BuildCrumbs(p Page, pages []Page) (crumbs []*Page) { 31 var path string 32 for _, c := range strings.Split(p.Path, "/")[1:] { 33 path += "/" + c 34 for j, pp := range pages { 35 if pp.Path == path { 36 crumbs = append(crumbs, &pages[j]) 37 break 38 } 39 } 40 } 41 return 42 } 43 44 // Sitemap parses `pages` to determine the `.Nav` values for each element in `pages` 45 // based on their `.Path` value. These values will be set in the returned Content 46 func BuildSitemap(pages []Page) []Page { 47 root := findRootPage(pages) 48 49 for i, p := range pages { 50 pdepth := readPageDepth(p) 51 52 p.Nav.Root = root 53 54 if pdepth == 1 && p.Path != "/" { 55 p.Nav.Parent = root 56 } 57 58 for j, pp := range pages { 59 ppdepth := readPageDepth(pp) 60 61 p.Nav.All = append(p.Nav.All, &pages[j]) 62 63 if p.Nav.Parent == nil && ppdepth == pdepth-1 && strings.Contains(p.Path, pp.Path) { 64 p.Nav.Parent = &pages[j] 65 } 66 if ppdepth == pdepth+1 && strings.Contains(pp.Path, p.Path) { 67 p.Nav.Children = append(p.Nav.Children, &pages[j]) 68 } 69 } 70 71 sort.SliceStable(p.Nav.All, func(i, j int) bool { 72 return sort.StringsAreSorted( 73 []string{p.Nav.All[j].Updated, p.Nav.All[i].Updated}) 74 }) 75 sort.SliceStable(p.Nav.Children, func(i, j int) bool { 76 return sort.StringsAreSorted( 77 []string{p.Nav.Children[j].Updated, p.Nav.Children[i].Updated}) 78 }) 79 80 p.Nav.Crumbs = BuildCrumbs(p, pages) 81 82 pages[i] = p 83 } 84 85 return pages 86 }