in freemarker-docgen-core/src/main/java/org/freemarker/docgen/core/PrintTextWithDocgenSubstitutionsDirective.java [253:301]
private void insertFile(InsertDirectiveArgs args) throws TemplateException, IOException {
int slashIndex = args.path.indexOf("/");
String symbolicNameStep = slashIndex != -1 ? args.path.substring(0, slashIndex) : args.path;
if (!symbolicNameStep.startsWith("@") || symbolicNameStep.length() < 2) {
throw newErrorInDocgenTag("Path argument must start with @<symbolicName>/, "
+ " where <symbolicName> is in " + transform.getInsertableFiles().keySet() + ".");
}
String symbolicName = symbolicNameStep.substring(1);
Path symbolicNamePath = transform.getInsertableFiles().get(symbolicName);
if (symbolicNamePath == null) {
throw newErrorInDocgenTag("Symbolic insertable file name "
+ StringUtil.jQuote(symbolicName) + " is not amongst the defined names: "
+ transform.getInsertableFiles().keySet());
}
symbolicNamePath = symbolicNamePath.toAbsolutePath().normalize();
Path resolvedFilePath = slashIndex != -1
? symbolicNamePath.resolve(args.path.substring(slashIndex + 1))
: symbolicNamePath;
resolvedFilePath = resolvedFilePath.normalize();
if (!resolvedFilePath.startsWith(symbolicNamePath)) {
throw newErrorInDocgenTag("Resolved path ("
+ resolvedFilePath + ") is not inside the base path ("
+ symbolicNamePath + ").");
}
if (!Files.isRegularFile(resolvedFilePath)) {
throw newErrorInDocgenTag("Not an existing file: " + resolvedFilePath);
}
Charset charset;
if (args.charset != null) {
try {
charset = Charset.forName(args.charset);
} catch (UnsupportedCharsetException e) {
throw newErrorInDocgenTag("Unsupported charset: " + args.charset);
}
} else {
charset = StandardCharsets.UTF_8;
}
try (InputStream in = Files.newInputStream(resolvedFilePath)) {
String fileContent = IOUtils.toString(in, charset);
String fileExt = FilenameUtils.getExtension(resolvedFilePath.getFileName().toString());
if (fileExt != null && fileExt.toLowerCase().startsWith("ftl")) {
fileContent = removeFTLCopyrightComment(fileContent);
}
cutAndInsertContent(args, fileContent);
}
}