/* 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}");; } }