@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); } }
@Override public CompilationResult compile(File lessFile) throws Less4jException { LessSource.FileSource lessSource = new LessSource.FileSource(lessFile); return compile(lessSource, null); }
private CompilationResult doCompile(LessSource source, Configuration options) throws Less4jException { StyleSheet lessStyleSheet = null; if (options != null && options.getCache() != null) { lessStyleSheet = (StyleSheet) options.getCache().getAst(source); if (lessStyleSheet != null) { lessStyleSheet = lessStyleSheet.clone(); // need to leave cached version unchanged } } if (lessStyleSheet == null) { ParseResult result = toAntlrTree(source); lessStyleSheet = astBuilder.parseStyleSheet(result.getTree()); if (options != null && options.getCache() != null) { options.getCache().setAst(source, lessStyleSheet); lessStyleSheet = lessStyleSheet.clone(); // need to leave cached version unchanged } } Map<String, HiddenTokenAwareTree> variables = toAntlrTree(options.getVariables()); List<VariableDeclaration> externalVariables = astBuilder.parseVariables(variables); lessStyleSheet.addMembers(externalVariables); lessStyleSheet.configureParentToAllChilds(); try { ASTCssNode cssStyleSheet = compiler.compileToCss(lessStyleSheet, source, options); CompilationResult compilationResult = createCompilationResult(cssStyleSheet, source, externalVariables, compiler.getImportedsources(), options); return compilationResult; } catch (UnableToFinish ex) { problemsHandler.unableToFinish(lessStyleSheet, ex); return createEmptyCompilationResult(); } }
private void handleSourceMapLink(ASTCssNode cssAst, StringBuilder css, Configuration options, LessSource source, String sourceMap) { String cssResultLocation = getCssResultLocationName(options, source); LessCompiler.SourceMapConfiguration sourceMapConfiguration = options.getSourceMapConfiguration(); if (!sourceMapConfiguration.shouldLinkSourceMap() && !sourceMapConfiguration.isInline()) return; if (!sourceMapConfiguration.isInline() && cssResultLocation == null) { problemsHandler.warnSourceMapLinkWithoutCssResultLocation(cssAst); return; } addNewLine(css); String commentText; String encodingCharset = sourceMapConfiguration.getEncodingCharset(); if (sourceMapConfiguration.isInline()) { String encodedSourceMap = PrintUtils.base64Encode(sourceMap, encodingCharset, problemsHandler, cssAst); commentText = "/*# sourceMappingURL=data:application/json;base64," + encodedSourceMap + " */"; } else { // compose linking comment String url = sourceMapConfiguration.getSourceMapNameGenerator().generateUrl(cssResultLocation); String encodedUrl = PrintUtils.urlEncode(url, encodingCharset, problemsHandler, cssAst); commentText = "/*# sourceMappingURL=" + encodedUrl + " */"; } css.append(commentText).append("\n"); }
@Override public CompilationResult compile(LessSource source, Configuration options) throws Less4jException { if (options == null) options = new Configuration(); problemsHandler = new ProblemsHandler(); astBuilder = new ASTBuilder(problemsHandler); compiler = new LessToCssCompiler(problemsHandler, options); CompilationResult compilationResult = doCompile(source, options); if (problemsHandler.hasErrors()) { throw new Less4jException(problemsHandler.getErrors(), compilationResult); } return compilationResult; }
private static void basicFileExample() throws Less4jException { File inputLessFile = createFile("sampleInput.less", "* { margin: 1 1 1 1; }"); LessCompiler compiler = new ThreadUnsafeLessCompiler(); CompilationResult compilationResult = compiler.compile(inputLessFile); System.out.println(compilationResult.getCss()); for (Problem warning : compilationResult.getWarnings()) { System.err.println(format(warning)); } deleteFile(inputLessFile); }
@Override public CompilationResult compile(URL lessURL) throws Less4jException { return compile(new LessSource.URLSource(lessURL)); }
@Override public CompilationResult compile(String lessContent, Configuration options) throws Less4jException { ThreadUnsafeLessCompiler compiler = new ThreadUnsafeLessCompiler(); return compiler.compile(lessContent, options); }
@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 public CompilationResult compile(String lessContent) throws Less4jException { return compile(new LessSource.StringSource(lessContent), null); }
@Override public CompilationResult compile(File lessFile) throws Less4jException { ThreadUnsafeLessCompiler compiler = new ThreadUnsafeLessCompiler(); return compiler.compile(lessFile); }
@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 public CompilationResult compile(String lessContent, Configuration options) throws Less4jException { return compile(new LessSource.StringSource(lessContent), options); }
@Override public CompilationResult compile(URL lessURL, Configuration options) throws Less4jException { ThreadUnsafeLessCompiler compiler = new ThreadUnsafeLessCompiler(); return compiler.compile(lessURL, options); }
@Override public CompilationResult compile(File lessFile, Configuration options) throws Less4jException { return compile(new LessSource.FileSource(lessFile, "utf-8"), options); }
@Override public CompilationResult compile(File lessFile, Configuration options) throws Less4jException { ThreadUnsafeLessCompiler compiler = new ThreadUnsafeLessCompiler(); return compiler.compile(lessFile, options); }
@Override public CompilationResult compile(URL lessURL, Configuration options) throws Less4jException { return compile(new LessSource.URLSource(lessURL), options); }
@Override public CompilationResult compile(LessSource source, Configuration options) throws Less4jException { ThreadUnsafeLessCompiler compiler = new ThreadUnsafeLessCompiler(); return compiler.compile(source, options); }
@Override public CompilationResult compile(LessSource source) throws Less4jException { return compile(source, new Configuration()); }