You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@freemarker.apache.org by dd...@apache.org on 2016/01/01 20:25:46 UTC
incubator-freemarker-docgen git commit: Added features so that the
non-binary output files will contain a configured copyright header comment
Repository: incubator-freemarker-docgen
Updated Branches:
refs/heads/master 3f34f5638 -> b69ded483
Added features so that the non-binary output files will contain a configured copyright header comment
Project: http://git-wip-us.apache.org/repos/asf/incubator-freemarker-docgen/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-freemarker-docgen/commit/b69ded48
Tree: http://git-wip-us.apache.org/repos/asf/incubator-freemarker-docgen/tree/b69ded48
Diff: http://git-wip-us.apache.org/repos/asf/incubator-freemarker-docgen/diff/b69ded48
Branch: refs/heads/master
Commit: b69ded483275ad4d1c0be1f7dee043eff9b6ea93
Parents: 3f34f56
Author: ddekany <dd...@apache.org>
Authored: Fri Jan 1 20:25:30 2016 +0100
Committer: ddekany <dd...@apache.org>
Committed: Fri Jan 1 20:25:30 2016 +0100
----------------------------------------------------------------------
.../org/freemarker/docgen/CJSONInterpreter.java | 4 +-
src/main/org/freemarker/docgen/TextUtil.java | 39 ++++++
src/main/org/freemarker/docgen/Transform.java | 129 ++++++++++++++++---
.../org/freemarker/docgen/statics/fonts/NOTICE | 19 +++
.../docgen/statics/fonts/README-BUILD.txt | 19 ---
.../freemarker/docgen/statics/fonts/icomoon.svg | 1 +
.../docgen/templates/eclipse-toc.ftlx | 5 +
.../org/freemarker/docgen/templates/page.ftlh | 5 +
.../freemarker/docgen/templates/sitemap.ftlx | 5 +
.../freemarker/docgen/templates/toc-json.ftl | 3 +
10 files changed, 193 insertions(+), 36 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-freemarker-docgen/blob/b69ded48/src/main/org/freemarker/docgen/CJSONInterpreter.java
----------------------------------------------------------------------
diff --git a/src/main/org/freemarker/docgen/CJSONInterpreter.java b/src/main/org/freemarker/docgen/CJSONInterpreter.java
index 615b555..8b23cfe 100644
--- a/src/main/org/freemarker/docgen/CJSONInterpreter.java
+++ b/src/main/org/freemarker/docgen/CJSONInterpreter.java
@@ -774,7 +774,7 @@ final class CJSONInterpreter {
c = tx.charAt(p);
- // Map:
+ // JSON Object:
if (c == '{') {
Object nr;
p++;
@@ -815,7 +815,7 @@ final class CJSONInterpreter {
return res; //!
}
- // List:
+ // JSON array:
if (c == '[') {
p++;
List<Object> res = new ArrayList<Object>();
http://git-wip-us.apache.org/repos/asf/incubator-freemarker-docgen/blob/b69ded48/src/main/org/freemarker/docgen/TextUtil.java
----------------------------------------------------------------------
diff --git a/src/main/org/freemarker/docgen/TextUtil.java b/src/main/org/freemarker/docgen/TextUtil.java
index ed3b47e..5e6f8ae 100644
--- a/src/main/org/freemarker/docgen/TextUtil.java
+++ b/src/main/org/freemarker/docgen/TextUtil.java
@@ -18,6 +18,11 @@
*/
package org.freemarker.docgen;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+
+import freemarker.template.utility.StringUtil;
+
final class TextUtil {
// Can't be instantiated
@@ -262,5 +267,39 @@ final class TextUtil {
return sb.toString();
}
+
+ public static String detectEOL(String s, String defaultEOL) {
+ int unixEOLs = 0;
+ int windowsEOLs = 0;
+ int macEOLs = 0;
+ for (int i = 0; i < s.length(); i++) {
+ char c = s.charAt(i);
+ if (c == '\n') {
+ unixEOLs++;
+ }
+ if (c == '\r') {
+ if (i + 1 < s.length() && s.charAt(i + 1) == '\n') {
+ i++;
+ windowsEOLs++;
+ } else {
+ macEOLs++;
+ }
+ }
+ }
+
+ if (unixEOLs > windowsEOLs && unixEOLs > macEOLs) {
+ return "\n";
+ } else if (windowsEOLs > unixEOLs && windowsEOLs > macEOLs) {
+ return "\r\n";
+ } else if (macEOLs > unixEOLs && macEOLs > windowsEOLs) {
+ return "\r";
+ } else {
+ return defaultEOL;
+ }
+ }
+
+ public static String normalizeEOL(final String s, String eol) throws FileNotFoundException, IOException {
+ return StringUtil.replace(s, "\r\n", eol).replace("\n", eol).replace("\r", eol);
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-freemarker-docgen/blob/b69ded48/src/main/org/freemarker/docgen/Transform.java
----------------------------------------------------------------------
diff --git a/src/main/org/freemarker/docgen/Transform.java b/src/main/org/freemarker/docgen/Transform.java
index c1c6e21..5bc998d 100644
--- a/src/main/org/freemarker/docgen/Transform.java
+++ b/src/main/org/freemarker/docgen/Transform.java
@@ -49,13 +49,19 @@ import static org.freemarker.docgen.DocBook5Constants.VISIBLE_TOPLEVEL_ELEMENTS;
import static org.freemarker.docgen.DocBook5Constants.XMLNS_DOCBOOK5;
import static org.freemarker.docgen.DocBook5Constants.XMLNS_XLINK;
+import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
+import java.io.InputStream;
import java.io.OutputStreamWriter;
+import java.io.StringReader;
import java.io.Writer;
import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
import java.text.Collator;
import java.util.ArrayList;
import java.util.Collections;
@@ -369,7 +375,12 @@ import freemarker.template.utility.StringUtil;
* <li><p><tt>showXXELogo</tt> (boolean): Specifies if an
* "Edited with XXE" logo should be shown on the generated pages.
* Defaults to <tt>false</tt>.
- *
+ *
+ * <li><p><tt>copyrightStartYear</tt> (String): Used in the page footer copyright notice.
+ * <li><p><tt>copyrightHolder</tt> (String): Used in the page footer copyright notice.
+ * <li><p><tt>copyrightCommentFile</tt> (String): The path of a HTML file to the text used inside
+ * the output files as copyright header comment. If this path is relative, it's relative to the source
+ * directory.
* </ul>
*
* <li><p><tt>docgen-templates</tt> directory:
@@ -402,7 +413,7 @@ import freemarker.template.utility.StringUtil;
* <li>You can omit the commas that otherwise would be at the end of the line.
* <li>JavaScript comments are supported (<tt>/* ... *<!-- -->/</tt> and
* <tt>// ...</tt>)
- * <li>If a file is expected to contain a map, like most configuration
+ * <li>If a file is expected to contain a JSON object, like most configuration
* files are, putting the whole thing between <tt>{</tt> and <tt>}</tt> is
* optional.
* <li>Maps remember the order in which the entries were specified in the
@@ -474,6 +485,7 @@ public final class Transform {
static final String SETTING_EXTERNAL_BOOKMARKS = "externalBookmarks";
static final String SETTING_COPYRIGHT_HOLDER = "copyrightHolder";
static final String SETTING_COPYRIGHT_START_YEAR = "copyrightStartYear";
+ static final String SETTING_COPYRIGHT_COMMENT_FILE = "copyrightCommentFile";
static final String SETTING_SEO_META = "seoMeta";
static final String SETTING_LOGO = "logo";
static final String SETTING_LOGO_KEY_SRC = "src";
@@ -540,6 +552,8 @@ public final class Transform {
= SETTING_DEPLOY_URL;
private static final String VAR_ONLINE_TRACKER_HTML
= SETTING_ONLINE_TRACKER_HTML;
+ private static final String VAR_COPYRIGHT_COMMENT = "copyrightComment";
+ private static final String VAR_COPYRIGHT_JAVA_COMMENT = "copyrightJavaComment";
private static final String VAR_SHOW_EDITORAL_NOTES
= "showEditoralNotes";
private static final String VAR_TRANSFORM_START_TIME
@@ -766,6 +780,8 @@ public final class Transform {
private String copyrightHolder;
private Integer copyrightStartYear;
+ private String copyrightComment;
+ private String copyrightJavaComment;
private Map<String, Map<String, String>> seoMeta;
@@ -928,6 +944,14 @@ public final class Transform {
copyrightHolder = castSettingToString(cfgFile, settingName, settingValue);
} else if (settingName.equals(SETTING_COPYRIGHT_START_YEAR)) {
copyrightStartYear = castSettingToInt(cfgFile, settingName, settingValue);
+ } else if (settingName.equals(SETTING_COPYRIGHT_COMMENT_FILE)) {
+ copyrightComment = StringUtil.chomp(getFileContentForSetting(cfgFile, settingName, settingValue));
+ String eol = TextUtil.detectEOL(copyrightComment, "\n");
+ StringBuilder sb = new StringBuilder("/*").append(eol);
+ new BufferedReader(new StringReader(copyrightComment)).lines()
+ .forEach(s -> sb.append(" * ").append(s).append(eol));
+ sb.append(" */");
+ copyrightJavaComment = sb.toString();
} else if (settingName.equals(SETTING_SEO_META)) {
Map<String, Object> m = castSettingToMap(
cfgFile, settingName, settingValue);
@@ -1023,14 +1047,7 @@ public final class Transform {
} else if (settingName.equals(SETTING_DEPLOY_URL)) {
deployUrl = castSettingToString(cfgFile, settingName, settingValue);
} else if (settingName.equals(SETTING_ONLINE_TRACKER_HTML)) {
- String onlineTrackerHtmlPath = castSettingToString(cfgFile, settingName, settingValue);
- File f = new File(getSourceDirectory(), onlineTrackerHtmlPath);
- if (!f.exists()) {
- throw newCfgFileException(
- cfgFile, SETTING_ONLINE_TRACKER_HTML,
- "File not found: " + f.toPath());
- }
- onlineTrackerHTML = FileUtil.loadString(f, UTF_8);
+ onlineTrackerHTML = getFileContentForSetting(cfgFile, settingName, settingValue);
} else if (settingName.equals(SETTING_REMOVE_NODES_WHEN_ONLINE)) {
removeNodesWhenOnline = Collections.unmodifiableSet(new HashSet<String>(
castSettingToStringList(cfgFile, settingName, settingValue)));
@@ -1329,6 +1346,10 @@ public final class Transform {
fmConfig.setSharedVariable(
VAR_COPYRIGHT_START_YEAR, copyrightStartYear);
fmConfig.setSharedVariable(
+ VAR_COPYRIGHT_COMMENT, copyrightComment);
+ fmConfig.setSharedVariable(
+ VAR_COPYRIGHT_JAVA_COMMENT, copyrightJavaComment);
+ fmConfig.setSharedVariable(
VAR_TABS, tabs);
fmConfig.setSharedVariable(
VAR_SECONDARY_TABS, secondaryTabs);
@@ -1471,6 +1492,7 @@ public final class Transform {
copyCommonStatic("fonts/icomoon.svg");
copyCommonStatic("fonts/icomoon.ttf");
copyCommonStatic("fonts/icomoon.woff");
+ copyCommonStatic("fonts/NOTICE");
for (int i = 1; i < 15; i++) {
copyCommonStatic("img/callouts/" + i + ".gif");
@@ -1624,7 +1646,7 @@ public final class Transform {
}
return (String) settingValue;
}
-
+
private boolean caseSettingToBoolean(File cfgFile,
String settingName, Object settingValue) throws DocgenException {
if (!(settingValue instanceof Boolean)) {
@@ -1754,10 +1776,87 @@ public final class Transform {
return (Map<String, String>) mapEntryValue;
}
- private void copyCommonStatic(String path) throws IOException {
- FileUtil.copyResourceIntoFile(
- Transform.class, "statics", path,
- new File(destDir, "docgen-resources"));
+ private String getFileContentForSetting(File cfgFile,
+ String settingName, Object settingValue) throws DocgenException {
+ String settingValueStr = castSettingToString(cfgFile, settingName, settingValue);
+ File f = new File(getSourceDirectory(), settingValueStr);
+ if (!f.exists()) {
+ throw newCfgFileException(
+ cfgFile, settingName,
+ "File not found: " + f.toPath());
+ }
+ try {
+ return FileUtil.loadString(f, UTF_8);
+ } catch (IOException e) {
+ throw newCfgFileException(
+ cfgFile, "Error while reading file for setting \"" + settingName + "\": " + f.toPath(),
+ e);
+ }
+ }
+
+ private void copyCommonStatic(String staticFileName) throws IOException, DocgenException {
+ String resourcePath = "statics/" + staticFileName;
+ try (InputStream in = Transform.class.getResourceAsStream(resourcePath)) {
+ if (in == null) {
+ throw new IOException("Failed to open class-loader resource: " + resourcePath + " relatively to "
+ + Transform.class.getPackage().getName());
+ }
+
+ if (copyrightComment != null && (staticFileName.endsWith(".css") || staticFileName.endsWith(".js"))) {
+ // ISO-8859-1 will be good enough as far as the resource isn't UTF-16 or EBCDIC:
+ final Charset fileCharset = StandardCharsets.ISO_8859_1;
+ String content = FileUtil.loadString(in, fileCharset);
+ final String eol = TextUtil.detectEOL(content, "\n");
+
+ // If we have an initial comment, then that must be a copyright header, which we will remove.
+ if (content.startsWith("/*")) {
+ int commentEnd = content.indexOf("*/");
+ if (commentEnd == -1) {
+ throw new BugException("Unclosed initial \"/*\" in resource " + resourcePath);
+ }
+ commentEnd += 2;
+ String comment = content.substring(0, commentEnd);
+ if (!comment.contains("Copyright") && !comment.contains("copyright")
+ && !comment.contains("License") && !comment.contains("license")) {
+ throw new BugException("The initial /*...*/ comments doesn't look like a copyright header "
+ + "in resource " + resourcePath);
+ }
+
+ // Include an EOL after the comment, if there's any.
+ if (commentEnd < content.length()) {
+ char c = content.charAt(commentEnd);
+ if (c == '\n') {
+ commentEnd++;
+ } else if (c == '\r') {
+ commentEnd++;
+ if (commentEnd < content.length() && content.charAt(commentEnd) == '\n') {
+ commentEnd++;
+ }
+ }
+ }
+
+ // Remove existing copyright header:
+ content = content.substring(commentEnd);
+ }
+
+ // Add copyright comment:
+ StringBuilder sb = new StringBuilder(TextUtil.normalizeEOL(copyrightJavaComment, eol));
+ sb.append(eol);
+ if (content.length() > 0 && content.charAt(0) != '\n' && content.charAt(0) != '\r') {
+ sb.append(eol);
+ }
+ sb.append(content);
+ content = sb.toString();
+
+ Path destSubdir = destDir.toPath().resolve("docgen-resources");
+ Files.createDirectories(destSubdir);
+ Files.write(destSubdir.resolve(staticFileName), content.getBytes(fileCharset));
+ } else {
+ FileUtil.copyResourceIntoFile(
+ Transform.class, "statics", staticFileName,
+ new File(destDir, "docgen-resources"));
+ }
+ }
}
/**
http://git-wip-us.apache.org/repos/asf/incubator-freemarker-docgen/blob/b69ded48/src/main/org/freemarker/docgen/statics/fonts/NOTICE
----------------------------------------------------------------------
diff --git a/src/main/org/freemarker/docgen/statics/fonts/NOTICE b/src/main/org/freemarker/docgen/statics/fonts/NOTICE
new file mode 100644
index 0000000..4d68649
--- /dev/null
+++ b/src/main/org/freemarker/docgen/statics/fonts/NOTICE
@@ -0,0 +1,19 @@
+These "icomoon" fonts were generated with https://icomoon.io/app/, from a
+selection from these fronts:
+
+* Entypo pictograms, version 2.0, by Daniel Bruce (www.entypo.com).
+ Each included pictogram is either licensed under Creative
+ Commons Attribution-ShareAlike 3.0 (CC BY-SA 3.0)
+ (http://creativecommons.org/licenses/by-sa/3.0/legalcode), or
+ under SIL Open Font License 1.1 (http://scripts.sil.org/OFL).
+
+* Font Awesome by Dave Gandy (http://fontawesome.io), licensed under
+ SIL Open Font License 1.1 (http://scripts.sil.org/OFL).
+
+* Material Design icons by Google
+ (http://google.github.io/material-design-icons/), licensed under
+ Creative Common Attribution 4.0 International License (CC-BY 4.0)
+ (https://creativecommons.org/licenses/by/4.0/).
+
+"selection.json" stores the IcoMoon App selection, and is only stored here
+for reproducibility. It's not used for anything.
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-freemarker-docgen/blob/b69ded48/src/main/org/freemarker/docgen/statics/fonts/README-BUILD.txt
----------------------------------------------------------------------
diff --git a/src/main/org/freemarker/docgen/statics/fonts/README-BUILD.txt b/src/main/org/freemarker/docgen/statics/fonts/README-BUILD.txt
deleted file mode 100644
index 4d68649..0000000
--- a/src/main/org/freemarker/docgen/statics/fonts/README-BUILD.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-These "icomoon" fonts were generated with https://icomoon.io/app/, from a
-selection from these fronts:
-
-* Entypo pictograms, version 2.0, by Daniel Bruce (www.entypo.com).
- Each included pictogram is either licensed under Creative
- Commons Attribution-ShareAlike 3.0 (CC BY-SA 3.0)
- (http://creativecommons.org/licenses/by-sa/3.0/legalcode), or
- under SIL Open Font License 1.1 (http://scripts.sil.org/OFL).
-
-* Font Awesome by Dave Gandy (http://fontawesome.io), licensed under
- SIL Open Font License 1.1 (http://scripts.sil.org/OFL).
-
-* Material Design icons by Google
- (http://google.github.io/material-design-icons/), licensed under
- Creative Common Attribution 4.0 International License (CC-BY 4.0)
- (https://creativecommons.org/licenses/by/4.0/).
-
-"selection.json" stores the IcoMoon App selection, and is only stored here
-for reproducibility. It's not used for anything.
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-freemarker-docgen/blob/b69ded48/src/main/org/freemarker/docgen/statics/fonts/icomoon.svg
----------------------------------------------------------------------
diff --git a/src/main/org/freemarker/docgen/statics/fonts/icomoon.svg b/src/main/org/freemarker/docgen/statics/fonts/icomoon.svg
index 0539897..0c1e073 100644
--- a/src/main/org/freemarker/docgen/statics/fonts/icomoon.svg
+++ b/src/main/org/freemarker/docgen/statics/fonts/icomoon.svg
@@ -1,4 +1,5 @@
<?xml version="1.0" standalone="no"?>
+<!-- See NOTICE file for copyright information! -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg xmlns="http://www.w3.org/2000/svg">
<metadata>Generated by IcoMoon</metadata>
http://git-wip-us.apache.org/repos/asf/incubator-freemarker-docgen/blob/b69ded48/src/main/org/freemarker/docgen/templates/eclipse-toc.ftlx
----------------------------------------------------------------------
diff --git a/src/main/org/freemarker/docgen/templates/eclipse-toc.ftlx b/src/main/org/freemarker/docgen/templates/eclipse-toc.ftlx
index dbe01ae..6ffb2d9 100644
--- a/src/main/org/freemarker/docgen/templates/eclipse-toc.ftlx
+++ b/src/main/org/freemarker/docgen/templates/eclipse-toc.ftlx
@@ -1,6 +1,11 @@
<#ftl nsPrefixes={"D":"http://docbook.org/ns/docbook"}>
<#import "util.ftl" as u>
<?xml version="1.0" encoding="utf-8"?>
+<#if copyrightComment?hasContent>
+ <!--<#lt>
+ ${copyrightComment}<#lt>
+ --><#lt>
+</#if>
<?NLS TYPE="org.eclipse.help.toc"?>
<#assign
http://git-wip-us.apache.org/repos/asf/incubator-freemarker-docgen/blob/b69ded48/src/main/org/freemarker/docgen/templates/page.ftlh
----------------------------------------------------------------------
diff --git a/src/main/org/freemarker/docgen/templates/page.ftlh b/src/main/org/freemarker/docgen/templates/page.ftlh
index fc70ec8..fbdfa33 100644
--- a/src/main/org/freemarker/docgen/templates/page.ftlh
+++ b/src/main/org/freemarker/docgen/templates/page.ftlh
@@ -91,6 +91,11 @@
<#macro page>
<!doctype html><#lt>
+ <#if copyrightComment?hasContent>
+ <!--<#lt>
+ ${copyrightComment}<#lt>
+ --><#lt>
+ </#if>
<html lang="en" class="page-type-${getPageType()?replace(':', '-')?replace('_', '-')}"><#lt>
<#nested>
</html><#lt>
http://git-wip-us.apache.org/repos/asf/incubator-freemarker-docgen/blob/b69ded48/src/main/org/freemarker/docgen/templates/sitemap.ftlx
----------------------------------------------------------------------
diff --git a/src/main/org/freemarker/docgen/templates/sitemap.ftlx b/src/main/org/freemarker/docgen/templates/sitemap.ftlx
index 1c87c97..324b016 100644
--- a/src/main/org/freemarker/docgen/templates/sitemap.ftlx
+++ b/src/main/org/freemarker/docgen/templates/sitemap.ftlx
@@ -18,6 +18,11 @@
</#list>
</#macro>
<?xml version="1.0" encoding="UTF-8"?>
+<#if copyrightComment?hasContent>
+ <!--<#lt>
+ ${copyrightComment}<#lt>
+ --><#lt>
+</#if>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<@sitemapUrls tocRoot />
</urlset>
http://git-wip-us.apache.org/repos/asf/incubator-freemarker-docgen/blob/b69ded48/src/main/org/freemarker/docgen/templates/toc-json.ftl
----------------------------------------------------------------------
diff --git a/src/main/org/freemarker/docgen/templates/toc-json.ftl b/src/main/org/freemarker/docgen/templates/toc-json.ftl
index 28cfc31..fdd35cc 100644
--- a/src/main/org/freemarker/docgen/templates/toc-json.ftl
+++ b/src/main/org/freemarker/docgen/templates/toc-json.ftl
@@ -1,4 +1,7 @@
<#import "util.ftl" as u>
+<#if copyrightComment?hasContent>
+ ${copyrightJavaComment}<#lt>
+</#if>
<#macro tocNodeToJSON node>
{
"title": "${u.getRequiredTitleAsString(node.element)?jsonString}",