/*
* Copyright (C) NetStruxr, Inc. All rights reserved.
*
* This software is published under the terms of the NetStruxr
* Public Software License version 0.5, a copy of which has been
* included with this distribution in the LICENSE.NPL file. */
package er.extensions.formatters;
import java.text.FieldPosition;
import java.text.ParsePosition;
import org.apache.commons.lang3.StringUtils;
/**
* This is a simple class for converting ASCII strings to HTML and vice versa.
* In the current implementation, all this class does is convert newlines to HTML breaks and
* tab characters to HTML <spacer> tags.
*/
public class ERXSimpleHTMLFormatter extends java.text.Format {
/**
* Do I need to update serialVersionUID?
* See section 5.6 <cite>Type Changes Affecting Serialization</cite> on page 51 of the
* <a href="http://java.sun.com/j2se/1.4/pdf/serial-spec.pdf">Java Object Serialization Spec</a>
*/
private static final long serialVersionUID = 1L;
/** holds the HTML return string */
private final static String HTMLReturn = "<br />";
/** holds the ASCII return string*/
// FIXME: Should support all the kinds of returns, see ERXStringWithLineBreaks
private final static String ASCIIReturn = "\n";
/** holds the ASCII tab string */
private final static String ASCIITab = "\t";
/** holds the reference to the shared formatter */
private static ERXSimpleHTMLFormatter _formatter;
/** holds a reference to the url of the spacer image */
private static String _HTMLTab;
/**
* Simple method used to get the url to the spacer gif
* s.gif from the WOResourceManager.
* @return url to the space gif image set in an image ref
*/
protected static String HTMLTab() {
if (_HTMLTab == null)
// A pixel size of 50 is arbitrary
// FIXME: Should be able to customize
// FIXME: Should have all framework name references broken out into
// a single entry off the principal class.
_HTMLTab = "<spacer width=\"50\" />";
return _HTMLTab;
}
/**
* Method used to retrieve the shared instance of the
* html formatter.
* @return shared instance of the html formatter
*/
public static ERXSimpleHTMLFormatter formatter() {
if (_formatter == null)
_formatter = new ERXSimpleHTMLFormatter();
return _formatter;
}
/**
* Converts an ASCII string into an HTML
* string.
* @param aString to be converted
* @return html-ified string
*/
// CHECKME: Should this method be static?
public String htmlStringFromString(String aString) {
String returnString = "";
try {
returnString = formatter().format(aString);
} catch (IllegalArgumentException e) {
returnString = aString;
}
return returnString;
}
/**
* The FieldPosition is not important, so this method
* just calls <code>applyFormat</code> and appends that
* string to the buffer.
* @param object to be formatted
* @param buffer to have the formatted object appended to
* @param fp ignored parameter
* @return buffer after having the format appended to it.
*/
@Override
public StringBuffer format(Object object, StringBuffer buffer, FieldPosition fp) {
// The value of fp does not matter in this case.
return buffer.append(applyFormat(object));
}
/**
* Applies the HTML formatting to a given string
* object replacing ASCII formatting with HTML
* formatting.
* @param anObject to have the formatting applied to
* @return formatted object
*/
public String applyFormat(Object anObject) throws IllegalArgumentException {
String newString;
if (anObject == null || !(anObject instanceof String))
return null;
// Convert tabs in the argument (which must be a String) to HTML spacers.
newString = StringUtils.replace((String)anObject, ASCIITab, HTMLTab());
// Convert new-lines in the argument (which must be a String) to HTML breaks.
return StringUtils.replace(newString, ASCIIReturn, HTMLReturn);
}
/**
* Converts an HTML string into an ASCII string.
* @param inString HTML string
* @return ASCII-fied string
*/
@Override
public Object parseObject(String inString) throws java.text.ParseException {
String newString;
if(inString == null)
return null;
// Convert new-lines in the argument (which must be a String) to HTML breaks.
newString = StringUtils.replace(inString, HTMLReturn, ASCIIReturn);
// Convert tabs in the argument (which must be a String) to HTML spacers.
return StringUtils.replace(newString, HTMLTab(), ASCIITab);
}
/**
* Converts an HTML string into an ASCII string
* starting from a given parse position.
* @param string HTML string
* @param p current parsing position
* @return ASCII representation of the string
*/
@Override
public Object parseObject(String string, ParsePosition p) {
int index = p.getIndex();
String substring = string.substring(index);
String result;
try {
result = (String)parseObject(substring);
p.setIndex(string.length() + 1);
} catch ( java.text.ParseException e) {
result = null;
}
return result;
}
/**
* Accessor method used to convert an ASCII
* string into an HTML string.
* @param anObject string to convert
*
*/
public String stringForObjectValue(Object anObject)
throws IllegalArgumentException
{ return applyFormat(anObject); }
}