var loadResources = function loadResources() { var currentRenameKey = assemble.option('renameKey'); //set rename key to longer format, fp without extension assemble.option('renameKey', function(fp) { return generateKey(fp); }); var resourceFiles = config.resources.files[0]; assemble.resources(normalizeSrc(resourceFiles.cwd, resourceFiles.src)); assemble.option('renameKey', currentRenameKey); };
return function() { var currentRenameKey = assemble.option('renameKey'); assemble.option('renameKey', renameKey); if(Array.isArray(typeFn)) { typeFn.forEach(function(fn) { fn(); }); } else { typeFn(); } assemble.option('renameKey', currentRenameKey); if (cb) { cb(); } };
gulp.task('assemble', function () { // Setup items on the assemble object assemble.data(['doc/src/data/*.{json,yml}']); assemble.layouts(['doc/src/layouts/**/*.hbs']); assemble.partials(['doc/src/partials/**/*.hbs']); assemble.option({ layout: 'default' }); gulp.src(paths.sources.pages) .pipe(gulpAssemble(assemble)) .pipe(extname()) .pipe(gulp.dest(paths.build.www)); });
module.exports = function () { //assemble.enable('debugEngine'); assemble.option('layout', 'default'); assemble.layouts('templates/layouts/*.hbs'); assemble.partials('templates/partials/*.hbs'); assemble.data('./templates/**/*.json'); assemble.src('templates/pages/*.hbs') .pipe(extname()) .pipe(assemble.dest('')) .on('error', gutil.log); }
var plugin = module.exports = function (options) { var opts = _.extend({}, options); assemble.option(opts); if (opts.data) assemble.namespace(':basename', opts.data); if (opts.layouts) assemble.layouts(opts.layouts); if (opts.partials) assemble.partials(opts.partials); if (opts.pages) assemble.pages(opts.pages); if (opts.helpers) assemble.helpers(opts.helpers); return es.pipeline.apply(es, [ stack.src.call(assemble, null, opts), stack.dest.call(assemble, '', opts) ]); }
var stream = gulp.src(paths.docsasset + '/*.hbs') .pipe($.template(data)) .pipe(gulp.dest(paths.templates + '/pages/')); return stream; }); // =================================================== // Template Compiling // =================================================== assemble.layouts(paths.templates + '/layouts/*.hbs'); assemble.partials(paths.templates + '/includes/**/*.hbs'); assemble.pages(paths.templates + '/content/*.hbs'); assemble.option('layout', 'default'); gulp.task('assemble', ['docs', 'copy'], function() { var stream = assemble.src(paths.templates + '/pages/*.hbs') .pipe(ext()) .pipe(assemble.dest(paths.site)); return stream; }); // =================================================== // Production Prep // =================================================== gulp.task('usemin', ['assemble', 'cssmin'], function() {
grunt.registerTask('assemble', 'Assemble', function () { var done = this.async(); var assemble = require('assemble'); //var mergePageData = require('./middleware/merge-page-data'); var mergeLayoutContext = require('./middleware/merge-layout-context'); var push = require('assemble-push')(assemble); var Handlebars = require('handlebars'); var config = grunt.config.get('_assemble'); // old assemble config var options = config.options; // global options helpers.register(Handlebars, options); var renameKey = assemble.option('renameKey'); var renameKeys = require('./utils/rename-keys')(renameKey); assemble.data(options.data); assemble.set('data.assets', options.assets); assemble.set('data.environment', options.environment); assemble.layouts([options.layout]); assemble.partials(options.partials); assemble.helpers(options.helpers); function normalizeSrc (cwd, sources) { sources = Array.isArray(sources) ? sources : [sources]; return sources.map(function (src) { if (src[0] === '!') { return path.join('!' + cwd, src.substring(1)); } return path.join(cwd, src); }); } //assemble.onLoad(/\.hbs/, mergePageData(assemble)); assemble.preRender(/\.hbs/, mergeLayoutContext(assemble)); assemble.option('renameKey', renameKeys.noExtPath); assemble.task('pages', function () { var start = process.hrtime(); var files = config.pages.files[0]; return assemble.src(normalizeSrc(files.cwd, files.src)) .pipe(ext()) .pipe(assemble.dest(files.dest)) //.on('data', function (file) { //console.log(file.path, 'rendered'); //}) .on('end', function () { var end = process.hrtime(start); console.log('finished rendering pages', end); }); }); assemble.run(['pages'], function (err) { if (err) { return done(err); } process.env.lastRunTime = new Date(); done(); }); });
grunt.registerTask('assemble', 'Assemble', function (target, target2) { var done = this.async(); var assemble = require('assemble'); var localizeLinkPath = require('./middleware/localize-link-path'); var extractLayoutContext = require('./plugins/extract-layout-context'); var mergeLayoutContext = require('./plugins/merge-layout-context'); var collectionMiddleware = require('./middleware/onload-collection')(assemble); var mergeTranslatedData = require('./middleware/merge-translated-data'); var resourceListType = require('./plugins/store-resource-list-types'); var sendToSmartling = require('./plugins/smartling'); var addSeoTitle = require('./plugins/seo-title'); var typeLoader = require('./loaders/type-loader'); var push = require('assemble-push')(assemble); var buildInitialized = false; var assembleTasks = [ 'om-pages', 'prep-smartling', 'partners', 'pages' ]; var normalizeSrc = function normalizeSrc (cwd, sources) { sources = Array.isArray(sources) ? sources : [sources]; return sources.map(function (src) { if (src[0] === '!') { return path.join('!' + cwd, src.substring(1)); } return path.join(cwd, src); }); }; var config = grunt.config.get('_assemble'); // old assemble config var options = config.options; // global options var omLayouts = path.join(config.om.options.layoutdir, '**/*.hbs'); var omFiles = config.om.files[0]; var omSrc = normalizeSrc(omFiles.cwd, omFiles.src).filter(function(src) { if(src.indexOf('!') === -1) { return true; } })[0]; var renderTypeHelper = require('./helpers/render-type-helper')(assemble, options.websiteRoot); var generateKey = require('./utils/generate-key'); var renameKey = assemble.option('renameKey'); var layoutPath = options.layoutDir.substring(0, options.layoutDir.indexOf('*') - 1); var ppcKey = options.ppcKey; if(target) { assemble.set('env', target); } else { assemble.set('env', options.environment); } var globalKeyCache = []; //set the global data from external YML & env config //special key for YML data for translation dictionary retrieval var loadGlobalData = function loadGlobalData() { assemble.data(options.data, { namespace: function(fp) { var filenameKey = path.basename(fp, path.extname(fp)); if(/global\_/.test(fp)) { if(globalKeyCache.indexOf(filenameKey) === -1) { globalKeyCache.push(filenameKey); } return generateKey(fp); } return filenameKey; } }); var data = assemble.get('data'); for(var key in data) { if(globalKeyCache.indexOf(key) !== -1) { //remove mutations to global data delete data[key]; } } //add the additonal data options with the standard key var addOptions = _.omit(options, 'data'); assemble.data(addOptions); }; assemble.asyncHelper('partial', renderTypeHelper('partials')); var loader = function loader(typeFn, cb) { return function() { var currentRenameKey = assemble.option('renameKey'); assemble.option('renameKey', renameKey); if(Array.isArray(typeFn)) { typeFn.forEach(function(fn) { fn(); }); } else { typeFn(); } assemble.option('renameKey', currentRenameKey); if (cb) { cb(); } }; }; function loadLayouts () { assemble.layouts([options.layoutDir]); } function loadPartials () { assemble.partials(options.partials, [typeLoader(assemble)]); } function loadOmLayouts () { //append special path for ppc layouts in order to prevent naming conflicts between layouts assemble.layouts([omLayouts], [function (layouts, options) { return Object.keys(layouts).reduce(function (o, key) { var layout = layouts[key]; var concatKey = ppcKey + '-'; if(layout.data && layout.data.layout) { layout.data.layout = concatKey + layout.data.layout; } o[concatKey + key] = layout; return o; }, {}); }]); } assemble.helpers(options.helpers); //load the custom subolders customSubfolders(assemble, Object.keys(options.locales), assemble.get('lastRunTime')); // create custom template type `modals` assemble.create('modal', 'modals', { isPartial: true, isRenderable: true }); assemble.asyncHelper('modal', renderTypeHelper('modals')); // create custom template type `resources` assemble.create('resource', 'resources', { isPartial: true, isRenderable: false, }); var loadModals = function loadModals() { var modalFiles = config.modals.files[0]; assemble.modals(normalizeSrc(modalFiles.cwd, modalFiles.src), [typeLoader(assemble)]); }; var loadResources = function loadResources() { var currentRenameKey = assemble.option('renameKey'); //set rename key to longer format, fp without extension assemble.option('renameKey', function(fp) { return generateKey(fp); }); var resourceFiles = config.resources.files[0]; assemble.resources(normalizeSrc(resourceFiles.cwd, resourceFiles.src)); assemble.option('renameKey', currentRenameKey); }; var loadPageYml = function loadPageYml() { assemble.transform('page-translations', require('./transforms/load-translations'), ['**/*.{yml,yaml}', '!**/global_*.{yml,yaml}'], options.websiteRoot); }; var loadSubfolderYml = function loadSubfolderYml() { Object.keys(options.locales).forEach(assemble.transform.bind(assemble, 'subfolder-translations', require('./transforms/load-translations'), ['**/*.{yml,yaml}', '!**/global_*.{yml,yaml}'])); }; var loadAll = function loadAll(watchRunning) { //load the files for the resources collection if(watchRunning) { loadGlobalData(); loadResources(); } loader([ loadLayouts, loadPartials, loadOmLayouts, loadModals ])(); //load external YML files and scope locally, while omitting global YML loadPageYml(); loadSubfolderYml(); }; loadGlobalData(); // custom middleware for `resources` to add front-matter (`data`) // to the assemble cache. (`assemble.get('resources').foo`) assemble.onLoad(/resources-list/, collectionMiddleware('resources')); loadResources(); assemble.onLoad(/partners\/solutions/, collectionMiddleware('solutions')); assemble.onLoad(/partners\/technology/, collectionMiddleware('integrations')); //expose the partners pages takes on the root index partner page //for use in dropdown menu assemble.preRender(/partners\/solutions\/index/, function(file, next) { var col = assemble.get('solutions'); var tags = Object.keys(col).reduce(function(map, key) { var o = col[key]; if(_.isArray(o.tags)) { map.push.apply(map, o.tags); } return map; }, []); file.data.tags = _.uniq(tags).filter(function(tag) { return !!tag; }); next(); }); //change the layout name reference to that created in the ppc layout loader var ppcRe = new RegExp(path.join(options.websiteRoot, ppcKey)); assemble.onLoad(ppcRe, function(file, next) { file.data.isPpc = true; file.data.layout = ppcKey + '-' + file.data.layout; next(); }); //merge layout YFM on file context, attach external YML data and translate //order is important here because we want to merge layouts before translating //assemble.preRender(/.*\.(hbs|html)$/, mergeLayoutContext(assemble)); assemble.preRender(/.*\.(hbs|html)$/, mergeTranslatedData(assemble)); //assemble.preRender(/\/resources\-list\//, function(file, next) { //next(); //}); //localize link path after locale is appended in the translate data middleware var pathRe = /^(([\\\/]?|[\s\S]+?)(([^\\\/]+?)(?:(?:(\.(?:\.{1,2}|([^.\\\/]*))?|)(?:[\\\/]*))$))|$)/; assemble.preRender(pathRe, localizeLinkPath(assemble)); //set rename key to longer format, fp without extension assemble.option('renameKey', function(fp) { return path.join(path.dirname(fp), path.basename(fp, path.extname(fp))); }); var localesPaths = Object.keys(options.locales).reduce(function(map, locale) { map.push(path.join(options.subfoldersRoot, locale)); return map; }, []); var allRoots = localesPaths.concat([ options.websiteRoot, options.websiteGuts ]); var hbsPaths = allRoots.reduce(function(map, root) { var pattern = '**/*.hbs'; map.push(path.join(root, pattern)); return map; }, []) .concat([ '!' + options.client, '!' + omSrc, '!' + omLayouts ]); function logData(fp, type) { var key = generateKey(fp); var o = { 'om-pages': 'magenta', pages: 'blue', partners: 'red' }; console.log(chalk[ o[type] ].bold('rendered ' + type) + ' => ' + chalk.green(key)); } assemble.task('prep-smartling', function () { var start = process.hrtime(); return assemble.src(hbsPaths, { since: (assemble.get('lastRunTime')?new Date(assemble.get('lastRunTime')):null)}) .pipe(extractLayoutContext(assemble)) .pipe(addSeoTitle()) .pipe(sendToSmartling(assemble)) .pipe(resourceListType(assemble)) .on('error', function (err) { console.log('plugin error', err); }) .on('end', function () { var end = process.hrtime(start); console.log('finished translating pages', end); }); }); var buildOm = function buildOm() { var start = process.hrtime(); var files = config[ppcKey].files[0]; return assemble.src([omSrc]) .pipe(extractLayoutContext(assemble)) .pipe(mergeLayoutContext()) .pipe(addSeoTitle()) .pipe(ext()) .pipe(assemble.dest(path.join(files.dest, ppcKey))) .on('data', function(file) { logData(file.path, 'om-pages'); }) .on('end', function () { var end = process.hrtime(start); console.log('finished rendering pages om', end); }); }; var ignore = [ 'src', 'dest', 'assets', 'public', '_assets' ]; var buildPages = function buildPages (reload) { var start = process.hrtime(); var files = config.pages.files[0]; var opts = { since: (assemble.get('lastRunTime') ? new Date(assemble.get('lastRunTime')) : null) }; //this excludes om pages && resources-list pages return assemble.src(normalizeSrc(files.cwd, files.src).concat([ '!' + omSrc[0], '!website/partners/**/*.hbs' ]), opts) .on('error', function (err) { console.log('src error', err); }) .pipe(ext()) .pipe(assemble.dest(files.dest)) .on('error', function (err) { console.log('dest error', err); }) .on('data', function(file) { logData(file.path, 'pages'); var data = Object.keys(file.data).reduce(function(o, key) { if(ignore.indexOf(key) === -1) { o[key] = file.data[key]; } return o; }, {}); //console.log(Object.keys(data).length); }) .on('end', function () { var end = process.hrtime(start); console.log('finished rendering pages', end); assemble.set('lastRunTime', new Date()); // console.log(assemble.get('data')); }); }; var buildPartners = function buildPartners() { var start = process.hrtime(); var files = config.partners.files[0]; return assemble.src(normalizeSrc(files.cwd, files.src)) .pipe(ext()) .pipe(assemble.dest(path.join(files.dest, 'partners'))) .on('data', function(file) { logData(file.path, 'partners'); var data = Object.keys(file.data).reduce(function(o, key) { if(ignore.indexOf(key) === -1) { o[key] = file.data[key]; } return o; }, {}); //console.log(Object.keys(data)); }) .on('end', function () { var end = process.hrtime(start); console.log('finished rendering partners', end); }); }; assemble.task('subfolders', ['pages'], function () { var start = process.hrtime(); var files = config.pages.files[0]; /* jshint ignore:start */ assemble['subfolder']({ src: [ '**/*.hbs', '!' + omSrc ], fallback: [ '**/*.hbs', '!resources/resources-list/**/*' ] }); /* jshint ignore:end */ return push('subfolders') .pipe(ext()) .pipe(assemble.dest(files.dest)) //.on('data', function(d) { //console.log('data', d.path); //}) .on('end', function () { var end = process.hrtime(start); console.log('finished rendering subfolder', end); }); }); assemble.task('loadAll', ['resetLastRunTime'], function() { if(buildInitialized) { loadAll(true); } else { buildInitialized = true; loadAll(); } }); assemble.task('loadOm', loader(loadOmLayouts)); assemble.task('om-pages', buildOm); assemble.task('pages', ['prep-smartling'], buildPages); assemble.task('partners', ['prep-smartling'], buildPartners); assemble.task('rebuild:pages', buildPages); assemble.task('resetLastRunTime', function (cb) { assemble.set('lastRunTime', null); cb(); }); assemble.task('done', ['pages', 'partners'], done); assemble.task('layouts:pages', ['loadAll', 'prep-smartling'], buildPages); assemble.task('layouts:partners', ['loadAll', 'prep-smartling'], buildPartners); assemble.task('layouts:om', ['loadOm'], buildOm); assemble.task('build:all', ['loadAll', 'om-pages', 'pages', 'partners']); assemble.task('watch', ['om-pages', 'partners', 'pages'], function () { //only build om if anything om related changes assemble.watch([ 'website-guts/templates/om/**/*.hbs', 'website/om/**/*.hbs' ], ['layouts:om']); //rebuild all pages if layout changes that isn't partners layout //page layout references partners and pages assemble.watch([ 'website-guts/templates/layouts/**/*.hbs', '!website-guts/templates/layouts/{modal_wrapper,wrapper}.hbs', '!website-guts/templates/layouts/partners.hbs', '!website-guts/templates/layouts/page.hbs', '!website-guts/templates/om/**/*.hbs' ], ['layouts:pages']); assemble.watch([ 'website/**/global_*.{yml,yaml,json}', 'website-guts/templates/layouts/{modal_wrapper,wrapper}.hbs', 'website-guts/templates/layouts/page.hbs', 'website-guts/templates/{partials,components}/**/*.hbs' ], ['build:all']); //rebuild a single page assemble.watch([ 'website/**/*.hbs', '!website/partners/**/*.hbs', '!website/om/**/*.hbs' ], ['layouts:pages']); //rebuild all pages and layouts if yml changes assemble.watch([ 'website/**/*.{yml,yaml,json}', '!website/**/global_*.{yml,yaml,json}', '!website/partners/**/*.{yml,yaml,json}' ], ['layouts:pages']); //rebuild all partners pages if a partners page or partners layout changes assemble.watch([ 'website/partners/**/*.{hbs,yml,yaml,json}', '!website/partners/**/global_*.{yml,yaml,json}', 'website-guts/templates/layouts/partners.hbs' ], ['layouts:partners']); }); var tasks, env = assemble.get('env'); if(env === 'dev' || env === 'test') { tasks = [ 'build:all', 'watch', 'done' ]; } else { tasks = [ 'build:all', 'done' ]; } assemble.run(tasks); });