Pullup commits from trunk to 2.6 branch:
* virtualStyle typo (Closes #1495) * JSON fix for Safari 3.1 (Closes #1493) * panzoombar off-by-one (Closes #1486) * Handler Hover exception (Closes #1480) * Popup.framedcloud exception (Closes #1479) * VML Renderer when including namespace in page (Closes #1477) * SLD/Rule/Filter changes -- most of this commit (Closes #1492) git-svn-id: http://svn.openlayers.org/branches/openlayers/2.6@6819 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf
This commit is contained in:
@@ -95,8 +95,9 @@ OpenLayers.Format.JSON = OpenLayers.Class(OpenLayers.Format, {
|
||||
* characters.
|
||||
*/
|
||||
try {
|
||||
if(/^("(\\.|[^"\\\n\r])*?"|[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t])+?$/.
|
||||
test(json)) {
|
||||
if (/^[\],:{}\s]*$/.test(json.replace(/\\["\\\/bfnrtu]/g, '@').
|
||||
replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').
|
||||
replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
|
||||
|
||||
/**
|
||||
* In the second stage we use the eval function to compile the
|
||||
|
||||
@@ -142,24 +142,8 @@ OpenLayers.Format.SLD.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
|
||||
style.rules = obj.rules;
|
||||
},
|
||||
"Rule": function(node, obj) {
|
||||
// Rule elements are represented as OpenLayers.Rule instances.
|
||||
// Filter elements are represented as instances of
|
||||
// OpenLayers.Rule subclasses.
|
||||
var config = {
|
||||
rules: [],
|
||||
symbolizer: {}
|
||||
};
|
||||
this.readChildNodes(node, config);
|
||||
// Now we've either got zero or one rules (from filters)
|
||||
var rule;
|
||||
if(config.rules.length == 0) {
|
||||
delete config.rules;
|
||||
rule = new OpenLayers.Rule(config);
|
||||
} else {
|
||||
rule = config.rules[0];
|
||||
delete config.rules;
|
||||
OpenLayers.Util.extend(rule, config);
|
||||
}
|
||||
var rule = new OpenLayers.Rule();
|
||||
this.readChildNodes(node, rule);
|
||||
obj.rules.push(rule);
|
||||
},
|
||||
"ElseFilter": function(node, rule) {
|
||||
@@ -283,146 +267,121 @@ OpenLayers.Format.SLD.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
|
||||
},
|
||||
"ogc": {
|
||||
"Filter": function(node, rule) {
|
||||
// Filters correspond to subclasses of OpenLayers.Rule.
|
||||
// Filters correspond to subclasses of OpenLayers.Filter.
|
||||
// Since they contain information we don't persist, we
|
||||
// create a temporary object and then pass on the rules
|
||||
// create a temporary object and then pass on the filter
|
||||
// (ogc:Filter) to the parent rule (sld:Rule).
|
||||
var filter = {
|
||||
var obj = {
|
||||
fids: [],
|
||||
rules: []
|
||||
filters: []
|
||||
};
|
||||
this.readChildNodes(node, filter);
|
||||
if(filter.fids.length > 0) {
|
||||
rule.rules.push(new OpenLayers.Rule.FeatureId({
|
||||
fids: filter.fids
|
||||
}));
|
||||
}
|
||||
if(filter.rules.length > 0) {
|
||||
rule.rules = rule.rules.concat(filter.rules);
|
||||
this.readChildNodes(node, obj);
|
||||
if(obj.fids.length > 0) {
|
||||
rule.filter = new OpenLayers.Filter.FeatureId({
|
||||
fids: obj.fids
|
||||
});
|
||||
} else if(obj.filters.length > 0) {
|
||||
rule.filter = obj.filters[0];
|
||||
}
|
||||
},
|
||||
"FeatureId": function(node, filter) {
|
||||
"FeatureId": function(node, obj) {
|
||||
var fid = node.getAttribute("fid");
|
||||
if(fid) {
|
||||
filter.fids.push(fid);
|
||||
obj.fids.push(fid);
|
||||
}
|
||||
},
|
||||
"And": function(node, filter) {
|
||||
var rule = new OpenLayers.Rule.Logical({
|
||||
type: OpenLayers.Rule.Logical.AND
|
||||
"And": function(node, obj) {
|
||||
var filter = new OpenLayers.Filter.Logical({
|
||||
type: OpenLayers.Filter.Logical.AND
|
||||
});
|
||||
// since FeatureId rules may be nested here, make room for them
|
||||
rule.fids = [];
|
||||
this.readChildNodes(node, rule);
|
||||
if(rule.fids.length > 0) {
|
||||
rule.rules.push(new OpenLayers.Rule.FeatureId({
|
||||
fids: rule.fids
|
||||
}));
|
||||
}
|
||||
delete rule.fids;
|
||||
filter.rules.push(rule);
|
||||
this.readChildNodes(node, filter);
|
||||
obj.filters.push(filter);
|
||||
},
|
||||
"Or": function(node, filter) {
|
||||
var rule = new OpenLayers.Rule.Logical({
|
||||
type: OpenLayers.Rule.Logical.OR
|
||||
"Or": function(node, obj) {
|
||||
var filter = new OpenLayers.Filter.Logical({
|
||||
type: OpenLayers.Filter.Logical.OR
|
||||
});
|
||||
// since FeatureId rules may be nested here, make room for them
|
||||
rule.fids = [];
|
||||
this.readChildNodes(node, rule);
|
||||
if(rule.fids.length > 0) {
|
||||
rule.rules.push(new OpenLayers.Rule.FeatureId({
|
||||
fids: rule.fids
|
||||
}));
|
||||
}
|
||||
delete rule.fids;
|
||||
filter.rules.push(rule);
|
||||
this.readChildNodes(node, filter);
|
||||
obj.filters.push(filter);
|
||||
},
|
||||
"Not": function(node, filter) {
|
||||
var rule = new OpenLayers.Rule.Logical({
|
||||
type: OpenLayers.Rule.Logical.NOT
|
||||
"Not": function(node, obj) {
|
||||
var filter = new OpenLayers.Filter.Logical({
|
||||
type: OpenLayers.Filter.Logical.NOT
|
||||
});
|
||||
// since FeatureId rules may be nested here, make room for them
|
||||
rule.fids = [];
|
||||
this.readChildNodes(node, rule);
|
||||
if(rule.fids.length > 0) {
|
||||
rule.rules.push(new OpenLayers.Rule.FeatureId({
|
||||
fids: rule.fids
|
||||
}));
|
||||
}
|
||||
delete rule.fids;
|
||||
filter.rules.push(rule);
|
||||
this.readChildNodes(node, filter);
|
||||
obj.filters.push(filter);
|
||||
},
|
||||
"PropertyIsEqualTo": function(node, filter) {
|
||||
var rule = new OpenLayers.Rule.Comparison({
|
||||
type: OpenLayers.Rule.Comparison.EQUAL_TO
|
||||
"PropertyIsEqualTo": function(node, obj) {
|
||||
var filter = new OpenLayers.Filter.Comparison({
|
||||
type: OpenLayers.Filter.Comparison.EQUAL_TO
|
||||
});
|
||||
this.readChildNodes(node, rule);
|
||||
filter.rules.push(rule);
|
||||
this.readChildNodes(node, filter);
|
||||
obj.filters.push(filter);
|
||||
},
|
||||
"PropertyIsNotEqualTo": function(node, filter) {
|
||||
var rule = new OpenLayers.Rule.Comparison({
|
||||
type: OpenLayers.Rule.Comparison.NOT_EQUAL_TO
|
||||
"PropertyIsNotEqualTo": function(node, obj) {
|
||||
var filter = new OpenLayers.Filter.Comparison({
|
||||
type: OpenLayers.Filter.Comparison.NOT_EQUAL_TO
|
||||
});
|
||||
this.readChildNodes(node, rule);
|
||||
filter.rules.push(rule);
|
||||
this.readChildNodes(node, filter);
|
||||
obj.filters.push(filter);
|
||||
},
|
||||
"PropertyIsLessThan": function(node, filter) {
|
||||
var rule = new OpenLayers.Rule.Comparison({
|
||||
type: OpenLayers.Rule.Comparison.LESS_THAN
|
||||
"PropertyIsLessThan": function(node, obj) {
|
||||
var filter = new OpenLayers.Filter.Comparison({
|
||||
type: OpenLayers.Filter.Comparison.LESS_THAN
|
||||
});
|
||||
this.readChildNodes(node, rule);
|
||||
filter.rules.push(rule);
|
||||
this.readChildNodes(node, filter);
|
||||
obj.filters.push(filter);
|
||||
},
|
||||
"PropertyIsGreaterThan": function(node, filter) {
|
||||
var rule = new OpenLayers.Rule.Comparison({
|
||||
type: OpenLayers.Rule.Comparison.GREATER_THAN
|
||||
"PropertyIsGreaterThan": function(node, obj) {
|
||||
var filter = new OpenLayers.Filter.Comparison({
|
||||
type: OpenLayers.Filter.Comparison.GREATER_THAN
|
||||
});
|
||||
this.readChildNodes(node, rule);
|
||||
filter.rules.push(rule);
|
||||
this.readChildNodes(node, filter);
|
||||
obj.filters.push(filter);
|
||||
},
|
||||
"PropertyIsLessThanOrEqualTo": function(node, filter) {
|
||||
var rule = new OpenLayers.Rule.Comparison({
|
||||
type: OpenLayers.Rule.Comparison.LESS_THAN_OR_EQUAL_TO
|
||||
"PropertyIsLessThanOrEqualTo": function(node, obj) {
|
||||
var filter = new OpenLayers.Filter.Comparison({
|
||||
type: OpenLayers.Filter.Comparison.LESS_THAN_OR_EQUAL_TO
|
||||
});
|
||||
this.readChildNodes(node, rule);
|
||||
filter.rules.push(rule);
|
||||
this.readChildNodes(node, filter);
|
||||
obj.filters.push(filter);
|
||||
},
|
||||
"PropertyIsGreaterThanOrEqualTo": function(node, filter) {
|
||||
var rule = new OpenLayers.Rule.Comparison({
|
||||
type: OpenLayers.Rule.Comparison.GREATER_THAN_OR_EQUAL_TO
|
||||
"PropertyIsGreaterThanOrEqualTo": function(node, obj) {
|
||||
var filter = new OpenLayers.Filter.Comparison({
|
||||
type: OpenLayers.Filter.Comparison.GREATER_THAN_OR_EQUAL_TO
|
||||
});
|
||||
this.readChildNodes(node, rule);
|
||||
filter.rules.push(rule);
|
||||
this.readChildNodes(node, filter);
|
||||
obj.filters.push(filter);
|
||||
},
|
||||
"PropertyIsBetween": function(node, filter) {
|
||||
var rule = new OpenLayers.Rule.Comparison({
|
||||
type: OpenLayers.Rule.Comparison.BETWEEN
|
||||
"PropertyIsBetween": function(node, obj) {
|
||||
var filter = new OpenLayers.Filter.Comparison({
|
||||
type: OpenLayers.Filter.Comparison.BETWEEN
|
||||
});
|
||||
this.readChildNodes(node, rule);
|
||||
filter.rules.push(rule);
|
||||
this.readChildNodes(node, filter);
|
||||
obj.filters.push(filter);
|
||||
},
|
||||
"PropertyIsLike": function(node, filter) {
|
||||
var rule = new OpenLayers.Rule.Comparison({
|
||||
type: OpenLayers.Rule.Comparison.LIKE
|
||||
"PropertyIsLike": function(node, obj) {
|
||||
var filter = new OpenLayers.Filter.Comparison({
|
||||
type: OpenLayers.Filter.Comparison.LIKE
|
||||
});
|
||||
this.readChildNodes(node, rule);
|
||||
this.readChildNodes(node, filter);
|
||||
var wildCard = node.getAttribute("wildCard");
|
||||
var singleChar = node.getAttribute("singleChar");
|
||||
var esc = node.getAttribute("escape");
|
||||
rule.value2regex(wildCard, singleChar, esc);
|
||||
filter.rules.push(rule);
|
||||
filter.value2regex(wildCard, singleChar, esc);
|
||||
obj.filters.push(filter);
|
||||
},
|
||||
"Literal": function(node, obj) {
|
||||
obj.value = this.getChildValue(node);
|
||||
},
|
||||
"PropertyName": function(node, rule) {
|
||||
rule.property = this.getChildValue(node);
|
||||
"PropertyName": function(node, filter) {
|
||||
filter.property = this.getChildValue(node);
|
||||
},
|
||||
"LowerBoundary": function(node, rule) {
|
||||
rule.lowerBoundary = this.readOgcExpression(node);
|
||||
"LowerBoundary": function(node, filter) {
|
||||
filter.lowerBoundary = this.readOgcExpression(node);
|
||||
},
|
||||
"UpperBoundary": function(node, rule) {
|
||||
rule.upperBoundary = this.readOgcExpression(node);
|
||||
"UpperBoundary": function(node, filter) {
|
||||
filter.upperBoundary = this.readOgcExpression(node);
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -682,8 +641,8 @@ OpenLayers.Format.SLD.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
|
||||
// add in optional filters
|
||||
if(rule.elseFilter) {
|
||||
this.writeNode(node, "ElseFilter");
|
||||
} else if(rule.CLASS_NAME != "OpenLayers.Rule") {
|
||||
this.writeNode(node, "ogc:Filter", rule);
|
||||
} else if(rule.filter) {
|
||||
this.writeNode(node, "ogc:Filter", rule.filter);
|
||||
}
|
||||
|
||||
// add in scale limits
|
||||
@@ -867,15 +826,15 @@ OpenLayers.Format.SLD.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
|
||||
}
|
||||
},
|
||||
"ogc": {
|
||||
"Filter": function(rule) {
|
||||
"Filter": function(filter) {
|
||||
var node = this.createElementNSPlus("ogc:Filter");
|
||||
var sub = rule.CLASS_NAME.split(".").pop();
|
||||
var sub = filter.CLASS_NAME.split(".").pop();
|
||||
if(sub == "FeatureId") {
|
||||
for(var i=0; i<rule.fids.length; ++i) {
|
||||
this.writeNode(node, "FeatureId", rule.fids[i]);
|
||||
for(var i=0; i<filter.fids.length; ++i) {
|
||||
this.writeNode(node, "FeatureId", filter.fids[i]);
|
||||
}
|
||||
} else {
|
||||
this.writeNode(node, this.getFilterType(rule), rule);
|
||||
this.writeNode(node, this.getFilterType(filter), filter);
|
||||
}
|
||||
return node;
|
||||
},
|
||||
@@ -884,120 +843,120 @@ OpenLayers.Format.SLD.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
|
||||
attributes: {fid: fid}
|
||||
});
|
||||
},
|
||||
"And": function(rule) {
|
||||
"And": function(filter) {
|
||||
var node = this.createElementNSPlus("ogc:And");
|
||||
var childRule;
|
||||
for(var i=0; i<rule.rules.length; ++i) {
|
||||
childRule = rule.rules[i];
|
||||
var childFilter;
|
||||
for(var i=0; i<filter.filters.length; ++i) {
|
||||
childFilter = filter.filters[i];
|
||||
this.writeNode(
|
||||
node, this.getFilterType(childRule), childRule
|
||||
node, this.getFilterType(childFilter), childFilter
|
||||
);
|
||||
}
|
||||
return node;
|
||||
},
|
||||
"Or": function(rule) {
|
||||
"Or": function(filter) {
|
||||
var node = this.createElementNSPlus("ogc:Or");
|
||||
var childRule;
|
||||
for(var i=0; i<rule.rules.length; ++i) {
|
||||
childRule = rule.rules[i];
|
||||
var childFilter;
|
||||
for(var i=0; i<filter.filters.length; ++i) {
|
||||
childFilter = filter.filters[i];
|
||||
this.writeNode(
|
||||
node, this.getFilterType(childRule), childRule
|
||||
node, this.getFilterType(childFilter), childFilter
|
||||
);
|
||||
}
|
||||
return node;
|
||||
},
|
||||
"Not": function(rule) {
|
||||
"Not": function(filter) {
|
||||
var node = this.createElementNSPlus("ogc:Not");
|
||||
var childRule = rule.rules[0];
|
||||
var childFilter = filter.filters[0];
|
||||
this.writeNode(
|
||||
node, this.getFilterType(childRule), childRule
|
||||
node, this.getFilterType(childFilter), childFilter
|
||||
);
|
||||
return node;
|
||||
},
|
||||
"PropertyIsEqualTo": function(rule) {
|
||||
"PropertyIsEqualTo": function(filter) {
|
||||
var node = this.createElementNSPlus("ogc:PropertyIsEqualTo");
|
||||
// no ogc:expression handling for now
|
||||
this.writeNode(node, "PropertyName", rule);
|
||||
this.writeNode(node, "Literal", rule);
|
||||
this.writeNode(node, "PropertyName", filter);
|
||||
this.writeNode(node, "Literal", filter.value);
|
||||
return node;
|
||||
},
|
||||
"PropertyIsNotEqualTo": function(rule) {
|
||||
"PropertyIsNotEqualTo": function(filter) {
|
||||
var node = this.createElementNSPlus("ogc:PropertyIsNotEqualTo");
|
||||
// no ogc:expression handling for now
|
||||
this.writeNode(node, "PropertyName", rule);
|
||||
this.writeNode(node, "Literal", rule);
|
||||
this.writeNode(node, "PropertyName", filter);
|
||||
this.writeNode(node, "Literal", filter.value);
|
||||
return node;
|
||||
},
|
||||
"PropertyIsLessThan": function(rule) {
|
||||
"PropertyIsLessThan": function(filter) {
|
||||
var node = this.createElementNSPlus("ogc:PropertyIsLessThan");
|
||||
// no ogc:expression handling for now
|
||||
this.writeNode(node, "PropertyName", rule);
|
||||
this.writeNode(node, "Literal", rule);
|
||||
this.writeNode(node, "PropertyName", filter);
|
||||
this.writeNode(node, "Literal", filter.value);
|
||||
return node;
|
||||
},
|
||||
"PropertyIsGreaterThan": function(rule) {
|
||||
"PropertyIsGreaterThan": function(filter) {
|
||||
var node = this.createElementNSPlus("ogc:PropertyIsGreaterThan");
|
||||
// no ogc:expression handling for now
|
||||
this.writeNode(node, "PropertyName", rule);
|
||||
this.writeNode(node, "Literal", rule);
|
||||
this.writeNode(node, "PropertyName", filter);
|
||||
this.writeNode(node, "Literal", filter.value);
|
||||
return node;
|
||||
},
|
||||
"PropertyIsLessThanOrEqualTo": function(rule) {
|
||||
"PropertyIsLessThanOrEqualTo": function(filter) {
|
||||
var node = this.createElementNSPlus("ogc:PropertyIsLessThanOrEqualTo");
|
||||
// no ogc:expression handling for now
|
||||
this.writeNode(node, "PropertyName", rule);
|
||||
this.writeNode(node, "Literal", rule);
|
||||
this.writeNode(node, "PropertyName", filter);
|
||||
this.writeNode(node, "Literal", filter.value);
|
||||
return node;
|
||||
},
|
||||
"PropertyIsGreaterThanOrEqualTo": function(rule) {
|
||||
"PropertyIsGreaterThanOrEqualTo": function(filter) {
|
||||
var node = this.createElementNSPlus("ogc:PropertyIsGreaterThanOrEqualTo");
|
||||
// no ogc:expression handling for now
|
||||
this.writeNode(node, "PropertyName", rule);
|
||||
this.writeNode(node, "Literal", rule);
|
||||
this.writeNode(node, "PropertyName", filter);
|
||||
this.writeNode(node, "Literal", filter.value);
|
||||
return node;
|
||||
},
|
||||
"PropertyIsBetween": function(rule) {
|
||||
"PropertyIsBetween": function(filter) {
|
||||
var node = this.createElementNSPlus("ogc:PropertyIsBetween");
|
||||
// no ogc:expression handling for now
|
||||
this.writeNode(node, "PropertyName", rule);
|
||||
this.writeNode(node, "LowerBoundary", rule);
|
||||
this.writeNode(node, "UpperBoundary", rule);
|
||||
this.writeNode(node, "PropertyName", filter);
|
||||
this.writeNode(node, "LowerBoundary", filter);
|
||||
this.writeNode(node, "UpperBoundary", filter);
|
||||
return node;
|
||||
},
|
||||
"PropertyIsLike": function(rule) {
|
||||
"PropertyIsLike": function(filter) {
|
||||
var node = this.createElementNSPlus("ogc:PropertyIsLike", {
|
||||
attributes: {
|
||||
wildCard: "*", singleChar: ".", escape: "!"
|
||||
}
|
||||
});
|
||||
// no ogc:expression handling for now
|
||||
this.writeNode(node, "PropertyName", rule);
|
||||
this.writeNode(node, "PropertyName", filter);
|
||||
// convert regex string to ogc string
|
||||
this.writeNode(node, "Literal", {value: rule.regex2value()});
|
||||
this.writeNode(node, "Literal", filter.regex2value());
|
||||
return node;
|
||||
},
|
||||
"PropertyName": function(rule) {
|
||||
"PropertyName": function(filter) {
|
||||
// no ogc:expression handling for now
|
||||
return this.createElementNSPlus("ogc:PropertyName", {
|
||||
value: rule.property
|
||||
value: filter.property
|
||||
});
|
||||
},
|
||||
"Literal": function(rule) {
|
||||
"Literal": function(value) {
|
||||
// no ogc:expression handling for now
|
||||
return this.createElementNSPlus("ogc:Literal", {
|
||||
value: rule.value
|
||||
value: value
|
||||
});
|
||||
},
|
||||
"LowerBoundary": function(rule) {
|
||||
"LowerBoundary": function(filter) {
|
||||
// no ogc:expression handling for now
|
||||
var node = this.createElementNSPlus("ogc:LowerBoundary");
|
||||
this.writeNode(node, "Literal", rule.lowerBoundary);
|
||||
this.writeNode(node, "Literal", filter.lowerBoundary);
|
||||
return node;
|
||||
},
|
||||
"UpperBoundary": function(rule) {
|
||||
"UpperBoundary": function(filter) {
|
||||
// no ogc:expression handling for now
|
||||
var node = this.createElementNSPlus("ogc:UpperBoundary");
|
||||
this.writeNode(node, "Literal", rule.upperBoundary);
|
||||
this.writeNode(node, "Literal", filter.upperBoundary);
|
||||
return node;
|
||||
}
|
||||
}
|
||||
@@ -1006,17 +965,17 @@ OpenLayers.Format.SLD.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
|
||||
/**
|
||||
* Method: getFilterType
|
||||
*/
|
||||
getFilterType: function(rule) {
|
||||
var filterType = this.filterMap[rule.type];
|
||||
getFilterType: function(filter) {
|
||||
var filterType = this.filterMap[filter.type];
|
||||
if(!filterType) {
|
||||
throw "SLD writing not supported for rule type: " + rule.type;
|
||||
throw "SLD writing not supported for rule type: " + filter.type;
|
||||
}
|
||||
return filterType;
|
||||
},
|
||||
|
||||
/**
|
||||
* Property: filterMap
|
||||
* {Object} Contains a member for each rule type. Values are node names
|
||||
* {Object} Contains a member for each filter type. Values are node names
|
||||
* for corresponding OGC Filter child elements.
|
||||
*/
|
||||
filterMap: {
|
||||
|
||||
Reference in New Issue
Block a user