package fr.openwide.core.wicket.more.notification.service.impl; import java.util.Collection; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.base.CharMatcher; import com.google.common.base.Splitter; import com.google.common.collect.Sets; import com.helger.css.ECSSVersion; import com.helger.css.decl.CSSSelector; import com.helger.css.decl.CSSSelectorSimpleMember; import com.helger.css.decl.ICSSSelectorMember; import com.helger.css.writer.CSSWriterSettings; public class PhlocCssMatchableHtmlTag { private static final Logger LOGGER = LoggerFactory.getLogger(PhlocCssMatchableHtmlTag.class); private static final Splitter CSS_CLASSES_SPLITTER = Splitter.on(CharMatcher.WHITESPACE).omitEmptyStrings().trimResults(); private final String name; private final String id; private final Collection<String> classes; public PhlocCssMatchableHtmlTag(String tagName, String tagId, String classAttribute) { name = StringUtils.defaultString(tagName); id = StringUtils.defaultString(tagId); classes = Sets.newHashSet(CSS_CLASSES_SPLITTER.splitToList(StringUtils.defaultString(classAttribute))); } public boolean matches(CSSSelectorSimpleMember simpleMember) { if (simpleMember.isClass()) { return classes.contains(simpleMember.getValue().substring(1)); // Remove leading '.' } else if (simpleMember.isElementName()) { return name.equals(simpleMember.getValue()); } else if (simpleMember.isHash()) { return id.equals(simpleMember.getValue().substring(1)); // Remove leading '#' } else { throw new IllegalArgumentException(); } } public boolean matches(CSSSelector selector) { for (ICSSSelectorMember member : selector.getAllMembers()) { if (member instanceof CSSSelectorSimpleMember && !((CSSSelectorSimpleMember) member).isPseudo()) { CSSSelectorSimpleMember simpleMember = (CSSSelectorSimpleMember) member; if (!matches(simpleMember)) { return false; } } else { if (LOGGER.isDebugEnabled()) { LOGGER.debug("Only simple selector members ('.class', 'name', '#id') are supported. The selector '{}' and the related declarations will be ignored.", selector.getAsCSSString(new CSSWriterSettings(ECSSVersion.CSS30), 0)); } return false; } } return true; } }