http://www.javayou.com (收藏,设为首页)
当你不能再拥有时,你唯一能做的,就是让自己不要忘记 (手机请访问 http://3g.dlog.cn/javayou)

DLOG4J中的日记预览内容的处理方法

2007年1月19日(Friday) 15点03分 作者: 刘冬 天气: 心情: 一般
经过几番改善,DLOG4J中获取日记预览内容的方法已经趋于完善,它采用htmlparser项目对日记内容进行解析。

我们知道,对HTML内容进行切分的时候可能出现下面几种情况:

  1. 刚好切在不影响预览内容格式的地方
  2. 切断某个成对出现的标签,例如<table>
  3. 把标签切的不完整了,例如<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

标签: DLOG4J Htmlparser 

如果您无法播放歌曲,请先确定是否已经安装Windows media player软件
或者歌曲类型是否被Microsoft Media Player所支持。
另外请使用IE浏览器。
评论者: 刘冬 2007-1-19 15:09 (Friday)
所以你在DLOG4J上看到的是带格式的预览内容
评论者: FreeJor 2007-1-19 16:19 (Friday)

哦,原来如此啊。但是我肚子太饿了,所以没有耐心看代码。以后再看了。反正一直觉得文字显示有问题,我以前都是用word写好之后就复制到网记上面,总有格式提示。而且显示也有问题,不是太大就是太小,而在word上面是很合适的,一般都是五号字体。但在网记上面就特别大。只能有最小的那个,我才能看的舒服。现在改用记事本写了,然后再复制到网记上面,字体的问题解决了。但是,格式就没有word好了。

唉,我现在能吃下一头牛!

评论者: 刘冬 2007-1-19 16:35 (Friday)
直接复制word的文本的方法还是不行,可以使用编辑器有个从word中粘贴的按钮。

因为word的格式包含太多太多太多太多.....(还有是太多)的格式控制代码。
评论者: FreeJor 2007-1-20 12:34 (Saturday)

那确实,

我还没有发现有这个功能呢。

评论者: 贵贵 2007-1-24 22:25 (Wednesday)

这个方法考虑周到~`

我记得原来在编辑器里输入一些网页标签,例如只有<title>没有</title>结束的时候页面显示有问题!

评论者: 域名查询 2007-6-7 01:07 (Thursday)
这个方法考虑周到~`
姓名: 
邮箱:  {可选}
网址:  {可选} 此评论只有我和写日记的人查阅
校验码: ... <我看不清楚>
网记为您提供手机和互联网同步的个人主页,带给你不一样的体验