Skip to content
This repository has been archived by the owner on Aug 19, 2022. It is now read-only.

Commit

Permalink
refactor: move structured file extension directly in the FileResource…
Browse files Browse the repository at this point in the history
…* class
  • Loading branch information
syjer committed Apr 16, 2015
1 parent f907186 commit 1ef958b
Show file tree
Hide file tree
Showing 13 changed files with 220 additions and 90 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
Expand Down Expand Up @@ -66,7 +67,11 @@ public class StampoGlobalConfiguration {
private final Path dataDir;

private final Map<String, Object> data;


//
private final Set<String> processorResourceExtensions;
private final Map<String, String> processorExtensionTransformMapping;
//

public StampoGlobalConfiguration(Map<String, Object> configuration, Path baseDirectory,
Path baseOutputDir, List<Renderer> renderers) {
Expand All @@ -87,6 +92,17 @@ public StampoGlobalConfiguration(Map<String, Object> configuration, Path baseDir
this.dataDir = baseDirectory.resolve("data").normalize();

this.data = extractData();


Set<String> resProcExt = new HashSet<>();
Map<String, String> resProcMapping = new HashMap<>();
for (Renderer renderer : renderers) {
resProcExt.addAll(renderer.resourceExtensions());
resProcMapping.putAll(renderer.extensionTransformMapping());
}

processorResourceExtensions = Collections.unmodifiableSet(resProcExt);
processorExtensionTransformMapping = Collections.unmodifiableMap(resProcMapping);
}

// patterns follow
Expand Down Expand Up @@ -229,4 +245,12 @@ public Map<String, Object> getData() {
public Set<String> getLocalesAsString() {
return localesAsString;
}

public Set<String> getProcessorResourceExtensions() {
return processorResourceExtensions;
}

public Map<String, String> getProcessorExtensionTransformMapping() {
return processorExtensionTransformMapping;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,19 +24,18 @@
import java.util.Map;
import java.util.Optional;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;

import ch.digitalfondue.stampo.StampoGlobalConfiguration;
import ch.digitalfondue.stampo.resource.Directory;
import ch.digitalfondue.stampo.resource.FileMetadata;
import ch.digitalfondue.stampo.resource.FileResource;
import ch.digitalfondue.stampo.resource.Resource;
import ch.digitalfondue.stampo.resource.StructuredFileExtension;

class FileResourceProcessor {

private final Map<String, Function<FileResourceParameters, FileResourceProcessorOutput>> processors;
private final Map<String, String> resultingProcessedFileExtensions;

private final Path contentDir, outputDir;
private final StampoGlobalConfiguration configuration;
Expand All @@ -48,13 +47,11 @@ class FileResourceProcessor {
this.configuration = configuration;

Map<String, Function<FileResourceParameters, FileResourceProcessorOutput>> p = new HashMap<>();
Map<String, String> r = new HashMap<>();

configuration.getRenderers().forEach(
(renderer) -> renderer.registerResourceRenderer(root, configuration, p, r));
(renderer) -> renderer.registerResourceRenderer(root, configuration, p));

processors = Collections.unmodifiableMap(p);
resultingProcessedFileExtensions = Collections.unmodifiableMap(r);
}

private static class ProcessedFileResource implements FileResource {
Expand Down Expand Up @@ -92,15 +89,20 @@ public FileMetadata getMetadata() {
public Optional<String> getContent() {
return content;
}

@Override
public StructuredFileExtension getStructuredFileExtension() {
return fileResource.getStructuredFileExtension();
}

}


FileResourceProcessorOutput applyProcessors(FileResource fileResource, Locale locale, Map<String, Object> model) {

ClassifiedFileExtension ext = classifyExtension(fileResource);
StructuredFileExtension ext = fileResource.getStructuredFileExtension();

List<String> processorsExt = new ArrayList<>(ext.processorRelatedExts);
List<String> processorsExt = new ArrayList<>(ext.getProcessorRelatedExts());
Collections.reverse(processorsExt);

List<Function<FileResourceParameters, FileResourceProcessorOutput>> processorsToApply = processorsExt.stream().map(processors::get).collect(Collectors.toList());
Expand Down Expand Up @@ -152,7 +154,7 @@ FileResourceProcessorOutput applyProcessors(FileResource fileResource, Locale lo
*/
String finalOutputName(FileResource fileResource) {

ClassifiedFileExtension fileExt = classifyExtension(fileResource);
StructuredFileExtension fileExt = fileResource.getStructuredFileExtension();

String fileNameWithoutExt = fileResource.getFileNameWithoutExtensions();
String extension = fileExt.getFinalFileExtension();
Expand All @@ -167,67 +169,10 @@ String finalOutputName(FileResource fileResource) {
}
}

@SuppressWarnings("unused")
private static class ClassifiedFileExtension {

final List<String> processorRelatedExts;
final Optional<String> processorFileExtensionOverride;
final Optional<String> maybeFileExtension;
final List<String> locales;
final String rest;


ClassifiedFileExtension(List<String> processorRelatedExts,
Optional<String> processorFileExtensionOverride,
Optional<String> maybeFileExtension, List<String> locales, List<String> rest) {
this.processorRelatedExts = processorRelatedExts;
this.processorFileExtensionOverride = processorFileExtensionOverride;
this.maybeFileExtension = maybeFileExtension;
this.locales = locales;
this.rest = rest.stream().collect(Collectors.joining("."));
}

String getFinalFileExtension() {
String finalExt = processorFileExtensionOverride.orElseGet(() -> maybeFileExtension.orElse(""));
return (rest.length() > 0 ? "." : "") + rest + (finalExt.length() > 0 ? "." : "") + finalExt;
}
}

// TODO: check possible inconsistency with FileResource.containLocaleInFileExtensions
/* given a list of extensions, return a structured view */
private ClassifiedFileExtension classifyExtension(FileResource fileResource) {
List<String> exts = fileResource.getFileExtensions();
//

List<String> processorRelated = takeWhile(exts, processors::containsKey);

//e.g. : md -> html mapping is present
Optional<String> processorFileExtensionOverride = processorRelated.stream().findFirst().map(resultingProcessedFileExtensions::get);

List<String> afterProcessorRelated = exts.subList(processorRelated.size(), exts.size());

// if the next token does not match a locale, it's possibly a file extension
Optional<String> maybeFileExtension = afterProcessorRelated.stream().findFirst().filter(ext -> !configuration.getLocalesAsString().contains(ext));

List<String> afterMaybeFileExtension = afterProcessorRelated.subList(maybeFileExtension.isPresent() ? 1 : 0, afterProcessorRelated.size());
List<String> locales = takeWhile(afterMaybeFileExtension, (ext -> configuration.getLocalesAsString().contains(ext)));
List<String> afterLocales = new ArrayList<>(afterMaybeFileExtension.subList(locales.size(), afterMaybeFileExtension.size()));
Collections.reverse(afterLocales);

return new ClassifiedFileExtension(processorRelated, processorFileExtensionOverride, maybeFileExtension, locales, afterLocales);
}




private static <T> List<T> takeWhile(List<T> l, Predicate<T> pred) {
List<T> r = new ArrayList<>(l.size());
for (T i : l) {
if(pred.test(i)) {
r.add(i);
} else {
return r;
}
}
return r;
}

/**
* Generate the output path given the resource and the output dir.
Expand Down
7 changes: 5 additions & 2 deletions src/main/java/ch/digitalfondue/stampo/renderer/Renderer.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

import java.nio.file.Path;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.function.Function;

Expand All @@ -36,10 +37,12 @@ void registerLayoutRenderer(Directory root, StampoGlobalConfiguration configurat
void registerResourceRenderer(
Directory root,
StampoGlobalConfiguration configuration,
Map<String, Function<FileResourceParameters, FileResourceProcessorOutput>> extensionProcessor,
Map<String, String> extensionTransformMapping);
Map<String, Function<FileResourceParameters, FileResourceProcessorOutput>> extensionProcessor);


List<String> resourceExtensions();
Map<String, String> extensionTransformMapping();

static FileResource getContentFileResource(Path template, Path contentDir, Directory root) {
if (!template.startsWith(contentDir)) {
throw new IllegalArgumentException();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
package ch.digitalfondue.stampo.renderer.freemarker;

import java.io.StringWriter;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.ResourceBundle;
Expand Down Expand Up @@ -66,8 +68,7 @@ public void registerLayoutRenderer(Directory root, StampoGlobalConfiguration con
public void registerResourceRenderer(
Directory root,
StampoGlobalConfiguration configuration,
Map<String, Function<FileResourceParameters, FileResourceProcessorOutput>> extensionProcessor,
Map<String, String> extensionTransformMapping) {
Map<String, Function<FileResourceParameters, FileResourceProcessorOutput>> extensionProcessor) {

Configuration c = getConfiguration(root, configuration);

Expand Down Expand Up @@ -100,4 +101,14 @@ private static Configuration getConfiguration(Directory root,
return c;
}

@Override
public List<String> resourceExtensions() {
return Collections.singletonList("ftl");
}

@Override
public Map<String, String> extensionTransformMapping() {
return Collections.emptyMap();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,10 @@
package ch.digitalfondue.stampo.renderer.markdown;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

import org.pegdown.PegDownProcessor;

Expand All @@ -30,6 +32,8 @@
import ch.digitalfondue.stampo.resource.Directory;

public class MarkdownRenderer implements Renderer {

private static final List<String> EXTENSIONS = Arrays.asList("markdown", "mdown", "mkdn", "mkd", "md");

private static Function<FileResourceParameters, FileResourceProcessorOutput> fileResourceProcessor() {

Expand All @@ -48,16 +52,24 @@ public void registerLayoutRenderer(Directory root, StampoGlobalConfiguration con
public void registerResourceRenderer(
Directory root,
StampoGlobalConfiguration configuration,
Map<String, Function<FileResourceParameters, FileResourceProcessorOutput>> extensionProcessor,
Map<String, String> extensionTransformMapping) {
Map<String, Function<FileResourceParameters, FileResourceProcessorOutput>> extensionProcessor) {

Function<FileResourceParameters, FileResourceProcessorOutput> processor =
fileResourceProcessor();

for (String extension : Arrays.asList("markdown", "mdown", "mkdn", "mkd", "md")) {
for (String extension : EXTENSIONS) {
extensionProcessor.put(extension, processor);
extensionTransformMapping.put(extension, "html");
}
}

@Override
public List<String> resourceExtensions() {
return EXTENSIONS;
}

@Override
public Map<String, String> extensionTransformMapping() {
return EXTENSIONS.stream().collect(Collectors.toMap(Function.identity(), (_ignore) -> "html"));
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@
import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.function.Function;

Expand Down Expand Up @@ -69,8 +71,7 @@ public void registerLayoutRenderer(Directory root, StampoGlobalConfiguration con
public void registerResourceRenderer(
Directory root,
StampoGlobalConfiguration configuration,
Map<String, Function<FileResourceParameters, FileResourceProcessorOutput>> extensionProcessor,
Map<String, String> extensionTransformMapping) {
Map<String, Function<FileResourceParameters, FileResourceProcessorOutput>> extensionProcessor) {
PebbleEngine pebble = build(root, configuration);
extensionProcessor.put("peb", (params) -> {
try {
Expand All @@ -84,4 +85,18 @@ public void registerResourceRenderer(
}
});
}



@Override
public List<String> resourceExtensions() {
return Collections.singletonList("peb");
}



@Override
public Map<String, String> extensionTransformMapping() {
return Collections.emptyMap();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,11 +31,8 @@ public interface FileResource extends Resource {
StampoGlobalConfiguration getConfiguration();
FileMetadata getMetadata();
Optional<String> getContent();
StructuredFileExtension getStructuredFileExtension();

default boolean containLocaleInFileExtensions() {
return getFileExtensions().stream().anyMatch(getConfiguration().getLocalesAsString()::contains);
}

/**
* File extensions, ordered last to first.
*
Expand Down
Loading

0 comments on commit 1ef958b

Please sign in to comment.