211 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			211 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
| 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!");
 | |
|     });
 | |
| } |