text: const docFolder = './documents/';
  const fs = require('fs');
  const marked = require('marked');
  const highlight = require('highlight.js');
  const renderer = new marked.Renderer();
  const brodocDec = require('./markedDecorations.js');
  
  
  marked.setOptions({
      renderer: renderer,
      gfm: true,
      tables: true,
      breaks: false,
      pedantic: false,
      sanitize: false,
      smartLists: true,
      smartypants: false,
      highlight: function (code, lang) {
          return highlight.highlightAuto(code).value;
      }
  });
  brodocDec.decorateMarked(renderer);
  
  var config = require('./manifest');
  var docs = config.docs;
  
  var files = [];
  var fileArray = [];
  docs.forEach(file => {
      files.push(file.filename);
      fileArray.push(file);
  });
  
  var bodyContent = '';
  var navIds = brodocDec.navIds;
  var codeTabs = brodocDec.codeTabs;
  
  
  // const lexer = new marked.Lexer();
  // lexer.rules.bdoc = /^(\/{4} )(\w+).*$/;
  
  var path = docFolder;
  var fIndex = 0;
  var rIndex = 0;
  var fileObj = {toc: [], content: [], tabs: []};
  fileArray.forEach((file, index) => {
      fs.readFile(path + file.filename, 'utf8', (err, data) => {
          rIndex++;
          file.content = data;
  
          if (rIndex >= files.length) {
              // do the things
              parseFileContent(fileArray);
              var navData = generateNavItems(navIds);
              var navContent = navData.content;
              var navDataArray = navData.navDataArray;
              var codeTabContent = generateCodeTabItems(codeTabs);
              var bodyContent = flattenContent(parsedContentArray);
              generateDoc(navContent, bodyContent, codeTabContent);
              generateNavJson(navDataArray);
          }
      });
  });
  
  function flattenContent(content) {
      var flattenedContent = content.reduce(function(accum, val) {
          return accum + val;
      });
      return flattenedContent;
  }
  
  var parsedContentArray = [];
  function parseFileContent(files) {
      files.forEach((file, index) => {
          parsedContentArray[index] = parseDoc(file.content);
      });
  }
  function parseDoc(doc) {
      return marked(doc, { renderer: renderer });
  }
  
  function generateNavItems(navObjs) {
      var reversedNavs = navObjs.reverse();
      var currentNestArray = [];
      var currentStrongArray = [];
      var flattenedNest = '';
      var nestedNavArray = []; // Array containing generated html menu items - is flattened into a string.
      var navArrayInvert = []; // Deals with data layer of navigation;
      var navSectionArray = [];
      var navStrongSectionArray = [];
      var navSectionArrayClone;
      var flatNavArrayInvert = [];
      reversedNavs.forEach(obj => {
          flatNavArrayInvert.push(obj.id);
          var strong = (obj.id.indexOf('-strong-') !== -1);
          if (obj.level !== 1) {
              if (strong && currentNestArray.length !== 0) {
                  flattenedNest = flattenContent(currentNestArray.reverse());
                  currentStrongArray.push(generateNestedNav(obj, flattenedNest));
                  currentNestArray.length = 0;
  
                  navSectionArrayClone = Object.assign([], navSectionArray);
                  navStrongSectionArray.push({section: obj.id, subsections: navSectionArrayClone});
                  navSectionArray.length = 0;
              } else {
                  currentNestArray.push(generateNav(obj));
                  navSectionArray.push({section: obj.id});
              }
          } else if (obj.level === 1) {
              if (currentStrongArray.length !== 0) {
                  currentNestArray.forEach(obj => {
                      currentStrongArray.push(obj);
                  });
                  flattenedNest = flattenContent(currentStrongArray.reverse());
              } else if (currentNestArray.length !== 0) {
                  flattenedNest = flattenContent(currentNestArray.reverse());
              }
              nestedNavArray.push(generateNestedNav(obj, flattenedNest));
              currentNestArray.length = 0;
              currentStrongArray.length = 0;
              flattenedNest = '';
  
              navSectionArray.forEach(obj => {
                  navStrongSectionArray.push(obj);
              });
              navSectionArrayClone = Object.assign([], navStrongSectionArray);
              navStrongSectionArray.length = 0;
              navArrayInvert.push({section: obj.id, subsections: navSectionArrayClone});
              navSectionArray.length = 0;
          }
      });
      
      var navContent = flattenContent(nestedNavArray.reverse());
      return {content: navContent, navDataArray: {toc: navArrayInvert, flatToc: flatNavArrayInvert}};
  }
  
  function generateNav(obj) {
      var classString = 'nav-level-' + obj.level;
      var isStrong = obj.id.indexOf('-strong-') !== -1;
      if (isStrong) {
          classString += ' strong-nav';
      }
      return '<li class="' + classString + '">' + '<a href="#' + obj.id + '" class="nav-item">' + obj.text + '</a></li>';
  }
  
  function generateNestedNav(parent, nest) {
      var nestContent = '';
      if (nest.length > 0) {
          nestContent = nest ? '<ul id="' + parent.id + '-nav" style="display: none;">' + nest + '</ul>' : '';
      }
      return '<ul>' + generateNav(parent) + nestContent + '</ul>';
  }
  
  function generateNavJson(data) {
      var navJson = JSON.stringify(data);
      navScript = `(function(){navData = ${navJson};})();`;
      fs.writeFile('./navData.js', navScript, function(err) {
          if (err) {
              return console.log(err);
          }
          console.log("navData.js saved!");
      });
  }
  
  function generateCodeTabItems(tabs) {
      var codeTabList = '';
      tabs.forEach(tab => {
          codeTabList += generateCodeTab(tab);
      });
      return codeTabList;
  }
  
  function generateCodeTab(tab) {
      return '<li class="code-tab" id="' + tab + '">' + tab + '</li>';
  }
  
  function generateDoc(navContent, bodyContent, codeTabContent) {
      var doc = 
  `<!DOCTYPE html>
  <html>
  <head>
  <meta charset="UTF-8">
  <title>${config.title}</title>
  <link rel="shortcut icon" href="favicon.ico" type="image/vnd.microsoft.icon">
  <!-- Latest compiled and minified CSS -->
  <link rel="stylesheet" href="node_modules/bootstrap/dist/css/bootstrap.min.css">
  <link rel="stylesheet" href="node_modules/font-awesome/css/font-awesome.min.css" type="text/css">
  <link rel="stylesheet" href="node_modules/highlight.js/styles/default.css" type="text/css">
  <link rel="stylesheet" href="stylesheet.css" type="text/css">
  </head>
  <body>
  <div id="sidebar-wrapper" class="side-nav side-bar-nav">${navContent}<br/><div class="copyright">${config.copyright}</div></div>
  <div id="wrapper">
  <div id="code-tabs-wrapper" class="code-tabs"><ul class="code-tab-list">${codeTabContent}</ul></div>
  <div id="page-content-wrapper" class="body-content container-fluid">${bodyContent}</div>
  </div>
  <script src="node_modules/jquery/dist/jquery.min.js"></script>
  <script src="node_modules/jquery.scrollto/jquery.scrollTo.min.js"></script>
  <script src="navData.js"></script>
  <script src="scroll.js"></script>
  <!--<script src="actions.js"></script>-->
  <script src="tabvisibility.js"></script>
  </body>
  </html>`;
      fs.writeFile('./index.html', doc, function (err) {
          if (err) {
              return console.log(err);
          }
          console.log("index.html saved!");
      });
  }