我们知道,对HTML内容进行切分的时候可能出现下面几种情况:
- 刚好切在不影响预览内容格式的地方
- 切断某个成对出现的标签,例如<table>
- 把标签切的不完整了,例如<table 别切成<tab
DLOG4J的做法是,不管出现什么情况,利用htmlparser把切出来的预览内容进行标签补足,也就是遍历每个标签,一旦发现它没有关闭的时候就补一个关闭标签,代码如下:
/**
* 生成预览内容
* @param html
* @param max_count
* @return
*/
public static String preview(String html, int max_count){
if(html.length()<= max_count * 1.1)
return html;
Parser parser = new Parser();
StringBuffer prvContent = new StringBuffer();
try {
parser.setEncoding("8859_1");
parser.setInputHTML(html);
PrototypicalNodeFactory factory = new PrototypicalNodeFactory ();
factory.registerTag(new FontTag());
factory.registerTag(new BoldTag());
parser.setNodeFactory(factory);
NodeList nodes = parser.extractAllNodesThatMatch(nfilter);
Node node = null;
for(int i=0;i= max_count){
if(node instanceof TagNode){
TagNode tmp_node = (TagNode)node;
boolean isEnd = tmp_node.isEndTag();
if(!isEnd){
prvContent.setLength(prvContent.length()-tmp_node.getText().length()-2);
}
}
//补齐所有未关闭的标签
Node parent = node;
//System.out.println("current node is . "+parent.getText());
do{
System.out.println(parent.getClass().getName()+":"+parent.getText());
parent = parent.getParent();
//System.out.println("parent = "+parent);
if(parent==null) break;
if(!(parent instanceof TagNode)) continue;
//System.out.println("Parent node is no ended. "+parent.getText());
prvContent.append(((TagNode)parent).getEndTag().toHtml());
}while(true);
break;
}
node = nodes.elementAt(i);
if(node instanceof TagNode){
TagNode tag = (TagNode)node;
prvContent.append('<');
prvContent.append(tag.getText());
prvContent.append('>');
//System.out.println("TAG: " + '<'+tag.getText()+'>');
}
else if(node instanceof TextNode){
int space = max_count - prvContent.length();
if(space > 10){
TextNode text = (TextNode)node;
if(text.getText().length() < 10)
prvContent.append(text.getText());
else
prvContent.append(StringUtils.abbreviate(text.getText(), max_count - prvContent.length()));
//System.out.println("TEXT: " + text.getText());
}
}
}
return prvContent.toString();
} catch (ParserException e) {
e.printStackTrace();
}finally{
parser = null;
}
return html;
}
源码下载:HTML_Utils.java
心情: 一般