XHTMLに変わっている点を除き、恐らく機能的には以前同梱されていたヘルプと完全互換。
かなり大きめ(~1.5MB)のテキストデータを扱いますので、スペックに自信がない場合はawaitのコメントアウトをはずすか、他のアプリケーションを終了させた状態で実行することをオススメします。
グループを定義していない命令を想定していなかった問題を修正。
再現性を向上。現在再現性や利便性の向上を図り、改良中です。満足のいくものができたら公開します。v1.1を公開しました。
ウェブサイトで新バージョンの配布を行っています。
関連:HSファイルからHTMLヘルプを作成する// hsファイルからHTMLヘルプを作成
// 機能別索引を除くすべての索引も作成する
#include "../hsphelp/src/hhx_db.hsp"
#module
//
// 関数名・命令名からidを得る
#defcfunc get_id str name, local s
s = name
if ( peek( s, 0 ) == '#' ) : s = strmid( s, 1, strlen( s ) - 1 )
return "s_" + s
// 関数名・命令名からファイルの通し番号(独自に定義)を得る
// help_a.htmlを0、help_b.htmを1、…help_sp.htmを26とする
#defcfunc get_filenum str name, local s, local p
s = name
p = peek( s, 0 )
if ( 'A' <= p ) & ( p <= 'Z' ) : p -= 'A' - 'a'
if ( 'a' <= p ) & ( p <= 'z' ) {
return p - 'a'
} else {
return 'z' - 'a' + 1
}
//
// 通し番号からファイル名を得る
#defcfunc get_filename int num
if ( 0 <= num ) & ( num <= 'z' - 'a' ) {
return "help_" + strf( "%c", num + 'a' ) + ".htm"
} else {
return "help_sp.htm"
}
//
// 半角スペースで埋める
#defcfunc add_spaces str sTarget, local iLength, local sResult
iStrlen = strlen( sTarget )
iLength = 30 - iStrlen
if iLength < 1 : iLength = 1
sdim sResult, iLength + iStrlen + 1
sResult = sTarget
memset sResult, ' ', iLength, iStrlen
return sResult
#global
chdir dir_exe + "/hsphelp"
sdim buf, 10000
html_header = {"<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">
<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"ja\" lang=\"ja\">
<head>
\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=Shift_JIS\" />
\t<meta http-equiv=\"Content-Language\" content=\"ja\" />
\t<link rel=\"stylesheet\" type=\"text/css\" href=\"hsphelp.css\" />
\t<title>HSP command help</title>
</head>
"}
gosub *load_db // HHXのDBからデータをロードする
gosub *make_html_files // HTMLファイルを作成する
gosub *make_frame_file // フレーム用HTMLファイルを作成する
gosub *make_ref_file // グループ別索引用HTMLを作成
gosub *make_css_file // CSSファイルを作成する
dialog "HTMLファイルの作成が完了しました。\nHTMLファイルを開きますか?", 2
if stat == 6 : exec "indexf.htm", 16
end
*load_db
HHX_init_load_db
if HHX_currentset_sum() ! HHX_diskset_sum() {
mes "HHXのデータベースをリビルドしています..." // HSファイルに何かしらの変更が加わったため、DBを再構築
HHX_init_rebuild_db DBR_WRITEDB
} else {
HHX_init_extract_db
}
mes "HHXのデータベースをロードしました。"
return
*init_file
// HTMLのヘッダを書き込む
sdim file, 20000
file = html_header + "<body>\n\t<h1>HSP command help</h1>\n"
file_offset = strlen( file )
return
*save_file
// HTMLファイルを保存する
file += "</body></html>"
file_offset += strlen( "</body></html>" )
bsave get_filename( file_type ), file, file_offset
return
*init_index
// 索引用HTMLのヘッダを書きこむ
sdim index, 100000 : index = html_header + "<body>\n\t<h1>HSP command help ABC順索引</h1><ul class=\"index_list\">\n" // 索引
sdim indexf, 100000 : indexf = html_header + "<body>\n\t<h1>索引</h1>\n\t<ul class=\"indexf_list\">\n" // フレーム用ミニ索引
indexf += "<p><a href=\"hspref.htm\" target=\"main\">グループ別索引</a></p>\n"
indexf += "<p><a href=\"hsppidx.htm\" target=\"main\">ABC順索引</a></p>\n"
index_offset = strlen( index )
indexf_offset = strlen( indexf )
return
*save_index
// 索引用HTMLを保存する
index += "\t</ul>\n</body></html>"
indexf += "\t</ul>\n</body></html>"
index_offset += strlen( "\t</ul>\n</body></html>" )
indexf_offset += strlen( "\t</ul>\n</body></html>" )
bsave "hsppidx.htm", index, index_offset
bsave "hsppidxf.htm", indexf, indexf_offset
return
*make_html_files
// HTMLファイルを作成する
mes "HTMLファイルの作成を開始..."
db_num = HHX_select_all() // すべての命令・関数を検索対象とする
file_type = get_filenum( "#" ) // 最初は記号で始まる命令用のファイル(help_sp.htm)からはじめる
file_name = get_filename( file_type )
gosub *init_file
gosub *init_index
repeat db_num
c = HHX_get_next()
db_name = hhxdata( c, C_NAME ) // 命令・関数名
id = get_id( db_name )
if file_type != get_filenum( db_name ) {
// 次のHTMLファイルへ移行
gosub *save_file
gosub *init_file
file_type = get_filenum( db_name )
file_name = get_filename( file_type )
}
// 索引
buf = "\t\t<li><a href=\"" + file_name + "#" + id + "\">" + add_spaces( db_name ) + hhxdata( c, C_SUMMARY ) + "</a></li>\n"
index += buf : index_offset += strlen( buf )
buf = "\t\t<li><a href=\"" + file_name + "#" + id + "\" target=\"main\">" + db_name + "</a></li>\n"
indexf += buf : indexf_offset += strlen( buf )
// 見出し(h2タグ)
buf = "\t<h2 id=\"" + id + "\" class=\"keyword_name\">" + db_name + "</h2>\n"
// パラメータ
buf += "\t<p class=\"prm\">" + add_spaces( db_name + " " + hhxdata( c, C_PRM ) ) + "[" + hhxdata( c, C_SUMMARY ) + "]</p>\n"
// パラメータ詳細
if hhxdata( c, C_PRM2 ) != "" {
buf += "\t\t<p class=\"prm_detail\">" + hhxdata( c, C_PRM2 ) + "</p>\n"
}
// 説明文
if hhxdata( c, C_INST ) != "" {
buf += "\t\t<h3>説明</h3><p class=\"inst\">" + hhxdata( c, C_INST ) + "</p>\n"
}
// 備考
if hhxdata( c, C_NOTE ) != "" {
buf += "\t\t<h3>備考</h3><p class=\"note\">" + hhxdata( c, C_NOTE ) + "</p>\n"
}
// 参照
if hhxdata( c, C_HREF ) != "" {
buf += "\t\t<h3>参照</h3><ul class=\"href\">"
i = 0 : l = strlen( hhxdata( c, C_HREF ) )
repeat
getstr s, hhxdata( c, C_HREF ), i, ' '
i += strsize
buf += "\t\t\t<li><a href=\"" + get_filename( get_filenum( s ) ) + "#" + get_id( s ) + "\">" + s + "</a></li>\n"
if l <= i : break
loop
buf += "\t\t</ul>"
}
// 水平線(次の項目との区切り)
buf += "\n\t<hr>\n\n"
// 変数に書き込み
file += buf
file_offset += strlen( buf )
; title str( double( cnt ) / db_num ) + "% finished..."
; await 1
loop
// 最後のファイルをディスクに保存
gosub *save_file
gosub *save_index
return
*make_ref_file
db_num = HHX_select_all()
HHX_order_by C_GROUP
sdim ref, 100000
ref = html_header + "<body>\n\t<h1>HSP command help グループ別索引</h1>\n"
ref += "\t<h2>(グループ未定義)</h2>\n\t\t<ul class=\"ref_list\">\n"
ref_offset = strlen( ref )
group_name = ""
repeat db_num
c = HHX_get_next()
buf = ""
db_name = hhxdata( c, C_NAME )
db_group = hhxdata( c, C_GROUP )
if group_name != db_group {
buf += "\t\t</ul>\n"
buf += "\t<h2>" + db_group + "</h2>\n\t\t<ul class=\"ref_list\">\n"
group_name = db_group
}
buf += "\t\t\t<li><a href=\"" + get_filename( get_filenum( db_name ) ) + "#" + get_id( db_name ) + "\">" + add_spaces( db_name ) + hhxdata( c, C_SUMMARY ) + "</a></li>\n"
ref += buf
ref_offset += strlen( buf )
loop
ref += "\t\t</ul>\n</body></html>"
ref_offset += strlen( "\t\t</ul>\n</body></html>" )
bsave "hspref.htm", ref, ref_offset
return
*make_frame_file
buf = html_header + {"\t<frameset cols=\"80%,*\">
\t\t<frame src=\"hspref.htm\" name=\"main\" />
\t\t<frame src=\"hsppidxf.htm\" name=\"sub\" />
\t</frameset>
\t<noframes>
\t\t<p>これはフレーム対応ブラウザ用のファイルです。<br />
\t\tフレームに対応したブラウザでご覧になるか、<a href=\"hsppidx.htm\">命令一覧</a>をご利用ください。</p>
\t</noframes>
</html>"}
bsave "indexf.htm", buf, strlen( buf )
return
*make_css_file
mes "CSSファイルの作成を開始..."
buf = {"body {
\tbackground-color : #f0e0d0 ;
}
h2 {
\tcolor : #000080 ;
\tfont-size : large ;
\tfont-weight : bold ;
\twhite-space : pre ;
}
h2.keyword_name {
\tfont-size : x-large ;
\tcolor : #504030 ;
\tfont-weight : bold ;
}
h3 {
\tfont-weight : bold ;
}
p.prm {
\tcolor : #000080 ;
\twhite-space : pre ;
\tmargin-left : 70px ;
\tfont-size : large ;
\tfont-weight : bold ;
\tfont-family : monospace ;
}
p.prm_detail {
\tcolor : #000080 ;
\tfont-size : small ;
\twhite-space : pre ;
\tmargin-left : 70px ;
}
p.inst {
\tmargin-left : 70px ;
\twhite-space : pre ;
}
p.note {
\tmargin-left : 70px ;
}
ul.href {
\tmargin-left : 70px ;
}
ul.index_list {
\tfont-size : large ;
}
ul.index_list li {
\twhite-space : pre ;
\tfont-family : monospace ;
\tmargin-bottom : 1ex ;
}
ul.indexf_list {
}
ul.ref_list {
\tfont-size : large ;
}
ul.ref_list li {
\twhite-space : pre ;
\tfont-family : monospace ;
\tmargin-bottom : 1ex ;
}"}
bsave "hsphelp.css", buf, strlen( buf )
return
2007年8月12日日曜日
HSファイルからHTMLヘルプを作成する(2)
ラベル:
HHXモジュールの利用,
HSP,
HTML出力,
文字列操作・解析
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿