Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
73 changes: 73 additions & 0 deletions src/main/java/org/htmlunit/cssparser/parser/AbstractCSSParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import java.net.URL;
import java.text.MessageFormat;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;

import org.htmlunit.cssparser.parser.javacc.CharStream;
Expand All @@ -27,6 +28,8 @@
import org.htmlunit.cssparser.parser.javacc.TokenMgrException;
import org.htmlunit.cssparser.parser.media.MediaQueryList;
import org.htmlunit.cssparser.parser.selector.SelectorList;
import org.htmlunit.cssparser.parser.validator.CSSValidator;
import org.htmlunit.cssparser.parser.validator.ValidationWarning;
import org.w3c.dom.DOMException;

/**
Expand All @@ -38,6 +41,8 @@ public abstract class AbstractCSSParser {
private DocumentHandler documentHandler_;
private CSSErrorHandler errorHandler_;
private InputSource source_;
private CSSValidator validator_;
private boolean enableSemanticValidation_;

private static final HashMap<String, String> PARSER_MESSAGES_ = new HashMap<>();

Expand Down Expand Up @@ -165,6 +170,45 @@ protected InputSource getInputSource() {
return source_;
}

/**
* Enable or disable semantic validation.
*
* @param enabled true to enable semantic validation
*/
public void setSemanticValidationEnabled(final boolean enabled) {
enableSemanticValidation_ = enabled;
}

/**
* Check if semantic validation is enabled.
*
* @return true if semantic validation is enabled
*/
public boolean isSemanticValidationEnabled() {
return enableSemanticValidation_;
}

/**
* Set the CSS validator.
*
* @param validator the validator
*/
public void setCSSValidator(final CSSValidator validator) {
validator_ = validator;
}

/**
* Get the CSS validator, creating one if needed.
*
* @return the validator
*/
protected CSSValidator getValidator() {
if (validator_ == null) {
validator_ = new CSSValidator();
}
return validator_;
}

/**
* @param key the lookup key
* @return the parser message
Expand Down Expand Up @@ -755,6 +799,35 @@ protected void handleEndSelector(final SelectorList selectors) {
*/
protected void handleProperty(final String name, final LexicalUnit value,
final boolean important, final Locator locator) {
// Add semantic validation
if (enableSemanticValidation_) {
final List<ValidationWarning> warnings = getValidator().validateProperty(name, value, locator);
for (final ValidationWarning warning : warnings) {
if (warning.getLevel() == ValidationWarning.Level.ERROR) {
try {
getErrorHandler().error(new CSSParseException(
warning.getMessage(),
locator
));
}
catch (final CSSException e) {
// Ignore
}
}
else {
try {
getErrorHandler().warning(new CSSParseException(
warning.getMessage(),
locator
));
}
catch (final CSSException e) {
// Ignore
}
}
}
}

getDocumentHandler().property(name, value, important, locator);
}

Expand Down
9 changes: 9 additions & 0 deletions src/main/java/org/htmlunit/cssparser/parser/CSSOMParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,15 @@ public void setErrorHandler(final CSSErrorHandler eh) {
parser_.setErrorHandler(eh);
}

/**
* Enable or disable semantic validation.
*
* @param enabled true to enable semantic validation
*/
public void setSemanticValidationEnabled(final boolean enabled) {
parser_.setSemanticValidationEnabled(enabled);
}

/**
* Parses a SAC input source into a CSSOM style sheet.
*
Expand Down
Loading