/** * All writing related code here. This is so that we can separate the async code from sync code * for testability */ require.paths.push(__dirname); var qfs = require('q-fs'); var Q = require('qq'); var OUTPUT_DIR = "build/docs/"; var fs = require('fs'); exports.output = function(file, content){ console.log('writing ', file); var fullPath = OUTPUT_DIR + file; var dir = parent(fullPath); return Q.when(exports.makeDir(dir), function(error) { qfs.write(fullPath,exports.toString(content)); }); } //recursively create directory exports.makeDir = function (path) { var parts = path.split(/\//); var path = "."; //Sequentially create directories var done = Q.defer(); (function createPart() { if(!parts.length) { done.resolve(); } else { path += "/" + parts.shift(); qfs.isDirectory(path).then(function(isDir) { if(!isDir) { qfs.makeDirectory(path); } createPart(); }); } })(); return done.promise; }; exports.copyTpl = function(filename) { return exports.copy('docs/src/templates/' + filename, OUTPUT_DIR + filename); }; /* Copy files from one place to another. * @param from{string} path of the source file to be copied * @param to{string} path of where the copied file should be stored * @param transform{function=} transfromation function to be applied before return */ exports.copy = function(from, to, transform) { var args = Array.prototype.slice.call(arguments, 3); // We have to use binary reading, Since some characters are unicode. return qfs.read(from, 'b').then(function(content) { if (transform) { args.unshift(content.toString()); content = transform.apply(null, args); } qfs.write(to, content); }); } /* Replace placeholders in content accordingly * @param content{string} content to be modified * @param replacements{obj} key and value pairs in which key will be replaced with value in content */ exports.replace = function(content, replacements) { for(key in replacements) { content = content.replace(key, replacements[key]); } return content; } exports.copyDir = function copyDir(dir) { return qfs.listDirectoryTree('docs/' + dir).then(function(dirs) { var done; dirs.forEach(function(dirToMake) { done = Q.when(done, function() { return exports.makeDir("./build/" + dirToMake); }); }); return done; }).then(function() { return qfs.listTree('docs/' + dir); }).then(function(files) { files.forEach( function(file) { exports.copy(file,'./build/' + file); }); }); }; exports.merge = function(srcs, to) { return merge(srcs.map(function(src) { return 'docs/src/templates/' + src; }), OUTPUT_DIR + to); }; function merge(srcs, to) { var contents = []; //Sequentially read file var done; srcs.forEach(function (src) { done = Q.when(done, function(content) { if(content) contents.push(content); return qfs.read(src, 'b'); }); }); // write to file return Q.when(done, function(content) { contents.push(content); qfs.write(to, contents.join('\n')); }); } //----------------------- Synchronous Methods ---------------------------------- function parent(file) { var parts = file.split('/'); parts.pop(); return parts.join('/'); } exports.toString = function toString(obj) { switch (typeof obj) { case 'string': return obj; case 'object': if (obj instanceof Array) { obj.forEach(function (value, key) { obj[key] = toString(value); }); return obj.join(''); } else { return JSON.stringify(obj); } } return obj; }; function noop(){}; 3'>13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141