// Job: Jay's Own Browser, a web browser written in Java by Jay Skeer // Copyright (C) 1996 Jay Skeer, Jay Prime Positive // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // /** Subclass of HtmlTokenStream which produces a stream of HtmlComponents */ import Jdb; import java.io.*; import HtmlToken; import HtmlTokenStream; import HtmlComponent; public class HtmlComponentStream extends HtmlTokenStream { /** Given a filename, construct a HtmlComponentStream */ public HtmlComponentStream(File file) throws IOException { super(file); } /** Given a filename, construct a HtmlComponentStream */ public HtmlComponentStream(String file) throws IOException { super(new File(file)); } public void close() throws IOException { super.close(); } public boolean eof() { return super.eof(); } /** Internal, given a token, return some kind of HtmlComponent */ private HtmlComponent tokenToComp(HtmlToken t) { HtmlComponent rv= null; if (HtmlToken.TEXT == t.id) { rv= new HtmlComponent(HtmlComponent.TEXT, t.value); rv.value= null; } else if (HtmlToken.HTML == t.id) { rv= new HtmlComponent(HtmlComponent.HTML); rv.value= "begin"; } else if (HtmlToken.HEAD == t.id) { rv= new HtmlComponent(HtmlComponent.HEAD); rv.value= "begin"; } else if (HtmlToken.TITLE == t.id) { rv= new HtmlComponent(HtmlComponent.TITLE); rv.value= "begin"; } else if (HtmlToken.BODY == t.id) { rv= new HtmlComponent(HtmlComponent.BODY); rv.value= "begin"; } else if (HtmlToken.H1 == t.id) { rv= new HtmlComponent(HtmlComponent.H1); rv.value= "begin"; } else if (HtmlToken.H2 == t.id) { rv= new HtmlComponent(HtmlComponent.H2); rv.value= "begin"; } else if (HtmlToken.H3 == t.id) { rv= new HtmlComponent(HtmlComponent.H3); rv.value= "begin"; } else if (HtmlToken.H4 == t.id) { rv= new HtmlComponent(HtmlComponent.H4); rv.value= "begin"; } else if (HtmlToken.H5 == t.id) { rv= new HtmlComponent(HtmlComponent.H5); rv.value= "begin"; } else if (HtmlToken.PRE == t.id) { rv= new HtmlComponent(HtmlComponent.PRE); rv.value= "begin"; } else if (HtmlToken.TT == t.id) { rv= new HtmlComponent(HtmlComponent.TT); rv.value= "begin"; } else if (HtmlToken.STRONG == t.id) { rv= new HtmlComponent(HtmlComponent.STRONG); rv.value= "begin"; } else if (HtmlToken.B == t.id) { rv= new HtmlComponent(HtmlComponent.B); rv.value= "begin"; } else if (HtmlToken.CENTER == t.id) { rv= new HtmlComponent(HtmlComponent.CENTER); rv.value= "begin"; } else if (HtmlToken.HR == t.id) { rv= new HtmlComponent(HtmlComponent.HR); rv.value= null; } else if (HtmlToken.P == t.id) { rv= new HtmlComponent(HtmlComponent.P, t.value); rv.value= null; } else if (HtmlToken.ANCHOR == t.id) { rv= new HtmlComponent(HtmlComponent.ANCHOR, t.value); rv.value= "begin"; } else if (HtmlToken.AHREF == t.id) { rv= new HtmlComponent(HtmlComponent.AHREF, t.value); rv.value= "begin"; } else if (HtmlToken.ANAME == t.id) { rv= new HtmlComponent(HtmlComponent.ANAME, t.value); rv.value= "begin"; } else if (HtmlToken.LIST == t.id) { rv= new HtmlComponent(HtmlComponent.LIST, t.value); rv.value= "begin"; } else if (HtmlToken.DL == t.id) { rv= new HtmlComponent(HtmlComponent.DL, t.value); rv.value= "begin"; } else if (HtmlToken.UL == t.id) { rv= new HtmlComponent(HtmlComponent.UL, t.value); rv.value= "begin"; } else if (HtmlToken.LI == t.id) { rv= new HtmlComponent(HtmlComponent.LI, t.value); rv.value= null; } else if (HtmlToken.DD == t.id) { rv= new HtmlComponent(HtmlComponent.DD); rv.value= null; } else if (HtmlToken.DT == t.id) { rv= new HtmlComponent(HtmlComponent.DT); rv.value= null; } else if (HtmlToken.IMG == t.id) { rv= new HtmlComponent(HtmlComponent.IMG, t.value); rv.value= null; } else { rv= new HtmlComponent(HtmlComponent.OTHER, t.value); rv.value= "begin"; } Jdb.trace("new HCS(String) => "+rv); return rv; } /** parses the current document. */ public HtmlComponent readHtmlAngleEnd() { //Jdb.enter("HCS.readHtmlAngleEnd()"); HtmlComponent rv= null; HtmlToken u; u= readToken(); if ((HtmlToken.CLOSE != u.id) && (HtmlToken.EOF != u.id)) { rv= tokenToComp(u); rv= readHtmlAngleOnly(rv); rv.value= "end"; } else { /* error */ rv= new HtmlComponent(HtmlComponent.OTHER, "error"); if (HtmlToken.EOF == u.id) unreadToken(u); } //Jdb.exit("HCS.readHtmlAngleEnd()"); return rv; } /** parses the current document. */ public HtmlComponent readHtmlAngleOnly(HtmlComponent rv) { //Jdb.enter("HCS.readHtmlAngleOnly()"); rv= readHtmlAngleArgList(rv); //Jdb.exit("HCS.readHtmlAngleOnly()"); return rv; } /** parses a aaa=bbb pair ...> */ public HtmlComponent readHtmlArg(String tag) { //Jdb.enter("HCS.readHtmlAngleArg()"); HtmlComponent rv= new HtmlComponent(HtmlComponent.ARG); HtmlToken name, eq, value; name= readToken(); if (HtmlToken.ID == name.id) { eq= readToken(); if (HtmlToken.EQUAL == eq.id) { value= readArgValueToken(tag, name.value); if (HtmlToken.EOF == value.id) { unreadToken(value); // value= new HtmlToken(HtmlToken.STRING); // value.value= new String(); } rv.name= name.value; rv.value= value.value; } else if (HtmlToken.EOF == eq.id) { unreadToken(eq); } } else if (HtmlToken.EOF == name.id) { unreadToken(name); } //Jdb.exit("HCS.readHtmlAngleArg()"); return rv; } /** parses the argument list in */ public HtmlComponent readHtmlAngleArgList(HtmlComponent rv) { //Jdb.enter("HCS.readHtmlAngleArgList()"); HtmlComponent av; HtmlToken t; t= readToken(); while ((HtmlToken.CLOSE != t.id) && (HtmlToken.EOF != t.id)) { unreadToken(t); av= readHtmlArg(rv.id_string); rv.addArg(av); t= readToken(); } if (HtmlToken.EOF == t.id) unreadToken(t); //Jdb.exit("HCS.readHtmlAngleArgList()"); return rv; } /** parses the current bbb document. */ public HtmlComponent readHtmlAngleBegin(HtmlComponent rv) { //Jdb.enter("HCS.readHtmlAngleBegin()"); HtmlToken t; t= readToken(); if ((HtmlToken.CLOSE != t.id) && (HtmlToken.EOF != t.id)) { unreadToken(t); rv= readHtmlAngleArgList(rv); } t= readToken(); HtmlComponent kv; boolean working= true; while ((HtmlToken.EOF != t.id) && working) { unreadToken(t); kv= readHtmlComponent(); if ((kv.id == rv.id) && (null != kv.value) && (kv.value.equalsIgnoreCase("end"))) { working= false; } else { //Jdb.trace("adding a kid == " + kv.toString()); rv.add(kv); //Jdb.trace("rv now is == " + rv.toString()); } t= readToken(); } rv.value= null; unreadToken(t); //Jdb.exit("HCS.readHtmlAngleBegin()"); //Jdb.exit("HCS.readHtmlAngleBegin() => " + rv.toString()); return rv; } /** parses a file into an html <...> document. */ public HtmlComponent readHtmlAngle() { //Jdb.enter("HCS.readHtmlAngle()"); HtmlToken t; HtmlComponent rv= null; t= readToken(); if (HtmlToken.END == t.id) { rv= readHtmlAngleEnd(); } else if ((HtmlToken.CLOSE != t.id) && (HtmlToken.EOF != t.id)) { rv= tokenToComp(t); //Jdb.trace("building a " + rv.toString()); if ((null != rv.value) && (rv.value.equalsIgnoreCase("begin"))) { rv= readHtmlAngleBegin(rv); } else { /* assume an "only" */ rv= readHtmlAngleOnly(rv); } } if (HtmlToken.EOF == t.id) unreadToken(t); //Jdb.exit("HCS.readHtmlAngle()"); //Jdb.exit("HCS.readHtmlAngle() => " + rv.toString()); return rv; } /** returns the next HtmlComponent from the stream. */ public HtmlComponent readHtmlComponent() { //Jdb.enter("HCS.readHtmlComponent()"); HtmlToken t; HtmlComponent rv= null; t= this.readToken(); if (HtmlToken.OPEN == t.id) { rv= readHtmlAngle(); } else { rv= tokenToComp(t); } //Jdb.exit("HCS.readHtmlComponent()"); //Jdb.exit("HCS.readHtmlComponent() => " + rv.toString()); return rv; } }