/**
* (c) 2011, Alejandro Serrano
* Released under the terms of the EPL.
*/
package net.sf.eclipsefp.haskell.browser.util;
import java.util.ArrayList;
import net.sf.eclipsefp.haskell.browser.items.PackageIdentifier;
import net.sf.eclipsefp.haskell.ui.internal.util.UITexts;
import org.apache.commons.lang3.StringEscapeUtils;
/**
* Generates Html for showing documentation in several places.
*
* @author Alejandro Serrano
*/
public class HtmlUtil {
private static void initialPart( final StringBuilder builder ) {
builder.append( "<html>" );
builder.append( "<body>" );
builder.append( "<div style=\"font-size: small\">" );
}
private static void finalPart( final StringBuilder builder ) {
builder.append( "</div>" );
builder.append( "</body>" );
builder.append( "</html>" );
}
private static void addDocs( final String docs, final StringBuilder builder ) {
if (docs!=null){
String[] paragraphs = docs.split( "\n\n" );
for( String paragraph: paragraphs ) {
builder.append( "<p>" );
builder.append( paragraph );
builder.append( "</p>" );
}
}
}
private static void addPackageModule(
final ArrayList<PackageIdentifier> pkgs, final String module,
final StringBuilder builder ) {
builder.append( "<p>" );
if( module != null ) {
builder.append( "<b>" );
builder.append( UITexts.browser_definedInModules );
builder.append( "</b>" );
builder.append( module );
}
if( pkgs != null ) {
if( module != null ) {
builder.append( "<br />" );
}
builder.append( "<b>" );
builder.append( UITexts.browser_packagedInPackages );
builder.append( "</b>" );
boolean first = true;
for( PackageIdentifier pkg: pkgs ) {
if( !first ) {
builder.append( ", " );
}
builder.append( pkg.toString() );
first = false;
}
}
builder.append( "</p>" );
}
/**
* Complete way to generate documentation.
*
* @param definition
* complete definition of the item to show
* @param pkgs
* list of packages where it is defined, or null to not show it
* @param module
* module where it is defined, or null to not show it
* @param inAtStart
* if true, the information about the item package+module will be
* shown before the docs, if false, it will be after
* @param docs
* documentation for the item
*/
public static String generateDocument( final String definition,
final ArrayList<PackageIdentifier> pkgs, final String module,
final boolean inAtStart, final String docs ) {
StringBuilder builder = new StringBuilder();
initialPart( builder );
if( definition != null ) {
builder.append( "<p style=\"font-family: monospace\">" );
builder.append( StringEscapeUtils.escapeHtml4( definition) );
builder.append( "</p>" );
}
if( inAtStart ) {
addPackageModule( pkgs, module, builder );
}
addDocs( docs, builder );
if( !inAtStart ) {
addPackageModule( pkgs, module, builder );
}
finalPart( builder );
return builder.toString();
}
/**
* Complete way to generate documentation, equivalent to
* {@link HtmlUtil#generateDocument(String, ArrayList, String, boolean, String)}
* but without package and module info.
*/
public static String generateDocument( final String definition,
final String docs ) {
return generateDocument( definition, null, null, true, docs );
}
public static String generateText ( final String text ) {
StringBuilder builder = new StringBuilder();
initialPart( builder );
builder.append( text );
finalPart( builder );
return builder.toString();
}
}