site

(djk)
2011-04-09: Patch to dump wiki from:

Patch to dump wiki from: sethcg@a-tin0kMl1I~8xn5lkQDqYZRExKLzJITrxcNsr4T~fY CHK@T5Wst3hoqkK2IJtv0e2doUumi87KaheJNbFYSH5amJo,WEs1GN0ws3jk-Pktmd8OxJ5jiCuU8Ztv7lXi4iTOLVs,AAIC--8/wiki_dump3.patch sha1sum: 27e9c19ec022226357442dbd6848fb715d45befb wiki_dump3.patch

diff --git a/script/dumpwiki.sh b/script/dumpwiki.sh
new file mode 100644
--- /dev/null
+++ b/script/dumpwiki.sh
@@ -0,0 +1,10 @@
+#!/usr/bin/env sh
+
+# TIP:
+# You should be able to copy this script anywhere you want. Just make symlinks
+# to the jfniki.jar and freenet.jar files in the same directory.
+
+export set SCRIPT_DIR=`dirname $0`
+. "${SCRIPT_DIR}/setup_env.sh"
+
+${JAVA_CMD} -classpath ${JAR_FILE}:${FN_JAR_FILE} fniki.standalone.DumpWiki "$@"
diff --git a/script/jfniki.sh b/script/jfniki.sh
--- a/script/jfniki.sh
+++ b/script/jfniki.sh
@@ -4,54 +4,7 @@
 # You should be able to copy this script anywhere you want. Just make symlinks
 # to the jfniki.jar and freenet.jar files in the same directory.
 
-export set JAR_NAME="jfniki.jar"
-
 export set SCRIPT_DIR=`dirname $0`
-
-export set JAR_PATH="${SCRIPT_DIR}/../build/jar"
-export set JAR_FILE="${JAR_PATH}/${JAR_NAME}"
-if [ ! -f ${JAR_FILE} ];
-then
-    export set JAR_PATH=${SCRIPT_DIR}
-    export set JAR_FILE="${JAR_PATH}/${JAR_NAME}"
-    if [ ! -f ${JAR_FILE} ];
-    then
-        echo "Looked in:"
-        echo "${SCRIPT_DIR}/../build/jar/${JAR_NAME}"
-        echo "and"
-        echo "${JAR_FILE}"
-        echo
-        echo "but still can't find the jar file!"
-        echo "Maybe run: ant jar?"
-        exit -1
-    fi
-fi
-
-echo "Using fniki.jar: ${JAR_FILE}"
-echo
-
-export set FN_JAR_NAME="freenet.jar"
-export set FN_JAR_PATH="${SCRIPT_DIR}/../alien/libs"
-export set FN_JAR_FILE="${FN_JAR_PATH}/${FN_JAR_NAME}"
-if [ ! -f ${FN_JAR_FILE} ];
-then
-    export set FN_JAR_PATH=${SCRIPT_DIR}
-    export set FN_JAR_FILE="${FN_JAR_PATH}/${FN_JAR_NAME}"
-    if [ ! -f ${FN_JAR_FILE} ];
-    then
-        echo "Looked in:"
-        echo "${SCRIPT_DIR}/../alien/libs/${FN_JAR_NAME}"
-        echo "and"
-        echo "${FN_JAR_FILE}"
-        echo
-        echo "but still can't find the freenet.jar file!"
-        echo "Not sure what's going on. :-("
-        exit -1
-    fi
-fi
-
-echo "Using freenet.jar: ${FN_JAR_FILE}"
-echo
-export set JAVA_CMD="java"
+. "${SCRIPT_DIR}/setup_env.sh"
 
 ${JAVA_CMD} -classpath ${JAR_FILE}:${FN_JAR_FILE} fniki.standalone.ServeHttp $1 $2
diff --git a/script/setup_env.sh b/script/setup_env.sh
new file mode 100644
--- /dev/null
+++ b/script/setup_env.sh
@@ -0,0 +1,51 @@
+#!/usr/bin/env sh
+
+#SCRIPT_DIR is setup by the script calling this script
+
+export set JAR_NAME="jfniki.jar"
+
+export set JAR_PATH="${SCRIPT_DIR}/../build/jar"
+export set JAR_FILE="${JAR_PATH}/${JAR_NAME}"
+if [ ! -f ${JAR_FILE} ];
+then
+    export set JAR_PATH=${SCRIPT_DIR}
+    export set JAR_FILE="${JAR_PATH}/${JAR_NAME}"
+    if [ ! -f ${JAR_FILE} ];
+    then
+        echo "Looked in:"
+        echo "${SCRIPT_DIR}/../build/jar/${JAR_NAME}"
+        echo "and"
+        echo "${JAR_FILE}"
+        echo
+        echo "but still can't find the jar file!"
+        echo "Maybe run: ant jar?"
+        exit -1
+    fi
+fi
+
+echo "Using fniki.jar: ${JAR_FILE}"
+echo
+
+export set FN_JAR_NAME="freenet.jar"
+export set FN_JAR_PATH="${SCRIPT_DIR}/../alien/libs"
+export set FN_JAR_FILE="${FN_JAR_PATH}/${FN_JAR_NAME}"
+if [ ! -f ${FN_JAR_FILE} ];
+then
+    export set FN_JAR_PATH=${SCRIPT_DIR}
+    export set FN_JAR_FILE="${FN_JAR_PATH}/${FN_JAR_NAME}"
+    if [ ! -f ${FN_JAR_FILE} ];
+    then
+        echo "Looked in:"
+        echo "${SCRIPT_DIR}/../alien/libs/${FN_JAR_NAME}"
+        echo "and"
+        echo "${FN_JAR_FILE}"
+        echo
+        echo "but still can't find the freenet.jar file!"
+        echo "Not sure what's going on. :-("
+        exit -1
+    fi
+fi
+
+echo "Using freenet.jar: ${FN_JAR_FILE}"
+echo
+export set JAVA_CMD="java"
diff --git a/src/fniki/standalone/DumpWiki.java b/src/fniki/standalone/DumpWiki.java
new file mode 100644
--- /dev/null
+++ b/src/fniki/standalone/DumpWiki.java
@@ -0,0 +1,175 @@
+package fniki.standalone;
+
+import java.io.IOException;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.PrintStream;
+import java.io.File;
+
+import java.util.List;
+
+import static fniki.wiki.HtmlUtils.*;
+import static fniki.wiki.Validations.*;
+import static ys.wikiparser.Utils.*;
+
+import wormarc.FileManifest;
+import wormarc.IOUtil;
+
+import fniki.wiki.ArchiveManager;
+import fniki.wiki.FreenetWikiTextParser;
+
+public class DumpWiki {
+
+    private final static String HELP_TEXT =
+        "DumpWiki: Experimental distributed anonymous wiki over Freenet + FMS\n" +
+        "written as part of the fniki Freenet Wiki project\n\n" +
+        "SUMMARY:\n" +
+        "Dumps a wiki version into a format suitable for inserting as a Freesite.\n" +
+        "This is experimental code. Use it at your own peril.\n\n" +
+        "USAGE:\n" +
+        "java -jar jfniki.jar <dump_path> SSK@/XXX...XXX/0123456789abcdef [template_file]\n\n" +
+        "NOTE:\nfreenet.jar MUST be in your classpath.\n\n" +
+        "The <dump_path> directory must already exist and any files in it will be overwritten.\n\n" +
+        "The template_file should contain 3 %s place holders. The first two will be replaced \n"+
+        "with the title and the third will be replaced with the wiki content.\n\n";
+
+    ////////////////////////////////////////////////////////////
+    private static class LocalParserDelegate implements FreenetWikiTextParser.ParserDelegate {
+        // Pedantic.  Explictly copy references instead of making this class non-static
+        // so that the code uses well defined interfaces.
+        final ArchiveManager mArchiveManager;
+
+        LocalParserDelegate(ArchiveManager archiveManager) {
+            mArchiveManager = archiveManager;
+        }
+
+        public boolean processedMacro(StringBuilder sb, String text) {
+            if (text.equals("LocalChanges")) {
+                try {
+                    FileManifest.Changes changes  = mArchiveManager.getLocalChanges();
+                    if (changes.isUnmodified()) {
+                        sb.append("<br />No local changes.<br />");
+                        return true;
+                    }
+                    appendChangesHtml(changes, "", sb);
+                    return true;
+                } catch (IOException ioe) {
+                    sb.append("{ERROR PROCESSING LOCALCHANGES MACRO}");
+                    return true;
+                }
+            } else if (text.equals("TitleIndex")) {
+                try {
+                    for (String name : mArchiveManager.getStorage().getNames()) {
+                        sb.append("<a href=\"" + makeHref(name) + ".html\">" + escapeHTML(name.replace("_", " ")) + "</a>");
+                        sb.append("<br />");
+                    }
+                } catch (IOException ioe) {
+                    sb.append("{ERROR PROCESSING TITLEINDEX MACRO}");
+                    return true;
+                }
+                return true;
+            }
+
+            return false;
+        }
+
+        // CHK, SSK, USK freenet links.
+        public void appendLink(StringBuilder sb, String text) {
+
+            String[] link=split(text, '|');
+            if ( isValidFreenetUri(link[0])) {
+                sb.append("<a href=\"/"+makeHref(link[0].trim().substring("freenet:".length()))+"\">");
+                sb.append(escapeHTML(unescapeHTML(link.length>=2 && !isEmpty(link[1].trim())? link[1]:link[0])));
+                sb.append("</a>");
+                return;
+            }
+            if (isAlphaNumOrUnder(link[0])) {
+                // Link to an internal wiki page.
+                String pageName = link[0].trim();
+                try {
+                    if ( ! mArchiveManager.getStorage().hasPage(pageName) ) {
+                        pageName = "PageDoesNotExist";
+                    }
+                } catch (IOException ioe) {
+
+                    sb.append("{ERROR VALIDATING INTERNAL LINK}");
+                    return;
+                }
+                sb.append("<a href=\""+makeHref(pageName)+".html\">");
+                sb.append(escapeHTML(unescapeHTML(link.length>=2 && !isEmpty(link[1].trim())? link[1]:link[0])));
+                sb.append("</a>");
+                return;
+            }
+
+            sb.append("<a href=\"ExternalLink.html\">");
+            sb.append(escapeHTML(unescapeHTML(link.length>=2 && !isEmpty(link[1].trim())? link[1]:link[0])));
+            sb.append("</a>");
+        }
+
+        // Only CHK and SSK freenet links.
+        public void appendImage(StringBuilder sb, String text) {
+
+            String[] link=split(text, '|');
+            if ( isValidFreenetUri(link[0]) && !link[0].startsWith("freenet:USK@")) {
+                String alt=escapeHTML(unescapeHTML(link.length>=2 && !isEmpty(link[1].trim())? link[1]:link[0]));
+                sb.append("<img src=\"/" + makeHref(link[0].trim().substring("freenet:".length())) + "\" alt=\""+alt+"\" title=\""+alt+"\" />");
+                return;
+            }
+            sb.append("{ERROR PROCESSING IMAGE WIKITEXT}");
+        }
+    }
+
+    public static void main(String[] args) throws Exception {
+        if (args.length > 3 || args.length < 2) {
+            System.err.println(HELP_TEXT);
+            System.exit(-1);
+        }
+
+        ArchiveManager archiveManager = new ArchiveManager();
+        FreenetWikiTextParser.ParserDelegate mParserDelegate = new LocalParserDelegate(archiveManager);
+
+        String ouputDirectory = args[0];
+        System.out.println("Preparing to dump archive to " + ouputDirectory + "...");
+
+        File dir = new File(ouputDirectory);
+        if (!(dir.exists() && dir.isDirectory() && dir.canWrite() )) {
+            throw new IOException("Need " + ouputDirectory + " to be an existant, writeable directory.");
+        }
+
+        String wikiTemplate;
+        if ( args.length == 3 && new File(args[2]).exists() ) {
+            wikiTemplate = IOUtil.readUtf8StringAndClose(new FileInputStream(args[2]));
+        } else {
+            wikiTemplate = IOUtil.readUtf8StringAndClose(ServeHttp.class.getResourceAsStream("/wiki_dump_template.html"));
+        }
+
+        // Dump this archive and quit
+        System.out.println("Loading archive...");
+        archiveManager.load(args[1]);
+
+        List<String> pages = archiveManager.getStorage().getNames();
+        if ( !archiveManager.getStorage().hasPage("PageDoesNotExist") ) {
+            pages.add("PageDoesNotExist");
+        }
+
+        String cleanName;
+        for (String name : pages) {
+            try {
+                // sethcg: Do wiki page names already have bad characters stripped out? I'm assuming so.
+                FileOutputStream out = new FileOutputStream(ouputDirectory + "/" + name + ".html");
+                PrintStream p = new PrintStream(out);
+                cleanName = unescapeHTML(name.replace("_", " "));
+                p.printf(wikiTemplate, cleanName, cleanName, 
+                        ( archiveManager.getStorage().hasPage(name) ) ?
+                        new FreenetWikiTextParser(archiveManager.getStorage().getPage(name), mParserDelegate).toString() :
+                        "Page doesn't exist in the wiki yet."
+                        );
+                p.close();
+            } catch ( IOException e) {
+                System.out.println("Error writing " + name + " to file.");
+            }
+        }
+
+        System.out.println("Successfully dumped wiki.");
+    }
+}
diff --git a/templates/wiki_dump_template.html b/templates/wiki_dump_template.html
new file mode 100644
--- /dev/null
+++ b/templates/wiki_dump_template.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<title>%s</title>
+<style type="text/css">div.indent{margin-left:20px;} div.center{text-align:center;} blockquote{margin-left:20px;background-color:#e0e0e0;} span.underline{text-decoration:underline;}
+</style>
+</head>
+<body>
+<h1>%s</h1>
+<hr>
+%s
+</body>
+</html>
+