package com.github.jarlakxen.scala.sbt; import java.util.ArrayList; import java.util.List; import org.apache.commons.lang.StringUtils; public class SbtParser { public static List<SbtSetting> parse(String source) { List<SbtSetting> settings = new ArrayList<SbtSetting>(); String[] lines = source.split("[\\r?\\n]+"); for (int i = 0; i < lines.length; i++) { String line = fixWhitespace(removeComment(lines[i])); if (StringUtils.isBlank(line)) { SbtSetting setting = parseProperty(line.toString()); if (setting != null) { setting.line = i; settings.add(setting); } } } return settings; } private static SbtSetting parseProperty(String line) { SbtSetting property = createProperty(line, ":="); if (property == null) { property = createProperty(line, "++="); } if (property == null) { property = createProperty(line, "+="); } if (property == null) { property = new SbtSetting(line.trim()); } return property; } private static SbtSetting createProperty(String line, String separator) { int index = line.indexOf(separator); if (index >= 0) { String key = line.substring(0, index).trim(); String value = line.substring(index + separator.length()).trim(); String[] values = parseSeq(value); if (values == null) { return new SbtSetting(key, value); } else { return new SbtSetting(key, values); } } return null; } private static String[] parseSeq(String value) { if (value.startsWith("Seq")) { value = value.replaceFirst("^Seq\\s*\\(", ""); value = value.replaceFirst("\\)$", ""); String[] values = value.split(","); for (int i = 0; i < values.length; i++) { values[i] = values[i].trim(); values[i] = values[i].replaceAll("\\s+", " "); } return values; } return null; } /** * utility method to remove comment. */ private static String removeComment(String value) { return value.replaceFirst("\\/\\/.*", ""); } /** * utility method to fix whitespaces to a single space. */ private static String fixWhitespace(String value) { return value.trim().replaceAll("\\s+", " "); } public static class SbtSetting { public int line; public String key; public String value; public String[] values; public SbtSetting(String key) { this.key = key; } public SbtSetting(String key, String value) { this.key = key; this.value = value; } public SbtSetting(String key, String[] values) { this.key = key; this.values = values; } @Override public String toString() { if (value != null) { return key + ": " + value; } else if (values != null) { StringBuilder sb = new StringBuilder(); for (String value : values) { if (sb.length() > 0) { sb.append("\n"); } sb.append(" " + value); } return key + ": \n" + sb.toString(); } else { return key; } } } }