package core.framework.impl.template.fragment;
import core.framework.impl.template.TemplateContext;
import core.framework.impl.template.TemplateMetaContext;
import core.framework.impl.template.expression.ExpressionBuilder;
import core.framework.impl.template.expression.ExpressionHolder;
/**
* @author neo
*/
public class TextContentFragment implements Fragment {
static String escapeHTML(String text) {
int length = text.length();
int index = findHTMLReservedChar(text);
if (index == length) return text;
StringBuilder builder = new StringBuilder(length * 2);
for (int i = 0; i < index; i++) builder.append(text.charAt(i));
for (; index < length; index++) {
char ch = text.charAt(index);
switch (ch) {
case '<':
builder.append("<");
break;
case '>':
builder.append(">");
break;
case '"':
builder.append(""");
break;
case '&':
builder.append("&");
break;
case '\'':
builder.append("'");
break;
case '/':
builder.append("/");
break;
default:
builder.append(ch);
break;
}
}
return builder.toString();
}
private static int findHTMLReservedChar(String text) {
int length = text.length();
int index = 0;
for (; index < length; index++) {
char ch = text.charAt(index);
switch (ch) {
case '<':
case '>':
case '"':
case '&':
case '\'':
case '/':
return index;
default:
break;
}
}
return index;
}
private final ExpressionHolder expression;
public TextContentFragment(String expression, TemplateMetaContext context, String location) {
this.expression = new ExpressionBuilder(expression, context, location).build();
}
@Override
public void process(StringBuilder builder, TemplateContext context) {
Object result = expression.eval(context);
if (result != null) {
builder.append(escapeHTML(String.valueOf(result)));
}
}
}