UNPKG

oboe.js-demo

Version:
128 lines (93 loc) 3.61 kB
"use strict"; var supermarked = require('supermarked'), fs = require('fs'), cheerio = require('cheerio'), Handlebars = require('handlebars'), barrier = require('./barrier.js'), figureTemplate = Handlebars.compile( '<figure id="demo-{{name}}" data-demo="{{name}}" {{#if autoplay}}data-autoplay{{/if}}></figure>' ), MARKDOWN_OPTS = {ignoreMath:true, smartypants:true, gfm:true, tables:true}, MD_PREFIX = '{{#if pdfLink}}This page is also [available as a PDF]({{pdfLink}}).{{/if}}\n', MD_POSTFIX = fs.readFileSync('content/postfix.md'); Handlebars.registerHelper("demo", function(name, mode) { var autoplay = (mode == "autoplay"); return new Handlebars.SafeString( figureTemplate({name:name, autoplay:autoplay}) ); }); function postProcessMarkup($) { $('pre').each(function(i, ele){ var code = $(ele); if( /deprecated/i.exec( code.text()) ) { var details = $('<details>'); code.replaceWith(details); details .append('<summary>Deprecated API</summary>') .append(code); } }); return $; } function outline($){ var mainHeadingEle = $('h1').first(), mainHeading = { text: mainHeadingEle.text(), id: mainHeadingEle.attr('id') }, sectionHeadings = []; $('h2').each(function(i, element){ var jEle = $(element), text = jEle.text(); sectionHeadings.push({ text: text, id: jEle.attr('id') }); }); mainHeadingEle.remove(); return { content: $.html(), heading: mainHeading, sections: sectionHeadings, multipleSections: sectionHeadings.length > 1 } } function readContent(requestedPage, opts, callback) { console.log('request for page:', requestedPage.blue); function pdfFile(pageName) { return 'pdf/' + pageName + '.pdf'; } function pdfUrl(pageName) { return '/' + pageName + '.pdf'; } function markdownFile(pageName) { return 'content/' + pageName + '.md'; } fs.exists(markdownFile(requestedPage), function(requestedMarkdownExists){ var actualPage = requestedMarkdownExists? requestedPage : '404', markdownToRead = markdownFile(actualPage), markdownContent, bar = barrier(function(){ var surroundedMarkdown = MD_PREFIX + markdownContent + MD_POSTFIX, filledInMarkdown = Handlebars.compile(surroundedMarkdown)(opts), html = supermarked(filledInMarkdown, MARKDOWN_OPTS), $ = postProcessMarkup(cheerio.load(html)), response = outline($); response.status = requestedMarkdownExists? 200 : 404; if( !requestedMarkdownExists ) { console.log('no such markdown file:'.red, markdownFile(requestedPage)); } callback( response ); }); opts.page = actualPage; opts.isDownloadPage = (actualPage == 'download'); fs.exists(pdfFile(requestedPage), bar.add(function(exists){ if( exists ) { opts.pdfLink = pdfUrl(requestedPage); } })); // fileToRead should point to legit page by now (possibly 404) fs.readFile(markdownToRead, bar.add(function(err, markdownBuffer){ markdownContent = markdownBuffer.toString(); })); }); } module.exports = readContent;