package com.intellij.javascript.flex.css; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.PsiElement; import com.intellij.psi.css.CssTerm; import com.intellij.psi.css.CssTermType; import com.intellij.psi.css.descriptor.value.CssValueDescriptor; import com.intellij.psi.css.impl.CssTermTypes; import com.intellij.psi.css.impl.descriptor.value.CssColorValue; import com.intellij.psi.css.impl.descriptor.value.CssLengthValue; import com.intellij.psi.css.impl.descriptor.value.CssStringValue; import com.intellij.psi.css.impl.descriptor.value.CssValueValidatorImpl; import com.intellij.xml.util.ColorMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.Locale; class FlexCssValueValidator extends CssValueValidatorImpl { public FlexCssValueValidator(@NotNull FlexCssElementDescriptorProvider provider) { super(provider); } @Override public boolean isValid(@Nullable PsiElement term, @NotNull CssValueDescriptor valueDescriptor) { if (valueDescriptor instanceof CssColorValue) { return term != null && isValidColor(term); } else if (valueDescriptor instanceof CssStringValue) { return term != null && isValidString(term) && super.isValid(term, valueDescriptor); } else if (valueDescriptor instanceof CssLengthValue) { return term != null && term instanceof CssTerm && (super.isValid(term, valueDescriptor) || isValidLength((CssTerm)term)); } return super.isValid(term, valueDescriptor); } private static boolean isValidString(@NotNull PsiElement element) { return FlexCssUtil.inQuotes(element.getText().trim()); } private static boolean isValidLength(@NotNull CssTerm cssTerm) { final CssTermType termType = cssTerm.getTermType(); return termType == CssTermTypes.NEGATIVE_NUMBER || termType == CssTermTypes.NUMBER || termType == CssTermTypes.INTEGER; } private static boolean isValidColor(@NotNull PsiElement element) { String text = element.getText().trim(); if (isInteger(text)) { return true; } if (!(element instanceof CssTerm) || ((CssTerm)element).getTermType() != CssTermTypes.COLOR) { if (FlexCssUtil.inQuotes(text)) { text = StringUtil.unquoteString(text, '"'); if (text.startsWith("0x")) { return isInteger(text.substring(2)); } else if (containsOnlyLetters(text)) { return ColorMap.isStandardColor(text.toLowerCase(Locale.US)); } } return false; } if (containsOnlyLetters(text)) { return ColorMap.isStandardColor(text.toLowerCase(Locale.US)); } return true; } private static boolean containsOnlyLetters(@NotNull String s) { for (int i = 0, n = s.length(); i < n; i++) { char c = s.charAt(i); if (!Character.isLetter(c)) { return false; } } return true; } private static boolean isInteger(@NotNull String s) { try { //noinspection ResultOfMethodCallIgnored Integer.parseInt(s, 16); } catch (NumberFormatException e) { return false; } return true; } }