package nl.bluering;
import java.io.*;
import java.awt.TextArea;
import javax.swing.JTextArea;
/**
* This class provides the outputstream for writing Expressions
*/
public class ExpWriter
{
Writer out;
TextArea ta;
Syntelset library=Syntelset.getdefaultset();
// JTextArea jta;
public final static int PROLOG=1,XML=2,POSTSCRIPT=3;
int mode;
/**
* Constructs the stream to the given java Writer
*/
public ExpWriter(Writer a)
{this(a,PROLOG);}
public ExpWriter(Writer a,int mode)
{out=a;setmode(mode);}
public ExpWriter(File ff)
throws IOException
{out=new FileWriter(ff);}
public ExpWriter(TextArea t,int mode)
{ta=t;setmode(mode);}
ExpWriter setmode(int m)
{mode=m;return this;}
ExpWriter setmode(String m)
{
m=m.trim().toUpperCase();
if(m.equals("XML"))
return setmode(XML);
else if(m.equals("PROLOG"))
return setmode(PROLOG);
else if(m.equals("POSTSCRIPT"))
return setmode(POSTSCRIPT);
return this;
}
/**
* write the expression to the stream
*/
public void write(Expression e)
{
if(e==null)
return;
if(mode==XML)
writexml(e,true);
else if(mode==PROLOG)
writeprolog(e,Syntel.MAXLEVEL);
}
public boolean writexml(Expression e,boolean becareful)
{if(e.isbasic())
{
if (becareful)
{
write(""+xmlescape(e.getfunctionstring())+"\n");
return false;
}
else
{
write(xmlescape(e.getfunctionstring()));
return true;
}
}
if(e.getc()==0)
write("<"+e.getfunctionstring()+"/>\n");
else
{write("<"+e.getfunctionstring()+">\n");
becareful=false;
for(int i=0;i\n");
}
return false;
}
static String xmlescape(String s)
{int wrongchar=s.indexOf(">");
if(wrongchar!=-1)
return s.substring(0,wrongchar)+">"+xmlescape(s.substring(wrongchar+1));
wrongchar=s.indexOf("<");
if(wrongchar!=-1)
return s.substring(0,wrongchar)+"<"+xmlescape(s.substring(wrongchar+1));
wrongchar=s.indexOf("&");
if(wrongchar!=-1)
return s.substring(0,wrongchar)+"&"+xmlescape(s.substring(wrongchar+1));
return s;
}
public void writeprolog(Expression e,int level)
{
if (e.isbasic())
{
write(e.getfunctionstring());
return;
}
Syntel o=library.fnamefind(e.getfunctionstring(),e.getc());
if (o==null)
{
write(e.getfunctionstring());
write("(");
if(e.getc()>0)
writeprolog(e.get(0),Syntel.MAXLEVEL);
for(int i=1;i