Files
lyuma/ghost/master/yaya_base/optional.dic

352 lines
9.7 KiB
Plaintext

//******************************************************************************
//SHIORI/3.0制御スクリプト for YAYA
//オプション関数
//******************************************************************************
#define ESCAPE_TAG_1 CHR(0x3,0x3)
#define ESCAPE_TAG_2 CHR(0x4,0x4)
//******************************************************************************
//初期化・後始末
//******************************************************************************
OnSystemLoad.SHIORI3FW.OPTIONAL
{
}
OnSystemUnload.SHIORI3FW.OPTIONAL
{
ERASEVAR('SHIORI3FW.FMOCache')
ERASEVAR('SHIORI3FW.SakuraNameList')
ERASEVAR('SHIORI3FW.FMOTable')
}
//******************************************************************************
//さくらスクリプトタグ除去
//******************************************************************************
//------------------------------------------------------------------------------
// 関数名:SHIORI3FW.EscapeDangerousTags
// 機能 :危険なタグのみをエスケープ(\付加)する。
// 引数 :argv0=テキスト
//------------------------------------------------------------------------------
SHIORI3FW.EscapeDangerousTags{
_txt=_argv[0]
_txt=REPLACE(_txt,'\\',ESCAPE_TAG_1)
_txt=REPLACE(_txt,'\%',ESCAPE_TAG_2)
_txt=RE_REPLACE(_txt, /
'\\(?=(!\[(' + /
'updatebymyself|vanishbymyself|enter,passivemode|' + /
'leave,passivemode|lock,repaint|unlock,repaint|biff|' + /
'open,browser|open,mailer|raise)' + /
'.*?\]|\\j\[))' , /
'\\')
_txt=REPLACE(_txt,ESCAPE_TAG_2,'\%')
_txt=REPLACE(_txt,ESCAPE_TAG_1,'\\')
_txt
}
//------------------------------------------------------------------------------
// 関数名:SHIORI3FW.EscapeAllTags
// 機能 :全てのさくらスクリプトタグをエスケープ(\付加)する。
// 引数 :argv0=テキスト
//------------------------------------------------------------------------------
SHIORI3FW.EscapeAllTags{
_txt=_argv[0]
_txt=REPLACE(_txt,'\\',ESCAPE_TAG_1)
_txt=REPLACE(_txt,'\%',ESCAPE_TAG_2)
_txt=REPLACE(_txt,'\','\\')
_txt=REPLACE(_txt,'%','\%')
_txt=REPLACE(_txt,ESCAPE_TAG_2,'\%')
_txt=REPLACE(_txt,ESCAPE_TAG_1,'\\')
_txt
}
//------------------------------------------------------------------------------
// 関数名:SHIORI3FW.TranslateSystemChar
// 機能 :演算子などシステム予約文字を別のものに置き換える
// 引数 :argv0=テキスト argv1=置き換え対象(省略時_)
//------------------------------------------------------------------------------
SHIORI3FW.TranslateSystemChar
{
_c = '_'
if _argc >= 2 {
_c = _argv[1]
}
_text = TOSTR(_argv[0])
_text = RE_REPLACE(_text,"[ !%(CHR(0x22))%(CHR(0x25))#$&()*+,\-/:;<=>?@\[\]`{|}~]",_c)
_text
}
//------------------------------------------------------------------------------
// 関数名:SHIORI3FW.InitBalloons
// 機能 :バルーン完全初期化スクリプトを自動生成する
//------------------------------------------------------------------------------
SHIORI3FW.InitBalloons
{
_tx = ''
_n = ARRAYSIZE(SHIORI3FW.HWnd)
for _i = 0 ; _i < _n ; _i++ {
if SHIORI3FW.HWnd[_i] != 0 {
_tx += "\p[%(_i)]\c\b[-1]"
}
}
_tx
}
//******************************************************************************
// FMO関連
//******************************************************************************
//------------------------------------------------------------------------------
//関数名:SHIORI3FW.IsGhostExist(ゴースト名(sakuraname)[,fmoname])
//機能 :指定されたゴーストが存在するか調べる
//    存在しなければ0、存在すれば1を返す
//------------------------------------------------------------------------------
SHIORI3FW.IsGhostExist
{
_ghostname=_argv[0]
SHIORI3FW.RefreshFMOTable(_argv[1])
_result=ASEARCH(_ghostname,SHIORI3FW.SakuraNameList)
if _result == -1 {
0
}else{
1
}
}
//------------------------------------------------------------------------------
//関数名:SHIORI3FW.RefreshFMOTable(FMO名称,無視するエントリのHWND)
//機能 :READFMOによってFMOテーブルを作る。
/*
FMOはキャッシュされ、変わっていなければ解析は行われない。
FMO名称を省略すると自動的に'Sakura'になる。
無視するエントリのHWNDを省略すると、SHIORI3FW.HWnd[0] 変数が利用される。
(つまり自動的に自身の情報は含まれなくなる)
グローバル変数:SHIORI3FW.FMOCache FMOの内容のキャッシュ(単純ダンプ)
グローバル変数:SHIORI3FW.FMOTable FMOのテーブル(簡易配列。内容は以下)
id|name|keroname|hwnd|kerohwnd|path|ghostpath,
id|name|keroname|hwnd|kerohwnd|path|ghostpath,
...
グローバル変数:SHIORI3FW.SakuraNameList sakuranameを列挙した汎用配列
また、いわゆる「非ゴースト」FMOエントリ(一時起動等)はこの時点で排除される。
*/
//------------------------------------------------------------------------------
SHIORI3FW.RefreshFMOTable : void
{
_fmoname=TOSTR(_argv[0])
if _fmoname == '' {
_fmoname='Sakura'
}
_result=''
if _fmoname == 'SakuraUnicode'
_result=READFMO(_fmoname,'UTF-8')
else
_result=READFMO(_fmoname)
if SHIORI3FW.FMOCache == _result {
//変わっていなければ即座に戻る
return
}
//FMOの内容をキャッシュする
SHIORI3FW.FMOCache=_result
SHIORI3FW.FMOTable=''
SHIORI3FW.SakuraNameList=IARRAY
_ignorehwnd=TOSTR(_argv[1])
if _ignorehwnd == '' {
_ignorehwnd = SHIORI3FW.HWnd[0]
}
//\r\nで分割
_array = SPLIT(_result,C_CRLF)
_arraynum=ARRAYSIZE(_array)
//変数初期化
_fmotable_temp=''
_id=''
_oldid=''
_name=''
_keroname=''
_hwnd=''
_kerohwnd=''
_path=''
_ghostpath=''
//結果を擬似2次配列にストア
//ssp_fmo_header_000024dc_005c094e.hwnd,6031694
//<------------------id----------> key value
for _i=0 ; _i<_arraynum-1 ; _i++ {
//一時起動ゴーストかどうか?
_buf=_array[_i]
_id=_buf[0,'.']
if 'SSTPVIEWER-' _in_ _id || 'ssp_fmo_header_dummyentry' _in_ _id || 'SSSB' _in_ _id{
//一時起動なのでなにもしない
}else{
if _oldid == '' {
_oldid = _id
}
//IDが変わったら一時保存を書き出し
if _oldid != _id {
_fmotable_temp+="%(_oldid)|%(_name)|%(_keroname)|%(_hwnd)|%(_kerohwnd)|%(_path)|%(_ghostpath),"
_oldid = _id
_name=''
_keroname=''
_hwnd=''
_kerohwnd=''
_path=''
_ghostpath=''
}
_kvpair=_buf[1,'.']
_key=_kvpair[0,C_BYTE1]
_val=_kvpair[1,C_BYTE1]
//各値を一時保存
case _key {
when 'hwnd' {_hwnd=_val}
when 'name' {_name=_val}
when 'keroname' {_keroname=_val}
when 'path' {_path=_val}
when 'kerohwnd' {_kerohwnd=_val}
when 'ghostpath'{_ghostpath=_val}
}
}
}
//最後のエントリを書き出し
_fmotable_temp += "%(_id)|%(_name)|%(_keroname)|%(_hwnd)|%(_kerohwnd)|%(_path)|%(_ghostpath)"
//無視するHWNDを取り除き、同時にSakuraNameListを作成
_count_temp=ARRAYSIZE(_fmotable_temp)
for _i=0;_i<_count_temp;_i++ {
_tablestr=_fmotable_temp[_i]
_tablehwnd=_tablestr[3,'|']
if _tablehwnd != _ignorehwnd {
SHIORI3FW.FMOTable += _tablestr+','
SHIORI3FW.SakuraNameList=(SHIORI3FW.SakuraNameList,_tablestr[1,'|'])
}
}
//最後がカンマなら取り除く
if SUBSTR(SHIORI3FW.FMOTable,STRLEN(SHIORI3FW.FMOTable)-1,1)==',' {
SHIORI3FW.FMOTable=SUBSTR(SHIORI3FW.FMOTable,0,STRLEN(SHIORI3FW.FMOTable)-1)
}
}
//******************************************************************************
// テキスト処理
//******************************************************************************
//------------------------------------------------------------------------------
// 関数名:SHIORI3FW.MakeJustText
// 機能 :指定した長さになるまでスペースを埋める / 省略する
// 引数 :argv0=テキスト argv1=文字数(半角換算)
//------------------------------------------------------------------------------
//---- 後ろにスペースを補完する関数 (from和音)
SHIORI3FW.MakeLongText
{
_menuitem = _argv[0]
_len = _argv[1] - GETSTRBYTES(_menuitem,127)
if _len <= 0 {
_menuitem
return
}
_space = ' '
_menuitem += SUBSTR(_space,0,_len)
_menuitem
}
//---- 適当な長さで切る -------------------------------------------
SHIORI3FW.MakeShortText
{
if _argc < 2 {
''
return
}
_src = _argv[0]
_cut = TOINT(_argv[1])
_text = ''
if GETSTRBYTES(_argv[0],127) <= _cut {
_argv[0]
return
}
_num = STRLEN(_src)
_lendiff = 0//後で保存するためにスコープを一つ下げるためのダミー代入
while 1 {
_text = SUBSTR(_argv[0],0,_num)
_lendiff = _cut - GETSTRBYTES(_text,127) - 2
if _lendiff >= 0 {
break
}
_num -= 1
if _num <= 0 {
''
return
}
}
if _lendiff > 0 {
_text += '...'
}
else {
_text += '..'
}
_text
}
//---- 長さをきっちり調節
SHIORI3FW.MakeJustText
{
_text = SHIORI3FW.MakeLongText(_argv[0],_argv[1])
if _text != _argv[0] {//短すぎた
_text
return
}
_text = SHIORI3FW.MakeShortText(_argv[0],_argv[1])
_text
}
//******************************************************************************
// その他
//******************************************************************************
//---- HTTPコード->日本語 _argv[0]にコード
SHIORI3FW.HTTPCodeToMessage
{
case _argv[0] {
when '403' {
'アクセス拒否'
}
when '404','410' {
'ファイル無し'
}
when '500','502','503' {
'サーバ側の不調'
}
when 'timeout' {
'タイムアウト'
}
when 'fileio' {
'ファイル書き込みエラー'
}
when 'artificial' {
'手動中断'
}
}
}