/**   see http://128.100.250.10/snow/cnib/homestudy/contents.html for specs*/import java.io.*;public class BrailleOutputStream extends FilterOutputStream {  public final static char NUMBER  = '#';  public final static char LETTER  = ';';  public final static char CAPITAL = ',';    // implements braille 1 (few contractions)    protected StringBuffer buffer;  protected boolean inNumber=false, allCaps=false, timeOrMoney=false;  protected char lastChar = ' ';    public BrailleOutputStream(OutputStream out) {    super(out);    buffer = new StringBuffer();  }    public void write(byte b) throws IOException {    //System.out.println(buffer+" + "+(char)b);    if ( b > 64 && b < 91 && ! allCaps ) {      if (buffer.length() == 2 && buffer.charAt(0) == CAPITAL) {        buffer.insert(1, CAPITAL);        allCaps = true;      }      else if (buffer.length() == 3 && buffer.charAt(0) == CAPITAL && buffer.charAt(2) == '\'') {        buffer.insert(1, CAPITAL);        allCaps = true;      }      else buffer.append(CAPITAL);    }    char c = (char)b;    if ( c>96 && c<123 ) c -= 32;    if (!(isLetter(c) || c == '\'' || c == '-')) allCaps  = false;    if (timeOrMoney && c == '-')                inNumber = false;    if (c == '"') {      if (Character.isWhitespace(lastChar)) c = 'Ò';      else c = 'Ó';    }    if (!(isLetter(c) || c == '\'') && isWord(buffer.toString())) {      buffer = new StringBuffer(contract(buffer.toString()));      flushWord();    }    //System.out.println(buffer+" + "+c);    if (c == 'Ñ' || (c == '-' && lastChar == '-')) {      if (lastChar == '-') buffer.setLength(buffer.length()-1);      if (isWord(buffer.toString())) buffer = new StringBuffer(contract(buffer.toString()));      buffer.append("--");      inNumber = false;      allCaps  = false;      flushWord();    }    else if (inNumber) {      if (isLetter(c)) {        inNumber = false;        boolean cap = buffer.charAt(buffer.length()-1) == CAPITAL;        if (cap) buffer.setLength(buffer.length()-1);        if (isDigit(lastChar)) buffer.append(LETTER);        flushWord();        if (cap) buffer.append(CAPITAL);        buffer.append(get(c));      }      else if (Character.isWhitespace(c)) {        inNumber = false;        if (lastChar == '.') buffer.setCharAt(buffer.length()-1, '4');        buffer.append(c);        flushWord();      }      else if (c == '.') buffer.append('.');      else if (isDigit(c)) buffer.append(get(c));      else buffer.append(get(c));      if (c==':') timeOrMoney = true;    }    else if (!inNumber && isDigit(c)) {      //System.out.println("!inNumber && isDigit(c)  lastChar = "+lastChar);      inNumber = true;      timeOrMoney = (lastChar == '$');      if (lastChar == '.') {        buffer.insert(buffer.length()-1, NUMBER);        buffer.setCharAt(buffer.length()-1, '.');      }      else buffer.append(NUMBER);      buffer.append(get(c));    }    else {      buffer.append(get(c));      if (Character.isWhitespace(c)) flushWord();    }    lastChar = c;    //System.out.println(buffer);  }    public static String get(char c) {    //System.out.println("c="+c);    if      (c == '*') return "99";   // asterisk    else if (c == ':') return "3";    // colon    else if (c == ',') return "1";    // comma    else if (c == 'Ñ') return "--";   // dash    else if (c == 'É') return "'''";  // elipsis    else if (c == '!') return "6";    // !    else if (c == '(') return "7";    // open peren    else if (c == ')') return "7";    // close peren    else if (c == '.') return "4";    // period    else if (c == '?') return "8";    // ?    else if (c == ';') return "2";    // semicolon    else if (c == 'Ò') return "8";    // open  curly quotes    else if (c == 'Ó') return "0";    // close curly quotes    else if (c == 'Ô') return ",8";   // open  curly quote    else if (c == 'Õ') return "0,";   // close curly quote    else if (c == '[') return ",7";   // open  bracket    else if (c == ']') return "7,";   // close bracket    else if (c == '{') return ",7";   // open  brace    else if (c == '}') return "7,";   // close brace    else if (c == '$') return "4";    // dollar sign    else if (c == '¢') return "@C";   // cent sign    else if (c == '%') return "@3P";  // percent    else if (c == '1') return "A";    // 1    else if (c == '2') return "B";    // 2    else if (c == '3') return "C";    // 3    else if (c == '4') return "D";    // 4    else if (c == '5') return "E";    // 5    else if (c == '6') return "F";    // 6    else if (c == '7') return "G";    // 7    else if (c == '8') return "H";    // 8    else if (c == '9') return "I";    // 9    else if (c == '0') return "J";    // 0    else return ""+c;  }    public boolean isWord(String s) {    if (s == null || s.length() == 0) return false;    int i=0;    if (s.charAt(i) == CAPITAL) i++;    if (s.charAt(i) == CAPITAL) i++;    for( ; i<s.length(); i++) if (!isLetter(s.charAt(i))) return false;    return true;  }    public String contract(String s) {    return s;  }    public void flushWord() throws IOException {    //System.out.println("Writing...");    out.write(buffer.toString().getBytes());    buffer = new StringBuffer();  }    public void flush() throws IOException {    flushWord();    out.flush();  }    public static final boolean isLetter(char c) { return (c > 64 && c < 93) || (c > 96 && c < 123); }  public static final boolean isDigit (char c) { return (c > 47 && c < 58); }      // override filter class (which calls this directly on out    public void write(byte b[], int off, int len) throws IOException {    for (int i = 0 ; i < len ; i++) {      write(b[off + i]);    }  }      public static void main(String[] args) throws Exception {    BrailleOutputStream out = new BrailleOutputStream(System.out);    String s=args[0];    for(int i=1; i<args.length; i++) s = s + " " + args[i];    out.write(s.getBytes());  // String.getBytes() doesn't like the '¢' char    out.flush();    System.out.println();  }    }