📄 tools.java
字号:
package com.gameislive.browser;
import java.io.InputStreamReader;
import java.util.Vector;
import javax.microedition.lcdui.Font;
/**
* 主要用于解释文档、处理字符串的工具类
*
* @author pan
*
*/
public class Tools {
static Font font;
/**
* 清空Tools占用的内存
*/
public static void destroy(){
font = null;
}
/**
* 规范化wml文档,一行一条完整语句,保存在Vector中<br>
* @param reader
*/
public static Vector ToDocument(InputStreamReader reader) {
// 下边为一个完整的,规范的WML文档
// <?xml version="1.0" encoding="UTF-8"?>
// <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
// <wml>
// <head>
// <meta http-equiv="Cache-Control" content="no-cache" />
// <meta http-equiv="Cache-Control" content="max-age=0" />
// <meta http-equiv="Cache-Control" content="must-revalidate" />
// </head>
// <card id="misc" title="misc">
// <onevent type="onenterforward" >
// <go href="http://www.gameislive.com/live_wap/index.do" sendreferer="true" />
// </onevent>
// <p align="left">
// loading...
// </p>
// </card>
// </wml>
// 临时的,用于保存解释的文档
// 文档是一行一行保存的,由于不确定有多少行,因此用Vector而不用Array
// 默认32行,对小页面不足32行的可以少少提高速度
Vector sv = new Vector(32);
String s = "";
do {
String s1;
if ((s1 = ReadLine(reader)) == null) {
break;
}
s1 = s1.trim();
if (s1.length() != 0) {
if (s.length() > 0) {
s = s + " ";
}
do {
int i;
if ((i = s1.indexOf("<")) != -1) {
s = s + s1.substring(0, i);
if (s.length() > 0) {
sv.addElement(s);
}
s = "<";
s1 = s1.substring(i + 1);
}
if ((i = s1.indexOf(">")) != -1) {
s = s + s1.substring(0, i + 1);
if (s.length() > 0) {
sv.addElement(s);
}
s = "";
s1 = s1.substring(i + 1);
}
} while (s1.indexOf("<") != -1 || s1.indexOf(">") != -1);
s = s + s1;
}
} while (true);
if (s.length() > 0) {
sv.addElement(s);
}
return sv;
}
/**
* 从流读取文挡,流末尾则返回null
* @param reader
* @return
*/
public static String ReadLine(InputStreamReader reader) {
StringBuffer stringbuffer = new StringBuffer();
int i = -1;
do {
try {
if ((i = reader.read()) == -1) {
break;
}
char c = (char) i;
if (c == '\n') {
break;
}
if (c != '\r') {
stringbuffer.append(c);
}
continue;
}
catch (Exception exception) {
}
break;
} while (true);
if (stringbuffer.length() == 0) {
if (i == -1) {
return null;
} else {
return "";
}
} else {
return stringbuffer.toString();
}
}
/**
* 将文档中的由&#x表示的转义标记转换成目标字符串
* @param s
* @return
*/
public static String Convert(String s) {
do {
int k1;
if ((k1 = s.indexOf("&#x")) == -1) {
break;
}
int k2 = k1;
int j4 = s.length();
int j5 = k1;
do {
if (j5 >= j4) {
break;
}
if (s.charAt(j5) == ';') {
k2 = j5;
break;
}
j5++;
} while (true);
if (k2 == k1) {
break;
}
String str = "\\n" + s.substring(k1 + 3, k2);
str = UnicodeToString(str);
s = s.substring(0, k1) + str + s.substring(k2 + 1);
} while (true);
return s;
}
/**
* unicode编码形式的字符串转成String,比如<br>
* "6211" "7684"则转换成 "我" "的"
* @param s
* @return
*/
public static String UnicodeToString(String s) {
if (s == null) {
return null;
}
StringBuffer result = new StringBuffer();
int tempI, i, ch;
for (i = 0; i < s.length(); i++) {
if ((ch = s.charAt(i)) == '\\') // 如果是Unicode编码(开始是),则将它转换为汉字
{
tempI = i;
i += 2;
while (s.length() > i && s.charAt(i) == 'u') {
i++;
}
if (s.length() >= i + 4) {
ch = Integer.parseInt(s.substring(i, i + 4), 16); // 将Unicode16进制数转换为10进制
i += 3;
} else {
i = tempI;
}
}
// 对于汉字,将它从整形数据转换成字符后,附在result后,对于英文字符,直接使用就行
result.append((char) ch);
}
return result.toString();
}
/**
* 将wml文档中一些特别的转义字符串转换成标记
* @param s
* @return
*/
public static String ReplaceTagString(String s){
s = RepString(s, "©", "(c)");
s = RepString(s, "&", "&");
s = RepString(s, "<", "<");
s = RepString(s, ">", ">");
s = RepString(s, " ", " ");
s = RepString(s, "'", "'");
s = RepString(s, """, "\"");
s = RepString(s, "'", "'");
s = RepString(s, "•", "\u25aa");
return s;
}
/**
* 将一段文字根据指定的行宽度分行保存在Vector中返回
* @param infostr
* @param width
*/
public static Vector DoLine(String infostr, int width){
Vector dealedText = new Vector();
String tmpStr;
int tmpint;
try{
while (true){
tmpint = ChangLine(infostr,width, false);
if (tmpint == 0){
dealedText.addElement(infostr);
break;
}
else{
if (infostr.charAt(tmpint - 1) == '\n')
tmpStr = infostr.substring(0, tmpint - 1);
else
tmpStr = infostr.substring(0, tmpint);
dealedText.addElement(tmpStr);
infostr = infostr.substring(tmpint, infostr.length());
}
}
}catch(Exception e){
e.printStackTrace();
}
return dealedText;
}
/**
* doLine的辅助方法
* @param str
* @param linewd
* @param fullword
* @return
*/
private static int ChangLine(String str,int linewd, boolean fullword){
int len = 0, wd = 0;
for (int i = 0; i < str.length(); i++){
if (str.charAt(i) == '\n'){
if (i == 0)
return len + 1;
else
return len + 2;
}
wd += font.charWidth(str.charAt(i));
if (wd > linewd){
if (fullword){
for (int j = len; j >= 0; j--){
if (str.charAt(j) < 0x30 || str.charAt(j) >= 128){
len = j;
break;
}
}
}
return len + 1;
}
len = i;
}
return 0;
}
/**
* 从原字符串中取出规定长度的字符串
* @param s
* @param w
* @return
*/
public static String CutString(String s, int w) {
int tmpLength = s.length();
do {
if (font.stringWidth(s) <= w) {
break;
}
if (--tmpLength == 0) {
s = "";
break;
}
s = s.substring(0, tmpLength);
} while (true);
return s;
}
/**
* 从原字符串中找到指定的字符串,替换成另外的字符串
* @param s
* @param s1
* @param s2
* @param ignoreCase 是否忽略大小写
* @return
*/
public static String RepStringX(String s, String s1, String s2, boolean ignoreCase) {
String tmp = "";
if (s == null || s1 == null || s2 == null) {
return s;
}
int j;
if (ignoreCase) {
s1 = s1.toLowerCase();
int i;
while ((i = s.toLowerCase().indexOf(s1)) != -1) {
String s3 = s.substring(0, i);
String s5 = s.substring(i + s1.length());
tmp = tmp + s3 + s2;
s = s5;
}
} else {
while ((j = s.indexOf(s1)) != -1) {
String s4 = s.substring(0, j);
String s6 = s.substring(j + s1.length());
tmp = tmp + s4 + s2;
s = s6;
}
}
return tmp + s;
}
/**
* 从原字符串中找到指定的字符串,替换成另外的字符串,不忽略大小写
* @param s
* @param s1
* @param s2
* @return
*/
public static String RepString(String s, String s1, String s2) {
return RepStringX(s, s1, s2, false);
}
/**
* 根据颜色名字返回16进制表示的颜色代码
* @param s
* @return
*/
public static int GetColor(String s) {
try {
if (s == null) {
return 0xffffff;
}
s = s.toLowerCase();
if (s.equals("black")) {
return 0;
}
if (s.equals("blue")) {
return 4095;
}
if (s.equals("cyan")) {
return 65535;
}
if (s.equals("gray")) {
return 0x808080;
}
if (s.equals("green")) {
return 65280;
}
if (s.equals("magenta")) {
return 0xff00ff;
}
if (s.equals("red")) {
return 0xff0000;
}
if (s.equals("white")) {
return 0xffffff;
}
if (s.equals("yellow")) {
return 0xffff00;
}
if (s.startsWith("#") && s.length() > 1) {
s = s.substring(1);
}
if (s.startsWith("0x") && s.length() > 2) {
s = s.substring(2);
}
return Integer.parseInt(s, 16);
} catch (Exception exception) {
return 0xffffff;
}
}
/**
* 返回URL中的主机地址
* @param s
* @return
*/
public static String GetURLBase(String s) {
String s1 = s;
if (s1 == null) {
return "";
}
if (!s1.startsWith("http://")) {
s1 = "http://" + s1;
}
int i = s1.length();
int j;
for (j = i - 1; j >= 0 && s1.charAt(j) != '/' && s1.charAt(j) != '\\'; j--) {
}
s1 = s1.substring(0, j + 1);
if (s1.equals("http://")) {
s1 = s + "/";
}
return s1;
}
/**
* 返回当前URL的根
* @param s
* @return
*/
public static String GetURLRoot(String s) {
if (s == null) {
return "";
}
if (s.startsWith("http://")) {
s = s.substring(7);
}
int i = s.length();
if (i == 0) {
return "";
}
int j;
for (j = 0; j < i && s.charAt(j) != '/' && s.charAt(j) != '\\'; j++) {
}
if (j < i) {
s = s.substring(0, j + 1);
} else {
s = s + "/";
}
return "http://" + s;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -