|
|
|
@ -16,7 +16,8 @@ require.paths.unshift(path.join(__dirname, '..', 'lib'));
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
mess.Renderer = function Renderer(env) {
|
|
|
|
|
env = _.extend(env, {});
|
|
|
|
|
env = _.extend({}, env);
|
|
|
|
|
if (!env.debug) env.debug = false;
|
|
|
|
|
if (!env.data_dir) env.data_dir = '/tmp/';
|
|
|
|
|
if (!env.local_data_dir) env.local_data_dir = '';
|
|
|
|
|
if (!env.validation_data) env.validation_data = false;
|
|
|
|
@ -180,19 +181,21 @@ mess.Renderer = function Renderer(env) {
|
|
|
|
|
function compileStyles(e, results) {
|
|
|
|
|
var options = {},
|
|
|
|
|
group = this.group();
|
|
|
|
|
for (var i = 0, l = results.length; i < l; i++) {
|
|
|
|
|
results.forEach(function(result) {
|
|
|
|
|
var next = group();
|
|
|
|
|
var parsingTime = +new Date;
|
|
|
|
|
new mess.Parser(_.extend(_.extend({
|
|
|
|
|
filename: results[i][0]
|
|
|
|
|
}, that.env), this.env)).parse(results[i][1],
|
|
|
|
|
filename: result[0]
|
|
|
|
|
}, that.env), this.env)).parse(result[1],
|
|
|
|
|
function(err, tree) {
|
|
|
|
|
if (err) {
|
|
|
|
|
mess.writeError(err, options);
|
|
|
|
|
throw err;
|
|
|
|
|
} else {
|
|
|
|
|
if (env.debug) console.warn('Parsing time: ' + ((new Date - parsingTime)) + 'ms (' + result[0] + ')');
|
|
|
|
|
try {
|
|
|
|
|
next(err, [
|
|
|
|
|
results[i][0],
|
|
|
|
|
result[0],
|
|
|
|
|
tree]);
|
|
|
|
|
return;
|
|
|
|
|
} catch (e) {
|
|
|
|
@ -201,7 +204,7 @@ mess.Renderer = function Renderer(env) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
},
|
|
|
|
|
function waitForCompilation(err, res) {
|
|
|
|
|
callback(err, m, res);
|
|
|
|
@ -215,6 +218,7 @@ mess.Renderer = function Renderer(env) {
|
|
|
|
|
* symbolizer each
|
|
|
|
|
*/
|
|
|
|
|
splitSymbolizers: function(definitions) {
|
|
|
|
|
var splitTime = +new Date;
|
|
|
|
|
var bySymbolizer = {};
|
|
|
|
|
for (var i = 0; i < definitions.length; i++) {
|
|
|
|
|
definitions[i].symbolizers().forEach(function(sym) {
|
|
|
|
@ -226,6 +230,7 @@ mess.Renderer = function Renderer(env) {
|
|
|
|
|
definitions[i].filterSymbolizer(sym));
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
if (env.debug) console.warn('Splitting symbolizers: ' + ((new Date - splitTime)) + 'ms');
|
|
|
|
|
return bySymbolizer;
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
@ -235,6 +240,7 @@ mess.Renderer = function Renderer(env) {
|
|
|
|
|
* ancestors to them.
|
|
|
|
|
*/
|
|
|
|
|
processChain: function(definitions) {
|
|
|
|
|
var processTime = +new Date();
|
|
|
|
|
// definitions are ordered in specificity,
|
|
|
|
|
// high to low
|
|
|
|
|
//
|
|
|
|
@ -267,7 +273,9 @@ mess.Renderer = function Renderer(env) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return this.resolveConditions(winners);
|
|
|
|
|
if (env.debug) console.warn('Processing time: ' + ((new Date - processTime)) + 'ms');
|
|
|
|
|
|
|
|
|
|
return winners;
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
removeDuplicateSelectors: function(selectors) {
|
|
|
|
@ -301,26 +309,29 @@ mess.Renderer = function Renderer(env) {
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
resolveConditions: function(definitions) {
|
|
|
|
|
var resolvingTime = +new Date;
|
|
|
|
|
var mergeTimeTotal = 0;
|
|
|
|
|
var rules = [];
|
|
|
|
|
var previousSelectors = [];
|
|
|
|
|
|
|
|
|
|
// detect non-conflicting rulesets
|
|
|
|
|
var key = null,
|
|
|
|
|
shortcut = true,
|
|
|
|
|
filters;
|
|
|
|
|
for (var i = 0; i < definitions.length; i++) {
|
|
|
|
|
filters = definitions[i].selector.filters;
|
|
|
|
|
if (!(filters.length &&
|
|
|
|
|
shortcut && (((key == null) && (key = filters[0].key)) ||
|
|
|
|
|
(key == filters[0].key)) &&
|
|
|
|
|
(filters.length == 1) &&
|
|
|
|
|
(filters[0].op.value == '='))) {
|
|
|
|
|
shortcut = false;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// var key = null,
|
|
|
|
|
// shortcut = true,
|
|
|
|
|
// filters;
|
|
|
|
|
// for (var i = 0; i < definitions.length; i++) {
|
|
|
|
|
// filters = definitions[i].selector.filters;
|
|
|
|
|
// if (!(filters.length &&
|
|
|
|
|
// shortcut && (((key == null) && (key = filters[0].key)) ||
|
|
|
|
|
// (key == filters[0].key)) &&
|
|
|
|
|
// (filters.length == 1) &&
|
|
|
|
|
// (filters[0].op.value == '='))) {
|
|
|
|
|
// shortcut = false;
|
|
|
|
|
// break;
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
//
|
|
|
|
|
// if (shortcut) return definitions;
|
|
|
|
|
|
|
|
|
|
if (shortcut) return definitions;
|
|
|
|
|
|
|
|
|
|
for (var i = 0; i < definitions.length; i++) {
|
|
|
|
|
if (!definitions[i].selector.sound()) {
|
|
|
|
@ -331,6 +342,7 @@ mess.Renderer = function Renderer(env) {
|
|
|
|
|
var selectors = [ definitions[i].selector.clone() ];
|
|
|
|
|
|
|
|
|
|
// Add the negated previous selectors.
|
|
|
|
|
|
|
|
|
|
for (var j = 0; j < previousSelectors.length; j++) {
|
|
|
|
|
for (var k = selectors.length - 1; k >= 0; k--) {
|
|
|
|
|
var splitSelectors = selectors[k].mergeOrConditions(previousSelectors[j]);
|
|
|
|
@ -346,6 +358,7 @@ mess.Renderer = function Renderer(env) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
previousSelectors.push(definitions[i].selector.negate());
|
|
|
|
|
|
|
|
|
|
selectors = this.removeDuplicateSelectors(selectors);
|
|
|
|
@ -358,6 +371,8 @@ mess.Renderer = function Renderer(env) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (env.debug) console.warn('Resolving time: ' + ((new Date - resolvingTime)) + 'ms');
|
|
|
|
|
|
|
|
|
|
return rules;
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
@ -432,10 +447,14 @@ mess.Renderer = function Renderer(env) {
|
|
|
|
|
for (var sym in bySymbolizer) {
|
|
|
|
|
// Create styles out of chains of one-symbolizer rules,
|
|
|
|
|
// and assign those styles to layers
|
|
|
|
|
|
|
|
|
|
var definitions = that.processChain(bySymbolizer[sym]);
|
|
|
|
|
definitions = that.resolveConditions(definitions);
|
|
|
|
|
|
|
|
|
|
var new_style = new mess.tree.Style(
|
|
|
|
|
l.id,
|
|
|
|
|
sym,
|
|
|
|
|
that.processChain(bySymbolizer[sym]));
|
|
|
|
|
definitions);
|
|
|
|
|
l.styles.push(new_style.name());
|
|
|
|
|
// env.effects can be modified by this call
|
|
|
|
|
output.push(new_style.toXML(env));
|
|
|
|
@ -492,11 +511,16 @@ mess.Renderer = function Renderer(env) {
|
|
|
|
|
render: function(str, callback) {
|
|
|
|
|
var m = JSON.parse(str),
|
|
|
|
|
that = this;
|
|
|
|
|
|
|
|
|
|
var localizingTime = +new Date;
|
|
|
|
|
this.localizeExternals(m, function(err, res) {
|
|
|
|
|
that.ensureSRS(res, function(err, res) {
|
|
|
|
|
that.localizeStyle(res, function(err, res) {
|
|
|
|
|
if (env.debug) console.warn('Localizing time: ' + ((new Date - localizingTime)) + 'ms');
|
|
|
|
|
that.style(res, function(err, m, res) {
|
|
|
|
|
var compilingTime = +new Date;
|
|
|
|
|
that.template(err, m, res, function(err, res) {
|
|
|
|
|
if (env.debug) console.warn('COMPILING TIME: ' + ((new Date - compilingTime)) + 'ms');
|
|
|
|
|
callback(err, res);
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|