;============================================================ ; 2007/xx/xx ; S.Programs HHX ; UX main (HSP 3.0) ; http://sprocket.babyblue.jp/ ;============================================================ ;============================================================ #packopt name "helpman" #packopt hide 1 #packopt xsize 1 #packopt ysize 1 #runtime "hhx" ; remove this ; strlen パフォーマンス問題パッチ (speed : 3.7x) #undef strlen #uselib "kernel32" #cfunc global strlen "lstrlenA" var ; includes #include "hhx_lib.hsp" #include "hhx_db.hsp" ;------------------------------------------------------------ ; Application #define ENABLE_MINIWB 0 ; MiniWB モード #define ENABLE_HHW 1 ; Built-in HHW 有効 #define global WM_APP_HHXQ 0x8000 #define global WM_APP_ACTIVATE 0x8001 #define global WM_APP_RELOAD 0x8002 #define global FILEMAP_NAME_HHX "S.Programs HHX 2.15" #if ENABLE_HHW #define HHW_DEBUG 0 #include "hhw.hsp" #endif ;------------------------------------------------------------ ; const ; atl #uselib "atl.dll" #func AtlAxWinInit "AtlAxWinInit" #func AtlAxGetHost "AtlAxGetHost" int, var ; input hwnd, output IUnknown ; IID ;#usecom IUnknown "{00000000-0000-0000-C000-000000000046}" #usecom IAxWinAmbientDispatch "{B6EA2051-048A-11D1-82B9-00C04FB9942E}" #usecom IOleInPlaceActiveObject "{00000117-0000-0000-C000-000000000046}" #comfunc TranslateAccelerator 5 var ; ie event #define DIID_DWebBrowserEvents2 "{34A715A0-6587-11D0-924A-0020AFC7AC4D}" ; exdispid.h #define DISPID_STATUSTEXTCHANGE 102 #define DISPID_BEFORENAVIGATE2 250 // hyperlink clicked on #define DISPID_NEWWINDOW2 251 #define DISPID_NAVIGATECOMPLETE2 252 // UIActivate new document #define DISPID_DOCUMENTCOMPLETE 259 // new document goes ReadyState_Complete #define DISPID_FILEDOWNLOAD 270 // Fired to indicate the File Download dialog is opening #define DISPID_NAVIGATEERROR 271 // Fired to indicate the a binding error has occured ; DocHostFlags #define DOCHOSTUIFLAG_DIALOG 0x1 #define DOCHOSTUIFLAG_DISABLE_HELP_MENU 0x2 #define DOCHOSTUIFLAG_NO3DBORDER 0x4 #define DOCHOSTUIFLAG_SCROLL_NO 0x8 #define DOCHOSTUIFLAG_DISABLE_SCRIPT_INACTIVE 0x10 #define DOCHOSTUIFLAG_OPENNEWWIN 0x20 #define DOCHOSTUIFLAG_DISABLE_OFFSCREEN 0x40 #define DOCHOSTUIFLAG_FLAT_SCROLLBAR 0x80 #define DOCHOSTUIFLAG_DIV_BLOCKDEFAULT 0x100 #define DOCHOSTUIFLAG_ACTIVATE_CLIENTHIT_ONLY 0x200 #define DOCHOSTUIFLAG_OVERRIDEBEHAVIORFACTORY 0x400 #define DOCHOSTUIFLAG_CODEPAGELINKEDFONTS 0x800 #define DOCHOSTUIFLAG_URL_ENCODING_DISABLE_UTF8 0x1000 #define DOCHOSTUIFLAG_URL_ENCODING_ENABLE_UTF8 0x2000 #define DOCHOSTUIFLAG_ENABLE_FORMS_AUTOCOMPLETE 0x4000 #define DOCHOSTUIFLAG_ENABLE_INPLACE_NAVIGATION 0x10000 #define DOCHOSTUIFLAG_IME_ENABLE_RECONVERSION 0x20000 #define DOCHOSTUIFLAG_THEME 0x40000 #define DOCHOSTUIFLAG_NOTHEME 0x80000 #define DOCHOSTUIFLAG_NOPICS 0x100000 #define DOCHOSTUIFLAG_NO3DOUTERBORDER 0x200000 #define DOCHOSTUIFLAG_DELEGATESIDOFDISPATCH 0x400000 ;------------------------------------------------------------ ; misc #define ctype objhwnd(%1) objinfo(%1, 2) #uselib "kernel32" #func GetLongPathName "GetLongPathNameA" str, var, int #func GetModuleFileName "GetModuleFileNameA" int, var, int sdim ModuleFileName, 1024 GetModuleFileName 0, ModuleFileName, 1020 #ifdef _DEBUG ModuleFileName = "helpman" #endif #uselib "user32" #cfunc MoveWindow "MoveWindow" sptr, sptr, sptr, sptr, sptr, sptr #cfunc FindWindowEx "FindWindowExA" int, int, sptr, sptr #func SetFocus "SetFocus" int ;============================================================ ;============================================================ ; startup ;============================================================ ; config 0 appname = "HSP HELP Browser II" appver = "2.17c" appsig = "S.Programs 2006-2007" skin_format_ver = "HHX217" ; スキン書式バージョン #if ENABLE_HHW hhwname = "Help Source Editor" hhwver = "(HHX " + appver + ")" #endif ;============================================================ ; 起動分岐 : 起動時の状態によって違うモードで動作する。 ; ・バックグラウンド プロセスとして hs セット キャッシュを作成して終了 ; ・HHW (エディタ) として動作 ; ・メインプロセスへクエリを post して終了 ; ・HHX メインプロセスとして起動 ;---------------------------------------- ; バックグラウンド DB 作成 CMDL_MAKEDB = "//rebuild-db//" if dir_cmdline = CMDL_MAKEDB { ;>> chdir astr = "hsphelp" dirlist buf, astr, 5 if stat : chdir astr wait 100 HHX_init_rebuild_db DBR_WRITEDB end } #if ENABLE_HHW ;---------------------------------------- ; HHW 起動 CMDL_STARTHHW = "//start-hhw//" if dir_cmdline = CMDL_STARTHHW { hhx_edit_start hhwname, hhwver, appsig, "" end } ; ファイル名 取得 (dels '"') astr = dir_cmdline sdim bstr, 1024 repeat c = peek(astr, cnt) if c = 0 : break if c ! '"' : wpoke bstr, strlen(bstr), c loop exist bstr if strsize >= 0 { hhx_edit_start hhwname, hhwver, appsig, bstr end } #endif ;---------------------------------------- ; 同時起動制御 filemap_create FILEMAP_NAME_HHX ; 共有メモリを使用 dupptr map_hwnd, filemap_viewptr() , 4 , 4 ; 最初に起動した HHX の hwnd dupptr map_str, filemap_viewptr()+4, 1024, 2 ; 共有文字列 ; すでに filemap があれば : 共有メモリにクエリ文字列を置いて hwnd にメッセージを送る if filemap_already_exists() { if dir_cmdline = "" { ; アクティブ化のみ sendmsg map_hwnd, WM_APP_ACTIVATE } else { ; クエリ文字列 送信 map_str = "hhxq=" + dir_cmdline sendmsg map_hwnd, WM_APP_HHXQ } filemap_close end } ;============================================================ ; config HHX ; special record-id RID_INDEX = -1 RID_ABOUT = -2 RID_MINIWB = -3 ; special query (ユニーク文字列) IDXQ_ALL = "__all__" + gettime(7) IDXQ_ALPHA = "__alp__" + gettime(7) ; ヒストリバッファ 最大 #define HISTRMAX 256 ; 設定ファイル名 CFGFILE = "hhx.cfg" ; 設定インデックス dim CFGDATA, 20 #const CFG_PAGELOG 1 #const CFG_SEARCHLOG 2 #const VIEWSIZE_INDEX 3 #const VIEWSIZE_SIDE 4 #const CFG_MARKUP 5 #const CFG_AOT 10 ; 設定セーブデータ デフォルト値 (1 1 1 ... / 0 0 0 ...) [0-9]/[10-19] repeat 10 CFGDATA(cnt) = 1 loop CFGDATA.VIEWSIZE_INDEX = 100 CFGDATA.VIEWSIZE_SIDE = 25 ;============================================================ ; スキン (hhx_head) 読み込み #define format_ver 0 #define mode_notmp 1 #define sidebar_len 2 #define skin_footer 3 #define head_ver 4 #define img_index 5 #define img_help 6 #define img_info 7 #define img_wait 8 #define IMG_MAX 9 sdim p_head, 64, IMG_MAX ; スキン変数格納 skin_err = 0 fn = dir_cur + "\\hhx_img\\hhx_head.htm" exist fn if strsize < 0 { ; スキンファイルなし skin_err = 1 dialog "スキンファイル " + fn + " が見つかりません。\nインストール手順を確認してください。\n\n続行しますか?", 3, appname if stat = 7 : end } else { sdim buf_head, strsize + 1 bload fn, buf_head ;---------------------------------------- ; スキン変数読み出し ; hhx_head からアイコン設定読み出し repeat IMG_MAX p = instr(buf_head,, "\n%"+cnt) if p = -1 : continue getstr astr, buf_head, p + 2 a = instr(astr,, "\t") if a = -1 : continue getstr p_head.cnt, astr, a + 1 loop if p_head.format_ver ! skin_format_ver { ; スキンファイル バージョンエラー skin_err = 1 dialog "スキンファイル " + fn + " の書式バージョンが正しくありません。\nインストール手順を確認してください。\n\n続行しますか?", 3, appname if stat = 7 : end } } if skin_err { sdim p_head, 64, IMG_MAX ; スキン変数 リセット ; HTML head buf_head = "hhxview\n" ; Control form buf_head += "
INDEX <<BACK FWD>> info close   スキン無効モードで動作しています。   Search
\n" ; スキン変数 p_head.sidebar_len = "1024" ; ; about:blank モードで動作 ; p_head.mode_notmp = "1" } ; スキン変数 修正 if int(p_head.sidebar_len) < 16 : p_head.sidebar_len = "16" len_sb = int( p_head.sidebar_len ) ; サイドバーに表示する文字列の横長 ;-------------------------------------------------- ; ターゲットファイル 設定 #define WRITE_BUF 100 mode_abbl = (int(p_head.mode_notmp) ! 0) ; モード about:blank if mode_abbl { viewurl = "about:blank" } else { ; ieBrowser->"Navigate" 用 ファイル名 ; 大小文字まで正確な path を取得 sdim viewurl, 1024 GetLongPathName dir_cur, viewurl, 1024 ; ドライブレターは大文字必須 if peek(viewurl) >= 'a' & peek(viewurl) <= 'z' { poke viewurl, , peek(viewurl) - 32 } viewurl += "\\TEMP.HTM" } ;============================================================ ; ウィンドウ作成・DB ロード ;------------------------------------------------>> chdir astr = "hsphelp" dirlist buf, astr, 5 if stat : chdir astr ;-------------------------------------------------- ; create window if hspstat : screen 0, 1, 1, 2 Window_resizable status_create ; ステータスバー 初期化 title appname ; 割り込み oncmd gosub *event_WM_ACTIVATE, 0x0006 ; HSP 3.0 の oncmd 0 のバグのため、これを先頭に書かないと end でプロセスが終了しない。oncmd 0 で割り込み解除されるのはこのメッセージだけ oncmd gosub *event_WM_SIZE, 0x0005 oncmd gosub *event_WM_GETMINMAXINFO, 0x0024 oncmd gosub *event_WM_APPCOMMAND, 0x0319 ; WM_APP_ oncmd gosub *event_WM_APP_HHXQ, WM_APP_HHXQ oncmd gosub *event_WM_APP_ACTIVATE, WM_APP_ACTIVATE oncmd gosub *event_WM_APP_RELOAD, WM_APP_RELOAD ; std onkey gosub *event_onkey onexit *endapp map_hwnd = hwnd ; 同時起動制御用 ;-------------------------------------------------- ; Trident obj AtlAxWinInit axobj ieBrowser, "Shell.Explorer.2" idIE = stat newcom pUnk AtlAxGetHost objhwnd(idIE), pUnk querycom pObj, pUnk, IAxWinAmbientDispatch ; このインターフェイスには、ホストされるコントロールまたはコンテナの特性を指定するためのメソッドがどうたら ; DOCHOSTUIFLAG の変更 (ボーダー、オートコンプリート など) pObj("DocHostFlags") = DOCHOSTUIFLAG_NO3DBORDER | DOCHOSTUIFLAG_FLAT_SCROLLBAR | DOCHOSTUIFLAG_ENABLE_FORMS_AUTOCOMPLETE | DOCHOSTUIFLAG_THEME ; [memo] コンテキストメニューの禁止 ;pObj("AllowContextMenu") = 0 ; VARIANT_FALSE = 0, VARIANT_TRUE = 0xffff delcom pObj delcom pUnk comevent ieEvent, ieBrowser, DIID_DWebBrowserEvents2, *event_ie ; IE のイベント取得 querycom ieOIPAO, ieBrowser, IOleInPlaceActiveObject ; キー操作用 ;-------------------------------------------------- ; load db 1 HHX_init_load_db stat_loaddb = (HHX_currentset_sum() ! HHX_diskset_sum() ) ;-------------------------------------------------- ; now_loading buf = buf_head buf += "
\n" buf += "
\n" if stat_loaddb { buf += "

" + appname + "

\n" buf += "

" + p_head.img_wait + "データベース構築中

\n" buf += "

...

\n" } else { buf += "

 

\n" } buf += "
\n" buf += "
\n" buf += "\n" buf += "" gosub *navigate_to_buf ;-------------------------------------------------- ; show window Window_load CFGFILE, CFGDATA await gsel 0, 1 + CFGDATA.CFG_AOT ;-------------------------------------------------- ; load db 2 ; output : hhxdata.N.M if stat_loaddb { HHX_init_rebuild_db DBR_READONLY } else { HHX_init_extract_db } ;-------------------------------------------------- ; プラグイン / モジュールリスト dll_list を作成 gosub *rebuild_dll_list ;-------------------------------------------------- ; 対応環境フラグ 変換表 sdim envstr1, 64, 10 sdim envstr2, 64, 10 envstr1 = "Win", "Mac", "Let", "Cli" envstr2 = "Windows 版 HSP", "Macintosh 版 HSP", "HSPLet", "コマンドライン版 HSP" ;============================================================ ; 状態変数のリセット (= index) id = RID_INDEX searchq = "" ; Query indexq = IDXQ_ALL search_log = "" ; Log page_log = "" viewlimit_sb = CFGDATA.VIEWSIZE_SIDE ; viewlimit リセット viewlimit_idx = CFGDATA.VIEWSIZE_INDEX #if ENABLE_MINIWB comurl = "" ; MiniWB comttl = "" comdom = "" #endif sdim histrCom, 64, HISTRMAX ; ヒストリバッファ 初期化 dim histrSX, HISTRMAX dim histrSY, HISTRMAX dim histrAid, HISTRMAX histrCom.0 = "index=" + indexq histrptr = 0 ; ヒストリ位置初期化 histrtop = 0 ;============================================================ ; スタート クエリの発行 cmdlink = "hhxq=" + dir_cmdline gosub *exec_cmdlink if stat_loaddb { gosub *background_build_db ; DB ファイル バックグラウンドで作成 } ; これ以降はイベントでのみ駆動 stop ;============================================================ ; subroutines ;-------------------------------------------------- ; buf へ Navigate ; このルーチン実行中は、発生イベントによってどこのコードが実行されるかわからんので注意 *navigate_to_buf ; default statusbar status_mes 0, "" status_mes 1, "" status_mes 2, strf("%.1f", (double(strlen(buf)) / 1024)) + "KB" flgDocumentComp = 0 ; navigate to 'buf' if mode_abbl { ieBrowser->"Navigate" viewurl onDocumentComplete = WRITE_BUF } else { bsave viewurl, buf, strlen(buf) ieBrowser->"Navigate" viewurl } ; DocumentComplete するまで待つ (*event_ie 依存) repeat await 50 if flgDocumentComp : break loop return ;-------------------------------------------------- ; プラグイン / モジュールリスト dll_list を作成 ; (select * from hhxdata order by C_DLL;) *rebuild_dll_list a = HHX_select_all() HHX_order_by C_DLL dll_list = IDXQ_ALL + "\n" dll_bak = IDXQ_ALL repeat a c = HHX_get_next() if hhxdata.c.C_DLL ! dll_bak { dll_bak = hhxdata.c.C_DLL dll_list += dll_bak + "\n" } loop dll_list += IDXQ_ALPHA + "\n" return ;-------------------------------------------------- ; DB ファイルをバックグラウンドで作成するプロセスを起動 *background_build_db if hspstat = 0 { sdim astr, 1024 exec ModuleFileName + " " + CMDL_MAKEDB } return ;============================================================ ; event proc ;-------------------------------------------------- ; リサイズ時の最大最小値 ( = 無制限) *event_WM_GETMINMAXINFO return 0 ;-------------------------------------------------- ; resize *event_WM_SIZE status_resize ; ステータスバー フィット a = MoveWindow(objhwnd(idIE), 0, 0, ginfo_winx, ginfo_winy - status_height(), 1) return ;-------------------------------------------------- ; IE コンポにフォーカス *event_WM_ACTIVATE if wparam & 0xf { h = FindWindowEx(objhwnd(idIE), 0, "Shell Embedding", 0) if h : h = FindWindowEx(h, 0, "Shell DocObject View", 0) if h : h = FindWindowEx(h, 0, "Internet Explorer_Server", 0) if h : SetFocus h } return 0 ;-------------------------------------------------- WM_APP_ACTIVATE ; 他プロセスからのアクティブ化指令 *event_WM_APP_ACTIVATE Window_top return 0 ;-------------------------------------------------- WM_APP_HHXQ ; 他プロセスからのクエリ WM_APP_HHXQ *event_WM_APP_HHXQ Window_top cmdlink = map_str gosub *exec_cmdlink return 0 ;-------------------------------------------------- WM_APP_RELOAD ; 他プロセスからのリロード (hs セット更新) 指令 ; 呼び出し元は PostMessage で呼ぶのが望ましい *event_WM_APP_RELOAD if HHX_currentset_sum() ! HHX_diskset_sum() { wait 5 ; oil ; リロード前 シンボルをバックアップ if id >= 0 { symbol_bk = hhxdata.id.C_NAME } title appname + " - 再読み込みしています ..." ; hs セット 読み込み HHX_init_rebuild_db DBR_READONLY gosub *background_build_db ; DB ファイル バックグラウンドで作成 gosub *rebuild_dll_list cache_reset ; 画面更新 cmdlink = "reload" if id >= 0 { ; (memo : ID オーバーフローの可能性あり) if symbol_bk ! hhxdata.id.C_NAME { ; レコード表示中 && シンボルと ID のひもづけが変わった場合 : 旧シンボルで検索 cmdlink = "hhxq=" + symbol_bk } } gosub *exec_cmdlink } return 0 ;-------------------------------------------------- ; onkey *event_onkey /* key patch 9 Tab 27 Esc 46 Del 116 F5 */ ; ctrl と同時押しの場合、メッセージ処理 getkey k, 17 ; ただし下記との組み合わせは ignore if iparam = 'N' : k = 0 if iparam = 'O' : k = 0 if iparam = 'S' : k = 0 ; コンテナからのアクセラレータキーメッセージ処理 if (iparam = 9) | (iparam = 27) | (iparam = 46) | (iparam = 116) | k { a = 0, $100, wparam, lparam, 0, 0, 0 TranslateAccelerator ieOIPAO, a } return ;-------------------------------------------------- ; application command (マウス サイドボタン) *event_WM_APPCOMMAND cmd = lparam >> 16 & 0x7fff ; == GET_APPCOMMAND_LPARAM(lParam) #if ENABLE_MINIWB if id = RID_MINIWB { ; MiniWB mode の場合 : 素直に実行 if cmd = 1 { ieBrowser->"GoBack" return 0 } if cmd = 2 { ieBrowser->"GoForward" return 0 } return } #endif ; 通常モードの場合 : ヒストリバッファ移動 if cmd = 1 { cmdlink = "back" gosub *exec_cmdlink return 0 } if cmd = 2 { cmdlink = "forward" gosub *exec_cmdlink return 0 } return ;-------------------------------------------------- ; ie event *event_ie dispid = comevdisp(ieEvent) ; onBeforeNavigate2 if dispid = DISPID_BEFORENAVIGATE2 { ; パラメータ取得 comevarg newurl, ieEvent, 1, 1 ; URL comevarg Cancel, ieEvent, 6, 2 ; Cancel (Variant) #if ENABLE_MINIWB comevarg TargetFrameName, ieEvent, 3 ; TargetFrameName ; MiniWB mode ; (ドメインが comdom で、かつフレームに入る場合のみスルー (表示許可)) if (instr(newurl,0,comdom)=0) & (TargetFrameName ! "") { ; title (フレーム "hhx_iframe" で開いているページが現在のページである) if TargetFrameName = "hhx_iframe" { url_iframe = newurl title appname + " - " + url_iframe } delcom Cancel return } #endif if newurl ! viewurl { Cancel("val") = 1 ; ナビゲーションキャンセル ; cmdlink ; クリックしたリンクの文字列をコマンドとして処理 ; リンク URL の "?" 以降がコマンド文字列となる cmdlink = URLDec(newurl) cmdlink = strmid(cmdlink, instr(cmdlink, 0, "?") + 1, 1024) gosub *exec_cmdlink } delcom Cancel } ; onDocumentComplete if dispid = DISPID_DOCUMENTCOMPLETE { ; about:blank の読み込みが完了したら : buf の内容を write if onDocumentComplete = WRITE_BUF { pDoc = ieBrowser("Document") pDoc->"open" pDoc("charset") = "shift_jis" ; 文字コード設定 pDoc->"write" buf pDoc->"close" delcom pDoc onDocumentComplete = 0 } flgDocumentComp = 1 } ; onStatusTextChange if dispid = DISPID_STATUSTEXTCHANGE { ; ステータスバー 表示内容 取得 comevarg strstat, ieEvent, 0, 1 ; "Microsoft Web ブラウザ コントロール" (ごみメッセージ ignore) if instr(strstat, 0, "Microsoft ") = 0 : return ; hhx コマンドリンクの場合、内容を変換して表示 if strmid(strstat, 0, 5) = "hhx:?" { ; 抽出 cmd = strmid(strstat, instr(strstat, 0, "?") + 1, 1024) i = instr(cmd, 0, "=") if i >= 0 { ; 引数あり arg = strmid(cmd, i + 1, 1024) ; arg 切り出し poke cmd, i ; cmd 切り出し i = instr(arg, 0, "&") if i >= 0 : poke arg, i arg = URLDec(arg) ; デコード } else { ; 引数なし arg = "" } ; デフォルト値 strstat = cmd + " " + arg iconfn = "explorer.exe" iconid = 7 ; コマンド → ヘルプ 変換 if cmd = "index" { strstat = arg + " のインデックス ページ" if (arg = IDXQ_ALL) | (arg = IDXQ_ALPHA) | (arg = "") : strstat = "インデックス ページ" iconfn = "shell32.dll" iconid = 23 } else:if cmd = "back" { strstat = "ヒストリ - 戻る" } else:if cmd = "forward" { strstat = "ヒストリ - 進む" } else:if cmd = "about" { strstat = "バージョン情報" } else:if cmd = "close" { strstat = "閉じる" } else:if cmd = "rid" { ; レコード ID の場合のヘルプ : シンボル概要 if hhxdata(int(arg), C_PRM) = "" { strstat = hhxdata(int(arg), C_NAME) ; 引数なし } else:if peek( hhxdata(int(arg), C_PRM) ) = '(' { strstat = "val = " + hhxdata(int(arg), C_NAME) + hhxdata(int(arg), C_PRM) ; 関数型 } else { strstat = hhxdata(int(arg), C_NAME) + " " + hhxdata(int(arg), C_PRM) ; 命令型 } strstat += " - " + hhxdata(int(arg), C_SUMMARY) } else:if cmd = "hhxq" { strstat = "\"" + arg + "\" でサイドバー検索" if arg = "" : strstat = "サイドバー検索を閉じる" iconfn = "shell32.dll" iconid = 22 } else:if cmd = "clearpl" { strstat = "閲覧ページ履歴をクリア" } else:if cmd = "clearsl" { strstat = "検索クエリ履歴をクリア" } else:if cmd = "viewexp_idx" { strstat = "インデックスの表示件数を拡大" } else:if cmd = "viewexp_sb" { strstat = "サイドバー検索の表示件数を拡大" #if ENABLE_MINIWB } else:if cmd = "comm" { strstat = arg ; MiniWB mode iconfn = "mshtml.dll" iconid = 0 #endif } else:if cmd = "nop" { strstat = arg } ; 出力 status_mes 0, strstat status_icon 0, iconfn, iconid } else { ; 通常の URL 出力 status_mes 0, strstat } } return ;============================================================ ; cmdlink クエリを処理 ; HHX の内部状態変化を一元的につかさどるルーチン ; 状態変数を変化させるためには、このルーチンにクエリを送らなければならない。 ; input : newurl, cmdlink ; status : id, ヒストリ, viewlimit, searchq, 履歴, indexq, MiniWB_info, CFGDATA.* *exec_cmdlink cmd = cmdlink cmdlink = "" ;---------------------------------------- ; スクロール位置と移動元 aid を保存 ; get scrollPos pDoc = ieBrowser("Document") pBody = pDoc("body") histrSX.histrptr = pBody("scrollLeft") histrSY.histrptr = pBody("scrollTop") delcom pBody delcom pDoc ; get aid (Anchor ID) i = instr(cmd, , "&aid=") if i >= 0 { histrAid.histrptr = int( strmid(cmd, i + 5, 10) ) poke cmd, i ; aid 指定句を削除 } ;---------------------------------------- ; UI response if cmd = "reload" { gosub *pageopen return } ; viewlimit control if cmd = "viewexp_idx" { ; viewlimit of Index viewlimit_idx *= 2 gosub *pageopen return } if cmd = "viewexp_sb" { ; viewlimit of Sidebar viewlimit_sb *= 2 gosub *pageopen return } ; search query if instr(cmd, 0, "hhxq=") = 0 { astr = strmid(cmd, 5, 1024) ; 空白避け searchq = "" repeat strlen(astr) c = peek(astr, cnt) if (c ! 9) & (c ! 32) { searchq = astr break } loop if CFGDATA.CFG_SEARCHLOG { ; 検索クエリログに追加 if notnull(searchq) : search_log = note_merge(searchq + "\n" + search_log) } viewlimit_sb = CFGDATA.VIEWSIZE_SIDE ; viewlimit リセット histrSY.histrptr = 0 ; ページ上部に戻る a = HHX_exist(searchq) ; searchq と同じ名称のレコードがあれば : リダイレクト if a >= 0 { cmd = "rid=" + a #if ENABLE_MINIWB } else:if id = RID_MINIWB { cmd = "index" ; MiniWB モードなら、index へ切り替えてから表示 #endif } else { gosub *pageopen return } } ; change config if instr(cmd, 0, "config=") = 0 { astr = strmid(cmd, 7, 1024) i = instr(astr, 0, "-") if i > 0 { bstr = strmid(astr, i+1, 1024) if int(astr) < 20 { CFGDATA(int(astr)) = int(bstr) ; 設定と同時に適用させる if CFGDATA.CFG_PAGELOG = 0 : page_log = "" if CFGDATA.CFG_SEARCHLOG = 0 : search_log = "" gsel 0, 1 + CFGDATA.CFG_AOT cache_reset gosub *pageopen } } return } ; Clear search list if cmd = "clearsl" { search_log = "" gosub *pageopen return } ; Clear page list if cmd = "clearpl" { page_log = "" gosub *pageopen return } #if ENABLE_HHW ; HHW を起動 if cmd = "hsedit" { exec ModuleFileName + " " + CMDL_STARTHHW return } #endif ; HHW で開く if instr(cmd, 0, "hsedit=") = 0 { #if ENABLE_HHW exec ModuleFileName + " " + strmid(cmd, 7, 1024) #else exec "notepad " + strmid(cmd, 7, 1024) #endif return } ; close if cmd = "close" : goto *endapp ; No operation if instr(cmd, 0, "nop=") = 0 | cmd = "nop" : return #if ENABLE_MINIWB ;---------------------------------------- ; MiniWB mode ; RAW if cmd = "GoForward" { ieBrowser->"GoForward" return } if cmd = "GoBack" { ieBrowser->"GoBack" return } if cmd = "Stop" { ieBrowser->"Stop" return } ; [ブラウザで開く] if cmd = "commopen" { exec url_iframe, 16 return } #endif ;---------------------------------------- ; ヒストリ コントロール ; backto-index patch if cmd = "index" { cmd = "index=" + indexq } if cmd = "back" { ; 戻る if histrptr { histrptr-- cmd = histrCom(histrptr \ HISTRMAX) } else { status_mes 1, "ヒストリの終端です" return } } else:if cmd = "forward" { ; 進む if histrptr < histrtop { histrptr++ cmd = histrCom(histrptr \ HISTRMAX) } else { status_mes 1, "ヒストリの終端です" return } } else { ; 新たな分岐 histrptr++ histrtop = histrptr histrCom(histrptr \ HISTRMAX) = cmd histrSX.histrptr = 0 histrSY.histrptr = 0 histrAid.histrptr = 0 } ;---------------------------------------- ; general ; ID -> arg id if instr(cmd, 0, "rid=") = 0 { id = int( strmid(cmd, 4, 10) ) if CFGDATA.CFG_PAGELOG { page_log = note_merge("" + id + "\n" + page_log) ; ページログに追加 } gosub *pageopen return } ; ID -> RID_INDEX, set index query if instr(cmd, 0, "index=") = 0 { id = RID_INDEX indexq = strmid(cmd, 6, 1024) if histrtop = histrptr : viewlimit_idx = CFGDATA.VIEWSIZE_INDEX ; viewlimit リセット (ヒストリ先端にいる場合) gosub *pageopen return } ; ID -> RID_ABOUT, info if cmd = "about" { id = RID_ABOUT gosub *pageopen return } #if ENABLE_MINIWB ; ID -> RID_MINIWB, MiniWB mode if instr(cmd, 0, "comm=") = 0 { id = RID_MINIWB comttl = strmid(cmd, 5, instr(cmd, 0, ";") - 5) comurl = strmid(cmd, instr(cmd, 0, ";") + 1, 1024) ; get domain comdom = comurl if instr(comurl, 7, "/") >= 0 { comdom = strmid(comurl, 0, instr(comurl, 7, "/") + 7) } gosub *pageopen return } #endif ;---------------------------------------- ; ctrl by url ; 以降処理分はヒストリから除外 if histrptr { histrptr-- histrtop = histrptr } ; open as url if (instr(newurl, 0, "http://") = 0) | (instr(newurl, 0, "ftp://") = 0) { if instr(newurl, 0, "?ad") >= 0 | instr(newurl, 0, "&ad") >= 0 | instr(newurl, 0, "//ad.") >= 0 { ; ads block status_mes 1, "ads blocked" } else { exec newurl, 16 } return } ; ignore url if (instr(newurl, 0, "res://") = 0) | (instr(newurl, 0, "file://") = 0) { return } ; file dropped exist newurl if strsize >= 0 { ; eval filename if (getpath(newurl, 2 | 16) = ".hs") & (instr(newurl, , dir_cur) = -1) { ; ask fn = getpath(newurl, 8) Window_top dialog fn + " を HSP HELP ライブラリにコピーしますか?", 2, appname if stat ! 6 : return ; ask 2 exist fn if strsize >= 0 { dialog fn + " はすでに HSP HELP ライブラリに存在します。上書きしますか?", 2, appname if stat ! 6 : return } ; perform bcopy newurl, fn gosub *event_WM_APP_RELOAD } return } ;---------------------------------------- ; debug msg status_mes 1, "不明なコマンド : " + cmd return ;============================================================ ; HTML 作成用 サブモジュール #module ;-------------------------------------------------- ; aid 初期化 (アンカー ID) #deffunc aidinit aidcnt = 100 f_strong = 1 ; <-- ついでに HTMLEnc_spider の内部変数も初期化 return ; aid 情報挿入 #defcfunc aidinc aidcnt++ return "&aid=" + aidcnt + "' id='" + aidcnt ;-------------------------------------------------- ; テキスト → ハイパーテキスト 変換 ; (HTML Enc & シンボル オートリンク & URL オートリンク) #defcfunc HTMLEnc_spider str inp ; init #enum CHR_DEFAULT #enum CHR_KANJI #enum CHR_SYMBOL #enum CHR_CHARREF #enum CHR_NULL if inited = 0 { inited = 1 ; キャラクタ属性テーブル初期化 ; (shift-jis) repeat 256 c = cnt chrflg(c) = CHR_DEFAULT ; shift-jis kanji if (c>=0x81 & c<=0x9F) | (c>=0xE0 & c<=0xFC) { chrflg(c) = CHR_KANJI } ; symbol if (c>='A' & c<='Z') | (c>='a' & c<='z') | (c>='0' & c<='9') | c='_' | c='#' | c='%' | c='$' { chrflg(c) = CHR_SYMBOL } ; 文字参照に変換 if c = '"' | c = '&' | c = '<' | c = '>' { chrflg(c) = CHR_CHARREF } ; null if c = 0 { chrflg(c) = CHR_NULL } loop sdim tmp, 8192 } ; prep src = inp dest = "" ; safety memexpand src, strlen(src) + 2 wpoke src, strlen(src) psrc = 0 pdst = 0 repeat // 1105 6763 memexpand dest, (pdst + 20480) & 0xfffff000 ; step = 4KB (投機拡張) c = peek(src, psrc) ; default chr // 697 3627 if chrflg(c) = CHR_DEFAULT { ; 一文字ずつコピー (低連続性) poke dest, pdst, c psrc++ pdst++ continue } ; symbol chr // 201 1415 if chrflg(c) = CHR_SYMBOL { ; 次の属性変化までを切り出し (英単語) repeat , 1 // 735 3183 i94ms if chrflg( peek(src, psrc+cnt) ) ! CHR_SYMBOL { ; patch ; URL マークアップ if peek(src, psrc+cnt) = ':' { a = strmid(src, psrc, cnt + 3) if ((a = "http://") | (a = "ftp://")) & (chrflg( peek(src, psrc+cnt+3) ) = CHR_SYMBOL) { repeat , 1 #define BC_NUL 0 #define BC_TAB 9 #define BC_CR 13 #define BC_SPAC 32 #define BC_DBLQ 34 #define BC_SNGQ 39 #define BC_COMA 44 #define BC_YEN 92 c = peek(src, psrc+cnt) if (c = BC_NUL) | (c = BC_TAB) | (c = BC_CR) | (c = BC_SPAC) | (c = BC_DBLQ) | (c = BC_SNGQ) | (c = BC_COMA) | (c = BC_YEN) | (chrflg(c) = CHR_KANJI) { ; 単語切り出し tmp = strmid(src, psrc, cnt) tmp = "" + HTMLEnc(tmp) + "" len = strlen(tmp) memcpy dest, tmp, len, pdst psrc += cnt pdst += len break } loop break } } ; end patch ; 単語切り出し tmp = strmid(src, psrc, cnt) ; マークアップ if cnt >= 2 { a = HHX_exist(tmp) if a = id@ { if f_strong { tmp = "" + tmp + "" f_strong = 0 } } else:if a >= 0 { tmp = "" + tmp + "" } else:if CFGDATA@.CFG_MARKUP@ { tmp = "" + tmp + "" } } len = strlen(tmp) memcpy dest, tmp, len, pdst psrc += cnt pdst += len break } loop continue } ; sjis double-byte // 170 1718 i16ms if chrflg(c) = CHR_KANJI { ; 次の属性変化までをコピー (高連続性) repeat , 1 // 2281 35341 if chrflg( peek(src, psrc+cnt*2) ) ! CHR_KANJI { memcpy dest, src, cnt*2, pdst, psrc psrc += cnt*2 pdst += cnt*2 break } loop continue } ; 文字参照 patch // 36 2 if chrflg(c) = CHR_CHARREF { tmp = "&#" + c + ";" len = strlen(tmp) memcpy dest, tmp, len, pdst psrc++ pdst += len continue } ; null poke dest, pdst, c break loop return dest ;-------------------------------------------------- ; 文字列長さ制限.. ;defcfunc strlimit str inp, int sw #defcfunc LeftHTMLEnc str inp, int sw dest = inp if strlen(dest) > sw { p = 0 repeat c = peek(dest, p) if (c>=0x81 & c<=0x9F) | (c>=0xE0 & c<=0xFC) { ; SJIS p++ } p++ if p >= (sw - 3) { poke dest, p dest += ".." break } loop return "" + HTMLEnc(dest) + "" } else { return HTMLEnc(dest) } #global ;============================================================ ; メイン HTML データ作成 ; 現在の HHX 内部状態に応じてページを作成 *pageopen aidinit buf = buf_head buf += "
\n" ; HHX で開かれたレコードのシンボル名を他のプロセスから参照可能にする if id >= 0 { map_str = hhxdata.id.C_NAME } else { map_str = "" } ;-------------------------------------------------- ; サイドバー ブロック #define IDP_SBLINK "RID" if ( (searchq!"") | ((page_log!"")&(page_log!id)) | ((search_log!"")&(search_log!searchq)) ) & (id ! RID_MINIWB) { ; サイドバー ブロック buf += "\n" } ;-------------------------------------------------- ; コンテント ブロック ; キャッシュキー key = "content$" + id if id = RID_INDEX : key += "$" + indexq + "$" + viewlimit_idx #if ENABLE_MINIWB if id = RID_MINIWB : key += "$" + comttl + "$" + comurl + "$" + ieBrowser("Height") #endif ; 中身がキャッシュになければ作成 if cache_exist(key) = 0 { ; コンテント ブロック div = "
\n" if id >= 0 { ;-------------------------------------------------- ; ページ内容表示 symbol = hhxdata.id.C_NAME summary = hhxdata.id.C_SUMMARY prm1 = hhxdata.id.C_PRM ; summary if notnull(summary) { div += "

" + HTMLEnc(summary) + "

\n" } else { div += "

" + HTMLEnc(symbol) + "

\n" } ; parameter if notnull(prm1) { if peek(prm1)='(' & peek(prm1,strlen(prm1)-1)=')' { ; 関数型記述 div += "

val = " + p_head.img_help + "" + HTMLEnc(symbol) + "(" + HTMLEnc( strmid(prm1, 1, strlen(prm1)-2) ) + ")

\n" } else { ; 命令型記述 div += "

" + p_head.img_help + "" + HTMLEnc(symbol) + " " + HTMLEnc(prm1) + "

\n" } } else { ; ノーパラ div += "

" + p_head.img_help + "" + HTMLEnc(symbol) + "

\n" } if notnull(hhxdata.id.C_PRM2) { div += "
" + HTMLEnc_spider(hhxdata.id.C_PRM2) + "
\n" } if notnull(hhxdata.id.C_DLL) { div += "

(" + HTMLEnc(hhxdata.id.C_DLL) + " を使用)

\n" } if notnull(hhxdata.id.C_INST) { div += "

解説

\n" ; インライン HTML 記述のサポート ( html{ ... }html ) astr = hhxdata.id.C_INST p = 0 l = strlen(astr) repeat 256 i = instr(astr, p, "html{\n") if i = -1 : i = l - p if i > 0 : if (strmid(astr, p, i) ! "\n") : div += "
" + HTMLEnc_spider( strmid(astr, p, i) ) + "
\n" p += i + 7 if p >= l : break i = instr(astr, p, "\n}html") if i = -1 : i = l - p ; DoubtAngel bstr = strmid(astr, p, i) DoubtAngel bstr div += "
" + bstr + "
\n" p += i + 7 if p >= l : break loop } if notnull(hhxdata.id.C_SAMPLE) { div += "

サンプルスクリプト

\n" div += "
" + HTMLEnc_spider(hhxdata.id.C_SAMPLE) + "
\n" } href = hhxdata.id.C_HREF if notnull(href) { ;-------------------------------------------------- ; 関連項目 検索実行 div += "

関連項目

\n" div += "

\n" p = 0 repeat getstr astr, href, p if strsize = 0 : break p += strsize c = HHX_exist(astr) if c >= 0 { if notnull(hhxdata.c.C_DLL) { div += "\n" } else { div += "\n" } } else { div += "\n" } loop div += "
" + HTMLEnc(hhxdata.c.C_NAME) + "" + HTMLEnc(hhxdata.c.C_SUMMARY) + "(" + HTMLEnc(hhxdata.c.C_DLL) + ")
" + HTMLEnc(hhxdata.c.C_NAME) + "" + HTMLEnc(hhxdata.c.C_SUMMARY) + "
" + HTMLEnc(astr) + "

\n" } div += "

情報

\n" div += "

\n" if notnull(hhxdata.id.C_DLL) : div += "\n" if notnull(hhxdata.id.C_VER) : div += "\n" if notnull(hhxdata.id.C_DATE) : div += "\n" if notnull(hhxdata.id.C_AUTHOR) : div += "\n" if notnull(hhxdata.id.C_URL) : div += "\n" if notnull(hhxdata.id.C_NOTE) : div += "\n" if notnull(hhxdata.id.C_TYPE) : div += "\n" if notnull(hhxdata.id.C_GROUP) : div += "\n" if notnull(hhxdata.id.C_PORT) { div += "\n" } if notnull(hhxdata.id.C_PORTINF): div += "\n" div += "\n" div += "
プラグイン" + ExHTMLEnc( hhxdata.id.C_DLL ) + "
バージョン" + ExHTMLEnc( hhxdata.id.C_VER ) + "
作成日" + ExHTMLEnc( hhxdata.id.C_DATE ) + "
著作者" + ExHTMLEnc( hhxdata.id.C_AUTHOR ) + "
URL
" + HTMLEnc_spider( hhxdata.id.C_URL ) + "
備考
" + HTMLEnc_spider( hhxdata.id.C_NOTE ) + "
タイプ" + ExHTMLEnc( hhxdata.id.C_TYPE ) + "
グループ" + ExHTMLEnc( hhxdata.id.C_GROUP ) + "
対応環境
    " ; 対応環境情報 文字列変換 (envstr1.n -> envstr2.n) port = hhxdata.id.C_PORT p = 0 repeat getstr astr, port, p if strsize = 0 : break p += strsize repeat if envstr1(cnt) = "" { ; end of list div += "
  • その他 : " + HTMLEnc( astr ) + "
  • " break } if astr = envstr1(cnt) { div += "
  • " + envstr2(cnt) + "
  • " break } loop loop div += "
移植のヒント
" + HTMLEnc_spider( hhxdata.id.C_PORTINF ) + "
hs ファイル" + ExHTMLEnc( hhxdata.id.C_HSFILE ) + " (このレコードを編集...)

\n" } else:if id = RID_INDEX { ;-------------------------------------------------- ; ホーム表示 (プラグイン / モジュール別) ; レコードセット抽出 if indexq = IDXQ_ALL { results = HHX_select_all() HHX_order_by C_GROUP HHX_order_by C_DLL div += "

インデックス ページ

\n" div += "

" + p_head.img_index + "全部で " + results + " 件のページがあります。

\n" } else:if indexq = IDXQ_ALPHA { results = HHX_select_all() div += "

アルファベット順 インデックス

\n" div += "

" + p_head.img_index + "全部で " + results + " 件のページがあります。

\n" } else { results = HHX_select_where(indexq, C_DLL, -1) HHX_order_by C_GROUP if notnull(indexq) { bstr = indexq + " " } else { bstr = "標準機能" } div += "

" + HTMLEnc(bstr)+ "のインデックス ページ

\n" div += "

" + p_head.img_index + results + " 件のページがあります。

\n" } ; プラグイン / モジュール セレクタ div += "

\n" p = 0 repeat getstr astr, dll_list, p if strsize = 0 : break p += strsize bstr = astr if bstr = IDXQ_ALL : bstr = "すべて表示" if bstr = "" : bstr = "標準機能" if bstr = IDXQ_ALPHA : bstr = "アルファベット順" if astr = indexq { div += "" + HTMLEnc(bstr) + "\n" } else { div += "" + HTMLEnc(bstr) + "\n" } loop div += "

\n" ; index table (class = index) dll_bak = IDXQ_ALL tmp = "" ; accelerator if indexq ! IDXQ_ALPHA { ; 機能別インデックス repeat results if cnt = viewlimit_idx { tmp += "(" + viewlimit_idx + " 件以降省略 続き...)\n" break } c = HHX_get_next() ; heading : plugin/module if dll_bak ! hhxdata.c.C_DLL { dll_bak = hhxdata.c.C_DLL if notnull(dll_bak) { astr = dll_bak } else { astr = "標準機能" } if cnt : tmp += "
\n" tmp += "
\n\n" ; バージョン 日付 著作者 tmp += "\n" grp_bak = "#" } ; heading : group if grp_bak ! hhxdata.c.C_GROUP { grp_bak = hhxdata.c.C_GROUP if notnull(grp_bak) { astr = grp_bak } else { astr = "(グループ未定義)" } tmp += "\n" } ; page ; tmp += "\n" tmp += "\n" break } c = HHX_get_next() astr = hhxdata.c.C_NAME poke astr, 1 if peek(astr) >= 'A' & peek(astr) <= 'Z' : poke astr, , peek(astr) + 32 if peek(astr) > 'z' : astr = "その他" if peek(astr) < 'a' : astr = "記号等" if peek(astr) >= 'a' & peek(astr) <= 'z' : poke astr, , peek(astr) - 32 ; heading if dll_bak ! astr { dll_bak = astr if cnt : tmp += "
" + HTMLEnc( astr ) + "
" if notnull(hhxdata.c.C_VER) : tmp += " Version " + HTMLEnc( hhxdata.c.C_VER ) if notnull(hhxdata.c.C_DATE) : tmp += " Date " + HTMLEnc( hhxdata.c.C_DATE ) if notnull(hhxdata.c.C_AUTHOR) : tmp += " Author " + HTMLEnc( hhxdata.c.C_AUTHOR ) tmp += "
" + HTMLEnc( astr ) + "
" + LeftHTMLEnc(hhxdata.c.C_NAME, 32) + "" + HTMLEnc(hhxdata.c.C_SUMMARY) + "
" + LeftHTMLEnc(hhxdata.c.C_NAME, 32) + "" + HTMLEnc(hhxdata.c.C_SUMMARY) if 1000000\(cnt+1)=0 : div += tmp:tmp="" ; accelerator loop } else { ; アルファベット別インデックス repeat results if cnt = viewlimit_idx { tmp += "
(" + viewlimit_idx + " 件以降省略 続き...)
\n" tmp += "
\n\n" } ; page ; tmp += "\n" tmp += "" if 1000000\(cnt+1)=0 : div += tmp:tmp="" ; accelerator loop } div += tmp ; accelerator div += "
" + HTMLEnc( astr ) + "
" + LeftHTMLEnc(hhxdata.c.C_NAME, 32) + "" + HTMLEnc(hhxdata.c.C_SUMMARY) + "
" + LeftHTMLEnc(hhxdata.c.C_NAME, 32) + "" + HTMLEnc(hhxdata.c.C_SUMMARY) + "
\n" else:if id = RID_ABOUT { ;-------------------------------------------------- ; about div += "

バージョン情報

\n" div += "

" + p_head.img_info + appname + "  Version " + appver + "

\n" div += "

IE component based offline HSP help system

\n" #if ENABLE_HHW div += "

(" + hhwname + " Included)

\n" #endif div += "

" + appsig + "

\n" div += "

Web : http://sprocket.babyblue.jp/

\n" ; Logo div += p_head.head_ver + "\n" ; Component Version div += "\n" ; config div += "

オプション

\n" div += "
\n" div += "\n" div += "\n" div += "\n" div += "\n" div += "\n" div += "\n" div += "\n" div += "\n" div += "\n" div += "\n" div += "\n" div += "\n" div += "\n" div += "\n" div += "\n" div += "
ウィンドウ標準設定
 常に手前に表示" a = CFG_AOT if CFGDATA.a : div += "[ON] [OFF]" : else : div += "[ON] [OFF]" div += "(OFF)
ヘルプページ
 インデックス デフォルト表示件数" a = VIEWSIZE_INDEX if CFGDATA.a > 25 : div += "[-]" : else : div += "[-]" div += " " + CFGDATA.a + " " if CFGDATA.a < 800 : div += "[+]" : else : div += "[+]" div += "(100)
 ヘルプの半角英数字を検索リンクにする" a = CFG_MARKUP if CFGDATA.a : div += "[ON] [OFF]" : else : div += "[ON] [OFF]" div += "(ON)
サイドバー
 検索結果 デフォルト表示件数" a = VIEWSIZE_SIDE if CFGDATA.a > 25 : div += "[-]" : else : div += "[-]" div += " " + CFGDATA.a + " " if CFGDATA.a < 800 : div += "[+]" : else : div += "[+]" div += "(25)
 閲覧ページ履歴を表示" a = CFG_PAGELOG if CFGDATA.a : div += "[ON] [OFF]" : else : div += "[ON] [OFF]" div += "(ON)
 検索クエリ履歴を表示" a = CFG_SEARCHLOG if CFGDATA.a : div += "[ON] [OFF]" : else : div += "[ON] [OFF]" div += "(ON)
\n" div += "

リストの表示件数が少ないほど、表示が高速になります。

\n" #if ENABLE_MINIWB } else:if id = RID_MINIWB { ;-------------------------------------------------- ; MiniWB mode div += "

" + comttl + "

\n" div += "

[トップ] <<戻る 進む>> [中止] [ブラウザで開く]

\n" div += "\n" div += "\n" #endif } ; コンテント ブロック エンド div += "
\n" ; キャッシュへ書き込み cache_write key, div } ; キャッシュから読み出し cache_read key, div buf += div ;-------------------------------------------------- ; フッタ ブロック if id ! RID_MINIWB { buf += "\n" } buf += "\n" ; page initialize script buf += "\n" buf += "\n" buf += "" ;-------------------------------------------------- ; navigate if id >= 0 { title hhxdata.id.C_NAME + " - " + appname } else { title appname } gosub *navigate_to_buf return ;============================================================ ; 終了シーケンス *endapp oncmd 0 onkey 0 delcom ieOIPAO delcom ieEvent ; これがないとプロセスが終了しない delcom ieBrowser filemap_close Window_save CFGFILE, CFGDATA exist viewurl if strsize >= 0 : delete viewurl ; 削除できないことがある? ; AtlAxWinTerm end ; <- oncmd 0 のバグのため、上のほうのコードによってはプロセスが終了しない end end