package ro.isdc.wro.model.resource.processor.support;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import ro.isdc.wro.util.WroUtil;
/**
* Encapsulates the matcher creation for css import statements detection. Useful to isolate unit tests. TODO prefer a
* fluent interface implementation for this class.
*
* @author Alex Objelean
* @created 19 Feb 2013
* @since 1.6.3
*/
public class CssImportInspector {
private static final Pattern PATTERN = Pattern.compile(WroUtil.loadRegexpWithKey("cssImport"));
private static final String REGEX_IMPORT_FROM_COMMENTS = WroUtil.loadRegexpWithKey("cssImportFromComments");
/**
* The index of the url group in regex.
*/
private static final int INDEX_URL = 1;
private final Matcher matcher;
public CssImportInspector(final String cssContent) {
matcher = getMatcher(removeImportsFromComments(cssContent));
}
/**
* @return a {@link Matcher} for the processed content using the regexp responsible for identifying css import
* statements.
*/
protected Matcher getMatcher(final String cssContent) {
return PATTERN.matcher(cssContent);
}
/**
* Removes all @import statements from css.
*/
public final String removeImportStatements() {
final StringBuffer sb = new StringBuffer();
while (matcher.find()) {
// replace @import with empty string
matcher.appendReplacement(sb, "");
}
matcher.appendTail(sb);
return sb.toString();
}
/**
* @return true if checked css content contains an @import statement.
*/
public final boolean containsImport() {
return matcher.find();
}
/**
* @return a list of all resources imported using @import statement.
*/
public final List<String> findImports() {
final List<String> list = new ArrayList<String>();
while (matcher.find()) {
list.add(extractImportUrl(matcher));
}
return list;
}
/**
* Override this method to provide a custom way of extracting the imported resource url.
*
* @param matcher
* the {@link Matcher} inspecting the parsed css content.
* @return the url of the imported resources.
*/
protected String extractImportUrl(final Matcher matcher) {
return matcher.group(INDEX_URL);
}
/**
* Removes all import statements from provided css content.
*
* @return the css content with import statement removed.
* @VisibleForTesting
*/
final String removeImportsFromComments(final String content) {
return content.replaceAll(REGEX_IMPORT_FROM_COMMENTS, "");
}
}