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;
},

View 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>

View File

@@ -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>