import * as DataEvent from '../../src/com/events/DataEvent'; import StringUtils from '../../src/com/utils/StringUtils'; import fs from 'fs-extra'; import sanitize from 'sanitize-html'; const config = require('../../site/settings.json'); const tags_list = require('../../site/tags.json'); const pug = require('pug'); const md = require('markdown-it')('commonmark'); const _ = require('lodash'); const moment = require('moment'); export default class Render { //-------------------------- // constructor //-------------------------- constructor() {} //-------------------------- // methods //-------------------------- start() {} /** * Renders all pages from markdown to html * @parameter pages: payload for site pages * @parameter theme: current theme being used as defined in settings */ publishAll(pages, theme) { return new Promise((resolve, reject) => { let response = []; let count = _.filter(pages, page => { return page.metadata.deleted === false; }).length; let rendered = 0; for (let index = 0; index < pages.length; index++) { const page = pages[index]; if (page.metadata.deleted === false) { let writeFile, template; let path = 'public/' + moment(page.metadata.created).format('YYYY') + '/' + moment(page.metadata.created).format('MM') + '/'; if (page.metadata.layout === 'index') { template = 'content/themes/' + theme + '/index.pug'; writeFile = 'public/index.html'; } else { writeFile = path + page.metadata.slug + '.html'; template = 'content/themes/' + theme + '/page.pug'; } let buffed = sanitize(page.content, { allowedTags: ['del', 'a', 'iframe', 'img'], allowedAttributes: { a: ['href', 'name', 'target'], img: ['src'], iframe: [ 'height', 'width', 'src', 'frameborder', 'allow', 'allowfullscreen' ] } }); buffed = new StringUtils().decodeHTML(buffed); let html = md.render(buffed, { html: true, xhtmlOut: true }); let file = pug.renderFile(template, { title: page.metadata.title, default_bg: page.metadata.feature, content: html, tags: page.metadata.tags, menu: config.menu }); fs.ensureDir(path).then(() => { fs.writeFile(writeFile, file, err => { // throws an error, you could also catch it here if (err) { response = { type: DataEvent.PAGES_NOT_RENDERED, message: err }; reject(response); } // success case, the file was saved }); }); rendered = ++rendered; if (rendered === count) { response = { type: DataEvent.PAGES_RENDERED, message: 'All Pages Rendered. Sweet.' }; resolve(response); } } else { //don't render delete pages } } }); } publishTags(pages) { return new Promise((resolve, reject) => { let tags = tags_list.tags; let renderList = []; for (let index = 0; index < tags.length; index++) { let tag = tags[index]; //console.log('**TAG**', tag.tag_name); var pageList = []; for (let i = 0; i < pages.length; i++) { let page = pages[i]; if (_.includes(page.metadata.tags, tag.tag_name)) { pageList.push({ title: page.metadata.title, slug: page.metadata.slug }); } } renderList.push({ tag: tag.tag_name, tag_list: pageList, slug: tag.slug }); } let response = []; for (let index = 0; index < renderList.length; index++) { let item = renderList[index]; let file = pug.renderFile('content/themes/' + config.global.theme + '/tags.pug', { title: item.tag, default_bg: config.global.background, content_tags: 'THESE ARE TAGS', tag_list: item.tag_list }); fs.writeFile('public/tags/' + item.slug + '.html', file, err => { // throws an error, you could also catch it here if (err) { response = { type: DataEvent.TAG_PAGES_NOT_RENDERED, message: err }; reject(response); } // success case, the file was saved response = { type: DataEvent.TAG_PAGES_RENDERED, message: 'Tag Pages ready to go. Good job.' }; resolve(response); }); } }); } //-------------------------- // event handlers //-------------------------- }