site

(djk)
2011-04-03: Factor parser delegate impl into an ABC.

Factor parser delegate impl into an ABC.

diff --git a/readme.txt b/readme.txt
--- a/readme.txt
+++ b/readme.txt
@@ -89,7 +89,8 @@ BUG: MUST show in the UI when edited wik
 BUG: Can the <<<TOC>>> macro be made to play nice with the ContentFilter?
 ---
 IDEA: shrink blocks by using a token map?  use short token in binary rep, fixup to full 20byte hash on read / write?
-IDEA: Support links to other wikis. e.g.: fniki://fms/group/name
+IDEA: Support links to other wikis. e.g.:b fniki://fms/group/name
+      [Not quite. Should be able to support mutliple transports (fms, ft, freemail?, fproxy usk?) in same url]
 IDEA: Caching in FreenetIO
       Make LinkCache and interface
       FreenetLinkCache extends LinkCache
@@ -105,6 +106,10 @@ IDEA: Pillage glog graph drawing code fr
 IDEA: Ditch human readable name <--> SSK fixup and generate arbitrary names from
       SSK public key hash (== big number). <n_first>*<m_middle>*<o_last> == big number
       let n = 1000, m = 1000,  o == 1000 => ???? [NOT QUITE. LOOK UP Combinatorics]
+IDEA: Staking.  add a biss message that says "I say this version is good"
+      not "I published this version".  Add feedback in UI to show how many nyms staked a given version.
+IDEA: Wikibot ng. Just uses its FMS trust info to decide which version is the latest and
+      send a "Stake" biss message for it.
 ---
 Fixed bugs:
 2ce3a4499a2c: BUG: No way to create an empty wiki from the UI. [requested by a real user]
diff --git a/src/fniki/wiki/WikiApp.java b/src/fniki/wiki/WikiApp.java
--- a/src/fniki/wiki/WikiApp.java
+++ b/src/fniki/wiki/WikiApp.java
@@ -270,99 +270,34 @@ public class WikiApp implements ChildCon
     }
 
     ////////////////////////////////////////////////////////////
-    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.
+    private static class LocalParserDelegate extends WikiParserDelegate {
         final WikiContext mContext;
-        final ArchiveManager mArchiveManager;
 
         LocalParserDelegate(WikiContext context, ArchiveManager archiveManager) {
+            super(archiveManager);
             mContext = context;
-            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, containerPrefix(), 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()) {
-                        appendPageLink(containerPrefix(), sb, name, null, true);
-                        sb.append("<br>");
-                    }
-                } catch (IOException ioe) {
-                    sb.append("{ERROR PROCESSING TITLEINDEX MACRO}");
-                    return true;
-                }
-                return true;
-            }
-
-            return false;
+        // Implement base class abstract methods to supply the functionality
+        // specific to live wikis, mostly by delegating to the WikiContext.
+        protected String getContainerPrefix() {
+            return containerPrefix(); // LATER: revisit.
         }
 
-        // CHK, SSK, USK freenet links.
-        public void appendLink(StringBuilder sb, String text) {
-            String fproxyPrefix = mContext.getString("fproxy_prefix", null);
-
-            String[] link=split(text, '|');
-            if (fproxyPrefix != null &&
-                isValidFreenetUri(link[0])) {
-                sb.append("<a href=\""+ makeFproxyHref(fproxyPrefix, link[0].trim()) +"\" rel=\"nofollow\">");
-                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.
-                sb.append("<a href=\""+ makeHref(mContext.makeLink("/" + link[0].trim())) +"\" rel=\"nofollow\">");
-                sb.append(escapeHTML(unescapeHTML(link.length>=2 && !isEmpty(link[1].trim())? link[1]:link[0])));
-                sb.append("</a>");
-                return;
-            }
-
-            sb.append("<a href=\"" + makeHref(mContext.makeLink("/ExternalLink")) +"\" rel=\"nofollow\">");
-            sb.append(escapeHTML(unescapeHTML(link.length>=2 && !isEmpty(link[1].trim())? link[1]:link[0])));
-            sb.append("</a>");
+        protected String getFproxyPrefix() {
+            return mContext.getString("fproxy_prefix", null);
         }
 
-        // Only CHK and SSK freenet links.
-        public void appendImage(StringBuilder sb, String text) {
-            boolean allowed = mContext.getInt("allow_images", 0) != 0;
-            if (!allowed) {
-                sb.append("{IMAGES DISABLED. IMAGE WIKITEXT IGNORED}");
-                return;
-            }
+        protected boolean getImagesAllowed() {
+            return mContext.getInt("allow_images", 0) != 0;
+        }
 
-            String fproxyPrefix = mContext.getString("fproxy_prefix", null);
-            if (fproxyPrefix == null) {
-                sb.append("{FPROXY PREFIX NOT SET. IMAGE WIKITEXT IGNORED}");
-                return;
-            }
-
-            String[] link=split(text, '|');
-            if (fproxyPrefix != null &&
-                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=\"" + makeFproxyHref(fproxyPrefix, link[0].trim())
-                          + "\" alt=\""+alt+"\" title=\""+alt+"\" />");
-                return;
-            }
-            sb.append("{ERROR PROCESSING IMAGE WIKITEXT}");;
+        protected String makeLink(String containerRelativePath) {
+            return mContext.makeLink(containerRelativePath);
         }
     }
 
+    // Hrrmm.. kind of weird. I can't remember why I used this static method instead of a constant.
     // NO trailing slash.
     private static String containerPrefix() { return "/plugins/fniki.freenet.plugin.Fniki"; }
 
diff --git a/src/fniki/wiki/WikiParserDelegate.java b/src/fniki/wiki/WikiParserDelegate.java
new file mode 100644
--- /dev/null
+++ b/src/fniki/wiki/WikiParserDelegate.java
@@ -0,0 +1,130 @@
+/* A base class for common parts of FreenetWikiTextParser.ParserDelegate implementations.
+ *
+ * INTENT: I did this so code could be shared between the live wiki and html dumping.
+ *
+ * Copyright (C) 2010, 2011 Darrell Karbott
+ *
+ * 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: djk@isFiaD04zgAgnrEC5XJt1i4IE7AkNPqhBG5bONi6Yks
+ *
+ *  This file was developed as component of
+ * "fniki" (a wiki implementation running over Freenet).
+ */
+
+package fniki.wiki;
+
+import static ys.wikiparser.Utils.*; // DCI: clean up
+
+import java.io.IOException;
+
+import wormarc.FileManifest;
+
+import static fniki.wiki.HtmlUtils.*;
+import static fniki.wiki.Validations.*;
+
+public abstract class WikiParserDelegate implements FreenetWikiTextParser.ParserDelegate {
+    final ArchiveManager mArchiveManager;
+
+    public WikiParserDelegate(ArchiveManager archiveManager) {
+        mArchiveManager = archiveManager;
+    }
+
+    protected abstract String getContainerPrefix();
+    protected abstract String getFproxyPrefix();
+    protected abstract boolean getImagesAllowed();
+    protected abstract String makeLink(String containerRelativePath);
+
+    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, getContainerPrefix(), 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()) {
+                    appendPageLink(getContainerPrefix(), sb, name, null, true);
+                    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 fproxyPrefix = getFproxyPrefix();
+
+        String[] link=split(text, '|');
+        if (fproxyPrefix != null &&
+            isValidFreenetUri(link[0])) {
+            sb.append("<a href=\""+ makeFproxyHref(fproxyPrefix, link[0].trim()) +"\" rel=\"nofollow\">");
+            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.
+            sb.append("<a href=\""+ makeHref(makeLink("/" + link[0].trim())) +"\" rel=\"nofollow\">");
+            sb.append(escapeHTML(unescapeHTML(link.length>=2 && !isEmpty(link[1].trim())? link[1]:link[0])));
+            sb.append("</a>");
+            return;
+        }
+
+        sb.append("<a href=\"" + makeHref(makeLink("/ExternalLink")) +"\" rel=\"nofollow\">");
+        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) {
+        if (!getImagesAllowed()) {
+            sb.append("{IMAGES DISABLED. IMAGE WIKITEXT IGNORED}");
+            return;
+        }
+
+        String fproxyPrefix = getFproxyPrefix();
+        if (fproxyPrefix == null) {
+            sb.append("{FPROXY PREFIX NOT SET. IMAGE WIKITEXT IGNORED}");
+            return;
+        }
+
+        String[] link=split(text, '|');
+        if (fproxyPrefix != null &&
+            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=\"" + makeFproxyHref(fproxyPrefix, link[0].trim())
+                      + "\" alt=\""+alt+"\" title=\""+alt+"\" />");
+            return;
+        }
+        sb.append("{ERROR PROCESSING IMAGE WIKITEXT}");;
+    }
+}
+