package com.github.sommeri.less4j.core.compiler.expressions;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.github.sommeri.less4j.core.ast.ASTCssNodeType;
import com.github.sommeri.less4j.core.ast.CssString;
import com.github.sommeri.less4j.core.ast.EmbeddedScript;
import com.github.sommeri.less4j.core.ast.Expression;
import com.github.sommeri.less4j.core.ast.FaultyExpression;
import com.github.sommeri.less4j.core.ast.FunctionExpression;
import com.github.sommeri.less4j.core.problems.ProblemsHandler;
public class EmbeddedScriptFunctions extends BuiltInFunctionsPack {
protected static final String EMBEDDED_SCRIPT = "`";
protected static final String ESCAPED_SCRIPT = "~`";
private static Map<String, Function> FUNCTIONS = new HashMap<String, Function>();
static {
FUNCTIONS.put(EMBEDDED_SCRIPT, new ScriptFunction(EMBEDDED_SCRIPT, "Embedded scripts `...`"));
FUNCTIONS.put(ESCAPED_SCRIPT, new ScriptFunction(ESCAPED_SCRIPT, "Escaped script ~`...`"));
}
public EmbeddedScriptFunctions(ProblemsHandler problemsHandler) {
super(problemsHandler);
}
@Override
protected Map<String, Function> getFunctions() {
return FUNCTIONS;
}
}
class ScriptFunction implements Function {
private final String name;
private final String errorName;
public ScriptFunction(String name, String errorName) {
this.name = name;
this.errorName = errorName;
}
@Override
public Expression evaluate(List<Expression> parameters, ProblemsHandler problemsHandler, FunctionExpression call, Expression evaluatedParameter) {
if (parameters.size()>1)
problemsHandler.wrongNumberOfArgumentsToFunctionMin(call.getParameter(), call.getName(), 1);
Expression parameter = parameters.get(0);
if (!(parameter instanceof EmbeddedScript)) {
problemsHandler.wrongArgumentTypeToFunction(parameter, name+"...`", parameter.getType(),ASTCssNodeType.EMBEDDED_SCRIPT);
return new FaultyExpression(call);
}
warn(call, problemsHandler);
EmbeddedScript parameterAsStr = (EmbeddedScript) parameter;
String value = name+parameterAsStr.getValue()+"`";
return new CssString(call.getUnderlyingStructure(), value, "");
}
private void warn(FunctionExpression call, ProblemsHandler problemsHandler) {
problemsHandler.warnScriptingNotSupported(call, errorName);
}
@Override
public boolean acceptsParameters(List<Expression> parameters) {
return true;
}
}