@Override protected void sendResource(URL resourceUrl, RouteContext routeContext) throws IOException { try { // compile less to css log.trace("Send css for '{}'", resourceUrl); LessSource.URLSource source = new LessSource.URLSource(resourceUrl); String content = source.getContent(); String result = sourceMap.get(content); if (result == null) { ThreadUnsafeLessCompiler compiler = new ThreadUnsafeLessCompiler(); LessCompiler.Configuration configuration = new LessCompiler.Configuration(); configuration.setCompressing(minify); LessCompiler.CompilationResult compilationResult = compiler.compile(resourceUrl, configuration); for (LessCompiler.Problem warning : compilationResult.getWarnings()) { log.warn("Line: {}, Character: {}, Message: {} ", warning.getLine(), warning.getCharacter(), warning.getMessage()); } result = compilationResult.getCss(); if (routeContext.getApplication().getPippoSettings().isProd()) { sourceMap.put(content, result); } } // send css routeContext.getResponse().contentType("text/css"); routeContext.getResponse().ok().send(result); } catch (Exception e) { throw new PippoRuntimeException(e); } }
@Override public String process(final String filename, final String source, final Config conf, final ClassLoader loader) throws Exception { String path = filename; try { LessCompiler compiler = new ThreadUnsafeLessCompiler(); LessSource src = new LessStrSource(source, path); CompilationResult result = compiler.compile(src, lessConf(conf)); result.getWarnings().forEach(warn -> { log.warn("{}:{}:{}:{}: {}", path, warn.getType(), warn.getLine(), warn.getCharacter(), warn.getMessage()); }); if (path.endsWith(".map")) { return result.getSourceMap(); } else { return result.getCss(); } } catch (Less4jException ex) { List<AssetProblem> problems = ex.getErrors().stream() .map(it -> new AssetProblem(path, it.getLine(), it.getCharacter(), it.getMessage(), null)) .collect(Collectors.toList()); throw new AssetException(name(), problems); } }
LessCompiler.CompilationResult compilationResult = compiler.compile(new LessSource.FileSource(new File(inputLess)), configuration); if (compilationResult.getWarnings().size() > 0) for (LessCompiler.Problem warning : compilationResult.getWarnings()) FileUtils.writeStringToFile(new File(outputCSS), compilationResult.getCss()); FileUtils.writeStringToFile(new File(mapFileName), compilationResult.getSourceMap());
@Override public InputStream open(String s, URLConnection resource) throws IOException { LessCompiler compiler = new ThreadUnsafeLessCompiler(); try { LessCompiler.CompilationResult result = compiler.compile(resource.getURL()); return new ByteArrayInputStream(result.getCss().getBytes()); } catch (Less4jException e) { List<LessCompiler.Problem> errors = e.getErrors(); ArrayList<Message> messages = new ArrayList<Message>(errors.size()); for (LessCompiler.Problem error : errors) { String text = error.getMessage() != null ? error.getMessage() : "There is an error in your .less file"; String errorName = error.getType().name(); LessSource source = error.getSource(); Message msg; if (source != null) { msg = new Message(MetaModelPluginImpl.COMPILATION_ERROR, errorName, source.getName(), error.getLine(), text); } else { msg = new Message(MetaModelPluginImpl.GENERAL_PROBLEM, errorName, text); } MetaModelPluginImpl.log.info(msg.toDisplayString()); messages.add(msg); } throw new ProcessingException(messages); } } }
@Override protected void sendResource(URL resourceUrl, RouteContext routeContext) throws IOException { try { // compile less to css log.trace("Send css for '{}'", resourceUrl); LessSource.URLSource source = new LessSource.URLSource(resourceUrl); String content = source.getContent(); String result = sourceMap.get(content); if (result == null) { ThreadUnsafeLessCompiler compiler = new ThreadUnsafeLessCompiler(); LessCompiler.Configuration configuration = new LessCompiler.Configuration(); configuration.setCompressing(minify); LessCompiler.CompilationResult compilationResult = compiler.compile(resourceUrl, configuration); for (LessCompiler.Problem warning : compilationResult.getWarnings()) { log.warn("Line: {}, Character: {}, Message: {} ", warning.getLine(), warning.getCharacter(), warning.getMessage()); } result = compilationResult.getCss(); if (routeContext.getApplication().getPippoSettings().isProd()) { sourceMap.put(content, result); } } // send css routeContext.getResponse().contentType("text/css"); routeContext.getResponse().ok().send(result); } catch (Exception e) { throw new PippoRuntimeException(e); } }
@Override public InputStream open(String s, URLConnection resource) throws IOException { LessCompiler compiler = new ThreadUnsafeLessCompiler(); try { LessCompiler.CompilationResult result = compiler.compile(resource.getURL()); return new ByteArrayInputStream(result.getCss().getBytes()); } catch (Less4jException e) { List<LessCompiler.Problem> errors = e.getErrors(); ArrayList<Message> messages = new ArrayList<Message>(errors.size()); for (LessCompiler.Problem error : errors) { String text = error.getMessage() != null ? error.getMessage() : "There is an error in your .less file"; String errorName = error.getType().name(); LessSource source = error.getSource(); Message msg; if (source != null) { msg = new Message(MetaModelPluginImpl.COMPILATION_ERROR, errorName, source.getName(), error.getLine(), text); } else { msg = new Message(MetaModelPluginImpl.GENERAL_PROBLEM, errorName, text); } MetaModelPluginImpl.log.info(msg.toDisplayString()); messages.add(msg); } throw new ProcessingException(messages); } } }
/** * Compile the LESS code and get the included files from the skin templates. * @param lessCode code to compile * @param skin skin holding the templates * @param inlineSourceMap whether to create inline sourcemaps in the generated css * @return the results of the LESS compilation * @throws Less4jException if problems occur */ public String compile(String lessCode, String skin, boolean inlineSourceMap) throws Less4jException { LessCompiler lessCompiler = new DefaultLessCompiler(); LessCompiler.Configuration options = new LessCompiler.Configuration(); options.setCompressing(true); options.getSourceMapConfiguration().setInline(inlineSourceMap); options.getSourceMapConfiguration().setIncludeSourcesContent(true); LessSource lessSource = new CustomContentLESSSource(lessCode, templateManager, skinManager.getSkin(skin)); LessCompiler.CompilationResult lessResult = lessCompiler.compile(lessSource, options); return lessResult.getCss(); } }
@Override protected WebpipeOutput fetchOutput() throws Exception { synchronized (importedResources) { importedResources.clear(); Webpipe webpipe = getChildWebpipe(); String content = webpipe.getOutput().getContent(); StringSource lessSource; if (webpipe instanceof Resource) { lessSource = new RelativeAwareLessSource((Resource) webpipe, content); } else { lessSource = new StringSource(content, webpipe.getPath()); } CompilationResult result = compiler.compile(lessSource); logWarnings(result); return new WebpipeOutput(result.getCss(), WebpipeUtils.parseSourceMap(result.getSourceMap())); } }
private BytestreamCache invokeLessCompiler(Resource source, ResourceDependencies dependencies) throws IOException { try { LessSource lessSource = new ResourceLessSource(source, dependencies); LessCompiler.CompilationResult compilationResult = compile(compiler, lessSource); // Currently, ignoring any warnings. return new BytestreamCache(compilationResult.getCss().getBytes("utf-8")); } catch (Less4jException ex) { throw new IOException(ex); } catch (UnsupportedEncodingException ex) { throw new IOException(ex); } }
@Override public void process(final Resource resource, final Reader reader, final Writer writer) throws IOException { try { final LessSource lessSource = new RelativeAwareLessSource(resource, IOUtils.toString(reader), locatorFactory); final CompilationResult result = compiler.compile(lessSource); logWarnings(result); writer.write(result.getCss()); } catch (final Less4jException e) { LOG.error("Failed to compile less resource: {}.", resource); for (final Problem problem : e.getErrors()) { LOG.error(problemAsString(problem)); } throw WroRuntimeException.wrap(e); } }
private BytestreamCache invokeLessCompiler(Resource source, ResourceDependencies dependencies) throws IOException { try { LessSource lessSource = new ResourceLessSource(source, dependencies); LessCompiler.CompilationResult compilationResult = compile(compiler, lessSource); // Currently, ignoring any warnings. return new BytestreamCache(compilationResult.getCss().getBytes("utf-8")); } catch (Less4jException ex) { throw new IOException(ex); } catch (UnsupportedEncodingException ex) { throw new IOException(ex); } }
private Map<String, HiddenTokenAwareTree> toAntlrTree(Map<String, String> variables) throws Less4jException { Map<String, HiddenTokenAwareTree> result = new HashMap<String, HiddenTokenAwareTree>(); List<Problem> problems = new ArrayList<Problem>(); for (Entry<String, String> entry : variables.entrySet()) { String nameStr = entry.getKey(); String valueStr = entry.getValue(); ParseResult valueParseResult = toAntlrExpressionTree(nameStr, valueStr); problems.addAll(valueParseResult.getErrors()); result.put(nameStr, valueParseResult.getTree()); } if (!problems.isEmpty()) { CompilationResult compilationResult = new CompilationResult("Errors parsing custom variables, partial result is not available."); throw new Less4jException(problems, compilationResult); } return result; }
private CompilationResult createCompilationResult(ASTCssNode cssStyleSheet, LessSource lessSource, List<VariableDeclaration> externalVariables, Collection<LessSource> additionalSourceFiles, Configuration options) { LessSource cssDestination = options == null ? null : options.getCssResultLocation(); if (cssDestination == null) { String guessedCssName = URIUtils.changeSuffix(lessSource.getName(), Constants.CSS_SUFFIX); URI guessedURI = URIUtils.changeSuffix(lessSource.getURI(), Constants.CSS_SUFFIX); cssDestination = new LessSource.StringSource("", guessedCssName, guessedURI); } CssPrinter builder = new CssPrinter(lessSource, cssDestination, extractSources(externalVariables), additionalSourceFiles, options); builder.append(cssStyleSheet); StringBuilder css = builder.toCss(); String sourceMap = builder.toSourceMap(); handleSourceMapLink(cssStyleSheet, css, options, lessSource, sourceMap); CompilationResult compilationResult = new CompilationResult(css.toString(), sourceMap, problemsHandler.getWarnings()); return compilationResult; }
/** * Compile a less file. * @param source source to compile. * @return the compiled css result. * @throws CompileErrorException in case of compile error. */ @Override protected String compile(String source) throws CompileErrorException { try { return LessCompilerHelper.compiler.compile(source).getCss(); } catch (Less4jException lessException) { throw new CompileErrorException(lessException); } }
private ParseResult toAntlrTree(LessSource source) throws Less4jException { ParseResult result; try { result = parser.parseStyleSheet(source.getContent(), source); } catch (FileNotFound ex) { throw new Less4jException(new GeneralProblem("The file " + source + " does not exists."), new CompilationResult(null)); } catch (CannotReadFile ex) { throw new Less4jException(new GeneralProblem("Cannot read the file " + source + "."), new CompilationResult(null)); } if (result.hasErrors()) { CompilationResult compilationResult = new CompilationResult("Errors during parsing phase, partial result is not available."); throw new Less4jException(result.getErrors(), compilationResult); } return result; }
@Override public void process(final Resource resource, final Reader reader, final Writer writer) throws IOException { try { final LessSource lessSource = new RelativeAwareLessSource(resource, IOUtils.toString(reader), locatorFactory); final CompilationResult result = compiler.compile(lessSource); logWarnings(result); writer.write(result.getCss()); } catch (final Less4jException e) { LOG.error("Failed to compile less resource: {}.", resource); for (final Problem problem : e.getErrors()) { LOG.error(problemAsString(problem)); } throw WroRuntimeException.wrap(e); } }
@Override protected byte[] compile(final ICombinedLessResource lessFile) { final long start = System.currentTimeMillis(); ThreadUnsafeLessCompiler compiler = new ThreadUnsafeLessCompiler(); try { return compiler.compile(lessFile.asText()).getCss().getBytes(getCharset()); } catch (Less4jException e) { LOG.error("can't compile {}: {}", lessFile.getName(), new ErrorLogger(lessFile.getName(), e)); throw new WicketRuntimeException("can't compile " + lessFile.getName(), e); } finally { LOG.debug("duration of collect imports for {}: {} ms", lessFile.getName(), System.currentTimeMillis() - start); } } };
@Override protected void send(final Request req, final Response rsp, final Asset asset) throws Exception { LessSource.URLSource src = new LessSource.URLSource(asset.resource(), req.charset().name()); CompilationResult result = compiler.compile(src); result.getWarnings().forEach(warning -> log.warn(warning.toString())); if (req.path().endsWith(".map")) { rsp.type(MediaType.json) .send(Results.ok(result.getSourceMap())); } else { rsp.type(MediaType.css) .send(Results.ok(result.getCss())); } } }
private CompilationResult createEmptyCompilationResult() { CompilationResult compilationResult = new CompilationResult("", null, problemsHandler.getWarnings()); return compilationResult; }
private void logWarnings(final CompilationResult result) { if (!result.getWarnings().isEmpty()) { LOG.warn("Less warnings are:"); for (final Problem problem : result.getWarnings()) { LOG.warn(problemAsString(problem)); } } }