// Copyright (C) 2003-2009 by Object Mentor, Inc. All rights reserved.
// Released under the terms of the CPL Common Public License version 1.0.
package fitnesse.slimTables;
import org.htmlparser.Node;
import org.htmlparser.Parser;
import org.htmlparser.lexer.Lexer;
import org.htmlparser.lexer.Page;
import org.htmlparser.tags.TableTag;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;
import fitnesse.slim.SlimError;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
public class HtmlTableScanner implements TableScanner {
private List<Table> tables = new ArrayList<Table>();
private NodeList htmlTree;
public HtmlTableScanner(String page) {
if (page == null || page.equals(""))
page = "<i>This page intentionally left blank.</i>";
try {
Parser parser = new Parser(new Lexer(new Page(page)));
htmlTree = parser.parse(null);
} catch (ParserException e) {
throw new SlimError(e);
}
scanForTables(htmlTree);
}
private void scanForTables(NodeList nodes) {
for (int i = 0; i < nodes.size(); i++) {
Node node = nodes.elementAt(i);
if (node instanceof TableTag) {
TableTag tableTag = (TableTag) node;
guaranteeThatAllTablesAreUnique(tableTag);
tables.add(new HtmlTable(tableTag));
} else {
NodeList children = node.getChildren();
if (children != null)
scanForTables(children);
}
}
}
private void guaranteeThatAllTablesAreUnique(TableTag tagTable) {
tagTable.setAttribute("_TABLENUMBER", ""+ Math.abs((new Random()).nextLong()));
}
public int getTableCount() {
return tables.size();
}
public Table getTable(int i) {
return tables.get(i);
}
public Iterator<Table> iterator() {
return tables.iterator();
}
public String toWikiText() {
StringBuffer b = new StringBuffer();
for (Table t : tables) {
b.append("\n");
for (int row = 0; row < t.getRowCount(); row++) {
b.append("|");
if (t.getColumnCountInRow(row) == 0)
b.append("|");
for (int col = 0; col < t.getColumnCountInRow(row); col++) {
b.append(t.getCellContents(col, row));
b.append("|");
}
b.append("\n");
}
}
return b.toString();
}
public String toHtml(Table startTable, Table endBeforeTable) {
String allHtml = htmlTree.toHtml();
int startIndex = 0;
int endIndex = allHtml.length();
if (startTable != null) {
String startText = startTable.toHtml();
int nodeIndex = allHtml.indexOf(startText);
if (nodeIndex > 0) {
startIndex = nodeIndex;
}
}
if (endBeforeTable != null) {
String stopText = endBeforeTable.toHtml();
int nodeIndex = allHtml.indexOf(stopText);
if (nodeIndex > 0) {
endIndex = nodeIndex;
}
}
return htmlTree.toHtml().substring(startIndex, endIndex);
}
public String toHtml() {
return htmlTree.toHtml();
}
}