Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Determines order of nodes for display. display_order is nullable and has
- // higher priority over title
- const compareDisplayOrder = (a, b) => {
- if (a.display_order === b.display_order) {
- if (a.title > b.title) {
- return 1
- }
- if (a.title < b.title) {
- return -1
- }
- }
- if (a.display_order === null) {
- return 1
- }
- if (b.display_order === null) {
- return -1
- }
- if (a.display_order > b.display_order) {
- return 1
- }
- if (a.display_order < b.display_order) {
- return -1
- }
- return 0
- }
- const buildNavigationTree = edges => {
- const navigationTree = {}
- let currentBranch
- for (const edge of edges) {
- currentBranch = navigationTree
- // create tree based off each directory segment in slug for each node
- for (const slugSegment of edge.node.fields.slug.split("/")) {
- if (slugSegment !== "") {
- if (!currentBranch.children) {
- currentBranch.children = {}
- }
- // if currentBranch.children does not have a property of the same name
- // of slugSegment, then we need to create a new branch for this
- // slugSegment
- if (!(slugSegment in currentBranch.children)) {
- currentBranch.children[slugSegment] = {}
- currentBranch.children[slugSegment].id = edge.node.id
- currentBranch.children[slugSegment].slug = edge.node.fields.slug
- currentBranch.children[slugSegment].title =
- edge.node.frontmatter.title
- currentBranch.children[slugSegment].display_order =
- edge.node.frontmatter.display_order
- }
- // change currentBranch to the new branch we just created
- currentBranch = currentBranch.children[slugSegment]
- }
- }
- }
- // remove root-level children property as it is unnecessary
- return navigationTree.children
- }
- const sortNavigationTree = navigationTree => {
- let sortedTree = Object.keys(navigationTree)
- .sort((a, b) => compareDisplayOrder(navigationTree[a], navigationTree[b]))
- // use the sort results to reorder the properties on the current branch
- .reduce(function (result, key) {
- result[key] = navigationTree[key]
- return result
- }, {})
- for (const node in sortedTree) {
- // iterates through each node on current level and recursively runs for all
- // children on those nodes until each node and all their children are sorted
- if (sortedTree[node].children) {
- sortedTree[node].children = sortNavigationTree(sortedTree[node].children)
- }
- }
- return sortedTree
- }
- const data = useStaticQuery(graphql`
- query {
- allMarkdownRemark {
- edges {
- node {
- id
- frontmatter {
- title
- display_order
- }
- fields {
- slug
- }
- }
- }
- }
- }
- `)
- let navigationTree = buildNavigationTree(data.allMarkdownRemark.edges)
- navigationTree = sortNavigationTree(navigationTree)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement