/*
* Copyright 2004-2011 H2 Group. Multiple-Licensed under the H2 License,
* Version 1.0, and under the Eclipse Public License, Version 1.0
* (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package org.h2.build.doc;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import org.h2.samples.Newsfeed;
import org.h2.util.IOUtils;
import org.h2.util.StringUtils;
/**
* Create the web site, mainly by copying the regular docs. A few items are
* different in the web site, for example it calls web site analytics.
* Also, the main entry point page is different.
* The newsfeeds are generated here as well.
*/
public class WebSite {
private static final String ANALYTICS_TAG = "<!-- analytics -->";
private static final String ANALYTICS_SCRIPT =
"<script src=\"http://www.google-analytics.com/ga.js\" type=\"text/javascript\"></script>\n" +
"<script type=\"text/javascript\">" +
"var pageTracker=_gat._getTracker(\"UA-2351060-1\");" +
"pageTracker._initData();pageTracker._trackPageview();" +
"</script>";
private static final String TRANSLATE_START = "<!-- translate";
private static final String TRANSLATE_END = "translate -->";
private String sourceDir = "docs";
private String webDir = "../h2web";
private HashMap<String, String> fragments = new HashMap<String, String>();
/**
* This method is called when executing this application from the command
* line.
*
* @param args the command line parameters
*/
public static void main(String... args) throws Exception {
new WebSite().run();
}
private void run() throws Exception {
// create the web site
deleteRecursive(new File(webDir));
loadFragments();
copy(new File(sourceDir), new File(webDir), true, true);
Newsfeed.main(webDir + "/html");
// create the internal documentation
copy(new File(sourceDir), new File(sourceDir), true, false);
}
private void loadFragments() throws IOException {
File dir = new File(sourceDir, "html");
for (File f : dir.listFiles()) {
if (f.getName().startsWith("fragments")) {
FileInputStream in = new FileInputStream(f);
byte[] bytes = IOUtils.readBytesAndClose(in, 0);
String page = new String(bytes, "UTF-8");
fragments.put(f.getName(), page);
}
}
}
private String replaceFragments(String fileName, String page) {
if (fragments.size() == 0) {
return page;
}
String language = "";
int index = fileName.indexOf("_");
if (index >= 0) {
int end = fileName.indexOf('.');
language = fileName.substring(index, end);
}
String fragment = fragments.get("fragments" + language + ".html");
int start = 0;
while (true) {
start = fragment.indexOf("<!-- [", start);
if (start < 0) {
break;
}
int endTag = fragment.indexOf("] { -->", start);
int endBlock = fragment.indexOf("<!-- } -->", start);
String tag = fragment.substring(start, endTag);
String replacement = fragment.substring(start, endBlock);
int pageStart = 0;
while (true) {
pageStart = page.indexOf(tag, pageStart);
if (pageStart < 0) {
break;
}
int pageEnd = page.indexOf("<!-- } -->", pageStart);
page = page.substring(0, pageStart) + replacement + page.substring(pageEnd);
pageStart += replacement.length();
}
start = endBlock;
}
return page;
}
private void deleteRecursive(File dir) {
if (dir.isDirectory()) {
for (File f : dir.listFiles()) {
deleteRecursive(f);
}
}
dir.delete();
}
private void copy(File source, File target, boolean replaceFragments, boolean web) throws IOException {
if (source.isDirectory()) {
target.mkdirs();
for (File f : source.listFiles()) {
copy(f, new File(target, f.getName()), replaceFragments, web);
}
} else {
String name = source.getName();
if (name.endsWith("onePage.html") || name.startsWith("fragments")) {
return;
}
if (web) {
if (name.endsWith("main.html") || name.endsWith("main_ja.html")) {
return;
}
} else {
if (name.endsWith("mainWeb.html") || name.endsWith("mainWeb_ja.html")) {
return;
}
}
FileInputStream in = new FileInputStream(source);
byte[] bytes = IOUtils.readBytesAndClose(in, 0);
if (name.endsWith(".html")) {
String page = new String(bytes, "UTF-8");
if (web) {
page = StringUtils.replaceAll(page, ANALYTICS_TAG, ANALYTICS_SCRIPT);
}
if (replaceFragments) {
page = replaceFragments(name, page);
page = StringUtils.replaceAll(page, "<a href=\"frame", "<a href=\"main");
page = StringUtils.replaceAll(page, "html/frame.html", "html/main.html");
}
if (web) {
page = StringUtils.replaceAll(page, TRANSLATE_START, "");
page = StringUtils.replaceAll(page, TRANSLATE_END, "");
page = StringUtils.replaceAll(page, "<pre>", "<pre class=\"notranslate\">");
page = StringUtils.replaceAll(page, "<code>", "<code class=\"notranslate\">");
}
bytes = page.getBytes("UTF-8");
}
FileOutputStream out = new FileOutputStream(target);
out.write(bytes);
out.close();
if (web) {
if (name.endsWith("mainWeb.html")) {
target.renameTo(new File(target.getParentFile(), "main.html"));
} else if (name.endsWith("mainWeb_ja.html")) {
target.renameTo(new File(target.getParentFile(), "main_ja.html"));
}
}
}
}
}