|
| 1 | +"use strict"; |
| 2 | + |
| 3 | +var fs = require('fs'); |
| 4 | +var path = require('path'); |
| 5 | +var async = require('async'); |
| 6 | +var pkg = require('../package.json'); |
| 7 | +var waitForIt = require('../lib/waitForIt'); |
| 8 | +var getFiles = require('../lib/getFiles'); |
| 9 | +var loadJSON = require('../lib/loadJSON'); |
| 10 | +var associate = require('../lib/associate'); |
| 11 | +var debounce = require('../lib/debounce'); |
| 12 | + |
| 13 | + |
| 14 | +function filterToc(file, cb){ |
| 15 | + cb(!fs.statSync(file).isDirectory() && file.indexOf('toc-demos.json') == -1 && path.extname(file).slice(1) == 'json'); |
| 16 | +} |
| 17 | + |
| 18 | +function loadFiles(dir, callback){ |
| 19 | + |
| 20 | + var addPath = function(files, cb){ |
| 21 | + async.map(files, function(fileName, cbMap){ |
| 22 | + cbMap(null, path.join(dir, fileName)); |
| 23 | + }, cb); |
| 24 | + } |
| 25 | + var filterFiles = function(files, cb){ |
| 26 | + async.filter(files, filterToc, function(filtered){ |
| 27 | + cb(null, filtered); |
| 28 | + }); |
| 29 | + } |
| 30 | + var addContent = function(arr, cb){ |
| 31 | + async.map(arr, loadJSON, cb); |
| 32 | + } |
| 33 | + var loadToc = function(filesContent, cb){ |
| 34 | + loadJSON(dir + '/toc-demos.json', function(err, data){ |
| 35 | + cb(err, !err && { |
| 36 | + content: associate(Object.keys(data), filesContent), |
| 37 | + toc: data |
| 38 | + }); |
| 39 | + }); |
| 40 | + } |
| 41 | + var compiler = async.compose(loadToc, addContent, filterFiles, addPath, fs.readdir); |
| 42 | + compiler(dir, callback); |
| 43 | +} |
| 44 | + |
| 45 | +module.exports = function(project, options){ |
| 46 | + |
| 47 | + if (!project){ |
| 48 | + throw new Error("'project' argument is required"); |
| 49 | + } |
| 50 | + |
| 51 | + if (!options) options = {}; |
| 52 | + if (!options.title) options.title = project; |
| 53 | + |
| 54 | + var dir = path.join(__dirname, '..', pkg._buildOutput, project, 'docs'); |
| 55 | + var files = async.apply(loadFiles, dir); |
| 56 | + var loadDemos = waitForIt(files); |
| 57 | + |
| 58 | + fs.watch(dir, debounce(function(){ |
| 59 | + console.log('resetting ' + dir + ' docs data'); |
| 60 | + loadDemos.reset(); |
| 61 | + })); |
| 62 | + |
| 63 | + function send404(next){ |
| 64 | + var err404 = new Error(); |
| 65 | + err404.status = 404; |
| 66 | + next(err404); |
| 67 | + } |
| 68 | + |
| 69 | + return function(req, res, next){ |
| 70 | + |
| 71 | + loadDemos.get(function(err, results){ |
| 72 | + |
| 73 | + if (err) return next(err); |
| 74 | + var demo = req.query.demo || Object.keys(results.content)[0]; |
| 75 | + var toc = results.toc[demo]; |
| 76 | + var data = results.content[demo]; |
| 77 | + if (!data) return send404(next); |
| 78 | + |
| 79 | + res.render(project, { |
| 80 | + title: options.title, |
| 81 | + navigation: 'demos', |
| 82 | + content: data, |
| 83 | + description: data.details, |
| 84 | + demoName: toc.description.name, |
| 85 | + dependencies: toc.description.dependencies || 'dependencies/more/', |
| 86 | + version: pkg._projects.core.versions[0], |
| 87 | + toc: results.toc |
| 88 | + }); |
| 89 | + }); |
| 90 | + }; |
| 91 | +}; |
0 commit comments