home *** CD-ROM | disk | FTP | other *** search
/ Tools / WinSN5.0Ver.iso / NETSCAP.50 / WIN1998.ZIP / ns / modules / edtplug / classes / netscape / plugin / composer / io / Entity.java < prev    next >
Encoding:
Java Source  |  1998-04-08  |  10.0 KB  |  288 lines

  1. /* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
  2.  *
  3.  * The contents of this file are subject to the Netscape Public License
  4.  * Version 1.0 (the "NPL"); you may not use this file except in
  5.  * compliance with the NPL.  You may obtain a copy of the NPL at
  6.  * http://www.mozilla.org/NPL/
  7.  *
  8.  * Software distributed under the NPL is distributed on an "AS IS" basis,
  9.  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
  10.  * for the specific language governing rights and limitations under the
  11.  * NPL.
  12.  *
  13.  * The Initial Developer of this code under the NPL is Netscape
  14.  * Communications Corporation.  Portions created by Netscape are
  15.  * Copyright (C) 1998 Netscape Communications Corporation.  All Rights
  16.  * Reserved.
  17.  */
  18.  
  19. package netscape.plugin.composer.io;
  20. import java.util.Enumeration;
  21.  
  22. /** Entities are multi-character combinations that start with '&', and end
  23.  * in ';'. They are used for two purposes:
  24.  * <ol>
  25.  * <li> To escape '&', and '<' in html.
  26.  * <li> To enable the representation of unusual, or hard-to-input characters,
  27.  * such as &nbsp;, which is the entity for a non-breaking space character.
  28.  * </ol>
  29.  *
  30.  * @see netscape.plugin.composer.io.JavaScriptEntity
  31.  */
  32.  
  33. public class Entity extends Token {
  34.   private String name;
  35.   private int ch;
  36.  
  37.   /** Create an Entity from a string buffer.
  38.    * Such entities have a value of -1 during
  39.    * the time the design plugin is run.
  40.    */
  41.   public Entity(StringBuffer s) {
  42.     name = s.toString();
  43.     ch = -1;
  44.   }
  45.  
  46.   /** Enumerate the known entites.
  47.    * Note that there may be several entities with the same value.
  48.    * @return an enumeration of the known standard entities.
  49.    */
  50.   public static Enumeration entities() {
  51.     return new EntityEnumeration(knownEntities);
  52.   }
  53.  
  54.   /** Create an Entity from a string buffer.
  55.    * Such entities have a value of -1 during
  56.    * the time the design plugin is run.
  57.    */
  58.   Entity(FooStringBuffer s) {
  59.     name = s.toString();
  60.     ch = -1;
  61.   }
  62.  
  63.   /** Create an entity from a string and a value.
  64.    * Used to build up an internal list of
  65.    * legal entities.
  66.    */
  67.   public Entity(String s, char c) {
  68.     name = s;
  69.     ch = (int) c;
  70.   }
  71.  
  72.   /** Get the value for the entity. This is the
  73.    * unicode value of the entity, or else -1 if
  74.    * the entity is unknown.
  75.    */
  76.   public int getValue() {
  77.     if (ch == -1) {
  78.       ch = evaluate();
  79.     }
  80.     return ch;
  81.   }
  82.  
  83.   /** Internal function that actually evaluates the
  84.    * the entity. Returns -1 if the entity is unknown.
  85.    */
  86.  
  87.   protected int evaluate() {
  88.     try {
  89.       if (name.charAt(0) == '#') {
  90.     int value = 0;
  91.     int n = name.length();
  92.     for (int i = 1; i < n; i++) {
  93.       char c = name.charAt(i);
  94.       if ((c < '0') || (c > '9')) {
  95.         break;
  96.       }
  97.       value = value * 10 + (c - '0');
  98.     }
  99.     return value;
  100.       } else {
  101.     for (int i = 0; i < knownEntities.length; i++) {
  102.       if (knownEntities[i].name.equals(name)) {
  103.         return knownEntities[i].ch;
  104.       }
  105.     }
  106.       }
  107.     } catch (ArrayIndexOutOfBoundsException exc) {
  108.     }
  109.     return -1;
  110.   }
  111.  
  112.   /** @return the html string representation of the entity.
  113.    */
  114.   public String toString() {
  115.     return "&" + name + ";";
  116.   }
  117.  
  118.   /** @return the hash code the entity.
  119.    */
  120.   public int hashCode() {
  121.     if (ch == -1) {
  122.       ch = evaluate();
  123.     }
  124.     return name.hashCode() ^ ch;
  125.   }
  126.  
  127.   /** @param other the object to test for equality.
  128.    * @return true if other is the same entity as this object.
  129.    */
  130.   public boolean equals(Object other) {
  131.     if ((other != null) && (other instanceof Entity)) {
  132.       Entity o = (Entity) other;
  133.       return name.equals(o.name);
  134.     }
  135.     return false;
  136.   }
  137.  
  138.   static private Entity knownEntities[] = new Entity[106];
  139.   static {
  140.     int i = 0;
  141.  
  142.     knownEntities[i++] = new Entity("lt", '<');
  143.     knownEntities[i++] = new Entity("LT", '<');
  144.     knownEntities[i++] = new Entity("gt", '>');
  145.     knownEntities[i++] = new Entity("GT", '>');
  146.     knownEntities[i++] = new Entity("amp", '&');
  147.  
  148.     knownEntities[i++] = new Entity("AMP", '&');
  149.     knownEntities[i++] = new Entity("quot", '\"');
  150.     knownEntities[i++] = new Entity("QUOT", '\"');
  151.     knownEntities[i++] = new Entity("nbsp", '\240');
  152.     knownEntities[i++] = new Entity("reg", '\256');
  153.  
  154.     knownEntities[i++] = new Entity("REG", '\256');
  155.     knownEntities[i++] = new Entity("copy", '\251');
  156.     knownEntities[i++] = new Entity("COPY", '\251');
  157.     knownEntities[i++] = new Entity("iexcl", '\241');
  158.     knownEntities[i++] = new Entity("cent", '\242');
  159.  
  160.     knownEntities[i++] = new Entity("pound", '\243');
  161.     knownEntities[i++] = new Entity("curren", '\244');
  162.     knownEntities[i++] = new Entity("yen", '\245');
  163.     knownEntities[i++] = new Entity("brvbar", '\246');
  164.     knownEntities[i++] = new Entity("sect", '\247');
  165.  
  166.     knownEntities[i++] = new Entity("uml", '\250');
  167.     knownEntities[i++] = new Entity("ordf", '\252');
  168.     knownEntities[i++] = new Entity("laquo", '\253');
  169.     knownEntities[i++] = new Entity("not", '\254');
  170.     knownEntities[i++] = new Entity("shy", '\255');
  171.  
  172.     knownEntities[i++] = new Entity("macr", '\257');
  173.     knownEntities[i++] = new Entity("deg", '\260');
  174.     knownEntities[i++] = new Entity("plusmn", '\261');
  175.     knownEntities[i++] = new Entity("sup2", '\262');
  176.     knownEntities[i++] = new Entity("sup3", '\263');
  177.  
  178.     knownEntities[i++] = new Entity("acute", '\264');
  179.     knownEntities[i++] = new Entity("micro", '\265');
  180.     knownEntities[i++] = new Entity("para", '\266');
  181.     knownEntities[i++] = new Entity("middot", '\267');
  182.     knownEntities[i++] = new Entity("cedil", '\270');
  183.  
  184.     knownEntities[i++] = new Entity("sup1", '\271');
  185.     knownEntities[i++] = new Entity("ordm", '\272');
  186.     knownEntities[i++] = new Entity("raquo", '\273');
  187.     knownEntities[i++] = new Entity("frac14", '\274');
  188.     knownEntities[i++] = new Entity("frac12", '\275');
  189.  
  190.     knownEntities[i++] = new Entity("frac34", '\276');
  191.     knownEntities[i++] = new Entity("iquest", '\277');
  192.     knownEntities[i++] = new Entity("Agrave", '\300');
  193.     knownEntities[i++] = new Entity("Aacute", '\301');
  194.     knownEntities[i++] = new Entity("Acirc", '\302');
  195.  
  196.     knownEntities[i++] = new Entity("Atilde", '\303');
  197.     knownEntities[i++] = new Entity("Auml", '\304');
  198.     knownEntities[i++] = new Entity("Aring", '\305');
  199.     knownEntities[i++] = new Entity("AElig", '\306');
  200.     knownEntities[i++] = new Entity("Ccedil", '\307');
  201.  
  202.     knownEntities[i++] = new Entity("Egrave", '\310');
  203.     knownEntities[i++] = new Entity("Eacute", '\311');
  204.     knownEntities[i++] = new Entity("Ecirc", '\312');
  205.     knownEntities[i++] = new Entity("Euml", '\313');
  206.     knownEntities[i++] = new Entity("Igrave", '\314');
  207.  
  208.     knownEntities[i++] = new Entity("Iacute", '\315');
  209.     knownEntities[i++] = new Entity("Icirc", '\316');
  210.     knownEntities[i++] = new Entity("Iuml", '\317');
  211.     knownEntities[i++] = new Entity("ETH", '\320');
  212.     knownEntities[i++] = new Entity("Ntilde", '\321');
  213.  
  214.     knownEntities[i++] = new Entity("Ograve", '\322');
  215.     knownEntities[i++] = new Entity("Oacute", '\323');
  216.     knownEntities[i++] = new Entity("Ocirc", '\324');
  217.     knownEntities[i++] = new Entity("Otilde", '\325');
  218.     knownEntities[i++] = new Entity("Ouml", '\326');
  219.  
  220.     knownEntities[i++] = new Entity("times", '\327');
  221.     knownEntities[i++] = new Entity("Oslash", '\330');
  222.     knownEntities[i++] = new Entity("Ugrave", '\331');
  223.     knownEntities[i++] = new Entity("Uacute", '\332');
  224.     knownEntities[i++] = new Entity("Ucirc", '\333');
  225.  
  226.     knownEntities[i++] = new Entity("Uuml", '\334');
  227.     knownEntities[i++] = new Entity("Yacute", '\335');
  228.     knownEntities[i++] = new Entity("THORN", '\336');
  229.     knownEntities[i++] = new Entity("szlig", '\337');
  230.     knownEntities[i++] = new Entity("agrave", '\340');
  231.  
  232.     knownEntities[i++] = new Entity("aacute", '\341');
  233.     knownEntities[i++] = new Entity("acirc", '\342');
  234.     knownEntities[i++] = new Entity("atilde", '\343');
  235.     knownEntities[i++] = new Entity("auml", '\344');
  236.     knownEntities[i++] = new Entity("aring", '\345');
  237.  
  238.     knownEntities[i++] = new Entity("aelig", '\346');
  239.     knownEntities[i++] = new Entity("ccedil", '\347');
  240.     knownEntities[i++] = new Entity("egrave", '\350');
  241.     knownEntities[i++] = new Entity("eacute", '\351');
  242.     knownEntities[i++] = new Entity("ecirc", '\352');
  243.  
  244.     knownEntities[i++] = new Entity("euml", '\353');
  245.     knownEntities[i++] = new Entity("igrave", '\354');
  246.     knownEntities[i++] = new Entity("iacute", '\355');
  247.     knownEntities[i++] = new Entity("icirc", '\356');
  248.     knownEntities[i++] = new Entity("iuml", '\357');
  249.  
  250.     knownEntities[i++] = new Entity("eth", '\360');
  251.     knownEntities[i++] = new Entity("ntilde", '\361');
  252.     knownEntities[i++] = new Entity("ograve", '\362');
  253.     knownEntities[i++] = new Entity("oacute", '\363');
  254.     knownEntities[i++] = new Entity("ocirc", '\364');
  255.  
  256.     knownEntities[i++] = new Entity("otilde", '\365');
  257.     knownEntities[i++] = new Entity("ouml", '\366');
  258.     knownEntities[i++] = new Entity("divide", '\367');
  259.     knownEntities[i++] = new Entity("oslash", '\370');
  260.     knownEntities[i++] = new Entity("ugrave", '\371');
  261.  
  262.     knownEntities[i++] = new Entity("uacute", '\372');
  263.     knownEntities[i++] = new Entity("ucirc", '\373');
  264.     knownEntities[i++] = new Entity("uuml", '\374');
  265.     knownEntities[i++] = new Entity("yacute", '\375');
  266.     knownEntities[i++] = new Entity("thorn", '\376');
  267.  
  268.     knownEntities[i++] = new Entity("yuml", '\377');
  269.   }
  270. }
  271.  
  272. class EntityEnumeration implements Enumeration {
  273.     public EntityEnumeration(Entity[] entities){
  274.         this.entities = entities;
  275.     }
  276.     public boolean hasMoreElements(){
  277.         return index < entities.length;
  278.     }
  279.     public Object nextElement() {
  280.         if ( index >= entities.length ) {
  281.             throw new java.util.NoSuchElementException();
  282.         }
  283.         return entities[index++];
  284.     }
  285.     private Entity[] entities;
  286.     private int index;
  287. }
  288.