site

(djk)
2011-04-09: Tweaks to patches.

Tweaks to patches.

diff --git a/script/dumpwiki.sh b/script/dumpwiki.sh
old mode 100644
new mode 100755
diff --git a/src/fniki/standalone/DumpWiki.java b/src/fniki/standalone/DumpWiki.java
--- a/src/fniki/standalone/DumpWiki.java
+++ b/src/fniki/standalone/DumpWiki.java
@@ -1,3 +1,29 @@
+/* Command line utility to dump a jfniki wiki as html.
+ *
+ * Copyright (C) 2011 sethcg
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.0 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * Author: sethcg@a-tin0kMl1I~8xn5lkQDqYZRExKLzJITrxcNsr4T~fY
+ *
+ * This is a derived work based on ServeHttp.java
+ * written by djk@isFiaD04zgAgnrEC5XJt1i4IE7AkNPqhBG5bONi6Yks
+ *
+ *  This file was developed as component of
+ * "fniki" (a wiki implementation running over Freenet).
+ */
 package fniki.standalone;
 
 import java.io.IOException;
@@ -17,115 +43,90 @@ import wormarc.IOUtil;
 
 import fniki.wiki.ArchiveManager;
 import fniki.wiki.FreenetWikiTextParser;
+import fniki.wiki.WikiParserDelegate;
 
 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" +
+        "Dumps a wiki version in 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" +
+        "java fniki.standalone.DumpWiki <dump_path> SSK@/XXX...XXX/0123456789abcdef \\\n" +
+        "     [[template_file] [[fcp_port] [fcp_host]]]\n\n" +
+        "NOTE:\nfreenet.jar and jfniki.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";
+        "with the title and the third will be replaced with the wiki content.\n"+
+        "You can use the literal value 'default' to get the built in template file.\n\n"+
+        "DumpWiki was written as part of the fniki Freenet Wiki project\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;
-
+    private static class LocalParserDelegate extends WikiParserDelegate {
         LocalParserDelegate(ArchiveManager archiveManager) {
-            mArchiveManager = archiveManager;
+            super(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;
+        // Implement base class abstract methods to supply the functionality
+        // specific to dumping a wiki as html.
+        protected String getContainerPrefix() { return ""; }
+        protected boolean getFreenetLinksAllowed() { return true; }
+        protected boolean getImagesAllowed() { return true; }
+
+        protected String makeLink(String containerRelativePath) {
+            while (containerRelativePath.startsWith("/")) {
+                containerRelativePath = containerRelativePath.substring(1);
+            }
+            try {
+                if (!mArchiveManager.getStorage().hasPage(containerRelativePath)) {
+                    containerRelativePath = "PageDoesNotExist";
                 }
-            } 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;
+            } catch (IOException ioe) {
+                throw new RuntimeException("ArchiveManager.getStorage() failed???", ioe);
             }
-
-            return false;
+            return containerRelativePath + ".html";
         }
 
-        // 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;
+       protected String makeFreenetLink(String uri) {
+            if (!uri.startsWith("freenet:")) {
+                throw new RuntimeException("uri doesn't start with 'freenet:'");
             }
-            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>");
+            return "/" + uri.substring("freenet:".length());
         }
 
-        // 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;
+        // Override one pesky macro that requires a different implementation.
+        protected boolean processedTitleIndexMacro(StringBuilder sb, String text) {
+            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}");
             }
-            sb.append("{ERROR PROCESSING IMAGE WIKITEXT}");
+            return true;
         }
     }
 
     public static void main(String[] args) throws Exception {
-        if (args.length > 3 || args.length < 2) {
+        if (args.length > 5 || args.length < 2) {
             System.err.println(HELP_TEXT);
             System.exit(-1);
         }
 
+        int fcpPort = 9481;
+        if (args.length > 3) {
+            fcpPort = Integer.parseInt(args[3]);
+        }
+        String fcpHost = "127.0.0.1";
+        if (args.length > 4) {
+            fcpHost = args[4];
+        }
+
         ArchiveManager archiveManager = new ArchiveManager();
+        archiveManager.setFcpHost(fcpHost);
+        archiveManager.setFcpPort(fcpPort);
+
         FreenetWikiTextParser.ParserDelegate mParserDelegate = new LocalParserDelegate(archiveManager);
 
         String ouputDirectory = args[0];
@@ -137,10 +138,11 @@ public class DumpWiki {
         }
 
         String wikiTemplate;
-        if ( args.length == 3 && new File(args[2]).exists() ) {
+        if ( args.length >= 3 && (!args[2].equals("default")) && new File(args[2]).exists()) {
+            System.err.println("Using template!");
             wikiTemplate = IOUtil.readUtf8StringAndClose(new FileInputStream(args[2]));
         } else {
-            wikiTemplate = IOUtil.readUtf8StringAndClose(ServeHttp.class.getResourceAsStream("/wiki_dump_template.html"));
+            wikiTemplate = IOUtil.readUtf8StringAndClose(DumpWiki.class.getResourceAsStream("/wiki_dump_template.html"));
         }
 
         // Dump this archive and quit
@@ -159,8 +161,8 @@ public class DumpWiki {
                 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) ) ?
+                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."
                         );
diff --git a/src/fniki/wiki/child/WikiContainer.java b/src/fniki/wiki/child/WikiContainer.java
--- a/src/fniki/wiki/child/WikiContainer.java
+++ b/src/fniki/wiki/child/WikiContainer.java
@@ -156,7 +156,8 @@ public class WikiContainer implements Ch
                                           context.getString("default_wikitext",
                                                             "Page doesn't exist in the wiki yet.")));
             } else if (context.getStorage().hasPage("PageDoesNotExist")) {
-                buffer.append(renderXHTML(context, context.getStorage().getPage("PageDoesNotExist")));	
+                // LATER: Revisit. Also, ExternalLink. Evil submissions can change this to something confusing.
+                buffer.append(renderXHTML(context, context.getStorage().getPage("PageDoesNotExist")));
             } else {
                 buffer.append("Page doesn't exist in the wiki yet.");
             }