📄 wmlcparser.java
字号:
//#endif
return;
}
Tag currentTag = (Tag) tagStack.peek();
//#ifdef debug
//# System.out.println("TAG END! -> " + Token.getTagName(currentTag.tagToken));
//#endif
if(baos.size() > 0) // 如果有Text Content, 加入currentTag
{
Tag textTag = new Tag(Tag.TYPE_TEXT);
textTag.text = getStrInCharset();
currentTag.addSubTag(textTag);
baos.reset(); // reset buffer
}
tagStack.pop(); // pop the stack
return;
} // early return!
// =================================以下处理非Tag结束的情况=================================
// 新Tag Token(MB_U_INT32)
Tag tag = parseMB_U_INT32(b);
//#ifdef debug
//# System.out.println("new tag -> " + Token.getTagName(tag.tagToken)
//# + ", isHaveAtt=" + tag.isHaveAttribute
//# + ", isHaveCon=" + tag.isHaveContent);
//#endif
if(tagStack.size() > 0)
{
//#ifdef debug
//# System.out.println("tagStack.size > 0");
//#endif
Tag currentTag = (Tag) tagStack.peek();
if(baos.size() > 0) // buffer有内容, 新建Text Tag
{
Tag textTag = new Tag(Tag.TYPE_TEXT);
textTag.text = getStrInCharset();
//#ifdef debug
//# System.out.println("add TEXT ->" + textTag.text);
//#endif
currentTag.addSubTag(textTag);
baos.reset(); // 清空buffer
}
// 2. 做为上一级Tag的子Tag
currentTag.addSubTag(tag);
}else // Fay: It's dirty!
{
rootTag = tag;
}
// 如果有属性, currentStatus转为ATTRIBUTE
if(tag.isHaveAttribute)
{
currentStatus = STATUS_ATTRIBUTE;
}
if(tag.isHaveAttribute || tag.isHaveContent)
{
tagStack.addElement(tag); // 加入tagStack
// System.out.println("put tag -> " + Token.getTagName(tag.tagToken)
// + ", isHaveAtt=" + tag.isHaveAttribute
// + ", isHaveCon=" + tag.isHaveContent);
}
}
/**
* handle the b when it's ATTRIBUTE_STATUS
*
* 分两种Token:
* Attribute Start,
* Attribute Value
* @param b
* @throws IOException
*/
private void handle_Attribute_Status(int b) throws Exception
{
// b > 128 means b is an AttributeValue Token
// if(preAttributeStart == -1 && (b > 128 || isGlobalTokenNeedHandle(b)))
if(preAttributeStart == -1 && b > 128)
{
// error
//#ifdef debug
//# System.out.println("handle_Attribute_Status, error -> " + b);
//#endif
return;
}
if(tagStack.size() <= 0)
{
//#ifdef debug
//# System.out.println("handle_Attribute_Status, (tagStack.size() <= 0)");
//#endif
return;
}
Tag currentTag = (Tag) tagStack.peek();
if(b == Token.GLOBAL_END) // 属性结束
{
//#ifdef debug
//# System.out.println("ATTR END!");
//#endif
// 处理buffer, 完成前一个Attribute
// 1. 解析AttributeStart
// 2. 处理buffer(Value)
String attLabel = Token.getAttLabelFromAttStartToken(preAttributeStart);
String attValue = Token.getAttValueFromAttStartToken(preAttributeStart);
if(attValue == null)
{
attValue = "";
}
attValue += getStrInCharset();
if(attLabel == null )
{
//#ifdef debug
//# System.out.println("handle_Attribute_Status, (attLabel == null || attValue == null)");
//#endif
return;
}
//#ifdef debug
//# System.out.println("attr : " + attLabel + " = " + attValue);
//#endif
currentTag.addAttribute(attLabel, attValue); // 增加attribute
this.currentStatus = STATUS_TAG; // 改变status
preAttributeStart = -1; // 重置preAttributeStart
baos.reset();
if(currentTag.isHaveContent == false)
{
tagStack.pop();
//#ifdef debug
//# System.out.println("ATT END & Pop -> " + Token.getTagName(currentTag.tagToken));
//#endif
}
return;
}
// means Attribute Start
if(b < 128)
{
//#ifdef debug
//# System.out.println("ATTR START TOKEN");
//#endif
// 处理buffer, 完成前一个Attribute
// 1. 解析AttributeStart
// 2. 处理buffer(Value)
// 3. 设置preAttributeStart
if(preAttributeStart != -1)
{
String attLabel = Token.getAttLabelFromAttStartToken(preAttributeStart);
String attValue = Token.getAttValueFromAttStartToken(preAttributeStart);
if(attValue == null)
{
attValue = "";
}
// attValue += new String(baos.toByteArray(), charsetStr);
attValue += getStrInCharset();
if(attLabel == null)
{
//#ifdef debug
//# System.out.println("handle_Attribute_Status, (attLabel == null || attValue == null)2");
//#endif
return;
}
//#ifdef debug
//# System.out.println("attr : " + attLabel + " = " + attValue);
//#endif
currentTag.addAttribute(attLabel, attValue); // 增加attribute
}
preAttributeStart = b; // 设置preAttributeStart
baos.reset();
}else // "Attribute Value"
{
//#ifdef debug
//# System.out.println("ATTR VALUE TOKEN");
//#endif
// 找相应的AttributeValue, 放入buffer
String value = Token.getValueFromAttValueToken(b);
//#ifdef debug
//# System.out.println("value==" + value);
//#endif
baos.write(value.getBytes());
}
}
static Tag parseMB_U_INT32(int b)
{
Tag tag = new Tag(Tag.TYPE_NORMAL);
tag.isHaveAttribute = (((b >> 7) & 1) == 1);
tag.isHaveContent = (((b >> 6) & 1) == 1);
// System.out.println("isHaveAtt == " + tag.isHaveAttribute);
// System.out.println("isHaveCon == " + tag.isHaveContent);
tag.tagToken = b & 0x3f;
// System.out.println("new Tag -> " + tag.tagToken + ", name=" + Token.getTagName(tag.tagToken));
return tag;
}
private String getStrFromStringTable(int index)
{
if(stringTable == null || index >= stringTable.length || index < 0)
{
return null;
}
//#ifdef debug
//# System.out.println("getStrFromStringTable -> " + index);
//#endif
StringBuffer buffer = new StringBuffer();
for(int i = index; i < stringTable.length ; i ++)
{
if(stringTable[i] != 0)
{
buffer.append(new String(new byte[]{(byte)stringTable[i]}));
}else
{
//#ifdef debug
//# System.out.println("getStr break -> " + i);
//#endif
break;
}
}
//#ifdef debug
//# System.out.println("getStrFromTab111 == " + buffer.toString());
//#endif
return buffer.toString();
}
/**
* 判断b是否为Multi-byte Integers的结束.
* 即每一个字节是否为0
*
* @param b
* @return
*/
static boolean isMB_U_INT32End(int b)
{
return (b >> 7 & 1) == 0;
}
/**
* 将Multi-byte Integers合并为一个int
* @param b
* @return
*/
static int mergeMB_U_INT32(byte[] b)
{
if(b == null || b.length == 0) { return -1; }
//#ifdef debug
//# System.out.println("mergeMB's length == " + b.length);
//#endif
int value = 0;
for(int i = 0 ; i < b.length ; i ++)
{
//#ifdef debug
//# System.out.println("mergeMB_U_INT32[" + i + "]=" + b[i]);
//#endif
value = (value << 7) | (b[i] & 0x7f);
if(isMB_U_INT32End(b[i]))
{
break;
}
}
return value;
}
/**
* wml version (mb_u_int32)
*
* @param data
* @param pos
* @return
*/
private int parseWmlVersion(byte[] data, int pos)
{
while(true)
{
byte bb = data[pos];
buffer_4_mb_int32.write(bb);
pos ++;
if(isMB_U_INT32End(bb))
{
break;
}
}
xmlVersion = mergeMB_U_INT32(buffer_4_mb_int32.toByteArray());
buffer_4_mb_int32.reset();
return pos;
}
/**
* charset (mb_u_int32)
*
* @param data
* @param pos
* @return
*/
private int parseWmlCharset(byte[] data, int pos)
{
while(true)
{
byte bb = data[pos];
buffer_4_mb_int32.write(bb);
pos ++;
if(isMB_U_INT32End(bb))
{
break;
}
}
charset = mergeMB_U_INT32(buffer_4_mb_int32.toByteArray());
buffer_4_mb_int32.reset();
charsetStr = Token.getCharset(charset);
if(charsetStr == null)
{
charsetStr = System.getProperty("microedition.encoding");
}
return pos;
}
/**
* table length (mb_u_int32)
* and<br>
* table(if table length != 0)
*
* @param data
* @param pos
* @return
*/
private int parseWmlTableStr(byte[] data, int pos)
{
while(true)
{
byte bb = data[pos];
buffer_4_mb_int32.write(bb);
pos ++;
if(isMB_U_INT32End(bb))
{
break;
}
}
int tbl = mergeMB_U_INT32(buffer_4_mb_int32.toByteArray());
//#ifdef debug
//# System.out.println("tbl == " + tbl);
//#endif
buffer_4_mb_int32.reset();
if(tbl != 0)
{
stringTable = new byte[tbl];
System.arraycopy(data, pos, stringTable, 0, stringTable.length);
}
pos += tbl;
return pos;
}
/**
* 2007-11-23 handle the exception now!
*
* handle the charset
*
* @return
* @throws UnsupportedEncodingException
*/
private String getStrInCharset()
{
byte[] bs = baos.toByteArray();
try{
// from peter: transfer the utf-16 to utf-8
if(charset == Token.IANA_UTF_16)
{
bs = utf8utf16.ucs2_to_utf8(bs);
return new String(bs, "UTF-8");
}
return new String(bs, charsetStr);
}catch(Exception e)
{
return new String(bs);
}
}
public String getCharsetStr()
{
return charsetStr;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -