2008-02 / 2008-02-27

前のエントリ: ActivePerlのppmがGUIになってる [perl]
次のエントリ: Text::Diff で差分抽出 [perl]

Text::CHMでHTMLヘルプファイル(.chm)を展開する
2008-02-27-1 / カテゴリ: [programming][perl] / [permlink]

とあるSDKのマニュアルがchmファイルでのみ提供されていて、エディタのキーワード色変更設定用([2005-12-12-1])にAPIだけ抜き出したいとき、とか

・コンストラクタ
$o = Text::CHM->new(ヘルプ.chm);

・ファイルオブジェクトのリスト取得
@l = $o->get_filelist();

・ファイルのパスを取得
$path = $l[n]->{path}
path以外にsize、titleを取得できる模様。

・ファイルの中身を取得
$data = $l[n]->get_object($path);

・終了
$o->close();

作ったスクリプト (動作確認 ActivePerl 5.8.8)
#!/usr/bin/perl -w

use strict;
use Encode;
use Text::CHM;
use File::Basename;
use File::Path;

my $chmfile = shift;
unless (-f $chmfile) {
  print "no such file: $chmfile\n";
  exit 0;
}
my ($outdir) = fileparse($chmfile, ('.chm'));

my $chm = Text::CHM->new($chmfile);
foreach my $content ($chm->get_filelist()) {
  my $dir = dirname(my $file = $outdir . $content->{path});
  next if $file =~ m|/$|;
  mkpath [$dir] unless -d $dir;
  open W, ">:raw", "$file"
    or die "cannot open $file: $!\n";
  print W $chm->get_object($content->{path});
  close W;
}
$chm->close();
第一引数に展開(解凍)したいchmファイルを指定して実行すると、ファイル名(拡張子なし)のディレクトリを作って、その下にバラす。
ヘルプファイルの中にはイメージなどのバイナリも含まれることがあるので、ファイル出力時には raw モードで書き出す。

ヘルプにも書いてあるけど
$chm->get_object($content->{path});
を、stdout とかに出力すると、結構大変なことになるので注意。
前のエントリ: ActivePerlのppmがGUIになってる [perl]
次のエントリ: Text::Diff で差分抽出 [perl]

2013 : 01 02 03 04 05 06 07 08 09 10 11 12
2012 : 01 02 03 04 05 06 07 08 09 10 11 12
2011 : 01 02 03 04 05 06 07 08 09 10 11 12
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
2004 : 01 02 03 04 05 06 07 08 09 10 11 12

最終更新時間: 2013-05-02 16:12