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) {
|
||||
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;
|
||||
},
|
||||
|
||||
200
tests/Format/WMC/test_v1.html
Normal file
200
tests/Format/WMC/test_v1.html
Normal file
@@ -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_WMC.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>test_Icon.html</li>
|
||||
<li>test_Marker.html</li>
|
||||
|
||||
Reference in New Issue
Block a user