pagr

A 'static site generator', built using dati.
Log | Files | Refs | Atom

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 }