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:
@@ -122,9 +122,7 @@ OpenLayers.Format.WMC.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
|
|||||||
for(var i=0; i<children.length; ++i) {
|
for(var i=0; i<children.length; ++i) {
|
||||||
childNode = children[i];
|
childNode = children[i];
|
||||||
if(childNode.nodeType == 1) {
|
if(childNode.nodeType == 1) {
|
||||||
prefix = (childNode.prefix == this.rootPrefix) ?
|
prefix = this.getNamespacePrefix(childNode.namespaceURI);
|
||||||
this.defaultPrefix :
|
|
||||||
this.getNamespacePrefix(childNode.namespaceURI);
|
|
||||||
local = childNode.nodeName.split(":").pop();
|
local = childNode.nodeName.split(":").pop();
|
||||||
processor = this["read_" + prefix + "_" + local];
|
processor = this["read_" + prefix + "_" + local];
|
||||||
if(processor) {
|
if(processor) {
|
||||||
@@ -312,10 +310,37 @@ OpenLayers.Format.WMC.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
|
|||||||
var style = {};
|
var style = {};
|
||||||
this.runChildNodes(style, node);
|
this.runChildNodes(style, node);
|
||||||
if(node.getAttribute("current") == "1") {
|
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);
|
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
|
* Method: read_wmc_OnlineResource
|
||||||
@@ -731,13 +756,41 @@ OpenLayers.Format.WMC.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
|
|||||||
var style = this.createElementDefaultNS(
|
var style = this.createElementDefaultNS(
|
||||||
"Style", null, {current: "1"}
|
"Style", null, {current: "1"}
|
||||||
);
|
);
|
||||||
var name = layer.params["STYLES"] ?
|
|
||||||
layer.params["STYLES"] : this.defaultStyleName;
|
|
||||||
|
|
||||||
style.appendChild(this.createElementDefaultNS("Name", name));
|
// Style can come from one of three places (prioritized as below):
|
||||||
style.appendChild(this.createElementDefaultNS(
|
// 1) an SLD parameter
|
||||||
"Title", this.defaultStyleTitle
|
// 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);
|
node.appendChild(style);
|
||||||
return node;
|
return node;
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -0,0 +1,200 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<script src="../../../lib/OpenLayers.js"></script>
|
||||||
|
<script type="text/javascript">
|
||||||
|
|
||||||
|
function test_write_wmc_StyleList(t) {
|
||||||
|
t.plan(3);
|
||||||
|
|
||||||
|
var layer, got, expected;
|
||||||
|
|
||||||
|
var parser = new OpenLayers.Format.WMC.v1();
|
||||||
|
var name = "test";
|
||||||
|
var url = "http://foo";
|
||||||
|
|
||||||
|
// test named style
|
||||||
|
layer = new OpenLayers.Layer.WMS(name, url, {
|
||||||
|
styles: "mystyle"
|
||||||
|
});
|
||||||
|
got = parser.write_wmc_StyleList(layer);
|
||||||
|
expected =
|
||||||
|
"<StyleList xmlns='http://www.opengis.net/context'>" +
|
||||||
|
"<Style current='1'>" +
|
||||||
|
"<Name>mystyle</Name><Title>Default</Title>" +
|
||||||
|
"</Style>" +
|
||||||
|
"</StyleList>";
|
||||||
|
|
||||||
|
t.xml_eq(got, expected, "named style correctly written");
|
||||||
|
layer.destroy();
|
||||||
|
|
||||||
|
// test linked style
|
||||||
|
layer = new OpenLayers.Layer.WMS(name, url, {
|
||||||
|
sld: "http://linked.sld"
|
||||||
|
});
|
||||||
|
got = parser.write_wmc_StyleList(layer);
|
||||||
|
expected =
|
||||||
|
"<StyleList xmlns='http://www.opengis.net/context'>" +
|
||||||
|
"<Style current='1'>" +
|
||||||
|
"<SLD>" +
|
||||||
|
"<OnlineResource xmlns:xlink='http://www.w3.org/1999/xlink' "+
|
||||||
|
"xlink:type='simple' " +
|
||||||
|
"xlink:href='http://linked.sld' />" +
|
||||||
|
"</SLD>" +
|
||||||
|
"</Style>" +
|
||||||
|
"</StyleList>";
|
||||||
|
|
||||||
|
t.xml_eq(got, expected, "linked style correctly written");
|
||||||
|
layer.destroy();
|
||||||
|
|
||||||
|
// test inline style
|
||||||
|
layer = new OpenLayers.Layer.WMS(name, url, {
|
||||||
|
sld_body:
|
||||||
|
"<sld:StyledLayerDescriptor version='1.0.0' " +
|
||||||
|
"xmlns:ogc='http://www.opengis.net/ogc' " +
|
||||||
|
"xmlns:sld='http://www.opengis.net/sld' " +
|
||||||
|
"xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' " +
|
||||||
|
"xsi:schemaLocation='http://www.opengis.net/sld http://schemas.opengeospatial.net/sld/1.0.0/StyledLayerDescriptor.xsd'>" +
|
||||||
|
"<sld:NamedLayer>" +
|
||||||
|
"<sld:Name>AAA212</sld:Name>" +
|
||||||
|
"<sld:UserStyle>" +
|
||||||
|
"<sld:FeatureTypeStyle>" +
|
||||||
|
"<sld:Rule>" +
|
||||||
|
"<sld:TextSymbolizer>" +
|
||||||
|
"<sld:Label>" +
|
||||||
|
"<ogc:PropertyName>ZONENR</ogc:PropertyName>" +
|
||||||
|
"</sld:Label>" +
|
||||||
|
"<sld:Font>" +
|
||||||
|
"<sld:CssParameter name='font-family'>Arial</sld:CssParameter>" +
|
||||||
|
"<sld:CssParameter name='font-size'>10</sld:CssParameter>" +
|
||||||
|
"</sld:Font>" +
|
||||||
|
"<sld:Fill>" +
|
||||||
|
"<sld:CssParameter name='fill'>#FF9900</sld:CssParameter>" +
|
||||||
|
"</sld:Fill>" +
|
||||||
|
"</sld:TextSymbolizer>" +
|
||||||
|
"</sld:Rule>" +
|
||||||
|
"</sld:FeatureTypeStyle>" +
|
||||||
|
"</sld:UserStyle>" +
|
||||||
|
"</sld:NamedLayer>" +
|
||||||
|
"</sld:StyledLayerDescriptor>"
|
||||||
|
});
|
||||||
|
|
||||||
|
got = parser.write_wmc_StyleList(layer);
|
||||||
|
expected =
|
||||||
|
"<StyleList xmlns='http://www.opengis.net/context'>" +
|
||||||
|
"<Style current='1'>" +
|
||||||
|
"<SLD>" +
|
||||||
|
"<sld:StyledLayerDescriptor version='1.0.0' " +
|
||||||
|
"xmlns:sld='http://www.opengis.net/sld' " +
|
||||||
|
"xmlns:ogc='http://www.opengis.net/ogc' " +
|
||||||
|
"xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' " +
|
||||||
|
"xsi:schemaLocation='http://www.opengis.net/sld http://schemas.opengeospatial.net/sld/1.0.0/StyledLayerDescriptor.xsd'>" +
|
||||||
|
"<sld:NamedLayer>" +
|
||||||
|
"<sld:Name>AAA212</sld:Name>" +
|
||||||
|
"<sld:UserStyle>" +
|
||||||
|
"<sld:FeatureTypeStyle>" +
|
||||||
|
"<sld:Rule>" +
|
||||||
|
"<sld:TextSymbolizer>" +
|
||||||
|
"<sld:Label>" +
|
||||||
|
"<ogc:PropertyName>ZONENR</ogc:PropertyName>" +
|
||||||
|
"</sld:Label>" +
|
||||||
|
"<sld:Font>" +
|
||||||
|
"<sld:CssParameter name='font-family'>Arial</sld:CssParameter>" +
|
||||||
|
"<sld:CssParameter name='font-size'>10</sld:CssParameter>" +
|
||||||
|
"</sld:Font>" +
|
||||||
|
"<sld:Fill>" +
|
||||||
|
"<sld:CssParameter name='fill'>#FF9900</sld:CssParameter>" +
|
||||||
|
"</sld:Fill>" +
|
||||||
|
"</sld:TextSymbolizer>" +
|
||||||
|
"</sld:Rule>" +
|
||||||
|
"</sld:FeatureTypeStyle>" +
|
||||||
|
"</sld:UserStyle>" +
|
||||||
|
"</sld:NamedLayer>" +
|
||||||
|
"</sld:StyledLayerDescriptor>" +
|
||||||
|
"</SLD>" +
|
||||||
|
"</Style>" +
|
||||||
|
"</StyleList>";
|
||||||
|
|
||||||
|
t.xml_eq(got, expected, "inline style correctly written");
|
||||||
|
layer.destroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
function test_read_wmc_StyleList(t) {
|
||||||
|
t.plan(3);
|
||||||
|
|
||||||
|
var xml = new OpenLayers.Format.XML();
|
||||||
|
var parser = new OpenLayers.Format.WMC.v1();
|
||||||
|
var node, text, layerInfo;
|
||||||
|
|
||||||
|
// test named style
|
||||||
|
text =
|
||||||
|
"<StyleList xmlns='http://www.opengis.net/context'>" +
|
||||||
|
"<Style current='1'>" +
|
||||||
|
"<Name>mystyle</Name><Title>Default</Title>" +
|
||||||
|
"</Style>" +
|
||||||
|
"</StyleList>";
|
||||||
|
node = xml.read(text).documentElement;
|
||||||
|
layerInfo = {
|
||||||
|
params: {},
|
||||||
|
styles: []
|
||||||
|
};
|
||||||
|
parser.read_wmc_StyleList(layerInfo, node);
|
||||||
|
t.eq(layerInfo.params.styles, "mystyle", "named style correctly read");
|
||||||
|
|
||||||
|
// test linked style
|
||||||
|
text =
|
||||||
|
"<StyleList xmlns='http://www.opengis.net/context'>" +
|
||||||
|
"<Style current='1'>" +
|
||||||
|
"<SLD>" +
|
||||||
|
"<OnlineResource xmlns:xlink='http://www.w3.org/1999/xlink' "+
|
||||||
|
"xlink:type='simple' " +
|
||||||
|
"xlink:href='http://linked.sld' />" +
|
||||||
|
"</SLD>" +
|
||||||
|
"</Style>" +
|
||||||
|
"</StyleList>";
|
||||||
|
node = xml.read(text).documentElement;
|
||||||
|
layerInfo = {
|
||||||
|
params: {},
|
||||||
|
styles: []
|
||||||
|
};
|
||||||
|
parser.read_wmc_StyleList(layerInfo, node);
|
||||||
|
t.eq(layerInfo.params.sld, "http://linked.sld", "linked style correctly read");
|
||||||
|
|
||||||
|
// test inline style
|
||||||
|
// any valid xml under the StyledLayerDescriptor node should make the
|
||||||
|
// round trip from string to node and back
|
||||||
|
text =
|
||||||
|
"<StyleList xmlns='http://www.opengis.net/context'>" +
|
||||||
|
"<Style current='1'>" +
|
||||||
|
"<SLD>" +
|
||||||
|
"<sld:StyledLayerDescriptor version='1.0.0' " +
|
||||||
|
"xmlns:sld='http://www.opengis.net/sld' " +
|
||||||
|
"xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' " +
|
||||||
|
"xsi:schemaLocation='http://www.opengis.net/sld http://schemas.opengeospatial.net/sld/1.0.0/StyledLayerDescriptor.xsd'>" +
|
||||||
|
"<foo>bar<more/></foo>" +
|
||||||
|
"</sld:StyledLayerDescriptor>" +
|
||||||
|
"</SLD>" +
|
||||||
|
"</Style>" +
|
||||||
|
"</StyleList>";
|
||||||
|
node = xml.read(text).documentElement;
|
||||||
|
layerInfo = {
|
||||||
|
params: {},
|
||||||
|
styles: []
|
||||||
|
};
|
||||||
|
parser.read_wmc_StyleList(layerInfo, node);
|
||||||
|
var expected =
|
||||||
|
"<sld:StyledLayerDescriptor version='1.0.0' " +
|
||||||
|
"xmlns:sld='http://www.opengis.net/sld' " +
|
||||||
|
"xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' " +
|
||||||
|
"xsi:schemaLocation='http://www.opengis.net/sld http://schemas.opengeospatial.net/sld/1.0.0/StyledLayerDescriptor.xsd'>" +
|
||||||
|
"<foo xmlns='http://www.opengis.net/context'>bar<more/></foo>" +
|
||||||
|
"</sld:StyledLayerDescriptor>";
|
||||||
|
t.xml_eq(layerInfo.params.sld_body, expected, "inline style correctly read");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -32,6 +32,7 @@
|
|||||||
<li>Format/test_WKT.html</li>
|
<li>Format/test_WKT.html</li>
|
||||||
<li>Format/test_WMC.html</li>
|
<li>Format/test_WMC.html</li>
|
||||||
<li>Format/WMC/test_v1_1_0.html</li>
|
<li>Format/WMC/test_v1_1_0.html</li>
|
||||||
|
<li>Format/WMC/test_v1.html</li>
|
||||||
<li>Format/test_XML.html</li>
|
<li>Format/test_XML.html</li>
|
||||||
<li>test_Icon.html</li>
|
<li>test_Icon.html</li>
|
||||||
<li>test_Marker.html</li>
|
<li>test_Marker.html</li>
|
||||||
|
|||||||
Reference in New Issue
Block a user