📄 wmlparser.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 + -