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 '