package com.github.sommeri.less4j.core.compiler.expressions.strings; import java.util.regex.Pattern; import com.github.sommeri.less4j.EmbeddedScriptGenerator; import com.github.sommeri.less4j.EmbeddedLessGenerator; import com.github.sommeri.less4j.core.ast.Expression; import com.github.sommeri.less4j.core.ast.Variable; import com.github.sommeri.less4j.core.compiler.expressions.ExpressionEvaluator; import com.github.sommeri.less4j.core.parser.HiddenTokenAwareTree; import com.github.sommeri.less4j.core.problems.ProblemsHandler; import com.github.sommeri.less4j.utils.CssPrinter; public class StringInterpolator extends AbstractStringReplacer<ExpressionEvaluator> { private static final Pattern STR_INTERPOLATION = Pattern.compile("@\\{([^\\{\\}@])*\\}"); private final EmbeddedScriptGenerator embeddedScriptEvaluator; private final ProblemsHandler problemsHandler; public StringInterpolator(ProblemsHandler problemsHandler) { this(new EmbeddedLessGenerator(), problemsHandler); } public StringInterpolator(EmbeddedScriptGenerator embeddedScriptEvaluator, ProblemsHandler problemsHandler) { this.embeddedScriptEvaluator = embeddedScriptEvaluator; this.problemsHandler = problemsHandler; } @Override protected Pattern getPattern() { return STR_INTERPOLATION; } @Override protected String extractMatchName(String group) { return "@" + group.substring(2, group.length() - 1); } @Override protected String replacementValue(ExpressionEvaluator expressionEvaluator, HiddenTokenAwareTree technicalUnderlying, MatchRange matchRange) { Expression value = expressionEvaluator.evaluateIfPresent(new Variable(technicalUnderlying, matchRange.getName())); if (value == null) { return matchRange.getFullMatch(); } String result = embeddedScriptEvaluator.toScript(value, problemsHandler); if (result==null) { problemsHandler.stringInterpolationNotSupported(technicalUnderlying, value); result = CssPrinter.ERROR; } return result; } @Override protected boolean shouldIterate() { return true; } }