/**   see http://www.shodor.org/braille/intro/rules/summary.html for specs  does only simple concatination, makes a lot of mistakes on when you can/can't do it*/import java.io.*;import java.util.*;public class Braille2OutputStream extends BrailleOutputStream {  public Braille2OutputStream(OutputStream out) { super(out); }  String[] wholeWord =      { "and" , "for", "of", "the", "with",        "child", "shall", "this", "which", "out",  "still",       "it", "not"  };  String[] wholeWordContractions =      { "&", "=", "(", "!", ")",        "*", "%", "?", ":", "\\", "/",       "X", "N"     };    String[] wholeWordLower =      { "his", "was", "were", "be", "in", "enough", "to", "into", "by" };  String[] wholeWordLowerContractions =      { "8", "0", "7", "2", "9", "5", "6", "I6", "0" };            String[] partWord  =      { "and" , "for", "of", "the", "with",        "ch", "sh", "th", "wh", "ou", "st",       "ar", "ed", "er", "gh", "ow",       "ing" };  String[] partWordContractions  =     {  "&", "=", "(", "!", ")",       "*", "%", "?", ":", "\\", "/",        ">", "$", "]", "<", "[",       "+" };         String[] notStartPartWord  =      { "less" , "ally", "ment", "en", "ance", "ness" };  String[] notStartPartWordContractions  =      { ".S", ",Y", "2T", "5", ".E", ";S" };         String[] shortWord  =      { "above" , "necessary", "be", "little", "immediate",        "good", "conceive", "afternoon", "perceive",       "after", "blind", "friend" };  String[] shortWordContractions  =      { "ABV" , "NEC", "2", "LL", "IMM",        "GD", "3CV", "AFN", "P]CV",       "AF", "BL", "FR" };       String[] doubleLetter  =      { "bb" , "cc", "dd", "ff", "gg", "ea" };  String[] doubleLetterContractions  =      { "2", ",3", "4", "6", "7", "1"};                Contraction[] contractions;     public String contract(String s) {  // should it be static?    int i;    if (contractions == null) contractions = getContractions();    //Vector possContractoins = new Vector();    //for(i=0; i<contractions.length; i++) possContractoins.addElement(contractions[i]);    Vector notDone = new Vector();    Vector done = new Vector();    boolean contracted;    String word, contract;    notDone.addElement(s);    while(notDone.size() > 0) {      word=(String)notDone.elementAt(0);      notDone.removeElementAt(0);      contracted=false;      for(i=0; i<contractions.length; i++) {        contract = contractions[i].applyTo(word);        if (contract != null) {          //System.out.println(word+" -> "+contract);          notDone.addElement(contract);          contracted = true;        }      }      if (!contracted) done.addElement(word);    }        contract = (String)done.elementAt(0);    for(i=1; i<done.size(); i++) {      if (contract.length() > ((String)done.elementAt(i)).length())        contract = ((String)done.elementAt(i));    }        return contract;  }    Contraction[] getContractions() {    Vector v = new Vector();    int i;        for(i=0; i<wholeWord.length; i++)      v.addElement(new WholeWordContraction(wholeWord[i], wholeWordContractions[i]));          for(i=0; i<wholeWordLower.length; i++)      v.addElement(new LWholeWordContraction(wholeWordLower[i], wholeWordLowerContractions[i]));          for(i=0; i<doubleLetter.length; i++)      v.addElement(new DoubleLetterContraction(doubleLetter[i], doubleLetterContractions[i]));          for(i=0; i<partWord.length; i++)      v.addElement(new PartWordContraction(partWord[i], partWordContractions[i]));          for(i=0; i<notStartPartWord.length; i++)      v.addElement(new NoStartPartWordContract(notStartPartWord[i], notStartPartWordContractions[i]));                for(i=0; i<shortWord.length; i++)      v.addElement(new PartWordContraction(shortWord[i], shortWordContractions[i]));                Contraction[] contractions = new Contraction[v.size()];    for(i=0; i<v.size(); i++) contractions[i] = (Contraction)v.elementAt(i);        return contractions;        }    public static void main(String[] args) {    Braille2OutputStream b2o = new Braille2OutputStream(null);    System.out.println();    for(int i=0; i<args.length; i++) {      System.out.println(args[i]+" = "+b2o.contract(args[i].toUpperCase()));    }  }    }