From 70112fa3a96dff08a5178953ec1b2b44cd5a6e9d Mon Sep 17 00:00:00 2001 From: James Ball Date: Sat, 24 Oct 2020 19:31:04 +0100 Subject: [PATCH] Create main SVG parser functions --- src/parser/FileParser.java | 2 +- src/parser/SvgParser.java | 127 +++++++++++++++++++++++++++++++++++-- 2 files changed, 122 insertions(+), 7 deletions(-) diff --git a/src/parser/FileParser.java b/src/parser/FileParser.java index 73180aa5..c3a706d2 100644 --- a/src/parser/FileParser.java +++ b/src/parser/FileParser.java @@ -31,5 +31,5 @@ public abstract class FileParser { protected abstract void parseFile(String path) throws ParserConfigurationException, IOException, SAXException, IllegalArgumentException; - public abstract List getShapes(); + public abstract List getShapes(); } diff --git a/src/parser/SvgParser.java b/src/parser/SvgParser.java index cd9f898e..e0e41551 100644 --- a/src/parser/SvgParser.java +++ b/src/parser/SvgParser.java @@ -6,7 +6,11 @@ import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; @@ -17,10 +21,108 @@ import shapes.Shape; public class SvgParser extends FileParser { - private final List shapes; + private final List shapes; + private static final Map, List>> commandMap = new HashMap<>(); static { fileExtension = "svg"; + + commandMap.put('M', SvgParser::parseMoveToAbsolute); + commandMap.put('m', SvgParser::parseMoveToRelative); + commandMap.put('L', SvgParser::parseLineToAbsolute); + commandMap.put('l', SvgParser::parseLineToRelative); + commandMap.put('H', SvgParser::parseHorizontalLineToAbsolute); + commandMap.put('h', SvgParser::parseHorizontalLineToRelative); + commandMap.put('V', SvgParser::parseVerticalLineToAbsolute); + commandMap.put('v', SvgParser::parseVerticalLineToRelative); + commandMap.put('C', SvgParser::parseCurveToAbsolute); + commandMap.put('c', SvgParser::parseCurveToRelative); + commandMap.put('S', SvgParser::parseSmoothCurveToAbsolute); + commandMap.put('s', SvgParser::parseSmoothCurveToRelative); + commandMap.put('Q', SvgParser::parseQuadraticCurveToAbsolute); + commandMap.put('q', SvgParser::parseQuadraticCurveToRelative); + commandMap.put('T', SvgParser::parseSmoothQuadraticCurveToAbsolute); + commandMap.put('t', SvgParser::parseSmoothQuadraticCurveToRelative); + commandMap.put('A', SvgParser::parseEllipticalArcAbsolute); + commandMap.put('a', SvgParser::parseEllipticalArcRelative); + commandMap.put('Z', SvgParser::parseClosePath); + commandMap.put('z', SvgParser::parseClosePath); + } + + private static List parseMoveToAbsolute(List args) { + return null; + } + + private static List parseMoveToRelative(List args) { + return null; + } + + private static List parseClosePath(List args) { + return null; + } + + private static List parseLineToAbsolute(List args) { + return null; + } + + private static List parseLineToRelative(List args) { + return null; + } + + private static List parseHorizontalLineToAbsolute(List args) { + return null; + } + + private static List parseHorizontalLineToRelative(List args) { + return null; + } + + private static List parseVerticalLineToAbsolute(List args) { + return null; + } + + private static List parseVerticalLineToRelative(List args) { + return null; + } + + private static List parseCurveToAbsolute(List args) { + return null; + } + + private static List parseCurveToRelative(List args) { + return null; + } + + private static List parseSmoothCurveToAbsolute(List args) { + return null; + } + + private static List parseSmoothCurveToRelative(List args) { + return null; + } + + private static List parseQuadraticCurveToAbsolute(List args) { + return null; + } + + private static List parseQuadraticCurveToRelative(List args) { + return null; + } + + private static List parseSmoothQuadraticCurveToAbsolute(List args) { + return null; + } + + private static List parseSmoothQuadraticCurveToRelative(List args) { + return null; + } + + private static List parseEllipticalArcAbsolute(List args) { + return null; + } + + private static List parseEllipticalArcRelative(List args) { + return null; } public SvgParser(String path) throws IOException, SAXException, ParserConfigurationException { @@ -49,10 +151,11 @@ public class SvgParser extends FileParser { // If there are any characters in the path that are illegal if (path.matches("[^mlhvcsqtazMLHVCSQTAZ\\-.\\d\\s]")) { throw new IllegalArgumentException("Illegal characters in SVG path."); - // If there are more than 1 letters or delimiters next to one another + // If there are more than 1 letters or delimiters next to one another } else if (path.matches("[a-zA-Z.\\-]{2,}")) { - throw new IllegalArgumentException("Multiple letters or delimiters found next to one another in SVG path."); - // First character in path must be a command + throw new IllegalArgumentException( + "Multiple letters or delimiters found next to one another in SVG path."); + // First character in path must be a command } else if (path.matches("^[a-zA-Z]")) { throw new IllegalArgumentException("Start of SVG path is not a letter."); } @@ -76,13 +179,25 @@ public class SvgParser extends FileParser { throws ParserConfigurationException, IOException, SAXException, IllegalArgumentException { Document svg = getSvgDocument(filePath); + // Get all d attributes within path elements in the SVG file. for (String path : getSvgPathAttributes(svg)) { - preProcessPath(path); + String[] commands = preProcessPath(path); + + for (String command : commands) { + // Split the command into number strings and convert them into floats. + List nums = Arrays.stream(command.substring(1).split(" ")) + .map(Float::parseFloat) + .collect(Collectors.toList()); + + // Use the nums to get a list of shapes, using the first character in the command to specify + // the function to use. + shapes.addAll(commandMap.get(command.charAt(0)).apply(nums)); + } } } @Override - public List getShapes() { + public List getShapes() { return shapes; } }