@Override public Collection<Import> apply(final String url, final Import previous) { String fname = nameWithExtension(url); List<String> segments = Splitter.on('/').trimResults().omitEmptyStrings() .splitToList(previous.getAbsoluteUri().toString()); String relative = segments.subList(0, segments.size() - 1).stream() .collect(Collectors.joining("/", "/", "")); return Arrays.asList(relative + fname, fname) .stream() .map(resolver::apply) .filter(it -> it != null) .findFirst() .map(throwingFunction(it -> Try.with(it.toURL()::openStream) .apply(in -> new String(ByteStreams.toByteArray(in), StandardCharsets.UTF_8)) .map(content -> Arrays.asList(new Import(it, it, content))) .get() )) .orElse(null); }
@Override public Collection<Import> apply(String url, Import previous) { List<Import> list = new LinkedList<>(); list.add(createCustomHeaderImport(previous)); return list; }
/** * Gets the directory of the script resource that the importer is currently processing. * Must take into account previous @import for nested directives. * @return */ private String getCurrentDirectory(Import previous) { // if processing from standard in, use path to primary file if("stdin".equals(previous.getAbsoluteUri().getPath())) { pathToCurrentFile = pathToPrimaryFile; } else { pathToCurrentFile = previous.getAbsoluteUri().getPath(); } return pathToCurrentFile.substring(0, pathToCurrentFile.lastIndexOf("/") + 1); } }
private static NativeImport createPostImport(Import importSource) { StringBuilder postSource = new StringBuilder(); // $jsass-void: jsass_import_stack_pop() !global; postSource .append("$jsass-void: jsass_import_stack_pop() !global;") .append(System.lineSeparator()); try { return new NativeImport( new Import( new URI(importSource.getAbsoluteUri() + "/JSASS_POST_IMPORT.scss"), new URI(importSource.getAbsoluteUri() + "/JSASS_POST_IMPORT.scss"), postSource.toString() ) ); } catch (URISyntaxException e) { throw new ImportException(e); } } }
public NativeImport(final Import sassImport) { final URI uri = sassImport.getImportUri(); final URI base = sassImport.getAbsoluteUri(); final String contents = sassImport.getContents(); final String sourceMap = sassImport.getSourceMap(); String uriString = ""; if (null != uri) { if ("file".equals(uri.getScheme())) { uriString = new File(uri).getAbsolutePath(); } else { uriString = uri.toString(); } } String baseString = ""; if (null != base) { if ("file".equals(base.getScheme())) { baseString = new File(base).getAbsolutePath(); } else { baseString = base.toString(); } } this.importPath = uriString; this.absolutePath = baseString; this.contents = null == contents ? "" : contents; this.sourceMap = null == sourceMap ? "" : sourceMap; this.errorMessage = ""; }
Import buildImport(String importUri) { try { String contents = read(url); return new Import(importUri, absoluteUri, contents); } catch (URISyntaxException e) { throw new RuntimeException(e); } }
private static NativeImporterWrapper[] getHeaderImporters( ImportStack importStack, Options options ) { List<Importer> headerImportersList = options.getHeaderImporters(); NativeImporterWrapper[] headerImporters; try ( Stream<Importer> headerImportersStream = Stream .concat( Stream.of(new JsassCustomHeaderImporter(importStack)), headerImportersList.stream() ); ) { headerImporters = headerImportersStream .map(i -> new NativeImporterWrapper(importStack, i)) .collect(Collectors.toList()) .toArray(new NativeImporterWrapper[headerImportersList.size()]); } return headerImporters; }
private NativeImport createPostImport(Import importSource) { StringBuilder postSource = new StringBuilder(); // $jsass-void: jsass_import_stack_pop() !global; postSource.append("$jsass-void: jsass_import_stack_pop() !global;\n"); try { return new NativeImport( new Import( new URI(importSource.getAbsoluteUri() + "/JSASS_POST_IMPORT.scss"), new URI(importSource.getAbsoluteUri() + "/JSASS_POST_IMPORT.scss"), postSource.toString() ) ); } catch (URISyntaxException e) { throw new RuntimeException(e); } } }
private Import createCustomHeaderImport(Import previous) { int id = importStack.register(previous); StringBuilder source = new StringBuilder(); // $jsass-void: jsass_import_stack_push(<id>) !global; source.append( String.format( "$jsass-void: jsass_import_stack_push(%d) !global;%n", id ) ); try { return new Import( new URI(previous.getAbsoluteUri() + "/JSASS_CUSTOM.scss"), new URI(previous.getAbsoluteUri() + "/JSASS_CUSTOM.scss"), source.toString() ); } catch (URISyntaxException e) { throw new ImportException(e); } } }
public NativeImport(final Import sassImport) { final URI importUri = sassImport.getImportUri(); final URI absoluteUri = sassImport.getAbsoluteUri(); String uriString = ""; if (null != importUri) { if ("file".equals(importUri.getScheme())) { uriString = new File(importUri).getAbsolutePath(); } else { uriString = importUri.toString(); } } String absoluteString = ""; if (null != absoluteUri) { if ("file".equals(absoluteUri.getScheme())) { absoluteString = new File(absoluteUri).getAbsolutePath(); } else { absoluteString = absoluteUri.toString(); } } this.importPath = uriString; this.absolutePath = absoluteString; this.contents = Objects.toString(sassImport.getContents(), ""); this.sourceMap = Objects.toString(sassImport.getSourceMap(), ""); this.errorMessage = ""; }
Import buildImport(String importUri) { try { String contents = read(url); return new Import(importUri, absoluteUri, contents); } catch (URISyntaxException e) { throw new RuntimeException(e); } }
@Override public Collection<Import> apply(String importStr, Import previous) { URI base = previous.getAbsoluteUri(); URI uri = buildUri(importStr); Optional<URI> uriCss = tryBuildUriCss(importStr); Stream<Lookup> lookups = Stream.of( () -> findLocalFile(base, addUnderscore(uri)), () -> findLocalFile(base, uri), () -> uriCss.map(u -> findLocalFile(base, u)).orElse(Optional.empty()), () -> findResource(addUnderscore(uri)), () -> findResource(uri), () -> uriCss.map(Lookups::findResource).orElse(Optional.empty()), () -> findResource(addUnderscore(base.resolve(uri))), () -> findResource(base.resolve(uri)), () -> uriCss.map(u -> findResource(base.resolve(u))).orElse(Optional.empty()), () -> findWebJarResource(addUnderscore(uri), webJarTranslator), () -> findWebJarResource(uri, webJarTranslator), () -> uriCss.map(u -> findWebJarResource(u, webJarTranslator)).orElse(Optional.empty())); Optional<Lookup.Result> lookupResult = lookups .map(Lookup::run) .filter(Optional::isPresent) .map(Optional::get) .findFirst(); return lookupResult .map(r -> r.buildImport(importStr)) .map(Collections::singletonList) .orElse(null); }
@Override public Collection<Import> apply(String url, Import previous) { List<Import> list = new LinkedList<>(); list.add(createCustomHeaderImport(previous)); return list; }
private Import createCustomHeaderImport(Import previous) { int id = importStack.register(previous); StringBuilder source = new StringBuilder(); // $jsass-void: jsass_import_stack_push(<id>) !global; source.append( String.format( "$jsass-void: jsass_import_stack_push(%d) !global;\n", id ) ); try { return new Import( new URI(previous.getAbsoluteUri() + "/JSASS_CUSTOM.scss"), new URI(previous.getAbsoluteUri() + "/JSASS_CUSTOM.scss"), source.toString() ); } catch (URISyntaxException e) { throw new RuntimeException(e); } } }
private NativeImport createPreImport(Import importSource) { int id = importStack.register(importSource); StringBuilder preSource = new StringBuilder(); // $jsass-void: jsass_import_stack_push(<id>) !global; preSource.append( String.format( "$jsass-void: jsass_import_stack_push(%d) !global;%n", id ) ); try { return new NativeImport( new Import( new URI(importSource.getAbsoluteUri() + "/JSASS_PRE_IMPORT.scss"), new URI(importSource.getAbsoluteUri() + "/JSASS_PRE_IMPORT.scss"), preSource.toString() ) ); } catch (URISyntaxException e) { throw new ImportException(e); } }
/** * Try to determine the import object for a given path. * * @param path The path to resolve. * @return The import object or {@code null} if the file was not found. */ private Collection<Import> resolveImport(Path path) throws IOException, URISyntaxException { URL resource = resolveResource(path); if (null == resource) { return null; } final URI uri = resource.toURI(); final String source = IOUtils.toString(resource, StandardCharsets.UTF_8); final Import scssImport = new Import(uri, uri, source); return Collections.singleton(scssImport); }
@Override public Collection<Import> apply(String importStr, Import previous) { URI base = previous.getAbsoluteUri(); URI uri = buildUri(importStr); Optional<URI> uriCss = tryBuildUriCss(importStr); Stream<Lookup> lookups = Stream.of( () -> findLocalFile(base, addUnderscore(uri)), () -> findLocalFile(base, uri), () -> uriCss.map(u -> findLocalFile(base, u)).orElse(Optional.empty()), () -> findResource(addUnderscore(uri)), () -> findResource(uri), () -> uriCss.map(Lookups::findResource).orElse(Optional.empty()), () -> findResource(addUnderscore(base.resolve(uri))), () -> findResource(base.resolve(uri)), () -> uriCss.map(u -> findResource(base.resolve(u))).orElse(Optional.empty()), () -> findWebJarResource(addUnderscore(uri), webJarTranslator), () -> findWebJarResource(uri, webJarTranslator), () -> uriCss.map(u -> findWebJarResource(u, webJarTranslator)).orElse(Optional.empty())); Optional<Lookup.Result> lookupResult = lookups .map(Lookup::run) .filter(Optional::isPresent) .map(Optional::get) .findFirst(); return lookupResult .map(r -> r.buildImport(importStr)) .map(Collections::singletonList) .orElse(null); }
private NativeImport createPreImport(Import importSource) { int id = importStack.register(importSource); StringBuilder preSource = new StringBuilder(); // $jsass-void: jsass_import_stack_push(<id>) !global; preSource.append( String.format( "$jsass-void: jsass_import_stack_push(%d) !global;\n", id ) ); try { return new NativeImport( new Import( new URI(importSource.getAbsoluteUri() + "/JSASS_PRE_IMPORT.scss"), new URI(importSource.getAbsoluteUri() + "/JSASS_PRE_IMPORT.scss"), preSource.toString() ) ); } catch (URISyntaxException e) { throw new RuntimeException(e); } }