Advertisement
Guest User

Untitled

a guest
Nov 9th, 2020
172
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // Determines order of nodes for display. display_order is nullable and has
  2. // higher priority over title
  3. const compareDisplayOrder = (a, b) => {
  4.   if (a.display_order === b.display_order) {
  5.     if (a.title > b.title) {
  6.       return 1
  7.     }
  8.  
  9.     if (a.title < b.title) {
  10.       return -1
  11.     }
  12.   }
  13.  
  14.   if (a.display_order === null) {
  15.     return 1
  16.   }
  17.  
  18.   if (b.display_order === null) {
  19.     return -1
  20.   }
  21.  
  22.   if (a.display_order > b.display_order) {
  23.     return 1
  24.   }
  25.  
  26.   if (a.display_order < b.display_order) {
  27.     return -1
  28.   }
  29.  
  30.   return 0
  31. }
  32.  
  33. const buildNavigationTree = edges => {
  34.   const navigationTree = {}
  35.   let currentBranch
  36.  
  37.   for (const edge of edges) {
  38.     currentBranch = navigationTree
  39.  
  40.     // create tree based off each directory segment in slug for each node
  41.     for (const slugSegment of edge.node.fields.slug.split("/")) {
  42.       if (slugSegment !== "") {
  43.         if (!currentBranch.children) {
  44.           currentBranch.children = {}
  45.         }
  46.  
  47.         // if currentBranch.children does not have a property of the same name
  48.         // of slugSegment, then we need to create a new branch for this
  49.         // slugSegment
  50.         if (!(slugSegment in currentBranch.children)) {
  51.           currentBranch.children[slugSegment] = {}
  52.           currentBranch.children[slugSegment].id = edge.node.id
  53.           currentBranch.children[slugSegment].slug = edge.node.fields.slug
  54.           currentBranch.children[slugSegment].title =
  55.             edge.node.frontmatter.title
  56.  
  57.           currentBranch.children[slugSegment].display_order =
  58.             edge.node.frontmatter.display_order
  59.         }
  60.  
  61.         // change currentBranch to the new branch we just created
  62.         currentBranch = currentBranch.children[slugSegment]
  63.       }
  64.     }
  65.   }
  66.  
  67.   // remove root-level children property as it is unnecessary
  68.   return navigationTree.children
  69. }
  70.  
  71. const sortNavigationTree = navigationTree => {
  72.   let sortedTree = Object.keys(navigationTree)
  73.     .sort((a, b) => compareDisplayOrder(navigationTree[a], navigationTree[b]))
  74.     // use the sort results to reorder the properties on the current branch
  75.     .reduce(function (result, key) {
  76.       result[key] = navigationTree[key]
  77.       return result
  78.     }, {})
  79.  
  80.   for (const node in sortedTree) {
  81.     // iterates through each node on current level and recursively runs for all
  82.     // children on those nodes until each node and all their children are sorted
  83.     if (sortedTree[node].children) {
  84.       sortedTree[node].children = sortNavigationTree(sortedTree[node].children)
  85.     }
  86.   }
  87.  
  88.   return sortedTree
  89. }
  90.  
  91. const data = useStaticQuery(graphql`
  92.   query {
  93.     allMarkdownRemark {
  94.       edges {
  95.         node {
  96.           id
  97.           frontmatter {
  98.             title
  99.             display_order
  100.           }
  101.           fields {
  102.             slug
  103.           }
  104.         }
  105.       }
  106.     }
  107.   }
  108. `)
  109.  
  110. let navigationTree = buildNavigationTree(data.allMarkdownRemark.edges)
  111. navigationTree = sortNavigationTree(navigationTree)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement