//nikola.aym #define ESCAPE_TAG_1 CHR(0x3)+CHR(0x3) #define ESCAPE_TAG_2 CHR(0x4)+CHR(0x4) //------------------------------------------------------------------------------ //関数名:installedplugin //機能 :インストール済みのプラグインリストを作成する //------------------------------------------------------------------------------ installedplugin { if ARRAYSIZE(REQ.ARGS) < 1 { LOGGING("installedplugin: 引数が不足しています") -1 return } _installedplugin_name = IARRAY _installedplugin_id = IARRAY foreach REQ.ARGS; _ref { _installedplugin_name ,= _ref[0,CHR(0x1)] _installedplugin_id ,= _ref[1,CHR(0x1)] } RES.RESULT = sys.fnc.byte1connect(_installedplugin_name) } sys.fnc.byte1connect { _ret = _argv[0] for _i = 1; _i < _argc; _i++ { _ret += CHR(0x1) + _argv[_i] } _ret } //------------------------------------------------------------------------------ //関数名:OnRSSComplete //機能 :RSS表示 //------------------------------------------------------------------------------ OnRSSComplete { if ARRAYSIZE(REQ.ARGS) < 3 { LOGGING("OnRSSComplete: 引数が不足しています") -1 return } reference = REQ.ARGS _ret = '' for _i = 2; _i < ARRAYSIZE(reference); _i++ { if _i >= 22 { _ret += 'and more...\n' break } _r = SPLIT(reference[_i],CHR(1)) _title = _r[0] _url = _r[1] _date = _r[2] if RE_SEARCH(_title,'(^AD:)|(^PR:)|(\[ *PR *\])') { continue } _content = _title if STRLEN(_date) { _date = SPLIT(_date,',') _content = STRFORM("[$02d/$02d]",TOINT(_date[1]),TOINT(_date[2])) + _content } _ret += "\_a[%(_url)]\_?%(AYATEMPLATE.MakeJustText(_content,46))\_?\_a\n" } RES.RESULT = _ret } //------------------------------------------------------------------------------ //関数名:SetAitalkinterval //機能 :喋り頻度設定 //------------------------------------------------------------------------------ OnMouseWheel { _aitalkinterval = REQ.ARGS[0] _wheel = REQ.ARGS[1] if (_wheel > 0) && (_aitalkinterval < 360) { _aitalkinterval += 10 } elseif (_wheel < 0) && (_aitalkinterval > 0) { _aitalkinterval -= 10 } else { RES.RESULT = '' RES.VALUE0 = _aitalkinterval return } _ret = '\_l[90,20]喋り間隔:\_l[150,]' + sys.fnc.FillSpace(_aitalkinterval) + '\_l[170,]秒' if _aitalkinterval == 0 { _ret += ' \f[color,255,0,0]沈黙\f[color,default]' } _ret += '\_l[35,35]0 ' for _i = 1; _i < 36; _i++ { _x = _i * 5 + 45 _ret += "\_l[%(_x),]―" } _ret += ' 360' _x = _aitalkinterval / 2 + 45 _ret += "\_l[%(_x),35]|" _ret = '\0\s[0]\_q' + _ret + '\_q\e' RES.RESULT = _ret RES.VALUE0 = _aitalkinterval } sys.fnc.FillSpace { _ret = '' if _argv[0] < 10 { _ret += ' ' } elseif _argv[0] < 100 { _ret += ' ' } _ret + _argv[0] } //------------------------------------------------------------------------------ //関数名:SHIORI3FW.EscapeDangerousTags //機能 :危険なタグのみをエスケープ(\付加)する。 //------------------------------------------------------------------------------ SHIORI3FW.EscapeDangerousTags{ if ARRAYSIZE(REQ.ARGS) < 1 { LOGGING("SHIORI3FW.EscapeDangerousTags: 引数が不足しています") -1 return } _txt=REQ.ARGS[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|timerraise)' + / '.*?\]|\\j\[))' , / '\\') _txt=REPLACE(_txt,ESCAPE_TAG_2,'\%') _txt=REPLACE(_txt,ESCAPE_TAG_1,'\\') RES.RESULT = _txt } //****************************************************************************** // AYATEMPLATE UTILITY //****************************************************************************** //------------------------------------------------------------------------------ //メニュー横1行反転 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ //通常メニュー AYATEMPLATE.MenuItem { _linefeed = 100 _n = _argc if _n >= 3 { if GETTYPE(_argv[_n-1]) == 1 { //整数 _linefeed = _argv[_n-1] _n -= 1 } } _lftext = '' while _linefeed > 0 { if _linefeed >= 100 { _lftext += '\n' } else { _lftext += '\n[half]' } _linefeed -= 100 } _ret = _lftext _ret += '\![*]' _ret +='\__q[' _s = '' for _i = 1 ; _i < _n-1 ; _i++ { _s += AYATEMPLATE.EscapeText(_argv[_i]) + ',' } _s += AYATEMPLATE.EscapeText(_argv[_n-1]) _ret += _s _ret +=']' _r = AYATEMPLATE.MakeJustText(_argv[0],46) if RE_SEARCH(_r,'["\[\]]') >= 0 { _ret += REPLACE(_r,'"','""') } else { _ret += _r } _ret += '\__q' _ret } //------------------------------------------------------------------------------ //エスケープ AYATEMPLATE.EscapeText { _r = _argv[0] if RE_SEARCH(_r,'["\[\]]') { '"' + REPLACE(_r,'"','""') + '"' } else { _r } } //------------------------------------------------------------------------------ //後ろにスペースを補完する関数 AYATEMPLATE.MakeLongText { _menuitem = _argv[0] _len = _argv[1] - GETSTRBYTES(_menuitem,127) if _len <= 0 { _menuitem return } _space = '                                        ' _menuitem += SUBSTR(_space,0,_len / 2) if _len % 2 > 0 { _menuitem += " " } _menuitem } //------------------------------------------------------------------------------ //適当な長さで切る AYATEMPLATE.MakeShortText { if _argc < 2 { ''; return; } _num = _argv[1] / 2 _len = STRLEN(_argv[0]) _text = '' if _num >= _len { _argv[0] return; } _lendiff = 0 while 1 { _text = SUBSTR(_argv[0],0,_num) _lendiff = GETSTRBYTES(_text,127) - _argv[1] + 1 if _lendiff >= 0 { break; } _num += 1 if _num >= _len { break; } } if _num >= _len { _argv[0] } else { _text = SUBSTR(_argv[0],0,_num - 1) if _lendiff > 0 { _text += '..' } else { _text += '...' } _text; } } //------------------------------------------------------------------------------ //長さをきっちり調節 AYATEMPLATE.MakeJustText { _text = AYATEMPLATE.MakeLongText(_argv[0],_argv[1]) if _text != _argv[0] { _text return } _text = AYATEMPLATE.MakeShortText(_argv[0],_argv[1]) _text }