diff --git a/.gitignore b/.gitignore index 8214ca0..8d29ccd 100644 --- a/.gitignore +++ b/.gitignore @@ -14,5 +14,4 @@ results node_modules npm-debug.log -test/out/ -out/ \ No newline at end of file +test/out/ \ No newline at end of file diff --git a/out/multiplelayouts.plugin.js b/out/multiplelayouts.plugin.js new file mode 100644 index 0000000..db0be55 --- /dev/null +++ b/out/multiplelayouts.plugin.js @@ -0,0 +1,125 @@ +// Generated by CoffeeScript 1.6.3 +(function() { + var __hasProp = {}.hasOwnProperty, + __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; + + module.exports = function(BasePlugin) { + var MultipleLayoutsPlugin, TaskGroup, _ref; + TaskGroup = require('taskgroup').TaskGroup; + return MultipleLayoutsPlugin = (function(_super) { + __extends(MultipleLayoutsPlugin, _super); + + function MultipleLayoutsPlugin() { + _ref = MultipleLayoutsPlugin.__super__.constructor.apply(this, arguments); + return _ref; + } + + MultipleLayoutsPlugin.prototype.name = 'multiplelayouts'; + + MultipleLayoutsPlugin.prototype.extendCollections = function(opts) { + var docpad, files, me; + me = this; + docpad = this.docpad; + files = docpad.getFiles({ + additionalLayouts: { + $exists: true + } + }); + files.on('remove', function(document) { + return me.removeAdditionalLayoutsFor(document); + }); + return this; + }; + + MultipleLayoutsPlugin.prototype.contextualizeBefore = function(opts, next) { + var collection, database, docpad, me, sourcePageDocuments, tasks; + me = this; + docpad = this.docpad; + database = docpad.getDatabase(); + tasks = new TaskGroup().once('complete', next); + collection = opts.collection; + sourcePageDocuments = collection.findAll({ + additionalLayouts: { + $exists: true + } + }); + sourcePageDocuments.forEach(function(document) { + return tasks.addTask(function(complete) { + return me.removeAdditionalLayoutsFor(document, collection, complete); + }); + }); + sourcePageDocuments.forEach(function(document) { + return tasks.addGroup(function(addGroup, addTask) { + var layouts; + layouts = document.get('additionalLayouts'); + if (layouts == null) { + return; + } + if (!Array.isArray(layouts)) { + layouts = [layouts]; + } + return layouts.forEach(function(layout) { + return addTask(function(complete) { + var newDoc; + newDoc = docpad.cloneModel(document); + newDoc.set({ + filename: null + }); + newDoc.setMeta({ + fullPath: null, + relativePath: (document.get('additionalLayoutsRelativeOutDirPath') || document.get('relativeOutDirPath')) + '/' + document.get('basename') + '-' + layout + '.' + document.get('extensions').join('.'), + layout: layout, + additionalLayoutFor: document.id, + additionalLayouts: null + }); + return newDoc.normalize(function(err) { + var _ref1; + if (err) { + return complete(err); + } + database.add(newDoc); + if ((_ref1 = opts.collection) != null) { + _ref1.add(newDoc); + } + return complete(); + }); + }); + }); + }); + }); + tasks.run(); + return this; + }; + + MultipleLayoutsPlugin.prototype.removeAdditionalLayoutsFor = function(document, collection, next) { + var database, docpad, files, tasks; + docpad = this.docpad; + database = docpad.getDatabase(); + tasks = new TaskGroup().setConfig({ + concurreny: 0 + }); + if (next) { + tasks.once('complete', next); + } + files = docpad.getFiles({ + additionalLayoutFor: document.id + }); + files.forEach(function(file) { + return tasks.addTask(function(complete) { + if (collection != null) { + collection.remove(file); + } + database.remove(file); + return file["delete"](complete); + }); + }); + tasks.run(); + return this; + }; + + return MultipleLayoutsPlugin; + + })(BasePlugin); + }; + +}).call(this); diff --git a/src/multiplelayouts.plugin.coffee b/src/multiplelayouts.plugin.coffee index 3575dc8..98d2cd6 100644 --- a/src/multiplelayouts.plugin.coffee +++ b/src/multiplelayouts.plugin.coffee @@ -51,7 +51,7 @@ module.exports = (BasePlugin) -> ) newDoc.setMeta( fullPath: null # treat it as a virtual document - relativePath: document.get('relativeOutDirPath') + '/' + document.get('basename') + '-' + layout + '.' + document.get('extensions').join('.') + relativePath: (document.get('additionalLayoutsRelativeOutDirPath') or document.get('relativeOutDirPath')) + '/' + document.get('basename') + '-' + layout + '.' + document.get('extensions').join('.') layout: layout additionalLayoutFor: document.id additionalLayouts: null