我想把来自不同网站的网页处理成同一种格式,请问有什么好建议。(nil)(100分)

  • 主题发起人 主题发起人 shopman
  • 开始时间 开始时间
???什么意思?说具体点好吗?
 
是这样的:我想把我从网上下载的各种技术资料、游戏改略、密技、笑话、等等
大括有2000-3000篇全部处理成Title是黑体6号字,Body宋体4号字,因为这样
我觉得看起来很顺眼,眼睛不会被各种各样的东西给搞花了。
 
哦…补充一点,我只想要标题黑体6号和内容宋体4号其余的所有html的控制,脚本等
全部不要。
 
简单.
首先过滤掉html里面所有的字体属性,也就是包括在<font>里面的
东西和</font>,然后在html的head部分添加CSS字体控制:
<style type="text/css">
BODY {font-family: 宋体; font-size: 10.5pt; line-height:22px; color: "#000000";}
TABLE {font-family: 宋体; font-size: 10.5pt; line-height:22px; color: "#000000";}
</style>
具体的字体参数你自己控制吧!



 
我想你大概不是要拷贝什么小说之类的吧? 恐怕是
ICP -> Internet Copy & Paste :-)

你是做网页的?不要太懒哦!
 
嗯,html文件其实就是文本文件,用DELPHI的文本文件处理方式处理一下就行了
 
呵呵, 处理这个, 要熟悉html的编写规范, 先要把title找到, 保存, 然后把所有的
html格式符去掉, 把title用黑体阔起来, 然后其它文字用普通字体阔起来.
注意, 如果用<p>分段, <br>分行.
 
可以设置一个模板,里面包含两个变量:[TITLE],[TEXT],
其他的都按你需要的HTML格式写好,[TITLE]就写在〈TITLE〉,
〈/TITLE〉之间,[TEXT]写在〈BODY〉与〈/BODY〉之间,读
取一篇文章,找出TITLE和内容,将模板中的[TITLE]和[TEXT]
一替换,保存就可以了。这样也比较灵活,用不同的模板可以
保存不同的格式。我的一个软件就是这么做的,虽然我自己没
怎么用,不过,榕树下的编辑对此觉得还是不错的。怎么读出
TITLE和TEXT,上面的大侠们都说过了。
 
星期六、星期天我自已写了一个DLL它能把html转换成txt其中所有软,硬回车都保
留下来,然后我再向这个txt加上自已的html语句,这是我的做法。

在这个过程中我遇到一个问题:如何给txt分段呢?或者如何确定分段点呢?
 
我的做法:
1、按照空行分段
2、根据中文标点符号分段。
 
DreamTiger: 能说具体一点吗?

我的分段想法是:txt赋给richedit然后操作richedit.lines从第一行到最后一行,
逐行判断最后一个字符是否是分段符号。

另外,我不知道软回车如何判断和删除这些看不见的控制符,这很重要吧!指点指点。
 
我的程序是直接从硬盘读文件或者从POP3下载文件,
然后进行格式化处理,我不知道你说的软回车是什
么,反正我没有处理过。不过,我想你可以把软回
车替换成硬回车再处理。或者,修改一下我下面的
函数,把遇到硬回车设成一定分段,遇到软回车判
断是否分段。下面是我的两个函数:

这个函数用来判断是否要合并两行:
function SameParagraph(const FirstLine:string;const SecondLine:string):boolean;
var
LastCharOfFirstLine:string; //第一行的最后字符
FirstCharOfSecondLine:string;//第二行的起始字符
Begin
//gParameter.boolSpliteByReturn表示空行是否作为分段标记
if((0 = Length(FirstLine)) or (0 = Length(SecondLine))) then
Begin
if(not gParameter.boolSpliteByReturn)
then result := true
else result := false;
exit;
end;

//gParameter.boolSpliteByChar表示特定字符是否作为分段标记
if(not gParameter.boolSpliteByChar) then
begin
result := true;
exit;
end;

if(integer(FirstLine[Length(FirstLine)]) >= $80) then //中文字符
LastCharOfFirstLine := Copy(FirstLine,Length(FirstLine) - 1,2)
else//英文字符
LastCharOfFirstLine := FirstLine[Length(FirstLine)];

if(integer(SecondLine[1]) >= $80) then
FirstCharOfSecondLine := Copy(SecondLine,1,2)
else
FirstCharOfSecondLine := SecondLine[1];

//gParameter.strEndChar表示作为分段标记的字符(string类)
//我的设定 = '。?!…」”)'
//gParameter.strNotFirstChar表示不能作为一段起始的字符(string类)
//我的设定 = '。?!」”)'
if((Pos(LastCharOfFirstLine,gParameter.strEndChar) <> 0) and
(Pos(FirstCharOfSecondLine,gParameter.strNotFirstChar) = 0)) then
begin
result := false;
exit;
end;

result := true;
end;

//这个函数是对一个段落进行格式化成为每行固定长度。
//同时设定了避头尾字符
function FormatLine(const oldLine:string;
const LineLength:integer;
const NotEndLineChar:string;
const NotFirstLineChar:string):string;
var
Line:string;
NewLine,ReturnLine,NextChar:string;
cnumber,number,theLength,i,j:integer;
Begin
line := DeleteTerminalBlank(oldLine);//删除头尾空格

NewLine := StringOfChar(' ',4);
ReturnLine := '';

cnumber := 0;
number := 4;
theLength := Length(line);

j := 1;
while(j <= theLength) do
Begin
if(LineLength <= number) then
Begin
if((j > 1) and (line[j-1] < #$80) and (line[j] < #$80)) then
//这个判断不适合big5码
Begin
//前面一个与现在字符都不是中文字符
if(line[j-1] = ' ') then
Begin
if(line[j] <> ' ') then
Begin
ReturnLine := ReturnLine + NewLine + #13#10;
NewLine := line[j];
number := 1;
cnumber := 0;
Inc(j);
continue;
end
else
begin
Inc(j);
continue;
end;
end
else
Begin
//前面一个字符是英文,现在的字符也是英文或空格,不分段
NewLine := NewLine + line[j];
cnumber := 0;
Inc(j);
continue;
end;
end
else if(0 = (cnumber mod 2)) then//有个什么函数可以直接判断的来着
Begin
//看现在的符号是否可以作为行尾符号
if(line[j-2] >= #$80) then NextChar := Copy(line,j-2,2)
else NextChar := line[j-1];

if(Pos(NextChar,NotEndLineChar) <> 0) then
Begin
Delete(NewLine,Length(NewLine) - Length(NextChar) + 1,Length(NextChar));
ReturnLine := ReturnLine + NewLine + #13#10;
NewLine := NextChar + line[j];
number := Length(NextChar) + 1;
cnumber := 0;
for i := 1 to Length(NextChar) do
if(NextChar >= #$80) then Inc(cnumber);

if (line[j] >= #$80) then Inc(cnumber);

Inc(j);
continue;
end;

//看后面是不是标点符号
if(j = theLength) then
Begin
NewLine := NewLine + line[j];
Inc(j);
continue;
end
else
Begin
if(line[j] >= #$80) then
NextChar := Copy(line,j,2)
else
NextChar := line[j];

if((Pos(nextChar,NotFirstLineChar) <> 0) or (NextChar = ' ')) then
Begin
//是标点符号,或者是空格,加在新行后面。
NewLine := NewLine + NextChar;
Inc(j,Length(NextChar));
cnumber := 0;
continue;
end;
end;

ReturnLine := ReturnLine + NewLine + #13#10;
NewLine := line[j];
number := 1;
if(line[j] >= #$80) then cnumber := 1;
Inc(j);
continue;
end
else
Begin
//是中文字符的后半个字符
NewLine := NewLine + line[j];
cnumber := 0;
Inc(j);
continue;
end;
end
else//长度大于等于LineLength
Begin
NewLine := NewLine + line[j];
if(line[j] >= #$80) then
Begin
Inc(cnumber);
Inc(number);
end
else
Begin
Inc(number);
cnumber := 0;
if (j < theLength) and (line[j+1] >= #$80) and (1 = number mod 2) then
Begin
//如果下一个是中文,而现在为奇数,则补一个空格
NewLine := NewLine + ' ';
Inc(number);
end;
end;

Inc(j);
continue;
end;
end;

ReturnLine := ReturnLine + NewLine + #13#10;
Result := ReturnLine;
end;
 
DreamTiger: gParameter是什么。
 
是我自己的一个全局变量,记录各种运行的参数。
 
DreamTiger: 它是什么类 型的。
 
是我自己定义的一个类,包含了所有我的程序中需要用到的
参数(在不同Form之间)。也就是包含了所有全局变量的一
个类。
 
非常对不起DreamTiger我还是不太懂,你能再祥细些吗?
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部