You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jspwiki.apache.org by ju...@apache.org on 2022/07/12 21:03:38 UTC

[jspwiki] 05/25: format class

This is an automated email from the ASF dual-hosted git repository.

juanpablo pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/jspwiki.git

commit 903be0fd8bbb64e83c4eec95933186848a22e42e
Author: Juan Pablo Santos Rodríguez <ju...@gmail.com>
AuthorDate: Tue May 3 23:01:40 2022 +0200

    format class
---
 .../apache/wiki/parser/JSPWikiMarkupParser.java    | 1624 +++++++-------------
 1 file changed, 530 insertions(+), 1094 deletions(-)

diff --git a/jspwiki-main/src/main/java/org/apache/wiki/parser/JSPWikiMarkupParser.java b/jspwiki-main/src/main/java/org/apache/wiki/parser/JSPWikiMarkupParser.java
index e5e0b425a..75de9478a 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/parser/JSPWikiMarkupParser.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/parser/JSPWikiMarkupParser.java
@@ -73,9 +73,8 @@ import java.util.ResourceBundle;
 import java.util.Stack;
 
 /**
- *  Parses JSPWiki-style markup into a WikiDocument DOM tree.  This class is the
- *  heart and soul of JSPWiki : make sure you test properly anything that is added,
- *  or else it breaks down horribly.
+ * Parses JSPWiki-style markup into a WikiDocument DOM tree.  This class is the heart and soul of JSPWiki : make
+ * sure you test properly anything that is added, or else it breaks down horribly.
  *
  *  @since  2.4
  */
@@ -104,58 +103,58 @@ public class JSPWikiMarkupParser extends MarkupParser {
     private boolean        m_isPreBlock;
 
     /** Contains style information, in multiple forms. */
-    private final Stack<Boolean> m_styleStack   = new Stack<>();
+    private final Stack< Boolean > m_styleStack = new Stack<>();
 
      // general list handling
-    private int            m_genlistlevel;
-    private final StringBuilder  m_genlistBulletBuffer = new StringBuilder(10);  // stores the # and * pattern
-    private final boolean        m_allowPHPWikiStyleLists = true;
+    private int m_genlistlevel;
+    private final StringBuilder m_genlistBulletBuffer = new StringBuilder( 10 );  // stores the # and * pattern
+    private final boolean m_allowPHPWikiStyleLists = true;
 
-    private boolean        m_isOpenParagraph;
+    private boolean m_isOpenParagraph;
 
     /** Parser for extended link functionality. */
-    private final LinkParser     m_linkParser = new LinkParser();
+    private final LinkParser m_linkParser = new LinkParser();
 
     /** Keeps track of any plain text that gets put in the Text nodes */
-    private StringBuilder  m_plainTextBuf = new StringBuilder(20);
+    private StringBuilder m_plainTextBuf = new StringBuilder( 20 );
 
-    private Element        m_currentElement;
+    private Element m_currentElement;
 
     /** Keep track of duplicate header names.  */
-    private final Map<String, Integer>   m_titleSectionCounter = new HashMap<>();
+    private final Map< String, Integer > m_titleSectionCounter = new HashMap<>();
 
     /** If true, then considers CamelCase links as well. */
-    private boolean                m_camelCaseLinks;
+    private boolean m_camelCaseLinks;
 
     /** If true, then generate special output for wysiwyg editing in certain cases */
-    private boolean                m_wysiwygEditorMode;
+    private boolean m_wysiwygEditorMode;
 
     /** If true, consider URIs that have no brackets as well. */
     // FIXME: Currently reserved, but not used.
-    private boolean                m_plainUris;
+    private boolean m_plainUris;
 
     /** If true, all outward links use a small link image. */
-    private boolean                m_useOutlinkImage     = true;
+    private boolean m_useOutlinkImage = true;
 
-    private boolean                m_useAttachmentImage  = true;
+    private boolean m_useAttachmentImage = true;
 
     /** If true, allows raw HTML. */
-    private boolean                m_allowHTML;
+    private boolean m_allowHTML;
 
-    private boolean                m_useRelNofollow;
+    private boolean m_useRelNofollow;
 
-    private final PatternCompiler        m_compiler = new Perl5Compiler();
+    private final PatternCompiler m_compiler = new Perl5Compiler();
 
     static final String WIKIWORD_REGEX = "(^|[[:^alnum:]]+)([[:upper:]]+[[:lower:]]+[[:upper:]]+[[:alnum:]]*|(http://|https://|mailto:)([A-Za-z0-9_/\\.\\+\\?\\#\\-\\@=&;~%]+))";
 
-    private final PatternMatcher         m_camelCaseMatcher = new Perl5Matcher();
-    private Pattern                m_camelCasePattern;
+    private final PatternMatcher m_camelCaseMatcher = new Perl5Matcher();
+    private Pattern m_camelCasePattern;
 
-    private int                    m_rowNum              = 1;
+    private int m_rowNum = 1;
 
-    private Heading                m_lastHeading;
+    private Heading m_lastHeading;
 
-    private static final String CAMELCASE_PATTERN     = "JSPWikiMarkupParser.camelCasePattern";
+    private static final String CAMELCASE_PATTERN = "JSPWikiMarkupParser.camelCasePattern";
 
     /**
      *  Creates a markup parser.
@@ -163,8 +162,7 @@ public class JSPWikiMarkupParser extends MarkupParser {
      *  @param context The WikiContext which controls the parsing
      *  @param in Where the data is read from.
      */
-    public JSPWikiMarkupParser( final Context context, final Reader in )
-    {
+    public JSPWikiMarkupParser( final Context context, final Reader in ) {
         super( context, in );
         initialize();
     }
@@ -236,7 +234,7 @@ public class JSPWikiMarkupParser extends MarkupParser {
      *
      * @param param A Heading object.
      */
-    protected void callHeadingListenerChain( final Heading param ) {
+    private void callHeadingListenerChain( final Heading param ) {
         for( final HeadingListener h : m_headingListenerChain ) {
             h.headingAdded( m_context, param );
         }
@@ -253,38 +251,31 @@ public class JSPWikiMarkupParser extends MarkupParser {
      *  @return An A element.
      *  @since 2.4.78
      */
-    protected Element createAnchor( final int type, final String link, String text, String section)
-    {
+    private Element createAnchor( final int type, final String link, String text, String section ) {
         text = escapeHTMLEntities( text );
         section = escapeHTMLEntities( section );
-        final Element el = new Element("a");
-        el.setAttribute("class",CLASS_TYPES[type]);
-        el.setAttribute("href",link+section);
-        el.addContent(text);
+        final Element el = new Element( "a" );
+        el.setAttribute( "class", CLASS_TYPES[ type ] );
+        el.setAttribute( "href", link + section );
+        el.addContent( text );
         return el;
     }
 
-    private Element makeLink( int type, final String link, String text, String section, final Iterator< Attribute > attributes )
-    {
+    private Element makeLink( int type, final String link, String text, String section, final Iterator< Attribute > attributes ) {
         Element el = null;
-
-        if( text == null ) text = link;
-
+        if( text == null ) {
+            text = link;
+        }
         text = callMutatorChain( m_linkMutators, text );
-
         section = (section != null) ? ("#"+section) : "";
 
-        // Make sure we make a link name that can be accepted
-        // as a valid URL.
-
-        if( link.isEmpty() )
-        {
+        // Make sure we make a link name that can be accepted  as a valid URL.
+        if( link.isEmpty() ) {
             type = EMPTY;
         }
         final ResourceBundle rb = Preferences.getBundle( m_context, InternationalizationManager.CORE_BUNDLE );
 
-        switch(type)
-        {
+        switch( type ) {
             case READ:
                 el = createAnchor( READ, m_context.getURL( ContextEnum.PAGE_VIEW.getRequestContext(), link), text, section );
                 break;
@@ -292,60 +283,53 @@ public class JSPWikiMarkupParser extends MarkupParser {
             case EDIT:
                 el = createAnchor( EDIT, m_context.getURL( ContextEnum.PAGE_EDIT.getRequestContext(),link), text, "" );
                 el.setAttribute("title", MessageFormat.format( rb.getString( "markupparser.link.create" ), link ) );
-
                 break;
 
             case EMPTY:
                 el = new Element("u").addContent(text);
                 break;
 
-                //
-                //  These two are for local references - footnotes and
-                //  references to footnotes.
-                //  We embed the page name (or whatever WikiContext gives us)
-                //  to make sure the links are unique across Wiki.
-                //
+            // These two are for local references - footnotes and references to footnotes.
+            // We embed the page name (or whatever WikiContext gives us) to make sure the links are unique across Wiki.
             case LOCALREF:
                 el = createAnchor( LOCALREF, "#ref-"+m_context.getName()+"-"+link, "["+text+"]", "" );
                 break;
 
             case LOCAL:
-                el = new Element("a").setAttribute("class",CLASS_FOOTNOTE);
-                el.setAttribute("name", "ref-"+m_context.getName()+"-"+link.substring(1));
-                el.addContent("["+text+"]");
+                el = new Element( "a" ).setAttribute( "class", CLASS_FOOTNOTE );
+                el.setAttribute( "name", "ref-" + m_context.getName() + "-" + link.substring( 1 ) );
+                el.addContent( "[" + text + "]" );
                 break;
 
-                //
-                //  With the image, external and interwiki types we need to
-                //  make sure nobody can put in Javascript or something else
-                //  annoying into the links themselves.  We do this by preventing
-                //  a haxor from stopping the link name short with quotes in
-                //  fillBuffer().
-                //
+                //  With the image, external and interwiki types we need to make sure nobody can put in Javascript or
+                //  something else annoying into the links themselves.  We do this by preventing a haxor from stopping
+                //  the link name short with quotes in fillBuffer().
             case IMAGE:
-                el = new Element("img").setAttribute("class","inline");
-                el.setAttribute("src",link);
-                el.setAttribute("alt",text);
+                el = new Element( "img" ).setAttribute( "class", "inline" );
+                el.setAttribute( "src", link );
+                el.setAttribute( "alt", text );
                 break;
 
             case IMAGELINK:
-                el = new Element("img").setAttribute("class","inline");
-                el.setAttribute("src",link);
-                el.setAttribute("alt",text);
-                el = createAnchor(IMAGELINK,text,"","").addContent(el);
+                el = new Element( "img" ).setAttribute( "class", "inline" );
+                el.setAttribute( "src", link );
+                el.setAttribute( "alt", text );
+                el = createAnchor( IMAGELINK, text, "", "" ).addContent( el );
                 break;
 
             case IMAGEWIKILINK:
                 final String pagelink = m_context.getURL( ContextEnum.PAGE_VIEW.getRequestContext(), text );
-                el = new Element("img").setAttribute("class","inline");
-                el.setAttribute("src",link);
-                el.setAttribute("alt",text);
-                el = createAnchor(IMAGEWIKILINK,pagelink,"","").addContent(el);
+                el = new Element( "img" ).setAttribute( "class", "inline" );
+                el.setAttribute( "src", link );
+                el.setAttribute( "alt", text );
+                el = createAnchor( IMAGEWIKILINK, pagelink, "", "" ).addContent( el );
                 break;
 
             case EXTERNAL:
                 el = createAnchor( EXTERNAL, link, text, section );
-                if( m_useRelNofollow ) el.setAttribute("rel","nofollow");
+                if( m_useRelNofollow ) {
+                    el.setAttribute( "rel", "nofollow" );
+                }
                 break;
 
             case INTERWIKI:
@@ -357,25 +341,21 @@ public class JSPWikiMarkupParser extends MarkupParser {
                 final String infolink = m_context.getURL( ContextEnum.PAGE_INFO.getRequestContext(), link );
                 final String imglink = m_context.getURL( ContextEnum.PAGE_NONE.getRequestContext(), "images/attachment_small.png" );
                 el = createAnchor( ATTACHMENT, attlink, text, "" );
-
                 if(  m_engine.getManager( AttachmentManager.class ).forceDownload( attlink ) ) {
                     el.setAttribute("download", "");
                 }
 
-                pushElement(el);
-                popElement(el.getName());
+                pushElement( el );
+                popElement( el.getName() );
 
-                if( m_useAttachmentImage )
-                {
-                    el = new Element("img").setAttribute("src",imglink);
-                    el.setAttribute("border","0");
-                    el.setAttribute("alt","(info)");
+                if( m_useAttachmentImage ) {
+                    el = new Element( "img" ).setAttribute( "src", imglink );
+                    el.setAttribute( "border", "0" );
+                    el.setAttribute( "alt", "(info)" );
 
-                    el = new Element("a").setAttribute("href",infolink).addContent(el);
-                    el.setAttribute("class","infolink");
-                }
-                else
-                {
+                    el = new Element( "a" ).setAttribute( "href", infolink ).addContent( el );
+                    el.setAttribute( "class", "infolink" );
+                } else {
                     el = null;
                 }
                 break;
@@ -384,20 +364,16 @@ public class JSPWikiMarkupParser extends MarkupParser {
                 break;
         }
 
-        if( el != null && attributes != null )
-        {
-            while( attributes.hasNext() )
-            {
+        if( el != null && attributes != null ) {
+            while( attributes.hasNext() ) {
                 final Attribute attr = attributes.next();
-                if( attr != null )
-                {
-                    el.setAttribute(attr);
+                if( attr != null ) {
+                    el.setAttribute( attr );
                 }
             }
         }
 
-        if( el != null )
-        {
+        if( el != null ) {
             flushPlainText();
             m_currentElement.addContent( el );
         }
@@ -405,7 +381,7 @@ public class JSPWikiMarkupParser extends MarkupParser {
     }
 
     /**
-     *  These are all of the HTML 4.01 block-level elements.
+     *  These are all the HTML 4.01 block-level elements.
      */
     private static final String[] BLOCK_ELEMENTS = {
         "address", "blockquote", "div", "dl", "fieldset", "form",
@@ -413,87 +389,54 @@ public class JSPWikiMarkupParser extends MarkupParser {
         "hr", "noscript", "ol", "p", "pre", "table", "ul"
     };
 
-    private static boolean isBlockLevel( final String name )
-    {
+    private static boolean isBlockLevel( final String name ) {
         return Arrays.binarySearch( BLOCK_ELEMENTS, name ) >= 0;
     }
 
     /**
-     *  This method peeks ahead in the stream until EOL and returns the result.
-     *  It will keep the buffers untouched.
+     *  This method peeks ahead in the stream until EOL and returns the result. It will keep the buffers untouched.
      *
      *  @return The string from the current position to the end of line.
      */
-
     // FIXME: Always returns an empty line, even if the stream is full.
-    private String peekAheadLine()
-        throws IOException
-    {
+    private String peekAheadLine() throws IOException {
         final String s = readUntilEOL().toString();
-
-        if( s.length() > PUSHBACK_BUFFER_SIZE )
-        {
-            log.warn("Line is longer than maximum allowed size ("+PUSHBACK_BUFFER_SIZE+" characters.  Attempting to recover...");
-            pushBack( s.substring(0,PUSHBACK_BUFFER_SIZE-1) );
-        }
-        else
-        {
-            try
-            {
+        if( s.length() > PUSHBACK_BUFFER_SIZE ) {
+            log.warn( "Line is longer than maximum allowed size (" + PUSHBACK_BUFFER_SIZE + " characters.  Attempting to recover..." );
+            pushBack( s.substring( 0, PUSHBACK_BUFFER_SIZE - 1 ) );
+        } else {
+            try {
                 pushBack( s );
-            }
-            catch( final IOException e )
-            {
-                log.warn("Pushback failed: the line is probably too long.  Attempting to recover.");
+            } catch( final IOException e ) {
+                log.warn( "Pushback failed: the line is probably too long.  Attempting to recover." );
             }
         }
         return s;
     }
 
-    private int flushPlainText()
-    {
+    private int flushPlainText() {
         final int numChars = m_plainTextBuf.length();
-
-        if( numChars > 0 )
-        {
+        if( numChars > 0 ) {
             String buf;
 
-            if( !m_allowHTML )
-            {
+            if( !m_allowHTML ) {
                 buf = escapeHTMLEntities(m_plainTextBuf.toString());
-            }
-            else
-            {
+            } else {
                 buf = m_plainTextBuf.toString();
             }
-            //
-            //  We must first empty the buffer because the side effect of
-            //  calling makeCamelCaseLink() is to call this routine.
-            //
-
+            //  We must first empty the buffer because the side effect of calling makeCamelCaseLink() is to call this routine.
             m_plainTextBuf = new StringBuilder(20);
-
-            try
-            {
-                //
-                //  This is the heaviest part of parsing, and therefore we can
-                //  do some optimization here.
-                //
-                //  1) Only when the length of the buffer is big enough, we try to do the match
-                //
-
-                if( m_camelCaseLinks && !m_isEscaping && buf.length() > 3 )
-                {
-                    // System.out.println("Buffer="+buf);
-
-                    while( m_camelCaseMatcher.contains( buf, m_camelCasePattern ) )
-                    {
+            try {
+                // This is the heaviest part of parsing, and therefore we can do some optimization here.
+                // 1) Only when the length of the buffer is big enough, we try to do the match
+                if( m_camelCaseLinks && !m_isEscaping && buf.length() > 3 ) {
+                    while( m_camelCaseMatcher.contains( buf, m_camelCasePattern ) ) {
                         final MatchResult result = m_camelCaseMatcher.getMatch();
-
-                        final String firstPart = buf.substring(0,result.beginOffset(0));
-                        String prefix = result.group(1);
-
-                        if( prefix == null ) prefix = "";
+                        final String firstPart = buf.substring( 0, result.beginOffset( 0 ) );
+                        String prefix = result.group( 1 );
+                        if( prefix == null ) {
+                            prefix = "";
+                        }
 
                         final String camelCase = result.group(2);
                         final String protocol  = result.group(3);
@@ -501,74 +444,47 @@ public class JSPWikiMarkupParser extends MarkupParser {
                         buf              = buf.substring(result.endOffset(0));
 
                         m_currentElement.addContent( firstPart );
-
-                        //
                         //  Check if the user does not wish to do URL or WikiWord expansion
-                        //
-                        if( prefix.endsWith("~") || prefix.indexOf('[') != -1 )
-                        {
-                            if( prefix.endsWith("~") )
-                            {
-                                if( m_wysiwygEditorMode )
-                                {
+                        if( prefix.endsWith( "~" ) || prefix.indexOf( '[' ) != -1 ) {
+                            if( prefix.endsWith( "~" ) ) {
+                                if( m_wysiwygEditorMode ) {
                                     m_currentElement.addContent( "~" );
                                 }
-                                prefix = prefix.substring(0,prefix.length()-1);
-                            }
-                            if( camelCase != null )
-                            {
-                                m_currentElement.addContent( prefix+camelCase );
+                                prefix = prefix.substring( 0, prefix.length() - 1 );
                             }
-                            else if( protocol != null )
-                            {
-                                m_currentElement.addContent( prefix+uri );
+                            if( camelCase != null ) {
+                                m_currentElement.addContent( prefix + camelCase );
+                            } else if( protocol != null ) {
+                                m_currentElement.addContent( prefix + uri );
                             }
                             continue;
                         }
 
-                        //
-                        //  Fine, then let's check what kind of a link this was
-                        //  and emit the proper elements
-                        //
-                        if( protocol != null )
-                        {
-                            final char c = uri.charAt(uri.length()-1);
-                            if( c == '.' || c == ',' )
-                            {
-                                uri = uri.substring(0,uri.length()-1);
+                        // Fine, then let's check what kind of link this was and emit the proper elements
+                        if( protocol != null ) {
+                            final char c = uri.charAt( uri.length() - 1 );
+                            if( c == '.' || c == ',' ) {
+                                uri = uri.substring( 0, uri.length() - 1 );
                                 buf = c + buf;
                             }
                             // System.out.println("URI match "+uri);
                             m_currentElement.addContent( prefix );
                             makeDirectURILink( uri );
-                        }
-                        else
-                        {
+                        } else {
                             // System.out.println("Matched: '"+camelCase+"'");
                             // System.out.println("Split to '"+firstPart+"', and '"+buf+"'");
                             // System.out.println("prefix="+prefix);
                             m_currentElement.addContent( prefix );
-
                             makeCamelCaseLink( camelCase );
                         }
                     }
-
                     m_currentElement.addContent( buf );
-                }
-                else
-                {
-                    //
+                } else {
                     //  No camelcase asked for, just add the elements
-                    //
                     m_currentElement.addContent( buf );
                 }
-            }
-            catch( final IllegalDataException e )
-            {
-                //
-                // Sometimes it's possible that illegal XML chars is added to the data.
-                // Here we make sure it does not stop parsing.
-                //
+            } catch( final IllegalDataException e ) {
+                // Sometimes it's possible that illegal XML chars is added to the data. Here we make sure it does not stop parsing.
                 m_currentElement.addContent( makeError(cleanupSuspectData( e.getMessage() )) );
             }
         }
@@ -577,78 +493,48 @@ public class JSPWikiMarkupParser extends MarkupParser {
     }
 
     /**
-     *  Escapes XML entities in a HTML-compatible way (i.e. does not escape
-     *  entities that are already escaped).
+     *  Escapes XML entities in a HTML-compatible way (i.e. does not escape entities that are already escaped).
      *
      *  @param buf
      *  @return An escaped string.
      */
-    private String escapeHTMLEntities( final String buf)
-    {
+    private String escapeHTMLEntities( final String buf ) {
         final StringBuilder tmpBuf = new StringBuilder( buf.length() + 20 );
-
-        for( int i = 0; i < buf.length(); i++ )
-        {
+        for( int i = 0; i < buf.length(); i++ ) {
             final char ch = buf.charAt(i);
-
-            if( ch == '<' )
-            {
+            if( ch == '<' ) {
                 tmpBuf.append("&lt;");
-            }
-            else if( ch == '>' )
-            {
+            } else if( ch == '>' ) {
                 tmpBuf.append("&gt;");
-            }
-            else if( ch == '\"' )
-            {
+            } else if( ch == '\"' ) {
                 tmpBuf.append("&quot;");
-            }
-            else if( ch == '&' )
-            {
-                //
-                //  If the following is an XML entity reference (&#.*;) we'll
-                //  leave it as it is; otherwise we'll replace it with an &amp;
-                //
-
+            } else if( ch == '&' ) {
+                // If the following is an XML entity reference (&#.*;) we'll leave it as it is; otherwise we'll replace it with an &amp;
                 boolean isEntity = false;
                 final StringBuilder entityBuf = new StringBuilder();
-
-                if( i < buf.length() -1 )
-                {
-                    for( int j = i; j < buf.length(); j++ )
-                    {
-                        final char ch2 = buf.charAt(j);
-
-                        if( Character.isLetterOrDigit( ch2 ) || (ch2 == '#' && j == i+1) || ch2 == ';' || ch2 == '&' )
-                        {
+                if( i < buf.length() -1 ) {
+                    for( int j = i; j < buf.length(); j++ ) {
+                        final char ch2 = buf.charAt( j );
+                        if( Character.isLetterOrDigit( ch2 ) || (ch2 == '#' && j == i+1) || ch2 == ';' || ch2 == '&' ) {
                             entityBuf.append(ch2);
-
-                            if( ch2 == ';' )
-                            {
+                            if( ch2 == ';' ) {
                                 isEntity = true;
                                 break;
                             }
-                        }
-                        else
-                        {
+                        } else {
                             break;
                         }
                     }
                 }
 
-                if( isEntity )
-                {
+                if( isEntity ) {
                     tmpBuf.append( entityBuf );
                     i = i + entityBuf.length() - 1;
-                }
-                else
-                {
-                    tmpBuf.append("&amp;");
+                } else {
+                    tmpBuf.append( "&amp;" );
                 }
 
-            }
-            else
-            {
+            } else {
                 tmpBuf.append( ch );
             }
         }
@@ -656,8 +542,7 @@ public class JSPWikiMarkupParser extends MarkupParser {
         return tmpBuf.toString();
     }
 
-    private Element pushElement( final Element e )
-    {
+    private Element pushElement( final Element e ) {
         flushPlainText();
         m_currentElement.addContent( e );
         m_currentElement = e;
@@ -665,10 +550,8 @@ public class JSPWikiMarkupParser extends MarkupParser {
         return e;
     }
 
-    private Element addElement( final Content e )
-    {
-        if( e != null )
-        {
+    private Element addElement( final Content e ) {
+        if( e != null ) {
             flushPlainText();
             m_currentElement.addContent( e );
         }
@@ -687,73 +570,51 @@ public class JSPWikiMarkupParser extends MarkupParser {
      *  Goes through the current element stack and pops all elements until this
      *  element is found - this essentially "closes" and element.
      *
-     *  @param s
+     *  @param s element to be found.
      *  @return The new current element, or null, if there was no such element in the entire stack.
      */
-    private Element popElement( final String s )
-    {
+    private Element popElement( final String s ) {
         final int flushedBytes = flushPlainText();
-
         Element currEl = m_currentElement;
-
-        while( currEl.getParentElement() != null )
-        {
-            if( currEl.getName().equals(s) && !currEl.isRootElement() )
-            {
+        while( currEl.getParentElement() != null ) {
+            if( currEl.getName().equals( s ) && !currEl.isRootElement() ) {
                 m_currentElement = currEl.getParentElement();
 
-                //
                 //  Check if it's okay for this element to be empty.  Then we will
                 //  trick the JDOM generator into not generating an empty element,
                 //  by putting an empty string between the tags.  Yes, it's a kludge
                 //  but what'cha gonna do about it. :-)
-                //
-
-                if( flushedBytes == 0 && Arrays.binarySearch( EMPTY_ELEMENTS, s ) < 0 )
-                {
-                    currEl.addContent("");
+                if( flushedBytes == 0 && Arrays.binarySearch( EMPTY_ELEMENTS, s ) < 0 ) {
+                    currEl.addContent( "" );
                 }
-
                 return m_currentElement;
             }
-
             currEl = currEl.getParentElement();
         }
-
         return null;
     }
 
 
     /**
-     *  Reads the stream until it meets one of the specified
-     *  ending characters, or stream end.  The ending character will be left
-     *  in the stream.
+     * Reads the stream until it meets one of the specified ending characters, or stream end. The ending
+     * character will be left in the stream.
      */
-    private String readUntil( final String endChars )
-        throws IOException
-    {
+    private String readUntil( final String endChars ) throws IOException {
         final StringBuilder sb = new StringBuilder( 80 );
         int ch = nextToken();
-
-        while( ch != -1 )
-        {
-            if( ch == '\\' )
-            {
+        while( ch != -1 ) {
+            if( ch == '\\' ) {
                 ch = nextToken();
-                if( ch == -1 )
-                {
+                if( ch == -1 ) {
                     break;
                 }
-            }
-            else
-            {
-                if( endChars.indexOf((char)ch) != -1 )
-                {
+            } else {
+                if( endChars.indexOf( ( char )ch ) != -1 ) {
                     pushBack( ch );
                     break;
                 }
             }
-            sb.append( (char) ch );
+            sb.append( ( char )ch );
             ch = nextToken();
         }
 
@@ -764,21 +625,15 @@ public class JSPWikiMarkupParser extends MarkupParser {
      *  Reads the stream while the characters that have been specified are
      *  in the stream, returning then the result as a String.
      */
-    private String readWhile( final String endChars )
-        throws IOException
-    {
+    private String readWhile( final String endChars ) throws IOException {
         final StringBuilder sb = new StringBuilder( 80 );
         int ch = nextToken();
-
-        while( ch != -1 )
-        {
-            if( endChars.indexOf((char)ch) == -1 )
-            {
+        while( ch != -1 ) {
+            if( endChars.indexOf( ( char ) ch ) == -1 ) {
                 pushBack( ch );
                 break;
             }
-
-            sb.append( (char) ch );
+            sb.append( ( char ) ch );
             ch = nextToken();
         }
 
@@ -800,6 +655,7 @@ public class JSPWikiMarkupParser extends MarkupParser {
 
         return m_cleanTranslator;
     }
+
     /**
      *  Modifies the "hd" parameter to contain proper values.  Because
      *  an "id" tag may only contain [a-zA-Z0-9:_-], we'll replace the
@@ -808,11 +664,10 @@ public class JSPWikiMarkupParser extends MarkupParser {
      *  Counts also duplicate headings (= headings with similar name), and
      *  attaches a counter.
      */
-    private String makeHeadingAnchor( final String baseName, String title, final Heading hd ) {
+    protected String makeHeadingAnchor( final String baseName, String title, final Heading hd ) {
         hd.m_titleText = title;
         title = MarkupParser.wikifyLink( title );
         hd.m_titleSection = m_engine.encodeName(title);
-
         if( m_titleSectionCounter.containsKey( hd.m_titleSection ) ) {
             final Integer count = m_titleSectionCounter.get( hd.m_titleSection ) + 1;
             m_titleSectionCounter.put( hd.m_titleSection, count );
@@ -878,16 +733,12 @@ public class JSPWikiMarkupParser extends MarkupParser {
     }
 
     /**
-     *  When given a link to a WikiName, we just return
-     *  a proper HTML link for it.  The local link mutator
+     *  When given a link to a WikiName, we just return a proper HTML link for it.  The local link mutator
      *  chain is also called.
      */
-    private Element makeCamelCaseLink( final String wikiname )
-    {
+    private Element makeCamelCaseLink( final String wikiname ) {
         final String matchedLink = m_linkParsingOperations.linkIfExists( wikiname );
-
         callMutatorChain( m_localLinkMutatorChain, wikiname );
-
         if( matchedLink != null ) {
             makeLink( READ, matchedLink, wikiname, null, null );
         } else {
@@ -901,21 +752,16 @@ public class JSPWikiMarkupParser extends MarkupParser {
     private String m_outlinkImageURL;
 
     /**
-     *  Returns an element for the external link image (out.png).  However,
-     *  this method caches the URL for the lifetime of this MarkupParser,
-     *  because it's commonly used, and we'll end up with possibly hundreds
-     *  our thousands of references to it...  It's a lot faster, too.
+     * Returns an element for the external link image (out.png).  However, this method caches the URL for the lifetime
+     * of this MarkupParser, because it's commonly used, and we'll end up with possibly hundreds our thousands of
+     * references to it...  It's a lot faster, too.
      *
-     *  @return  An element containing the HTML for the outlink image.
+     * @return  An element containing the HTML for the outlink image.
      */
-    private Element outlinkImage()
-    {
+    private Element outlinkImage() {
         Element el = null;
-
-        if( m_useOutlinkImage )
-        {
-            if( m_outlinkImageURL == null )
-            {
+        if( m_useOutlinkImage ) {
+            if( m_outlinkImageURL == null ) {
                 m_outlinkImageURL = m_context.getURL( ContextEnum.PAGE_NONE.getRequestContext(), OUTLINK_IMAGE );
             }
 
@@ -928,14 +774,13 @@ public class JSPWikiMarkupParser extends MarkupParser {
     }
 
     /**
-     *  Takes an URL and turns it into a regular wiki link.  Unfortunately,
-     *  because of the way that flushPlainText() works, it already encodes
-     *  all of the XML entities.  But so does WikiContext.getURL(), so we
+     *  Takes a URL and turns it into a regular wiki link. Unfortunately, because of the way that flushPlainText()
+     *  works, it already encodes all the XML entities. But so does WikiContext.getURL(), so we
      *  have to do a reverse-replace here, so that it can again be replaced in makeLink.
      *  <p>
      *  What a crappy problem.
      *
-     * @param url
+     * @param url provided url.
      * @return An anchor Element containing the link.
      */
     private Element makeDirectURILink( String url ) {
@@ -965,10 +810,9 @@ public class JSPWikiMarkupParser extends MarkupParser {
 
     /**
      *  Image links are handled differently:
-     *  1. If the text is a WikiName of an existing page,
-     *     it gets linked.
+     *  1. If the text is a WikiName of an existing page, it gets linked.
      *  2. If the text is an external link, then it is inlined.
-     *  3. Otherwise it becomes an ALT text.
+     *  3. Otherwise, it becomes an ALT text.
      *
      *  @param reallink The link to the image.
      *  @param link     Link text portion, may be a link to somewhere else.
@@ -976,25 +820,14 @@ public class JSPWikiMarkupParser extends MarkupParser {
      *                  This means that the link text may be a link to a wiki page,
      *                  or an external resource.
      */
-
-    // FIXME: isExternalLink() is called twice.
-    private Element handleImageLink( final String reallink, final String link, final boolean hasLinkText )
-    {
+    private Element handleImageLink( final String reallink, final String link, final boolean hasLinkText ) {
         final String possiblePage = MarkupParser.cleanLink( link );
-
-        if( m_linkParsingOperations.isExternalLink( link ) && hasLinkText )
-        {
+        if( m_linkParsingOperations.isExternalLink( link ) && hasLinkText ) {
             return makeLink( IMAGELINK, reallink, link, null, null );
-        }
-        else if( m_linkParsingOperations.linkExists( possiblePage ) && hasLinkText )
-        {
-            // System.out.println("Orig="+link+", Matched: "+matchedLink);
+        } else if( m_linkParsingOperations.linkExists( possiblePage ) && hasLinkText ) {
             callMutatorChain( m_localLinkMutatorChain, possiblePage );
-
             return makeLink( IMAGEWIKILINK, reallink, link, null, null );
-        }
-        else
-        {
+        } else {
             return makeLink( IMAGE, reallink, link, null, null );
         }
     }
@@ -1003,7 +836,6 @@ public class JSPWikiMarkupParser extends MarkupParser {
         if( m_wysiwygEditorMode ) {
             m_currentElement.addContent( "[" + ruleLine + "]" );
         }
-
         if( !m_parseAccessRules ) {
             return m_currentElement;
         }
@@ -1068,7 +900,6 @@ public class JSPWikiMarkupParser extends MarkupParser {
     /**
      *  Emits a processing instruction that will disable markup escaping. This is
      *  very useful if you want to emit HTML directly into the stream.
-     *
      */
     private void disableOutputEscaping() {
         addElement( new ProcessingInstruction( Result.PI_DISABLE_OUTPUT_ESCAPING, "" ) );
@@ -1109,7 +940,6 @@ public class JSPWikiMarkupParser extends MarkupParser {
                     		                                            e.getMessage() ) ) );
                 }
             }
-
             return m_currentElement;
         }
 
@@ -1117,23 +947,16 @@ public class JSPWikiMarkupParser extends MarkupParser {
             final LinkParser.Link link = m_linkParser.parse( linktext );
             linktext = link.getText();
             String linkref = link.getReference();
-
-            //
             //  Yes, we now have the components separated.
             //  linktext = the text the link should have
             //  linkref  = the url or page name.
-            //
             //  In many cases these are the same.  [linktext|linkref].
-            //
             if( m_linkParsingOperations.isVariableLink( linktext ) ) {
                 final Content el = new VariableContent( linktext );
-
                 addElement( el );
             } else if( m_linkParsingOperations.isExternalLink( linkref ) ) {
                 // It's an external link, out of this Wiki
-
                 callMutatorChain( m_externalLinkMutatorChain, linkref );
-
                 if( m_linkParsingOperations.isImageLink( linkref, isImageInlining(), getInlineImagePatterns() ) ) {
                     handleImageLink( linkref, linktext, link.hasReference() );
                 } else {
@@ -1152,12 +975,10 @@ public class JSPWikiMarkupParser extends MarkupParser {
 
                 final String extWiki = link.getExternalWiki();
                 final String wikiPage = link.getExternalWikiPage();
-
                 if( m_wysiwygEditorMode ) {
                     makeLink( INTERWIKI, extWiki + ":" + wikiPage, linktext, null, link.getAttributes() );
                 } else {
                     String urlReference = m_engine.getInterWikiURL( extWiki );
-
                     if( urlReference != null ) {
                         urlReference = TextUtil.replaceString( urlReference, "%s", wikiPage );
                         urlReference = callMutatorChain( m_externalLinkMutatorChain, urlReference );
@@ -1167,13 +988,11 @@ public class JSPWikiMarkupParser extends MarkupParser {
                         } else {
                             makeLink( INTERWIKI, urlReference, linktext, null, link.getAttributes() );
                         }
-
                         if( m_linkParsingOperations.isExternalLink( urlReference ) ) {
                             addElement( outlinkImage() );
                         }
                     } else {
                         final Object[] args = { escapeHTMLEntities( extWiki ) };
-
                         addElement( makeError( MessageFormat.format( rb.getString( "markupparser.error.nointerwikiref" ), args ) ) );
                     }
                 }
@@ -1190,7 +1009,6 @@ public class JSPWikiMarkupParser extends MarkupParser {
                 String attachment = m_engine.getManager( AttachmentManager.class ).getAttachmentInfoName( m_context, linkref );
                 if( attachment != null ) {
                     callMutatorChain( m_attachmentLinkMutatorChain, attachment );
-
                     if( m_linkParsingOperations.isImageLink( linkref, isImageInlining(), getInlineImagePatterns() ) ) {
                         attachment = m_context.getURL( ContextEnum.PAGE_ATTACH.getRequestContext(), attachment );
                         sb.append( handleImageLink( attachment, linktext, link.hasReference() ) );
@@ -1199,14 +1017,10 @@ public class JSPWikiMarkupParser extends MarkupParser {
                     }
                 } else if( ( hashMark = linkref.indexOf( '#' ) ) != -1 ) {
                     // It's an internal Wiki link, but to a named section
-
                     final String namedSection = linkref.substring( hashMark + 1 );
                     linkref = linkref.substring( 0, hashMark );
-
                     linkref = MarkupParser.cleanLink( linkref );
-
                     callMutatorChain( m_localLinkMutatorChain, linkref );
-
                     final String matchedLink = m_linkParsingOperations.linkIfExists( linkref );
                     if( matchedLink != null ) {
                         String sectref = "section-" + m_engine.encodeName( matchedLink + "-" + wikifyLink( namedSection ) );
@@ -1218,9 +1032,7 @@ public class JSPWikiMarkupParser extends MarkupParser {
                 } else {
                     // It's an internal Wiki link
                     linkref = MarkupParser.cleanLink( linkref );
-
                     callMutatorChain( m_localLinkMutatorChain, linkref );
-
                     final String matchedLink = m_linkParsingOperations.linkIfExists( linkref );
                     if( matchedLink != null ) {
                         makeLink( READ, matchedLink, linktext, null, link.getAttributes() );
@@ -1230,75 +1042,52 @@ public class JSPWikiMarkupParser extends MarkupParser {
                 }
             }
 
-    } catch( final ParseException e ) {
-        log.info( "Parser failure: ", e );
-        final Object[] args = { e.getMessage() };
-        addElement( makeError( MessageFormat.format( rb.getString( "markupparser.error.parserfailure" ), args ) ) );
-    }
+        } catch( final ParseException e ) {
+            log.info( "Parser failure: ", e );
+            final Object[] args = { e.getMessage() };
+            addElement( makeError( MessageFormat.format( rb.getString( "markupparser.error.parserfailure" ), args ) ) );
+        }
         return m_currentElement;
     }
 
     /**
-     *  Pushes back any string that has been read.  It will obviously
-     *  be pushed back in a reverse order.
+     *  Pushes back any string that has been read.  It will obviously be pushed back in a reverse order.
      *
      *  @since 2.1.77
      */
-    private void pushBack( final String s )
-        throws IOException
-    {
-        for( int i = s.length()-1; i >= 0; i-- )
-        {
+    private void pushBack( final String s ) throws IOException {
+        for( int i = s.length()-1; i >= 0; i-- ) {
             pushBack( s.charAt(i) );
         }
     }
 
-    private Element handleBackslash()
-        throws IOException
-    {
+    private Element handleBackslash() throws IOException {
         final int ch = nextToken();
-
-        if( ch == '\\' )
-        {
+        if( ch == '\\' ) {
             final int ch2 = nextToken();
-
-            if( ch2 == '\\' )
-            {
-                pushElement( new Element("br").setAttribute("clear","all"));
-                return popElement("br");
+            if( ch2 == '\\' ) {
+                pushElement( new Element( "br" ).setAttribute( "clear", "all" ) );
+                return popElement( "br" );
             }
-
             pushBack( ch2 );
-
-            pushElement( new Element("br") );
-            return popElement("br");
+            pushElement( new Element( "br" ) );
+            return popElement( "br" );
         }
-
         pushBack( ch );
-
         return null;
     }
 
-    private Element handleUnderscore()
-        throws IOException
-    {
+    private Element handleUnderscore() throws IOException {
         final int ch = nextToken();
         Element el = null;
-
-        if( ch == '_' )
-        {
-            if( m_isbold )
-            {
-                el = popElement("b");
-            }
-            else
-            {
-                el = pushElement( new Element("b") );
+        if( ch == '_' ) {
+            if( m_isbold ) {
+                el = popElement( "b" );
+            } else {
+                el = pushElement( new Element( "b" ) );
             }
             m_isbold = !m_isbold;
-        }
-        else
-        {
+        } else {
             pushBack( ch );
         }
 
@@ -1309,215 +1098,145 @@ public class JSPWikiMarkupParser extends MarkupParser {
     /**
      *  For example: italics.
      */
-    private Element handleApostrophe()
-        throws IOException
-    {
+    private Element handleApostrophe() throws IOException {
         final int ch = nextToken();
         Element el = null;
 
-        if( ch == '\'' )
-        {
-            if( m_isitalic )
-            {
-                el = popElement("i");
-            }
-            else
-            {
-                el = pushElement( new Element("i") );
+        if( ch == '\'' ) {
+            if( m_isitalic ) {
+                el = popElement( "i" );
+            } else {
+                el = pushElement( new Element( "i" ) );
             }
             m_isitalic = !m_isitalic;
-        }
-        else
-        {
+        } else {
             pushBack( ch );
         }
 
         return el;
     }
 
-    private Element handleOpenbrace( final boolean isBlock )
-        throws IOException
-    {
+    private Element handleOpenbrace( final boolean isBlock ) throws IOException {
         final int ch = nextToken();
-
-        if( ch == '{' )
-        {
+        if( ch == '{' ) {
             final int ch2 = nextToken();
-
-            if( ch2 == '{' )
-            {
+            if( ch2 == '{' ) {
                 m_isPre = true;
                 m_isEscaping = true;
                 m_isPreBlock = isBlock;
-
-                if( isBlock )
-                {
+                if( isBlock ) {
                     startBlockLevel();
-                    return pushElement( new Element("pre") );
+                    return pushElement( new Element( "pre" ) );
                 }
 
-                return pushElement( new Element("span").setAttribute("class","inline-code") );
+                return pushElement( new Element( "span" ).setAttribute( "class", "inline-code" ) );
             }
-
             pushBack( ch2 );
-
-            return pushElement( new Element("tt") );
+            return pushElement( new Element( "tt" ) );
         }
-
         pushBack( ch );
-
         return null;
     }
 
     /**
      *  Handles both }} and }}}
      */
-    private Element handleClosebrace()
-        throws IOException
-    {
+    private Element handleClosebrace() throws IOException {
         final int ch2 = nextToken();
-
-        if( ch2 == '}' )
-        {
+        if( ch2 == '}' ) {
             final int ch3 = nextToken();
-
-            if( ch3 == '}' )
-            {
-                if( m_isPre )
-                {
-                    if( m_isPreBlock )
-                    {
+            if( ch3 == '}' ) {
+                if( m_isPre ) {
+                    if( m_isPreBlock ) {
                         popElement( "pre" );
-                    }
-                    else
-                    {
+                    } else {
                         popElement( "span" );
                     }
-
                     m_isPre = false;
                     m_isEscaping = false;
                     return m_currentElement;
                 }
-
-                m_plainTextBuf.append("}}}");
+                m_plainTextBuf.append( "}}}" );
                 return m_currentElement;
             }
-
             pushBack( ch3 );
-
-            if( !m_isEscaping )
-            {
-                return popElement("tt");
+            if( !m_isEscaping ) {
+                return popElement( "tt" );
             }
         }
-
         pushBack( ch2 );
-
         return null;
     }
 
-    private Element handleDash()
-        throws IOException
-    {
+    private Element handleDash() throws IOException {
         int ch = nextToken();
-
-        if( ch == '-' )
-        {
+        if( ch == '-' ) {
             final int ch2 = nextToken();
-
-            if( ch2 == '-' )
-            {
+            if( ch2 == '-' ) {
                 final int ch3 = nextToken();
-
-                if( ch3 == '-' )
-                {
+                if( ch3 == '-' ) {
                     // Empty away all the rest of the dashes.
                     // Do not forget to return the first non-match back.
-                    do
-                    {
+                    do {
                         ch = nextToken();
-                    }
-                    while ( ch == '-' );
+                    } while ( ch == '-' );
 
-                    pushBack(ch);
+                    pushBack( ch );
                     startBlockLevel();
-                    pushElement( new Element("hr") );
+                    pushElement( new Element( "hr" ) );
                     return popElement( "hr" );
                 }
-
                 pushBack( ch3 );
             }
             pushBack( ch2 );
         }
-
         pushBack( ch );
-
         return null;
     }
 
-    private Element handleHeading()
-        throws IOException
-    {
-        Element el;
-
+    private Element handleHeading() throws IOException {
+        final Element el;
         final int ch  = nextToken();
-
         final Heading hd = new Heading();
-
-        if( ch == '!' )
-        {
+        if( ch == '!' ) {
             final int ch2 = nextToken();
-
-            if( ch2 == '!' )
-            {
+            if( ch2 == '!' ) {
                 final String title = peekAheadLine();
-
-                el = makeHeading( Heading.HEADING_LARGE, title, hd);
-            }
-            else
-            {
+                el = makeHeading( Heading.HEADING_LARGE, title, hd );
+            } else {
                 pushBack( ch2 );
                 final String title = peekAheadLine();
                 el = makeHeading( Heading.HEADING_MEDIUM, title, hd );
             }
-        }
-        else
-        {
+        } else {
             pushBack( ch );
             final String title = peekAheadLine();
             el = makeHeading( Heading.HEADING_SMALL, title, hd );
         }
 
         callHeadingListenerChain( hd );
-
         m_lastHeading = hd;
-
-        if( el != null ) pushElement(el);
-
+        if( el != null ) {
+            pushElement( el );
+        }
         return el;
     }
 
     /**
-     *  Reads the stream until the next EOL or EOF.  Note that it will also read the
-     *  EOL from the stream.
+     * Reads the stream until the next EOL or EOF.  Note that it will also read the EOL from the stream.
      */
-    private StringBuilder readUntilEOL()
-        throws IOException
-    {
+    private StringBuilder readUntilEOL() throws IOException {
         int ch;
         final StringBuilder buf = new StringBuilder( 256 );
-
-        while( true )
-        {
+        while( true ) {
             ch = nextToken();
-
-            if( ch == -1 )
+            if( ch == -1 ) {
                 break;
-
+            }
             buf.append( (char) ch );
-
-            if( ch == '\n' )
+            if( ch == '\n' ) {
                 break;
+            }
         }
         return buf;
     }
@@ -1530,279 +1249,191 @@ public class JSPWikiMarkupParser extends MarkupParser {
     private boolean m_newLine;
 
     /**
-     *  Starts a block level element, therefore closing
-     *  a potential open paragraph tag.
+     * Starts a block level element, therefore closing a potential open paragraph tag.
      */
-    private void startBlockLevel()
-    {
+    private void startBlockLevel() {
         // These may not continue over block level limits in XHTML
-
-        popElement("i");
-        popElement("b");
-        popElement("tt");
-
-        if( m_isOpenParagraph )
-        {
+        popElement( "i" );
+        popElement( "b" );
+        popElement( "tt" );
+        if( m_isOpenParagraph ) {
             m_isOpenParagraph = false;
-            popElement("p");
-            m_plainTextBuf.append("\n"); // Just small beautification
+            popElement( "p" );
+            m_plainTextBuf.append( "\n" ); // Just small beautification
         }
-
         m_restartitalic = m_isitalic;
         m_restartbold   = m_isbold;
-
         m_isitalic = false;
         m_isbold   = false;
     }
 
-    private static String getListType( final char c )
-    {
-        if( c == '*' )
-        {
+    private static String getListType( final char c ) {
+        if( c == '*' ) {
             return "ul";
-        }
-        else if( c == '#' )
-        {
+        } else if( c == '#' ) {
             return "ol";
         }
-        throw new InternalWikiException("Parser got faulty list type: "+c);
+        throw new InternalWikiException( "Parser got faulty list type: " + c );
     }
     /**
-     *  Like original handleOrderedList() and handleUnorderedList()
-     *  however handles both ordered ('#') and unordered ('*') mixed together.
+     * Like original handleOrderedList() and handleUnorderedList(),
+     * however handles both ordered ('#') and unordered ('*') mixed together.
      */
-
     // FIXME: Refactor this; it's a bit messy.
-
-    private Element handleGeneralList()
-        throws IOException
-    {
+    private Element handleGeneralList() throws IOException {
          startBlockLevel();
-
          String strBullets = readWhile( "*#" );
          // String strBulletsRaw = strBullets;      // to know what was original before phpwiki style substitution
          final int numBullets = strBullets.length();
 
-         // override the beginning portion of bullet pattern to be like the previous
-         // to simulate PHPWiki style lists
-
-         if(m_allowPHPWikiStyleLists)
-         {
-             // only substitute if different
-             if(!( strBullets.substring(0,Math.min(numBullets,m_genlistlevel)).equals
-                   (m_genlistBulletBuffer.substring(0,Math.min(numBullets,m_genlistlevel)) ) ) )
-             {
-                 if(numBullets <= m_genlistlevel)
-                 {
-                     // Substitute all but the last character (keep the expressed bullet preference)
-                     strBullets  = (numBullets > 1 ? m_genlistBulletBuffer.substring(0, numBullets-1) : "")
-                                   + strBullets.charAt( numBullets-1 );
-                 }
-                 else
-                 {
-                     strBullets = m_genlistBulletBuffer + strBullets.substring(m_genlistlevel, numBullets);
-                 }
-             }
-         }
-
-         //
+         // override the beginning portion of bullet pattern to be like the previous to simulate PHPWiki style lists
+
+        if( m_allowPHPWikiStyleLists ) {
+            // only substitute if different
+            if( !( strBullets.substring( 0, Math.min( numBullets, m_genlistlevel ) ).equals( m_genlistBulletBuffer.substring( 0, Math.min( numBullets, m_genlistlevel ) ) ) ) ) {
+                if( numBullets <= m_genlistlevel ) {
+                    // Substitute all but the last character (keep the expressed bullet preference)
+                    strBullets = ( numBullets > 1 ? m_genlistBulletBuffer.substring( 0, numBullets - 1 ) : "" ) +
+                                 strBullets.charAt( numBullets - 1 );
+                } else {
+                    strBullets = m_genlistBulletBuffer + strBullets.substring( m_genlistlevel, numBullets );
+                }
+            }
+        }
+
          //  Check if this is still of the same type
-         //
-         if( strBullets.substring(0,Math.min(numBullets,m_genlistlevel)).equals
-            (m_genlistBulletBuffer.substring(0,Math.min(numBullets,m_genlistlevel)) ) )
-         {
-             if( numBullets > m_genlistlevel )
-             {
-                 pushElement( new Element( getListType(strBullets.charAt(m_genlistlevel++) ) ) );
-
-                 for( ; m_genlistlevel < numBullets; m_genlistlevel++ )
-                 {
-                     // bullets are growing, get from new bullet list
-                     pushElement( new Element("li") );
-                     pushElement( new Element( getListType(strBullets.charAt(m_genlistlevel)) ));
-                 }
-             }
-             else if( numBullets < m_genlistlevel )
-             {
-                 //  Close the previous list item.
-                 // buf.append( m_renderer.closeListItem() );
-                 popElement( "li" );
-
-                 for( ; m_genlistlevel > numBullets; m_genlistlevel-- )
-                 {
-                     // bullets are shrinking, get from old bullet list
-
-                     popElement( getListType(m_genlistBulletBuffer.charAt(m_genlistlevel-1)) );
-                     if( m_genlistlevel > 0 )
-                     {
-                         popElement( "li" );
-                     }
-
-                 }
-             }
-             else
-             {
-                 if( m_genlistlevel > 0 )
-                 {
-                     popElement( "li" );
-                 }
-             }
-         }
-         else
-         {
-             //
-             //  The pattern has changed, unwind and restart
-             //
-             int  numEqualBullets;
-             final int  numCheckBullets;
-
-             // find out how much is the same
-             numEqualBullets = 0;
-             numCheckBullets = Math.min(numBullets,m_genlistlevel);
-
-             while( numEqualBullets < numCheckBullets )
-             {
-                 // if the bullets are equal so far, keep going
-                 if( strBullets.charAt(numEqualBullets) == m_genlistBulletBuffer.charAt(numEqualBullets))
-                     numEqualBullets++;
-                 // otherwise giveup, we have found how many are equal
-                 else
-                     break;
-             }
-
-             //unwind
-             for( ; m_genlistlevel > numEqualBullets; m_genlistlevel-- )
-             {
-                 popElement( getListType( m_genlistBulletBuffer.charAt(m_genlistlevel-1) ) );
-                 if( m_genlistlevel > numBullets )
-                 {
-                     popElement("li");
-                 }
-             }
-
-             //rewind
-
-             pushElement( new Element(getListType( strBullets.charAt(numEqualBullets++) ) ) );
-             for(int i = numEqualBullets; i < numBullets; i++)
-             {
-                 pushElement( new Element("li") );
-                 pushElement( new Element( getListType( strBullets.charAt(i) ) ) );
-             }
-             m_genlistlevel = numBullets;
-         }
-
-         //
-         //  Push a new list item, and eat away any extra whitespace
-         //
-         pushElement( new Element("li") );
-         readWhile(" ");
-
-         // work done, remember the new bullet list (in place of old one)
-         m_genlistBulletBuffer.setLength(0);
-         m_genlistBulletBuffer.append(strBullets);
-
-         return m_currentElement;
-    }
+        if( strBullets.substring( 0, Math.min( numBullets, m_genlistlevel ) ).equals( m_genlistBulletBuffer.substring( 0, Math.min( numBullets, m_genlistlevel ) ) ) ) {
+            if( numBullets > m_genlistlevel ) {
+                pushElement( new Element( getListType( strBullets.charAt( m_genlistlevel++ ) ) ) );
+                for( ; m_genlistlevel < numBullets; m_genlistlevel++ ) {
+                    // bullets are growing, get from new bullet list
+                    pushElement( new Element( "li" ) );
+                    pushElement( new Element( getListType( strBullets.charAt( m_genlistlevel ) ) ) );
+                }
+            } else if( numBullets < m_genlistlevel ) {
+                //  Close the previous list item.
+                popElement( "li" );
+                for( ; m_genlistlevel > numBullets; m_genlistlevel-- ) {
+                    // bullets are shrinking, get from old bullet list
+                    popElement( getListType( m_genlistBulletBuffer.charAt( m_genlistlevel - 1 ) ) );
+                    if( m_genlistlevel > 0 ) {
+                        popElement( "li" );
+                    }
+                }
+            } else {
+                if( m_genlistlevel > 0 ) {
+                    popElement( "li" );
+                }
+            }
+        } else {
+            //  The pattern has changed, unwind and restart
+            int numEqualBullets;
+            final int numCheckBullets;
+
+            // find out how much is the same
+            numEqualBullets = 0;
+            numCheckBullets = Math.min( numBullets, m_genlistlevel );
+
+            while( numEqualBullets < numCheckBullets ) {
+                // if the bullets are equal so far, keep going
+                if( strBullets.charAt( numEqualBullets ) == m_genlistBulletBuffer.charAt( numEqualBullets ) )
+                    numEqualBullets++;
+                    // otherwise giveup, we have found how many are equal
+                else
+                    break;
+            }
 
-    private Element unwindGeneralList()
-    {
-        //unwind
-        for( ; m_genlistlevel > 0; m_genlistlevel-- )
-        {
-            popElement( "li" );
-            popElement( getListType(m_genlistBulletBuffer.charAt(m_genlistlevel-1)) );
+            //unwind
+            for( ; m_genlistlevel > numEqualBullets; m_genlistlevel-- ) {
+                popElement( getListType( m_genlistBulletBuffer.charAt( m_genlistlevel - 1 ) ) );
+                if( m_genlistlevel > numBullets ) {
+                    popElement( "li" );
+                }
+            }
+
+            //rewind
+            pushElement( new Element( getListType( strBullets.charAt( numEqualBullets++ ) ) ) );
+            for( int i = numEqualBullets; i < numBullets; i++ ) {
+                pushElement( new Element( "li" ) );
+                pushElement( new Element( getListType( strBullets.charAt( i ) ) ) );
+            }
+            m_genlistlevel = numBullets;
         }
 
-        m_genlistBulletBuffer.setLength(0);
+         // Push a new list item, and eat away any extra whitespace
+        pushElement( new Element( "li" ) );
+        readWhile( " " );
+
+        // work done, remember the new bullet list (in place of old one)
+        m_genlistBulletBuffer.setLength( 0 );
+        m_genlistBulletBuffer.append( strBullets );
+        return m_currentElement;
+    }
 
+    private Element unwindGeneralList() {
+        // unwind
+        for( ; m_genlistlevel > 0; m_genlistlevel-- ) {
+            popElement( "li" );
+            popElement( getListType( m_genlistBulletBuffer.charAt( m_genlistlevel - 1 ) ) );
+        }
+        m_genlistBulletBuffer.setLength( 0 );
         return null;
     }
 
 
-    private Element handleDefinitionList()
-        throws IOException
-    {
-        if( !m_isdefinition )
-        {
+    private Element handleDefinitionList() {
+        if( !m_isdefinition ) {
             m_isdefinition = true;
-
             startBlockLevel();
-
-            pushElement( new Element("dl") );
-            return pushElement( new Element("dt") );
+            pushElement( new Element( "dl" ) );
+            return pushElement( new Element( "dt" ) );
         }
-
         return null;
     }
 
-    private Element handleOpenbracket()
-        throws IOException
-    {
-        final StringBuilder sb = new StringBuilder(40);
+    private Element handleOpenbracket() throws IOException {
+        final StringBuilder sb = new StringBuilder( 40 );
         final int pos = getPosition();
         int ch = nextToken();
         boolean isPlugin = false;
-
-        if( ch == '[' )
-        {
-            if( m_wysiwygEditorMode )
-            {
+        if( ch == '[' ) {
+            if( m_wysiwygEditorMode ) {
                 sb.append( '[' );
             }
-
-            sb.append( (char)ch );
-
-            while( (ch = nextToken()) == '[' )
-            {
-                sb.append( (char)ch );
+            sb.append( ( char )ch );
+            while( ( ch = nextToken() ) == '[' ) {
+                sb.append( ( char )ch );
             }
         }
 
-
-        if( ch == '{' )
-        {
+        if( ch == '{' ) {
             isPlugin = true;
         }
 
         pushBack( ch );
 
-        if( sb.length() > 0 )
-        {
+        if( sb.length() > 0 ) {
             m_plainTextBuf.append( sb );
             return m_currentElement;
         }
 
-        //
         //  Find end of hyperlink
-        //
-
         ch = nextToken();
-        int nesting = 1;    // Check for nested plugins
-
-        while( ch != -1 )
-        {
-            final int ch2 = nextToken(); pushBack(ch2);
-
-            if( isPlugin )
-            {
-                if( ch == '[' && ch2 == '{' )
-                {
+        int nesting = 1; // Check for nested plugins
+        while( ch != -1 ) {
+            final int ch2 = nextToken();
+            pushBack( ch2 );
+            if( isPlugin ) {
+                if( ch == '[' && ch2 == '{' ) {
                     nesting++;
-                }
-                else if( nesting == 0 && ch == ']' && sb.charAt(sb.length()-1) == '}' )
-                {
+                } else if( nesting == 0 && ch == ']' && sb.charAt(sb.length()-1) == '}' ) {
                     break;
-                }
-                else if( ch == '}' && ch2 == ']' )
-                {
+                } else if( ch == '}' && ch2 == ']' ) {
                     // NB: This will be decremented once at the end
                     nesting--;
                 }
-            }
-            else
-            {
-                if( ch == ']' )
-                {
+            } else {
+                if( ch == ']' ) {
                     break;
                 }
             }
@@ -1812,13 +1443,9 @@ public class JSPWikiMarkupParser extends MarkupParser {
             ch = nextToken();
         }
 
-        //
-        //  If the link is never finished, do some tricks to display the rest of the line
-        //  unchanged.
-        //
-        if( ch == -1 )
-        {
-            log.debug("Warning: unterminated link detected!");
+        //  If the link is never finished, do some tricks to display the rest of the line unchanged.
+        if( ch == -1 ) {
+            log.debug( "Warning: unterminated link detected!" );
             m_isEscaping = true;
             m_plainTextBuf.append( sb );
             flushPlainText();
@@ -1832,64 +1459,47 @@ public class JSPWikiMarkupParser extends MarkupParser {
     /**
      *  Reads the stream until the current brace is closed or stream end.
      */
-    private String readBraceContent( final char opening, final char closing )
-        throws IOException
-    {
-        final StringBuilder sb = new StringBuilder(40);
+    private String readBraceContent( final char opening, final char closing ) throws IOException {
+        final StringBuilder sb = new StringBuilder( 40 );
         int braceLevel = 1;
         int ch;
-        while(( ch = nextToken() ) != -1 )
-        {
-            if( ch == '\\' )
-            {
+        while( ( ch = nextToken() ) != -1 ) {
+            if( ch == '\\' ) {
                 continue;
-            }
-            else if ( ch == opening )
-            {
+            } else if( ch == opening ) {
                 braceLevel++;
-            }
-            else if ( ch == closing )
-            {
+            } else if( ch == closing ) {
                 braceLevel--;
-                if (braceLevel==0)
-                {
-                  break;
+                if( braceLevel == 0 ) {
+                    break;
                 }
             }
-            sb.append( (char)ch );
+            sb.append( ( char ) ch );
         }
         return sb.toString();
     }
 
 
     /**
-     *  Handles constructs of type %%(style) and %%class
+     * Handles constructs of type %%(style) and %%class
      * @param newLine
      * @return An Element containing the div or span, depending on the situation.
      * @throws IOException
      */
-    private Element handleDiv( final boolean newLine )
-        throws IOException
-    {
+    private Element handleDiv( final boolean newLine ) throws IOException {
         int ch = nextToken();
         Element el = null;
 
-        if( ch == '%' )
-        {
+        if( ch == '%' ) {
             String style = null;
             String clazz = null;
 
             ch = nextToken();
 
-            //
             //  Style or class?
-            //
-            if( ch == '(' )
-            {
+            if( ch == '(' ) {
                 style = readBraceContent('(',')');
-            }
-            else if( Character.isLetter( (char) ch ) )
-            {
+            } else if( Character.isLetter( (char) ch ) ) {
                 pushBack( ch );
                 clazz = readUntil( "( \t\n\r" );
                 //Note: ref.https://www.w3.org/TR/CSS21/syndata.html#characters
@@ -1899,101 +1509,61 @@ public class JSPWikiMarkupParser extends MarkupParser {
 
                 //(1) replace '.' by spaces, allowing multiple classnames on a div or span
                 //(2) remove any invalid character
-                if( clazz != null){
-
-                    clazz = clazz.replace('.', ' ')
-                                 .replaceAll("[^\\s-_\\w\\x200-\\x377]+","");
-
+                if( clazz != null ) {
+                    clazz = clazz.replace( '.', ' ' )
+                                 .replaceAll( "[^\\s-_\\w\\x200-\\x377]+", "" );
                 }
                 ch = nextToken();
 
-                //check for %%class1.class2( style information )
-                if( ch == '(' )
-                {
-                    style = readBraceContent('(',')');
-                }
-                //
-                //  Pop out only spaces, so that the upcoming EOL check does not check the
-                //  next line.
-                //
-                else if( ch == '\n' || ch == '\r' )
-                {
-                    pushBack(ch);
+                // check for %%class1.class2( style information )
+                if( ch == '(' ) {
+                    style = readBraceContent( '(', ')' );
+                //  Pop out only spaces, so that the upcoming EOL check does not check the next line.
+                } else if( ch == '\n' || ch == '\r' ) {
+                    pushBack( ch );
                 }
-            }
-            else
-            {
-                //
+            } else {
                 // Anything else stops.
-                //
-
-                pushBack(ch);
-
-                try
-                {
+                pushBack( ch );
+                try {
                     final Boolean isSpan = m_styleStack.pop();
-
-                    if( isSpan == null )
-                    {
+                    if( isSpan == null ) {
                         // Fail quietly
-                    }
-                    else if(isSpan)
-                    {
+                    } else if( isSpan ) {
                         el = popElement( "span" );
-                    }
-                    else
-                    {
+                    } else {
                         el = popElement( "div" );
                     }
-                }
-                catch( final EmptyStackException e )
-                {
-                    log.debug("Page '"+m_context.getName()+"' closes a %%-block that has not been opened.");
+                } catch( final EmptyStackException e ) {
+                    log.debug( "Page '" + m_context.getName() + "' closes a %%-block that has not been opened." );
                     return m_currentElement;
                 }
-
                 return el;
             }
 
-            //
             //  Check if there is an attempt to do something nasty
-            //
-
-            try
-            {
+            try {
                 style = StringEscapeUtils.unescapeHtml4(style);
-                if( style != null && style.contains("javascript:"))
-                {
-                    log.debug("Attempt to output javascript within CSS:"+style);
+                if( style != null && style.contains( "javascript:" ) ) {
+                    log.debug( "Attempt to output javascript within CSS: {}", style );
                     final ResourceBundle rb = Preferences.getBundle( m_context, InternationalizationManager.CORE_BUNDLE );
                     return addElement( makeError( rb.getString( "markupparser.error.javascriptattempt" ) ) );
                 }
-            }
-            catch( final NumberFormatException e )
-            {
-                //
+            } catch( final NumberFormatException e ) {
                 //  If there are unknown entities, we don't want the parser to stop.
-                //
                 final ResourceBundle rb = Preferences.getBundle( m_context, InternationalizationManager.CORE_BUNDLE );
                 final String msg = MessageFormat.format( rb.getString( "markupparser.error.parserfailure"), e.getMessage() );
                 return addElement( makeError( msg ) );
             }
 
-            //
             //  Decide if we should open a div or a span?
-            //
             final String eol = peekAheadLine();
 
-            if( !eol.trim().isEmpty() )
-            {
+            if( !eol.trim().isEmpty() ) {
                 // There is stuff after the class
-
                 el = new Element("span");
-
                 m_styleStack.push( Boolean.TRUE );
-            }
-            else
-            {
+            } else {
                 startBlockLevel();
                 el = new Element("div");
                 m_styleStack.push( Boolean.FALSE );
@@ -2001,49 +1571,31 @@ public class JSPWikiMarkupParser extends MarkupParser {
 
             if( style != null ) el.setAttribute("style", style);
             if( clazz != null ) el.setAttribute("class", clazz);
-            el = pushElement( el );
-
-            return el;
+            return pushElement( el );
         }
-
-        pushBack(ch);
-
+        pushBack( ch );
         return el;
     }
 
-    private Element handleSlash( final boolean newLine )
-        throws IOException
-    {
+    private Element handleSlash( final boolean newLine ) throws IOException {
         final int ch = nextToken();
-
-        pushBack(ch);
-        if( ch == '%' && !m_styleStack.isEmpty() )
-        {
+        pushBack( ch );
+        if( ch == '%' && !m_styleStack.isEmpty() ) {
             return handleDiv( newLine );
         }
 
         return null;
     }
 
-    private Element handleBar( final boolean newLine )
-        throws IOException
-    {
+    private Element handleBar( final boolean newLine ) throws IOException {
         Element el;
-
-        if( !m_istable && !newLine )
-        {
+        if( !m_istable && !newLine ) {
             return null;
         }
 
-        //
-        //  If the bar is in the first column, we will either start
-        //  a new table or continue the old one.
-        //
-
-        if( newLine )
-        {
-            if( !m_istable )
-            {
+        //  If the bar is in the first column, we will either start a new table or continue the old one.
+        if( newLine ) {
+            if( !m_istable ) {
                 startBlockLevel();
                 el = pushElement( new Element("table").setAttribute("class","wikitable").setAttribute("border","1") );
                 m_istable = true;
@@ -2057,49 +1609,33 @@ public class JSPWikiMarkupParser extends MarkupParser {
             el = pushElement( tr );
         }
 
-        //
-        //  Check out which table cell element to start;
-        //  a header element (th) or a regular element (td).
-        //
+        //  Check out which table cell element to start; a header element (th) or a regular element (td).
         final int ch = nextToken();
-
-        if( ch == '|' )
-        {
-            if( !newLine )
-            {
+        if( ch == '|' ) {
+            if( !newLine ) {
                 el = popElement("th");
                 if( el == null ) popElement("td");
             }
             el = pushElement( new Element("th") );
-        }
-        else
-        {
-            if( !newLine )
-            {
-                el = popElement("td");
-                if( el == null ) popElement("th");
+        } else {
+            if( !newLine ) {
+                el = popElement( "td" );
+                if( el == null ) popElement( "th" );
             }
-
             el = pushElement( new Element("td") );
-
             pushBack( ch );
         }
-
         return el;
     }
 
     /**
      *  Generic escape of next character or entity.
      */
-    private Element handleTilde()
-        throws IOException
-    {
+    private Element handleTilde() throws IOException {
         final int ch = nextToken();
 
-        if( ch == ' ' )
-        {
-            if( m_wysiwygEditorMode )
-            {
+        if( ch == ' ' ) {
+            if( m_wysiwygEditorMode ) {
                 m_plainTextBuf.append( "~ " );
             }
             return m_currentElement;
@@ -2107,138 +1643,88 @@ public class JSPWikiMarkupParser extends MarkupParser {
 
         if( ch == '|' || ch == '~' || ch == '\\' || ch == '*' || ch == '#' ||
             ch == '-' || ch == '!' || ch == '\'' || ch == '_' || ch == '[' ||
-            ch == '{' || ch == ']' || ch == '}' || ch == '%' )
-        {
-            if( m_wysiwygEditorMode )
-            {
+            ch == '{' || ch == ']' || ch == '}' || ch == '%' ) {
+            if( m_wysiwygEditorMode ) {
                 m_plainTextBuf.append( '~' );
             }
-
-            m_plainTextBuf.append( (char)ch );
-            m_plainTextBuf.append(readWhile( ""+(char)ch ));
+            m_plainTextBuf.append( ( char ) ch );
+            m_plainTextBuf.append( readWhile( "" + ( char ) ch ) );
             return m_currentElement;
         }
-
         // No escape.
         pushBack( ch );
-
         return null;
     }
 
-    private void fillBuffer( final Element startElement )
-        throws IOException
-    {
+    private void fillBuffer( final Element startElement ) throws IOException {
         m_currentElement = startElement;
-
-        boolean quitReading = false;
         m_newLine = true;
+        boolean quitReading = false;
         disableOutputEscaping();
-
-        while(!quitReading)
-        {
+        while( !quitReading ) {
             final int ch = nextToken();
+            if( ch == -1 ) {
+                break;
+            }
 
-            if( ch == -1 ) break;
-
-            //
-            //  Check if we're actually ending the preformatted mode.
-            //  We still must do an entity transformation here.
-            //
-            if( m_isEscaping )
-            {
-                if( ch == '}' )
-                {
+            //  Check if we're actually ending the preformatted mode. We still must do an entity transformation here.
+            if( m_isEscaping ) {
+                if( ch == '}' ) {
                     if( handleClosebrace() == null ) m_plainTextBuf.append( (char) ch );
-                }
-                else if( ch == -1 )
-                {
+                } else if( ch == -1 ) {
                     quitReading = true;
                 }
-                else if( ch == '\r' )
-                {
+                else if( ch == '\r' ) {
                     // DOS line feeds we ignore.
-                }
-                else if( ch == '<' )
-                {
+                } else if( ch == '<' ) {
                     m_plainTextBuf.append( "&lt;" );
-                }
-                else if( ch == '>' )
-                {
+                } else if( ch == '>' ) {
                     m_plainTextBuf.append( "&gt;" );
-                }
-                else if( ch == '&' )
-                {
+                } else if( ch == '&' ) {
                     m_plainTextBuf.append( "&amp;" );
-                }
-                else if( ch == '~' )
-                {
-                    String braces = readWhile("}");
-                    if( braces.length() >= 3 )
-                    {
-                        m_plainTextBuf.append("}}}");
-
+                } else if( ch == '~' ) {
+                    String braces = readWhile( "}" );
+                    if( braces.length() >= 3 ) {
+                        m_plainTextBuf.append( "}}}" );
                         braces = braces.substring(3);
-                    }
-                    else
-                    {
+                    } else {
                         m_plainTextBuf.append( (char) ch );
                     }
 
-                    for( int i = braces.length()-1; i >= 0; i-- )
-                    {
-                        pushBack(braces.charAt(i));
+                    for( int i = braces.length()-1; i >= 0; i-- ) {
+                        pushBack( braces.charAt( i ) );
                     }
-                }
-                else
-                {
+                } else {
                     m_plainTextBuf.append( (char) ch );
                 }
 
                 continue;
             }
 
-            //
             //  An empty line stops a list
-            //
-            if( m_newLine && ch != '*' && ch != '#' && ch != ' ' && m_genlistlevel > 0 )
-            {
+            if( m_newLine && ch != '*' && ch != '#' && ch != ' ' && m_genlistlevel > 0 ) {
                 m_plainTextBuf.append(unwindGeneralList());
             }
 
-            if( m_newLine && ch != '|' && m_istable )
-            {
-                popElement("table");
+            if( m_newLine && ch != '|' && m_istable ) {
+                popElement( "table" );
                 m_istable = false;
             }
 
             int skip = IGNORE;
-
-            //
             //  Do the actual parsing and catch any errors.
-            //
-            try
-            {
+            try {
                 skip = parseToken( ch );
-            }
-            catch( final IllegalDataException e )
-            {
-                log.info("Page "+m_context.getPage().getName()+" contains data which cannot be added to DOM tree: "+e.getMessage());
-
-                makeError("Error: "+cleanupSuspectData(e.getMessage()) );
+            } catch( final IllegalDataException e ) {
+                log.info( "Page {} contains data which cannot be added to DOM tree: {}", m_context.getPage().getName(), e.getMessage() );
+                makeError( "Error: " + cleanupSuspectData( e.getMessage() ) );
             }
 
+            // The idea is as follows:  If the handler method returns an element (el != null), it is assumed that it
+            // has been added in the stack.  Otherwise, the character is added as is to the plaintext buffer.
             //
-            //   The idea is as follows:  If the handler method returns
-            //   an element (el != null), it is assumed that it has been
-            //   added in the stack.  Otherwise the character is added
-            //   as is to the plaintext buffer.
-            //
-            //   For the transition phase, if s != null, it also gets
-            //   added in the plaintext buffer.
-            //
-
-            switch( skip )
-            {
+            // For the transition phase, if s != null, it also gets added in the plaintext buffer.
+            switch( skip ) {
                 case ELEMENT:
                     m_newLine = false;
                     break;
@@ -2255,17 +1741,13 @@ public class JSPWikiMarkupParser extends MarkupParser {
         }
 
         closeHeadings();
-        popElement("domroot");
+        popElement( "domroot" );
     }
 
-    private String cleanupSuspectData( final String s )
-    {
+    private String cleanupSuspectData( final String s ) {
         final StringBuilder sb = new StringBuilder( s.length() );
-
-        for( int i = 0; i < s.length(); i++ )
-        {
+        for( int i = 0; i < s.length(); i++ ) {
             final char c = s.charAt(i);
-
             if( Verifier.isXMLCharacter( c ) ) sb.append( c );
             else sb.append( "0x" ).append( Integer.toString( c, 16 ).toUpperCase() );
         }
@@ -2296,79 +1778,55 @@ public class JSPWikiMarkupParser extends MarkupParser {
      * @return {@link #ELEMENT}, {@link #CHARACTER} or {@link #IGNORE}.
      * @throws IOException If parsing fails.
      */
-    protected int parseToken( final int ch )
-        throws IOException
-    {
+    protected int parseToken( final int ch ) throws IOException {
         Element el = null;
-
-        //
         //  Now, check the incoming token.
-        //
-        switch( ch )
-        {
+        switch( ch ) {
           case '\r':
             // DOS linefeeds we forget
             return IGNORE;
 
           case '\n':
-            //
             //  Close things like headings, etc.
-            //
-
             // FIXME: This is not really very fast
-
             closeHeadings();
 
-            popElement("dl"); // Close definition lists.
-            if( m_istable )
-            {
+            popElement( "dl" ); // Close definition lists.
+            if( m_istable ) {
                 popElement("tr");
             }
-
             m_isdefinition = false;
-
-            if( m_newLine )
-            {
+            if( m_newLine ) {
                 // Paragraph change.
                 startBlockLevel();
-
-                //
-                //  Figure out which elements cannot be enclosed inside
-                //  a <p></p> pair according to XHTML rules.
-                //
+                //  Figure out which elements cannot be enclosed inside a <p></p> pair according to XHTML rules.
                 final String nextLine = peekAheadLine();
                 if( nextLine.isEmpty() ||
-                    (!nextLine.isEmpty() &&
-                     !nextLine.startsWith("{{{") &&
-                     !nextLine.startsWith("----") &&
-                     !nextLine.startsWith("%%") &&
-                     "*#!;".indexOf( nextLine.charAt(0) ) == -1) )
-                {
-                    pushElement( new Element("p") );
+                     ( !nextLine.isEmpty() &&
+                       !nextLine.startsWith( "{{{" ) &&
+                       !nextLine.startsWith( "----" ) &&
+                       !nextLine.startsWith( "%%" ) &&
+                       "*#!;".indexOf( nextLine.charAt( 0 ) ) == -1 ) ) {
+                    pushElement( new Element( "p" ) );
                     m_isOpenParagraph = true;
 
-                    if( m_restartitalic )
-                    {
-                        pushElement( new Element("i") );
+                    if( m_restartitalic ) {
+                        pushElement( new Element( "i" ) );
                         m_isitalic = true;
                         m_restartitalic = false;
                     }
-                    if( m_restartbold )
-                    {
-                        pushElement( new Element("b") );
+                    if( m_restartbold ) {
+                        pushElement( new Element( "b" ) );
                         m_isbold = true;
                         m_restartbold = false;
                     }
                 }
-            }
-            else
-            {
+            } else {
                 m_plainTextBuf.append("\n");
                 m_newLine = true;
             }
             return IGNORE;
 
-
           case '\\':
             el = handleBackslash();
             break;
@@ -2390,30 +1848,27 @@ public class JSPWikiMarkupParser extends MarkupParser {
             break;
 
           case '-':
-            if( m_newLine )
+            if( m_newLine ) {
                 el = handleDash();
-
+            }
             break;
 
           case '!':
-            if( m_newLine )
-            {
+            if( m_newLine ) {
                 el = handleHeading();
             }
             break;
 
           case ';':
-            if( m_newLine )
-            {
+            if( m_newLine ) {
                 el = handleDefinitionList();
             }
             break;
 
           case ':':
-            if( m_isdefinition )
-            {
-                popElement("dt");
-                el = pushElement( new Element("dd") );
+            if( m_isdefinition ) {
+                popElement( "dt" );
+                el = pushElement( new Element( "dd" ) );
                 m_isdefinition = false;
             }
             break;
@@ -2423,17 +1878,15 @@ public class JSPWikiMarkupParser extends MarkupParser {
             break;
 
           case '*':
-            if( m_newLine )
-            {
-                pushBack('*');
+            if( m_newLine ) {
+                pushBack( '*' );
                 el = handleGeneralList();
             }
             break;
 
           case '#':
-            if( m_newLine )
-            {
-                pushBack('#');
+            if( m_newLine ) {
+                pushBack( '#' );
                 el = handleGeneralList();
             }
             break;
@@ -2461,40 +1914,33 @@ public class JSPWikiMarkupParser extends MarkupParser {
         return el != null ? ELEMENT : CHARACTER;
     }
 
-    private void closeHeadings()
-    {
-        if( m_lastHeading != null && !m_wysiwygEditorMode )
-        {
+    private void closeHeadings() {
+        if( m_lastHeading != null && !m_wysiwygEditorMode ) {
             // Add the hash anchor element at the end of the heading
-            addElement( new Element("a").setAttribute( "class",HASHLINK ).setAttribute( "href","#"+m_lastHeading.m_titleAnchor ).setText( "#" ) );
+            addElement( new Element("a").setAttribute( "class",HASHLINK )
+                                              .setAttribute( "href","#" + m_lastHeading.m_titleAnchor )
+                                              .setText( "#" ) );
             m_lastHeading = null;
         }
-        popElement("h2");
-        popElement("h3");
-        popElement("h4");
+        popElement( "h2" );
+        popElement( "h3" );
+        popElement( "h4" );
     }
 
     /**
-     *  Parses the entire document from the Reader given in the constructor or
-     *  set by {@link #setInputReader(Reader)}.
+     *  Parses the entire document from the Reader given in the constructor or set by {@link #setInputReader(Reader)}.
      *
      *  @return A WikiDocument, ready to be passed to the renderer.
      *  @throws IOException If parsing cannot be accomplished.
      */
     @Override
-    public WikiDocument parse()
-        throws IOException
-    {
+    public WikiDocument parse() throws IOException {
         final WikiDocument d = new WikiDocument( m_context.getPage() );
         d.setContext( m_context );
-
-        final Element rootElement = new Element("domroot");
-
+        final Element rootElement = new Element( "domroot" );
         d.setRootElement( rootElement );
-
         fillBuffer( rootElement );
-
-        paragraphify(rootElement);
+        paragraphify( rootElement );
 
         return d;
     }
@@ -2502,55 +1948,45 @@ public class JSPWikiMarkupParser extends MarkupParser {
     /**
      *  Checks out that the first paragraph is correctly installed.
      *
-     *  @param rootElement
+     *  @param rootElement element to be checked.
      */
-    private void paragraphify( final Element rootElement)
-    {
-        //
+    private void paragraphify( final Element rootElement) {
         //  Add the paragraph tag to the first paragraph
-        //
         final List< Content > kids = rootElement.getContent();
-
-        if( rootElement.getChild("p") != null )
-        {
+        if( rootElement.getChild( "p" ) != null ) {
             final ArrayList<Content> ls = new ArrayList<>();
             int idxOfFirstContent = 0;
             int count = 0;
 
-            for( final Iterator< Content > i = kids.iterator(); i.hasNext(); count++ )
-            {
+            for( final Iterator< Content > i = kids.iterator(); i.hasNext(); count++ ) {
                 final Content c = i.next();
-                if( c instanceof Element )
-                {
+                if( c instanceof Element ) {
                     final String name = ( ( Element )c ).getName();
-                    if( isBlockLevel( name ) ) break;
+                    if( isBlockLevel( name ) ) {
+                        break;
+                    }
                 }
 
-                if( !(c instanceof ProcessingInstruction) )
-                {
+                if( !( c instanceof ProcessingInstruction ) ) {
                     ls.add( c );
-                    if( idxOfFirstContent == 0 ) idxOfFirstContent = count;
+                    if( idxOfFirstContent == 0 ) {
+                        idxOfFirstContent = count;
+                    }
                 }
             }
 
-            //
-            //  If there were any elements, then add a new <p> (unless it would
-            //  be an empty one)
-            //
-            if( ls.size() > 0 )
-            {
+            //  If there were any elements, then add a new <p> (unless it would be an empty one)
+            if( ls.size() > 0 ) {
                 final Element newel = new Element("p");
-
-                for (final Content c : ls) {
+                for( final Content c : ls ) {
                     c.detach();
-                    newel.addContent(c);
+                    newel.addContent( c );
                 }
 
-                //
                 // Make sure there are no empty <p/> tags added.
-                //
-                if( !newel.getTextTrim().isEmpty() || !newel.getChildren().isEmpty() )
-                    rootElement.addContent(idxOfFirstContent, newel);
+                if( !newel.getTextTrim().isEmpty() || !newel.getChildren().isEmpty() ) {
+                    rootElement.addContent( idxOfFirstContent, newel );
+                }
             }
         }
     }