| @ -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); | |||||
| } | |||||
| }); | |||||
| }, | |||||
| } | |||||