⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wmlparser.java

📁 一款WAP浏览器的J2ME源码
💻 JAVA
字号:
/********************************************************************
 * 项目名称				:<b>j2me学习 J2me Wap Explorer</b>			<br/>
 * 
 * Copyright 2005-2006 Wuhua. All rights reserved </br>
 *
 * 本程序只用于学习目的,不能用于商业目的。如有需要请联系作者
 ********************************************************************/
package org.wuhua.wap.wml;

import java.io.IOException;
import java.io.InputStream;
import java.util.Hashtable;
import java.util.Vector;

import org.kxml2.io.KXmlParser;
import org.wuhua.wap.log.Logger;
import org.wuhua.wap.main.MainForm;
import org.wuhua.wap.ui.Part;
import org.wuhua.wap.ui.WAPGUIFactory;
import org.wuhua.wap.ui.skin.Style;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;

/**
 * <b>类名:WmlParser.java</b> </br> 编写日期: 2006-12-29 <br/> 程序功能描述:WML的解释器 <br/>
 * Demo: <br/> Bug: <br/>
 * 
 * 程序变更日期 :<br/> 变更作者 :<br/> 变更说明 :<br/>
 * 
 * @author wuhua </br> <a href="mailto:rrq12345@163.com">rrq12345@163.com</a>
 */
public final class WmlParser implements Parser {
	private static Logger logger = Logger.getLogger("WmlParser");
	/**
	 * Wap GUI集合
	 */
	private   Vector parts = new Vector();;
	private   Part part;
	 
	private   Hashtable attr = new Hashtable();
 
	
	/**
	 * 当前标记,通过当前标记来创建Wap UI.
	 */
	private   String currentTag;
	
	/**
	 * 创建当前Align.
	 */
	private String align;
	KXmlParser parser;
	
	
	/**
	 * 边解释边显示
	 */
	MainForm mainForm;
	
	private WmlParser(){
		parser = new KXmlParser();
		 
	}
	
	public static WmlParser getWmlParser() {
		return new WmlParser();
	}
	 
	/**
	 * 解释wml,并生成一系列的Wap GUI部件。
	 * 比如遇到<a href="index.wml">首页</a> 则对于的生成一个 HyperLink;
	 * @see WAPGUIFactory.createHyperLink(String text, String url,
			String algin) ;
	 * @param in -- 通过Net获取InputStream
	 * @return -- 返回一个Vector集,里面包含了,Wap GUI
	 * @throws XmlPullParserException -- 解释出错的时候抛出异常
	 * @throws IOException -- 读取数据的时候抛出异常
	 */
	public final   void parser()
			throws XmlPullParserException, IOException {
		if(parser == null)
			throw new XmlPullParserException("Parser is Null");

		int eventType = parser.getEventType();
		while (eventType != XmlPullParser.END_DOCUMENT) {
			if (eventType == XmlPullParser.START_DOCUMENT) {
				 
			} else if (eventType == XmlPullParser.END_DOCUMENT) {
				 
			} else if (eventType == XmlPullParser.START_TAG) {
				parserWapTagImpl(parser );
			 
			} else if (eventType == XmlPullParser.END_TAG) {
			 
			} else if (eventType == XmlPullParser.TEXT) {
				parserTextImpl(parser);
			}
			eventType = parser.next();
		}
		//return parts;
	}

	
	private void parserTextImpl(KXmlParser parser) {
		//logger.debug("The Two parser ... ");
		parserAlign();
		
		if(currentTag.equals(WmlTag.P_TAG)){
			paserStringPart();
		}else if(currentTag.equals(WmlTag.A_TAG)){
			 parserHyperLinkImpl(parser);
		}else if(currentTag.equals(WmlTag.BR_TAG)){
			parserBrTextImpl();
		}
		
		paintMainform();
	}

	/**
	 * 处理<br/>标记
	 * 比如:   -----<br/>
	 * <br/> ------
	 * 则创建StringPart("---------")并且设计环行
	 * @param parser2
	 */
	private void parserBrTextImpl() {
		paserStringPart();
		if(part != null){
			//part.setNextRow(false);
		}
	}

	/**
	 * 处理String的显示
	 * @param parser2
	 */
	private void paserStringPart() {

		
		String text = parser.getText().trim();
	
		if(text != null && !text.equals("")){
			part = WAPGUIFactory.createStringPart(parser.getText(), Style.PLAIN_SMALL, align);
			part.setStyle(0xFFFFFF, 0x0000000);
			
			parts.addElement(part);
			logger.debug("Text : " +  text);
		}
		attr.clear();
	}

	/**
	 * 处理HyperLink,并生成HyperLink控件
	 * @param parser
	 */
	private   void parserHyperLinkImpl(KXmlParser parser) {
		 String herf = (String) attr.get(WmlTag.A_ATTR[0]);
		 if(herf != null && !parser.getText().equals("")){			 
			 
			 part = WAPGUIFactory.createHyperLink(parser.getText(), herf, align);
			 parts.addElement(part);
			// logger.debug(herf);
		 }
		 attr.clear();
		
	}

	private void parserAlign() {
		//align = (String)attr.get(WmlTag.P_ATTR[1]);
		if(align == null || align.toLowerCase().equals("left")){
			 align = Part.ALIGN_LEFT;
		 }else if(align.toLowerCase().equals("center")){
			 align = Part.ALIGN_CENTER;
		 }else if(align.toLowerCase().equals("right")){
			 align = Part.ALIGN_RIGHT;
		 }else{
			 align = Part.ALIGN_LEFT;
		 }
		 
	}

	/**
	 * 解释Wap标记,并把属性保存到attr
	 * @param parser
	 */
	private   void parserWapTagImpl(KXmlParser parser) {
		//logger.debug("The One parser ... ");
		 String name = parser.getName();
		 int size = parser.getAttributeCount();
			for (int i = 0; i < size; i++) {
				if(parser.getAttributeName(i).toLowerCase().equals(WmlTag.ALIGN)){
					align = parser.getAttributeValue(i).toLowerCase();
				}else{
					attr.put(parser.getAttributeName(i).toLowerCase(), parser.getAttributeValue(i).toLowerCase());
				}
				
				//logger.debug(parser.getAttributeName(i) + " : " + parser.getAttributeValue(i));
				
			}
		 currentTag = name;
	}

	public Vector getResult() {
		return parts;
	}

	public final void setMainForm(MainForm mainForm) {
		this.mainForm = mainForm;
	}
	public void setInput(InputStream is, String _enc)
    throws XmlPullParserException{
		this.parser.setInput(is, _enc);
	}
	
	private void paintMainform(){
		//logger.debug("Repaint");
		if(mainForm != null){
			mainForm.addItems(parts);
			mainForm.repaint();
		}
	}

	 

	 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -