use of com.helger.css.handler.ICSSParseExceptionCallback in project ph-css by phax.
the class CSSReaderDeclarationListTest method testRead21.
@Test
public void testRead21() {
final ICSSParseExceptionCallback aHdl = new DoNothingCSSParseExceptionCallback();
for (final String sCSS : VALID) {
final CSSDeclarationList aDL = CSSReaderDeclarationList.readFromString(sCSS, ECSSVersion.CSS30, aHdl);
assertNotNull(aDL);
}
for (final String sCSS : INVALID) assertNull(sCSS, CSSReaderDeclarationList.readFromString(sCSS, ECSSVersion.CSS30, aHdl));
}
use of com.helger.css.handler.ICSSParseExceptionCallback in project ph-css by phax.
the class CSSCompressMojo method _compressCSSFile.
private void _compressCSSFile(@Nonnull final File aChild) {
// Compress the file only if the compressed file is older than the original
// file. Note: lastModified on a non-existing file returns 0L
final File aCompressed = new File(FilenameHelper.getWithoutExtension(aChild.getAbsolutePath()) + targetFileExtension);
if (aCompressed.lastModified() < aChild.lastModified() || forceCompress) {
if (verbose)
getLog().info("Start compressing CSS file " + _getRelativePath(aChild));
else
getLog().debug("Start compressing CSS file " + _getRelativePath(aChild));
final ICSSParseExceptionCallback aExHdl = (@Nonnull final ParseException ex) -> getLog().error("Failed to parse CSS file " + _getRelativePath(aChild), ex);
final Charset aFallbackCharset = CharsetHelper.getCharsetFromName(sourceEncoding);
final CSSReaderSettings aSettings = new CSSReaderSettings().setCSSVersion(ECSSVersion.CSS30).setFallbackCharset(aFallbackCharset).setCustomExceptionHandler(aExHdl).setBrowserCompliantMode(browserCompliantMode);
final CascadingStyleSheet aCSS = CSSReader.readFromFile(aChild, aSettings);
if (aCSS != null) {
// We read it!
final FileSystemResource aDestFile = new FileSystemResource(aCompressed);
try {
final CSSWriterSettings aWriterSettings = new CSSWriterSettings(ECSSVersion.CSS30);
aWriterSettings.setOptimizedOutput(true);
aWriterSettings.setRemoveUnnecessaryCode(removeUnnecessaryCode);
aWriterSettings.setNewLineMode(newLineMode);
aWriterSettings.setQuoteURLs(quoteURLs);
aWriterSettings.setWriteNamespaceRules(writeNamespaceRules);
aWriterSettings.setWriteFontFaceRules(writeFontFaceRules);
aWriterSettings.setWriteKeyframesRules(writeKeyframesRules);
aWriterSettings.setWriteMediaRules(writeMediaRules);
aWriterSettings.setWritePageRules(writePageRules);
aWriterSettings.setWriteViewportRules(writeViewportRules);
aWriterSettings.setWriteSupportsRules(writeSupportsRules);
aWriterSettings.setWriteUnknownRules(writeUnknownRules);
final Charset aTargetCharset = CharsetHelper.getCharsetFromName(targetEncoding);
new CSSWriter(aWriterSettings).writeCSS(aCSS, aDestFile.getWriter(aTargetCharset, EAppend.TRUNCATE));
} catch (final IOException ex) {
getLog().error("Failed to write compressed CSS file '" + aCompressed.toString() + "' to disk", ex);
}
}
} else {
if (verbose)
getLog().info("Ignoring already compressed CSS file " + _getRelativePath(aChild));
else
getLog().debug("Ignoring already compressed CSS file " + _getRelativePath(aChild));
}
}
use of com.helger.css.handler.ICSSParseExceptionCallback in project ph-css by phax.
the class CSSReader method readFromReader.
/**
* Read the CSS from the passed {@link IReaderProvider}. If the CSS contains
* an explicit <code>@charset</code> rule, it is ignored and the charset used
* to create the reader is used instead! Also the fallback charset from the
* {@link CSSReaderSettings} is ignored.
*
* @param aRP
* The reader provider to use. The reader is retrieved exactly once and
* closed anyway. May not be <code>null</code>.
* @param aSettings
* The settings to be used for reading the CSS. May not be
* <code>null</code>.
* @return <code>null</code> if reading failed, the CSS declarations
* otherwise.
* @since 3.8.2
*/
@Nullable
public static CascadingStyleSheet readFromReader(@Nonnull final IHasReader aRP, @Nonnull final CSSReaderSettings aSettings) {
ValueEnforcer.notNull(aRP, "ReaderProvider");
ValueEnforcer.notNull(aSettings, "Settings");
// Create the reader
final Reader aReader = aRP.getReader();
if (aReader == null) {
// Failed to open reader
return null;
}
// No charset determination, as the Reader already has an implicit Charset
final ECSSVersion eVersion = aSettings.getCSSVersion();
try {
final CSSCharStream aCharStream = new CSSCharStream(aReader);
aCharStream.setTabSize(aSettings.getTabSize());
// Use the default CSS parse error handler if none is provided
ICSSParseErrorHandler aRealParseErrorHandler = aSettings.getCustomErrorHandler();
if (aRealParseErrorHandler == null)
aRealParseErrorHandler = getDefaultParseErrorHandler();
// Use the default CSS exception handler if none is provided
ICSSParseExceptionCallback aRealParseExceptionHandler = aSettings.getCustomExceptionHandler();
if (aRealParseExceptionHandler == null)
aRealParseExceptionHandler = getDefaultParseExceptionHandler();
final boolean bBrowserCompliantMode = aSettings.isBrowserCompliantMode();
final CSSNode aNode = _readStyleSheet(aCharStream, eVersion, aRealParseErrorHandler, aRealParseExceptionHandler, bBrowserCompliantMode);
// Failed to parse content as CSS?
if (aNode == null)
return null;
// Get the interpret error handler
ICSSInterpretErrorHandler aRealInterpretErrorHandler = aSettings.getInterpretErrorHandler();
if (aRealInterpretErrorHandler == null)
aRealInterpretErrorHandler = getDefaultInterpretErrorHandler();
// Convert the AST to a domain object
return CSSHandler.readCascadingStyleSheetFromNode(eVersion, aNode, aRealInterpretErrorHandler);
} finally {
StreamHelper.close(aReader);
}
}
use of com.helger.css.handler.ICSSParseExceptionCallback in project ph-css by phax.
the class CSSReaderDeclarationList method readFromReader.
/**
* Read the CSS from the passed {@link Reader}.
*
* @param aReader
* The reader to use. Will be closed automatically after reading -
* independent of success or error. May not be <code>null</code>.
* @param aSettings
* The settings to be used for reading the CSS. May not be
* <code>null</code>.
* @return <code>null</code> if reading failed, the CSS declarations
* otherwise.
* @since 3.8.2
*/
@Nullable
public static CSSDeclarationList readFromReader(@Nonnull @WillClose final Reader aReader, @Nonnull final CSSReaderSettings aSettings) {
ValueEnforcer.notNull(aReader, "Reader");
ValueEnforcer.notNull(aSettings, "Settings");
final ECSSVersion eVersion = aSettings.getCSSVersion();
try {
final CSSCharStream aCharStream = new CSSCharStream(aReader);
// Use the default CSS parse error handler if none is provided
ICSSParseErrorHandler aRealParseErrorHandler = aSettings.getCustomErrorHandler();
if (aRealParseErrorHandler == null)
aRealParseErrorHandler = getDefaultParseErrorHandler();
// Use the default CSS exception handler if none is provided
ICSSParseExceptionCallback aRealParseExceptionHandler = aSettings.getCustomExceptionHandler();
if (aRealParseExceptionHandler == null)
aRealParseExceptionHandler = getDefaultParseExceptionHandler();
final CSSNode aNode = _readStyleDeclaration(aCharStream, eVersion, aRealParseErrorHandler, aRealParseExceptionHandler);
// Failed to parse content as CSS?
if (aNode == null)
return null;
// Get the interpret error handler
ICSSInterpretErrorHandler aRealInterpretErrorHandler = aSettings.getInterpretErrorHandler();
if (aRealInterpretErrorHandler == null)
aRealInterpretErrorHandler = getDefaultInterpretErrorHandler();
// Convert the AST to a domain object
return CSSHandler.readDeclarationListFromNode(eVersion, aNode, aRealInterpretErrorHandler);
} finally {
StreamHelper.close(aReader);
}
}
use of com.helger.css.handler.ICSSParseExceptionCallback in project ph-css by phax.
the class CSSReader method readFromStream.
/**
* Read the CSS from the passed {@link IHasInputStream}. If the CSS contains
* an explicit charset, the whole CSS is parsed again, with the charset found
* inside the file, so the passed {@link IHasInputStream} must be able to
* create a new input stream on second invocation!
*
* @param aISP
* The input stream provider to use. Must be able to create new input
* streams on every invocation, in case an explicit charset node was
* found. May not be <code>null</code>.
* @param aSettings
* The settings to be used for reading the CSS. May not be
* <code>null</code>.
* @return <code>null</code> if reading failed, the CSS declarations
* otherwise.
* @since 3.8.2
*/
@Nullable
public static CascadingStyleSheet readFromStream(@Nonnull final IHasInputStream aISP, @Nonnull final CSSReaderSettings aSettings) {
ValueEnforcer.notNull(aISP, "InputStreamProvider");
ValueEnforcer.notNull(aSettings, "Settings");
Charset aCharsetToUse;
// Check if the CSS contains a declared charset or as an alternative use the
// Charset from the BOM
Charset aDeclaredCharset;
try {
aDeclaredCharset = getCharsetDeclaredInCSS(aISP);
} catch (final IllegalStateException ex) {
// Failed to parse CSS at a very low level
return null;
}
if (aDeclaredCharset != null) {
if (s_aLogger.isDebugEnabled())
s_aLogger.debug("Reading CSS definition again with explicit charset '" + aDeclaredCharset.name() + "'");
aCharsetToUse = aDeclaredCharset;
} else {
// No charset declared - use fallback
aCharsetToUse = aSettings.getFallbackCharset();
}
// Try to open input stream
final InputStream aISOrig = aISP.getInputStream();
if (aISOrig == null)
return null;
// Open input stream
final InputStreamAndCharset aISAndBOM = CharsetHelper.getInputStreamAndCharsetFromBOM(aISOrig);
final InputStream aIS = aISAndBOM.getInputStream();
final Reader aReader = StreamHelper.createReader(aIS, aCharsetToUse);
final ECSSVersion eVersion = aSettings.getCSSVersion();
try {
final CSSCharStream aCharStream = new CSSCharStream(aReader);
aCharStream.setTabSize(aSettings.getTabSize());
// Use the default CSS parse error handler if none is provided
ICSSParseErrorHandler aRealParseErrorHandler = aSettings.getCustomErrorHandler();
if (aRealParseErrorHandler == null)
aRealParseErrorHandler = getDefaultParseErrorHandler();
// Use the default CSS exception handler if none is provided
ICSSParseExceptionCallback aRealParseExceptionHandler = aSettings.getCustomExceptionHandler();
if (aRealParseExceptionHandler == null)
aRealParseExceptionHandler = getDefaultParseExceptionHandler();
final boolean bBrowserCompliantMode = aSettings.isBrowserCompliantMode();
final CSSNode aNode = _readStyleSheet(aCharStream, eVersion, aRealParseErrorHandler, aRealParseExceptionHandler, bBrowserCompliantMode);
// Failed to parse content as CSS?
if (aNode == null)
return null;
// Get the interpret error handler
ICSSInterpretErrorHandler aRealInterpretErrorHandler = aSettings.getInterpretErrorHandler();
if (aRealInterpretErrorHandler == null)
aRealInterpretErrorHandler = getDefaultInterpretErrorHandler();
// Convert the AST to a domain object
return CSSHandler.readCascadingStyleSheetFromNode(eVersion, aNode, aRealInterpretErrorHandler);
} finally {
StreamHelper.close(aReader);
}
}
Aggregations