UNPKG

csycms-core-test

Version:
216 lines (179 loc) 8.79 kB
'use strict' const fse = require('fs-extra') , path = require('path') , _ = require('underscore') , contentProcessors = require('../functions/contentProcessors') // , configurator = require('../functions/config') , yargs = require("yargs") , appRoot = require('app-root-path') , base_url = appRoot.path , argv = yargs.argv , site = argv.SITE || process.env.SITE class Csystem { constructor() { } listFiles (dir) { let self = this return fse.readdirSync(dir).reduce(function (list, file) { var name = path.join(dir, file); var isDir = fse.statSync(name).isDirectory(); return list.concat(isDir ? self.listFiles(name) : [name]); }, []); } build_nested_pages(originalPageList, refPageList, content_dir) { let nestedPages = []; let pageParts = [] , metas = [] , self = this for(let i in originalPageList) { let filePath = path.join(content_dir, originalPageList[i]) filePath = filePath.replace('00.chapter.md', 'chapter.md') const file = fse.readFileSync(filePath); const meta = contentProcessors.processMeta(file.toString('utf-8')); metas[i] = meta } let {pageListWithTitle} = originalPageList.reduce((accumulator, currentValue, currentIndex, originalPageListArray) => { accumulator.pageListWithTitle.push({path:currentValue , index: currentIndex, slug: refPageList[currentIndex], title: metas[currentIndex].title}) return accumulator }, {pageListWithTitle:[] }) nestedPages = self.build_nested_pages_inner(pageListWithTitle, 0).slice(1) return nestedPages } build_nested_pages_inner(pageListWithTitle, level, debug) { let self = this , chapters = [] , prevChapterNum = 0 , prevDir = '' , getIndex = (list, Indexinner) => { for(let i in list) { if(list[i].index === Indexinner)return i } return NaN } if(debug) { console.log(pageListWithTitle) } for(let i in pageListWithTitle) { let filePath = pageListWithTitle[i].path let parts = filePath.split('.') let chapterNum = parseInt(parts[0].replace('/', '')) let thisDir = filePath.split('/')[1] if(filePath === '/docs.md')continue; if(!isNaN(chapterNum)){ if(debug) { console.log(parts) } } else { if(thisDir !== prevDir) chapterNum = prevChapterNum + 1 } prevChapterNum = chapterNum prevDir = filePath.split('/')[1] if(!chapters[chapterNum]) { parts = filePath.split('/') let folderPart = '/' + parts[1]; let {numFiles, files_in_dir} = pageListWithTitle.reduce((accumulator, currentValue, currentIndex, originalPageListArray) => { let testLen = currentValue.path.split('/').length let testLenResult = testLen===3 || testLen===4?true:false; let threeparts = currentValue.path.split('/') threeparts = [threeparts[0],threeparts[1],threeparts[2]].join('/') if(debug)console.log(`${accumulator.needle}=>${currentValue.path}`) if(currentValue.path.indexOf(accumulator.needle) === 0 && currentValue.path !== '/docs.md') { accumulator.numFiles++ accumulator.files_in_dir.push({name:currentValue.path , index: currentValue.index}) } return accumulator }, {needle:folderPart, numFiles:0, files_in_dir:[], numDirs:0 }) chapters[chapterNum] = { slug: pageListWithTitle[i].slug, title: pageListWithTitle[i].title, chapterNum:chapterNum, show_on_home: true, is_directory: numFiles > 1?true:false, } if(level === 0) numFiles--; if (numFiles > 0) { chapters[chapterNum].files = [] let pageListWithTitleInner = [] for(let j in files_in_dir) { let item = files_in_dir[j] let itemNameParts = item.name.split('/') let indexInner = item.index let pathinner = itemNameParts.slice(2) pathinner = '/' + pathinner.join('/') let itemInner = { path: pathinner, index: item.index, slug: pageListWithTitle[getIndex(pageListWithTitle, indexInner)].slug, title: pageListWithTitle[getIndex(pageListWithTitle, indexInner)].title } if(pathinner !== '/') pageListWithTitleInner.push(itemInner) } // chapters[chapterNum].files = self.build_nested_pages_inner(pageListWithTitleInner, level+1, '/01.environment/docs.md' === filePath?true:false).slice(1) chapters[chapterNum].files = self.build_nested_pages_inner(pageListWithTitleInner, level+1, false).slice(1) } else chapters[chapterNum].is_index = true } else { ; } } return chapters } loadPagesList(content_dir, config) { let self = this let files = self.listFiles(content_dir); files = _.filter(files, function (file) { // remove also public folder from csycms docs // remove also readme.md (relevant only for github) let lowerFile = file.toLowerCase() return file.substr(-3) === '.md' && ! file.includes('/csycmsdocs/public') && ! lowerFile.includes('readme.md'); }); let filesPath = files.map(function (file) { return file.replace(content_dir, ''); }); let urls = filesPath.map(function (file) { file = file.replace('.md', '').replace('\\', '/'); if(file.substr(-5) === '/docs') file = file.substr(0, file.length - 5) + '/00.docs' if(file.substr(-8) === '/chapter') file = file.substr(0, file.length - 8) + '/00.chapter' return file }); urls.sort(); let originalUrls = urls.map(function (file) { file = file.replace('.md', '').replace('\\', '/'); return file + '.md' }); urls = urls.map(function (file) { file = file.replace('/00.docs', '').replace('/00.chapter', '') return file }); originalUrls = originalUrls.map(function (file) { file = file.replace('/00.docs.md', '/docs.md') return file }); for(let i in urls)urls[i] = urls[i].replace(/\/[0-9]+\./g, '/').replace(/^[0-9]+\./g, '') let nestedPages = self.build_nested_pages(originalUrls, urls, content_dir) let siteSpace = config.site_space let dir = 'config/sites-enabled' let otherSites = fse.readdirSync(dir).reduce(function (list, file) { // work this later... var name = path.join(dir, file); var isDir = fse.statSync(name).isDirectory(); return list.concat(isDir ? self.listFiles(name) : [name]); // work on this... }, []).reduce((accumulator, currentValue, currentIndex, originalPageListArray) => { let config_file = path.join(base_url, currentValue) config_file = currentValue.split('.') config_file.pop(); config_file = config_file.join('.') config_file = config_file.split('/').pop() let iConfig = require('../functions/config')(config_file) // let iConfig = require(config_file)(rootPath) , content_dir = path.join(iConfig.content_dir, iConfig.site) siteSpace === iConfig.site_space? accumulator.push({domain: iConfig.base_url, content_dir, config_file }):false; return accumulator }, [] ) return {original:originalUrls, modified:urls, nestedPages, otherSites} } } module.exports = new Csystem