// License: GPL. For details, see LICENSE file. package cadastre_fr; import java.util.ArrayList; /** * This class is not intended to be a real SVG parser. It's also not using existing * xml parsers. It's just extracting the required strings from an SVG file coming * from the French land registry cadastre.gouv.fr * */ public class SVGParser { private String cViewBoxStart = "viewBox=\""; private String cViewBoxEnd = "\""; private String cPathStart = "<path d=\""; private String cClosedPathEnd = "\"/>"; /** * The SVG viewBox looks like this: * viewBox="969780.0 320377.11 5466.130000000005 2846.429999999993" * @param svg the SVG XML data * @return double [x,y,dx,dy] of viewBox; null if parsing failed */ public double[] getViewBox(String svg) { int s = svg.indexOf(cViewBoxStart)+cViewBoxStart.length(); int e = svg.indexOf(cViewBoxEnd, s); if (s != -1 && e != -1) { try { String str = svg.substring(s, e); String[] viewBox = str.split(" "); double[] dbox = new double[4]; for (int i = 0; i < 4; i++) { dbox[i] = Double.parseDouble(viewBox[i]); } return dbox; } catch (Exception ex) { return null; } } return null; } /** * Closed SVG paths are finishing with a "Z" at the end of the moves list. */ public String[] getClosedPaths(String svg) { ArrayList<String> path = new ArrayList<>(); int i = 0; while (svg.indexOf(cPathStart, i) != -1) { int s = svg.indexOf(cPathStart, i) + cViewBoxStart.length(); int e = svg.indexOf(cClosedPathEnd, s); if (s != -1 && e != -1) { String onePath = svg.substring(s, e); if (onePath.indexOf("Z") != -1) // only closed SVG path path.add(onePath); } else break; i = e; } return path.toArray(new String[ path.size() ]); } }