From 8af5df7883e64ca4917632230f6e849447444d83 Mon Sep 17 00:00:00 2001 From: low012 Date: Mon, 16 Jan 2006 21:15:06 +0000 Subject: [PATCH] *) Replaced replaceHTML by a more versatile method (code by Kane). Please test for possible side effects if you use this method in any of your classes. *) Added a little bit of javadoc *) Replaced tabs by spaces and beautyfied the code here and there. The code is saved in UTF-8 encoding. I hope that does not cause any trouble. git-svn-id: https://svn.berlios.de/svnroot/repos/yacy/trunk@1354 6c8d7289-2bf4-0310-a012-ef5d649a1542 --- source/de/anomic/data/wikiCode.java | 779 +++++++++++++++------------- 1 file changed, 431 insertions(+), 348 deletions(-) diff --git a/source/de/anomic/data/wikiCode.java b/source/de/anomic/data/wikiCode.java index 4dbfb4709..300f3423a 100644 --- a/source/de/anomic/data/wikiCode.java +++ b/source/de/anomic/data/wikiCode.java @@ -56,6 +56,7 @@ import de.anomic.plasma.plasmaSwitchboard; import de.anomic.server.serverCore; import de.anomic.yacy.yacyCore; +/** This class provides methods to handle texts that have been posted in the yacyWiki. */ public class wikiCode { private String numListLevel=""; private String ListLevel=""; @@ -68,7 +69,8 @@ public class wikiCode { private boolean preformattedSpan = false; //needed for
 and 
spanning over several lines private int preindented = 0; //needed for indented
s
     private int escindented = 0;              //needed for indented [=s
-        
+
+    /** Constructor of the class wikiCode */
     public wikiCode(plasmaSwitchboard switchboard){
         sb=switchboard;
     }
@@ -80,6 +82,7 @@ public class wikiCode {
             return transform(content.getBytes(), sb);
         }
     }
+
     public String transform(byte[] content){
         return transform(content, sb);
     }
@@ -105,225 +108,339 @@ public class wikiCode {
             return "internal error: " + e.getMessage();
         }
     }
-    
-    public static String replaceHTML(String result) {
-        if (result == null) return null;
-        int p0;
-	
-	// avoide html inside
-	// Ampersands have to be replaced first. If they were replaced later,
-	// other replaced characters containing ampersands would get messed up.
-	p0 = 0; while ((p0 = result.indexOf("&", p0)) >= 0) {result = result.substring(0, p0) + "&" + result.substring(p0 + 1); p0++;}
-	p0 = 0; while ((p0 = result.indexOf('"', p0)) >= 0) result = result.substring(0, p0) + """ + result.substring(p0 + 1);
-	p0 = 0; while ((p0 = result.indexOf("<", p0)) >= 0) result = result.substring(0, p0) + "<" + result.substring(p0 + 1);
-	p0 = 0; while ((p0 = result.indexOf(">", p0)) >= 0) result = result.substring(0, p0) + ">" + result.substring(p0 + 1);
-	//p0 = 0; while ((p0 = result.indexOf("*", p0)) >= 0) result = result.substring(0, p0) + "•" + result.substring(p0 + 1);
-	p0 = 0; while ((p0 = result.indexOf("(C)", p0)) >= 0) result = result.substring(0, p0) + "©" + result.substring(p0 + 3);
-	
-	return result;
+
+    //The following method has been submitted by Kane (added and a few changes by MN)
+    /** Replaces special characters from a string. Otherwise they might cause ugly output on some systems.
+      * This code is also important to avoid XSS attacks.
+      *
+      * @param text a string that possibly contains special characters
+      * @return the string with all special characters encoded so they will look right on every system
+      */
+    public static String replaceHTML(String text) {
+        if (text==null) { return null; }
+        for (int x=0;x<=htmlentities.length-1;x=x+2) {
+            int p=0;
+            while ((p=text.indexOf(htmlentities[x],p))>=0) {
+                text=text.substring(0,p)+htmlentities[x+1]+text.substring(p+htmlentities[x].length());
+                p+=htmlentities[x+1].length();
+            }
+        }
+        return text;
     }
 
+    public static String[] htmlentities={
+        "&","&",    // Ampersands _have_ to be replaced first. If they were replaced later,
+                        // other replaced characters containing ampersands would get messed up.
+        //" "," ",
+        "¡","¡",
+        "¢","¢",
+        "£","£",
+        //"?","¤",
+        "¥","¥",
+        //"?","¦",
+        "§","§",
+        //"?","¨",
+        "©","©",
+        "ª","ª",
+        "«","«",
+        "¬","¬",
+        //"","­",
+        "®","®",
+        "¯","¯",
+        "°","°",
+        "±","±",
+        "²","²",
+        "³","³",
+        //"?","´",
+        "µ","µ",
+        "¶","¶",
+        "·","·",
+        //"?","¸",
+        "¹","¹",
+        "º","º",
+        "»","»",
+        //"?","¼",
+        //"?","½",
+        //"?","¾",
+        "¿","¿",
+        "À","À",
+        "Á","Á",
+        "Â","Â",
+        "Ã","Ã",
+        "Ä","Ä",
+        "Å","Å",
+        "Æ","Æ",
+        "Ç","Ç",
+        "È","È",
+        "É","É",
+        "Ê","Ê",
+        "Ë","Ë",
+        "Ì","Ì",
+        "Í","Í",
+        "Î","Î",
+        "Ï","Ï",
+        "Ð","Ð",
+        "Ñ","Ñ",
+        "Ò","Ò",
+        "Ó","Ó",
+        "Ô","Ô",
+        "Õ","Õ",
+        "Ö","Ö",
+        "×","×",
+        "Ø","Ø",
+        "Ù","Ù",
+        "Ú","Ú",
+        "Û","Û",
+        "Ü","Ü",
+        "Ý","Ý",
+        "Þ","Þ",
+        "ß","ß",
+        "à","à",
+        "á","á",
+        "â","â",
+        "ã","ã",
+        "ä","ä",
+        "å","å",
+        "æ","æ",
+        "ç","ç",
+        "è","è",
+        "é","é",
+        "ê","ê",
+        "ë","ë",
+        "ì","ì",
+        "í","í",
+        "î","î",
+        "ï","ï",
+        "ð","ð",
+        "ñ","ñ",
+        "ò","ò",
+        "ó","ó",
+        "ô","ô",
+        "õ","õ",
+        "ö","ö",
+        "÷","÷",
+        "ø","ø",
+        "ù","ù",
+        "ú","ú",
+        "û","û",
+        "ü","ü",
+        "ý","ý",
+        "þ","þ",
+        "ÿ","ÿ",
+        "\"",""",
+        "<","<",
+        ">",">",
+        "(C)","©"
+    };
+    //end of Kane's code
+
+    /** Replaces wiki tags with HTML tags.
+      *
+      * @param result a line of text
+      * @param switchboard
+      *
+      * @result the line of text with HTML tags instead of wiki tags
+      */
     public String transformLine(String result, plasmaSwitchboard switchboard) {
-	// transform page
-	int p0, p1;
-	boolean defList = false;    //needed for definition lists
-        
-	result = replaceHTML(result);
-	
-	//check if line contains any escape symbol or tag for preformatted text 
-	//or if we are in an esacpe sequence already or if we are in a preforamtted text
-	//if that's the case the program will continue further below 
-	//(see code for [= and =] and 
 and 
) [MN] - if((result.indexOf("[=")<0)&&(result.indexOf("=]")<0)&&(!escapeSpan)&& - (result.indexOf("<pre>")<0)&&(result.indexOf("</pre>")<0)&&(!preformattedSpan)){ - + // transform page + int p0, p1; + boolean defList = false; //needed for definition lists + + result = replaceHTML(result); + + //check if line contains any escape symbol or tag for preformatted text + //or if we are in an esacpe sequence already or if we are in a preformated text + //if that's the case the program will continue further below + //(see code for [= and =] and
 and 
) [MN] + if((result.indexOf("[=")<0)&&(result.indexOf("=]")<0)&&(!escapeSpan)&& + (result.indexOf("<pre>")<0)&&(result.indexOf("</pre>")<0)&&(!preformattedSpan)){ + // format lines if (result.startsWith(" ")) result = "" + result + ""; if (result.startsWith("----")) result = "
"; - - // citings contributed by [MN] - if(result.startsWith(":")){ - String head = ""; - String tail = ""; - while(result.startsWith(":")){ - head = head + "
"; - tail = tail + "
"; - result = result.substring(1); - } - result = head + result + tail; - } - // end contrib [MN] - - // format headers - if ((p0 = result.indexOf("====")) >= 0) { - p1 = result.indexOf("====", p0 + 4); - if (p1 >= 0) result = result.substring(0, p0) + "

" + - result.substring(p0 + 4, p1) + "

" + - result.substring(p1 + 4); + + // citings contributed by [MN] + if(result.startsWith(":")){ + String head = ""; + String tail = ""; + while(result.startsWith(":")){ + head = head + "
"; + tail = tail + "
"; + result = result.substring(1); + } + result = head + result + tail; + } + // end contrib [MN] + + // format headers + if ((p0 = result.indexOf("====")) >= 0) { + p1 = result.indexOf("====", p0 + 4); + if (p1 >= 0) result = result.substring(0, p0) + "

" + + result.substring(p0 + 4, p1) + "

" + + result.substring(p1 + 4); + } + if ((p0 = result.indexOf("===")) >= 0) { + p1 = result.indexOf("===", p0 + 3); + if (p1 >= 0) result = result.substring(0, p0) + "

" + + result.substring(p0 + 3, p1) + "

" + + result.substring(p1 + 3); + } + if ((p0 = result.indexOf("==")) >= 0) { + p1 = result.indexOf("==", p0 + 2); + if (p1 >= 0) result = result.substring(0, p0) + "

" + + result.substring(p0 + 2, p1) + "

" + + result.substring(p1 + 2); + } + + if ((p0 = result.indexOf("'''''")) >= 0) { + p1 = result.indexOf("'''''", p0 + 5); + if (p1 >= 0) result = result.substring(0, p0) + "" + + result.substring(p0 + 5, p1) + "" + + result.substring(p1 + 5); + } + if ((p0 = result.indexOf("'''")) >= 0) { + p1 = result.indexOf("'''", p0 + 3); + if (p1 >= 0) result = result.substring(0, p0) + "" + + result.substring(p0 + 3, p1) + "" + + result.substring(p1 + 3); + } + if ((p0 = result.indexOf("''")) >= 0) { + p1 = result.indexOf("''", p0 + 2); + if (p1 >= 0) result = result.substring(0, p0) + "" + + result.substring(p0 + 2, p1) + "" + + result.substring(p1 + 2); + } + + //* unorderd Lists contributed by [AS] + //** Sublist + if(result.startsWith(ListLevel + "*")){ //more stars + p0 = result.indexOf(ListLevel); + p1 = result.length(); + result = ""; + i--; } - if ((p0 = result.indexOf("===")) >= 0) { - p1 = result.indexOf("===", p0 + 3); - if (p1 >= 0) result = result.substring(0, p0) + "

" + - result.substring(p0 + 3, p1) + "

" + - result.substring(p1 + 3); + ListLevel = ListLevel.substring(0,i); + p0 = ListLevel.length(); + p1 = result.length(); + + if(ListLevel.length() > 0){ + result = tmp + + "
  • " + + result.substring(p0, p1) + + "
  • "; + }else{ + result = tmp + result.substring(p0, p1); } - if ((p0 = result.indexOf("==")) >= 0) { - p1 = result.indexOf("==", p0 + 2); - if (p1 >= 0) result = result.substring(0, p0) + "

    " + - result.substring(p0 + 2, p1) + "

    " + - result.substring(p1 + 2); + } + + + //# sorted Lists contributed by [AS] + //## Sublist + if(result.startsWith(numListLevel + "#")){ //more # + p0 = result.indexOf(numListLevel); + p1 = result.length(); + result = "
      " + serverCore.crlfString + + "
    1. " + + result.substring(numListLevel.length() + 1, p1) + + "
    2. "; + numListLevel += "#"; + }else if(numListLevel.length() > 0 && result.startsWith(numListLevel)){ //equal number of # + p0 = result.indexOf(numListLevel); + p1 = result.length(); + result = "
    3. " + + result.substring(numListLevel.length(), p1) + + "
    4. "; + }else if(numListLevel.length() > 0){ //less # + int i = numListLevel.length(); + String tmp = ""; + + while(! result.startsWith(numListLevel.substring(0,i)) ){ + tmp += "
    "; + i--; } + numListLevel = numListLevel.substring(0,i); + p0 = numListLevel.length(); + p1 = result.length(); + + if(numListLevel.length() > 0){ + result = tmp + + "
  • " + + result.substring(p0, p1) + + "
  • "; + }else{ + result = tmp + result.substring(p0, p1); + } + } + // end contrib [AS] - if ((p0 = result.indexOf("'''''")) >= 0) { - p1 = result.indexOf("'''''", p0 + 5); - if (p1 >= 0) result = result.substring(0, p0) + "" + - result.substring(p0 + 5, p1) + "" + - result.substring(p1 + 5); + //* definition Lists contributed by [MN] based on unordered list code by [AS] + if(result.startsWith(defListLevel + ";")){ //more semicolons + String dt = ""; + String dd = ""; + p0 = result.indexOf(defListLevel); + p1 = result.length(); + String resultCopy = result.substring(defListLevel.length() + 1, p1); + if((p0 = resultCopy.indexOf(":")) > 0){ + dt = resultCopy.substring(0,p0); + dd = resultCopy.substring(p0+1); + result = "
    " + "
    " + dt + "
    " + "
    " + dd; + defList = true; } - if ((p0 = result.indexOf("'''")) >= 0) { - p1 = result.indexOf("'''", p0 + 3); - if (p1 >= 0) result = result.substring(0, p0) + "" + - result.substring(p0 + 3, p1) + "" + - result.substring(p1 + 3); + defListLevel += ";"; + }else if(defListLevel.length() > 0 && result.startsWith(defListLevel)){ //equal number of semicolons + String dt = ""; + String dd = ""; + p0 = result.indexOf(defListLevel); + p1 = result.length(); + String resultCopy = result.substring(defListLevel.length(), p1); + if((p0 = resultCopy.indexOf(":")) > 0){ + dt = resultCopy.substring(0,p0); + dd = resultCopy.substring(p0+1); + result = "
    " + dt + "
    " + "
    " + dd; + defList = true; } - if ((p0 = result.indexOf("''")) >= 0) { - p1 = result.indexOf("''", p0 + 2); - if (p1 >= 0) result = result.substring(0, p0) + "" + - result.substring(p0 + 2, p1) + "" + - result.substring(p1 + 2); + }else if(defListLevel.length() > 0){ //less semicolons + String dt = ""; + String dd = ""; + int i = defListLevel.length(); + String tmp = ""; + while(! result.startsWith(defListLevel.substring(0,i)) ){ + tmp += "
    "; + i--; } - - - //* unorderd Lists contributed by [AS] - //** Sublist - if(result.startsWith(ListLevel + "*")){ //more stars - p0 = result.indexOf(ListLevel); - p1 = result.length(); - result = ""; - i--; - } - ListLevel = ListLevel.substring(0,i); - p0 = ListLevel.length(); - p1 = result.length(); - - if(ListLevel.length() > 0){ - result = tmp + - "
  • " + - result.substring(p0, p1) + - "
  • "; - }else{ - result = tmp + result.substring(p0, p1); - } - } - - - //# sorted Lists contributed by [AS] - //## Sublist - if(result.startsWith(numListLevel + "#")){ //more # - p0 = result.indexOf(numListLevel); - p1 = result.length(); - result = "
      " + serverCore.crlfString + - "
    1. " + - result.substring(numListLevel.length() + 1, p1) + - "
    2. "; - numListLevel += "#"; - }else if(numListLevel.length() > 0 && result.startsWith(numListLevel)){ //equal number of # - p0 = result.indexOf(numListLevel); - p1 = result.length(); - result = "
    3. " + - result.substring(numListLevel.length(), p1) + - "
    4. "; - }else if(numListLevel.length() > 0){ //less # - int i = numListLevel.length(); - String tmp = ""; - - while(! result.startsWith(numListLevel.substring(0,i)) ){ - tmp += "
    "; - i--; - } - numListLevel = numListLevel.substring(0,i); - p0 = numListLevel.length(); - p1 = result.length(); - - if(numListLevel.length() > 0){ - result = tmp + - "
  • " + - result.substring(p0, p1) + - "
  • "; - }else{ - result = tmp + result.substring(p0, p1); - } - } - // end contrib [AS] - - //* definition Lists contributed by [MN] based on unordered list code by [AS] - if(result.startsWith(defListLevel + ";")){ //more semicolons - String dt = ""; - String dd = ""; - p0 = result.indexOf(defListLevel); - p1 = result.length(); - String resultCopy = result.substring(defListLevel.length() + 1, p1); - if((p0 = resultCopy.indexOf(":")) > 0){ - dt = resultCopy.substring(0,p0); - dd = resultCopy.substring(p0+1); - result = "
    " + "
    " + dt + "
    " + "
    " + dd; - defList = true; - } - defListLevel += ";"; - }else if(defListLevel.length() > 0 && result.startsWith(defListLevel)){ //equal number of semicolons - String dt = ""; - String dd = ""; - p0 = result.indexOf(defListLevel); - p1 = result.length(); - String resultCopy = result.substring(defListLevel.length(), p1); - if((p0 = resultCopy.indexOf(":")) > 0){ - dt = resultCopy.substring(0,p0); - dd = resultCopy.substring(p0+1); - result = "
    " + dt + "
    " + "
    " + dd; - defList = true; - } - }else if(defListLevel.length() > 0){ //less semicolons - String dt = ""; - String dd = ""; - int i = defListLevel.length(); - String tmp = ""; - while(! result.startsWith(defListLevel.substring(0,i)) ){ - tmp += "
    "; - i--; - } - defListLevel = defListLevel.substring(0,i); - p0 = defListLevel.length(); - p1 = result.length(); - if(defListLevel.length() > 0){ - String resultCopy = result.substring(p0, p1); - if((p0 = resultCopy.indexOf(":")) > 0){ - dt = resultCopy.substring(0,p0); - dd = resultCopy.substring(p0+1); - result = tmp + "
    " + dt + "
    " + "
    " + dd; - defList = true; - } - - }else{ - result = tmp + result.substring(p0, p1); - } - } - // end contrib [MN] + defListLevel = defListLevel.substring(0,i); + p0 = defListLevel.length(); + p1 = result.length(); + if(defListLevel.length() > 0){ + String resultCopy = result.substring(p0, p1); + if((p0 = resultCopy.indexOf(":")) > 0){ + dt = resultCopy.substring(0,p0); + dd = resultCopy.substring(p0+1); + result = tmp + "
    " + dt + "
    " + "
    " + dd; + defList = true; + } + + }else{ + result = tmp + result.substring(p0, p1); + } + } + // end contrib [MN] // create links @@ -348,8 +465,7 @@ public class wikiCode { kv = kl.substring(p + 1); kl = kl.substring(0, p); - // if there are 2 arguments, write them into ALIGN and - // ALT + // if there are 2 arguments, write them into ALIGN and ALT if ((p = kv.indexOf("|")) > 0) { align = " align=\"" + kv.substring(0, p) + "\""; alt = " alt=\"" + kv.substring(p + 1) + "\""; @@ -386,9 +502,8 @@ public class wikiCode { else result = result.substring(0, p0) + "" + kv + "" + result.substring(p1 + 2); } - } - + // external links while ((p0 = result.indexOf("[")) >= 0) { p1 = result.indexOf("]", p0 + 1); @@ -411,148 +526,116 @@ public class wikiCode { kl = "http://" + yacyCore.seedDB.mySeed.getAddress().trim() + "/" + kl; } result = result.substring(0, p0) + "" + kv + "" + result.substring(p1 + 1); - } - } - - //escape code ([=...=]) contributed by [MN] - //both [= and =] in the same line - else if(((p0 = result.indexOf("[="))>=0)&&((p1 = result.indexOf("=]"))>0)&&(!(preformatted))){ - //if(p0 < p1){ - String escapeText = result.substring(p0+2,p1); - - //BUGS TO BE FIXED: [=[=text=]=] does not work properly: - //[=[= undx=]x=] should resolve as [= undx=]x, but resolves as [= undxx=] - //ALSO [=[= und =]=] [= und =] leads to an exception - // - //handlicg cases where the text inside [= and =] also contains - //[= and =]. Example: [=[=...=]=] - //if(escapeText) - - //else{ - result = transformLine(result.substring(0,p0).replaceAll("!esc!", "!esc!!")+"!esc!txt!"+result.substring(p1+2).replaceAll("!esc!", "!esc!!"), switchboard); - result = result.replaceAll("!esc!txt!", escapeText); - result = result.replaceAll("!esc!!", "!esc!"); - //} - //} - } - - //start [= - else if(((p0 = result.indexOf("[="))>=0)&&(!escapeSpan)&&(!preformatted)){ - escape = true; //prevent surplus line breaks - escaped = true; //prevents
     being parsed
    -	    String bq = "";   //gets filled with 
    s as needed - String escapeText = result.substring(p0+2); - //taking care of indented lines - while(result.substring(escindented,p0).startsWith(":")){ - escindented++; - bq = bq + "
    "; - } - result = transformLine(result.substring(escindented,p0).replaceAll("!esc!", "!esc!!")+"!esc!txt!", switchboard); - result = bq + result.replaceAll("!esc!txt!", escapeText); - escape = false; - escapeSpan = true; - } - - //end =] - else if(((p0 = result.indexOf("=]"))>=0)&&(escapeSpan)&&(!preformatted)){ - escapeSpan = false; - String bq = ""; //gets filled with
    s as neede - String escapeText = result.substring(0,p0); - //taking care of indented lines - while(escindented > 0){ - bq = bq + "
    "; - escindented--; - } - result = transformLine("!esc!txt!"+result.substring(p0+2).replaceAll("!esc!", "!esc!!"), switchboard); - result = result.replaceAll("!esc!txt!", escapeText) + bq; - escaped = false; - } - //end contrib [MN] - - //preformatted code (
    ...
    ) contributed by [MN] - //implementation very similar to escape code (see above) - //both
     and 
    in the same line - else if(((p0 = result.indexOf("<pre>"))>=0)&&((p1 = result.indexOf("</pre>"))>0)&&(!(escaped))){ - //if(p0 < p1){ - String preformattedText = "
    "+result.substring(p0+11,p1)+"
    "; - result = transformLine(result.substring(0,p0).replaceAll("!pre!", "!pre!!")+"!pre!txt!"+result.substring(p1+12).replaceAll("!pre!", "!pre!!"), switchboard); - result = result.replaceAll("!pre!txt!", preformattedText); - result = result.replaceAll("!pre!!", "!pre!"); - //} - } - - //start
    -	else if(((p0 = result.indexOf("<pre>"))>=0)&&(!preformattedSpan)&&(!escaped)){
    -	    preformatted = true;    //prevent surplus line breaks
    -	    String bq ="";  //gets filled with 
    s as needed - String preformattedText = "
    "+result.substring(p0+11);
    -	    //taking care of indented lines
    -	    while(result.substring(preindented,p0).startsWith(":")){
    -	        preindented++;
    -		bq = bq + "
    "; - } - result = transformLine(result.substring(preindented,p0).replaceAll("!pre!", "!pre!!")+"!pre!txt!", switchboard); - result = bq + result.replaceAll("!pre!txt!", preformattedText); - result = result.replaceAll("!pre!!", "!pre!"); - preformattedSpan = true; - } - - //end
    - else if(((p0 = result.indexOf("</pre>"))>=0)&&(preformattedSpan)&&(!escaped)){ - preformattedSpan = false; - String bq = ""; //gets filled with
    s as needed - String preformattedText = result.substring(0,p0)+"
    "; + } + } + + //escape code ([=...=]) contributed by [MN] + //both [= and =] in the same line + else if(((p0 = result.indexOf("[="))>=0)&&((p1 = result.indexOf("=]"))>0)&&(!(preformatted))){ + //if(p0 < p1){ + String escapeText = result.substring(p0+2,p1); + + //BUGS TO BE FIXED: [=[=text=]=] does not work properly: + //[=[= undx=]x=] should resolve as [= undx=]x, but resolves as [= undxx=] + //ALSO [=[= und =]=] [= und =] leads to an exception + // + //handlicg cases where the text inside [= and =] also contains + //[= and =]. Example: [=[=...=]=] + //if(escapeText) + + //else{ + result = transformLine(result.substring(0,p0).replaceAll("!esc!", "!esc!!")+"!esc!txt!"+result.substring(p1+2).replaceAll("!esc!", "!esc!!"), switchboard); + result = result.replaceAll("!esc!txt!", escapeText); + result = result.replaceAll("!esc!!", "!esc!"); + //} + //} + } + + //start [= + else if(((p0 = result.indexOf("[="))>=0)&&(!escapeSpan)&&(!preformatted)){ + escape = true; //prevent surplus line breaks + escaped = true; //prevents
     being parsed
    +        String bq = "";   //gets filled with 
    s as needed + String escapeText = result.substring(p0+2); + //taking care of indented lines + while(result.substring(escindented,p0).startsWith(":")){ + escindented++; + bq = bq + "
    "; + } + result = transformLine(result.substring(escindented,p0).replaceAll("!esc!", "!esc!!")+"!esc!txt!", switchboard); + result = bq + result.replaceAll("!esc!txt!", escapeText); + escape = false; + escapeSpan = true; + } + + //end =] + else if(((p0 = result.indexOf("=]"))>=0)&&(escapeSpan)&&(!preformatted)){ + escapeSpan = false; + String bq = ""; //gets filled with
    s as neede + String escapeText = result.substring(0,p0); + //taking care of indented lines + while(escindented > 0){ + bq = bq + "
    "; + escindented--; + } + result = transformLine("!esc!txt!"+result.substring(p0+2).replaceAll("!esc!", "!esc!!"), switchboard); + result = result.replaceAll("!esc!txt!", escapeText) + bq; + escaped = false; + } + //end contrib [MN] + + //preformatted code (
    ...
    ) contributed by [MN] + //implementation very similar to escape code (see above) + //both
     and 
    in the same line + else if(((p0 = result.indexOf("<pre>"))>=0)&&((p1 = result.indexOf("</pre>"))>0)&&(!(escaped))){ + //if(p0 < p1){ + String preformattedText = "
    "+result.substring(p0+11,p1)+"
    "; + result = transformLine(result.substring(0,p0).replaceAll("!pre!", "!pre!!")+"!pre!txt!"+result.substring(p1+12).replaceAll("!pre!", "!pre!!"), switchboard); + result = result.replaceAll("!pre!txt!", preformattedText); + result = result.replaceAll("!pre!!", "!pre!"); + //} + } + + //start
    +    else if(((p0 = result.indexOf("<pre>"))>=0)&&(!preformattedSpan)&&(!escaped)){
    +        preformatted = true;    //prevent surplus line breaks
    +        String bq ="";  //gets filled with 
    s as needed + String preformattedText = "
    "+result.substring(p0+11);
    +        //taking care of indented lines
    +        while(result.substring(preindented,p0).startsWith(":")){
    +            preindented++;
    +            bq = bq + "
    "; + } + result = transformLine(result.substring(preindented,p0).replaceAll("!pre!", "!pre!!")+"!pre!txt!", switchboard); + result = bq + result.replaceAll("!pre!txt!", preformattedText); + result = result.replaceAll("!pre!!", "!pre!"); + preformattedSpan = true; + } + + //end
    + else if(((p0 = result.indexOf("</pre>"))>=0)&&(preformattedSpan)&&(!escaped)){ + preformattedSpan = false; + String bq = ""; //gets filled with
    s as needed + String preformattedText = result.substring(0,p0)+"
    "; //taking care of indented lines - while (preindented > 0){ - bq = bq + ""; - preindented--; - } - result = transformLine("!pre!txt!"+result.substring(p0+12).replaceAll("!pre!", "!pre!!"), switchboard); - result = result.replaceAll("!pre!txt!", preformattedText) + bq; - result = result.replaceAll("!pre!!", "!pre!"); - preformatted = false; - } - //end contrib [MN] - - if ((result.endsWith(""))||(defList)||(escape)||(preformatted)) return result; + while (preindented > 0){ + bq = bq + ""; + preindented--; + } + result = transformLine("!pre!txt!"+result.substring(p0+12).replaceAll("!pre!", "!pre!!"), switchboard); + result = result.replaceAll("!pre!txt!", preformattedText) + bq; + result = result.replaceAll("!pre!!", "!pre!"); + preformatted = false; + } + //end contrib [MN] + + if ((result.endsWith(""))||(defList)||(escape)||(preformatted)) return result; return result + "
    "; } + /* - what we need (have): - - == New section == - === Subsection === - ==== Sub-subsection ==== - link colours: existent=green, non-existent=red - ---- - [[wikipedia FAQ|answers]] (first element is wiki page name, second is link print name) - [http://www.nupedia.com Nupedia] (external link) - [http://www.nupedia.com] (un-named external link) - ''Emphasize'', '''strongly''', '''''very strongly''''' (italics, bold, bold-italics) - - * Lists are easy to do: - ** start every line with a star - *** more stars means deeper levels - # Numbered lists are also good - ## very organized - ## easy to follow - ; Definition list : list of definitions - ; item : the item's definition - : A colon indents a line or paragraph. - A manual newline starts a new paragraph. - - A picture: [[Image:Wiki.png]] - [[Image:Wiki.png|right|jigsaw globe]] (floating right-side with caption) - - - what we got in addition to that: - - [= escape characters =] -
     preformatted text 
    - - what would be nice in addition to that: + nice to have: || tables - */ }