carto
Version:
Mapnik Stylesheet Compiler
179 lines (151 loc) • 5.1 kB
JavaScript
var _ = require('lodash');
var Util = function () {
this.processMessage = function (env, message) {
if (!env.msg) {
env.msg = [];
}
if (message.type === 'error' ||
(message.type === 'warning' && !env.quiet)) {
if (!_.isNil(message.filename) && !_.isNil(message.index) &&
env.inputs && env.inputs[message.filename]) {
_.assign(message, this.getLineColumn(env.inputs[message.filename], message.index));
_.unset(message.index);
}
// add to messages collection if it not already exists
if (_.isNil(_.find(env.msg, function (v) {
return message.message === v.message &&
message.filename === v.filename &&
message.line === v.line &&
message.column === v.column &&
message.type === v.type;
}))) {
env.msg.push(message);
}
}
};
};
Util.prototype.getLineColumn = function (input, index) {
var lineCol = {
line: 0,
column: -1
};
if (!_.isNil(input) && !_.isNil(index)) {
lineCol.line = (input.slice(0, index).match(/\n/g) || '').length + 1;
for (var n = index; n >= 0 && input.charAt(n) !== '\n'; n--) {
lineCol.column++;
}
}
return lineCol;
};
Util.prototype.hasErrors = function (messages) {
return typeof _.find(messages, ['type', 'error']) !== 'undefined';
};
Util.prototype.getMessagesToPrint = function (messages) {
var messageOutput = '',
that = this;
_.forEach(messages, function (v) {
messageOutput += that.getMessageToPrint(v) + '\n';
});
return messageOutput.trim();
};
Util.prototype.getMessageToPrint = function (message) {
var messageOutput = '';
message.type = message.type.charAt(0).toUpperCase() + message.type.slice(1);
if (!_.isNil(message.filename)) {
if (message.line >= 0) {
if (message.column >= 0) {
messageOutput = _.template('<%=type%>: <%=filename%>:<%=line%>:<%=column%> <%=message%>')(message);
}
else {
messageOutput = _.template('<%=type%>: <%=filename%>:<%=line%> <%=message%>')(message);
}
}
else {
messageOutput = _.template('<%=type%>: <%=filename%> <%=message%>')(message);
}
}
else {
messageOutput = _.template('<%=type%>: <%=message%>')(message);
}
return messageOutput;
};
Util.prototype.warning = function (env, message) {
_(message).defaults({
type: 'warning',
message: 'Unspecified warning.',
filename: null,
line: -1,
column: -1
}).value();
this.processMessage(env, message);
};
Util.prototype.error = function (env, message) {
_(message).defaults({
type: 'error',
message: 'Unspecified error.',
filename: null,
line: -1,
column: -1
}).value();
this.processMessage(env, message);
}
Util.prototype.jsonToXML = function (json, level) {
var that = this,
intendation = '';
if (typeof level === 'undefined') {
level = 0;
}
for (var i = 0; i < level; i++) {
intendation += ' ';
}
if (_.isObject(json) && !_.isArray(json)) {
if (_.has(json, '_name')) {
var output = intendation + '<' + json._name;
if (_.has(json, '_attributes') && Object.keys(json._attributes).length) {
var attributes = [];
// output attributes sorted in alphabetical order
Object.keys(json._attributes).sort().forEach(function (v) {
attributes.push(v + '="' + json._attributes[v] + '"');
});
output += ' ' + attributes.join(' ');
}
if (_.has(json, '_content')) {
var content = that.jsonToXML(json._content, level + 1);
// check if there are subtags
if (content.indexOf('</') == -1 && content.indexOf('/>') == -1) {
output += '>' + content + '</' + json._name + '>\n';
}
else {
output += '>\n' + content;
output += intendation + '</' + json._name + '>\n';
}
}
else {
output += ' />\n';
}
return output;
}
}
else if (_.isArray(json)) {
if (json.length) {
if (_.isObject(json[0])) {
return json.map(function (o) {
return that.jsonToXML(o, level);
}).join('');
}
else {
return json.join(',');
}
}
}
else {
if (_.isString(json)) {
return '<![CDATA[' + json + ']]>';
}
else if (!_.isNil(json)) {
return json.toString();
}
}
return '';
};
module.exports = new Util();