Adding point, line, polygon, text, and raster symbolizer constructors. This paves the way for rendering multiple symbolizers per rule. The SLD parser now successfully round-trips documents with multiple symbolizers and multiple FeatureTypeStyle elements (through the symbolizer zIndex property). The Style2 (yes, ack) constructor is used to represent a collection of rules with multiple symbolizers. Style2 objects are currently only used by the SLD parser if the multipleSymbolizer property is set to true. Future enhancements to the renderers can be made to account for multiple symbolizers. r=ahocevar (closes #2760).

git-svn-id: http://svn.openlayers.org/trunk/openlayers@10560 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf
This commit is contained in:
Tim Schaub
2010-08-02 19:49:52 +00:00
parent 9fd7463680
commit 6c0952934f
21 changed files with 1498 additions and 55 deletions

View File

@@ -2,6 +2,11 @@
<head>
<script src="../../../lib/OpenLayers.js"></script>
<script type="text/javascript">
var xml = new OpenLayers.Format.XML();
function readXML(id) {
return xml.read(document.getElementById(id).firstChild.nodeValue);
}
var sld =
'<StyledLayerDescriptor version="1.0.0" ' +
@@ -439,9 +444,422 @@
t.xml_eq(got, expected, "Successfully round tripped RasterSymbolizer");
}
function test_zIndex(t) {
t.plan(1);
var format = new OpenLayers.Format.SLD.v1_0_0({
multipleSymbolizers: true
});
// three zIndex values -> three FeatureTypeStyle elements
var style = new OpenLayers.Style2({
rules: [
new OpenLayers.Rule({
filter: new OpenLayers.Filter.Comparison({
type: OpenLayers.Filter.Comparison.EQUAL_TO,
property: "foo",
value: "bar"
}),
minScaleDenominator: 100000,
maxScaleDenominator: 200000,
symbolizers: [
new OpenLayers.Symbolizer.Line({
strokeColor: "green",
strokeWidth: 2,
zIndex: 2
}),
new OpenLayers.Symbolizer.Line({
strokeColor: "red",
strokeWidth: 3,
zIndex: -1
}),
new OpenLayers.Symbolizer.Line({
strokeColor: "blue",
strokeWidth: 1,
zIndex: 5
})
]
}),
new OpenLayers.Rule({
filter: new OpenLayers.Filter.Comparison({
type: OpenLayers.Filter.Comparison.EQUAL_TO,
property: "foo",
value: "baz"
}),
symbolizers: [
new OpenLayers.Symbolizer.Line({
strokeColor: "#000000",
strokeWidth: 2,
zIndex: 2
})
]
})
]
});
var got = format.writeNode("sld:UserStyle", style);
var exp = readXML("zindex_test.sld").documentElement;
t.xml_eq(got, exp, "duplicated rules to write zIndex as FeatureTypeStyle elements");
}
function test_read_FeatureTypeStyles(t) {
t.plan(13);
var format = new OpenLayers.Format.SLD.v1_0_0({
multipleSymbolizers: true,
namedLayersAsArray: true
});
var doc = readXML("line_linewithborder.sld");
var obj = format.read(doc);
t.eq(obj.namedLayers.length, 1, "got one named layer");
var namedLayer = obj.namedLayers[0];
t.eq(namedLayer.userStyles.length, 1, "got one user style");
var userStyle = namedLayer.userStyles[0];
t.ok(userStyle instanceof OpenLayers.Style2, "user style represented with OpenLayers.Style2");
// check rules and symbolizers
var rule, symbolizer;
t.eq(userStyle.rules.length, 2, "pulled two rules (from two FeatureTypeStyle elements)");
rule = userStyle.rules[0];
t.ok(rule instanceof OpenLayers.Rule, "first rule is an OpenLayers.Rule");
t.eq(rule.symbolizers && rule.symbolizers.length, 1, "first rule has one symbolizer");
symbolizer = rule.symbolizers[0];
t.ok(symbolizer instanceof OpenLayers.Symbolizer, "first symbolizer in first rule is an OpenLayers.Symbolizer");
t.ok(symbolizer instanceof OpenLayers.Symbolizer.Line, "first symbolizer in first rule is an OpenLayers.Symbolizer.Line");
t.eq(symbolizer.zIndex, 0, "symbolizer from first FeatureTypeStyle element has zIndex 0");
rule = userStyle.rules[1];
t.eq(rule.symbolizers && rule.symbolizers.length, 1, "second rule has one symbolizer");
symbolizer = rule.symbolizers[0];
t.ok(symbolizer instanceof OpenLayers.Symbolizer, "first symbolizer in second rule is an OpenLayers.Symbolizer");
t.ok(symbolizer instanceof OpenLayers.Symbolizer.Line, "first symbolizer in second rule is an OpenLayers.Symbolizer.Line");
t.eq(symbolizer.zIndex, 1, "symbolizer from second FeatureTypeStyle element has zIndex 1");
}
function test_roundtrip(t) {
t.plan(5);
var format = new OpenLayers.Format.SLD.v1_0_0({
multipleSymbolizers: true,
namedLayersAsArray: true
});
var doc, out;
// two FeatureTypeStyle elements and line symbolizers
doc = readXML("line_linewithborder.sld");
out = format.write(format.read(doc));
t.xml_eq(out, doc.documentElement, "round-tripped line_linewithborder.sld");
// three FeatureTypeStyle elements and line symbolizers
doc = readXML("line_attributebasedline.sld");
out = format.write(format.read(doc));
t.xml_eq(out, doc.documentElement, "round-tripped line_attributebasedline.sld");
// point symbolizer and text symbolizer
doc = readXML("point_pointwithdefaultlabel.sld");
out = format.write(format.read(doc));
t.xml_eq(out, doc.documentElement, "round-tripped point_pointwithdefaultlabel.sld");
// polygon symbolizer with fill only
doc = readXML("polygon_simplepolygon.sld");
out = format.write(format.read(doc));
t.xml_eq(out, doc.documentElement, "round-tripped polygon_simplepolygon.sld");
// polygon symbolizer and text symbolizer with halo
doc = readXML("polygon_labelhalo.sld");
out = format.write(format.read(doc));
t.xml_eq(out, doc.documentElement, "round-tripped polygon_labelhalo.sld");
}
</script>
</head>
<body>
<div id="line_linewithborder.sld"><!--
<StyledLayerDescriptor version="1.0.0"
xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.0.0/StyledLayerDescriptor.xsd"
xmlns="http://www.opengis.net/sld"
xmlns:ogc="http://www.opengis.net/ogc"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<NamedLayer>
<Name>Line with border</Name>
<UserStyle>
<Title>SLD Cook Book: Line w2th border</Title>
<FeatureTypeStyle>
<Rule>
<LineSymbolizer>
<Stroke>
<CssParameter name="stroke">#333333</CssParameter>
<CssParameter name="stroke-width">5</CssParameter>
<CssParameter name="stroke-linecap">round</CssParameter>
</Stroke>
</LineSymbolizer>
</Rule>
</FeatureTypeStyle>
<FeatureTypeStyle>
<Rule>
<LineSymbolizer>
<Stroke>
<CssParameter name="stroke">#6699FF</CssParameter>
<CssParameter name="stroke-width">3</CssParameter>
<CssParameter name="stroke-linecap">round</CssParameter>
</Stroke>
</LineSymbolizer>
</Rule>
</FeatureTypeStyle>
</UserStyle>
</NamedLayer>
</StyledLayerDescriptor>
--></div>
<div id="line_attributebasedline.sld"><!--
<StyledLayerDescriptor version="1.0.0"
xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.0.0/StyledLayerDescriptor.xsd"
xmlns="http://www.opengis.net/sld"
xmlns:ogc="http://www.opengis.net/ogc"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<NamedLayer>
<Name>Attribute-based line</Name>
<UserStyle>
<Title>SLD Cook Book: Attribute-based line</Title>
<FeatureTypeStyle>
<Rule>
<Name>local-road</Name>
<ogc:Filter>
<ogc:PropertyIsEqualTo>
<ogc:PropertyName>type</ogc:PropertyName>
<ogc:Literal>local-road</ogc:Literal>
</ogc:PropertyIsEqualTo>
</ogc:Filter>
<LineSymbolizer>
<Stroke>
<CssParameter name="stroke">#009933</CssParameter>
<CssParameter name="stroke-width">2</CssParameter>
</Stroke>
</LineSymbolizer>
</Rule>
</FeatureTypeStyle>
<FeatureTypeStyle>
<Rule>
<Name>secondary</Name>
<ogc:Filter>
<ogc:PropertyIsEqualTo>
<ogc:PropertyName>type</ogc:PropertyName>
<ogc:Literal>secondary</ogc:Literal>
</ogc:PropertyIsEqualTo>
</ogc:Filter>
<LineSymbolizer>
<Stroke>
<CssParameter name="stroke">#0055CC</CssParameter>
<CssParameter name="stroke-width">3</CssParameter>
</Stroke>
</LineSymbolizer>
</Rule>
</FeatureTypeStyle>
<FeatureTypeStyle>
<Rule>
<Name>highway</Name>
<ogc:Filter>
<ogc:PropertyIsEqualTo>
<ogc:PropertyName>type</ogc:PropertyName>
<ogc:Literal>highway</ogc:Literal>
</ogc:PropertyIsEqualTo>
</ogc:Filter>
<LineSymbolizer>
<Stroke>
<CssParameter name="stroke">#FF0000</CssParameter>
<CssParameter name="stroke-width">6</CssParameter>
</Stroke>
</LineSymbolizer>
</Rule>
</FeatureTypeStyle>
</UserStyle>
</NamedLayer>
</StyledLayerDescriptor>
--></div>
<div id="point_pointwithdefaultlabel.sld"><!--
<StyledLayerDescriptor version="1.0.0"
xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.0.0/StyledLayerDescriptor.xsd"
xmlns="http://www.opengis.net/sld"
xmlns:ogc="http://www.opengis.net/ogc"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<NamedLayer>
<Name>Point with default label</Name>
<UserStyle>
<Title>GeoServer SLD Cook Book: Point with default label</Title>
<FeatureTypeStyle>
<Rule>
<PointSymbolizer>
<Graphic>
<Mark>
<WellKnownName>circle</WellKnownName>
<Fill>
<CssParameter name="fill">#FF0000</CssParameter>
</Fill>
</Mark>
<Size>6</Size>
</Graphic>
</PointSymbolizer>
<TextSymbolizer>
<Label>
<ogc:PropertyName>name</ogc:PropertyName>
</Label>
<Fill>
<CssParameter name="fill">#000000</CssParameter>
</Fill>
</TextSymbolizer>
</Rule>
</FeatureTypeStyle>
</UserStyle>
</NamedLayer>
</StyledLayerDescriptor>
--></div>
<div id="polygon_simplepolygon.sld"><!--
<StyledLayerDescriptor version="1.0.0"
xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.0.0/StyledLayerDescriptor.xsd"
xmlns="http://www.opengis.net/sld"
xmlns:ogc="http://www.opengis.net/ogc"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<NamedLayer>
<Name>Simple polygon</Name>
<UserStyle>
<Title>SLD Cook Book: Simple polygon</Title>
<FeatureTypeStyle>
<Rule>
<PolygonSymbolizer>
<Fill>
<CssParameter name="fill">#000080</CssParameter>
</Fill>
</PolygonSymbolizer>
</Rule>
</FeatureTypeStyle>
</UserStyle>
</NamedLayer>
</StyledLayerDescriptor>
--></div>
<div id="polygon_labelhalo.sld"><!--
<StyledLayerDescriptor version="1.0.0"
xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.0.0/StyledLayerDescriptor.xsd"
xmlns="http://www.opengis.net/sld"
xmlns:ogc="http://www.opengis.net/ogc"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<NamedLayer>
<Name>Label halo</Name>
<UserStyle>
<Title>SLD Cook Book: Label halo</Title>
<FeatureTypeStyle>
<Rule>
<PolygonSymbolizer>
<Fill>
<CssParameter name="fill">#40FF40</CssParameter>
</Fill>
<Stroke>
<CssParameter name="stroke">#FFFFFF</CssParameter>
<CssParameter name="stroke-width">2</CssParameter>
</Stroke>
</PolygonSymbolizer>
<TextSymbolizer>
<Label>
<ogc:PropertyName>name</ogc:PropertyName>
</Label>
<Halo>
<Radius>3</Radius>
<Fill>
<CssParameter name="fill">#FFFFFF</CssParameter>
</Fill>
</Halo>
</TextSymbolizer>
</Rule>
</FeatureTypeStyle>
</UserStyle>
</NamedLayer>
</StyledLayerDescriptor>
--></div>
<div id="zindex_test.sld"><!--
<sld:UserStyle xmlns:sld="http://www.opengis.net/sld">
<sld:FeatureTypeStyle>
<sld:Rule>
<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
<ogc:PropertyIsEqualTo>
<ogc:PropertyName>foo</ogc:PropertyName>
<ogc:Literal>bar</ogc:Literal>
</ogc:PropertyIsEqualTo>
</ogc:Filter>
<sld:MinScaleDenominator>100000</sld:MinScaleDenominator>
<sld:MaxScaleDenominator>200000</sld:MaxScaleDenominator>
<sld:LineSymbolizer>
<sld:Stroke>
<sld:CssParameter name="stroke">red</sld:CssParameter>
<sld:CssParameter name="stroke-width">3</sld:CssParameter>
</sld:Stroke>
</sld:LineSymbolizer>
</sld:Rule>
</sld:FeatureTypeStyle>
<sld:FeatureTypeStyle>
<sld:Rule>
<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
<ogc:PropertyIsEqualTo>
<ogc:PropertyName>foo</ogc:PropertyName>
<ogc:Literal>bar</ogc:Literal>
</ogc:PropertyIsEqualTo>
</ogc:Filter>
<sld:MinScaleDenominator>100000</sld:MinScaleDenominator>
<sld:MaxScaleDenominator>200000</sld:MaxScaleDenominator>
<sld:LineSymbolizer>
<sld:Stroke>
<sld:CssParameter name="stroke">green</sld:CssParameter>
<sld:CssParameter name="stroke-width">2</sld:CssParameter>
</sld:Stroke>
</sld:LineSymbolizer>
</sld:Rule>
<sld:Rule>
<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
<ogc:PropertyIsEqualTo>
<ogc:PropertyName>foo</ogc:PropertyName>
<ogc:Literal>baz</ogc:Literal>
</ogc:PropertyIsEqualTo>
</ogc:Filter>
<sld:LineSymbolizer>
<sld:Stroke>
<sld:CssParameter name="stroke">#000000</sld:CssParameter>
<sld:CssParameter name="stroke-width">2</sld:CssParameter>
</sld:Stroke>
</sld:LineSymbolizer>
</sld:Rule>
</sld:FeatureTypeStyle>
<sld:FeatureTypeStyle>
<sld:Rule>
<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
<ogc:PropertyIsEqualTo>
<ogc:PropertyName>foo</ogc:PropertyName>
<ogc:Literal>bar</ogc:Literal>
</ogc:PropertyIsEqualTo>
</ogc:Filter>
<sld:MinScaleDenominator>100000</sld:MinScaleDenominator>
<sld:MaxScaleDenominator>200000</sld:MaxScaleDenominator>
<sld:LineSymbolizer>
<sld:Stroke>
<sld:CssParameter name="stroke">blue</sld:CssParameter>
<sld:CssParameter name="stroke-width">1</sld:CssParameter>
</sld:Stroke>
</sld:LineSymbolizer>
</sld:Rule>
</sld:FeatureTypeStyle>
</sld:UserStyle>
--></div>
</body>
</html>

View File

@@ -43,7 +43,7 @@
function test_clone(t) {
t.plan(7);
t.plan(9);
var rule = new OpenLayers.Rule({
name: "test rule",
@@ -81,6 +81,30 @@
rule.destroy();
clone.destroy();
// test multiple symbolizers
rule = new OpenLayers.Rule({
name: "test rule",
minScaleDenominator: 10,
maxScaleDenominator: 20,
filter: new OpenLayers.Filter.Comparison({
type: OpenLayers.Filter.Comparison.EQUAL_TO,
property: "prop",
value: "value"
}),
symbolizers: [
new OpenLayers.Symbolizer.Line({
strokeColor: "black"
})
]
});
clone = rule.clone();
t.eq(clone.symbolizers.length, 1, "clone has one symbolizer");
t.ok(clone.symbolizers[0] !== rule.symbolizers[0], "clone has different symbolizers than original");
clone.destroy();
rule.destroy();
}

56
tests/Style2.html Normal file
View File

@@ -0,0 +1,56 @@
<html>
<head>
<script src="../lib/OpenLayers.js"></script>
<script type="text/javascript">
function test_constructor(t) {
t.plan(4);
var rules = [
new OpenLayers.Rule({
symbolizer: {fillColor: "red"},
filter: new OpenLayers.Filter.Comparison({
type: OpenLayers.Filter.Comparison.EQUAL_TO,
property: "type",
value: "fire engine"
})
}),
new OpenLayers.Rule({
symbolizer: {fillColor: "yellow"},
filter: new OpenLayers.Filter.Comparison({
type: OpenLayers.Filter.Comparison.EQUAL_TO,
property: "type",
value: "sports car"
})
})
];
var style = new OpenLayers.Style2({rules: rules});
t.ok(style instanceof OpenLayers.Style2, "correct type");
t.eq(style.rules.length, 2, "correct number of rules added");
t.ok(style.rules[0] === rules[0], "correct first rule added");
t.ok(style.rules[1] === rules[1], "correct second rule added");
}
function test_destroy(t) {
t.plan(1);
var style = new OpenLayers.Style2({
rules: [
new OpenLayers.Rule({
symbolizers: [
new OpenLayers.Symbolizer.Point({
fillColor: "fuchsia"
})
]
})
]
});
style.destroy();
t.ok(!style.rules, "rules array gone");
}
</script>
</head>
<body></body>
</html>

31
tests/Symbolizer.html Normal file
View File

@@ -0,0 +1,31 @@
<html>
<head>
<script src="../lib/OpenLayers.js"></script>
<script type="text/javascript">
function test_constructor(t) {
t.plan(2);
var symbolizer = new OpenLayers.Symbolizer({foo: "bar"});
t.ok(symbolizer instanceof OpenLayers.Symbolizer, "correct type");
t.eq(symbolizer.foo, "bar", "constructor applies config properties");
}
function test_clone(t) {
t.plan(2);
var symbolizer = new OpenLayers.Symbolizer({foo: "bar"});
var clone = symbolizer.clone();
t.ok(clone instanceof OpenLayers.Symbolizer, "correct type");
t.eq(clone.foo, "bar", "clone copies properties");
}
</script>
</head>
<body></body>
</html>

View File

@@ -0,0 +1,32 @@
<html>
<head>
<script src="../../lib/OpenLayers.js"></script>
<script type="text/javascript">
function test_constructor(t) {
t.plan(3);
var symbolizer = new OpenLayers.Symbolizer.Line({foo: "bar"});
t.ok(symbolizer instanceof OpenLayers.Symbolizer, "instance of OpenLayers.Symbolizer");
t.ok(symbolizer instanceof OpenLayers.Symbolizer.Line, "instance of OpenLayers.Symbolizer.Line");
t.eq(symbolizer.foo, "bar", "constructor applies config properties");
}
function test_clone(t) {
t.plan(2);
var symbolizer = new OpenLayers.Symbolizer.Line({foo: "bar"});
var clone = symbolizer.clone();
t.ok(clone instanceof OpenLayers.Symbolizer.Line, "correct type");
t.eq(clone.foo, "bar", "clone copies properties");
}
</script>
</head>
<body></body>
</html>

View File

@@ -0,0 +1,32 @@
<html>
<head>
<script src="../../lib/OpenLayers.js"></script>
<script type="text/javascript">
function test_constructor(t) {
t.plan(3);
var symbolizer = new OpenLayers.Symbolizer.Point({foo: "bar"});
t.ok(symbolizer instanceof OpenLayers.Symbolizer, "instance of OpenLayers.Symbolizer");
t.ok(symbolizer instanceof OpenLayers.Symbolizer.Point, "instance of OpenLayers.Symbolizer.Point");
t.eq(symbolizer.foo, "bar", "constructor applies config properties");
}
function test_clone(t) {
t.plan(2);
var symbolizer = new OpenLayers.Symbolizer.Point({foo: "bar"});
var clone = symbolizer.clone();
t.ok(clone instanceof OpenLayers.Symbolizer.Point, "correct type");
t.eq(clone.foo, "bar", "clone copies properties");
}
</script>
</head>
<body></body>
</html>

View File

@@ -0,0 +1,32 @@
<html>
<head>
<script src="../../lib/OpenLayers.js"></script>
<script type="text/javascript">
function test_constructor(t) {
t.plan(3);
var symbolizer = new OpenLayers.Symbolizer.Polygon({foo: "bar"});
t.ok(symbolizer instanceof OpenLayers.Symbolizer, "instance of OpenLayers.Symbolizer");
t.ok(symbolizer instanceof OpenLayers.Symbolizer.Polygon, "instance of OpenLayers.Symbolizer.Polygon");
t.eq(symbolizer.foo, "bar", "constructor applies config properties");
}
function test_clone(t) {
t.plan(2);
var symbolizer = new OpenLayers.Symbolizer.Polygon({foo: "bar"});
var clone = symbolizer.clone();
t.ok(clone instanceof OpenLayers.Symbolizer.Polygon, "correct type");
t.eq(clone.foo, "bar", "clone copies properties");
}
</script>
</head>
<body></body>
</html>

View File

@@ -0,0 +1,32 @@
<html>
<head>
<script src="../../lib/OpenLayers.js"></script>
<script type="text/javascript">
function test_constructor(t) {
t.plan(3);
var symbolizer = new OpenLayers.Symbolizer.Raster({foo: "bar"});
t.ok(symbolizer instanceof OpenLayers.Symbolizer, "instance of OpenLayers.Symbolizer");
t.ok(symbolizer instanceof OpenLayers.Symbolizer.Raster, "instance of OpenLayers.Symbolizer.Raster");
t.eq(symbolizer.foo, "bar", "constructor applies config properties");
}
function test_clone(t) {
t.plan(2);
var symbolizer = new OpenLayers.Symbolizer.Raster({foo: "bar"});
var clone = symbolizer.clone();
t.ok(clone instanceof OpenLayers.Symbolizer.Raster, "correct type");
t.eq(clone.foo, "bar", "clone copies properties");
}
</script>
</head>
<body></body>
</html>

View File

@@ -0,0 +1,32 @@
<html>
<head>
<script src="../../lib/OpenLayers.js"></script>
<script type="text/javascript">
function test_constructor(t) {
t.plan(3);
var symbolizer = new OpenLayers.Symbolizer.Text({foo: "bar"});
t.ok(symbolizer instanceof OpenLayers.Symbolizer, "instance of OpenLayers.Symbolizer");
t.ok(symbolizer instanceof OpenLayers.Symbolizer.Text, "instance of OpenLayers.Symbolizer.Text");
t.eq(symbolizer.foo, "bar", "constructor applies config properties");
}
function test_clone(t) {
t.plan(2);
var symbolizer = new OpenLayers.Symbolizer.Text({foo: "bar"});
var clone = symbolizer.clone();
t.ok(clone instanceof OpenLayers.Symbolizer.Text, "correct type");
t.eq(clone.foo, "bar", "clone copies properties");
}
</script>
</head>
<body></body>
</html>

View File

@@ -182,7 +182,14 @@
<li>Strategy/Save.html</li>
<li>Strategy/Refresh.html</li>
<li>Style.html</li>
<li>Style2.html</li>
<li>StyleMap.html</li>
<li>Symbolizer.html</li>
<li>Symbolizer/Line.html</li>
<li>Symbolizer/Point.html</li>
<li>Symbolizer/Polygon.html</li>
<li>Symbolizer/Raster.html</li>
<li>Symbolizer/Text.html</li>
<li>Tile.html</li>
<li>Tile/Image.html</li>
<li>Tile/Image/IFrame.html</li>