![JAR search and dependency download from the Maven repository](/logo.png)
io.marioslab.basis.site.FunctionProvider Maven / Gradle / Ivy
package io.marioslab.basis.site;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.function.BiFunction;
import java.util.function.Function;
import io.marioslab.basis.template.TemplateContext;
/** Provides functions to a template by setting them on a {@link TemplateContext}. You can specify providers for site generation
* via the {@link Configuration} class. **/
public interface FunctionProvider {
@FunctionalInterface
public interface VoidFunction {
void apply (S s);
}
@FunctionalInterface
public interface TriFunction {
R apply (S s, T t, U u);
}
@FunctionalInterface
public interface QuadFunction {
R apply (S s, T t, U u, V v);
}
public void provide (File input, File output, Configuration config, TemplateContext context);
public static class BuiltinFunctionProvider implements FunctionProvider {
private void list (Configuration config, File directory, List files, boolean withMetadataOnly, boolean recursive) {
File[] children = directory.listFiles();
if (children != null) {
for (File child : children) {
if (child.isFile()) {
Map metadata = FileUtils.readMetadataBlock(child);
if ((withMetadataOnly && metadata != null) || !withMetadataOnly) {
File childOutput = new File(config.getOutput(),
child.getAbsolutePath().replace(".bt.", ".").replace(config.getInput().getAbsolutePath(), ""));
files.add(new SiteFile(child.getParent(), child.getName(), childOutput.getParent(), childOutput.getName(), child.isDirectory(), metadata));
}
} else if (child.isDirectory() && recursive) {
list(config, child, files, withMetadataOnly, recursive);
}
}
}
}
@SuppressWarnings("unchecked")
@Override
public void provide (File input, File output, Configuration config, TemplateContext context) {
context.set("formatDate", (BiFunction) (String format, Date date) -> {
return new SimpleDateFormat(format).format(date);
});
context.set("listFiles", (TriFunction>) (String dir, Boolean withMetadataOnly, Boolean recursive) -> {
List files = new ArrayList();
File directory = new File(input.getParentFile(), dir);
list(config, directory, files, withMetadataOnly, recursive);
return files;
});
context.set("sortFiles",
(TriFunction, String, Boolean, List>) (List files, String metadataField, Boolean ascending) -> {
files.sort( (SiteFile a, SiteFile b) -> {
int result = 0;
Object valA = a.metadata != null ? a.metadata.get(metadataField) : null;
Object valB = b.metadata != null ? b.metadata.get(metadataField) : null;
if (valA == null && valB == null)
return 0;
else if (valA == null && valB != null)
result = -1;
else if (valA != null && valB == null)
result = 1;
else {
if (valA instanceof Integer && valB instanceof Integer) {
result = ((Integer)valA).compareTo((Integer)valB);
} else if (valA instanceof Float && valB instanceof Float) {
result = ((Float)valA).compareTo((Float)valB);
} else if (valA instanceof Boolean && valB instanceof Boolean) {
result = ((Boolean)valA).compareTo((Boolean)valB);
} else if (valA instanceof Date && valB instanceof Date) {
result = ((Date)valA).compareTo((Date)valB);
} else if (valA instanceof String && valB instanceof String) {
result = ((String)valA).compareTo((String)valB);
} else {
result = 0;
}
}
return ascending ? result : -result;
});
return files;
});
context.set("sort", (BiFunction
© 2015 - 2025 Weber Informatics LLC | Privacy Policy