blob: 5e2c08690a381b7ad3440fd8dd21a46f456b972f [file] [log] [blame]
Title: SVG 1.2 support
#SVG 1.2 support
This page details information atbout Batiks implementation of features from SVG 1.2, [Tiny](http://www.w3.org/TR/SVGTiny12/) and [Full](http://www.w3.org/TR/SVG12/). Note that the information on this page is based on the code in the Git repository main.
## DOM Level 3 { #dom3}
DOM Level 3 [Core](http://www.w3.org/TR/DOM-Level-3-Core/), [Events](http://www.w3.org/TR/DOM-Level-3-Events/) and [XPath](http://www.w3.org/TR/DOM-Level-3-XPath/) are all supported. These features are available regardless of whether the document has `version="1.1"` or `version="1.2"` set on the root `svg` element.
There are a few issues with the DOM Level 3 Core implementation:
1. The `Document.compareDocumentPosition` method does not give the correct result when used on DTD notation or entity nodes in the document.
1. `Node.renameNode` always creates a new node and replaces the old node with it. This is technically allowed, but sub-optimal.
1. XML Schema information is never used. Batik does not implement XML Schema, so any methods or attributes that would utilise or expose schema information (such as the `schemaTypeInfo` attribute on the `Attr` and `Element` interfaces) do not do so.
1. `Document.normalizeDocument` ignores the `"entities"` parameter in the documents `DOMConfiguration`.
### Using DOM Level 3 functionality from Java { #dom3java}
JREs before 1.5 include the DOM Level 2 interfaces and this can cause problems when trying to use the DOM Level 3 versions of these same interface files (`org.w3c.dom.*`). Though the concrete Batik DOM classes implement the DOM Level 3 functionality, you wont be able to access those methods through the `org.w3c.dom` interfaces on these earlier JREs.
There are two ways to overcome this problem. The first is to install the DOM Level 3 interfaces using the [Endorsed Standards Override Mechanism](https://docs.oracle.com/javase/6/docs/technotes/guides/standards/). Copy the file `lib/xml-apis-ext.jar` into the endorsed standards override directory and the DOM Level 3 interfaces will be visible. You can then write code against them (for example, call `Document.renameNode` directly). However, this will mean that other people cannot run or compile your code unless they have JRE 1.5 or later, or they have also installed the `xml-apis-ext.jar` in the same way.
The second method, which requires less messing about with the JRE, is to cast your DOM objects to the concrete Batik DOM objects and call your DOM Level 3 methods directly on them. The Batik DOM classes are in the `org.apache.batik.dom` package. The classes named `Abstract*` implement the DOM interfaces, and also contain the DOM Level 3 methods. The advantage of this method is that for your code to compile and run in others environments, they need not install any jars with the endorsed standards overrides.
Here is an example of using the second method to get access to DOM Level 3 specific methods:
:::java
import org.apache.batik.dom.AbstractDocument;
import org.apache.batik.dom.svg.SVGDOMImplementation;
import org.w3c.dom.DOMImplementation;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
public class C {
public void f() {
// Create a new SVG document
DOMImplementation impl = SVGDOMImplementation.getDOMImplementation();
Document doc = impl.createDocument("http://www.w3.org/2000/svg", "svg", null);
// Create a 'g' element and append it to the root 'svg' element
Element e = doc.createElementNS("http://www.w3.org/2000/svg", "g");
doc.getDocumentElement().appendChild(e);
// Cast the document object to org.apache.batik.dom.AbstractDocument,
// so that DOM 3 methods will be guaranteed to be visible
AbstractDocument document = (AbstractDocument) doc;
// Now a DOM 3 method can be used
document.renameNode(e, "http://www.w3.org/2000/svg", "text");
}
}
For cases where the DOM Level 3 versions of these interfaces contain constants that you wish to use, the constants have been copied into the Batik DOM classes. For example:
:::java
import org.apache.batik.dom.AbstractNode;
import org.apache.batik.dom.svg.SVGDOMImplementation;
import org.w3c.dom.DOMImplementation;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
public class C {
public void f() {
// Create a new SVG document
DOMImplementation impl = SVGDOMImplementation.getDOMImplementation();
Document doc = impl.createDocument("http://www.w3.org/2000/svg", "svg", null);
// Create a 'g' element and append it to the root 'svg' element
Element svg = doc.getDocumentElement();
Element e = doc.createElementNS("http://www.w3.org/2000/svg", "g");
svg.appendChild(e);
AbstractNode n1 = (AbstractNode) svg;
AbstractNode n2 = (AbstractNode) e;
int position = n1.compareDocumentPosition(n2);
if (position == AbstractNode.DOCUMENT_POSITION_PRECEDING
| AbstractNode.DOCUMENT_POSITION_CONTAINS) {
System.out.println("The svg element contains the g element.");
} else {
System.out.println("Something is wrong!");
}
}
}
Note that using these org.apache.batik.dom interfaces is only needed for the DOM Level 3 Core and Events interfaces. There were no earlier versions of the DOM XPath interfaces to conflict with, so these can be used directly (`org.w3c.dom.xpath`).
Of course, none of this matters if you are just using the DOM 3 functionality in ECMAScript, as the matter of interfaces is hidden from the scripting environment.
## XML Binding Language for SVG (sXBL) { #sxbl}
sXBL is supported in documents with `version="1.2"`. However, the following issues exist:
1. sXBL cannot be used for [SVG resources](http://www.w3.org/TR/2004/WD-SVG12-20041027/binding.html#sXBL-bindings-for-svg) or [visual effects](http://www.w3.org/TR/2004/WD-SVG12-20041027/binding.html#sXBL-bindings-for-visual-effects).
1. The `traitDef` element is not implemented.
1. The [handling of CSS](http://www.w3.org/TR/sXBL/#shadow0) is probably not quite correct.
Two content selector languages are supported: XPath 1.0 Patterns and the drastically reduced XPath subset. XPath Patterns is the default language. To change the language used to the XPath subset, put an attribute `batik:selectorLanguage="XPathSubset"` on the `xbl:content` element or on the `svg` document element. (The `batik` extension namespace prefix should be declared with `xmlns:batik="http://xml.apache.org/batik/ext"`.)
Note that sXBL is likely to be dropped in favor of [XBL 2.0](http://www.w3.org/TR/xbl2) in [SVG 1.2 Full](http://www.w3.org/TR/SVG12/).
## Flowing text and graphics { #flowtext}
The `flowRoot`, `flowRegion`, `flowDiv`, `flowPara`, `flowSpan`, `flowRegionBreak` and `flowLine` elements from [SVG 1.2 Full](http://www.w3.org/TR/SVG12/) ’s [Flowing Text and Graphics](http://www.w3.org/TR/2004/WD-SVG12-20041027/flow.html) chapter are supported in documents with `version="1.2"`.
The more recent [SVG 1.2 Tiny](http://www.w3.org/TR/SVGTiny12/) draft specifies a different syntax for (a more restricted version of) flowing text, and the full flowing text syntax is therefore likely to change.
## Other SVG 1.2 features { #other}
The following other features from SVG 1.2 are supported:
- the [paint server element,](http://www.w3.org/TR/SVGTiny12/painting.html#SolidColorElement)
- the `multiImage`, `subImageRef` and `subImage` elements for [Alternate content based on display resolutions](http://www.w3.org/TR/2004/WD-SVG12-20041027/media.html#multires),
- the XML Events [element](http://www.w3.org/TR/SVGTiny12/script.html#HandlerElement),
- self-contained [resource documents](http://www.w3.org/TR/2004/WD-SVG12-20041027/nonvisual.html#external-references),
- the mouse [wheel event](http://www.w3.org/TR/2004/WD-SVG12-20041027/dom.html#wheelevent) (which is likely to be superseded by a similar event developed by the W3C WebAPI WG),
- the [ShapeChange and RenderedBBoxChange events](http://www.w3.org/TR/2004/WD-SVG12-20041027/dom.html#shapemod) (though the `boundingBox` attribute of the RenderedBBoxChange event is not used), and
- the `startMouseCapture` and `stopMouseCapture` methods on the [global object](http://www.w3.org/TR/2004/WD-SVG12-20041027/api.html#GlobalObject).