/**
 * @(#)RHTMLEditorKit.java
 * Copyright 2001 Nomura Research Institute, LTD. All rights reserved.
 * RID-3 : RID HTML Document
 * @author  Intelligent Technology Inc.
 * @version 1.00 2001/10/01-2001/03/25
 * @see HTMLDocument
 */

package	jp.co.nri.rid.analyzer;

import	java.io.*;
import	javax.swing.text.*;
import	javax.swing.text.html.*;
import	javax.swing.text.html.parser.*;

/**
 * HTMLEditorKitをRidual用に拡張し様々な機能を付加したもの。
 */

public class RHTMLEditorKit extends HTMLEditorKit{
	private boolean ese;
	protected Parser getParser(){
		return new RParser();
	}
	
	public boolean isEmptyStack(){ return ese; }
	
	private class RParser extends ParserDelegator{
	    public void parse(Reader r, HTMLEditorKit.ParserCallback cb, boolean ignoreCharSet) throws IOException {
			new RDocumentParser(DTD.getDTD("html32")).parse(r, cb, ignoreCharSet);
	    }
	}
	
	private class RDocumentParser extends DocumentParser{
		private RHTMLDocument.RHTMLReader reader;
		private boolean end;
		
		public RDocumentParser(DTD dtd){ super(dtd); }
		
		public void parse(Reader in,  HTMLEditorKit.ParserCallback callback, boolean ignoreCharSet) throws IOException {
			reader	= (RHTMLDocument.RHTMLReader)callback;
			end		= false;
			ese		= false;
			super.parse(in ,callback ,ignoreCharSet);
    	}
		
		protected  void handleEndTag(TagElement tag){	// 終了タグを検出したときに呼び出されます。
			if(end){
				ese = true;
				return;
			}
			
			if("html".equalsIgnoreCase(tag.getHTMLTag().toString()))	end = true;
			super.handleEndTag(tag);
		}
		
		protected  void handleStartTg(TagElement tag){	// 開始タグを検出したときに呼び出されます。
			if(!end)	super.handleStartTag(tag);
			else		ese = true;
		}
		
		protected  void handleComment(char[] text){	// HTML のコメントを検出したときに呼び出されます。
			if(!end)	super.handleComment(text);
			else		ese = true;
		}
		
		protected  void handleEmptyTag(TagElement tag) throws ChangedCharSetException{	// 空のタグを検出したときに呼び出されます。
			if(!end)	super.handleEmptyTag(tag);
			else		ese = true;
		}
		
		protected  void handleText(char[] text){	// PCDATA を検出したときに呼び出されます。 
			if(!end)	super.handleText(text);
			else		ese = true;
		}
		
		protected  void handleTitle(char[] text){	// HTML の title タグを検出したときに呼び出されます。
			if(!end)	super.handleTitle(text);
			else		ese = true;
		}
	}

}
