var load = function (src, done) { var loadFile = true; // if the src is empty, create a default layout in memory if (!src || src === false || src === '' || src.length === 0 || src === 'none') { loadFile = false; layout = defaultLayout; } if (loadFile) { assemble.log.debug('Layout src', src); layout = file.normalizeSlash(path.join(layoutdir, src + layoutext)); assemble.log.debug('Layout path', layout); if (!file.exists(layout)) { var err = 'Layout file (' + layout + ') not found.'; throw new Error(err); return false; } layoutName = file.basename(layout); var options = { type: 'layout', newer: true }; fileInfo.load(assemble, layout, options, function (err, layoutFile) { if (err) { return done(err); } layout = layoutFile; layout.name = layoutName; layout.content = layout.content.replace(/\{{>\s*body\s*}}/, defaultLayout); layoutStack.push(layout); if (layout && layout.metadata && (layout.metadata.layout || layout.metadata.layout === false || layout.metadata.layout === 'none')) { return load(layout.metadata.layout, done); } return done(); }); } else { var tmp = layout; layout = new assemble.models.File(); layout.name = 'layout'; layout.content = tmp; layout.metadata = {}; layoutStack.push(layout); if (layout && layout.metadata && (layout.metadata.layout || layout.metadata.layout === false || layout.metadata.layout === 'none')) { return load(layout.metadata.layout, done); } return done(); } };
fp.src.filter(function(filepath) { if (!file.exists(filepath)) { verb.log.error(' Source file "' + filepath + '" not found.'); return false; } else { return true; } }).map(function(filepath) {
module.exports = function(verb) { var options = _.extend({}, verb.options || {}); var context = verb.context; try { var url = context.repository.url; var re = /.*:\/\/github.com\/(.*)\.git/; /** * If `.travis.yml` does not exist, and * `travis: true` is defined in the options, * then add a `.travis.yml` file to the root * of the project. * * @title Travis CI badge */ if (options.travis && !file.exists(verb.cwd('.travis.yml'))) { var travis = file.match('*travis.yml', tmpl, {matchBase: true})[0]; // Save the file file.writeFileSync('.travis.yml', file.readFileSync(travis)); // Log a success message verb.log.success('Saved:', '.travis.yml'); } /** * If `.travis.yml` already exists, add * a travis URL to the context for use * in templates * * @title Travis CI badge */ if(file.exists(verb.cwd('.travis.yml'))) { verb.context.travis = url.replace(re, 'https://travis-ci.org/$1'); } } catch (e) { e.origin = __filename; console.warn(e); } };
file.readJSONSync(cache).map(function(cachedFile) { cachedFile = path.resolve(process.cwd(), cachedFile); if(file.exists(cachedFile)) { file.delete(cachedFile); } else { if(opts.verbose) { console.warn('[css helper]: no .cache file to delete.'); } } });
return function(content, context, options) { options = options || {}; context = context || {}; var opts = _.extend({}, verb.options, options); var layoutPath = [opts.layouts, opts.layout].join('/'); // Use a scaffold or template for the layout var layout = opts.layout || verb.scaffolds['html-layout']; // If a layout is user-defined, use that instead if(file.exists(layoutPath)) { layout = file.readFileSync(layoutPath); } var ctx = _.cloneDeep(verb.context, opts); context = _.extend(ctx, context, {content: content}); return verb.template(layout, context); };
_.forEach(obj.patterns, function (filepath) { if (file.exists(filepath)) { if (options.hasOwnProperty('dothash') && obj.hasOwnProperty('namespace')) { _.merge(hashCache, file.readDataSync(filepath, options)); } else if (obj.hasOwnProperty('namespace') && obj.hasOwnProperty('patterns')) { namespace[obj.namespace] = file.readDataSync(filepath, options); _.merge(meta, namespace); if (!options.retainKeys) { delete obj.namespace; } } else if (!obj.namespace && obj.hasOwnProperty('patterns')) { var srcData = file.readDataSync(filepath, options); _.merge(meta, srcData); } } else { nomatch = nomatch.concat(filepath); } });
Handlebars.registerHelper("css", function (options) { options = options || {}; options.hash = options.hash || {}; var i = 0; var result = ''; var data; // Default options options = _.extend({ sep: '\n', // CSS Options copy: true, minify: true, concat: true, clean: true, encoding: 'utf8', algorithm: 'md5', length: 8, src: '', dest: '', // Globule glob: { filter: 'isFile', nonull: true }, }, options); // Assemble options and options.data['css'] var cssOpts = _.extend(assembleOpts.css, assembleOpts.data.css); // Default options if(options.hash.dest) { options.hash.dest = path.join(assembleOpts.originalAssets, options.hash.dest); } options = _.extend(options, cssOpts, options.hash); var opts = grunt.config.process(options); opts.cwd = opts.cwd || process.cwd(); // Calulate current working directory (CWD) var cwd = path.join.bind(null, opts.cwd, ''); if(opts.hash.cwd) { cwd = path.join.bind(null, grunt.config.process(opts.hash.cwd)); } // Add some src variables to the context var ctx = _.extend(grunt.config.data, assembleOpts, this); // Source file glob patterns var patterns = utils.arrayify(opts.src); // if (!opts.minify) { // return opts.fn(this); // } else { // return opts.inverse(this); // } // Use `originalAssets` as the root directory for assets, so the `dest` // only needs to calculate relative to that path. var assetsRoot = assembleOpts.originalAssets; var cssDest = cwd(opts.dest); // Cache for storing paths to dest files after each build var cache = opts.cache || path.join(__dirname, '.cache.json'); // If opts.clean is defined, the helper will attempt to // remove the files from the previous build. As a precaution, // only files listed in the cache will be cleaned. if(opts.clean && opts.copy) { if(file.exists(cache) && file.readJSONSync(cache).length > 0) { file.readJSONSync(cache).map(function(cachedFile) { cachedFile = path.resolve(process.cwd(), cachedFile); if(file.exists(cachedFile)) { file.delete(cachedFile); } else { if(opts.verbose) { console.warn('[css helper]: no .cache file to delete.'); } } }); } } var revvedFiles = []; async.forEach(patterns, function (pattern, callback) { var files = file.expand(pattern, opts.glob); var src = files.map(function (filepath) { i += 1; // The content of the source file var content = file.readFileSync(filepath); // Default length of the returned hash is 32 var hash = utils.md5(filepath, opts.algorithm, 'hex', opts.encoding); // Shorten the hash to the length specified in the options var revision = hash.slice(0, opts.length); // The revised filename (non-minified, that comes later) var ext = path.extname(filepath); var filename = path.basename(filepath, ext) + '.' + revision + ext; // Asset paths var destFile = path.join(cssDest, filename).replace(/\\/g, '/'); // Inject private variables into block, so that variables on `data` // are only available in the block helper's child template and // not in the original context data = Handlebars.createFrame(ctx.data); // Best guess at some useful properties to add to the data context data.index = i; data.src = filepath; data.revision = revision; data.filename = filename; data.destFile = destFile; data.basename = file.basename(filename); data.ext = ext; data.content = content; // This is the full filepath data.path = relative(ctx.absolute, destFile); return { ctx: ctx, data: data }; }).sort(opts.compare || utils.compareFn, opts).map(function (obj) { var data = obj.data; // Copy revisioned source files to cssDest if(opts.copy) { // If opts.minify is defined, minify source files and rename if(opts.minify) { // minify: true, then minify but don't // pass any additional options. if(opts.minify === true) { opts.minify = {}; } data.path = data.path.replace(path.extname(data.filename), '.min' + data.ext); data.filename = data.filename.replace(path.extname(data.filename), '.min' + data.ext); var fullpath = data.destFile.replace(path.extname(data.filename), '.min' + data.ext); revvedFiles.push(relative(process.cwd(), fullpath)); var css = file.readFileSync(data.src); file.writeFileSync(fullpath, utils.minifyCSS(css, opts.minify)); } else { revvedFiles.push(cssDest); file.copyFileSync(data.src, cssDest); } } else { revvedFiles.push(cssDest); } var name = file.ext(data.src) + '-' + file.basename(data.src) + '.json'; file.writeJSONSync('tmp/' + name, data); // Content from src files var glob_fn = Handlebars.compile(data.content); data.content = glob_fn(ctx).replace(/^\s+/, ''); // Content from inside the block var content = opts.fn(obj.ctx, {data: data}); // Return content from src files return content; }).join(opts.sep); result += src; // Store the filepaths of revisioned files after each build. if(opts.copy && opts.cache !== false) { file.writeJSONSync(cache, revvedFiles); } callback(); }); return new Handlebars.SafeString(result); });
files.forEach(function (f) { list[f.filename] = file.exists(base, f.filename); });