/* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
package netscape.plugin.composer.io;
import java.util.Enumeration;
/** Entities are multi-character combinations that start with '&', and end
* in ';'. They are used for two purposes:
*
* - To escape '&', and '<' in html.
*
- To enable the representation of unusual, or hard-to-input characters,
* such as , which is the entity for a non-breaking space character.
*
*
* @see netscape.plugin.composer.io.JavaScriptEntity
*/
public class Entity extends Token {
private String name;
private int ch;
/** Create an Entity from a string buffer.
* Such entities have a value of -1 during
* the time the design plugin is run.
*/
public Entity(StringBuffer s) {
name = s.toString();
ch = -1;
}
/** Enumerate the known entites.
* Note that there may be several entities with the same value.
* @return an enumeration of the known standard entities.
*/
public static Enumeration entities() {
return new EntityEnumeration(knownEntities);
}
/** Create an Entity from a string buffer.
* Such entities have a value of -1 during
* the time the design plugin is run.
*/
Entity(FooStringBuffer s) {
name = s.toString();
ch = -1;
}
/** Create an entity from a string and a value.
* Used to build up an internal list of
* legal entities.
*/
public Entity(String s, char c) {
name = s;
ch = (int) c;
}
/** Get the value for the entity. This is the
* unicode value of the entity, or else -1 if
* the entity is unknown.
*/
public int getValue() {
if (ch == -1) {
ch = evaluate();
}
return ch;
}
/** Internal function that actually evaluates the
* the entity. Returns -1 if the entity is unknown.
*/
protected int evaluate() {
try {
if (name.charAt(0) == '#') {
int value = 0;
int n = name.length();
for (int i = 1; i < n; i++) {
char c = name.charAt(i);
if ((c < '0') || (c > '9')) {
break;
}
value = value * 10 + (c - '0');
}
return value;
} else {
for (int i = 0; i < knownEntities.length; i++) {
if (knownEntities[i].name.equals(name)) {
return knownEntities[i].ch;
}
}
}
} catch (ArrayIndexOutOfBoundsException exc) {
}
return -1;
}
/** @return the html string representation of the entity.
*/
public String toString() {
return "&" + name + ";";
}
/** @return the hash code the entity.
*/
public int hashCode() {
if (ch == -1) {
ch = evaluate();
}
return name.hashCode() ^ ch;
}
/** @param other the object to test for equality.
* @return true if other is the same entity as this object.
*/
public boolean equals(Object other) {
if ((other != null) && (other instanceof Entity)) {
Entity o = (Entity) other;
return name.equals(o.name);
}
return false;
}
static private Entity knownEntities[] = new Entity[107];
static {
int i = 0;
knownEntities[i++] = new Entity("lt", '<');
knownEntities[i++] = new Entity("LT", '<');
knownEntities[i++] = new Entity("gt", '>');
knownEntities[i++] = new Entity("GT", '>');
knownEntities[i++] = new Entity("amp", '&');
knownEntities[i++] = new Entity("AMP", '&');
knownEntities[i++] = new Entity("quot", '\"');
knownEntities[i++] = new Entity("QUOT", '\"');
knownEntities[i++] = new Entity("nbsp", '\240');
knownEntities[i++] = new Entity("reg", '\256');
knownEntities[i++] = new Entity("REG", '\256');
knownEntities[i++] = new Entity("copy", '\251');
knownEntities[i++] = new Entity("COPY", '\251');
knownEntities[i++] = new Entity("iexcl", '\241');
knownEntities[i++] = new Entity("cent", '\242');
knownEntities[i++] = new Entity("pound", '\243');
knownEntities[i++] = new Entity("curren", '\244');
knownEntities[i++] = new Entity("yen", '\245');
knownEntities[i++] = new Entity("brvbar", '\246');
knownEntities[i++] = new Entity("sect", '\247');
knownEntities[i++] = new Entity("uml", '\250');
knownEntities[i++] = new Entity("ordf", '\252');
knownEntities[i++] = new Entity("laquo", '\253');
knownEntities[i++] = new Entity("not", '\254');
knownEntities[i++] = new Entity("shy", '\255');
knownEntities[i++] = new Entity("macr", '\257');
knownEntities[i++] = new Entity("deg", '\260');
knownEntities[i++] = new Entity("plusmn", '\261');
knownEntities[i++] = new Entity("sup2", '\262');
knownEntities[i++] = new Entity("sup3", '\263');
knownEntities[i++] = new Entity("acute", '\264');
knownEntities[i++] = new Entity("micro", '\265');
knownEntities[i++] = new Entity("para", '\266');
knownEntities[i++] = new Entity("middot", '\267');
knownEntities[i++] = new Entity("cedil", '\270');
knownEntities[i++] = new Entity("sup1", '\271');
knownEntities[i++] = new Entity("ordm", '\272');
knownEntities[i++] = new Entity("raquo", '\273');
knownEntities[i++] = new Entity("frac14", '\274');
knownEntities[i++] = new Entity("frac12", '\275');
knownEntities[i++] = new Entity("frac34", '\276');
knownEntities[i++] = new Entity("iquest", '\277');
knownEntities[i++] = new Entity("Agrave", '\300');
knownEntities[i++] = new Entity("Aacute", '\301');
knownEntities[i++] = new Entity("Acirc", '\302');
knownEntities[i++] = new Entity("Atilde", '\303');
knownEntities[i++] = new Entity("Auml", '\304');
knownEntities[i++] = new Entity("Aring", '\305');
knownEntities[i++] = new Entity("AElig", '\306');
knownEntities[i++] = new Entity("Ccedil", '\307');
knownEntities[i++] = new Entity("Egrave", '\310');
knownEntities[i++] = new Entity("Eacute", '\311');
knownEntities[i++] = new Entity("Ecirc", '\312');
knownEntities[i++] = new Entity("Euml", '\313');
knownEntities[i++] = new Entity("Igrave", '\314');
knownEntities[i++] = new Entity("Iacute", '\315');
knownEntities[i++] = new Entity("Icirc", '\316');
knownEntities[i++] = new Entity("Iuml", '\317');
knownEntities[i++] = new Entity("ETH", '\320');
knownEntities[i++] = new Entity("Ntilde", '\321');
knownEntities[i++] = new Entity("Ograve", '\322');
knownEntities[i++] = new Entity("Oacute", '\323');
knownEntities[i++] = new Entity("Ocirc", '\324');
knownEntities[i++] = new Entity("Otilde", '\325');
knownEntities[i++] = new Entity("Ouml", '\326');
knownEntities[i++] = new Entity("times", '\327');
knownEntities[i++] = new Entity("Oslash", '\330');
knownEntities[i++] = new Entity("Ugrave", '\331');
knownEntities[i++] = new Entity("Uacute", '\332');
knownEntities[i++] = new Entity("Ucirc", '\333');
knownEntities[i++] = new Entity("Uuml", '\334');
knownEntities[i++] = new Entity("Yacute", '\335');
knownEntities[i++] = new Entity("THORN", '\336');
knownEntities[i++] = new Entity("szlig", '\337');
knownEntities[i++] = new Entity("agrave", '\340');
knownEntities[i++] = new Entity("aacute", '\341');
knownEntities[i++] = new Entity("acirc", '\342');
knownEntities[i++] = new Entity("atilde", '\343');
knownEntities[i++] = new Entity("auml", '\344');
knownEntities[i++] = new Entity("aring", '\345');
knownEntities[i++] = new Entity("aelig", '\346');
knownEntities[i++] = new Entity("ccedil", '\347');
knownEntities[i++] = new Entity("egrave", '\350');
knownEntities[i++] = new Entity("eacute", '\351');
knownEntities[i++] = new Entity("ecirc", '\352');
knownEntities[i++] = new Entity("euml", '\353');
knownEntities[i++] = new Entity("igrave", '\354');
knownEntities[i++] = new Entity("iacute", '\355');
knownEntities[i++] = new Entity("icirc", '\356');
knownEntities[i++] = new Entity("iuml", '\357');
knownEntities[i++] = new Entity("eth", '\360');
knownEntities[i++] = new Entity("ntilde", '\361');
knownEntities[i++] = new Entity("ograve", '\362');
knownEntities[i++] = new Entity("oacute", '\363');
knownEntities[i++] = new Entity("ocirc", '\364');
knownEntities[i++] = new Entity("otilde", '\365');
knownEntities[i++] = new Entity("ouml", '\366');
knownEntities[i++] = new Entity("divide", '\367');
knownEntities[i++] = new Entity("oslash", '\370');
knownEntities[i++] = new Entity("ugrave", '\371');
knownEntities[i++] = new Entity("uacute", '\372');
knownEntities[i++] = new Entity("ucirc", '\373');
knownEntities[i++] = new Entity("uuml", '\374');
knownEntities[i++] = new Entity("yacute", '\375');
knownEntities[i++] = new Entity("thorn", '\376');
knownEntities[i++] = new Entity("yuml", '\377');
// the euro currency character
knownEntities[i++] = new Entity("euro", '\u20AC');
}
}
class EntityEnumeration implements Enumeration {
public EntityEnumeration(Entity[] entities){
this.entities = entities;
}
public boolean hasMoreElements(){
return index < entities.length;
}
public Object nextElement() {
if ( index >= entities.length ) {
throw new java.util.NoSuchElementException();
}
return entities[index++];
}
private Entity[] entities;
private int index;
}