package com.tddinaction.template;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class TemplateParse {
public List<Segment> parseSegments(String template) {
List<Segment> segments = new ArrayList<Segment>();
List<String> strings = parse(template);
for (String s : strings) {
if (isVariable(s)) {
String name = s.substring(2, s.length() - 1);
segments.add(new Variable(name));
} else {
segments.add(new PlainText(s));
}
}
return segments;
}
private boolean isVariable(String segment) {
return segment.startsWith("${") && segment.endsWith("}");
}
public List<String> parse(String template) {
List<String> segments = new ArrayList<String>();
int index = collectSegments(template, segments, 0);
addTail(segments, template, index);
return segments;
}
private int collectSegments(String src, List<String> segs,
int index) {
Pattern pattern = Pattern.compile("\\$\\{[^}]*\\}");
Matcher matcher = pattern.matcher(src);
while (matcher.find()) {
addPrecedingPlainText(segs, src, matcher, index);
addVariable(segs, src, matcher);
index = matcher.end();
}
return index;
}
private void addTail(List<String> segs, String src, int index) {
if (index < src.length())
segs.add(src.substring(index));
}
private void addVariable(List<String> segs, String src, Matcher m) {
segs.add(src.substring(m.start(), m.end()));
}
private void addPrecedingPlainText(List<String> segs, String src,
Matcher matcher, int index) {
if (index != matcher.start()) {
segs.add(src.substring(index, matcher.start()));
}
}
}