knu project
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

266 lines
5.8 KiB

/*********************************************************************************************************
* 프로그램명 : User.java 프로그램설명 : 사용자에 대한 정보를 얻을 수 있는 class 작성자 : 조용준 변 경 : 강원중 작성일 : 2003.12.09 변경일 : 2003.12.09
**********************************************************************************************************/
package kr.co.kihyun.text.html;
import java.util.*;
import javax.swing.text.*;
import javax.swing.text.html.*;
import kr.co.kihyun.lang.MString;
public class CallbackHandler extends HTMLEditorKit.ParserCallback {
private boolean stTD;
private boolean stTR;
private int tableCount = 0;
private int trCount = 0;
private int tdCount = 0;
private String text;
private String colspan;
private String rowspan;
private String width;
private Hashtable<String, String> TD = null;
private List<Hashtable<String, String>> vTDs = new ArrayList<Hashtable<String, String>>();
public CallbackHandler() {
init();
}
private void init() {
text = "";
colspan = "";
rowspan = "";
width = "";
// stTD = false;
stTD = true;
stTR = false;
TD = new Hashtable<String, String>();
}
public int getTRCount() {
return trCount;
}
public List<Hashtable<String, String>> getTDs() {
setTDName();
return vTDs;
}
public void setTDName() {
int trCount = 0;
int edTR = 0;
int edTABLE = 0;
// hash table 에서 table, tr 값을 가져와서 tr 의 갯수를 구한다.
Hashtable<String, String> ht = null;
int table = 0;
int tr = 0;
for (int i = 0; i < vTDs.size(); i++) {
// i 번째 element 를 가져온다. 형식은 {width=7%, tr=1, text=????, table=1, colspan=1, rowspan=1}
ht = vTDs.get(i);
// table과 tr 의 값을 가져옴
table = getInt(ht, "table");
tr = getInt(ht, "tr");
// tr 갯수 세기
if (edTABLE != table || edTR != tr)
trCount++;
edTR = tr;
edTABLE = table;
}
int TD[][] = new int[trCount + 10][256];
for (int i = 0; i < trCount + 10; i++) {
for (int j = 0; j < 256; j++) {
TD[i][j] = -2;
}
}
edTABLE = 0;
edTR = 0;
int iRow = -1;
int iCol = 0;
int colspan = 0;
int rowspan = 0;
for (int i = 0; i < vTDs.size(); i++) {
ht = vTDs.get(i);
table = getInt(ht, "table");
tr = getInt(ht, "tr");
colspan = getInt(ht, "colspan");
rowspan = getInt(ht, "rowspan");
if (edTABLE != table || edTR != tr) {
iRow++;
iCol = 0;
}
while (TD[iRow][iCol] != -2)
iCol++;
for (int rs = 0, cs = 0; rs < rowspan; rs++) {
for (cs = 0; cs < colspan; cs++) {
if (rowspan == 1 && colspan == 1) {
if (rs == rowspan - 1 && cs == colspan - 1) {
TD[iRow + rs][iCol + cs] = i;
} else {
TD[iRow + rs][iCol + cs] = -1;
}
} else {
if (rs == 0 && cs == 0) {
TD[iRow + rs][iCol + cs] = i;
} else {
TD[iRow + rs][iCol + cs] = -1;
}
}
}
}
edTABLE = table;
edTR = tr;
}
for (int i = 0, j = 0; i < trCount; i++) {
for (j = 0; j < 256; j++) {
if (TD[i][j] == -2)
break;
if (TD[i][j] > -1) {
ht = vTDs.get(TD[i][j]);
ht.put("name", (getInt2Abc(j) + (i + 1)));// sell 번호를 만든다.
ht.put("col", "" + j);
ht.put("row", "" + i);
vTDs.set(TD[i][j], ht);
tdCount = (tdCount >= j) ? tdCount : j;
}
}
}
}
public void handleText(char[] data, int pos) {
String sText = "";
sText = new String(changeNBSP(data));
if (stTD) {
text += sText;
}
}
public char[] changeNBSP(char[] data) {
for (int i = 0; i < data.length; i++) {
if ((int) data[i] == 160 || (int) data[i] == 12288) {
data[i] = ' ';
}
}
return data;
}
public void handleStartTag(HTML.Tag t, MutableAttributeSet a, int pos) {
if (t == HTML.Tag.TABLE) {
tableCount++;
trCount = 0;
stTR = true;
}
if (t == HTML.Tag.TR) {
trCount++;
stTR = true;
}
if (t == HTML.Tag.TD) {
stTD = true;
if (stTR != true) {
stTR = true;
trCount++;
}
width = (String) a.getAttribute(HTML.Attribute.WIDTH);
colspan = (String) a.getAttribute(HTML.Attribute.COLSPAN);
rowspan = (String) a.getAttribute(HTML.Attribute.ROWSPAN);
}
}
public void handleEndTag(HTML.Tag t, int pos) {
if (t == HTML.Tag.TD) {
stTD = false;
TD.put("table", "" + tableCount);
TD.put("tr", "" + trCount);
TD.put("text", MString.checkNull(text));
TD.put("width", MString.checkNull(width));
colspan = MString.checkNull(colspan);
if ("".equals(colspan))
colspan = "1";
rowspan = MString.checkNull(rowspan);
if ("".equals(rowspan))
rowspan = "1";
TD.put("colspan", colspan);
TD.put("rowspan", rowspan);
vTDs.add(TD);
text = "";
colspan = "";
rowspan = "";
width = "";
stTD = false;
TD = new Hashtable<String, String>();
}
if (t == HTML.Tag.TR) {
stTR = false;
}
//42.비어있는 if문 : Delete by YOUNGJUN,CHO
//if (t == HTML.Tag.TABLE) {
//}
//------------------------------------------------
}
// ///////////// 추가 ///////////////
public int getInt(Hashtable<String, String> ht, String Key) throws NumberFormatException {
String str = ht.get(Key);
return Integer.parseInt(str);
}
public String getInt2Abc(int i) {
if (i < 26) {
return "" + (char) ('A' + i);
} else {
return getInt2Abc((i / 26) - 1) + getInt2Abc(i % 26);
}
}
static public String getCutPreTag(String copyForm) {
int strPre = 0;
strPre = copyForm.indexOf("<pre>");
if (strPre < 0) {
strPre = copyForm.indexOf("<PRE>");
}
if (strPre >= 0) {
copyForm = copyForm.substring(5, copyForm.length());
}
int endPre = 0;
endPre = copyForm.lastIndexOf("</pre");
if (strPre < 0) {
endPre = copyForm.lastIndexOf("</PRE");
}
if (endPre >= 0) {
copyForm = copyForm.substring(0, endPre);
}
return copyForm;
}
}