int pos = 0;
while (inputMatcher.find()) {
String match2 = inputMatcher.group();
if (pos != inputMatcher.start()) {
throw new PermErrorException("Middle part does not match: "+input.substring(0,pos)+">>"+input.substring(pos, inputMatcher.start())+"<<"+input.substring(inputMatcher.start())+" ["+input+"]");
}
if (match2.length() > 0) {
if (match2.startsWith("%{")) {
macroCell = input.substring(inputMatcher.start() + 2, inputMatcher
.end() - 1);
inputMatcher
.appendReplacement(decodedValue, escapeForMatcher(replaceCell(macroCell, macroData, isExplanation)));
} else if (match2.length() == 2 && match2.startsWith("%")) {
// handle the % escaping
/*
* From RFC4408:
*
* A literal "%" is expressed by "%%".
* "%_" expands to a single " " space.
* "%-" expands to a URL-encoded space, viz., "%20".
*/
if ("%_".equals(match2)) {
inputMatcher.appendReplacement(decodedValue, " ");
} else if ("%-".equals(match2)) {
inputMatcher.appendReplacement(decodedValue, "%20");
} else {
inputMatcher.appendReplacement(decodedValue, escapeForMatcher(match2.substring(1)));
}
}
}
pos = inputMatcher.end();
}
if (input.length() != pos) {
throw new PermErrorException("End part does not match: "+input.substring(pos));
}
inputMatcher.appendTail(decodedValue);
return decodedValue.toString();