private Configuration lessConf(final Config conf) { Configuration configuration = new Configuration(); configuration.setCompressing(get("compressing")); SourceMapConfiguration sourceMap = configuration.getSourceMapConfiguration(); Map<String, Object> map = get("sourceMap"); if (map == null) { sourceMap.setLinkSourceMap(false); } else { sourceMap.setEncodingCharset( map.getOrDefault("encodingCharset", conf.getAnyRef("application.charset")).toString()); sourceMap.setIncludeSourcesContent((Boolean) map.getOrDefault("includeSourcesContent", true)); sourceMap.setInline((Boolean) map.getOrDefault("inline", true)); sourceMap.setRelativizePaths((Boolean) map.getOrDefault("relativizePaths", true)); sourceMap.setLinkSourceMap((Boolean) map.getOrDefault("linkSourceMap", true)); } return configuration; }
@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); } }
private LessSource source(final String filename) throws StringSourceException { String[] files = {path + filename, filename }; for (String file : files) { InputStream stream = getClass().getResourceAsStream(file); if (stream != null) { try { return new LessStrSource( new String(ByteStreams.toByteArray(stream), StandardCharsets.UTF_8), file); } catch (IOException ex) { log.debug("Can't read file: " + path, ex); throw new StringSourceException(); } finally { Closeables.closeQuietly(stream); } } } throw new StringSourceException(); }
@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); } }
private CompilationResult compile(File lessFile, File cssFile, boolean generateSourceMap, boolean isCompressing, boolean ieCompatibility) throws Less4jException { Configuration configuration = new Configuration(); configuration.setCssResultLocation(cssFile); configuration.setCompressing(isCompressing); configuration.setIeCompatibility(ieCompatibility); configuration.getSourceMapConfiguration().setLinkSourceMap(generateSourceMap && cssFile != null); DefaultLessCompiler compiler = new DefaultLessCompiler(); return compiler.compile(lessFile, configuration); }
/** * Invoked from {@link #transform(org.apache.tapestry5.ioc.Resource, org.apache.tapestry5.services.assets.ResourceDependencies)} * to perform the actual work of compiling a {@link org.apache.tapestry5.ioc.Resource} which has been wrapped as a * {@link com.github.sommeri.less4j.LessSource}. */ protected LessCompiler.CompilationResult compile(LessCompiler compiler, LessSource lessSource) throws Less4jException { return compiler.compile(lessSource); } }
private LessCompiler.Configuration createConfiguration(File cssOutut) { LessCompiler.Configuration configuration = new LessCompiler.Configuration(); configuration.setCssResultLocation(new LessSource.FileSource(cssOutut)); configuration.setCompressing(compress); return configuration; }
private String toLineCharReport(Problem problem) { if (problem.getLine() == -1 || problem.getCharacter() == -1) return ""; return problem.getLine() + ":" + problem.getCharacter(); }
private void configureSourceMap(Configuration configuration) { SourceMapConfiguration sourceMaps = configuration.getSourceMapConfiguration(); sourceMaps.setLinkSourceMap(false); sourceMaps.setInline(inline); }
private LessCompiler.SourceMapConfiguration getSourceMapConfiguration(LessCompiler.Configuration options) { return options != null ? options.getSourceMapConfiguration() : new LessCompiler.SourceMapConfiguration(); }
private String getCssResultLocationName(Configuration options, LessSource source) { LessSource location = options.getCssResultLocation(); String name = location == null ? null : location.getName(); if (name == null) name = URIUtils.changeSuffix(source.getName(), Constants.CSS_SUFFIX); return name; }
@Override public String getContent() throws FileNotFound, CannotReadFile { FileSource fileSource = new FileSource(file, charsetName); return fileSource.getContent(); }
@Override public String getName() { FileSource fileSource = new FileSource(file, charsetName); return fileSource.getName(); }
public void setLatestModified(long latestModified) { this.latestModified = latestModified; if (parent != null && latestModified > parent.getLatestModified()) { parent.setLatestModified(latestModified); } }
public Less4jException(List<Problem> errors, CompilationResult partialResult) { super(); this.errors = errors; this.partialResult = partialResult; this.message = createMessage(); }
@Override public boolean canEvaluate(FunctionExpression input, List<Expression> parameters) { for (LessFunction function : functions) { if (function.canEvaluate(input, parameters)) return true; } return false; }
public FileSource(FileSource parent, File inputFile, String charsetName) { super(parent); this.inputFile = inputFile; this.charsetName = charsetName; parent.addImportedSource(this); }
@Override public CompilationResult compile(final LessSource source, final Configuration options) throws Less4jException { return compiler.compile(source, options); }
@Override public CompilationResult compile(final String lessContent, final Configuration options) throws Less4jException { return compiler.compile(lessContent, options); }
/** * Invoked from {@link #transform(org.apache.tapestry5.ioc.Resource, org.apache.tapestry5.services.assets.ResourceDependencies)} * to perform the actual work of compiling a {@link org.apache.tapestry5.ioc.Resource} which has been wrapped as a * {@link com.github.sommeri.less4j.LessSource}. */ protected LessCompiler.CompilationResult compile(LessCompiler compiler, LessSource lessSource) throws Less4jException { return compiler.compile(lessSource); } }