[hmath-commits] org.hmath.server/WEB-INF/src/org/hartmath/server/filter CachedWikipediaParser.java,N
Status: Pre-Alpha
Brought to you by:
jsurfer
Update of /cvsroot/hmath/org.hmath.server/WEB-INF/src/org/hartmath/server/filter In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv24472/WEB-INF/src/org/hartmath/server/filter Modified Files: WikipediaFilter.java Added Files: CachedWikipediaParser.java CachedWikipediaFilter.java ICachableMacro.java Removed Files: MacroHMathFilter.java Log Message: misc changes --- NEW FILE: ICachableMacro.java --- /* * Created on 27.01.2004 * * To change the template for this generated file go to * Window - Preferences - Java - Code Generation - Code and Comments */ package org.hartmath.server.filter; /** * this interface indicates that a macro has a body content */ public interface ICachableMacro { } Index: WikipediaFilter.java =================================================================== RCS file: /cvsroot/hmath/org.hmath.server/WEB-INF/src/org/hartmath/server/filter/WikipediaFilter.java,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** WikipediaFilter.java 14 Apr 2004 20:06:24 -0000 1.7 --- WikipediaFilter.java 25 Apr 2004 18:50:05 -0000 1.8 *************** *** 55,59 **** import org.snipsnap.snip.Snip; import org.snipsnap.snip.SnipLink; - /** * Parse the input and transform it for the most used wiki patterns --- 55,58 ---- *************** *** 77,80 **** --- 76,81 ---- private RenderEngine fWikiEngine; private Snip fSnip; + private boolean fASMStart = false; + private int fASMStartPosition = 0; public static final String INVALID_CHAR_IN_PLUGIN_IDENTIFIER = "Invalid_Char_In_Plugin_Identifier"; *************** *** 159,162 **** --- 160,167 ---- private void copyWhite(boolean whiteStart, final int whiteStartPosition, final int diff) { if (whiteStart) { + if (!fASMStart) { + fASMStart = true; + fASMStartPosition = fResult.length(); + } final int len = fCurrentPosition - diff; int currentIndex = whiteStartPosition; *************** *** 216,220 **** case '<' : // special html escape character if (lastIndex < (currentIndex - 1)) { ! fResult.append(text.substring(lastIndex, currentIndex-1)); lastIndex = currentIndex; } --- 221,225 ---- case '<' : // special html escape character if (lastIndex < (currentIndex - 1)) { ! fResult.append(text.substring(lastIndex, currentIndex - 1)); lastIndex = currentIndex; } *************** *** 223,227 **** case '>' : // special html escape character if (lastIndex < (currentIndex - 1)) { ! fResult.append(text.substring(lastIndex, currentIndex-1)); lastIndex = currentIndex; } --- 228,232 ---- case '>' : // special html escape character if (lastIndex < (currentIndex - 1)) { ! fResult.append(text.substring(lastIndex, currentIndex - 1)); lastIndex = currentIndex; } *************** *** 230,234 **** case '&' : // special html escape character if (lastIndex < (currentIndex - 1)) { ! fResult.append(text.substring(lastIndex, currentIndex-1)); lastIndex = currentIndex; } --- 235,239 ---- case '&' : // special html escape character if (lastIndex < (currentIndex - 1)) { ! fResult.append(text.substring(lastIndex, currentIndex - 1)); lastIndex = currentIndex; } *************** *** 237,241 **** case '\'' : // special html escape character if (lastIndex < (currentIndex - 1)) { ! fResult.append(text.substring(lastIndex, currentIndex-1)); lastIndex = currentIndex; } --- 242,246 ---- case '\'' : // special html escape character if (lastIndex < (currentIndex - 1)) { ! fResult.append(text.substring(lastIndex, currentIndex - 1)); lastIndex = currentIndex; } *************** *** 244,248 **** case '\"' : // special html escape character if (lastIndex < (currentIndex - 1)) { ! fResult.append(text.substring(lastIndex, currentIndex-1)); lastIndex = currentIndex; } --- 249,253 ---- case '\"' : // special html escape character if (lastIndex < (currentIndex - 1)) { ! fResult.append(text.substring(lastIndex, currentIndex - 1)); lastIndex = currentIndex; } *************** *** 262,268 **** while (currentIndex < len) { switch (text.charAt(currentIndex++)) { ! case '\n' : if (lastIndex < (currentIndex - 1)) { ! fResult.append(text.substring(lastIndex, currentIndex-1)); lastIndex = currentIndex; } --- 267,273 ---- while (currentIndex < len) { switch (text.charAt(currentIndex++)) { ! case '\n' : if (lastIndex < (currentIndex - 1)) { ! fResult.append(text.substring(lastIndex, currentIndex - 1)); lastIndex = currentIndex; } *************** *** 271,307 **** case '<' : // special html escape character if (lastIndex < (currentIndex - 1)) { ! fResult.append(text.substring(lastIndex, currentIndex-1)); lastIndex = currentIndex; } fResult.append("<"); break; ! case '>' : // special html escape character ! if (lastIndex < (currentIndex - 1)) { ! fResult.append(text.substring(lastIndex, currentIndex-1)); ! lastIndex = currentIndex; ! } ! fResult.append(">"); ! break; ! case '&' : // special html escape character ! if (lastIndex < (currentIndex - 1)) { ! fResult.append(text.substring(lastIndex, currentIndex-1)); ! lastIndex = currentIndex; ! } ! fResult.append("&"); ! break; ! case '\'' : // special html escape character ! if (lastIndex < (currentIndex - 1)) { ! fResult.append(text.substring(lastIndex, currentIndex-1)); ! lastIndex = currentIndex; ! } ! fResult.append("'"); ! break; ! case '\"' : // special html escape character ! if (lastIndex < (currentIndex - 1)) { ! fResult.append(text.substring(lastIndex, currentIndex-1)); ! lastIndex = currentIndex; ! } ! fResult.append("""); ! break; } } --- 276,312 ---- case '<' : // special html escape character if (lastIndex < (currentIndex - 1)) { ! fResult.append(text.substring(lastIndex, currentIndex - 1)); lastIndex = currentIndex; } fResult.append("<"); break; ! case '>' : // special html escape character ! if (lastIndex < (currentIndex - 1)) { ! fResult.append(text.substring(lastIndex, currentIndex - 1)); ! lastIndex = currentIndex; ! } ! fResult.append(">"); ! break; ! case '&' : // special html escape character ! if (lastIndex < (currentIndex - 1)) { ! fResult.append(text.substring(lastIndex, currentIndex - 1)); ! lastIndex = currentIndex; ! } ! fResult.append("&"); ! break; ! case '\'' : // special html escape character ! if (lastIndex < (currentIndex - 1)) { ! fResult.append(text.substring(lastIndex, currentIndex - 1)); ! lastIndex = currentIndex; ! } ! fResult.append("'"); ! break; ! case '\"' : // special html escape character ! if (lastIndex < (currentIndex - 1)) { ! fResult.append(text.substring(lastIndex, currentIndex - 1)); ! lastIndex = currentIndex; ! } ! fResult.append("""); ! break; } } *************** *** 616,654 **** macroStartTag = new String(fSource, startMacroPosition, fCurrentPosition - startMacroPosition - 1); if (macroStartTag != null) { ! String command = ""; ! String endTag; ! ! String parameterString = null; ! String macroBodyString = ""; ! int index0; ! int index1; ! if ((index0 = macroStartTag.indexOf(':')) >= 0) { ! command = macroStartTag.substring(0, index0); ! parameterString = macroStartTag.substring(index0 + 1, macroStartTag.length()); ! } else { ! command = macroStartTag; ! } ! Macro macro = (Macro) getMacroRepository().get(command); ! ! String completeMacroSubString; ! ! if ((macro != null) && (macro instanceof IBodyTagSupportMacro)) { ! endTag = '{' + command + '}'; ! index0 = fStringSource.indexOf(endTag, fCurrentPosition); ! ! if (index0 >= 0) { ! macroBodyString = fStringSource.substring(fCurrentPosition, index0); ! completeMacroSubString = ! new String(fSource, startMacroPosition - 1, index0 + endTag.length() - startMacroPosition + 1); ! fCurrentPosition = startMacroPosition + completeMacroSubString.length() - 1; ! } else { ! completeMacroSubString = new String(fSource, startMacroPosition - 1, macroStartTag.length() + 2); ! } ! } else { ! completeMacroSubString = new String(fSource, startMacroPosition - 1, macroStartTag.length() + 2); ! } ! ! handleMacro(completeMacroSubString, command, parameterString, macroBodyString); ! continue; } --- 621,625 ---- macroStartTag = new String(fSource, startMacroPosition, fCurrentPosition - startMacroPosition - 1); if (macroStartTag != null) { ! createMacro(startMacroPosition, macroStartTag); continue; } *************** *** 1042,1046 **** fCurrentPosition += 7; if (readUntilString("</nowiki>")) { ! String nowikiContent = new String(fSource, htmlStartPosition + 7, fCurrentPosition - htmlStartPosition - 16); if (nowikiContent != null) { copyWhite(fWhiteStart, fWhiteStartPosition, fCurrentPosition - htmlStartPosition + 1); --- 1013,1018 ---- fCurrentPosition += 7; if (readUntilString("</nowiki>")) { ! String nowikiContent = ! new String(fSource, htmlStartPosition + 7, fCurrentPosition - htmlStartPosition - 16); if (nowikiContent != null) { copyWhite(fWhiteStart, fWhiteStartPosition, fCurrentPosition - htmlStartPosition + 1); *************** *** 1095,1098 **** --- 1067,1074 ---- fWhiteStartPosition = fCurrentPosition - 1; } + if (!fASMStart) { + fASMStart = true; + fASMStartPosition = fResult.length(); + } startOfIndent = false; } *************** *** 1105,1108 **** --- 1081,1122 ---- } + private void createMacro(int startMacroPosition, String macroStartTag) { + String command = ""; + String endTag; + + String parameterString = null; + String macroBodyString = ""; + int index0; + int index1; + if ((index0 = macroStartTag.indexOf(':')) >= 0) { + command = macroStartTag.substring(0, index0); + parameterString = macroStartTag.substring(index0 + 1, macroStartTag.length()); + } else { + command = macroStartTag; + } + Macro macro = (Macro) getMacroRepository().get(command); + + String completeMacroSubString; + + if ((macro != null) && (macro instanceof IBodyTagSupportMacro)) { + endTag = '{' + command + '}'; + index0 = fStringSource.indexOf(endTag, fCurrentPosition); + + if (index0 >= 0) { + macroBodyString = fStringSource.substring(fCurrentPosition, index0); + completeMacroSubString = new String(fSource, startMacroPosition - 1, index0 + endTag.length() - startMacroPosition + 1); + fCurrentPosition = startMacroPosition + completeMacroSubString.length() - 1; + } else { + completeMacroSubString = new String(fSource, startMacroPosition - 1, macroStartTag.length() + 2); + } + } else { + completeMacroSubString = new String(fSource, startMacroPosition - 1, macroStartTag.length() + 2); + } + + copyWhite(fWhiteStart, fWhiteStartPosition, 1); + + handleMacro(completeMacroSubString, command, parameterString, macroBodyString); + } + private void createExternalLink(String urlString) { *************** *** 1299,1306 **** if (level == headLevel) { String snipName = ""; ! if (fSnip!=null) { snipName = fSnip.getName(); } ! StringBuffer link = new StringBuffer(snipName.length() + 40 + head.length() + anchor.length()); link.append("<li>"); --- 1313,1320 ---- if (level == headLevel) { String snipName = ""; ! if (fSnip != null) { snipName = fSnip.getName(); } ! StringBuffer link = new StringBuffer(snipName.length() + 40 + head.length() + anchor.length()); link.append("<li>"); *************** *** 2117,2120 **** --- 2131,2135 ---- } + public String filter(String input, FilterContext context, int recursionLevel) { try { *************** *** 2122,2125 **** --- 2137,2141 ---- return "<span class=\"error\">Error - recursion limit exceeded.</span>"; } + StringBuffer result = new StringBuffer(input.length() + input.length() / 10); // instantiate inner Parser class *************** *** 2130,2138 **** } catch (Exception e) { //log.warn("<span class=\"error\">Exception</span>: " + this + ": " + e); ! log.warn("Exception for: " + this +" " + e); e.printStackTrace(); } catch (Error err) { //log.warn("<span class=\"error\">Error</span>: " + this + ": " + err); ! log.warn("Error for: " + this); err.printStackTrace(); } --- 2146,2154 ---- } catch (Exception e) { //log.warn("<span class=\"error\">Exception</span>: " + this + ": " + e); ! log.warn("Exception for: " + " " + e); e.printStackTrace(); } catch (Error err) { //log.warn("<span class=\"error\">Error</span>: " + this + ": " + err); ! log.warn("Error for: " ); err.printStackTrace(); } --- NEW FILE: CachedWikipediaFilter.java --- /* * This file is part of the "HMath MathML BLOG/Wiki Engine". * * Copyright (c) 2004 Klaus Hartlage All Rights Reserved. * * Please visit http://www.hmath.org/ for updates and contact. * * --LICENSE NOTICE-- This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser * General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser 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 --LICENSE NOTICE-- */ package org.hartmath.server.filter; import java.io.IOException; import java.io.Writer; import java.text.MessageFormat; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hartmath.server.cache.DummyCachedPage; import org.hartmath.server.cache.ICachedPage; import org.hartmath.server.taglib.MathSniffer; import org.radeox.api.engine.ImageRenderEngine; import org.radeox.api.engine.IncludeRenderEngine; import org.radeox.api.engine.RenderEngine; import org.radeox.api.engine.WikiRenderEngine; import org.radeox.filter.CacheFilter; import org.radeox.filter.FilterSupport; import org.radeox.filter.context.FilterContext; import org.radeox.filter.interwiki.InterWiki; import org.radeox.macro.Macro; import org.radeox.macro.MacroRepository; import org.radeox.macro.parameter.MacroParameter; import org.radeox.util.Encoder; import org.radeox.util.StringBufferWriter; import org.snipsnap.app.Application; /** * Parse the input and transform it for the most used wiki patterns */ public class CachedWikipediaFilter extends FilterSupport implements CacheFilter, IWikipediaFilterConstants { public static final DummyCachedPage DUMMY_CACHED_PAGE = new DummyCachedPage(); public class InvalidInputException extends Exception { public InvalidInputException() { super(); } public InvalidInputException(String s) { super(s); } } public static class Token { private int fToken; public Token(int token) { fToken = token; } /* * (non-Javadoc) * * @see java.lang.Object#equals(java.lang.Object) */ public boolean equals(Object obj) { return (obj instanceof Token) && fToken == ((Token) obj).fToken; } /** * @return */ public int getToken() { return fToken; } public String getTagName() { return ""; } } public static class ListToken extends Token { int fLevel; public ListToken(int token, int level) { super(token); fLevel = level; } public int getLevel() { return fLevel; } } public static class OpenTagToken extends Token { private String fTagName; private String fOpenTag; public OpenTagToken(int token, String name, String openTag) { super(token); fTagName = name; fOpenTag = openTag; } public String getTagName() { return fTagName; } public String getOpenTag() { return fOpenTag; } public void setTagName(String name) { fTagName = name; } public void setOpenTag(String openTag) { fOpenTag = openTag; } } public static class SpecialTagToken extends OpenTagToken { public SpecialTagToken(int token, String name, String openTag) { super(token, name, openTag); } } public static class CloseTagToken extends Token { private String fTagName; private String fCloseTag; public CloseTagToken(int token, String name, String closeTag) { super(token); fTagName = name; fCloseTag = closeTag; } public String getTagName() { return fTagName; } public String getCloseTag() { return fCloseTag; } public void setTagName(String name) { fTagName = name; } public void setCloseTag(String closeTag) { fCloseTag = closeTag; } } final static String HEADER_STRINGS[] = { "=", "==", "===", "====", "=====", "======" }; final static int TokenNotFound = -2; final static int TokenIgnore = -1; final static int TokenSTART = 0; final static int TokenEOF = 1; final static int TokenERROR = 2; final static int TokenBOLD = 3; final static int TokenITALIC = 4; final static int TokenSTRIKETHROUGH = 5; final static int TokenSTRONG = 8; final static int TokenEM = 9; final static int TokenCOMMA = 134; final static int TokenDOLLAR_LBRACE = 127; final static int TokenLIST_UL_START = 50; final static int TokenLIST_OL_START = 51; final static int TokenLIST_UL_END = 75; final static int TokenLIST_OL_END = 76; final static int TokenHTML_BR_OPEN = 190; final static int TokenHTML_HR_OPEN = 191; final static int TokenHTML_BOLD_OPEN = 200; final static int TokenHTML_BOLD_CLOSE = 201; final static int TokenHTML_ITALIC_OPEN = 202; final static int TokenHTML_ITALIC_CLOSE = 203; final static int TokenHTML_UNDERLINE_OPEN = 204; final static int TokenHTML_UNDERLINE_CLOSE = 205; final static int TokenHTML_STRIKE_OPEN = 206; final static int TokenHTML_STRIKE_CLOSE = 207; final static int TokenHTML_PARAGRAPH_OPEN = 208; final static int TokenHTML_PARAGRAPH_CLOSE = 209; final static int TokenHTML_PRE_OPEN = 210; final static int TokenHTML_PRE_CLOSE = 211; final static int TokenHTML_BLOCKQUOTE_OPEN = 212; final static int TokenHTML_BLOCKQUOTE_CLOSE = 213; final static int TokenHTML_SUB_OPEN = 216; final static int TokenHTML_SUB_CLOSE = 217; final static int TokenHTML_SUP_OPEN = 218; final static int TokenHTML_SUP_CLOSE = 219; final static int TokenHTML_H1_CLOSE = 221; final static int TokenHTML_H1_OPEN = 220; final static int TokenHTML_H2_CLOSE = 223; final static int TokenHTML_H2_OPEN = 222; final static int TokenHTML_H3_CLOSE = 225; final static int TokenHTML_H3_OPEN = 224; final static int TokenHTML_H4_CLOSE = 227; final static int TokenHTML_H4_OPEN = 226; final static int TokenHTML_H5_CLOSE = 229; final static int TokenHTML_H5_OPEN = 228; final static int TokenHTML_H6_CLOSE = 231; final static int TokenHTML_H6_OPEN = 230; final static int TokenHTML_EM_OPEN = 240; final static int TokenHTML_EM_CLOSE = 241; final static int TokenHTML_STRONG_CLOSE = 243; final static int TokenHTML_STRONG_OPEN = 242; final static int TokenHTML_VAR_OPEN = 245; final static int TokenHTML_VAR_CLOSE = 246; final static int TokenHTML_CODE_OPEN = 247; final static int TokenHTML_CODE_CLOSE = 248; final static int TokenHTML_MATH_OPEN = 400; final static int TokenHTML_MATH_CLOSE = 401; final static int TokenIdentifier = 138; final static int TokenLBRACKET = 132; final static int TokenLPAREN = 128; final static int TokenPLUGIN_IDENTIFIER = 130; final static int TokenRBRACE = 131; final static int TokenRBRACKET = 133; final static int TokenRPAREN = 129; final static Token BOLD = new Token(TokenBOLD); final static Token ITALIC = new Token(TokenITALIC); final static Token STRONG = new Token(TokenSTRONG); final static Token EM = new Token(TokenEM); final static Token HTML_BR_OPEN = new SpecialTagToken(TokenHTML_BR_OPEN, "br", "<br/>"); final static Token HTML_HR_OPEN = new SpecialTagToken(TokenHTML_HR_OPEN, "hr", "<hr/>"); final static Token HTML_EM_CLOSE = new CloseTagToken(TokenHTML_EM_CLOSE, "em", "</i>"); final static Token HTML_EM_OPEN = new OpenTagToken(TokenHTML_EM_OPEN, "em", "<i>"); final static Token HTML_H1_CLOSE = new CloseTagToken(TokenHTML_H1_CLOSE, "h1", "</h1>"); final static Token HTML_H1_OPEN = new OpenTagToken(TokenHTML_H1_OPEN, "h1", "<h1>"); final static Token HTML_H2_CLOSE = new CloseTagToken(TokenHTML_H2_CLOSE, "h2", "</h2>"); final static Token HTML_H2_OPEN = new OpenTagToken(TokenHTML_H2_OPEN, "h2", "<h2>"); final static Token HTML_H3_CLOSE = new CloseTagToken(TokenHTML_H3_CLOSE, "h3", "</h3>"); final static Token HTML_H3_OPEN = new OpenTagToken(TokenHTML_H3_OPEN, "h3", "<h3>"); final static Token HTML_H4_CLOSE = new CloseTagToken(TokenHTML_H4_CLOSE, "h4", "</h4>"); final static Token HTML_H4_OPEN = new OpenTagToken(TokenHTML_H4_OPEN, "h4", "<h4>"); final static Token HTML_H5_CLOSE = new CloseTagToken(TokenHTML_H5_CLOSE, "h5", "</h5>"); final static Token HTML_H5_OPEN = new OpenTagToken(TokenHTML_H5_OPEN, "h5", "<h5>"); final static Token HTML_H6_CLOSE = new CloseTagToken(TokenHTML_H6_CLOSE, "h6", "</h6>"); final static Token HTML_H6_OPEN = new OpenTagToken(TokenHTML_H6_OPEN, "h6", "<h6>"); final static Token HTML_ITALIC_CLOSE = new CloseTagToken(TokenHTML_ITALIC_CLOSE, "i", "</i>"); final static Token HTML_ITALIC_OPEN = new OpenTagToken(TokenHTML_ITALIC_OPEN, "i", "<i>"); final static Token HTML_BOLD_CLOSE = new CloseTagToken(TokenHTML_BOLD_CLOSE, "b", "</b>"); final static Token HTML_BOLD_OPEN = new OpenTagToken(TokenHTML_BOLD_OPEN, "b", "<b>"); // final static Token HTML_PARAGRAPH_CLOSE = new CloseTagToken(TokenHTML_PARAGRAPH_CLOSE, "p", "</p>"); final static Token HTML_PARAGRAPH_OPEN = new OpenTagToken(TokenHTML_PARAGRAPH_OPEN, "p", "<p>"); final static Token HTML_PRE_CLOSE = new CloseTagToken(TokenHTML_PRE_CLOSE, "pre", "</pre>"); final static Token HTML_PRE_OPEN = new OpenTagToken(TokenHTML_PRE_OPEN, "pre", "<pre class=\"pre\">"); final static Token HTML_BLOCKQUOTE_CLOSE = new CloseTagToken(TokenHTML_BLOCKQUOTE_CLOSE, "blockquote", "</blockquote>"); final static Token HTML_BLOCKQUOTE_OPEN = new OpenTagToken(TokenHTML_BLOCKQUOTE_OPEN, "blockquote", "<blockquote>"); final static Token HTML_STRIKE_CLOSE = new CloseTagToken(TokenHTML_STRIKE_CLOSE, "strike", "</strike>"); final static Token HTML_STRIKE_OPEN = new OpenTagToken(TokenHTML_STRIKE_OPEN, "strike", "<strike>"); final static Token HTML_STRONG_CLOSE = new CloseTagToken(TokenHTML_STRONG_CLOSE, "strong", "</b>"); final static Token HTML_STRONG_OPEN = new OpenTagToken(TokenHTML_STRONG_OPEN, "strong", "<b>"); final static Token HTML_UNDERLINE_CLOSE = new CloseTagToken(TokenHTML_UNDERLINE_CLOSE, "u", "</u>"); final static Token HTML_UNDERLINE_OPEN = new OpenTagToken(TokenHTML_UNDERLINE_OPEN, "u", "<u>"); final static Token HTML_SUB_CLOSE = new CloseTagToken(TokenHTML_SUB_CLOSE, "sub", "</sub>"); final static Token HTML_SUB_OPEN = new OpenTagToken(TokenHTML_SUB_OPEN, "sub", "<sub>"); final static Token HTML_SUP_CLOSE = new CloseTagToken(TokenHTML_SUP_CLOSE, "sup", "</sup>"); final static Token HTML_SUP_OPEN = new OpenTagToken(TokenHTML_SUP_OPEN, "sup", "<sup>"); final static Token HTML_MATH_OPEN = new OpenTagToken(TokenHTML_MATH_CLOSE, "math", "<math>"); final static Token HTML_MATH_CLOSE = new CloseTagToken(TokenHTML_MATH_OPEN, "math", "</math>"); final static Token LIST_OL_START = new Token(TokenLIST_OL_START); final static Token LIST_UL_START = new Token(TokenLIST_UL_START); final static Token HTML_VAR_CLOSE = new CloseTagToken(TokenHTML_VAR_CLOSE, "var", "</var>"); final static Token HTML_VAR_OPEN = new OpenTagToken(TokenHTML_VAR_OPEN, "var", "<var>"); final static Token HTML_CODE_CLOSE = new CloseTagToken(TokenHTML_CODE_CLOSE, "code", "</code>"); final static Token HTML_CODE_OPEN = new OpenTagToken(TokenHTML_CODE_OPEN, "code", "<code>"); final static HashMap OPEN_TAGS = new HashMap(); final static HashMap CLOSE_TAGS = new HashMap(); final static HashSet ENTITY_SET = new HashSet(); final static HashMap IMAGE_MAP = new HashMap(); private static Log log = LogFactory.getLog(CachedWikipediaFilter.class); { for (int i = 0; i < ENTITY_STRINGS.length; i++) { ENTITY_SET.add(ENTITY_STRINGS[i]); } for (int i = 0; i < IMAGE_STRINGS.length; i += 2) { IMAGE_MAP.put(IMAGE_STRINGS[i], IMAGE_STRINGS[i + 1]); } OPEN_TAGS.put("br", HTML_BR_OPEN); OPEN_TAGS.put("hr", HTML_HR_OPEN); OPEN_TAGS.put("h1", HTML_H1_OPEN); OPEN_TAGS.put("h2", HTML_H2_OPEN); OPEN_TAGS.put("h3", HTML_H3_OPEN); OPEN_TAGS.put("h4", HTML_H4_OPEN); OPEN_TAGS.put("h5", HTML_H5_OPEN); OPEN_TAGS.put("h6", HTML_H6_OPEN); CLOSE_TAGS.put("h1", HTML_H1_CLOSE); CLOSE_TAGS.put("h2", HTML_H2_CLOSE); CLOSE_TAGS.put("h3", HTML_H1_CLOSE); CLOSE_TAGS.put("h4", HTML_H2_CLOSE); CLOSE_TAGS.put("h5", HTML_H1_CLOSE); CLOSE_TAGS.put("h6", HTML_H2_CLOSE); OPEN_TAGS.put("em", HTML_EM_OPEN); CLOSE_TAGS.put("em", HTML_EM_CLOSE); OPEN_TAGS.put("i", HTML_ITALIC_OPEN); CLOSE_TAGS.put("i", HTML_ITALIC_CLOSE); OPEN_TAGS.put("b", HTML_BOLD_OPEN); CLOSE_TAGS.put("b", HTML_BOLD_CLOSE); OPEN_TAGS.put("strong", HTML_STRONG_OPEN); CLOSE_TAGS.put("strong", HTML_STRONG_CLOSE); OPEN_TAGS.put("u", HTML_UNDERLINE_OPEN); CLOSE_TAGS.put("u", HTML_UNDERLINE_CLOSE); OPEN_TAGS.put("p", HTML_PARAGRAPH_OPEN); CLOSE_TAGS.put("p", HTML_PARAGRAPH_CLOSE); OPEN_TAGS.put("pre", HTML_PRE_OPEN); CLOSE_TAGS.put("pre", HTML_PRE_CLOSE); OPEN_TAGS.put("blockquote", HTML_BLOCKQUOTE_OPEN); CLOSE_TAGS.put("blockquote", HTML_BLOCKQUOTE_CLOSE); OPEN_TAGS.put("var", HTML_PRE_OPEN); CLOSE_TAGS.put("var", HTML_PRE_CLOSE); OPEN_TAGS.put("code", HTML_CODE_OPEN); CLOSE_TAGS.put("code", HTML_CODE_CLOSE); OPEN_TAGS.put("sub", HTML_SUB_OPEN); CLOSE_TAGS.put("sub", HTML_SUB_CLOSE); OPEN_TAGS.put("sup", HTML_SUP_OPEN); CLOSE_TAGS.put("sup", HTML_SUP_CLOSE); OPEN_TAGS.put("strike", HTML_STRIKE_OPEN); CLOSE_TAGS.put("strike", HTML_STRIKE_CLOSE); OPEN_TAGS.put("math", HTML_MATH_OPEN); CLOSE_TAGS.put("math", HTML_MATH_CLOSE); } /** * Limits the recursive call of this filter to a depth of RECURSION_LIMIT */ final static int RECURSION_LIMIT = 5; final static Token START = new Token(TokenSTART); final static Token STRIKETHROUGH = new Token(TokenSTRIKETHROUGH); /** * Determines if the specified character may be part of a url */ public final static boolean isUrlIdentifierPart(char ch) { if (Character.isLetterOrDigit(ch)) { return true; } final String test = "-_.!~*';/?:@#&=+$,"; return test.indexOf(ch) != (-1); } /** * Determines if the specified character may be part of a wiki plugin identifier as other than the first character */ public final static boolean isWikiPluginIdentifierPart(char ch) { return Character.isLetterOrDigit(ch) || (ch == '_'); } /** * Determines if the specified character may be part the first character of a wiki plugin identifier */ public final static boolean isWikiPluginIdentifierStart(char ch) { return Character.isLetter(ch); } public static boolean createStaticImage(String imageTag, StringBuffer buff) { String value = (String) IMAGE_MAP.get(imageTag); if (value != null) { buff.append(MessageFormat.format(value, ARGUMENTS)); return true; } return false; } // private MacroRepository macros; public CachedWikipediaFilter() { super(); } public String filter(String input, FilterContext context) { return filter(input, context, null, DUMMY_CACHED_PAGE, 0); } public String filter(String input, FilterContext context, MacroRepository macros, ICachedPage compiler, int recursionLevel) { try { if (++recursionLevel > RECURSION_LIMIT) { String error = "<span class=\"error\">Error - recursion limit exceeded.</span>"; compiler.compileHTML(error); return error; } StringBuffer result = new StringBuffer(input.length() + input.length() / 10); // instantiate inner Parser class CachedWikipediaParser parser = new CachedWikipediaParser(macros, input, result, compiler, context, recursionLevel); parser.parse(); return result.toString(); // Util.substitute(matcher, p, new Perl5Substitution(s, interps), result, limit); } catch (Exception e) { //log.warn("<span class=\"error\">Exception</span>: " + this + ": " + e); log.warn("Exception for: " + " " + e); e.printStackTrace(); } catch (Error err) { //log.warn("<span class=\"error\">Error</span>: " + this + ": " + err); log.warn("Error for: "); err.printStackTrace(); } String error = "<span class=\"error\">Error in Parser.</span>"; compiler.compileHTML(error); return error; } public static String filterParser( String input, FilterContext context, ICachedPage compiler, MacroRepository macros, int recursionLevel) { try { if (++recursionLevel > RECURSION_LIMIT) { return "<span class=\"error\">Error - recursion limit exceeded.</span>"; } StringBuffer result = new StringBuffer(input.length() + input.length() / 10); // instantiate inner Parser class CachedWikipediaParser parser = new CachedWikipediaParser(macros, input, result, compiler, context, recursionLevel); parser.parse(); return result.toString(); // Util.substitute(matcher, p, new Perl5Substitution(s, interps), result, limit); } catch (Exception e) { //log.warn("<span class=\"error\">Exception</span>: " + this + ": " + e); log.warn("Exception for: " + " " + e); e.printStackTrace(); } catch (Error err) { //log.warn("<span class=\"error\">Error</span>: " + this + ": " + err); log.warn("Error for: "); err.printStackTrace(); } return "<span class=\"error\">Error in Parser.</span>"; } // private void filterParams(StringBuffer buffer, String name) { // Map param = fContext.getRenderContext().getParameters(); // if (param != null) { // if (param.containsKey(name)) { // Object value = param.get(name); // if (value instanceof String[]) { // buffer.append(((String[]) value)[0]); // } else { // buffer.append(value); // } // } else { // buffer.append("<"); // buffer.append(name); // buffer.append(">"); // } // } else { // buffer.append("<"); // buffer.append(name); // buffer.append(">"); // } // } // public String parseParameters(String unsplittedMacroParameters) { // int currPos = 0; // int currEndPos = 0; // int len = unsplittedMacroParameters.length(); // StringBuffer buffer = new StringBuffer(len); // char ch; // while (currPos < len) { // ch = unsplittedMacroParameters.charAt(currPos++); // if (ch != '$') { // buffer.append(ch); // } else { // if ((currEndPos = unsplittedMacroParameters.indexOf('|', currPos)) >= 1) { // filterParams(buffer, unsplittedMacroParameters.substring(currPos, currEndPos)); // currPos = currEndPos + 1; // buffer.append('|'); // } else { // if (currPos < len) { // filterParams(buffer, unsplittedMacroParameters.substring(currPos, len)); // } // } // } // } // return buffer.toString(); // } // protected Repository getMacroRepository() { // return macros; // } // public void setInitialContext(InitialRenderContext context) { // macros = MacroRepository.getInstance(); // macros.setInitialContext(context); // } public static void copyWhite(StringBuffer result, String text) { final int len = text.length(); int currentIndex = 0; int lastIndex = currentIndex; while (currentIndex < len) { switch (text.charAt(currentIndex++)) { case '<' : // special html escape character if (lastIndex < (currentIndex - 1)) { result.append(text.substring(lastIndex, currentIndex - 1)); lastIndex = currentIndex; } else { lastIndex++; } result.append("<"); break; case '>' : // special html escape character if (lastIndex < (currentIndex - 1)) { result.append(text.substring(lastIndex, currentIndex - 1)); lastIndex = currentIndex; } else { lastIndex++; } result.append(">"); break; case '&' : // special html escape character if (lastIndex < (currentIndex - 1)) { result.append(text.substring(lastIndex, currentIndex - 1)); lastIndex = currentIndex; } else { lastIndex++; } result.append("&"); break; case '\'' : // special html escape character if (lastIndex < (currentIndex - 1)) { result.append(text.substring(lastIndex, currentIndex - 1)); lastIndex = currentIndex; } else { lastIndex++; } result.append("'"); break; case '\"' : // special html escape character if (lastIndex < (currentIndex - 1)) { result.append(text.substring(lastIndex, currentIndex - 1)); lastIndex = currentIndex; } else { lastIndex++; } result.append("""); break; } } if (lastIndex < (currentIndex)) { result.append(text.substring(lastIndex, currentIndex)); } } public static void createMacro(StringBuffer result, String macroCommand, FilterContext context, MacroRepository macros) { String command = ""; String endTag; String parameterString = null; String macroBodyString = ""; int index0 = 0; int index1 = macroCommand.indexOf('}'); if ((index0 = macroCommand.indexOf(':')) >= 0 && (index0 < index1)) { command = macroCommand.substring(1, index0); parameterString = macroCommand.substring(index0 + 1, index1); } else { command = macroCommand.substring(1, index1); } Macro macro = (Macro) macros.get(command); String completeMacroSubString; if ((macro != null) && (macro instanceof IBodyTagSupportMacro)) { endTag = '{' + command + '}'; index0 = macroCommand.indexOf(endTag, command.length()); if (index0 >= 0) { macroBodyString = macroCommand.substring(index1 + 1, index0); } } completeMacroSubString = macroCommand; handleMacro(result, completeMacroSubString, command, parameterString, macroBodyString, context, macros); } private static void handleMacro( StringBuffer result, String completeMacroSubString, String command, String unsplittedMacroParameters, String group3, FilterContext context, MacroRepository macros) { if (command != null) { // {$peng} are variables not macros. if (!command.startsWith("$")) { MacroParameter mParams = context.getMacroParameter(); if (group3 != null) { mParams.setContent(group3); mParams.setContentStart(0); mParams.setContentEnd(group3.length()); } if (unsplittedMacroParameters != null && unsplittedMacroParameters.length() > 1) { // mParams.setParams(parseParameters(unsplittedMacroParameters)); mParams.setParams(unsplittedMacroParameters); } mParams.setStart(0); mParams.setEnd(completeMacroSubString.length()); // @DANGER: recursive calls may replace macros in included source code try { if (macros.containsKey(command)) { Macro macro = (Macro) macros.get(command); // recursively filter macros within macros if (null != mParams.getContent() && !(macro instanceof INoParserBodyFilterMacro)) { mParams.setContent(filterParser(mParams.getContent(), context, DUMMY_CACHED_PAGE, macros, 0)); } StringBufferWriter writer = new StringBufferWriter(new StringBuffer(256)); macro.execute(writer, mParams); StringBuffer buffer = writer.getBuffer(); if (macro instanceof IRenderResultMacro) { result.append(filterParser(buffer.toString(), context, DUMMY_CACHED_PAGE, macros, 0)); } else { result.append(buffer); } } else if (command.startsWith("!")) { RenderEngine engine = context.getRenderContext().getRenderEngine(); if (engine instanceof IncludeRenderEngine) { String include = ((IncludeRenderEngine) engine).include(command.substring(1)); if (null != include) { // Filter paramFilter = new ParamFilter(mParams); // included = paramFilter.filter(included, null); // fResult.append(include); result.append(filterParser(include, context, DUMMY_CACHED_PAGE, macros, 0)); } else { result.append(command.substring(1) + " not found."); } } return; } else { // fResult.append(group0); copyWhite(result, completeMacroSubString); return; } } catch (IllegalArgumentException e) { result.append("<div class=\"error\">" + command + ": " + e.getMessage() + "</div>"); e.printStackTrace(); } catch (Throwable e) { log.warn("MacroFilter: unable to format macro: " + command, e); result.append("<div class=\"error\">" + command + ": " + e.getMessage() + "</div>"); e.printStackTrace(); return; } } else { result.append("<"); result.append(command.substring(1)); result.append(">"); } } else { // fResult.append(group0); copyWhite(result, completeMacroSubString); } } public static void createExternalLink(StringBuffer result, RenderEngine wikiEngine, String urlString) { // Does our engine know images? if (wikiEngine instanceof ImageRenderEngine) { result.append(((ImageRenderEngine) wikiEngine).getExternalImageLink()); } result.append("<span class=\"nobr\">"); result.append("<a href=\""); result.append(Encoder.escape(urlString)); result.append("\">"); result.append(Encoder.toEntity(urlString.charAt(0)) + urlString.substring(1)); result.append("</a></span>"); } public static void handleSnipLink(StringBuffer result, RenderEngine wikiEngine, String name) { if (name != null) { int index = name.indexOf("http://"); // User probably wrote [http://radeox.org] instead of http://radeox.org if (index != -1) { createExternalLink(result, wikiEngine, name.substring(index)); // show error // fResult.append("<div class=\"error\">Do not surround URLs with [...].</div>"); } else { // trim the name and unescape it name = Encoder.unescape(name.trim()); // Is there an alias like [alias|link] ? int pipeIndex = name.indexOf('|'); String alias = ""; if (-1 != pipeIndex) { alias = name.substring(0, pipeIndex); name = name.substring(pipeIndex + 1); } int hashIndex = name.lastIndexOf('#'); String hash = ""; if (-1 != hashIndex && hashIndex != name.length() - 1) { hash = name.substring(hashIndex + 1); name = name.substring(0, hashIndex); } int colonIndex = name.indexOf(':'); // typed link ? if (-1 != colonIndex) { // for now throw away the type information name = name.substring(colonIndex + 1); } int atIndex = name.lastIndexOf('@'); // InterWiki link ? if (-1 != atIndex) { String extSpace = name.substring(atIndex + 1); // known extarnal space ? InterWiki interWiki = InterWiki.getInstance(); if (interWiki.contains(extSpace)) { name = name.substring(0, atIndex); Writer writer = new StringBufferWriter(result); try { if (-1 != hashIndex) { interWiki.expand(writer, extSpace, name, hash); } else { interWiki.expand(writer, extSpace, name, ""); } } catch (IOException e) { log.debug("InterWiki " + extSpace + " not found."); } } else { result.append("[<span class=\"error\">"); result.append(name); result.append("?</span>]"); } } else { // internal link if (wikiEngine != null && wikiEngine instanceof WikiRenderEngine) { if (((WikiRenderEngine) wikiEngine).exists(name)) { String view = name; if (-1 != pipeIndex) { view = alias; } // Do not add hash if an alias was given if (-1 != hashIndex) { ((WikiRenderEngine) wikiEngine).appendLink(result, name, view, hash); } else { ((WikiRenderEngine) wikiEngine).appendLink(result, name, view); } } else if (((WikiRenderEngine) wikiEngine).showCreate()) { ((WikiRenderEngine) wikiEngine).appendCreateLink(result, name, name); // links with "create" are not cacheable because // a missing wiki could be created // TODO is this ok? // fContext.getRenderContext().setCacheable(false); } else { // cannot display/create wiki, so just display the text result.append(name); } } else { // cannot display/create wiki, so just display the text result.append(name); } } } } } public static void handleTeXMath(StringBuffer result, String[] mathStrings) { Map map = Application.get().getParameters(); HttpServletRequest request = (HttpServletRequest) map.get("request"); MathSniffer sniffy = MathSniffer.getBrowserDetection(request); switch (sniffy.getBrowserId()) { case MathSniffer.XMLID : case MathSniffer.MATHPLAYERID : result.append(mathStrings[0]); break; case MathSniffer.CSSID : result.append(mathStrings[1]); break; default : result.append(mathStrings[2]); } } } --- NEW FILE: CachedWikipediaParser.java --- /* * Created on 21.04.2004 * * To change the template for this generated file go to Window - Preferences - Java - Code Generation - Code and Comments */ package org.hartmath.server.filter; import java.io.IOException; import java.io.Writer; import java.util.ArrayList; import java.util.Map; import java.util.NoSuchElementException; import java.util.Stack; import java.util.StringTokenizer; import javax.servlet.http.HttpServletRequest; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; [...1876 lines suppressed...] */ public void setContext(FilterContext context) { fContext = context; } /** * @return Returns the wikiEngine. */ public RenderEngine getWikiEngine() { return fWikiEngine; } /** * @param wikiEngine * The wikiEngine to set. */ public void setWikiEngine(RenderEngine wikiEngine) { fWikiEngine = wikiEngine; } } --- MacroHMathFilter.java DELETED --- |