| @ -0,0 +1,167 @@ | |||
| const pandoc = require('node-pandoc'); | |||
| const utils = require('../utils/utils.js'); | |||
| const sql = require('../utils/sql'); | |||
| const argsFull = '-S --base-header-level=1 --toc --toc-depth=3 -N --normalize -s --mathjax -t html5'; | |||
| const argsPreview = '-S --normalize -s --mathjax -t html5'; | |||
| module.exports= | |||
| { | |||
| /** | |||
| * Renders the entire blog post based on the sql data pulled | |||
| * from the database. | |||
| * | |||
| * @param post sql data which has title, date, and header img location | |||
| * @param blocks number of blocks to display for a preview or -1 for | |||
| * all the blocks | |||
| * @returns {Promise} async call which renders the entire blog post. | |||
| */ | |||
| generateBlogPost: function(post, blocks) | |||
| { | |||
| return new Promise(function(resolve, reject) | |||
| { | |||
| Promise.all([module.exports.generateBlogPostHeader(post), | |||
| module.exports.generateBlogPostBody(post, blocks), | |||
| module.exports.generateBlogPostFooter()]).then(function(content) | |||
| { | |||
| resolve(content.join('')); | |||
| }).catch(function(error) | |||
| { | |||
| reject(error); | |||
| }) | |||
| }); | |||
| }, | |||
| /** | |||
| * Renders the header of the blog post which contains the header image, and date | |||
| * published. | |||
| * | |||
| * @param post sql data | |||
| * @returns {string} | |||
| */ | |||
| generateBlogPostHeader: function(post) | |||
| { | |||
| var htmlHead = "<div class=\"blogPost\">"; | |||
| //image | |||
| if(!(post.picture_url === "n/a")) | |||
| { | |||
| htmlHead +="<img src=\"/blogContent/headerImages/" + post.picture_url + | |||
| "\" alt=\"\" style=\"width:100%; height:10%\">"; | |||
| } | |||
| htmlHead += "<div class=\"p-4\"><div class=\"\">"; | |||
| //title | |||
| htmlHead += "<h3><b>" + post.name + "</b></h3>"; | |||
| //date | |||
| htmlHead += "<h5><span class=\"w3-opacity\">" + | |||
| post.published.toDateString() + "</span></h5>"; | |||
| htmlHead +="</div>" + "<div class=\"\">"; | |||
| return htmlHead; | |||
| }, | |||
| /** | |||
| * Method which renders the body of the blog post. This is responsible for getting | |||
| * the contents of the markdown/latex file and rendering it into beautiful html. | |||
| * | |||
| * @param post | |||
| * @param blocks | |||
| * @returns {Promise} | |||
| */ | |||
| generateBlogPostBody: function(post, blocks) | |||
| { | |||
| return new Promise(function(resolve, reject) | |||
| { | |||
| sql.getCategory(post.category_id).then(function(category) | |||
| { | |||
| const pathName = "blogContent/posts/" + category[0].url + "/" | |||
| + post.url + ".md"; | |||
| var markDown = utils.getFileContents(pathName).toString(); | |||
| markDown = markDown.split("(media/").join("(" + "../blogContent/posts/" | |||
| + category[0].url + "/media/"); | |||
| module.exports.convertToHTML(markDown, blocks).then(function(result) | |||
| { | |||
| result = result.split("<figcaption>").join("<figcaption style=\"visibility: hidden;\">"); | |||
| if(blocks == -1) | |||
| resolve(result); | |||
| const htmlBlocks = result.split("<p>"); | |||
| var html = ""; | |||
| for(var i = 0; i < blocks; i++) | |||
| { | |||
| html += "<p>" + htmlBlocks[i]; | |||
| } | |||
| html += " <div class=\"\">\n" + | |||
| " <p class='text-center'><button class=\"btn btn-secondary btn-lg " + | |||
| "w3-padding-large w3-white w3-border\" onclick=\"location.href='" + | |||
| "http://jrtechs.net/" + category[0].url + "/" + post.url + | |||
| "'\"><b>READ MORE »</b></button></p>\n" + | |||
| " </div>\n"; | |||
| resolve(html); | |||
| }).catch(function(error) | |||
| { | |||
| reject(error); | |||
| }) | |||
| }); | |||
| }) | |||
| }, | |||
| /** Method to return the footer of the html blog post. | |||
| * | |||
| * @returns {string} | |||
| */ | |||
| generateBlogPostFooter: function() | |||
| { | |||
| return "</div></div></div><br><br>"; | |||
| }, | |||
| /** | |||
| * Converts markdown into html. | |||
| * | |||
| * @param markdownContents | |||
| * @param type | |||
| * @returns {Promise} | |||
| */ | |||
| convertToHTML: function(markdownContents, type) | |||
| { | |||
| return new Promise(function(resolve, reject) | |||
| { | |||
| // Set your callback function | |||
| callback = function (err, html) | |||
| { | |||
| if (err) | |||
| { | |||
| reject(err); | |||
| } | |||
| html = html.split("<img").join("<img style=\"max-width: 100%;\" "); | |||
| html = html.split("<code>").join("<code class='hljs cpp'>"); | |||
| resolve(html); | |||
| }; | |||
| if(type == -1) | |||
| { | |||
| pandoc(markdownContents, argsFull, callback); | |||
| } | |||
| else | |||
| { | |||
| pandoc(markdownContents, argsPreview, callback); | |||
| } | |||
| }); | |||
| }, | |||
| } | |||