Adding more complete style parsing to the WMC format. The format now has support for named, linked (SLD), and inline (SLD_BODY) styles. r=ahocevar (closes #1313)

git-svn-id: http://svn.openlayers.org/trunk/openlayers@6358 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf
This commit is contained in:
Tim Schaub
2008-02-24 20:25:27 +00:00
parent b06a8762a4
commit 3405e97835
3 changed files with 264 additions and 10 deletions

View File

@@ -122,9 +122,7 @@ OpenLayers.Format.WMC.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
for(var i=0; i<children.length; ++i) {
childNode = children[i];
if(childNode.nodeType == 1) {
prefix = (childNode.prefix == this.rootPrefix) ?
this.defaultPrefix :
this.getNamespacePrefix(childNode.namespaceURI);
prefix = this.getNamespacePrefix(childNode.namespaceURI);
local = childNode.nodeName.split(":").pop();
processor = this["read_" + prefix + "_" + local];
if(processor) {
@@ -312,10 +310,37 @@ OpenLayers.Format.WMC.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
var style = {};
this.runChildNodes(style, node);
if(node.getAttribute("current") == "1") {
layerInfo.params.style = style.name;
// three style types to consider
// 1) linked SLD
// 2) inline SLD
// 3) named style
// running child nodes always gets name, optionally gets href or body
if(style.href) {
layerInfo.params.sld = style.href;
} else if(style.body) {
layerInfo.params.sld_body = style.body;
} else {
layerInfo.params.styles = style.name;
}
}
layerInfo.styles.push(style);
},
/**
* Method: read_wmc_SLD
*/
read_wmc_SLD: function(style, node) {
this.runChildNodes(style, node);
// style either comes back with an href or a body property
},
/**
* Method: read_sld_StyledLayerDescriptor
*/
read_sld_StyledLayerDescriptor: function(sld, node) {
var xml = OpenLayers.Format.XML.prototype.write.apply(this, [node]);
sld.body = xml;
},
/**
* Method: read_wmc_OnlineResource
@@ -731,13 +756,41 @@ OpenLayers.Format.WMC.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
var style = this.createElementDefaultNS(
"Style", null, {current: "1"}
);
var name = layer.params["STYLES"] ?
layer.params["STYLES"] : this.defaultStyleName;
style.appendChild(this.createElementDefaultNS("Name", name));
style.appendChild(this.createElementDefaultNS(
"Title", this.defaultStyleTitle
));
// Style can come from one of three places (prioritized as below):
// 1) an SLD parameter
// 2) and SLD_BODY parameter
// 3) the STYLES parameter
if(layer.params["SLD"]) {
// create link from SLD parameter
var sld = this.createElementDefaultNS("SLD");
var link = this.write_wmc_OnlineResource(layer.params["SLD"]);
sld.appendChild(link);
style.appendChild(sld);
} else if(layer.params["SLD_BODY"]) {
// include sld fragment from SLD_BODY parameter
var sld = this.createElementDefaultNS("SLD");
var body = layer.params["SLD_BODY"];
// read in body as xml doc - assume proper namespace declarations
var doc = OpenLayers.Format.XML.prototype.read.apply(this, [body]);
// append to StyledLayerDescriptor node
var imported = doc.documentElement;
if(sld.ownerDocument && sld.ownerDocument.importNode) {
imported = sld.ownerDocument.importNode(imported, true);
}
sld.appendChild(imported);
style.appendChild(sld);
} else {
// use name(s) from STYLES parameter
var name = layer.params["STYLES"] ?
layer.params["STYLES"] : this.defaultStyleName;
style.appendChild(this.createElementDefaultNS("Name", name));
style.appendChild(this.createElementDefaultNS(
"Title", this.defaultStyleTitle
));
}
node.appendChild(style);
return node;
},