From 22a66cb6e243a3f1c867b62e3942fd2e828019d9 Mon Sep 17 00:00:00 2001 From: Valerio Virgillito Date: Thu, 8 Mar 2012 13:56:09 -0800 Subject: integrating v0.7 montage into ninja Signed-off-by: Valerio Virgillito --- node_modules/montage/node.js | 140 ++++++++++++++++++++++++++++++++++++------- 1 file changed, 119 insertions(+), 21 deletions(-) (limited to 'node_modules/montage/node.js') diff --git a/node_modules/montage/node.js b/node_modules/montage/node.js index 3d0a1edb..100acac5 100644 --- a/node_modules/montage/node.js +++ b/node_modules/montage/node.js @@ -13,6 +13,10 @@ var Require = require("./require/require"); var Promise = require("./core/promise"); var URL = require("./core/url"); +var jsdom = require("jsdom").jsdom; +var Node = require("jsdom").level(1).Node; +var domToHtml = require("jsdom/lib/jsdom/browser/domtohtml").domToHtml; + exports.bootstrap = function (callback) { var command = process.argv.slice(0, 3); var args = process.argv.slice(2); @@ -33,27 +37,6 @@ exports.bootstrap = function (callback) { }); }; -MontageBoot.loadPackage = function (location, config) { - var config = {}; - - config.location = URL.resolve('file:/', location + '/'); - - // setup the reel loader - config.makeLoader = function (config) { - return MontageBoot.ReelLoader(config, - Require.DefaultLoaderConstructor(config)); - }; - - // setup serialization compiler - config.makeCompiler = function (config) { - return MontageBoot.TemplateCompiler(config, - MontageBoot.SerializationCompiler(config, - Require.DefaultCompilerConstructor(config))); - }; - - return Require.PackageSandbox(config.location, config); -}; - var findPackage = function (path, callback) { var directory = PATH.dirname(path); if (directory === path) @@ -82,3 +65,118 @@ var loadPackagedModule = function (directory, program, command, args) { .end(); }; +MontageBoot.loadPackage = function (location, config) { + var config = {}; + + config.location = URL.resolve(Require.getLocation(), location + '/'); + + // setup the reel loader + config.makeLoader = function (config) { + return MontageBoot.ReelLoader( + config, + Require.makeLoader(config) + ); + }; + + // setup serialization compiler + config.makeCompiler = function (config) { + return MontageBoot.TemplateCompiler( + config, + MontageBoot.SerializationCompiler( + config, + Require.makeCompiler(config) + ) + ); + }; + + return Require.loadPackage(config.location, config); +}; + +MontageBoot.TemplateLoader = function (config, load) { + return function(id, module) { + var html = id.match(/(.*\/)?(?=[^\/]+\.html$)/); + var serialization = id.match(/(?=[^\/]+\.json$)/); // XXX this is not necessarily a strong indicator of a serialization alone + if (html) { + return load(id, module) + .then(function () { + module.dependencies = parseHtmlDependencies(module.text, module.location); + return module; + }); + } else if (serialization) { + return load(id, module) + .then(function () { + module.dependencies = collectSerializationDependencies(module.text, []); + return module; + }); + } else { + return load(id, module); + } + }; +}; + +// add the TemplateLoader to the middleware chain +Require.makeLoader = (function (makeLoader) { + return function (config) { + return MontageBoot.TemplateLoader(config, makeLoader(config)); + }; +})(Require.makeLoader); + +var parseHtmlDependencies = function (text, location) { + var dependencies = []; + var document = jsdom(text, null, { + "features": { + "FetchExternalResources": false, + "ProcessExternalResources": false + } + }); + collectHtmlDependencies(document, dependencies); + return dependencies; +}; + +var collectHtmlDependencies = function (document, dependencies) { + visit(document, function (element) { + if (element.nodeType == Node.ELEMENT_NODE) { + if (element.tagName === "SCRIPT") { + if (element.getAttribute("type") === "text/montage-serialization") { + collectSerializationDependencies(getText(element), dependencies); + } + } else if (element.tagName === "LINK") { + if (element.getAttribute("type") === "text/montage-serialization") { + dependencies.push(element.getAttribute("href")); + } + } + } + }); +}; + +function visit(element, visitor) { + var pruned; + var prune = function () { + pruned = true; + }; + visitor(element, prune); + if (pruned) { + return; + } + element = element.firstChild; + while (element) { + visit(element, visitor); + element = element.nextSibling; + } +} + +function getText(element) { + return domToHtml(element._childNodes, true, true); +} + +var collectSerializationDependencies = function (text, dependencies) { + var serialization = JSON.parse(text); + Object.keys(serialization).forEach(function (label) { + var description = serialization[label]; + if (typeof description.module === "string") { + dependencies.push(description.module); + } + }); + return dependencies; +}; + -- cgit v1.2.3