关于生成静态分页问题,望高手进来讨论,并指点一二
本人刚毕业踏入社会工作:
近来主管要求做一个静态分页功能
主要是对Web编辑器(FCKedit)编辑的内容进行分页
首先,静态化的要求是按照1KB来分页.
通过分析,知道FCKedit提交到后台处理的数据,其实就是一段字符串
它有个规律就是内容被编辑后会自动嵌入 <p> </p> 这两个标签,找到这个规律后,其实分页就是对字符串中的字符个数来分.
字符串如下: <p> 标题:飞人刘翔再破世界纪录 </p> <p> <table> <tr> 内容省略 <tr> </table> </p>
1KB是如何计算得来?
字符串中: < 或 p 或 标,这些都是一个字符,占计算机的16位,16位 = 2B,那么1KB = 1024B,1024/2 = 512,也就是说每截取512个字符就可以生成1KB左右的文件,但截取的时候如何呢?
本人是按照如下方法截取:
按照 <p> ... </p> 块来取
按照这种方法取会出现如下情况:
1. <p> .. </p> 之间只取到一半
2.第一个 <p> .. </p> 内容达不到1KB,还要加多一个 <p> .. </p> ,还不够的话继续添加
3.在 <p> 或 </p> 标签中间截开,这种情况有七种,分别例如如下:
3.1 < 与/p> <p>
3.2 </ 与p> <p>
3.3 </p 与> <p>
3.4 </p> 与 <p>
3.5 </p> < 与p>
3.6 </p> <p 与>
3.7 </p> <p>
除了这七种情况之外,还有一种就是从非标签中间隔开:
比如: <p> ss 隔开s <p> 或 <p> ss </p> <p> ss 隔开ss </p>
费了很大劲:
编写如下程序实现,贴出来让高手们提提建议,并指点指点晚辈:
package com.hx.util;
import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;
public class Pagination {
private static final int BYTE_CONSTANT = 13;
public Pagination() {
}
public List getContents(String content, int KB) {
List contents = new ArrayList();
//存放截取后的字符串
String leaveContent = null;
//临时存放字符串
String tmpContent = null;
//计算内容的长度
int kb = KB * BYTE_CONSTANT;
while (content.length() > 0) {
//判断字符串是否被截空
if (content.length() > kb) {
//按照所给的大小,截取字符串
tmpContent = content.substring(0, kb);
//将剩下的字符串临时存放在临时变量中
leaveContent = content.substring(kb);
} else {
if (!content.equals( " ")) {
contents.add(content);
break;
} else {
//将content置空
content = " ";
break;
}
}
//截取剩余字符串,凑整字符串
// <与/p> <p>
boolean flag1 = tmpContent.endsWith( " < ") &&
leaveContent.startsWith( "/p> ");
// </与p> <p>
boolean flag2 = tmpContent.endsWith( " </ ") &&
leaveContent.startsWith( "p> ");
// </p与> <p>
boolean flag3 = tmpContent.endsWith( " </p ") &&
leaveContent.startsWith( "> ");
// </p> 与 <p>
boolean flag4 = tmpContent.endsWith( " </p> ") &&
leaveContent.startsWith( " <p> ");
// </p> <与p>
boolean flag5 = tmpContent.endsWith( " </p> < ") &&
leaveContent.startsWith( "p> ");
// </p> <p与>
boolean flag6 = tmpContent.endsWith( " </p> <P ") &&
leaveContent.startsWith( "> ");
// </p> <p>
boolean flag7 = tmpContent.endsWith( " </p> <p> ");
if (flag1 || flag2 || flag3||flag5||flag6||flag7) {
if (flag1) {
//截断不完整符号,加上完整的 </p>
tmpContent = tmpContent.substring(0,
tmpContent.lastIndexOf( " < ")) + " </p> ";
//添加到集合
contents.add(tmpContent);
//重置content
content = leaveContent.substring(leaveContent.indexOf( " <p> "));
}
if (flag2) {
tmpContent = tmpContent.substring(0,
tmpContent.lastIndexOf( " </ ")) + " </p> ";
//添加到集合
contents.add(tmpContent);
//重置content
content = leaveContent.substring(leaveContent.indexOf( " <p> "));
}
if (flag3) {
tmpContent = tmpContent.substring(0,
tmpContent.lastIndexOf( " </p ")) + " </p> ";
//添加到集合
contents.add(tmpContent);
//重置content
content = leaveContent.substring(leaveContent.indexOf( " <p> "));
}
if (flag5) {
System.out.println( "######## ");
tmpContent = tmpContent.substring(0, tmpContent.lastIndexOf( " < "));
contents.add(tmpContent);
content = " < " + leaveContent;
}
if (flag6) {
tmpContent = tmpContent.substring(0, tmpContent.lastIndexOf( " <p "));
contents.add(tmpContent);
content = " <p " + leaveContent;
}
if (flag7) {
tmpContent = tmpContent.substring(0, tmpContent.lastIndexOf( " <p> "));
contents.add(tmpContent);
content = " <p> " + leaveContent;
}
} else if (flag4) {
//恰好在 <p> </p> 中间隔开
//将完整字符串添加到集合
contents.add(tmpContent);
//重置content
content = leaveContent;
} else {
//没有在 </p> <p> 中截开
tmpContent = tmpContent +
leaveContent.substring(0,
leaveContent.indexOf( " </p> ") +
4);
//重置content
content = leaveContent.substring(leaveContent.indexOf( " </p> ") +
4);
//添加到集合
contents.add(tmpContent);
}
}
return contents;
}
public static void main(String[] args) {
Pagination pagination = new Pagination();
String content =
" <p> aaaff </p> <p> ssdafdsa我胶的爱fsd </p> <p> iiiiiooooodfpsdfasdfppppp </p> ";
List contents = pagination.getContents(content, 1);
Iterator iter = contents.iterator();
while (iter.hasNext()) {
String item = (String) iter.next();
System.out.println( "item = " + item);
}
}
}
[解决办法]
做的太复杂了
不用补齐,这种分页最好是不严格的。
太严格了很难做
新浪的新闻都没做好