import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.math.BigDecimal; import java.math.RoundingMode; public class PxToRpx { public static void main(String[] args) { if (args.length > 1) { File root = new File(args[1]); scale = 750D / Double.parseDouble(args[0]); exec(root); } else { System.out.println("java className pageWidth pageAbsolutePath"); } } private static final char[] digits = new char[]{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}; private static final String[] widthParams = new String[]{"Left", "Right", "left", "right", "width", "Top", "Bottom", "top", "bottom", "height"}; private static Double scale; private static void exec(File root) { if (root.isDirectory()) { File[] files = root.listFiles(); if (files != null) { for (File file : files) { exec(file); } } } else { StringBuilder content = new StringBuilder(), number; try (FileReader fileReader = new FileReader(root); BufferedReader bufferedReader = new BufferedReader(fileReader)) { final String PX = "px", R = "r"; String line, value; int start, paramEnd; Double scale; while ((line = bufferedReader.readLine()) != null) { start = 0; while ((start = line.indexOf(PX, start)) != -1) { if (isDigit(line.charAt(start - 1))) { paramEnd = getNumber((number = new StringBuilder()), line, start); scale = getScale(paramEnd, line); if (scale == null) { start += 3; continue; } value = calculate(number, scale) + R + line.substring(start); line = line.substring(0, paramEnd) + value; start = paramEnd + value.length() + 3; } else { start += 3; } } content.append(line).append('\n'); } } catch (Exception e) { e.printStackTrace(); } if (content.length() > 0) { try (FileWriter fileWriter = new FileWriter(root);) { fileWriter.write(content.toString()); } catch (Exception e) { e.printStackTrace(); } } } } private static double calculate(StringBuilder number, double scale) { BigDecimal two = new BigDecimal(Double.parseDouble(number.toString()) * scale); return two.setScale(2, RoundingMode.HALF_UP).doubleValue(); } private static Double getScale(int paramEnd, String line) { paramEnd = ignoreBlank(paramEnd, line); if (paramEnd != -1) { for (String param : widthParams) { if (compare(line, param, paramEnd)) { return scale; } } } return null; } private static boolean compare(String line, String param, int paramEnd) { return paramEnd >= param.length() && param.equals(line.substring(paramEnd - param.length(), paramEnd)); } private static int ignoreBlank(int paramEnd, String line) { if (line.charAt(paramEnd) == ':') { return paramEnd; } if (paramEnd > 0) { return ignoreBlank(paramEnd - 1, line); } return -1; } private static int getNumber(StringBuilder result, String line, int start) { char c; if (isDigit((c = line.charAt(start - 1)))) { result.insert(0, c); if (start > 0) { return getNumber(result, line, start - 1); } } if (result.length() > 0 && result.charAt(0) == '.') { result.insert(0, 0); } return start; } private static boolean isDigit(char target) { for (char c : digits) { if (target == c) { return true; } } return false; } }