package application.draw; import java.applet.Applet; import java.applet.AppletContext; import java.applet.AppletStub; import java.applet.AudioClip; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Image; import java.awt.Point; import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; import java.util.Enumeration; import java.util.Hashtable; import java.util.Iterator; import java.util.StringTokenizer; import java.util.Vector; import javax.swing.text.MutableAttributeSet; import javax.swing.text.html.HTML; import language.ALisp; import language.LispObject; public class HtmlEnvironment implements AppletStub,AppletContext { Figures figs; int x,y; int width,height; FigCanvas canvas; int currentX; int currentY; int currentLeftMergine=10; int currentHeadMergine=10; boolean settingCenter; String html; LispObject htmlObject; String codebase; String url; Vector subEnvs; ALisp lisp; DrawFrame gui; double sizeOfH1=24.0; double sizeOfH2=18.0; double sizeOfH3=14.0; double sizeOfNormal=11.0; double scale=1.0; Color fgColor=Color.black; Color bgColor=Color.white; int tabSize=10; int vSpace=15; int itemSymbolSize=10; AnOval itemSymbol; Font currentFont; Font previousFont; Font h1Font=new Font("Dialog", Font.BOLD, 24); Font h2Font=new Font("Dialog", Font.PLAIN, 22); Font h3Font =new Font("Dialog",Font.PLAIN, 18); Font h4Font = new Font("Dialog",Font.PLAIN, 14); Font normalFont = new Font("Dialog",Font.PLAIN, 11); Font smallFont = new Font("Dialog",Font.PLAIN, 9); Font italicFont = new Font("Dialog",Font.ITALIC,11); String currentHyperLink; String charSet = "utf-8"; HtmlEnvironment superEnv; public HtmlEnvironment(DrawFrame g,LispObject o,String u,ALisp l){ gui=g; this.canvas=g.canvas; this.width=canvas.getWidth(); this.height=canvas.getHeight(); this.x=0; this.y=0; currentX=this.x+this.currentLeftMergine; currentY=this.y+this.currentHeadMergine; this.htmlObject=o; this.url=u; this.codebase=makeCodebase(u); this.lisp=l; this.applets=new Hashtable(); this.settingCenter=false; this.currentFont=this.normalFont; this.previousFont=this.normalFont; this.currentHyperLink=null; } public HtmlEnvironment(HtmlEnvironment sEnv){ gui=sEnv.gui; this.canvas=sEnv.canvas; this.width=canvas.getWidth(); this.height=canvas.getHeight(); this.x=0; this.y=0; currentX=sEnv.currentX; currentY=sEnv.currentY; this.htmlObject=sEnv.htmlObject; this.url=sEnv.url; this.codebase=sEnv.codebase; this.lisp=sEnv.lisp; this.applets=new Hashtable(); this.superEnv=sEnv; this.settingCenter=sEnv.settingCenter; this.currentFont=sEnv.currentFont; this.previousFont=sEnv.previousFont; this.currentHyperLink=sEnv.currentHyperLink; } public void eval(){ eval(htmlObject); this.canvas.setPreferredSize(new Dimension(this.currentX,this.currentY)); this.canvas.revalidate(); this.canvas.vscrollbar.setMinimum(0); this.canvas.vscrollbar.setMaximum(this.currentY); this.canvas.vscrollbar.setValue(0); this.canvas.hscrollbar.setMinimum(0); this.canvas.hscrollbar.setMaximum(this.width); this.canvas.hscrollbar.setValue(0); if(this.currentY>this.height){ canvas.showScrollBar(canvas.vscrollbar.getID()); } else{ canvas.hideScrollBar(canvas.vscrollbar.getID()); } this.canvas.fs.setStep(-10); } public void eval(LispObject x){ // lisp.plist2("eval ",x); if(x==null) return; while(!lisp.Null(x)){ LispObject w=lisp.car(x); if(lisp.atom(w)){ return; } else if(isSingleTag(w)){ LispObject tagName=lisp.car(lisp.cdr(w)); LispObject clause=lisp.cdr(lisp.cdr(w)); applySingleTag(tagName,w,clause); return; } else if(isString(w)){ // writeString(w); } else if(isComment(w)){ System.out.println("comment"); } else if(isXmlDeclaration(w)){ System.out.println("xml-declaration"); LispObject tagName=lisp.car(lisp.cdr(w)); LispObject clause=lisp.cdr(lisp.cdr(w)); applySingleTag(tagName,w,clause); } else if(isTag(w)){ // return; LispObject first=w; LispObject tagName=lisp.car(lisp.cdr(first)); LispObject clause=lisp.cdr(x); apply(tagName,first,clause); return; } /* else if(firstIsString(x)){ LispObject s=lisp.car(x); writeString(s); } */ else{ eval(w); } x=lisp.cdr(x); } } public void evalHtml(LispObject x){ if(x==null) return; // while(!lisp.Null(x)){ // LispObject w=lisp.car(x); if(lisp.atom(x)){ return; } else if(isSingleTag(x)){ LispObject first=lisp.car(x); LispObject tagName=lisp.car(lisp.cdr(x)); LispObject clause=lisp.cdr(lisp.cdr(x)); applySingleTag(tagName,x,clause); } else if(isString(x)){ writeString(x); } else if(isComment(x)){ System.out.println("comment"); } else if(firstIsTag(x)){ // return; LispObject first=lisp.car(x); LispObject tagName=lisp.car(lisp.cdr(first)); LispObject clause=lisp.cdr(x); apply(tagName,first,clause); } /* else if(firstIsString(x)){ LispObject s=lisp.car(x); writeString(s); } */ else{ LispObject a=lisp.car(x); evalHtml(a); } // x=lisp.cdr(x); // } } public void evalHead(LispObject x){ if(x==null) return; // while(!lisp.Null(x)){ // LispObject w=lisp.car(x); if(lisp.atom(x)){ return; } else if(isSingleTag(x)){ LispObject first=lisp.car(x); LispObject tagName=lisp.car(lisp.cdr(x)); LispObject clause=lisp.cdr(lisp.cdr(x)); applySingleTag(tagName,x,clause); } else if(isString(x)){ // writeString(x); } else if(isComment(x)){ System.out.println("comment"); } else if(firstIsTag(x)){ // return; LispObject first=lisp.car(x); LispObject tagName=lisp.car(lisp.cdr(first)); LispObject clause=lisp.cdr(x); apply(tagName,first,clause); } /* else if(firstIsString(x)){ LispObject s=lisp.car(x); writeString(s); } */ else{ LispObject a=lisp.car(x); evalHead(a); } // x=lisp.cdr(x); // } } public boolean firstIsTag(LispObject x){ if(x==null) return false; if(lisp.Null(x)) return false; if(lisp.atom(x)) return false; LispObject first=lisp.car(x); if(!isTag(first)) return false; return true; } public boolean firstIsComment(LispObject x){ if(x==null) return false; if(lisp.Null(x)) return false; if(lisp.atom(x)) return false; LispObject first=lisp.car(x); if(!isComment(first)) return false; return true; } public boolean firstIsXmlDeclaration(LispObject x){ if(x==null) return false; if(lisp.Null(x)) return false; if(lisp.atom(x)) return false; LispObject first=lisp.car(x); if(!isXmlDeclaration(first)) return false; return true; } public boolean writeString(LispObject x){ if(x==null) return false; if(lisp.Null(x)) return false; if(lisp.atom(x)) return false; if(!isString(x)) return false; LispObject s=lisp.car(lisp.cdr(x)); String w=s.toString(); if(w.equals("\n")) return true; if(w.equals("\r")) return true; if(w.equals("\t")) return true; if(w.equals(" ")) return true; if(w.equals(" ")) return true; Vector txt=this.getFixedWidthText(this.width,this.currentFont,w); if(txt.size()<=0) return false; for(int i=0;iwidth){ // string x が幅を超えている場合 char c=w.charAt(0); if((c & 0x8000)!=0x0000){ // 多バイトコードの場合 for(int i=0;i0){ // 前の行に改行を加える。 String pl=(String)(text.elementAt(p-1)); if(p>0) pl=pl+"\n"; text.setElementAt(pl,p-1); } text.addElement(line); line=""; this.currentX=0; } } } else{ //1バイトコードの場合 int p=text.size(); if(p>0){ // 前の行に改行を加える。 String pl=(String)(text.elementAt(p-1)); pl=pl+"\n"; text.setElementAt(pl,p-1); } text.addElement(line); line=""; line=line+" "+w; this.currentX=0; } } else{ // string x が幅を超えていない場合 line=line+" "+w; } } // while 終了 if(!line.equals("")){ text.addElement(line); } return text; } public int getTextWidth(Font f,String x){ StringBuffer s=new StringBuffer(x); int height; int lines; int n; int p1,p2; int maxc; int maxl; int x2,y2; int maxlength=256; char buff[]; buff= new char[maxlength]; if(x.length()>maxlength){ System.out.println("too long string"); return this.width+1; } FontMetrics fmetrics=canvas.getFontMetrics(f); height=fmetrics.getMaxAscent()+fmetrics.getMaxDescent(); lines=0; n=0; p1=0; p2=0; maxl=0; maxc=0; while(s.length()>n){ if(s.charAt(n)=='\n'){ lines++; if(maxc0 && x2==0) x2=maxc*height; y2=(lines+1)*height; return x2; } public boolean isXTag(String key, LispObject x){ if(!(isTag(x)||isSingleTag(x))) return false; LispObject name=lisp.car(lisp.cdr(x)); if(lisp.eq(name,lisp.recSymbol(key))) return true; return false; } public boolean isTag(LispObject x){ if(lisp.Null(x)) return false; if(lisp.atom(x)) return false; LispObject first=lisp.car(x); if(lisp.eq(first,lisp.recSymbol("tag"))) return true; return false; } public boolean isString(LispObject x){ if(lisp.Null(x)) return false; if(lisp.atom(x)) return false; LispObject first=lisp.car(x); if(lisp.eq(first,lisp.recSymbol("string"))) return true; return false; } public boolean firstIsString(LispObject x){ if(lisp.atom(x)) return false; LispObject a=lisp.car(x); return isString(a); } public boolean isSingleTag(LispObject x){ if(lisp.Null(x)) return false; if(lisp.atom(x)) return false; LispObject first=lisp.car(x); if(lisp.eq(first,lisp.recSymbol("stag"))) return true; return false; } public boolean isComment(LispObject x){ if(lisp.Null(x)) return false; if(lisp.atom(x)) return false; LispObject first=lisp.car(x); if(lisp.eq(first,lisp.recSymbol("!"))) return true; return false; } public boolean isXmlDeclaration(LispObject x){ if(lisp.Null(x)) return false; if(lisp.atom(x)) return false; LispObject first=lisp.car(x); if(lisp.eq(first,lisp.recSymbol("xml-dcl"))) return true; return false; } public boolean firstIsSingleTag(LispObject x){ if(lisp.atom(x)) return false; LispObject a=lisp.car(x); return isSingleTag(a); } public boolean firstIsHtml(LispObject x){ if(lisp.atom(x)) return false; LispObject a=lisp.car(x); if(!isTag(a)) return false; if(lisp.equal(lisp.car(lisp.cdr(x)), lisp.recSymbol("html"))) return true; if(lisp.equal(lisp.car(lisp.cdr(x)), lisp.recSymbol("HTML"))) return true; return false; } public void apply(LispObject tagName, LispObject tag, LispObject clause){ System.out.println("apply "+tagName.toString()); // lisp.plist2("---",clause); if(lisp.equal(tagName,lisp.recSymbol("html"))|| lisp.equal(tagName,lisp.recSymbol("HTML"))){ while(!lisp.Null(clause)){ // LispObject w=lisp.car(clause); this.evalHtml(clause); clause=lisp.cdr(clause); } // this.evalHtml(clause); return; } if(lisp.equal(tagName,lisp.recSymbol("head"))|| lisp.equal(tagName,lisp.recSymbol("HEAD"))){ while(!lisp.Null(clause)){ // LispObject w=lisp.car(clause); this.evalHead(clause); clause=lisp.cdr(clause); } // this.evalHtml(clause); // lisp.plist2("head ",clause); return; } if(lisp.equal(tagName,lisp.recSymbol("title"))|| lisp.equal(tagName,lisp.recSymbol("TITLE"))){ lisp.plist2("title ",clause); return; } if(lisp.equal(tagName,lisp.recSymbol("body"))|| lisp.equal(tagName,lisp.recSymbol("BODY"))){ // lisp.plist2("body ",clause); while(!lisp.Null(clause)){ // LispObject x=lisp.car(clause); this.evalHtml(clause); clause=lisp.cdr(clause); } // this.evalHtml(clause); return; } if(lisp.equal(tagName,lisp.recSymbol("a"))|| lisp.equal(tagName,lisp.recSymbol("A"))){ Vector attr=this.getTagAttributes(tag); String urlx=""; if(attr!=null){ int maxattr=attr.size(); for(int i=0;i0) return; Hashtable p=getTagAttributes2(tag); String method=(String)(p.get("method")); this.charSet=(String)(p.get("charset")); xmlDecTimes++; } public boolean isParam(LispObject x){ if(lisp.Null(x)) return false; if(lisp.atom(x)) return false; LispObject first=lisp.car(x); if(lisp.eq(first,lisp.recSymbol("param"))) return true; return false; } public void evalApplet(LispObject tag, LispObject clause){ while(!lisp.Null(clause)){ LispObject t=lisp.car(clause); if(isParam(t)){ Vector p=getTagAttributes(t); if(p!=null){ StringPair px=(StringPair)(p.elementAt(0)); if(px.l.equals("name")||px.l.equals("NAME")){ } } } clause=lisp.cdr(clause); } String appletName=""; String codebase=""; int width=0; int height=0; Vector a=this.getTagAttributes(tag); if(a==null) return; int na=a.size(); for(int i=0;i <2> <3> ...), w=(<1> <2> <3> ...) if(lisp.Null(w)) return null; w=lisp.cdr(w); // w=(<2> <3> ...) while(!lisp.Null(w)){ LispObject u=lisp.car(w); if(isString(u)){ LispObject s=lisp.car(lisp.cdr(u)); String attrs=s.toString(); if(attrs.indexOf(" ")!=0){ StringTokenizer st=new StringTokenizer(attrs," =",true); int lr=0; StringPair pair=new StringPair(); while(st.hasMoreElements()){ String xx=st.nextToken(); if(!xx.equals("=")){ if(xx.equals("\n")){} else if(xx.equals("\t")){} else if(xx.equals("\r")){} if(xx.equals("\f")){} else if(xx.equals(" ")){} else{ if(lr==0) pair.l=xx; if(lr==1){ pair.r=xx; rtn.add(pair); lr=0; } } } else { lr=1; } } } } w=lisp.cdr(w); } return rtn; } public Hashtable getTagAttributes2(LispObject x){ if(!(isTag(x)||isSingleTag(x))) return null; Hashtable rtn=new Hashtable(); LispObject w=lisp.cdr(x); //x=(tag <1> <2> <3> ...), w=(<1> <2> <3> ...) if(lisp.Null(w)) return null; w=lisp.cdr(w); // w=(<2> <3> ...) while(!lisp.Null(w)){ LispObject u=lisp.car(w); if(isString(u)){ LispObject s=lisp.car(lisp.cdr(u)); String attrs=s.toString(); if(attrs.indexOf(" ")!=0){ StringTokenizer st=new StringTokenizer(attrs," =",true); int lr=0; StringPair pair=new StringPair(); while(st.hasMoreElements()){ String xx=st.nextToken(); if(!xx.equals("=")){ if(xx.equals("\n")){} else if(xx.equals("\t")){} else if(xx.equals("\r")){} if(xx.equals("\f")){} else if(xx.equals(" ")){} else{ if(lr==0) pair.l=xx.toLowerCase(); if(lr==1){ pair.r=this.removeDoubleQuotes(xx); rtn.put(pair.l, pair.r); lr=0; } } } else { lr=1; } } } } w=lisp.cdr(w); } return rtn; } public void evalMeta(LispObject tag,LispObject clause){ Vector attr=this.getTagAttributes(tag); String httpEquiv=""; String content=""; if(attr!=null){ int maxattr=attr.size(); for(int i=0;i