in jspwiki-main/src/main/java/org/apache/wiki/parser/JSPWikiMarkupParser.java [864:1004]
private Element handleHyperlinks( String linktext, final int pos ) {
final ResourceBundle rb = Preferences.getBundle( m_context, InternationalizationManager.CORE_BUNDLE );
final StringBuilder sb = new StringBuilder( linktext.length() + 80 );
if( m_linkParsingOperations.isAccessRule( linktext ) ) {
return handleAccessRule( linktext );
}
if( m_linkParsingOperations.isMetadata( linktext ) ) {
return handleMetadata( linktext );
}
if( m_linkParsingOperations.isPluginLink( linktext ) ) {
try {
final PluginContent pluginContent = PluginContent.parsePluginLine( m_context, linktext, pos );
// This might sometimes fail, especially if there is something which looks like a plugin invocation but is really not.
if( pluginContent != null ) {
addElement( pluginContent );
pluginContent.executeParse( m_context );
}
} catch( final PluginException e ) {
LOG.info( m_context.getRealPage().getWiki() + " : " + m_context.getRealPage().getName() + " - Failed to insert plugin: " + e.getMessage() );
//LOG.info( "Root cause:",e.getRootThrowable() );
if( !m_wysiwygEditorMode ) {
final ResourceBundle rbPlugin = Preferences.getBundle( m_context, Plugin.CORE_PLUGINS_RESOURCEBUNDLE );
return addElement( makeError( MessageFormat.format( rbPlugin.getString( "plugin.error.insertionfailed" ),
m_context.getRealPage().getWiki(),
m_context.getRealPage().getName(),
e.getMessage() ) ) );
}
}
return m_currentElement;
}
try {
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 {
makeLink( EXTERNAL, linkref, linktext, null, link.getAttributes() );
addElement( outlinkImage() );
}
} else if( link.isInterwikiLink() ) {
// It's an interwiki link; InterWiki links also get added to external link chain after the links have been resolved.
// FIXME: There is an interesting issue here: We probably should
// URLEncode the wikiPage, but we can't since some of the
// Wikis use slashes (/), which won't survive URLEncoding.
// Besides, we don't know which character set the other Wiki
// is using, so you'll have to write the entire name as it appears
// in the URL. Bugger.
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 );
if( m_linkParsingOperations.isImageLink( urlReference, isImageInlining(), getInlineImagePatterns() ) ) {
handleImageLink( urlReference, linktext, link.hasReference() );
} else {
makeLink( INTERWIKI, urlReference, linktext, null, link.getAttributes() );
}
if( m_linkParsingOperations.isExternalLink( urlReference ) ) {
addElement( outlinkImage() );
}
} else {
final Object[] args = { TextUtil.escapeHTMLEntities( extWiki ) };
addElement( makeError( MessageFormat.format( rb.getString( "markupparser.error.nointerwikiref" ), args ) ) );
}
}
} else if( linkref.startsWith( "#" ) ) {
// It defines a local footnote
makeLink( LOCAL, linkref, linktext, null, link.getAttributes() );
} else if( TextUtil.isNumber( linkref ) ) {
// It defines a reference to a local footnote
makeLink( LOCALREF, linkref, linktext, null, link.getAttributes() );
} else {
final int hashMark;
// Internal wiki link, but is it an attachment link?
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() ) );
} else {
makeLink( ATTACHMENT, attachment, linktext, null, link.getAttributes() );
}
} 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 ) );
sectref = sectref.replace( '%', '_' );
makeLink( READ, matchedLink, linktext, sectref, link.getAttributes() );
} else {
makeLink( EDIT, linkref, linktext, null, link.getAttributes() );
}
} 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() );
} else {
makeLink( EDIT, linkref, linktext, null, link.getAttributes() );
}
}
}
} 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;
}