2007年8月4日土曜日

HSファイルからHTMLヘルプを作成する

HSP3.1から同梱されなくなったHTMLヘルプを作成するスクリプト。
命令一覧は作成しません。

祝・50投稿ヽ(´▽`)ノ

よくよく考えたらHHXのDBにはABC順に記録されているので、配列を使う必要は全くありませんでした。
もしEXE化する機会があれば処理方法を再度考え直してみたいと思います。

改良版をこちらのページから入手できます。

関連:HSファイルからHTMLヘルプを作成する(2)

// hsファイルからHTMLヘルプを作成
#include "../hsphelp/src/hhx_db.hsp"
#module
// 関数名・命令名からidを得る
#defcfunc get_id str name, local s
    s = name
    if ( peek( s, 0 ) < 'a' ) | ( 'z' < peek( s, 0 ) ) : s = strmid( s, 1strlen( 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"
    }
#global

    chdir dir_exe + "/hsphelp"

    gosub *load_db           // HHXのDBからデータをロードする
    gosub *init              // 前準備
    gosub *make_html_files   // HTMLファイルを作成する
    gosub *make_css_file     // CSSファイルを作成する
    dialog "finish"
    end

*load_db
    HHX_init_load_db
    if HHX_currentset_sum() ! HHX_diskset_sum() {
        mes "rebuilding db..."           // HSファイルに何かしらの変更が加わったため、DBを再構築
        HHX_init_rebuild_db DBR_WRITEDB
    } else {
        HHX_init_extract_db
    }
    return

*init
    // a ~ zと特殊文字(_, #)用のファイルを用意
    sdim file, 1024, 'z' - 'a' + 2 
    dim file_offset, 'z' - 'a' + 2 

    // HTMLのヘッダをそれぞれのファイルに書き込む
    buf = {"<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.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>
<body>
\t<h1>HSP command help</h1>\n"}

    l = strlen( buf )
    repeat 'z' - 'a' + 2
        file( cnt ) = buf
        file_offset( cnt ) = l
    loop
    return

*make_html_files
    db_num = HHX_select_all() // すべての命令・関数を検索対象とする

    repeat db_num
        c = HHX_get_next()
        db_name  = hhxdata( c, C_NAME )         // 命令・関数名
        file_num = get_filenum( db_name )       // この命令が記録されるHTMLの通し番号(独自に定義したもの)

        // 見出し(h2タグ)
        buf = "\t<h2 id=\"" + get_id( db_name ) + "\" class=\"keyword_name\">" + db_name + " " +  hhxdata( c, C_PRM ) + "\t\t[" + hhxdata( c, C_SUMMARY ) + "]</h2>\n"
        // パラメータ
        if hhxdata( c, C_PRM2 ) != "" {
            buf += "\t\t<p class=\"prm\">" + 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_filenameget_filenum( s ) ) + "#" + get_id( s ) + "\">" + s + "</a></li>\n"
                if l <= i : break
            loop
            buf += "\t\t</ul>"
        }
        // 水平線(次の項目との区切り)
        buf += "\n\t<hr>\n\n"

        // 配列に保存
        l = strlen( buf )
        file( file_num ) += buf
        file_offset( file_num ) += l

;       title str( 100 * double( cnt ) / db_num ) + "% finished..."
;       await 1
    loop

    // ファイルをディスクに保存
    repeat 'z' - 'a' + 2
        file( cnt ) += "</body></html>"
        file_offset( cnt ) += strlen"</body></html>" )
        bsave get_filenamecnt ), file( cnt ), file_offset( cnt )
    loop
    return

*make_css_file
    buf = {"body {
background-color : #f0e0d0 ;
}
h2 {
color : #000080 ;
font-size : large ;
font-weight : bold ;
white-space : pre ;
}
h3 {
font-weight : bold ;
}
p.prm {
color : #000080 ;
font-size : small ;
white-space : pre ;
margin-left : 70px;
}
p.inst {
margin-left : 70px;
white-space : pre ;
}
p.note {
margin-left : 70px;
}
ul.href {
margin-left : 70px;
}"}

    bsave "hsphelp.css", buf, strlen( buf )
    return

0 件のコメント: