作者:empty 出版社:empty |
前言
一笑(slimzhao@21cn.com) 制作
为何做这个东东
因为我觉得使用PDF文档不爽:(PDF 6出来了,它是向下兼容的,所以,还是不爽)
(1)PDF文档里搜索速度很慢.
(2)打开一个PDF文档占用系统资源比较大.
(3)当然你要安装一个PDF阅读器, 而这玩意儿有WINDOWS安装好就行了.
(4)使用金山词霸在PDF文档里取词要安装相应的补丁, 而且安装补丁后还会继续导致程序异常. 当然, 目前这个CHM格式的缺点是不能进行全文搜索.
东西从哪里来?
《Oracle9i Database Error Messages》(Release2 9.2). 它是PDF文档, 中间经过pdftotext, vi, perl, awk等工具处理后终于驯化成目前这个比较 格式化 的样子, 不过, 由于pdftotext处理PDF格式向TEXT格式转换时的一些问题以及我可能犯下的错误, 可能还会有一些地方不尽人意. 一经发现, 欢迎把出现错误信息的 错误号 MAIL给 一笑
花絮
首先是pdftotext这个了不起的工具, 是它使这个最终的chm文档有了技术可行性. 写到这里, 我查了一下man pdftotext, 找到了它的作者:Derek B. Noonburg (derekn@foolabs.com), 向他致敬! 其次, 是使用vim编辑器打开生成的文本文件, 对其中的 杂草丛生 的文本文件进行了一番修剪. 这一步之后生成的文本文件即可直接用于Unics版的ORACLE错误信息报告程序search_error.pl, 但由于这个文件过于庞大, 恐怕在chm中打开一个单个的大文件时拖着细细的滚动条小心翼翼地蠕动也不舒服. 所以我决定以每100条信息为界, 放入一个独立的文件中, 文件名得有规律: 如果这100条是在一个错误信息归类中, 如都是ORA的, 则文件名为ORA_00000-00152.htm, 其中00000是起始错误信息号, 而00152是结束错误信息号. 如果这100条有跨度, 如从ORA-30344到EPC-00004, 则命名为 ORA_30344-EPC_00004.htm, 生成的文件有102个. 生成这些文件的工作由一个PERL脚本来完成, 如下:
==================================================================================
#!/usr/bin/perl -w
$ = n ;
my ($i, $filename, $first, $last, $buf) = (1, , );
my $html_head = HTML_HEAD;
html>
head> title>Error /title> /head>
body>
HTML_HEAD
my $html_tail=q{ /body>
/html>
};
my $err_file = $ARGV[0];
open(FD, $err_file ) or die can't open file errors.ora $! ;
while ($line = FD>) {
if($line =~ /^[A-Z]{3,4}-[0-9]{5}/) {
if($i >= 100) {
$last = $&;
if(substr($last, 0, 3) eq substr($first, 0, 3) ) {
$filename = $first . - . substr($last,index($last, '-')+1) . '.htm';
} else {
$last =~ s/-/_/;
$filename = $first . - . $last . '.htm';
}
$line =~ s#^([A-Z]{3,4}-[0-9]{5}) (.*)# a name=$1> /a> h3> font color=red>$1 /font> $2 /h3>#;
$buf.=$line;
$line = FD>;
until(($line =~ /^[A-Z]{3,4}-[0-9]{5}/)) {
$buf.=$line;
$line = FD>;
$line =~ s#^Cause:# p> font color=blue> b>Cause: /b> /font>#;
$line =~ s#^Action:# p> font color=blue> b>Action: /b> /font>#;
}
#print substr($line,0, length($line) - 1) . __SLIMZHAO ;
$buf.=$html_tail;
open(TMPFD, >$filename ) or die can't open $filename $! ;
print TMPFD $buf;
close(TMPFD);
$first = substr($line,0,index($line, ' '));
$first =~ s/-/_/;
$line =~ s#^([A-Z]{3,4}-[0-9]{5}) (.*)# p> a name=$1> /a> h3> font color=red>$1 /font> $2 /h3>#;
$buf = $line;
$i = 1;
next ;
} else {
if($i == 1) {
$first = substr($line,0,index($line, ' '));
$first =~ s/-/_/;
$line =~ s#^([A-Z]{3,4}-[0-9]{5}) (.*)#$html_head a name=$1> /a> h3> font color=red>$1 /font> $2 /h3>#;
$buf = $line;
} else {
$line =~ s#^([A-Z]{3,4}-[0-9]{5}) (.*)# hr> p> a name=$1> /a> h3> font color=red>$1 /font> $2 /h3>#;
$buf .= $line;
}
$i++;
}
} else {
$line =~ s#^Cause:# p> font color=blue> b>Cause: /b> /font>#;
$line =~ s#^Action:# p> font color=blue> b>Action: /b> /font>#;
$buf.=$line;
}
}
close(FD);
==================================================================================
将每个HTML文件的Title改为文件名:
for i in *.htm
do
ed $i END
g/ title>/s/Error/$i/
wq
END
done
为了在最终的CHM文档中可以使用索引进行查找, 还得有一个关于每个错误号的索引, 这在前面的PERL 程序中已经埋下伏笔, 然后是用grep 将这些 超链接 从这102个HTML文档中搜索出来, 重定向到一个文本文件中, 然后再经VIM处理, 成为如下这种格式,
sed -e 's/ / </g' -e 's/>/ >/g' ../oracle_error.pl > oraerr.txt
perl tmp.pl oraerr.txt
grep a *.htm | sed 's/:.* a name= ([^>]* ).*/: 1/' >links.txt
结果如下:
DRG_10708-11530.htm:DRG-10708
DRG_10708-11530.htm:DRG-10750
DRG_10708-11530.htm:DRG-10751
DRG_10708-11530.htm:DRG-10752
微软的HTML HELP WORKSHOP工具, 其索引文件index.hhk的是一个文本文件, 格式比较规范, 关键部分如下:
==================================================================================
UL>
LI> OBJECT type= text/sitemap >
param name= Name value= location1 >
param name= Local value= resume1.htm >
/OBJECT>
LI> OBJECT type= text/sitemap >
param name= Name value= loc2 >
param name= Local value= resume1.htm#slimzhao >
/OBJECT>
/UL>
==================================================================================
这是awk的长处:
==================================================================================
#!/usr/bin/awk -f
BEGIN {
filename= ;
FS= : ;
first=1;
}
{
if(filename != $1) {
filename = $1;
if(first == 1) { print UL> ; first = 0; }#前一个文件的最后一个元素结束
else { print /UL> ; first = 0; }
printf LI> OBJECT type= text/sitemap > n t param name= Name value= %s > n t param name= Local value= %s > n t /OBJECT> n t UL> n t , substr($1,0, length($1) - 4), $1;
foo($1,$2);
} else {
foo($1,$2);
}
}
function foo (filename, str) {
printf LI> OBJECT type= text/sitemap > n t t param name= Name value= %s > n t t param name= Local value= %s#%s > n t /OBJECT> n t , str, filename, str;
}
END {
printf /UL> n /UL> ;
}
==================================================================================
其*.hhc文件,也指定为index.hhk
剩下的过程就简单了, 观察一下微软的文件格式, 都是文本文件, 类HTML语法, 将这庞大的1万多条索引信息加入其中, 编译!
Unics用户呢?
对于Unics的用户, 我强烈推荐使用它的兄弟程序:search_error.pl, 这同样是基于ORACLE公司的错误信息文档, 该程序用perl编写, 数据本身也放在程序的尾部. 这样做有两个好处:一来不必另外再去维护它的数据文件, 二则实践表明, 放在一个文件中速度要快很多. 可以在 http://www.lslnet.com/linux/docs/linux-3842.htm下载. 使用很简单:
1. 对于ORA类的错误信息:
search_error.pl 17
search_error.pl ora-00017
都可以
2. 对于非ORA类的错误信息, 必需:
search_error.pl pls-00102