支持自动TOC超文本目录生成的chm转换器(perl脚本)

来源:互联网 发布:c语言status什么意思 编辑:程序博客网 时间:2024/06/05 10:49

早些时候为自已使用方便编写了一个将chm解压结果文件压中的hhc文件转换成目录式html的脚本。如果大家需要这个功能,可以从这里找到。两个脚本程序都是使用perl语言编写,所以你需要一个比较IN的perl发行版(区区推荐是ActivePerl)。

 

用google很容易就能找到windows系统内置的chm解压方式:

HH.EXE -decompile [解压至路径] [被解压chm文件路径]

 

对比了一下HH.exe和区区常用的7z,发现hh.exe decompile出来的文件更加干净一些(没有meta信息文件),这正是区区想要的,所以,将原来的hhc2idx.pl改写成chm2htm.pl,支持直接由chm直接生成一个目录,其中的所有hhc文件会分别产生一个名字类似"CHTOC_XXXXX.htm"的超文本目录网页。

 

有两个原因使得这个工具很有用:

  • 不是所有环境下看chm都很方便,比如linux/手机/NDS
  • hh真的不是很便捷的htm查看器,相比于现代化的Browser,它太弱

 

程序使用方法很简单(尤其对于程序员而言),在安装好ActivePerl之后,在命令行中输入(最好先cd到chm文件所在目录) :

chm2htm.pl [你的chm文件名]

命令成功运行的话,会以chm文件名为目录名新建一个导出目录。

 

如果在使用中发现有任何问题,欢迎反馈。

 

下面是程序源码,因为CSDN对perl脚本的处理有bug(会自行加如型如"mce_ref=xxxx"之类的无关文本),所以是自行调色的:

 

 


 

use feature qw(say);
use HTML::TreeBuilder;
use File::Basename;
if ($#ARGV < 0) {
    say "/n/nusage: chm2htm.pl your.chm1 [your.chm2 ...]";
    exit;
}

sub dump_chm
{
    my ($chm_name) = @_;
    say "processing file : ".$chm_name;
    my $base_name = basename($chm_name, ".chm");
    system("hh -decompile $base_name $chm_name");
    my @hhcs = glob("$base_name/*.hhc");
    for my $hhc_file (@hhcs) {
        my $tree = HTML::TreeBuilder->new; # build empty tree
       
        $tree->parse_file($hhc_file); #parse hhc file as HTML
        $tree->elementify(); #optional prevent reparse
       
        @objects = $tree->look_down("_tag","object"); #all object
        #say "there ar $#objects ob";
        for my $ob (@objects) {
            my ($el, $dst, $name);
            $el = $ob->look_down("name", "Local"); #Local val as <a> href URL
            if (defined($el)) {
                $dst = $el->attr('value')
            }
            $el = $ob->look_down("name", "Name");  #Name val as <a> text
            if (defined($el)) {
                $name = $el->attr('value')
            }
            #say sprintf('<a href="%s">%s</a>', $dst, $name);
            if (defined($dst) && defined($name)) {
                $ob->replace_with(
                    sprintf('<a href="%s">%s</a>', $dst, $name)
                    );
            } else {
                $ob->replace_with(
                    sprintf('<strong>trans by chm2htm : meet some unkown object</strong>', $dst, $name)
                    );
            }
        }
        my $outfilename = $base_name . "/CHTOC_" . basename($hhc_file, ".hhc") . ".htm";
        say 'TOC file put into : '.$outfilename;
        my $outfile;
        open $outfile, ">", $outfilename;
        say $outfile $tree->as_HTML("", " "); #say out the new html text
# Now that we're done with it, we must destroy it.
        $tree = $tree->delete;
    }
}

dump_chm($_) for (@ARGV);

 

 


 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 在单位混臭了怎么办 在公司名声臭了怎么办 怀孕三个月吐的厉害怎么办 孕38周轻微贫血怎么办 孕38周中度贫血怎么办 孕38周贫血严重怎么办 孕38周有点贫血怎么办 脚被热水烫红了怎么办 学员练车撞死人怎么办 三胎意外来了该怎么办 因为飞机延误耽误行程怎么办 伤了朋友的心怎么办 羊蹄被绳子缠肿了怎么办 新老师教的不好怎么办 跟老公三观不合怎么办 突然有社保补扣怎么办 街头篮球篮板反应慢怎么办 换水了龙鱼顶缸怎么办 压着眼睛睡觉醒来模糊怎么办 天热眼睛有眼屎怎么办 眼睛里膜起来了怎么办 眼睛一边大一边小怎么办 眼白膜鼓起来了怎么办 主持问答环节没人提问怎么办 转学原学校不给怎么办 村长借东西不还怎么办 村长不上报建房申请怎么办 村长不上报建房手续申请怎么办 村长不给村民盖章怎么办? 找村干部办事难怎么办 洪洞县村长不给我盖章怎么办 睾丸穿刺取精只配到6个胚胎怎么办 孩子一只耳朵听不到声音怎么办 孕早期孕囊生长慢怎么办 试管2次不着床怎么办? pescm球员年龄大了怎么办 实况足球俱乐部经理球员老了怎么办 你不是我的菜怎么办 苹果平板电脑耳机有回音怎么办 obs直播有电流音怎么办 语音里网吧很吵怎么办