for( Iterator i = base.getContent().iterator(); i.hasNext(); )
{
Object c = i.next();
if( c instanceof Element )
{
Element e = (Element)c;
String n = e.getName().toLowerCase();
if( n.equals( "h1" ) )
{
m_out.print( "\n!!! " );
print( e );
m_out.println();
}
else if( n.equals( "h2" ) )
{
m_out.print( "\n!!! " );
print( e );
m_out.println();
}
else if( n.equals( "h3" ) )
{
m_out.print( "\n!! " );
print( e );
m_out.println();
}
else if( n.equals( "h4" ) )
{
m_out.print( "\n! " );
print( e );
m_out.println();
}
else if( n.equals( "p" ) )
{
if( e.getContentSize() != 0 ) // we don't want to print empty elements: <p></p>
{
m_out.println();
print( e );
m_out.println();
}
}
else if( n.equals( "br" ) )
{
if( m_preStack.isPreMode() )
{
m_out.println();
}
else
{
String parentElementName = base.getName().toLowerCase();
//
// To beautify the generated wiki markup, we print a newline character after a linebreak.
// It's only safe to do this when the parent element is a <p> or <div>; when the parent
// element is a table cell or list item, a newline character would break the markup.
// We also check that this isn't being done inside a plugin body.
//
if( parentElementName.matches( "p|div" )
&& !base.getText().matches( "(?s).*\\[\\{.*\\}\\].*" ) )
{
m_out.print( " \\\\\n" );
}
else
{
m_out.print( " \\\\" );
}
}
print( e );
}
else if( n.equals( "hr" ) )
{
m_out.println();
print( "----" );
print( e );
m_out.println();
}
else if( n.equals( "table" ) )
{
if( !m_outTimmer.isCurrentlyOnLineBegin() )
{
m_out.println();
}
print( e );
}
else if( n.equals( "tr" ) )
{
print( e );
m_out.println();
}
else if( n.equals( "td" ) )
{
m_out.print( "| " );
print( e );
if( !m_preStack.isPreMode() )
{
print( " " );
}
}
else if( n.equals( "th" ) )
{
m_out.print( "|| " );
print( e );
if( !m_preStack.isPreMode() )
{
print( " " );
}
}
else if( n.equals( "a" ) )
{
if( !isIgnorableWikiMarkupLink( e ) )
{
if( e.getChild( "IMG" ) != null )
{
printImage( e );
}
else
{
String ref = e.getAttributeValue( "href" );
if( ref == null )
{
if( isUndefinedPageLink( e ) )
{
m_out.print( "[" );
print( e );
m_out.print( "]" );
}
else
{
print( e );
}
}
else
{
ref = trimLink( ref );
if( ref != null )
{
if( ref.startsWith( "#" ) ) // This is a link to a footnote.
{
// convert "#ref-PageName-1" to just "1"
String href = ref.replaceFirst( "#ref-.+-(\\d+)", "$1" );
// remove the brackets around "[1]"
String textValue = e.getValue().substring( 1, (e.getValue().length() - 1) );
if( href.equals( textValue ) ){ // handles the simplest case. Example: [1]
print( e );
}
else{ // handles the case where the link text is different from the href. Example: [something|1]
m_out.print( "[" + textValue + "|" + href + "]" );
}
}
else
{
Map augmentedWikiLinkAttributes = getAugmentedWikiLinkAttributes( e );
m_out.print( "[" );
print( e );
if( !e.getTextTrim().equalsIgnoreCase( ref ) )
{
m_out.print( "|" );
print( ref );
if( !augmentedWikiLinkAttributes.isEmpty() )
{
m_out.print( "|" );
String augmentedWikiLink = augmentedWikiLinkMapToString( augmentedWikiLinkAttributes );
m_out.print( augmentedWikiLink );
}
}
else if( !augmentedWikiLinkAttributes.isEmpty() )
{
// If the ref has the same value as the text and also if there
// are attributes, then just print: [ref|ref|attributes] .
m_out.print( "|" + ref + "|" );
String augmentedWikiLink = augmentedWikiLinkMapToString( augmentedWikiLinkAttributes );
m_out.print( augmentedWikiLink );
}
m_out.print( "]" );
}
}
}
}
}
}
else if( n.equals( "b" ) || n.equals("strong") )
{
m_out.print( "__" );
print( e );
m_out.print( "__" );
}
else if( n.equals( "i" ) || n.equals("em") || n.equals( "address" ) )
{
m_out.print( "''" );
print( e );
m_out.print( "''" );
}
else if( n.equals( "u" ) )
{
m_out.print( "%%( text-decoration:underline; )" );
print( e );
m_out.print( "%%" );
}
else if( n.equals( "strike" ) )
{
m_out.print( "%%strike " );
print( e );
m_out.print( "%%" );
// NOTE: don't print a space before or after the double percents because that can break words into two.
// For example: %%(color:red)ABC%%%%(color:green)DEF%% is different from %%(color:red)ABC%% %%(color:green)DEF%%
}
else if( n.equals( "sup" ) )
{
m_out.print( "%%sup " );
print( e );
m_out.print( "%%" );
}
else if( n.equals( "sub" ) )
{
m_out.print( "%%sub " );
print( e );
m_out.print( "%%" );
}
else if( n.equals("dl") )
{
m_out.print( "\n" );
print( e );
// print a newline after the definition list. If we don't,
// it may cause problems for the subsequent element.
m_out.print( "\n" );
}
else if( n.equals("dt") )
{
m_out.print( ";" );
print( e );
}
else if( n.equals("dd") )
{
m_out.print( ":" );
print( e );
}
else if( n.equals( "ul" ) )
{
m_out.println();
m_liStack.push( "*" );
print( e );
m_liStack.pop();
}
else if( n.equals( "ol" ) )
{
m_out.println();
m_liStack.push( "#" );
print( e );
m_liStack.pop();
}
else if( n.equals( "li" ) )
{
m_out.print( m_liStack + " " );
print( e );
// The following line assumes that the XHTML has been "pretty-printed"
// (newlines separate child elements from their parents).
boolean lastListItem = base.indexOf( e ) == ( base.getContentSize() - 2 );
boolean sublistItem = m_liStack.toString().length() > 1;
// only print a newline if this <li> element is not the last item within a sublist.
if( !sublistItem || !lastListItem )
{
m_out.println();
}
}
else if( n.equals( "pre" ) )
{
m_out.print( "\n{{{" ); // start JSPWiki "code blocks" on its own line
m_preStack.push();
print( e );
m_preStack.pop();
// print a newline after the closing braces
// to avoid breaking any subsequent wiki markup that follows.
m_out.print( "}}}\n" );
}
else if( n.equals( "code" ) || n.equals( "tt" ) )
{
m_out.print( "{{" );
m_preStack.push();
print( e );
m_preStack.pop();
m_out.print( "}}" );
// NOTE: don't print a newline after the closing brackets because if the Text is inside
// a table or list, it would break it if there was a subsequent row or list item.
}
else if( n.equals( "img" ) )
{
if( !isIgnorableWikiMarkupLink( e ) )
{
m_out.print( "[" );
print( trimLink( e.getAttributeValue( "src" ) ) );
m_out.print( "]" );
}
}
else if( n.equals( "form" ) )
{
// remove the hidden input where name="formname" since a new one will be generated again when the xhtml is rendered.
Element formName = (Element)XPath.selectSingleNode( e, "INPUT[@name='formname']" );
if( formName != null )
{
formName.detach();
}
String name = e.getAttributeValue( "name" );
m_out.print( "\n[{FormOpen" );