2007年9月9日日曜日

HSPスクリプトビューワ(Footy2)

Footy2とHHXモジュールによるスクリプトビューワ。機能は読み込みのみで、保存さえできません(^-^;

私がプログラミングを始めたころはリッチテキストを扱うなんてまさに雲の上のお話だったのですが、なべしんさんのおかげでとても簡単になりました。ちょっと信じ難いくらいお手軽です。

それとヘッダファイルFooty2.asを作成したので、なべしんさんの許可が降りたら公開したいと思います。
#include "../hsphelp/src/hhx_db.hsp"
#uselib "Footy2.dll"
#func Footy2Create "Footy2Create" int, int, int, int, int, int
#func Footy2Delete "Footy2Delete" int
#func Footy2TextFromFile "Footy2TextFromFileA" int, sptr, int
#func Footy2AddEmphasis "Footy2AddEmphasisA" int, sptr, sptr, int, int, int, int, int, int
#func Footy2FlushEmphasis "Footy2FlushEmphasis" int
// 独立レベル
/*ASCII記号用フラグ*/
#define global EMP_IND_PARENTHESIS 0x00000001//!< 前後に丸括弧()があることを許可する
#define global EMP_IND_BRACE 0x00000002//!< 前後に中括弧{}があることを許可する
#define global EMP_IND_ANGLE_BRACKET 0x00000004//!< 前後に山形括弧<>があることを許可する
#define global EMP_IND_SQUARE_BRACKET 0x00000008//!< 前後に各括弧[]があることを許可する
#define global EMP_IND_QUOTATION 0x00000010//!< 前後にコーテーション'"があることを許可する
#define global EMP_IND_UNDERBAR 0x00000020//!< 前後にアンダーバー_があることを許可する
#define global EMP_IND_OPERATORS 0x00000040//!< 前後に演算子 + - * / % ^  があることを許可する
#define global EMP_IND_OTHER_ASCII_SIGN 0x00000080//!< 前述のものを除く全てのASCII記号 # ! $ & | \ @ ?  .
/*ASCII文字列を指定するフラグ*/
#define global EMP_IND_NUMBER 0x00000100//!< 前後に数字を許可する
#define global EMP_IND_CAPITAL_ALPHABET 0x00000200//!< 前後に大文字アルファベットを許可する
#define global EMP_IND_SMALL_ALPHABET 0x00000400//!< 前後に小文字アルファベットを許可する
/*空白を指定するフラグ*/
#define global EMP_IND_SPACE 0x00001000//!< 前後に半角スペースを許可する
#define global EMP_IND_FULL_SPACE 0x00002000//!< 前後に全角スペースを許可する
#define global EMP_IND_TAB 0x00004000//!< 前後にタブを許可する
/*そのほかの文字列*/
#define global EMP_IND_JAPANESE 0x00010000//!< 日本語
#define global EMP_IND_KOREAN 0x00020000//!< 韓国語
#define global EMP_IND_EASTUROPE 0x00040000//!< 東ヨーロッパ
#define global EMP_IND_OTHERS 0x80000000//!< 上記以外
/*省略形(主にこれらを使用すると指定が楽です)*/
#define global EMP_IND_ASCII_SIGN 0x000000FF//!< 全てのASCII記号列を許可する
#define global EMP_IND_ASCII_LETTER 0x00000F00//!< 全てのASCII文字を許可する(数字とアルファベット)
#define global EMP_IND_BLANKS 0x0000F000//!< 全ての空白文字列を許可する
#define global EMP_IND_OTHER_CHARSETS 0xFFFF0000//!< 全てのキャラクタセットを許可する
#define global EMP_IND_ALLOW_ALL 0xFFFFFFFF//!< 何でもOK

// キャラクタセット
#enum global CSM_AUTOMATIC = 0

// ビュー状態
#enum global VIEWMODE_NORMAL = 0

#enum global EMP_INVALIDITY = 0//!< 無効
#enum global EMP_WORD//!< 単語を強調
#enum global EMP_LINE_AFTER//!< それ以降~行末
#enum global EMP_LINE_BETWEEN//!< 二つの文字の間(同一行に限る・二つの文字列を指定)
#enum global EMP_MULTI_BETWEEN//!< 二つの文字の間(複数行にわたる・二つの文字列を指定)

// 強調表示モード
#define global EMPFLAG_BOLD   0x00000001//!< 太字にする
#define global EMPFLAG_NON_CS 0x00000002//!< 大文字と小文字を区別しない
#define global EMPFLAG_HEAD   0x00000004//!< 頭にあるときのみ

// エラー
#define global FOOTY2ERR_NONE           0   //!< 関数が成功した
#define global FOOTY2ERR_ARGUMENT       -1  //!< 引数おかしい
#define global FOOTY2ERR_NOID           -2  //!< IDが見つからない
#define global FOOTY2ERR_MEMORY         -3  //!< メモリー不足
#define global FOOTY2ERR_NOUNDO         -4  //!< アンドゥ情報がこれ以前に見つからない
#define global FOOTY2ERR_NOTSELECTED    -5  //!< 選択されていない
#define global FOOTY2ERR_UNKNOWN        -6  //!< 不明なエラー
#define global FOOTY2ERR_NOTYET         -7  //!< 未実装(ごめんなさい)
#define global FOOTY2ERR_404            -8  //!< ファイルが見つからない、検索文字列が見つからない
#define global FOOTY2ERR_NOTACTIVE      -9  //!< アクティブなビューは存在しません
#define global FOOTY2ERR_ENCODER        -10 //!< 文字コードのエンコーダが見つかりません(ファイルのエンコード形式が不正です、バイナリとか)
#define global FOOTY2ERR_NOT_SELECTING  -11 //!< 選択していない

#define COLOR_COMMENT 0xcccccc
#define COLOR_COMMAND 0xcc00cc
#define COLOR_FUNC 0xffff00
#define COLOR_PREPROCESS 0xffcc00
#define COLOR_LABEL 0xffff00
#define COLOR_SYSVAR 0xcc9900
#define COLOR_MACRO 0xcc9900
#define COLOR_STRING 0x00ccff
    title "Footytest"
    Footy2Create hwnd00ginfo_winxginfo_winyVIEWMODE_NORMAL
    if ( stat != FOOTY2ERR_NONE ) : end
    idFooty = stat

    // ファイルを読み込む
    dialog "hsp"16
    if ( stat == 0 ) : end
    fileName = refstr
    Footy2TextFromFile idFooty, fileName, CSM_AUTOMATIC
    if ( stat != FOOTY2ERR_NONE ) : end

    // hsphelpディレクトリの存在を確認
    chdir dir_exe
    dirlist s, "hsphelp"5 
    if ( stat == 0 ) : dialog "hsphelpディレクトリが見つかりません。"1 : end
    chdir dir_exe + "/hsphelp"

    // HHXのデータベースをロード
    HHX_init_load_db
    if HHX_currentset_sum() ! HHX_diskset_sum() {
        // HSファイルに何かしらの変更が加わったため、データベースを再構築
        logmes "HHXのデータベースをリビルドしています..."
        HHX_init_rebuild_db DBR_READONLY
    } else {
        HHX_init_extract_db             // 配列変数hhxdataxにメモリ上のデータをロード
    }
    logmes "HHXのデータベースをロードしました。"

    // データベースから命令・関数をひとつずつ取り出し、その名前を列挙する
    db_num = HHX_select_all()           // すべての命令・関数などを検索対象とする(ABC順)
    sdim buf, 16000
    notesel buf
    repeat db_num
        c = HHX_get_next()              // 次の命令・関数などのナンバーを取得
        db_name  = hhxdata( c, C_NAME )
        db_group = hhxdata( c, C_GROUP )
        db_prm   = hhxdata( c, C_PRM )
        if instr( db_group, 0"プリプロセッサ命令" ) >= 0 {
            ; プリプロセッサ
            Footy2AddEmphasis idFooty, db_name, 0EMP_WORD011EMP_IND_BLANKSCOLOR_PREPROCESS
        } else : if instr( db_group, 0"システム変数" ) >= 0 {
            ; システム変数
            Footy2AddEmphasis idFooty, db_name, 0EMP_WORD011EMP_IND_BLANKS | EMP_IND_PARENTHESIS | EMP_IND_OTHER_ASCII_SIGNCOLOR_SYSVAR
        } else : if instr( db_group, 0"マクロ" ) >= 0 {
            ; マクロ
            Footy2AddEmphasis idFooty, db_name, 0EMP_WORD011EMP_IND_BLANKS | EMP_IND_PARENTHESIS | EMP_IND_OTHER_ASCII_SIGNCOLOR_MACRO
        } else : if db_prm = "" {
            ; 引数なし(命令)
            Footy2AddEmphasis idFooty, db_name, 0EMP_WORD011EMP_IND_BLANKSCOLOR_COMMAND
        } else : if peek( db_prm ) = '(' {
            ; 関数型
            Footy2AddEmphasis idFooty, db_name, 0EMP_WORD011EMP_IND_BLANKS | EMP_IND_PARENTHESISCOLOR_FUNC
        } else {
            ; 命令型
            Footy2AddEmphasis idFooty, db_name, 0EMP_WORD011EMP_IND_BLANKSCOLOR_COMMAND
        }
    loop
    // そのほかの色分け
    Footy2AddEmphasis idFooty, "/*""*/"EMP_MULTI_BETWEEN011EMP_IND_ALLOW_ALLCOLOR_COMMENT
    Footy2AddEmphasis idFooty, ";"0EMP_LINE_AFTER011EMP_IND_ALLOW_ALLCOLOR_COMMENT
    Footy2AddEmphasis idFooty, "//"0EMP_LINE_AFTER011EMP_IND_ALLOW_ALLCOLOR_COMMENT
    Footy2AddEmphasis idFooty, "*"0EMP_LINE_AFTEREMPFLAG_HEAD11EMP_IND_ALLOW_ALLCOLOR_LABEL
    Footy2AddEmphasis idFooty, "{\"""\"}"EMP_MULTI_BETWEEN02, -1EMP_IND_ALLOW_ALLCOLOR_STRING

    // 色分けを反映
    Footy2FlushEmphasis idFooty

    onexit *exit
    stop
*exit
    Footy2Delete FootyID
    end

8 件のコメント:

匿名 さんのコメント...

どうも、はじめましてなべしんです。見つけたので足跡残しておきます。使っていただいているようで恐縮です。よくあの謎だらけのFooty2.hを解読できましたね(笑)。プリプロセスだらけで書いた本人ですら正直分からなくなってきました。

せっかくですのでお作りいただいたFooty2.as、うちのSubversionサーバに入れませんか?OKならアカウント作りますのでメールください。Subversion管理にするのが面倒ならそのままブログ上で公開していただいても結構です(便利は便利ですが最初にいろいろ設定とか必要なソフトとかあるので…)。

eller さんのコメント...

なべしんさんはじめまして、ellerと申します。こんなところまで来てくださって恐縮です。
ユーザ側としてもFootyにはいつもお世話になっています(ご存知の通りHSPのエディタはFooty製です)。

>よくあの謎だらけの...
HSPはWindowsPC上でしか動作しないという制限があるので、ヘッダファイルの解読は比較的簡単でした。でもまだ不具合が潜んでいるかも知れません。
詳しくはないのですが、モバイルでも動作するよう苦心されているそうですね。技術的にお手伝いできればいいのですが、私には応援することしかできません……。がんばってください。

>うちのSubversionサーバに...
お誘いありがとうございます。
HSP用ヘッダファイルFooty2.asはまだ全機能を検証し終えていないため、自信を持って出せるレベルにありません。
公開方法はある程度出来上がったら改めて考えようと思いますが、今は慣れているWikiによる管理を選びたいと考えています。

eller さんのコメント...

一番大切なことを書かずにうっかり投稿してしまいました。

便利で高機能なDLLを公開してくださって、ありがとうございました!
フリー化の経緯を読むと第3者が手放しに喜ぶべきではないと思いますが、“リッチテキストエディタが簡単に使えるDLLが入手できるようになった”という結果は開発者もどきとしてはやはり嬉しいものです。
DLLにしろモジュールにしろ、こういった“開発の幅を広げる”作品って素敵ですね。見習いたいものです。

匿名 さんのコメント...

横槍を入れるようで大変申し訳ないのですが、Footy2.asはいつごろ公開されるのでしょうか?
結構期待しているのですが・・・

eller さんのコメント...

> 匿名さん
コメントありがとうございます。

一応ヘッダファイルはある程度完成しているのですが、現在プライベートで忙しい関係上、動作検証まで時間を割くことができていません。
今ある分を下記アドレスへアップしておきましたので、自己責任でご利用ください。
http://www.geocities.jp/prjctsp/hsp/Footy2.txt

匿名 さんのコメント...

ellerさん、こんばんは。さくらです。
時々、拝見させて頂いております。
footy2ですが、私も、HSP3用のヘッダを書いて色々検証してみましたが、どうも編集において行番号が狂うなどの現象が発生して落ちるバグがありますね。

ちなみに、カブリますが、ご参考としてわたしが作成したヘッダを下記においてあります。

http://hspnext.com/download/footy2.txt

拡張子を.asに変更して利用して下さい。

eller さんのコメント...

正式版を公開しました。詳しくは下記URLを参照してください。
http://rpen.blogspot.com/2008/01/footy2as.html

アイガモ さんのコメント...

はじめまして、eller様。アイガモと申します。

現在、私はあるツールを作成しています。
Footy2に関する記事を参考にした部分があるのですが、完成した場合、公開してもよろしいでしょうか。

過去にeller様のスクリプトを勝手にHSP3掲示板に投稿してしまったときは申し訳ありませんでした。
これからは、規約をよく読み気をつけていきたいと思うので、どうかよろしくお願い致します。