• R/O
  • HTTP
  • SSH
  • HTTPS

gikonavi: Commit


Commit MetaInfo

Revision67fcb4da829d2479404a950c8db2a4b6e965c02a (tree)
Time2006-05-31 01:07:25
Authorcvs2git <cvs2git>
Commitercvs2git

Log Message

This commit was manufactured by cvs2svn to create tag 'v1_52_0_651'.

Change Summary

Incremental Difference

--- a/Doxyfile
+++ b/Doxyfile
@@ -1,14 +1,14 @@
1-# Doxyfile 1.4.6
1+# Doxyfile 1.4.5
22
33 #---------------------------------------------------------------------------
44 # Project related configuration options
55 #---------------------------------------------------------------------------
66 PROJECT_NAME = gikonavi
7-PROJECT_NUMBER = "b52 rev. 598"
7+PROJECT_NUMBER = b51
88 OUTPUT_DIRECTORY =
99 CREATE_SUBDIRS = NO
1010 OUTPUT_LANGUAGE = Japanese
11-USE_WINDOWS_ENCODING = YES
11+USE_WINDOWS_ENCODING = NO
1212 BRIEF_MEMBER_DESC = YES
1313 REPEAT_BRIEF = YES
1414 ABBREVIATE_BRIEF =
@@ -25,7 +25,7 @@ INHERIT_DOCS = YES
2525 SEPARATE_MEMBER_PAGES = NO
2626 TAB_SIZE = 2
2727 ALIASES =
28-OPTIMIZE_OUTPUT_FOR_C = YES
28+OPTIMIZE_OUTPUT_FOR_C = NO
2929 OPTIMIZE_OUTPUT_JAVA = NO
3030 BUILTIN_STL_SUPPORT = NO
3131 DISTRIBUTE_GROUP_DOC = NO
@@ -43,11 +43,11 @@ HIDE_UNDOC_CLASSES = NO
4343 HIDE_FRIEND_COMPOUNDS = NO
4444 HIDE_IN_BODY_DOCS = NO
4545 INTERNAL_DOCS = NO
46-CASE_SENSE_NAMES = NO
46+CASE_SENSE_NAMES = YES
4747 HIDE_SCOPE_NAMES = NO
4848 SHOW_INCLUDE_FILES = YES
4949 INLINE_INFO = YES
50-SORT_MEMBER_DOCS = NO
50+SORT_MEMBER_DOCS = YES
5151 SORT_BRIEF_DOCS = NO
5252 SORT_BY_SCOPE_NAME = NO
5353 GENERATE_TODOLIST = YES
@@ -83,13 +83,13 @@ EXAMPLE_PATH =
8383 EXAMPLE_PATTERNS =
8484 EXAMPLE_RECURSIVE = NO
8585 IMAGE_PATH =
86-INPUT_FILTER = "pas2dox --sjis "
86+INPUT_FILTER = pas2doxj.bat
8787 FILTER_PATTERNS =
8888 FILTER_SOURCE_FILES = YES
8989 #---------------------------------------------------------------------------
9090 # configuration options related to source browsing
9191 #---------------------------------------------------------------------------
92-SOURCE_BROWSER = YES
92+SOURCE_BROWSER = NO
9393 INLINE_SOURCES = NO
9494 STRIP_CODE_COMMENTS = YES
9595 REFERENCED_BY_RELATION = YES
--- a/Editor.dfm
+++ b/Editor.dfm
@@ -1,6 +1,6 @@
11 object EditorForm: TEditorForm
2- Left = 306
3- Top = 172
2+ Left = 432
3+ Top = 258
44 Width = 640
55 Height = 449
66 HorzScrollBar.Visible = False
@@ -482,7 +482,7 @@ object EditorForm: TEditorForm
482482 Left = 72
483483 Top = 124
484484 Bitmap = {
485- 494C01010C000E00040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600
485+ 494C01010C000E00040010001000FFFFFFFFFF00FFFFFFFFFFFFFFFF424D3600
486486 0000000000003600000028000000400000004000000001002000000000000040
487487 0000000000000000000000000000000000000000000000000000000000000000
488488 0000000000000000000000000000000000000000000000000000000000000000
@@ -1014,14 +1014,13 @@ object EditorForm: TEditorForm
10141014 FFF3000FFFFFF0CFFF010007FFFFF08700000003FFFFF08700010003FFF7F887
10151015 0003003FC1F7FE8F0003003FC3FBFE3F00038FFFC7FBFF7F0003FC00CBFBFE3F
10161016 0003C400DCF7FEBF0003CC00FF0FFC9F0003D400FFFFFDDF0003F800FFFFFDDF
1017- FFFFFC00FFFFFDDFFFFFFC00FFFFFFFF00000000000000000000000000000000
1018- 000000000000}
1017+ FFFFFC00FFFFFDDFFFFFFC00FFFFFFFF}
10191018 end
10201019 object HotToobarImageList: TImageList
10211020 Left = 104
10221021 Top = 124
10231022 Bitmap = {
1024- 494C01010C000E00040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600
1023+ 494C01010C000E00040010001000FFFFFFFFFF00FFFFFFFFFFFFFFFF424D3600
10251024 0000000000003600000028000000400000004000000001002000000000000040
10261025 0000000000000000000000000000000000000000000000000000000000000000
10271026 0000000000000000000000000000000000000000000000000000000000000000
@@ -1553,8 +1552,7 @@ object EditorForm: TEditorForm
15531552 FFF3000FFFFFF0CFFF010007FFFFF08700000003FFFFF08700010003FFE7F887
15541553 0003003FC1F3FE8F0003003FC3FBFE3F00038FFFC7FBFF7F0003FC00CBFBFE3F
15551554 0003C400DCF3FEBF0003CC00FF07FC9F0003D400FFFFFDDF0003F800FFFFFDDF
1556- FFFFFC00FFFFFDDFFFFFFC00FFFFFFFF00000000000000000000000000000000
1557- 000000000000}
1555+ FFFFFC00FFFFFDDFFFFFFC00FFFFFFFF}
15581556 end
15591557 object Indy: TIdHTTP
15601558 Intercept = IdLogDebug
--- a/Editor.pas
+++ b/Editor.pas
@@ -855,7 +855,7 @@ begin
855855
856856 Cookie := '';
857857 if ACOOKIE <> '' then
858- Cookie := ACOOKIE;
858+ Cookie := ACOOKIE;
859859 if SPID <> '' then
860860 Cookie := Cookie + 'SPID=' + SPID + '; ';
861861 if PON <> '' then
@@ -864,19 +864,9 @@ begin
864864 //ホストが2chで、BeにLoginしていればBEのデータを送る
865865 //GikoSys.ParseURI( URL, Protocol,Host, Path, Document, Port, Bookmark );
866866 //if GikoSys.Is2chHost(Host) and GikoSys.Setting.BeLogin then
867- if (Board.Is2ch) then begin
868- // 固定のクッキーがあれば食わせる
869- if Length(GikoSys.Setting.FixedCookie) > 0 then begin
870- // ホストが2chの場合,固定のクッキーを食わせる
871- Cookie := Cookie + GikoSys.Setting.FixedCookie + '; ';
872- end;
873- if (GikoSys.Setting.BeLogin) then begin
874- Cookie := Cookie + 'MDMD=' + GikoSys.Setting.BeCode + '; '
875- + 'DMDM=' + GikoSys.Setting.BeUserID + '; ';
876- end;
877-
878- end;
879-
867+ if (Board.Is2ch) and (GikoSys.Setting.BeLogin) then
868+ Cookie := Cookie + 'MDMD=' + GikoSys.Setting.BeCode + '; '
869+ + 'DMDM=' + GikoSys.Setting.BeUserID + '; ';
880870 Cookie := 'Cookie: ' + Cookie + 'NAME=' + NameComboBox.Text + '; MAIL=' + MailComboBox.Text;
881871
882872 sysMenu := GetSystemMenu( Handle, false );
@@ -957,35 +947,35 @@ begin
957947
958948 if ABoard = nil then Exit;
959949
960- if FileExists(ABoard.GetSETTINGTXTFileName) then begin
961- body := TStringList.Create;
962- try
963- body.LoadFromFile(ABoard.GetSETTINGTXTFileName);
964- Remote := GetFusianaName(body, ABoard);
965- finally
966- body.Free;
967- end;
968- end;
969-
970- //Setting.txtがなかったら取得
971- //鯖に負荷がかかりそう...
972- if not FileExists(ABoard.GetSETTINGTXTFileName) then begin
973- //GetSETTINGTXTActionを呼び出すとIndyが初期化されるので、
974- //ここでCookieを保存しなくてはいけない
975- tmpRawheader := Indy.Response.RawHeaders.Text;
976- GetSETTINGTXTAction.Execute;
977- body := TStringList.Create;
978- try
979- if FileExists(ABoard.GetSETTINGTXTFileName) then begin
980- body.LoadFromFile(ABoard.GetSETTINGTXTFileName);
981- Remote := GetFusianaName(body, ABoard);
982- end;
983- finally
984- body.Free;
985- end;
950+ if FileExists(ABoard.GetSETTINGTXTFileName) then begin
951+ body := TStringList.Create;
952+ try
953+ body.LoadFromFile(ABoard.GetSETTINGTXTFileName);
954+ Remote := GetFusianaName(body, ABoard);
955+ finally
956+ body.Free;
957+ end;
958+ end;
959+
960+ //Setting.txtがなかったら取得
961+ //鯖に負荷がかかりそうで怖い・・・
962+ if not FileExists(ABoard.GetSETTINGTXTFileName) then begin
963+ //GetSETTINGTXTActionを呼び出すとIndyが初期化されるので、
964+ //ここでCookieを保存しなくてはいけない
965+ tmpRawheader := Indy.Response.RawHeaders.Text;
966+ GetSETTINGTXTAction.Execute;
967+ body := TStringList.Create;
968+ try
969+ if FileExists(ABoard.GetSETTINGTXTFileName) then begin
970+ body.LoadFromFile(ABoard.GetSETTINGTXTFileName);
971+ Remote := GetFusianaName(body, ABoard);
972+ end;
973+ finally
974+ body.Free;
975+ end;
986976 end;
987977
988- if Remote = 'fusianasan' then begin
978+ if Remote = 'fusianasan' then begin
989979 MsgResult := MsgBox(
990980 Handle,
991981 'リモートホストを表示する機能が使われています' + #13#10 +
@@ -1001,83 +991,83 @@ begin
1001991 DrawMenuBar(Handle);
1002992 Exit;
1003993 end;
1004- end;
1005- end;
1006-
1007- if ResultType = grtOK then begin
1008- if (GikoSys.Setting.UseSamba) and (Timer1.Enabled) then
1009- WriteSambaTime(FHost, Now());
1010- State := gdsComplete;
1011- end else if ResultType = grtCookie then begin
1012- //ループ防止
1013- if not FirstWriting then
1014- raise Exception.Create('');
1015- MsgResult := MsgBox(
1016- Handle,
1017- '・投稿された内容はコピー、保存、引用、転載等される場合があります。' + #13#10 +
1018- '・投稿に関して発生する責任は全て投稿者に帰します。' + #13#10#13#10 +
1019- '全責任を負うことを承諾して書き込みますか?',
1020- '情報',
1021- MB_YESNO or MB_ICONQUESTION);
1022- if MsgResult = IDYES then begin
1023- if (GikoSys.Setting.RemoteTrapAtt) and (tmpRawheader <> '') then begin
1024- GetCookie(tmpRawheader, Board);
1025- end else begin
1026- GetCookie(Indy.Response.RawHeaders.Text, Board);
1027- end;
1028- if (Board.SPID = '') and (Board.PON = '') and (Board.Cookie = '') then
1029- raise Exception.Create('');
1030- //もう一回このメソッド
1031- Send(Board.Cookie, Board.SPID, Board.PON, False);
1032- Exit;
1033- end else begin
1034- Board.SPID := '';
1035- Board.PON := '';
1036- FWork := False;
1037- EnableMenuItem(SysMenu, SC_CLOSE, MF_BYCOMMAND or MF_ENABLED);
1038- DrawMenuBar(Handle);
1039- Exit;
1040- end;
1041- end else if ResultType = grtCheck then begin
1042- //ループ防止
1043- if not FirstWriting then
1044- raise Exception.Create('');
994+ end;
995+ end;
1045996
1046- MsgResult := MsgBox(
1047- Handle,
1048- '書き込みに関しては様々なログ情報が記録されています。' + #13#10 +
1049- '投稿に関して発生する責任は全て投稿者に帰します。' + #13#10 +
1050- '公序良俗に反したり、他人に迷惑をかける書き込みは控えて下さい。' + #13#10 +
1051- '投稿された内容はコピー・保存・引用・転載等される場合があります。' + #13#10 +
1052- #13#10 +
1053- '全責任を負うことを承諾して書き込みますか?',
1054- '確認',
1055- MB_YESNO or MB_ICONQUESTION);
1056-
1057- if MsgResult = IDYES then begin
1058- if (GikoSys.Setting.RemoteTrapAtt) and (tmpRawheader <> '') then begin
1059- GetCookie(tmpRawheader, Board);
997+ if ResultType = grtOK then begin
998+ if (GikoSys.Setting.UseSamba) and (Timer1.Enabled) then
999+ WriteSambaTime(FHost, Now());
1000+ State := gdsComplete;
1001+ end else if ResultType = grtCookie then begin
1002+ //ループ防止
1003+ if not FirstWriting then
1004+ raise Exception.Create('');
1005+ MsgResult := MsgBox(
1006+ Handle,
1007+ '・投稿された内容はコピー、保存、引用、転載等される場合があります。' + #13#10 +
1008+ '・投稿に関して発生する責任は全て投稿者に帰します。' + #13#10#13#10 +
1009+ '全責任を負うことを承諾して書き込みますか?',
1010+ '情報',
1011+ MB_YESNO or MB_ICONQUESTION);
1012+ if MsgResult = IDYES then begin
1013+ if (GikoSys.Setting.RemoteTrapAtt) and (tmpRawheader <> '') then begin
1014+ GetCookie(tmpRawheader, Board);
10601015 end else begin
10611016 GetCookie(Indy.Response.RawHeaders.Text, Board);
1062- end;
1063-
1064- if (Board.SPID = '') and (Board.PON = '') and (Board.Cookie = '') then
1065- raise Exception.Create('');
1066- Send(Board.Cookie, Board.SPID, Board.PON, False);
1067- Exit;
1068- end else begin
1069- EnableMenuItem(SysMenu, SC_CLOSE, MF_BYCOMMAND or MF_ENABLED);
1070- DrawMenuBar(Handle);
1071- Board.SPID := '';
1072- Board.PON := '';
1073- FWork := false;
1074- Exit;
1017+ end;
1018+ if (Board.SPID = '') and (Board.PON = '') and (Board.Cookie = '') then
1019+ raise Exception.Create('');
1020+ //もう一回このメソッド
1021+ Send(Board.Cookie, Board.SPID, Board.PON, False);
1022+ Exit;
1023+ end else begin
1024+ Board.SPID := '';
1025+ Board.PON := '';
1026+ FWork := false;
1027+ EnableMenuItem(SysMenu, SC_CLOSE, MF_BYCOMMAND or MF_ENABLED);
1028+ DrawMenuBar(Handle);
1029+ Exit;
1030+ end;
1031+ end else if ResultType = grtCheck then begin
1032+ //
1033+ //ループ防止
1034+ if not FirstWriting then
1035+ raise Exception.Create('');
1036+
1037+ MsgResult := MsgBox(
1038+ Handle,
1039+ '書き込みに関しては様々なログ情報が記録されています。' + #13#10 +
1040+ '投稿に関して発生する責任は全て投稿者に帰します。' + #13#10 +
1041+ '公序良俗に反したり、他人に迷惑をかける書き込みは控えて下さい。' + #13#10 +
1042+ '投稿された内容はコピー・保存・引用・転載等される場合があります。' + #13#10 +
1043+ #13#10 +
1044+ '全責任を負うことを承諾して書き込みますか?',
1045+ '確認',
1046+ MB_YESNO or MB_ICONQUESTION);
1047+
1048+ if MsgResult = IDYES then begin
1049+ if (GikoSys.Setting.RemoteTrapAtt) and (tmpRawheader <> '') then begin
1050+ GetCookie(tmpRawheader, Board);
1051+ end else begin
1052+ GetCookie(Indy.Response.RawHeaders.Text, Board);
1053+ end;
1054+ if (Board.SPID = '') and (Board.PON = '') and (Board.Cookie = '') then
1055+ raise Exception.Create('');
1056+ Send(Board.Cookie, Board.SPID, Board.PON, False);
1057+ Exit;
1058+ end else begin
1059+ EnableMenuItem(SysMenu, SC_CLOSE, MF_BYCOMMAND or MF_ENABLED);
1060+ DrawMenuBar(Handle);
1061+ Board.SPID := '';
1062+ Board.PON := '';
1063+ FWork := false;
1064+ Exit;
10751065 end;
10761066 end else begin
1077- if (GikoSys.Setting.UseSamba) and (Timer1.Enabled) then
1078- WriteSambaTime(FHost, Now());
1079- State := gdsError;
1080- raise Exception.Create('');
1067+ if (GikoSys.Setting.UseSamba) and (Timer1.Enabled) then
1068+ WriteSambaTime(FHost, Now());
1069+ State := gdsError;
1070+ raise Exception.Create('');
10811071 end;
10821072
10831073 except
@@ -1120,9 +1110,8 @@ begin
11201110 DrawMenuBar(Handle);
11211111 end;
11221112 FWork := false;
1123- //非公式ギコナビ板などの2ch互換スクリプト用
1124- //2ch以外でかつResponceCodeが302Foundで書き込み完了
1125- //if (not Board.Is2ch) and (FStatusCode = 302) then begin
1113+ //非公式ギコナビ板などのスクリプト用
1114+ //ResponceCodeが302Foundで書き込み完了
11261115 if FStatusCode = 302 then begin
11271116 GikoForm.PlaySound('ResEnd');
11281117 SaveSendFile;
@@ -1213,13 +1202,12 @@ begin
12131202 s := 'sid=' + HttpEncode(SessionID) + '&'
12141203 else
12151204 s := '';
1216- s := s + 'subject=&'
1217- + 'FROM=' + HttpEncode(NameComboBox.Text) + '&'
1218- + 'mail=' + HttpEncode(MailComboBox.Text) + '&'
1219- + 'MESSAGE=' + HttpEncode(body) + '&'
1220- + 'bbs=' + Board.BBSID + '&'
1221- + 'time=' + IntToStr(SendTime) + '&';
1222-
1205+ s := s + 'subject=&'
1206+ + 'FROM=' + HttpEncode(NameComboBox.Text) + '&'
1207+ + 'mail=' + HttpEncode(MailComboBox.Text) + '&'
1208+ + 'MESSAGE=' + HttpEncode(body) + '&'
1209+ + 'bbs=' + Board.BBSID + '&'
1210+ + 'time=' + IntToStr(SendTime) + '&';
12231211 if FThreadItem = nil then begin
12241212 s := s + 'subject=' + HttpEncode(TitleEdit.Text) + '&';
12251213 s := s + 'submit=' + HttpEncode('全責任を負うことを承諾して書き込む') + #13#10;
@@ -2182,7 +2170,7 @@ begin
21822170 end else if( AnsiPos(VAL_PON, val) > 0 ) then begin
21832171 ABoard.PON := Copy(val, AnsiPos(VAL_PON, val) + Length(VAL_PON), Length(val));
21842172 end else begin
2185- ABoard.Cookie := ABoard.Cookie + val + '; ';
2173+ ABoard.Cookie := val + '; ';
21862174 end;
21872175 //expiresを切り出す
21882176 val := Trim(GikoSys.GetTokenIndex(tmp, ';', 1));
--- a/Giko.dfm
+++ b/Giko.dfm
@@ -4469,7 +4469,7 @@ object GikoForm: TGikoForm
44694469 Left = 4
44704470 Top = 244
44714471 Bitmap = {
4472- 494C010138003B00040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600
4472+ 494C010138003B00040010001000FFFFFFFFFF00FFFFFFFFFFFFFFFF424D3600
44734473 000000000000360000002800000040000000F0000000010020000000000000F0
44744474 0000000000000000000000000000000000000000000000000000000000000000
44754475 0000000000000000000000000000000000000000000000000000000000000000
@@ -6453,8 +6453,7 @@ object GikoForm: TGikoForm
64536453 00000000C003FFFF0000000080017FFF0000000080013F7F0000000000000E3F
64546454 000000000000861F800000000000C20FC00100000000E007F81F00000000F043
64556455 F00F00000000F861E00700008001FC70C003803F8001FEFCF81FC07FC003FFFE
6456- F81FE0FFE007FFFFF83FFFFFF81FFFFF00000000000000000000000000000000
6457- 000000000000}
6456+ F81FE0FFE007FFFFF83FFFFFF81FFFFF}
64586457 end
64596458 object ItemImageList: TImageList
64606459 Left = 4
@@ -7886,12 +7885,10 @@ object GikoForm: TGikoForm
78867885 end
78877886 object N76: TMenuItem
78887887 Action = GikoDM.LiveItemAction
7889- AutoCheck = True
78907888 GroupIndex = 1
78917889 end
78927890 object DAT3: TMenuItem
78937891 Action = GikoDM.ArchiveItemAction
7894- AutoCheck = True
78957892 GroupIndex = 1
78967893 end
78977894 object S2: TMenuItem
@@ -8649,9 +8646,6 @@ object GikoForm: TGikoForm
86498646 object N58: TMenuItem
86508647 Caption = '-'
86518648 end
8652- object FavoriteTreeItemNameCopyPopupMenu: TMenuItem
8653- Action = GikoDM.FavoriteTreeViewItemNameCopyAction
8654- end
86558649 object FavoriteTreeURLCopyPopupMenu: TMenuItem
86568650 Action = GikoDM.FavoriteTreeViewURLCopyAction
86578651 end
@@ -8728,11 +8722,9 @@ object GikoForm: TGikoForm
87288722 end
87298723 object N75: TMenuItem
87308724 Action = GikoDM.LiveItemAction
8731- AutoCheck = True
87328725 end
87338726 object DAT2: TMenuItem
87348727 Action = GikoDM.ArchiveItemAction
8735- AutoCheck = True
87368728 end
87378729 object N68: TMenuItem
87388730 Caption = '-'
--- a/Giko.pas
+++ b/Giko.pas
@@ -408,7 +408,6 @@ type
408408 N75: TMenuItem;
409409 DAT3: TMenuItem;
410410 N76: TMenuItem;
411- FavoriteTreeItemNameCopyPopupMenu: TMenuItem;
412411 procedure FormCreate(Sender: TObject);
413412 procedure FormDestroy(Sender: TObject);
414413 procedure BrowserStatusTextChange(Sender: TObject;
@@ -1466,32 +1465,21 @@ procedure TGikoForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
14661465 begin
14671466 // if GikoForm.WindowState <> wsMinimized then
14681467 // SaveCoolBarSettings;
1469- CanClose := True;
14701468 if ( GikoSys.Setting.ShowDialogForEnd ) and
14711469 (MessageDlg('ギコナビを終了してよろしいですか?', mtConfirmation,[mbOk, mbCancel], 0) = mrCancel ) then begin
14721470 CanClose := false;
14731471 Exit;
1474- end;
1475-
1476- if GikoSys.Setting.TabAutoLoadSave then begin
1477- GikoDM.TabAutoSaveAction.Execute;
1478- end;
1479-
1480- if (SearchDialog <> nil) then begin
1481- if (SearchDialog.Visible) then begin
1482- SearchDialog.Close;
1483- try
1484- SearchDialog.Release;
1485- except
1486- end;
1487- SearchDialog := nil;
1472+ end else begin
1473+ CanClose := True;
1474+ if GikoSys.Setting.TabAutoLoadSave then begin
1475+ GikoDM.TabAutoSaveAction.Execute;
14881476 end;
14891477 end;
1490- { //2ch言語ファイルFree
1478+ { //2ch言語ファイルFree
14911479 if GikoSys.Setting.Gengo <> nil then begin
14921480 GikoSys.Setting.Gengo.Free;
14931481 end;
1494- }
1482+ }
14951483 Application.UnhookMainWindow(Hook);
14961484 Application.Terminate;
14971485 end;
@@ -1912,8 +1900,8 @@ begin
19121900 tmp2 := ZenToHan(e.Get_outerText);
19131901 if (GikoSys.IsNumeric(tmp2)) then begin
19141902 //sはレス番号っぽいっす。
1915- wkIntSt := StrToInt64(tmp2);
1916- wkIntTo := StrToInt64(tmp2);
1903+ wkIntSt := StrToInt(tmp2);
1904+ wkIntTo := StrToInt(tmp2);
19171905 //s := GetThreadText(wkBBS, wkKey, wkIntSt, wkIntTo, False, False);
19181906 FHint.PopupType := gptThread;
19191907 HTMLCreater.SetResPopupText(FHint, GetActiveContent, wkIntSt, wkIntTo, False, False);
@@ -4623,7 +4611,7 @@ begin
46234611 threadNumber := ChangeFileExt(Thread.FileName, '');
46244612 GikoSys.GetPopupResNumber( URL, stRes, edRes );
46254613 // スレの番号をレス番と誤って認識しているのをクリア
4626- if (StrToInt64(threadNumber) = stRes) then begin
4614+ if (StrToInt(threadNumber) = stRes) then begin
46274615 if not (AnsiEndsText(threadNumber + '/' + threadNumber, URL))
46284616 and (Pos('&st=' + threadNumber , URL) = 0) then begin
46294617 stRes := 0;
@@ -4782,7 +4770,7 @@ begin
47824770 end;
47834771 end;
47844772 // ログなしスレッドのときは、ホスト名のチェックをする
4785- if (not ThreadItem.IsLogFile) then begin
4773+ if not ThreadItem.IsLogFile then begin
47864774 if AnsiPos(Host, Board.URL) = 0 then
47874775 ThreadItem.DownloadHost := Host
47884776 else
@@ -5099,7 +5087,7 @@ begin
50995087
51005088 ThreadItem := GetActiveContent;
51015089 if ThreadItem <> nil then begin
5102- Num := StrToInt64(s);
5090+ Num := StrToInt(s);
51035091 FHint.PopupType := gptThread;
51045092 HTMLCreater.SetResPopupText(FHint, ThreadItem, Num, Num, False, False);
51055093 if FHint.ResCount <> 0 then
@@ -6238,29 +6226,26 @@ begin
62386226 FavoriteTreeNameURLCopyPopupMenu.Visible := False;
62396227 FavoriteTreeReloadPopupMenu.Visible := False;
62406228 FavoriteTreeLogDeletePopupMenu.Visible := False;
6241- FavoriteTreeItemNameCopyPopupMenu.Visible := False;
62426229 end else if FClickNode.IsFirstNode then begin
62436230 FavoriteTreeBrowseFolderPopupMenu.Visible := True;
62446231 FavoriteTreeDeletePopupMenu.Visible := False;
62456232 FavoriteTreeRenamePopupMenu.Visible := False;
62466233 FavoriteTreeNewFolderPopupMenu.Visible := True;
62476234 FavoriteTreeURLCopyPopupMenu.Visible := False;
6248- FavoriteTreeNameCopyPopupMenu.Visible := False;
6235+ FavoriteTreeNameCopyPopupMenu.Visible := True;
62496236 FavoriteTreeNameURLCopyPopupMenu.Visible := False;
62506237 FavoriteTreeReloadPopupMenu.Visible := False;
62516238 FavoriteTreeLogDeletePopupMenu.Visible := False;
6252- FavoriteTreeItemNameCopyPopupMenu.Visible := True;
62536239 end else if FClickNode.Text = Favorite.FAVORITE_LINK_NAME then begin
62546240 FavoriteTreeBrowseFolderPopupMenu.Visible := True;
62556241 FavoriteTreeDeletePopupMenu.Visible := True;
62566242 FavoriteTreeRenamePopupMenu.Visible := False;
62576243 FavoriteTreeNewFolderPopupMenu.Visible := True;
62586244 FavoriteTreeURLCopyPopupMenu.Visible := False;
6259- FavoriteTreeNameCopyPopupMenu.Visible := False;
6245+ FavoriteTreeNameCopyPopupMenu.Visible := True;
62606246 FavoriteTreeNameURLCopyPopupMenu.Visible := False;
62616247 FavoriteTreeReloadPopupMenu.Visible := False;
62626248 FavoriteTreeLogDeletePopupMenu.Visible := False;
6263- FavoriteTreeItemNameCopyPopupMenu.Visible := True;
62646249 end else if TObject(FClickNode.Data) is TFavoriteFolder then begin
62656250 FavoriteTreeBrowseFolderPopupMenu.Visible := True;
62666251 FavoriteTreeDeletePopupMenu.Visible := True;
@@ -6271,7 +6256,6 @@ begin
62716256 FavoriteTreeNameURLCopyPopupMenu.Visible := False;
62726257 FavoriteTreeReloadPopupMenu.Visible := False;
62736258 FavoriteTreeLogDeletePopupMenu.Visible := False;
6274- FavoriteTreeItemNameCopyPopupMenu.Visible := True;
62756259 end else if TObject(FClickNode.Data) is TFavoriteThreadItem then begin
62766260 FavoriteTreeBrowseFolderPopupMenu.Visible := False;
62776261 FavoriteTreeDeletePopupMenu.Visible := True;
@@ -6282,7 +6266,6 @@ begin
62826266 FavoriteTreeNameURLCopyPopupMenu.Visible := True;
62836267 FavoriteTreeReloadPopupMenu.Visible := True;
62846268 FavoriteTreeLogDeletePopupMenu.Visible := True;
6285- FavoriteTreeItemNameCopyPopupMenu.Visible := True;
62866269 end else if TObject(FClickNode.Data) is TFavoriteBoardItem then begin
62876270 FavoriteTreeBrowseFolderPopupMenu.Visible := False;
62886271 FavoriteTreeDeletePopupMenu.Visible := True;
@@ -6293,7 +6276,6 @@ begin
62936276 FavoriteTreeNameURLCopyPopupMenu.Visible := True;
62946277 FavoriteTreeReloadPopupMenu.Visible := True;
62956278 FavoriteTreeLogDeletePopupMenu.Visible := False;
6296- FavoriteTreeItemNameCopyPopupMenu.Visible := True;
62976279 end else begin
62986280 FavoriteTreeBrowseFolderPopupMenu.Visible := False;
62996281 FavoriteTreeDeletePopupMenu.Visible := False;
@@ -6304,7 +6286,6 @@ begin
63046286 FavoriteTreeNameURLCopyPopupMenu.Visible := False;
63056287 FavoriteTreeReloadPopupMenu.Visible := False;
63066288 FavoriteTreeLogDeletePopupMenu.Visible := False;
6307- FavoriteTreeItemNameCopyPopupMenu.Visible := False;
63086289 end;
63096290
63106291 end;
--- a/GikoDataModule.dfm
+++ b/GikoDataModule.dfm
@@ -913,7 +913,7 @@ object GikoDM: TGikoDM
913913 object FavoriteTreeViewURLCopyAction: TAction
914914 Tag = -1
915915 Category = #12362#27671#12395#20837#12426#12484#12522#12540#12509#12483#12503#12450#12483#12503
916- Caption = 'URL'#12434#12467#12500#12540'(&U)'
916+ Caption = 'URL'#12434#12467#12500#12540'(&C)'
917917 Hint = #36984#25246#12373#12428#12390#12356#12427#12473#12524#12483#12489#12398'URL'#12434#12467#12500#12540#12377#12427
918918 OnExecute = FavoriteTreeViewURLCopyActionExecute
919919 end
@@ -1234,12 +1234,6 @@ object GikoDM: TGikoDM
12341234 ShortCut = 16454
12351235 OnExecute = OpenFindDialogActionExecute
12361236 end
1237- object FavoriteTreeViewItemNameCopyAction: TAction
1238- Category = #12362#27671#12395#20837#12426#12484#12522#12540#12509#12483#12503#12450#12483#12503
1239- Caption = #34920#31034#21517#12434#12467#12500#12540'(&S)'
1240- Hint = #34920#31034#12375#12390#12356#12427#21517#21069#12434#12463#12522#12483#12503#12508#12540#12489#12395#12467#12500#12540#12377#12427
1241- OnExecute = FavoriteTreeViewItemNameCopyActionExecute
1242- end
12431237 end
12441238 object ToobarImageList: TImageList
12451239 Left = 44
--- a/GikoDataModule.pas
+++ b/GikoDataModule.pas
@@ -217,7 +217,6 @@ type
217217 OpenFindDialogAction: TAction;
218218 ArchiveItemAction: TAction;
219219 LiveItemAction: TAction;
220- FavoriteTreeViewItemNameCopyAction: TAction;
221220 procedure EditNGActionExecute(Sender: TObject);
222221 procedure ReloadActionExecute(Sender: TObject);
223222 procedure GoFowardActionExecute(Sender: TObject);
@@ -404,7 +403,6 @@ type
404403 procedure OpenFindDialogActionExecute(Sender: TObject);
405404 procedure ArchiveItemActionExecute(Sender: TObject);
406405 procedure LiveItemActionExecute(Sender: TObject);
407- procedure FavoriteTreeViewItemNameCopyActionExecute(Sender: TObject);
408406 private
409407 { Private 宣言 }
410408 procedure ClearResFilter;
@@ -726,7 +724,7 @@ begin
726724
727725 end;
728726 // *************************************************************************
729-//! 選択されているお気に入りのURLをコピーする
727+//! 選択されているスレッドのURLをコピーする
730728 // *************************************************************************
731729 procedure TGikoDM.FavoriteTreeViewURLCopyActionExecute(Sender: TObject);
732730 begin
@@ -738,7 +736,7 @@ begin
738736 end;
739737 end;
740738 // *************************************************************************
741-//! 選択されているお気に入りの名前をコピーする
739+//! 選択されている板の名前をコピーする
742740 // *************************************************************************
743741 procedure TGikoDM.FavoriteTreeViewNameCopyActionExecute(Sender: TObject);
744742 begin
@@ -748,14 +746,10 @@ begin
748746 if (TObject(GikoForm.ClickNode.Data) is TFavoriteItem) then begin
749747 Clipboard.AsText :=
750748 TFavoriteItem(GikoForm.ClickNode.Data).GetItemTitle + #13#10;
751- end else begin
752- Clipboard.AsText :=
753- GikoForm.ClickNode.Text + #13#10;
754-
755749 end;
756750 end;
757751 // *************************************************************************
758-//! 選択されているお気に入りの名前とURLをコピーする
752+//! 選択されているスレッドの名前とURLをコピーする
759753 // *************************************************************************
760754 procedure TGikoDM.FavoriteTreeViewNameURLCopyActionExecute(
761755 Sender: TObject);
@@ -773,7 +767,7 @@ begin
773767
774768 end;
775769 // *************************************************************************
776-//! 選択されているお気に入りスレッドを削除する
770+//! 選択されているスレッドを削除する
777771 // *************************************************************************
778772 procedure TGikoDM.FavoriteTreeViewLogDeleteActionExecute(Sender: TObject);
779773 const
@@ -3865,17 +3859,6 @@ begin
38653859 end;
38663860 end;
38673861
3868-// *************************************************************************
3869-//! 選択されているお気に入りの表示名をコピーする
3870-// *************************************************************************
3871-procedure TGikoDM.FavoriteTreeViewItemNameCopyActionExecute(
3872- Sender: TObject);
3873-begin
3874- if GikoForm.ClickNode = nil then Exit;
3875-
3876- Clipboard.AsText :=
3877- GikoForm.ClickNode.Text + #13#10;
3878-end;
38793862
38803863 end.
38813864
--- a/InputAssist.pas
+++ b/InputAssist.pas
@@ -72,7 +72,7 @@ var
7272
7373 implementation
7474
75-uses Setting, MojuUtils;
75+uses Setting;
7676
7777
7878 {$R *.dfm}
@@ -194,19 +194,15 @@ procedure TInputAssistForm.GikoListView1Compare(Sender: TObject; Item1,
194194 begin
195195 if ((FSortColumn and 2) > 0) then begin
196196 // カテゴリでソート
197- Compare := CompareStr(
198- ZenToHan(Item1.SubItems[0]), ZenToHan(Item2.SubItems[0]));
197+ Compare := AnsiCompareStr(Item1.SubItems[0], Item2.SubItems[0]);
199198 if (Compare = 0) then begin
200- Compare := CompareStr(
201- ZenToHan(Item1.Caption), ZenToHan(Item2.Caption));
199+ Compare := AnsiCompareStr(Item1.Caption, Item2.Caption);
202200 end;
203201 end else begin
204202 // キーでソート
205- Compare := CompareStr(
206- ZenToHan(Item1.Caption), ZenToHan(Item2.Caption));
203+ Compare := AnsiCompareStr(Item1.Caption, Item2.Caption);
207204 if (Compare = 0) then begin
208- Compare := CompareStr(
209- ZenToHan(Item1.SubItems[0]), ZenToHan(Item2.SubItems[0]));
205+ Compare := AnsiCompareStr(Item1.SubItems[0], Item2.SubItems[0]);
210206 end;
211207 end;
212208 // 昇順降順の反転
--- a/InputAssistDataModule.pas
+++ b/InputAssistDataModule.pas
@@ -3,7 +3,7 @@ unit InputAssistDataModule;
33 interface
44
55 uses
6- SysUtils, Classes, Windows;
6+ SysUtils, Classes;
77
88 type
99 TResistWord = class;
@@ -15,7 +15,6 @@ type
1515 { Private 宣言 }
1616 FInit : Boolean;
1717 FDictionary : TStringList; ///< 登録単語と定型文の辞書
18- FSorted : Boolean;
1918 function GetSorted: Boolean; ///< ソートの状態の取得
2019 procedure SetSorted(Value: Boolean); ///< ソート状態の設定
2120
@@ -58,7 +57,6 @@ type
5857 end;
5958
6059 function CategorySort(List: TStringList; Index1, Index2: Integer): Integer;
61- function KeySort(List: TStringList; Index1, Index2: Integer): Integer;
6260 var
6361 InputAssistDM: TInputAssistDM;
6462
@@ -118,13 +116,6 @@ var
118116 begin
119117 FInit := True;
120118 try
121- // iniファイルが無ければ、デフォルトをリネームする
122- if not FileExists(FilePath) then begin
123- CopyFile(
124- PChar(ChangeFileExt(FilePath, '.default')),
125- PChar(FilePath), True);
126- end;
127-
128119 // ファイルの存在を確認
129120 if FileExists(FilePath) then begin
130121 ini := TMemIniFile.Create(FilePath);
@@ -149,9 +140,6 @@ begin
149140 sections.Free;
150141 ini.Free;
151142 end;
152- if FSorted Then begin
153- FDictionary.CustomSort(KeySort);
154- end;
155143 end;
156144
157145 except
@@ -167,11 +155,10 @@ var
167155 begin
168156 if FileExists(FilePath) then begin
169157 try
170- SysUtils.DeleteFile(FilePath);
158+ DeleteFile(FilePath);
171159 except
172160 end;
173161 end;
174-
175162 ini := TMemIniFile.Create(FilePath);
176163 try
177164 for i :=0 to FDictionary.Count - 1 do begin
@@ -201,8 +188,8 @@ end;
201188 procedure TInputAssistDM.DataModuleCreate(Sender: TObject);
202189 begin
203190 FDictionary := TStringList.Create;
204- FDictionary.Sorted := False;
205- FSorted := True;
191+ FDictionary.Duplicates := dupAccept;
192+ FDictionary.Sorted := True;
206193 end;
207194 //! 登録単語数取得
208195 function TInputAssistDM.ResistWordCount : Integer;
@@ -235,9 +222,6 @@ begin
235222 break;
236223 end;
237224 end;
238- if FSorted Then begin
239- FDictionary.CustomSort(KeySort);
240- end;
241225 end;
242226 end;
243227 //! 登録単語追加
@@ -253,9 +237,6 @@ begin
253237 resWord.SetText('定型文');
254238 FDictionary.AddObject(Key, resWord);
255239 Result := resWord;
256- if FSorted Then begin
257- FDictionary.CustomSort(KeySort);
258- end;
259240 end;
260241 end;
261242 //! 登録単語のキー変更
@@ -270,10 +251,6 @@ begin
270251 break;
271252 end;
272253 end;
273- if FSorted Then begin
274- FDictionary.CustomSort(KeySort);
275- end;
276-
277254 end;
278255 end;
279256 //! Keyを持つ登録されている単語を取得
@@ -323,15 +300,17 @@ end;
323300 //! ソートの状態の取得
324301 function TInputAssistDM.GetSorted: Boolean;
325302 begin
326- Result := FSorted;
303+ Result := False;
304+ if (FDictionary <> nil) then begin
305+ Result := FDictionary.Sorted;
306+ end;
327307 end;
328308 //! ソート状態の設定
329309 procedure TInputAssistDM.SetSorted(Value: Boolean);
330310 begin
331- if (not FSorted) and (Value) then begin
332- FDictionary.CustomSort(KeySort);
311+ if (FDictionary <> nil) then begin
312+ FDictionary.Sorted := Value;
333313 end;
334- FSorted := Value;
335314 end;
336315 //! Keyのカテゴリに登録されている単語を取得
337316 function TInputAssistDM.GetCategoryResistWords(Key: String; var list: TStringList): Integer;
@@ -381,30 +360,9 @@ begin
381360 try
382361 resWord1 := TResistWord(List.Objects[Index1]);
383362 resWord2 := TResistWord(List.Objects[Index2]);
384- Result := CompareStr(ZenToHan(resWord1.GetCategory),
385- ZenToHan(resWord2.GetCategory));
386- if (Result = 0) then begin
387- Result := CompareStr(ZenToHan(resWord1.GetKey),
388- ZenToHan(resWord2.GetKey));
389- end;
390- except
391- end;
392-end;
393-//! Keyを全半角無視の形でソートする際の比較メソッド
394-function KeySort(List: TStringList; Index1, Index2: Integer): Integer;
395-var
396- resWord1 : TResistWord;
397- resWord2 : TResistWord;
398-begin
399- Result := 0;
400- try
401- resWord1 := TResistWord(List.Objects[Index1]);
402- resWord2 := TResistWord(List.Objects[Index2]);
403- Result := CompareStr(ZenToHan(resWord1.FKey),
404- ZenToHan(resWord2.FKey));
363+ Result := AnsiCompareStr(resWord1.GetCategory, resWord2.GetCategory);
405364 if (Result = 0) then begin
406- Result := CompareStr(ZenToHan(resWord1.GetCategory),
407- ZenToHan(resWord2.GetCategory));
365+ Result := AnsiCompareStr(resWord1.GetKey, resWord2.GetKey);
408366 end;
409367 except
410368 end;
--- a/KuroutSetting.dfm
+++ b/KuroutSetting.dfm
@@ -363,39 +363,6 @@ object KuroutOption: TKuroutOption
363363 end
364364 end
365365 end
366- object KakikomiTabSheet: TTabSheet
367- Caption = #35443#32048#35373#23450'3'
368- ImageIndex = 2
369- object CookieGroupBox: TGroupBox
370- Left = 16
371- Top = 16
372- Width = 473
373- Height = 105
374- Caption = #12463#12483#12461#12540
375- TabOrder = 0
376- object Label8: TLabel
377- Left = 16
378- Top = 20
379- Width = 59
380- Height = 12
381- Caption = #22266#23450'Cookie'
382- end
383- object Label9: TLabel
384- Left = 20
385- Top = 67
386- Width = 321
387- Height = 12
388- Caption = '2'#12385#12419#12435#12397#12427#12408#12398#26360#12365#36796#12415#12398#38555#12395#65380#19978#35352#12398#25991#23383#21015#12434#24120#12395#36865#20449#12377#12427
389- end
390- object FixedCookieEdit: TEdit
391- Left = 16
392- Top = 40
393- Width = 441
394- Height = 20
395- TabOrder = 0
396- end
397- end
398- end
399366 end
400367 object OkBotton: TButton
401368 Left = 224
--- a/KuroutSetting.pas
+++ b/KuroutSetting.pas
@@ -56,11 +56,6 @@ type
5656 Label6: TLabel;
5757 ReadTimeOut: TEdit;
5858 Label7: TLabel;
59- KakikomiTabSheet: TTabSheet;
60- CookieGroupBox: TGroupBox;
61- Label8: TLabel;
62- FixedCookieEdit: TEdit;
63- Label9: TLabel;
6459 procedure OkBottonClick(Sender: TObject);
6560 procedure FormCreate(Sender: TObject);
6661 procedure CDeleteButtonClick(Sender: TObject);
@@ -121,8 +116,6 @@ begin
121116 //FusianaSet
122117 LocalTrapAtt.Checked := GikoSys.Setting.LocalTrapAtt;
123118 RemoteTrapAtt.Checked := GikoSys.Setting.RemoteTrapAtt;
124- // Cookie
125- FixedCookieEdit.Text := GikoSys.Setting.FixedCookie;
126119 end;
127120
128121 procedure TKuroutOption.SaveSetting;
@@ -141,15 +134,12 @@ begin
141134 else
142135 GikoSys.Setting.TimeAdjustSec := 0;
143136 GikoSys.Setting.TimeAdjust := PutPostTimeRadioButton.Checked;
144- //2ch言語サポート
145- GikoSys.Setting.GengoSupport := GengoSupport.Checked;
146- GikoSys.SetGikoMessage;
147- //ローカル・リモートフシアナ警告
148- GikoSys.Setting.LocalTrapAtt := LocalTrapAtt.Checked;
149- GikoSys.Setting.RemoteTrapAtt := RemoteTrapAtt.Checked;
150- // Cookie
151- GikoSys.Setting.FixedCookie := FixedCookieEdit.Text;
152-
137+ //2ch言語サポート
138+ GikoSys.Setting.GengoSupport := GengoSupport.Checked;
139+ GikoSys.SetGikoMessage;
140+ //ローカル・リモートフシアナ警告
141+ GikoSys.Setting.LocalTrapAtt := LocalTrapAtt.Checked;
142+ GikoSys.Setting.RemoteTrapAtt := RemoteTrapAtt.Checked;
153143
154144 GikoSys.Setting.KuroutSettingTabIndex := PageControl1.ActivePageIndex;
155145 end;
--- a/Option.dfm
+++ b/Option.dfm
@@ -61,9 +61,9 @@ object OptionDialog: TOptionDialog
6161 Top = 4
6262 Width = 509
6363 Height = 389
64- ActivePage = TabSheet4
64+ ActivePage = TabSheet3
6565 MultiLine = True
66- TabIndex = 7
66+ TabIndex = 3
6767 TabOrder = 3
6868 OnChange = OptionTabChange
6969 object ConnectSheet: TTabSheet
@@ -1207,8 +1207,8 @@ object OptionDialog: TOptionDialog
12071207 end
12081208 end
12091209 object GroupBox19: TGroupBox
1210- Left = 11
1211- Top = 74
1210+ Left = 16
1211+ Top = 80
12121212 Width = 465
12131213 Height = 49
12141214 Caption = #23653#27508
--- a/Search.dfm
+++ b/Search.dfm
@@ -16,9 +16,7 @@ object SearchDialog: TSearchDialog
1616 Font.Style = []
1717 OldCreateOrder = False
1818 Position = poOwnerFormCenter
19- OnCloseQuery = FormCloseQuery
2019 OnCreate = FormCreate
21- OnDestroy = FormDestroy
2220 DesignSize = (
2321 450
2422 303)
@@ -258,16 +256,4 @@ object SearchDialog: TSearchDialog
258256 TabOrder = 6
259257 end
260258 end
261- object BoardsProgressBar: TProgressBar
262- Left = 8
263- Top = 275
264- Width = 145
265- Height = 16
266- Min = 0
267- Max = 100
268- Smooth = True
269- Step = 1
270- TabOrder = 8
271- Visible = False
272- end
273259 end
--- a/Search.pas
+++ b/Search.pas
@@ -26,7 +26,6 @@ type
2626 RegExpCheckBox: TCheckBox;
2727 GoogleCheckBox: TCheckBox;
2828 FuzzyCharDicCheckBox: TCheckBox;
29- BoardsProgressBar: TProgressBar;
3029 procedure FormCreate(Sender: TObject);
3130 procedure CategoryListViewSelectItem(Sender: TObject; Item: TListItem;
3231 Selected: Boolean);
@@ -38,8 +37,6 @@ type
3837 procedure BoardListViewDblClick(Sender: TObject);
3938 procedure CancelBottonClick(Sender: TObject);
4039 procedure BoardListViewResize(Sender: TObject);
41- procedure FormDestroy(Sender: TObject);
42- procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
4340 private
4441 { Private 宣言 }
4542 FChkItem: TObject;
@@ -49,9 +46,6 @@ type
4946 procedure SetBoardList(Item: TListItem);
5047 procedure CheckItem(Item: TObject);
5148 procedure OnMatch(Sender: TObject; LineInfo: RE_LineInfo_t);
52- procedure SearchLogs( Reg: TGrep );
53- procedure SearchLog(Reg: TGrep; Item: TThreadItem);
54- function CountBoards : Integer;
5549 public
5650 { Public 宣言 }
5751 // constructor Create(AOwner: TComponent); overload; override;
@@ -230,18 +224,17 @@ end;
230224
231225 procedure TSearchDialog.OkBottonClick(Sender: TObject);
232226 var
233- i : Integer;
234-// i, j, k, l: Integer;
235-// Category: TCategory;
236-// Board: TBoard;
237-// ThreadItem: TThreadItem;
227+ i, j, k, l: Integer;
228+ Category: TCategory;
229+ Board: TBoard;
230+ ThreadItem: TThreadItem;
238231 List: TList;
239232 //sl: TStringList;
240233 SearchWord: string;
241234 Reg: TGrep;
242235 Filter: string;
243236 oldText: string;
244-// bbs : TBBS;
237+ bbs : TBBS;
245238 begin
246239 // grep 内でイベントが拾えてしまうので、操作できないようにする
247240 AllSelectButton.Enabled := False;
@@ -257,11 +250,6 @@ begin
257250
258251 Reg := TGrep.Create( nil );
259252 try
260- // プログレスバーを設定して見えるようにする
261- BoardsProgressBar.Max := CountBoards;
262- BoardsProgressBar.Position := 0;
263- BoardsProgressBar.Visible := True;
264-
265253 if Length( SearchComboBox.Text ) > 0 then
266254 begin
267255 // ComboBox の内容を更新
@@ -277,7 +265,7 @@ begin
277265 SearchComboBox.Text := oldText;
278266
279267 BoardListView.Clear;
280- Application.ProcessMessages;
268+ Application.ProcessMessages;
281269 // grep 用の検索ワードを生成
282270 Reg.OnMatch := OnMatch;
283271 Reg.UseFuzzyCharDic := FuzzyCharDicCheckBox.Checked;
@@ -317,11 +305,45 @@ begin
317305 End;
318306
319307 // サイトの中の (続く)
320- SearchLogs(Reg);
308+ try
309+ // 掲示板の中の (続く)
310+ for l := 0 to Length( BBSs ) - 1 do begin
311+ bbs := BBSs[ l ];
312+ for i := 0 to bbs.Count - 1 do begin
313+ // カテゴリの中の (続く)
314+ Category := bbs.Items[i];
315+ for j := 0 to Category.Count - 1 do begin
316+ // 板の中の (続く)
317+ Board := Category.Items[j];
318+ if Board.BoolData then begin
319+ if not Board.IsThreadDatRead then
320+ GikoSys.ReadSubjectFile(Board);
321+ for k := 0 to Board.Count - 1 do begin
322+ // 個々のスレッドの (続く)
323+ ThreadItem := Board.Items[k];
324+ if FileExists( ThreadItem.GetThreadFileName ) then begin
325+ // ログが存在する
326+ try
327+ // 検索
328+ // ※見つかったら OnMatch に飛ぶ
329+ FRegItem := ThreadItem;
330+ Reg.GrepByRegExp( ThreadItem.GetThreadFileName )
331+ except
332+ end;
333+ //Application.ProcessMessages;
334+ if FCancel then raise Exception.Create('ログ検索を中止します');
335+ end;
336+ end;
337+
338+ end;
339+ end;
340+ end;
341+ end;
342+ except
343+ on E:Exception do ShowMessage(E.Message)
344+ end;
321345 end;
322346 finally
323- //プログレスバーを隠す
324- BoardsProgressBar.Visible := False;
325347 //sl.Free;
326348 List.Free;
327349 Screen.Cursor := crDefault;
@@ -335,96 +357,22 @@ begin
335357 CancelBotton.Enabled := false;
336358 end;
337359 end;
338-//! 選択された板のスレッドの中身を検索する
339-procedure TSearchDialog.SearchLogs( Reg: TGrep );
340-var
341- i, j, k, l : Integer;
342- bbs : TBBS;
343- Category: TCategory;
344- Board: TBoard;
345-begin
346- // サイトの中の (続く)
347- try
348- // 掲示板の中の (続く)
349- for l := 0 to Length( BBSs ) - 1 do begin
350- bbs := BBSs[ l ];
351- for i := 0 to bbs.Count - 1 do begin
352- // カテゴリの中の (続く)
353- Category := bbs.Items[i];
354- for j := 0 to Category.Count - 1 do begin
355- // 板の中の (続く)
356- Board := Category.Items[j];
357- if Board.BoolData then begin
358- if not Board.IsThreadDatRead then
359- GikoSys.ReadSubjectFile(Board);
360- for k := 0 to Board.Count - 1 do begin
361- // 個々のスレッドの (続く)
362- SearchLog(Reg, Board.Items[k]);
363- end;
364- BoardsProgressBar.StepIt;
365- end;
366360
367- end;
368- end;
369- end;
370- except
371- on E:Exception do ShowMessage(E.Message)
372- end;
373-end;
374-//! 選択されている板の数をカウントする
375-function TSearchDialog.CountBoards : Integer;
376-var
377- i, j, l : Integer;
378- bbs : TBBS;
379- Category: TCategory;
380- Board: TBoard;
381-begin
382- Result := 0;
383- // 掲示板の中の (続く)
384- for l := 0 to Length( BBSs ) - 1 do begin
385- bbs := BBSs[ l ];
386- for i := 0 to bbs.Count - 1 do begin
387- // カテゴリの中の (続く)
388- Category := bbs.Items[i];
389- for j := 0 to Category.Count - 1 do begin
390- // 板の中の (続く)
391- Board := Category.Items[j];
392- if Board.BoolData then begin
393- Inc(Result);
394- end;
395- end;
396- end;
397- end;
398-end;
399-//! 正規表現の検索にスレッドのログファイルを送る
400-procedure TSearchDialog.SearchLog(Reg: TGrep; Item: TThreadItem);
401-begin
402- // ログが存在するか確認
403- if (Item.IsLogFile) and (FileExists( Item.GetThreadFileName )) then begin
404- try
405- // 検索
406- // ※見つかったら OnMatch に飛ぶ
407- FRegItem := Item;
408- // GrepByRegの中でApplication.ProcessMessageが大量に呼ばれている
409- Reg.GrepByRegExp( Item.GetThreadFileName )
410- except
411- end;
412- if FCancel then raise Exception.Create('ログ検索を中止します');
413- end;
414-end;
415361 procedure TSearchDialog.BoardListViewDblClick(Sender: TObject);
416362 begin
417363
418364 If TObject( BoardListView.Selected.Data ) is TThreadItem Then
419365 GikoForm.InsertBrowserTab( TThreadItem(BoardListView.Selected.Data) );
420366
421- BringToFront;
422367 end;
423368
424369 procedure TSearchDialog.CancelBottonClick(Sender: TObject);
425370 begin
371+
372+ //Self.Close;
426373 TGrep(Sender).Cancel := true;
427374 FCancel := true;
375+
428376 end;
429377
430378 procedure TSearchDialog.BoardListViewResize(Sender: TObject);
@@ -434,24 +382,4 @@ begin
434382
435383 end;
436384
437-procedure TSearchDialog.FormDestroy(Sender: TObject);
438-begin
439- if (BoardListView <> nil) then begin
440- BoardListView.Clear;
441- end;
442- if (CategoryListView <> nil) then begin
443- CategoryListView.Clear;
444- end;
445-end;
446-
447-procedure TSearchDialog.FormCloseQuery(Sender: TObject;
448- var CanClose: Boolean);
449-begin
450- if (BoardsProgressBar.Visible) then begin
451- TGrep(Sender).Cancel := true;
452- FCancel := true;
453- Application.ProcessMessages;
454- end;
455-end;
456-
457385 end.
--- a/Setting.pas
+++ b/Setting.pas
@@ -411,7 +411,7 @@ type
411411 //スレ絞込みで未確定文字も有効にするか
412412 FUseUndecided: Boolean;
413413
414- //Be2ch
414+ //Be2ch
415415 //認証用ユーザID・パスワード
416416 FBeUserID: String;
417417 FBeCode: String;
@@ -430,9 +430,6 @@ type
430430 FInputAssistFormWidth: Integer;
431431 FInputAssistFormHeight: Integer;
432432
433- // Cookieに付加する固定コード
434- FFixedCookie: String;
435-
436433 function GetMainCoolSet(Index: Integer): TCoolSet;
437434 function GetBoardCoolSet(Index: Integer): TCoolSet;
438435 function GetBrowserCoolSet(Index: Integer): TCoolSet;
@@ -756,8 +753,6 @@ type
756753 //! InputAssistフォームのサイズ
757754 property InputAssistFormWidth: Integer read FInputAssistFormWidth write FInputAssistFormWidth;
758755 property InputAssistFormHeight: Integer read FInputAssistFormHeight write FInputAssistFormHeight;
759- //! Cookieに付加する固定コード
760- property FixedCookie: String read FFixedCookie write FFixedCookie;
761756
762757 end;
763758
@@ -794,7 +789,7 @@ const
794789 SPAMFILTER_FILE_NAME = 'SpamFilter.ini';
795790 LANGUAGE_FILE_NAME = 'language.ini';
796791 INPUTASSIST_FILE_NAME = 'InputAssist.ini';
797- FIXED_COOKIE = 'hana=mogera';
792+
798793
799794
800795 implementation
@@ -1378,9 +1373,6 @@ begin
13781373 FInputAssistFormWidth := ini.ReadInteger('IAtWindowsSize', 'Width', 400);
13791374 FInputAssistFormHeight := ini.ReadInteger('IAtWindowsSize', 'Height', 460);
13801375
1381- // Cookieに付加する固定コード
1382- FFixedCookie := ini.ReadString('Cookie', 'fixedString', FIXED_COOKIE);
1383-
13841376 ini.UpdateFile;
13851377 finally
13861378 ini.Free;
@@ -1749,8 +1741,6 @@ begin
17491741
17501742 //履歴の最大保存件数
17511743 ini.WriteInteger('Recode', 'Max', FMaxRecordCount);
1752- // 固定のCookie文字列
1753- ini.WriteString('Cookie', 'fixedString', FFixedCookie);
17541744
17551745 ini.UpdateFile;
17561746 finally
Binary files a/gikoNavi.res and b/gikoNavi.res differ
--- a/readme/InputAssist.default
+++ /dev/null
@@ -1,79 +0,0 @@
1-[キタ]
2-きた1=キタ Y⌒Y⌒Y⌒Y⌒Y⌒Y⌒(。A。)!!!
3-きた2=キタ*・゜゚・*:.。..。.:*・゜(゚∀゚)゚・*:.。. .。.:*・゜゚・*!!!!!
4-きたー1=キタ━(゚∀゚)━(∀゚ )━(゚  )━(  )━(  )━(  ゚)━( ゚∀)━(゚∀゚)━ !!
5-きたー2=キタ━━━━(゚∀゚)━━━━!!!!
6-きたー3=キタ━━━━(°Д°)━━━━!!!!
7-きたー4=キタ━━━━(Д゚(○&#61;(゚∀゚)&#61;○)Д゚)━━━━━!!!
8-きたー5=キタ━━━━━(゚(゚∀(゚∀゚(☆∀☆)゚∀゚)∀゚)゚)━━━━━!!
9-きたー6=キタ─wwヘ√レvv〜(゚∀゚)─wwヘ√レvv〜ー!!
10-きたー7=キタァァァ(゚∀゚)ァ( ゚∀)ァ( ゚)ァ( )ァ(` )ハァ(Д`)ハァ(;´Д`)ハァハァ
11-きたー8=キタキタキタキタ━━━(゚∀゚≡(゚∀゚≡゚∀゚)≡゚∀゚)━━━━!!
12-
13-[書き]
14-ぼけ=βοκε..._〆(゚▽゚*)
15-よろしく=∃ □ &#61;ノ 勹..._〆(゚▽゚*)
16-らぶ=ιονε..._〆(゚▽゚*)
17-わらた=ωαγατα..._〆(゚▽゚*)
18-終了=糸冬 了..._〆(゚▽゚*)
19-ばか=βακα..._〆(゚▽゚*)
20-なけた=ηακετα..._〆(T-T*)
21-ほしゅ=hο∫hμ..._〆(゚▽゚*)
22-かきかき=....〆(・ω・` )カキカキ
23-めもめも1=c⌒っ*゚ー゚)っφメモメモ....
24-めもめも2=φ(.. )メモメモ
25-
26-[ギコ猫]
27-ぎこ=      ∧∧  〜′ ̄ ̄(,,゚Д゚)   UU ̄U U
28-ぎこ後ろ=    ∧∧   (  ,,)   /  | 〜(__)
29-ぎこ座り=  ∧∧   (,,゚Д゚)  / つつ〜(__)
30-ぎこ立ち=  ∧∧  (,,゚Д゚)  ⊂  つ  〜  |   し`J
31-
32-[1行AA]
33-GJ=(*^ー゚)b グッジョブ!!
34-あはは=( ゚∀゚)アハハ八八ノヽノヽノヽノ \ / \/ \
35-あぼーん=αβοοη..._〆(゚▽゚*)
36-いい=(・∀・)イイ!!
37-いくない=(・A・)イクナイ!!
38-いってよし=( ゚Д゚)イッテヨシ
39-いやん=(/ω\)イヤン
40-いよう=(&#61;゚ω゚)ノ ぃょぅ!
41-いらね=(゚?゚)イラネ
42-うまー=(゚д゚)ウマー
43-がーん1=Σ (゚Д゚;)
44-がーん2=Σ(゚Д゚)ガーン
45-がーん3=Σ(゚д゚|||)ガーン
46-がーん4=ガ━━(゚Д゚;)━━ン!
47-がーん5=ガ━━━(゚Д゚;)━( ゚Д)━(  ゚)━(   )━(゚;  )━(Д゚; )━(゚Д゚;)━━━ン!!!!!
48-がくぶる1=(((( ;゚Д゚)))ガクガクブルブル
49-がくぶる2=(((((((( ;゚Д゚)))))))ガクガクブルブルガタガタブルガタガクガクガクガクガク
50-がくぶる3=((;゚Д゚)ガクガクブルブル
51-かもーん1=(屮゚Д゚)屮 カモーン
52-かもーん2=щ(゚Д゚щ)カモォォォン
53-きこえない=(∩ ゚д゚)アーアーきこえなーい
54-きにしない=(゚ε゚)キニシナイ!!
55-きにするな=(・з・)キニスルナ!
56-こない=コナ━━━━(゚A゚)━━━━イ !!!!!  
57-ごるぁ1=( ゚Д゚)ゴルァ
58-ごるぁ2=(#゚Д゚) ゴルァ!!
59-しゃきーん=(`・ω・´) シャキーン
60-しょぼーん=(´・ω・`)ショボーン
61-たーん=;y&#61;ー( ゚д゚)・∵. ターン
62-たいほ1=タイ━━━━||Φ|(|゚|∀|゚|)|Φ||━━━━ホ!!!
63-たいほ3=タイ━━━━||Φ|(|´|Д|`|)|Φ||━━━━ホ
64-たりー=⊂⌒~⊃。Д。)⊃ タリー
65-はぁ=(゚Д゚)ハァ?
66-はあはあ1=(;´Д`)l \ァ l \ァ
67-はあはあ2=(;´Д`)ハァハァ
68-ひぃ1=(lll゚Д゚)ヒィィィィ
69-ひぃ2=Σ(||゚Д゚)ヒィィィィ
70-びし=m9(・∀・)ビシッ!!
71-ぷ=( ´,_ゝ`)プッ
72-ふーん=( ´_ゝ`)フーン
73-ぷぎゃー=m9(^Д^)プギャーーーッ
74-ぺ=( ゚д゚)、ペッ
75-ぽかーん=( ゚д゚)ポカーン
76-ほしい=( ゚Д゚)ホスィ
77-まずー=(゚д゚)マズー
78-まだ=マダァ-? (・∀・ )っ/凵⌒☆チンチン
79-もうだめぽ=(´Д⊂ モウダメポ
--- a/readme/readme.txt
+++ b/readme/readme.txt
@@ -50,7 +50,7 @@
5050 ------------------------------
5151 バグや要望は、ギコナビスレッドで受け付けております。
5252 ギコナビサイト:http://gikonavi.sourceforge.jp/
53-ギコナビスレ:http://pc7.2ch.net/test/read.cgi/software/1148818605/l50
53+ギコナビスレ:http://pc8.2ch.net/test/read.cgi/software/1121516093/l50
5454
5555 ------------------------------
5656 転載について
@@ -113,7 +113,6 @@ LICENSE
113113  スレッド一覧に”勢い”カラム追加(デフォルト非表示)
114114  お気に入り、履歴、送信ログのスレッドタイトル名をサニタイズするように修正
115115 (ノートンの誤反応問題への部分的対応)
116- 2ちゃんねるのCookieの仕様変更に対応
117116
118117 2006/01/14
119118 Version バタ51
--- a/readme/setup.INF
+++ b/readme/setup.INF
@@ -90,7 +90,7 @@ Folder=gikoNavi
9090 87=config\Board\ギコナビ.txt
9191 88=Samba.default
9292 89=config\language.ini
93-90=config\InputAssist.default
93+90=config\InputAssist.ini
9494
9595 [Group]
9696 1=ギコナビ,gikoNavi.exe
--- a/res/skin/skin30-2G/Header.html
+++ b/res/skin/skin30-2G/Header.html
@@ -16,7 +16,7 @@
1616 var start_time = new Date();
1717 //==========グローバル変数
1818 var anchorHead="";
19-var skinName="skin30-2 v3.6.1231";
19+var skinName="skin30-2 v3.5.0704";
2020 var browser="ギコナビ";
2121 //==========ギコナビ用アンカーの判定(0:処理無し,1:ポップアップ,2:ボタン挿入)
2222 // ギコナビでは、レスアンカーは相対アドレスで記述される
@@ -48,16 +48,6 @@ function threadurl(){
4848 t_bbs=RegExp.$1;
4949 t_key=RegExp.$2;
5050 }
51-//==========非表示レスの表示-ギコナビのみ
52-function hiddenRes(e){
53- var number=tohan(event.srcElement.innerText.replace(/>|>/g,""));
54- var i=0;while(document.anchors[i].name.match(/\D/)){i++}
55- var startRes=parseInt(document.anchors[i+1].name.replace(/\D/g,""));
56- if(number.match(/(\d*)\D+(\d*)/)){var start=parseInt(RegExp.$1);}
57- else {var start=parseInt(number);}
58- //alert(startRes+">"+start+" && "+start+"!="+1);
59- if(startRes>start && start!=1){return true}else{return false}
60-}
6151 </script>
6252 </head>
6353 <body>
--- a/res/skin/skin30-2G/chie_base.css
+++ b/res/skin/skin30-2G/chie_base.css
@@ -7,11 +7,8 @@ dt a{text-decoration:none;}
77 dd a{text-decoration:underline;line-height:1.1}
88
99 /* 検索結果 */
10-#foundPanel{color:LightSlateGray;}
11-#foundPanel div {font-family:"MS ゴシック";}
12-#foundPanel div span{font-family:Times;cursor:hand;}
13-#foundPanel a {color:LightSlateGray;}
14-#foundPanel a:hover{color:#000;}
10+#foundResult a {color:LightSlateGray;}
11+#foundResult a:hover{color:#000;}
1512
1613 /* dt */
1714 dt{
--- a/res/skin/skin30-2G/chie_event.js
+++ b/res/skin/skin30-2G/chie_event.js
@@ -1,22 +1,18 @@
1-//========新着ジャンプ設定
2-var buffer=1; // 低速回線や低速マシンの場合にはbufferの数値を増やすとより正確にジャンプ(1増やすと0.1秒遅れる)
3-var newResJump=1; // 新着レスジャンプ(0:ブラウザ任せ、1:読了時のみ、2:常時)*かちゅ、OpenJane、twintailのみの設定
4-//==========以下はスクリプト本文ですよ。
51 //イベントハンドラ定義
62 //外部関数:tohan
73 //外部変数:anchorHead,lightmode,getID,skinName,browser,dts
8-//=========外部ファイル共用のグローバル変数
9-var waited=false;//command表示後trueにし、選択後にfalseにする。
10-var viewed=false;//thumb読込み後trueにし、thumbPanelに乗降後falseにする。
11-var searched=false; //検索後に、trueにし、foundPanelに乗降後falseにする。
12-var cp,tp,vp,fp;
4+//グローバル変数
5+var buffer=1; // 低速回線や低速マシンの場合にはbufferの数値を増やすとより正確にジャンプ(1増やすと0.1秒遅れる)
6+var newResJump=1; // 新着レスジャンプ(0:ブラウザ任せ、1:読了時のみ、2:常時)*かちゅ、OpenJane、twintailのみの設定
137 //========Click処理→search,他
148 document.onclick = clickEvent;
159 function clickEvent(){
1610 if(clickCancel){return false}else{clearTimeout(clickTimer);if(document.getElementById("context")){document.getElementById("context").removeNode(true);}}
1711 var obj=window.event.srcElement;
1812 var tag=obj.tagName;
19- if(tag=="B"||tag=="U"||tag=="SPAN"){searchPerson(obj)} //名前,トリップ,ID
13+ if (tag=="B") {search(obj.parentElement)} //名前
14+ else if(tag=="U") {search(obj)} //トリップ
15+ else if(tag=="SPAN"){if(getID(obj)){searchID(obj)}} //ID
2016 else if(tag=="DT") {searchRef(obj)}
2117 else if(tag=="DD") {defaultPopup()}
2218 else if(tag=="A"){
@@ -27,7 +23,7 @@ function clickEvent(){
2723 if(obj.href.match(/^http:.*#/)){window.open(obj.href,"_parent");return false}
2824 }
2925 //A Bone補正(非表示レスの表示)
30- if((browser=="A Bone"||browser=="ギコナビ") && hiddenRes(obj)){showModelessDialog(document.getElementsByName("ThreadURL")[0].content.replace(/\/l50$/,"/")+tohan(obj.innerText.replace(/[>>]/g,"")),window,"dialogWidth:"+document.body.clientWidth+"px;help:no;resizable:yes;status:no;unadorned:yes;");window.focus();}
26+ if(browser=="A Bone" && hidedRes(obj)){showModelessDialog(document.getElementsByName("ThreadURL")[0].content+tohan(obj.innerText.replace(/[>>]/g,"")),window,"dialogWidth:"+document.body.clientWidth+"px;help:no;resizable:yes;status:no;unadorned:yes;");window.focus();}
3127 //Jane,Live,ギコナビ補正(skin30-2Normal及びギコナビ)*レスジャンプがscrollIntoViewでないものに係る補正
3228 if(browser=="A Bone" || browser=="OpenJane" || browser=="Live2ch" || browser=="ギコナビ"){if(obj.href.match(/^about|jumpres/)){
3329 var h=tohan(obj.innerText.replace(/[>>]/g,""));
@@ -36,17 +32,17 @@ function clickEvent(){
3632 }}
3733 return true;
3834 }
39- else{panelOver();return}
35+ else{return}
4036 }
4137
4238 //=========MouseOver処理→image,popup
4339 document.onmouseover = mouseOverEvent;
4440 function mouseOverEvent() {
4541 var e = window.event.srcElement;
46- if(e.tagName=='B'){if(browser!="twintail2"){
42+ if(e.tagName=='B'){
4743 if(e.innerText.match(/^([^\d0-9]*)([\d0-9]+)([^\d0-9]*.*)/)){namePopup(e,RegExp.$1,RegExp.$2,RegExp.$3);}
4844 else if(e.innerText.match(/^あぼ〜ん$/)) {abonePopup(e);}
49- }}
45+ }
5046 if(e.tagName=='A'){
5147 if(!e.innerText.match(/%/)){ // URLエンコードでありがちな%がなければ
5248 //e.href=e.href.replace(/>/g,"");
@@ -59,8 +55,9 @@ function mouseOverEvent() {
5955 }
6056 }
6157 if (checkAnchor(e.href)==2){insButton(e);return;}
62- else if(checkAnchor(e.href)==1){ // 多段ポップアップ
58+ else if(checkAnchor(e.href)==1){
6359 if(event.shiftKey){if(e.rel){e.href=e.rel}return}
60+ // 多段ポップアップ
6461 var parent=e.parentElement;
6562 var aNum= (parent.tagName!="DD") ? parent.firstChild.sourceIndex : parent.previousSibling.firstChild.innerText;
6663 if(!document.getElementById("p"+aNum)){
@@ -69,48 +66,49 @@ function mouseOverEvent() {
6966 if(!onPopup){removePopup()}
7067 makePopContent(e);return;
7168 }
72- }else if(checkAnchor(e.href)==0){ // 逆参照ポップアップ
73- if(e.href.match(/menu:/) && event.shiftKey){searchPopup(e)}
7469 }
75- }else if(e.tagName=="SPAN"||e.tagName=="TT"){
76- var obj=e;var onPopup;
77- while(obj.tagName!="BODY"){if(obj.id.match(/p\d+/)){onPopup=true;break}else{obj=obj.parentElement}}
78- if(e.tagName=="SPAN"){
79- if(!onPopup && event.shiftKey){searchPopup(e)}
80- }else{searchPopup(e)}
8170 }else{ // 多段ポップアップ消去
8271 var obj=e;var onPopup;
8372 if(obj.sourceIndex<0){obj=document.body;if(document.getElementById("popupBase")){onPopup=true;}} // namePopupとの競合でノードが外れる瞬間の回避
84- while(obj.tagName!="BODY"){if(obj.id.match(/(p\d+)/)){onPopup=true;break}else{obj=obj.parentElement;}}
73+ while(obj.tagName!="BODY"){if(obj.id.match(/p\d+/)){onPopup=true;break}else{obj=obj.parentElement;}}
8574 if(onPopup){while(obj.id!=obj.parentElement.lastChild.id){obj.parentElement.lastChild.removeNode(true)}}
8675 else {removePopup()}
8776 }
77+ if(e.tagName=="DT"){setHash();}
78+ if(e.tagName=="SPAN"){
79+ var obj=e;var onPopup;
80+ while(obj.tagName!="BODY"){if(obj.id.match(/p\d+/)){onPopup=true;break}else{obj=obj.parentElement}}
81+ if(!onPopup && event.shiftKey){searchPopup(event.toElement);} return;
82+ }
8883 }
89-//=========MouseMove処理→panelOver()
84+//=========MouseMove処理→menuOver(),tpOver()
9085 document.onmousemove=mouseMoveEvent;
86+var waited=false;//command表示後trueにし、選択後にfalseにする。
87+var viewed=false;//thumb読込み後trueにし、thumbPanelに乗降後falseにする。
88+var cp,tp,vp;
9189 function mouseMoveEvent() {
9290 if(!cp){
93- var nHTML ='<div id="controlPanel"><input type="button" value="TOP" onclick="scroll_Top();blur()"><input type="button" value="END" onclick="scroll_End();blur()"><input type="button" value="IMG" onmouseup="imgCommand();blur()"><input type="button" value="FND" onclick="fndCommand();blur();"></div><div id="foundPanel" onmouseout="searched=false"></div>';
94- if(skinName.match(/30-2/)){nHTML+='<div id="thumbPanel" onmouseout="viewed=false"></div><div id="viewPanel"></div>';}
95- document.body.insertAdjacentHTML("afterBegin",nHTML);
96- cp=document.getElementById("controlPanel");fp=document.getElementById("foundPanel");
97- if(skinName.match(/30-2/)){tp=document.getElementById("thumbPanel");vp=document.getElementById("viewPanel");}else{tp=vp=new Object()}
98- cp.condition="waited";tp.condition="vp.firstChild || viewed || !lightmode";fp.condition=resultView ? "fp.hasChildNodes()" : "searched";
99- cp.territory="<25"; tp.territory=">20"; fp.territory="<(30+fp.clientHeight) && fp.hasChildNodes()";
91+ var nHTML ="<div id='controlPanel'><input type='button' value='TOP' onclick='scroll_Top();blur()'><input type='button' value='END' onclick='scroll_End();blur()'><input type='button' value='IMG' onmouseup='imgCommand();blur()'><input type='button' value='FND' onclick='findIt(document.selection.createRange().text);blur()'></div>";
92+ if(skinName.match(/30-2/)){nHTML+="<div id='thumbPanel' onmouseout='viewed=false'></div><div id='viewPanel'></div>";}
93+ document.body.insertAdjacentHTML('afterBegin',nHTML);
94+ cp=document.getElementById("controlPanel");
95+ if(skinName.match(/30-2/)){tp=document.getElementById("thumbPanel");vp=document.getElementById("viewPanel");}
10096 }
101- if(event){panelOver();}
102- if(!idHash.length){setHash();searchColoring();}
97+ cpOver();
98+ tpOver();
10399 }
104-// 各パネル
105-function panelOver(){
100+// コントロールパネル
101+function cpOver(){
106102 var territoryW=document.body.clientWidth-120;var territoryH=25;
107- var panels=new Array("cp","tp","fp");
108- for(var i in panels){
109- if(skinName.match(/30-3/)&&panels[i]=="tp"){continue}
110- var panel=eval(panels[i]); var territoryY=eval("event.y"+panel.territory); var territoryX=eval(event.x>document.body.clientWidth-panel.offsetWidth-15);
111- if(eval(panel.condition)){panel.style.visibility="visible";return}
112- if(territoryY && territoryX){panel.style.visibility="visible";}else{panel.style.visibility="hidden";}
113- }
103+ if(waited){cp.style.visibility="visible";return}
104+ if(event.y<territoryH && event.x>territoryW){cp.style.visibility="visible";}else{cp.style.visibility="hidden";}
105+}
106+// サムネイルパネル
107+function tpOver(){
108+ if(skinName.match(/30-3/) || !lightmode){return}
109+ var territoryW=document.body.clientWidth-120;var territoryH=20;
110+ if(document.getElementById("viewPanel").firstChild || viewed){tp.style.visibility="visible";return}
111+ if(event.y>territoryH && event.x>territoryW){tp.style.visibility="visible";}else{tp.style.visibility="hidden";}
114112 }
115113 // TOP,END
116114 function scroll_Top(){document.getElementsByTagName("DL")[0].firstChild.scrollIntoView(true);}
@@ -129,14 +127,6 @@ function imgCommand(mode,s){
129127 clearCommand();
130128 }
131129 }
132-function fndCommand(mode,s){
133- if(!waited){
134- findIt(document.selection.createRange().text);
135- event.cancelBubble=true;
136- }else{
137- clearCommand();
138- }
139-}
140130 function clearCommand(){
141131 waited=false;
142132 document.getElementById("command").removeNode(true);
@@ -184,7 +174,7 @@ function key(){
184174 else if(code=="36"){scroll_Top()}
185175 else if(code=="35"){scroll_End()}
186176 else if(code=="73" && event.shiftKey){changePanel();return false;} // shift+I
187- else if(code=="70" && event.shiftKey){findIt(document.selection.createRange().text);return false;} // shift+F
177+ else if(code=="70" && event.shiftKey){cp.childNodes[3].click();return false;} // shift+F
188178 else if(code=="78" && event.shiftKey && firstNew){firstNew.scrollIntoView(true)} // shift+N
189179 else if(code=="82" && event.shiftKey && event.ctrlKey){ // ctrl+shift+R
190180 //かちゅ〜しゃ補正(板更新のショートカットキー)
@@ -200,7 +190,7 @@ function key(){
200190 //=========かちゅ、ABone、ゾヌ2
201191 var newResNum=parseInt(document.getElementsByName("GetRescount")[0].content)+1;
202192 var k=0;
203-function loadEvent(num){
193+function loadEvent(num){ //setTimeout("setHash();",100);
204194 //====新着レスジャンプ
205195 if(newResJump==0){clearInterval(timerID);return} //「ブラウザ任せ」なら終了
206196 //新着レスの開始番号を取得
@@ -219,7 +209,7 @@ function loadEvent(num){
219209 //=========新着レス取得後処理(標準スキン対応ブラウザ用)←NewMarkから呼び出し
220210 //=========OpenJ、twin
221211 var scr,viewPos,endPos=0;
222-function reloadEvent(){
212+function reloadEvent(){ //setTimeout("setHash();",100);
223213 //====既読化
224214 var lastDt=dts[dts.length-2];if(!lastDt){return}// 全部新着なら終了
225215 while(lastDt && lastDt.className=="new"){lastDt.className="";lastDt=lastDt.previousSibling.previousSibling;}
@@ -252,10 +242,10 @@ function defaultPopup(){
252242 obj.innerText=num;
253243 obj.href="#"+hnum;
254244 makePopContent(obj);
255- }else if(num.match(/\w{8,9}/)){ //\w{8}ではだめぽ?
256- var obj=document.createElement("DT");
257- obj.innerHTML="<span>date time ID:"+num+"</span>";
258- searchPerson(obj.firstChild);
245+ }else if(num.match(/\w/) && num.length==8){ //\w{8}ではだめぽ?
246+ var obj=document.createElement("span");
247+ obj.innerText="date time ID:"+num;
248+ setHash();searchID(obj);
259249 }
260250 }
261251
@@ -270,14 +260,5 @@ function copyEvent(){
270260 copyText.execCommand("Copy");
271261 return false;
272262 }
273-//=========onScroll処理
274-//window.onscroll=function(){clearInterval(beforeScrollTimer);onLoadEvent()}
275-window.onscroll=function(){onLoadEvent()}
276-if(document.getElementById("dl")){
277- document.getElementById("dl").onscroll=function(){onLoadEvent()}
278-}
279-//=========onLoad処理
280-window.onload=onLoadEvent;
281-function onLoadEvent(){mouseMoveEvent();setHash();searchColoring();}
282-setTimeout("onLoadEvent()",1000); // 一回だけ着色
283-
263+//=========onLoad処理(DAT2HTMLのみ)
264+window.onload=function(){setHash()}
--- a/res/skin/skin30-2G/chie_image.css
+++ b/res/skin/skin30-2G/chie_image.css
@@ -18,7 +18,7 @@ input,button{
1818 }
1919 #thumbPanel div{
2020 width:100px;
21- margin-bottom:0px;
21+ margin-bottom:2px;
2222 border:solid 1px #D6DCE1;
2323 background-color:#FFF;
2424 text-align:right;
--- a/res/skin/skin30-2G/chie_image.js
+++ b/res/skin/skin30-2G/chie_image.js
@@ -1,11 +1,9 @@
1-//======画像読込の設定
2-var onOpenLoad =1; // スレ読込時の画像読込 0:読み込まない、1:新着レスのみ、2:全部
3-var onMouseLoad=true; // true:カーソルを合わせただけ、false:LOADボタンをクリックしてから
4-var takeArisk=false; // true:画像読み込み時にモード切替、false:手動でモード切替
5-//==========以下はスクリプト本文ですよ。
61 // イベントハンドラ:onMouseover
72 // 外部関数:addAnchor
83 // 外部変数:cp,tp,vp,dds
4+//======画像読込の設定
5+var onMouseLoad=true; // true:カーソルを合わせただけ、false:LOADボタンをクリックしてから
6+var takeArisk=false; // true:画像読み込み時にモード切替、false:手動でモード切替
97 //==========グローバル変数
108 //==========画像処理等
119 var lightmode = true;
@@ -58,22 +56,14 @@ function insButton(a,hRH) {
5856 var nHTML='<input type="button" value="LOAD" onClick=\'loadImage(this,"'+a.href+'");blur()\'>'
5957 +'<input type="button" value="VIEW" onClick=\'changeView("swf","'+a.href+'");blur()\'>';
6058 }else{
61- var ahref=(hRH)?hRH:a.href;
59+ if(hRH){var ahref=hRH}else{var ahref=a.href}
6260 if(ahref.match(/^javascript:.*'(.*)'.*/)){ahref=RegExp.$1+document.getElementsByName("ThreadURL")[0].content;a.href=ahref}
6361 var nHTML='<input type="button" value="VIEW" onClick=\'changeView("html","'+ahref+'");blur()\'>'
64- +'<input type="button" value="CHECK" onClick=\'changeView("html","http://so.7walker.net/?site='+ahref+'");blur()\'>';
62+ ;//+'<input type="button" value="CHECK" onClick=\'changeView("html","http://www.tekijuku.com/URL/?url='+ahref+'");blur()\'>';
6563 }
6664 a.insertAdjacentHTML('AfterEnd',nHTML);
6765 a.className = 'replaced';
68- if(imageExt2(a.href)){
69- if(!event||event.type=="mousemove"||event.type=="scroll"){ // autoImageLoadでの読込
70- if(onOpenLoad){loadImage(a.nextSibling,a.href)}
71- }else if(event.type=="mouseover"){ // mouseoverでの読込
72- if(onMouseLoad){loadImage(a.nextSibling,a.href)}
73- }else if(event.type=="click"){ // allImageloadでの読込
74- loadImage(a.nextSibling,a.href);
75- }
76- }
66+ if(onMouseLoad && imageExt2(a.href)){loadImage(a.nextSibling,a.href)}
7767 return;
7868 }
7969 }
@@ -81,19 +71,19 @@ function insButton(a,hRH) {
8171 function loadImage(btn,href){
8272 if(!panel){changePanel()}
8373 if(takeArisk && lightmode){changeMode()}
84- // 同一画像確認
85- var thumbs = document.images;
86- var l=thumbs.length;
87- for(var i=l;i--;){if(thumbs[i].src==href){
88- if(lightmode){tp.style.visibility="visible";viewed=true;}
89- //thumbs[i].scrollIntoView(true);
90- imgOver(thumbs[i],100);
91- return true;
92- }}
74+ if(btn.tagName!="A"){
75+ var thumbs = document.images;
76+ var l=thumbs.length;
77+ for(var i=l;i--;){if(thumbs[i].src==href){
78+ if(lightmode){tp.style.visibility="visible";viewed=true;}
79+ //thumbs[i].scrollIntoView(true);
80+ imgOver(thumbs[i],100);
81+ return true;
82+ }}
83+ }
9384 if(btn.parentElement.tagName=="DD"){var dt = btn.parentElement.previousSibling;}
9485 else {var dt = btn.parentElement;}
9586 var num = dt.firstChild.innerText;
96- if(href.match(/www.securityfocus.com/)){if(!confirm(num+"のレスにあるhttp://www.securityfocus.com/の画像はブラクラの可能性が高いですが、開きますか?")){return}}
9787 if(href.search(/\.swf/i)==-1){
9888 var nHTML = '<div><img src="'+href+'" onLoad="imgResult(this)" onError="imgResult(this)" onClick="changeView(\'img\')" onmouseover="imgOver(this,100)" onmouseout="imgOver(this,30)">'
9989 +addAnchor(num,num)+' '
@@ -116,14 +106,7 @@ function loadImage(btn,href){
116106 function imgResult(img){
117107 var btn=img.parentElement.children.item(2);
118108 if(event.type=="load"){btn.value='___'; img.style.display='block';}
119- else {btn.value='NONE';btn.style.color='#C00';}
120- if(event.type=="error"){
121- var dt=getDTfromAnc(img.parentElement.children.item(1).innerText);
122- var ddAnc=dt.nextSibling.getElementsByTagName("A");
123- var a;var i=0;do{a=ddAnc[i];i++;}while(a.href!=img.href);
124- var btn=a.nextSibling;
125- btn.value='NONE';btn.style.color='#C00';
126- }
109+ else {btn.value='NONE';btn.style.color='#C00';setTimeout("viewed=false",3000)}
127110 }
128111 // サイズの切替
129112 function changeSize(btn){
@@ -204,10 +187,12 @@ function allImageLoad(mode){
204187 var ddl=dds.length;var exist;
205188 for(var i=0;i<ddl;i++){
206189 if(mode=="new"){if(dds[i].previousSibling.className!="new"){continue}}
207- var ddAnc=dds[i].getElementsByTagName("A");
208- for(j=0;j<ddAnc.length;j++){
209- cn=ddAnc[j];
210- if(imageExt2(cn.href)){insButton(cn,cn.href);exist=true}
190+ cl=dds[i].childNodes.length;
191+ for(j=0;j<cl;j++){
192+ cn=dds[i].childNodes[j];
193+ if(cn.tagName == "A"){
194+ if(imageExt2(cn.href)){loadImage(cn,cn.href);exist=true}
195+ }
211196 }
212197 }
213198 if(!exist){
--- a/res/skin/skin30-2G/chie_popup.js
+++ b/res/skin/skin30-2G/chie_popup.js
@@ -1,6 +1,4 @@
1-//==========以下はスクリプト本文ですよ。
21 // イベントハンドラ:onMouseover
3-// 外部変数:idHash,refHash,foudRes,highlight
42 // 外部関数:addAnchor,getDTfromAnc
53 // 特徴:DIV#popupBase下に「フラットでリニア」にDL#p\dを作成する。
64 //==========CSSの出力
@@ -11,65 +9,65 @@ nCSS+='#popupBase dl{position:absolute; background-color:window; border:outset 1
119 nCSS+='#popupBase dt span{float:none; margin-left:1em;}';
1210 nCSS+='#popupBase dd{margin:auto 1em}';
1311 document.write('<style type="text/css">'+nCSS+'</style>\n');
14-//=========外部ファイル共用のグローバル変数
12+//=========グローバル変数
13+var pb;
1514 //=========ナンバーな名前のポップアップ
1615 function namePopup(e,before,num,after){
1716 var hnum=tohan(num);
18- if(hnum==774 || hnum==21 || hnum==1 || hnum==30){return} // Socket774、774KB、21禁、[1-30]、などは無視
19- if(before && before.match(/名無/)){return} //名無しっぽいのは無視
20- if(after) {if(after=="周年"){return}} // デフォルトな"n周年"は無視
17+ //3周年、4周年、Socket774、774KB、21禁、[1-30]、などは無視
18+ if(before){if(hnum==5 || hnum==774 || hnum==4 || hnum==21 || hnum==1 || hnum==30){return}}
2119 var nB = before ? "<b>"+before+"</b><b>":"<b>"; nB+=addAnchor(hnum,num); nB+=after ? "</b><b>"+after+"</b>":"</b>";
2220 e.outerHTML=nB;
2321 }
2422 //=========弱あぼ〜んのポップアップ
25-function abonePopup(e){e.outerHTML = "<b>"+addAnchor(e.parentElement.previousSibling.innerText,'あぼ〜ん')+"</b>";}
26-//=========検索したレスのポップアップ
27-function searchPopup(obj){
28- var reg,cArray;var tag=obj.tagName;
29- /*ref Popup*/if (tag=="A") {if(refHash[obj.innerText]){cArray=refHash[obj.innerText].split(" ")}else{return}}
30- /*ID Popup*/ else if(tag=="SPAN"){reg=getID(obj);if(reg&&reg.length>3){cArray=idHash[reg].split(" ");}else{return} if(cArray.length==1){return}}
31- /*検索Popup*/else if(tag=="TT") {var cHash=(obj.parentElement.rel=="res")?foundRes:highlight;cArray=cHash[obj.parentElement.firstChild.style.backgroundColor];if(!cArray){return}}
32- var targetString=""; for(var i=0;i<cArray.length;i++){targetString+=returnString(cArray[i]);} //中身の切り出し
33- if(targetString){popup(targetString);} //対象が存在したらポップアップ
23+function abonePopup(e){
24+ var hnum=e.parentElement.previousSibling.innerText;
25+ e.outerHTML = "<b>"+addAnchor(hnum,'あぼ〜ん')+"</b>";
3426 }
3527 //=========多段ポップアップ
3628 //・ポップアップの作成
29+var startRes;
3730 function makePopContent(obj){
3831 //事前準備
39- var num=obj.innerText.replace(/[>>]/g,""); var number=tohan(num);
40- if(!obj.rel){obj.rel=obj.href;} obj.href="decoy:"; // ブラウザ本体のポップアップ回避
41- //番号調査
32+ var num=obj.innerText.replace(/[>>]/g,"");
33+ var number=tohan(num);
34+ if(!obj.rel){obj.rel=obj.href;}
35+ obj.href="decoy:";
36+ //調査
37+ if(document.anchors.length==1){return} //レス数が1なら終了
38+ if(!startRes){startRes=parseInt(document.anchors[1].name.replace(/\D/g,""))}
4239 if(number.match(/(\d*)\D+(\d*)/)){var start=parseInt(RegExp.$1); var end=parseInt(RegExp.$2);}
4340 else {var start=end=parseInt(number);}
44- if(end-start>100){end=start+100} // 100以上表示しない
41+// alert(startRes+">"+end+" && "+end+"!=1")
42+ if(startRes>end && end!=1){obj.href=obj.rel;return}//存在していなければ終了
4543 //中身の切り出し
46- var targetString=""; for(var i=0;i<=end-start;i++){targetString+=returnString(start+i)}
44+ var targetString=""; if(end-start>100){end=start+100}
45+ if(start==end){targetString=returnString(start)}
46+ else {for(var i=0;i<=end-start;i++){targetString+=returnString(start+i)}}
4747 //対象が存在したらrelに退避してポップアップ
4848 if(targetString){popup(targetString);}else{obj.href=obj.rel;}
4949 }
5050 //・中身の切り出し
5151 function returnString(num){
5252 var obj=getDTfromAnc(num);
53- setSearchColor(obj);//ポップアップ先の着色
5453 if(!obj){return("")} //対象が透明あぼ〜んなら終了
55- var dt=obj.cloneNode(true);
56- var dtOuter=dt.outerHTML.replace(/name=.*?>/,">"); // LABELNUMBER対応のものに係るリンクアンカーの除去
57- var dd=obj.nextSibling.cloneNode(true);
54+ var dt,dd,dtOuter,ddOuter;
55+ dt=obj.cloneNode(true);
56+ dtOuter=dt.outerHTML.replace(/name=.*?>/,">"); // LABELNUMBER対応のものに係るリンクアンカーの除去
57+ dd=obj.nextSibling.cloneNode(true);
5858 if(dd.hasChildNodes()){
5959 while(dd.lastChild.name){dd.lastChild.removeNode(true)} // LABELNUMBER非対応のものに係るリンクアンカーの除去
6060 if(dd.lastChild.tagName=="DL"){dd.lastChild.removeNode(true)} // 逆参照の除去
6161 }
62- var ddOuter=dd.outerHTML;
62+ ddOuter=dd.outerHTML;
6363 return(dtOuter+ddOuter);
6464 }
6565 //・ポップアップ
66-var pb;
6766 function popup(inner){
6867 if(!pb){document.body.insertAdjacentHTML('afterBegin','<div id="popupBase"></div>');pb=document.getElementById("popupBase")}
6968 //要素の作成
7069 var parent=event.srcElement.parentElement;
71- //var aNum= (parent.tagName!="DD") ? parent.firstChild.sourceIndex : parent.previousSibling.firstChild.innerText; // DD以外=名前欄、画像、ID検索
72- var aNum=event.srcElement.sourceIndex;if(!aNum){alert("aNum取得エラー")}
70+ var aNum= (parent.tagName!="DD") ? parent.firstChild.sourceIndex : parent.previousSibling.firstChild.innerText; // DD以外=名前欄、画像、ID検索
7371 if(document.getElementById('p'+aNum)){return} // ポップアップしてたら終了
7472 pb.insertAdjacentHTML("beforeEnd",'<dl id="p'+aNum+'">'+inner+'</dl>');
7573 //要素の配置
@@ -77,16 +75,16 @@ function popup(inner){
7775 // y軸調整
7876 var pos=Math.min(event.y,document.body.clientHeight-event.y);
7977 var scTop=document.body.scrollTop+event.y;
80- if(pos==event.y){var y=scTop-30;} // カーソルの下へ表示
81- else {var y=scTop+10-p.clientHeight;} // カーソルの上へ表示
78+ if(pos==event.y){var y=scTop-30;} // 下
79+ else {var y=scTop+10-p.clientHeight;} // 上
8280 if(y<0){y=0}
83- if(event.srcElement.parentElement.tagName=="TT"){y+=35;}
81+ if(event.srcElement.parentElement.id=="foundResult"){y+=30}
8482 p.style.pixelTop=y;
8583 // x軸調整
8684 var pos=Math.min(event.x,document.body.clientWidth-event.x);
8785 var scLeft=document.body.scrollLeft+event.x;
88- if(pos==event.x){var x=scLeft-2} // カーソルの右へ表示
89- else {var x=scLeft-4-p.clientWidth;} // カーソルの左へ表示
86+ if(pos==event.x){var x=scLeft-2} // 右
87+ else {var x=scLeft-4-p.clientWidth;} // 左
9088 if(x<0){x=0}
9189 p.style.pixelLeft=x;
9290 // 高さ調整(scrollBarを要す場合と要しない場合がある)→y軸調整
--- a/res/skin/skin30-2G/chie_search.js
+++ b/res/skin/skin30-2G/chie_search.js
@@ -1,398 +1,243 @@
1-beID=false; // beにログイン出来る場合は、true
2-//==========検索設定
3-var expression="multiAND"; // 検索方法  default:標準、regExp:正規表現、multiAnd:AND検索、multiOR:OR検索
4-var searchView="resList"; // 検索結果表示  resList:該当レス番号表示、resPopup:該当レスポップアップ、
5-var resultView=false; // 検索結果の常時表示  true:常時表示、false:マウスで近づけたときのみ表示
6-var listLimit =10; // searchViewがresPopupでない場合の、レス番号の表示制限
7-//==========レス番号、日付文字列の着色設定
8-coloring=1; // 着色する:1 着色しない:0
9-threshold1=[2,"#0000ff"]; // 書き込みが複数あるID のしきい値と色
10-threshold2=[5,"#aaaa00"]; // 書き込みが多数あるID のしきい値と色
11-threshold3=[8,"#ff0000"]; // 書き込みが多数あるID のしきい値と色
12-threshold4=[1,"#0000FF"]; // 書き込みがある レス のしきい値とレス番号の色
13-threshold5=[4,"#aaaa00"]; // 書き込みが多数あるレス のしきい値とレス番号の色
14-threshold6=[7,"#ff0000"]; // 書き込みが多数あるレス のしきい値とレス番号の色
15-//==========名前・ID検索によるレスの帯の色指定(16進数又はWeb形式の色名で指定。いくつでも可。アルファベットは小文字でお願い)
16-var foundResColor =new Array("#ffdfee","#eeffdf","#ffeedf","#dfffee","#eedfff","#ffffe1");
17-//==========単語検索によるハイライト色指定(同上)
18-var highlightColor=new Array("#ffff66","#a0ffff","#99ff99","#ff9999","#ff66ff","#880000","#00aa00","#886800","#004699","#990099");
19-//==========以下はスクリプト本文ですよ。
20-// イベントハンドラ:onClick,onScroll,onMousemove
21-// 外部関数:addAnchor,checkAnchor,tohan,searchPopup
22-// 外部変数:anchorHead,browser,fp
23-// 逆参照の特徴:イベント発生DTに対応するDD下に、DL-DT-DD構造を作成する。
1+// 日付文字列の着色設定 着色する:1 着色しない:0
2+coloring=1;
3+threshold1=[2,"#0000FF"]; // 書き込みが複数あるID のしきい値と色
4+threshold2=[5,"#FF0000"]; // 書き込みが多数あるID のしきい値と色
5+threshold3=[1,"#0000FF"]; // 書き込みがある レス のしきい値とレス番号の色
6+threshold4=[4,"#FF0000"]; // 書き込みが多数あるレス のしきい値とレス番号の色
7+// イベントハンドラ:onClick
8+// 外部関数:addAnchor,checkAnchor,tohan
9+// 外部変数:anchorHead,browser
10+// 特徴:イベント発生DTに対応するDD下に、DL-DT-DD構造を作成する。
2411 //==========CSSの出力
2512 var nCSS='';
26-nCSS+='#foundPanel {position:absolute;top:expression(body.scrollTop+25);right:18px;padding:2px 5px;z-index:6;background-color:white;border:1px solid #999;visibility:hidden}';
27-nCSS+='#foundPanel div{padding-left:5px;text-align:right;font-size:100%;}';
13+nCSS+='#foundResult{position:absolute;top:expression(body.scrollTop+25);right:18px;padding:2px 5px;z-index:6;background-color:white;border:1px solid #999}';
2814 nCSS+='.refResult{margin:0.5em 0.3em; border:1px solid #666;padding-right:0px}';
2915 nCSS+='.refResult{border-top:none}';
3016 nCSS+='.refResult dt{margin-right:0px;}';
3117 nCSS+='.refResult dd{margin-left:0.8em;}';
3218 document.write('<style type="text/css">'+nCSS+'</style>\n');
19+//==========検索による色指定(16進数又はWeb形式の色名で指定。いくつでも可)
20+var foundColor = new Array("#ffdfee","#eeffdf","#ffeedf","#dfffee","#eedfff","#ffffe1");
3321 var nCSS='';
34-for(var css in foundResColor){
35- var c=foundResColor[css].replace(/#/,"");
36- nCSS+='#COLOR'+c+" a{border-color:"+foundResColor[css]+"}\n";
37- nCSS+='#COLOR'+c+" a:hover{border-color:red}\n";
22+for(var css=0;css<foundColor.length;css++){
23+ nCSS+='#COLOR'+css+" a{border-color:"+foundColor[css]+"}";
24+ nCSS+='#COLOR'+css+" a:hover{border-color:red}";
3825 }
3926 document.write('<style type="text/css">'+nCSS+'</style>\n');
40-//=========外部ファイル共用のグローバル変数
27+//==========グローバル変数
4128 var dts=document.getElementsByTagName('DT');
4229 var dds=document.getElementsByTagName('DD');
43-var idHash=new Array(); var refHash=new Array();
44-var foundRes,highlight;
30+var fR;
4531 //==========IDと参照をハッシュに格納
46-// 配列のハッシュより軽いっぽいので、空白区切りの値による単純なハッシュにしてみるテスト。
47-// setEndIdx:本文の同レスを重複処理しないように、Hash化位置としてのdtsの最終indexを記憶
48-// setEndNum:本文以外レスを重複処理しないように、最終レス番号を記憶
49-var setEndIdx=setEndNum=0;
32+var idHash=new Array(); var refHash=new Array(); var searchEnd=0;
5033 function setHash(){
51- //var t0=new Date();
52- var l=Math.min(dts.length,dds.length);
53- var lastNum=l ? parseInt(dts[l-1].firstChild.innerText) : 0;
54- if(isNaN(lastNum)&&l>1){lastNum=parseInt(dts[l-2].firstChild.innerText)} //Footerありなら一つ前
55- if(l==0 || lastNum<=setEndNum){return} // 最後まで調査済みなら回避
56- for(var i=setEndIdx;i<l;i++){
34+ var l=dts.length;
35+ if(dts[l-1].rel=="setEnd"){return} // 最後まで調査済みなら回避
36+ for(var i=searchEnd;i<l;i++){
5737 if(dds[i].parentElement.className=="refResult"){continue} // 逆参照内のDDなら回避
5838 var num=dts[i].firstChild.innerText; var span=dts[i].lastChild;
5939 // ID
60- var t=getID(span); if(t&&t.length>3){idHash[t] = idHash[t] ? idHash[t]+" "+num : num;} // ???やID:0,ID:#(@ゾヌ)はスルー。
61- // 画像板
62- var imgURL=getIMG(span);
63- if(imgURL){
64- var dd=dts[i].nextSibling;
65- if(tp && imgURL && !dd.getElementsByTagName("IMG").length){
66- var aObj=(dd.innerText)?'<br><a href="'+imgURL+'">'+imgURL+'</a>':'<a href="'+imgURL+'">'+imgURL+'</a>';
67- if(!beID && imgURL.match(/kako/)){/*dd.insertAdjacentHTML("beforeEnd","<br>Beにログインしてないと取得できません");*/}else{dd.insertAdjacentHTML("beforeEnd",aObj)}
68- }
69- }
70- // ref,IMG
40+ var t=getID(span); idHash[t] = idHash[t] ? idHash[t]+" "+num : num;
41+ // ref
7142 var ddAnc=dds[i].getElementsByTagName("A");
72- for(var j=0;j<ddAnc.length;j++){
73- if (checkAnchor(ddAnc[j].href)==0){
74- continue;
75- }else if(checkAnchor(ddAnc[j].href)==1){
76- var anc=tohan(ddAnc[j].innerText.replace(/[>>]/g,""));var start,end;
77- if(anc.match(/(\d*)\D+(\d*)/)){
78- start=parseInt(RegExp.$1); end=parseInt(RegExp.$2);
79- if( (end-start>100) || (num-end<4 && start==1) ){continue} // >>1-1000とか>>1-n(直前レス)とかは華麗にスルー
80- }else{
81- start=end=parseInt(anc);
43+ for(var j=ddAnc.length;j--;){
44+ if(checkAnchor(ddAnc[j].href)!=1){continue}
45+ var anc=tohan(ddAnc[j].innerText.replace(/[>>]/g,""));
46+ if(anc.match(/(\d*)\D+(\d*)/)){
47+ var start=parseInt(RegExp.$1); var end=parseInt(RegExp.$2);
48+ if(end-start>100){continue} // >>1-1000とかは華麗にスルー
49+ else if(num-end<3 && start==1){continue} // >>1-n(直前レス)は氏ね,とかもスルー
50+ for(var k=start;k<=end;k++){
51+ if(refHash[k] && refHash[k].indexOf(num)!=-1){continue} // 重複はスルー
52+ if(num>=k){refHash[k]=refHash[k] ? refHash[k]+" "+num : num;} // 未来へのアンカーはスルー
8253 }
83- var k=start-1;do{k++;
84- if((!refHash[k] || refHash[k].indexOf(num)==-1) && num>k){refHash[k]=refHash[k] ? refHash[k]+" "+num : num;} // 重複や未来へのアンカーはスルー
85- }while(k<end);
86- }else if(imageExt2(ddAnc[j].href) && onOpenLoad!=0){
87- if(onOpenLoad==1){if(dds[i].previousSibling.className!="new"){continue}}
88- insButton(ddAnc[j],ddAnc[j].href);
54+ }else{anc=parseInt(anc);
55+ if(refHash[anc] && refHash[anc].indexOf(num)!=-1){continue} // 重複はスルー
56+ if(num>=anc){refHash[anc]=refHash[anc] ? refHash[anc]+" "+num : num;} // 未来へのアンカーはスルー
8957 }
9058 }
9159 }
92- setEndIdx=l;setEndNum=lastNum;
93- //var t1=new Date(); var t=(t1-t0)/1000; if(t){alert(t+"秒");}
94-}
95-// スレッドウィンドウ中心に前後5レスを着色
96-var resUnit=new Array();
97-function searchColoring(){
60+ dts[l-1].rel="setEnd"; searchEnd=l;
9861 if(!coloring){return;} // 着色不要なら終了
99- if(!scr){scr=lightmode ? document.body : document.getElementById("dl");}
100- var nowScrollPos=scr.scrollTop+document.body.clientHeight/2;
101- var l=Math.min(dts.length,dds.length);var st,ed;
102- // dtのoffsetTopを格納(25レス単位)
103- if(resUnit.length<=Math.floor(dts.length/25)){resUnit[0]=0;
104- for(var i=25;i<l;i+=25){resUnit[i/25]=dts[i].offsetTop;}
105- }
106- // 現在どのあたりまでスクロールしてるか調査
107- var rul=resUnit.length-1;
108- if (rul==0) {st=0;ed=l-1;} //25未満
109- else if(resUnit[0]>nowScrollPos) {st=0;ed=24;} //0-24
110- else if(resUnit[rul]<nowScrollPos){st=l-26;ed=l-1;} // 最終25レス
111- else{
112- for(var i=rul;i--;){
113- if(resUnit[i+1]>nowScrollPos&&resUnit[i]<=nowScrollPos){st=i*25;ed=st+25;break}
62+ for(var i=l;i--;){
63+ if(!dts[i].innerText){continue}
64+ //if(dts[i].innerText.match(/id:/i)){ // IDがない板で、高速化するかも?
65+ var span=dts[i].lastChild; var t=getID(span); if(browser=="ホットゾヌ2"){span=span.lastChild}
66+ if(t && idHash[t] && span){
67+ var idResult=idHash[t].split(/\s/); if(t.match(/\?\?\?/)){idResult="";idHash[t]="";}
68+ if (idResult.length>=threshold2[0]){span.style.color=threshold2[1];span.title="同一ID ("+idResult.length+"回)\n"+idHash[t]}
69+ else if(idResult.length>=threshold1[0]){span.style.color=threshold1[1];span.title="同一ID ("+idResult.length+"回)\n"+idHash[t]}
70+ else if(idResult.length==1){span.title="同一IDは\nありません"}
71+ }
72+ //}
73+ var imgURL=getIMG(span);
74+ if(imgURL){dds[i].insertAdjacentHTML("afterBegin",'<img src="'+imgURL+'"><br>')}
75+ //
76+ var numA=dts[i].firstChild; var num=numA.innerText;
77+ if(refHash[num]){
78+ var refResult=refHash[num].split(/\s/);
79+ if (refResult.length>=threshold4[0]){numA.style.color=threshold4[1];dts[i].title="これへのレス ("+refResult.length+"個)\n"+refHash[num];}
80+ else if(refResult.length>=threshold3[0]){numA.style.color=threshold3[1];dts[i].title="これへのレス ("+refResult.length+"個)\n"+refHash[num];}
81+ else{numA.title="これへのレスはない模様"}
11482 }
11583 }
116- // 現在の範囲内からウィンドウの真ん中あたりに表示してるレスを取得(ここで着色すると、25レス単位の切替時に数レスが着色されない)
117- var dtIdx=0; //if(cp){cp.childNodes[1].value=(st+1)+"-"+(ed+1);cp.style.visibility="visible";}
118- for(var i=st;i<=ed;i++){if(!dts[i+1]){dtIdx=ed;break;}
119- if(dts[i+1].offsetTop>nowScrollPos && dts[i].offsetTop<=nowScrollPos){dtIdx=i;break;}
120- }
121- // dtIdxからその周辺を特定
122- var start=dtIdx-5;var end=dtIdx+5;//
123- for(var i=start;i<=end;i++){
124- if(dts[i]){setSearchColor(dts[i])}
125- }
12684 }
127-// IDHash、refHashを元に着色
128-function setSearchColor(dt){
129- if(!dt.innerText){return}
130- // ID
131- var span=dt.lastChild; var t=getID(span);//alert(t +"&&"+ idHash[t] +"&&"+ span);
132- if (browser=="ホットゾヌ2"){span=span.lastChild}
133- else if(browser=="A Bone") {span=span.childNodes[1]}
134- if(t && idHash[t] && span){
135- var idResult=idHash[t].split(" "); if(t.match(/\?\?\?/)){idResult="";idHash[t]="";}
136- if (idResult.length>=threshold3[0]){span.style.color=threshold3[1];span.title="同一ID ("+idResult.length+"回)\n"+idHash[t]}
137- else if(idResult.length>=threshold2[0]){span.style.color=threshold2[1];span.title="同一ID ("+idResult.length+"回)\n"+idHash[t]}
138- else if(idResult.length>=threshold1[0]){span.style.color=threshold1[1];span.title="同一ID ("+idResult.length+"回)\n"+idHash[t]}
139- else if(idResult.length==1){span.title="同一IDは\nありません"}
140- }
141- // ref
142- var numA=dt.firstChild; var num=numA.innerText;
143- if(refHash[num]){
144- var refResult=refHash[num].split(" ");
145- if (refResult.length>=threshold6[0]){numA.style.color=threshold6[1];dt.title="これへのレス ("+refResult.length+"個)\n"+refHash[num];}
146- else if(refResult.length>=threshold5[0]){numA.style.color=threshold5[1];dt.title="これへのレス ("+refResult.length+"個)\n"+refHash[num];}
147- else if(refResult.length>=threshold4[0]){numA.style.color=threshold4[1];dt.title="これへのレス ("+refResult.length+"個)\n"+refHash[num];}
148- else{numA.title="これへのレスはない模様"}
149- }
85+var regIMG=new RegExp(".*?\\s.*?\\s.*:.*?\\sIMG:(.*?)(\\s|$)"); // 画像も可能にしてみる
86+function getIMG(obj){
87+ if(regIMG.test(obj.innerText)){
88+ var filename=RegExp.$1;
89+ var tmp=filename.match(/(\d\d\d\d)(\d\d\d\d)(\d\d)/);
90+ var fileurl="http://up01.2ch.io/_img/"+RegExp.$1+"/"+RegExp.$1+RegExp.$2+"/"+RegExp.$3+"/"+filename;
91+ return(fileurl)
92+ }else{return(false)}
15093 }
15194 //==========名前・ID検索等
152-function searchPerson(obj){
153- var by,thisDT,reg;
154- if (obj.tagName=="DT") {by="ID"; thisDT=obj; reg=getID(obj)}
155- else if(obj.tagName=="SPAN"){by="ID"; thisDT=obj.parentElement;reg=getID(obj)}
156- else if(obj.tagName=="U") {by="NAME";thisDT=obj.parentElement; reg=obj.innerHTML.replace(/<B>(.*?)<\/B>/ig,"");if(!reg){reg=RegExp.$1.replace(/<.*?A.*?>/ig,"")}/*名前が数字*/}
157- else if(obj.tagName=="B") {by="NAME";thisDT=obj.parentElement.parentElement;reg=obj.innerText}
158- else{return}
159- if(!thisDT.rel){
160- var c=selectColor("res"); if(!c){return} var color=new Array(c); // カラー選択
161- if(by=="ID"){
162- if(!reg || !idHash[reg]){return} // IDなし、ID:???、本文中の他スレのコピペID
163- // 検索ハッシュに値を設定して、それに基づきレス着色
164- foundRes[c]=idHash[reg].split(" "); foundRes[c].word="ID:"+reg;
165- for(i in foundRes[c]){var dt=getDTfromAnc(foundRes[c][i]);toggleResColor(dt,c);}
166- }else{
167- var us=document.getElementsByTagName("U"); var l=us.length;
168- var regName=new RegExp();regName.compile(reg);
169- // ループ中にレス着色・値の設定を同時実行
170- for(var i=l;i--;){var dt=us[i].parentElement;
171- if(dt.parentElement.className=="refResult"){continue} // 逆参照内のDTなら回避
172- if(regName.test(us[i].innerText)){toggleResColor(dt,c);foundRes[c].unshift(dt.firstChild.innerText);}
173- }
174- foundRes[c].word=reg;
175- }
176- returnFound("res",color);
95+// IDの検索・削除
96+function searchID(obj){
97+ var singleColor=event.altKey;
98+ var decoy=obj.parentElement ? obj.parentElement : obj;
99+ var reg=getID(obj);
100+ if(!decoy.id.match(/^COLOR/)){
101+ if(!idHash[reg]){return}
102+ var target=new Array();target=idHash[reg].split(" ");
103+ // カラー選択
104+ var c = singleColor ? 0 : selectColor();
105+ if (c=="restart"){c=0;singleColor=true}
106+ else if(c=="exit"){return;}
107+ // 検索
108+ for(i in target){var dt=getDTfromAnc(target[i]);activate(dt,c);}
109+ foundReturn(target);
177110 }else{
178- clearColor("res",thisDT.style.backgroundColor);
111+ clearResult(obj);return;
179112 }
180113 }
181-// ID文字列の抽出
182-var regID=new RegExp(); // HOSTも可能にしてみる
183-regID.compile(".*?\\s.*?\\s.*:(.*?)(\\s|$)"); // 1000resで0.02秒ほど高速
184-function getID(span){
185- if(regID.test(span.innerText)){return(RegExp.$1)}else{return(false)}
186-}
187-//==========色設定解除
188-// オブジェクトの初期化
189-function createHash(name,key,arr,word){
190- name[key]=arr?arr:new Array();
191- name[key].word=word?word:"";
192- name[key].justMovedRes=undefined;
193-}
194-// 色選択(該当レス番号配列を持たないキーを返す)
195-function selectColor(type){
196- if(!foundRes) {foundRes =new Array();for(var i in foundResColor) {createHash(foundRes,foundResColor[i]);}} // Hash foundRes ={色:該当レス番号配列}
197- if(!highlight){highlight=new Array();for(var i in highlightColor){createHash(highlight,highlightColor[i]);}} // Hash hightLight={色:該当レス番号配列}
198- var cHash,cArray,cMess;
199- if(type=="res"){cHash=foundRes; cArray=foundResColor; cMess="今までのレス着色を解除しますか?";}
200- else {cHash=highlight;cArray=highlightColor;cMess="今までのハイライトを解除しますか?";}
201- var i=0; while(cHash[cArray[i]].word){
202- i++; if(i==cArray.length){if(confirm(cMess)){clearColor(type);i=0;break}else{i=null;break}}
203- }
204- return(cArray[i]);
114+// IDポップアップ
115+function searchPopup(obj){
116+ var objs=document.getElementsByTagName(obj.tagName);
117+ var reg=getID(obj);if(!reg){return}
118+ var target=idHash[reg].split(" ");
119+ if(target.length==1){return}
120+ if(!obj.rel){obj.rel=obj.href;} obj.href="decoy:";
121+ var targetString=""; for(i in target){targetString+=returnString(target[i])} //中身の切り出し
122+ if(targetString){popup(targetString);}else{obj.href=obj.rel;} //対象が存在したらrelに退避してポップアップ
205123 }
206-// 色解除(ハッシュ、対象、foundPanel)
207-function clearColor(type,color){
208- var cHash=(type=="res")?foundRes:highlight;
209- if(event && event.altKey){color=""}
210- for(var i in cHash){
211- if(type=="res"){
212- if(color && i!=color){continue} // 指定色でなければスルー
213- for(var j in cHash[i]){
214- if(event.srcElement.value=="DEL"){removeRes(getDTfromAnc(cHash[i][j]))}else{toggleResColor(getDTfromAnc(cHash[i][j]))}
215- }
216- cHash[i]=new Array();
217- document.getElementById("c"+i).removeNode(true);
218- }else{
219- var strongs=document.getElementsByTagName("STRONG");
220- var reg=new RegExp(i);
221- if(!color.match(i)){continue} // 指定色でなければスルー
222- for(var j=0;j<strongs.length;j++){
223- if(strongs[j].style.backgroundColor==i){
224- if(event.srcElement.value=="DEL"){removeRes(strongs[j].parentElement.previousSibling);j--}else{strongs[j].removeNode(false);j--}
225- }
226- }
227- cHash[i]=new Array();
228- if(document.getElementById("c"+i)){document.getElementById("c"+i).removeNode(true);} // and,or検索で1色目のみ
124+// 名前の検索・削除
125+function search(obj){
126+ var singleColor=event.altKey;
127+ var objs=document.getElementsByTagName(obj.tagName);
128+ var reg=obj.innerText; var target="objs[i].innerText"; //名前・トリップ
129+ var decoy=obj.parentElement ? obj.parentElement : obj;
130+ if(!decoy.id.match(/^COLOR/)){
131+ // カラー選択
132+ var c = singleColor ? 0 : selectColor();
133+ if (c=="restart"){c=0;singleColor=true}
134+ else if(c=="exit"){return;}
135+ // 検索
136+ var found=new Array; var l=objs.length;
137+ for(var i=l;i--;){
138+ var dt=objs[i].parentElement; if(dt.parentElement.className=="refResult"){continue} // 逆参照内のDTなら回避
139+ if(eval(target)==reg){activate(dt,c);found.unshift(dt.firstChild.innerText);}
140+ else if(singleColor) {deactivate(dt)}
229141 }
230- }
231- if(!fp.hasChildNodes()){fp.style.visibility="hidden";searched=false;}
232-}
233-// レス色トグル
234-function toggleResColor(dt,c){
235- if(!dt){return} // for-inで送られる番号以外のobjなら終了
236- if(c){
237- dt.rev=dt.style.backgroundColor;
238- dt.rel="colored";
239- dt.id ="COLOR"+c.replace(/#/,"");
240- dt.style.backgroundColor=c;
142+ foundReturn(found);
241143 }else{
242- dt.style.backgroundColor=dt.rev;
243- if(dt.id.match(/COLOR/)){dt.removeAttribute("id")}//else{alert("dtにCOLOR***以外のid("+dt.id+")が設定されています")}
244- dt.removeAttribute("rev");
245- dt.removeAttribute("rel");
144+ clearResult(obj);return;
246145 }
247146 }
248-// 検索結果に基づき消去
249-function removeRes(dt){if(!dt){return} // cHash[i][j]=ID:xxxxxxxxのとき
250- if(browser=="Live2ch"){location.href='func:ABONECLEAR?'+dt.firstChild.innerText;} // Liveのみ-透明あぼ〜ん
251- dt.nextSibling.removeNode(true);dt.removeNode(true);
147+
148+// ID文字列の抽出
149+//var regID=new RegExp("ID:(.*)$");
150+var regID=new RegExp(".*?\\s.*?\\s.*:(.*?)(\\s|$)"); // HOSTやらしたらばも可能にしてみる
151+function getID(obj){
152+ if(regID.test(obj.innerText)){return(RegExp.$1)}else{return(false)}
153+}
154+// 色設定
155+function activate(obj,c){
156+ var color=foundColor[c];
157+ obj.rev=obj.style.backgroundColor;
158+ obj.style.backgroundColor=color;
159+ obj.id="COLOR"+c; // 同一idが複数生じるがByNameではdtのnameから取得できないためやむなし
252160 }
253-//==========結果表示
254-// レス番号リスト(ポップアップアンカーを含む)
255-function returnFound(type,color){
256- var cHash=(type=="res")?foundRes:highlight;
257- var nDIV="";var numArray=cHash[color[0]]; var display=new Array(["none","POP"],["inline","LST"]);
258- if(searchView=="resPopup" || numArray.length>=listLimit){display=display.reverse();}
259- // ポップアップ
260- var nTT="";for(var i=0;i<color.length;i++){nTT+='<tt style="background-color:'+color[i]+'"> '+cHash[color[i]].word+'</tt>';}
261- nDIV+='<span rel="'+type+'" style="display:'+display[0][0]+'">'+nTT+'</span>';
262- // リスト
263- var nA="";for(var i=0;i<numArray.length;i++){nA+=addAnchor(numArray[i],numArray[i])+" "}
264- nDIV+='<tt style="background-color:'+color[0]+'" style="display:'+display[1][0]+'"> '+nA+'</tt>';
265- // 個数
266- nDIV+='&nbsp;'+numArray.length+' ';
267- var buttons='<input type="button" value="'+display[0][1]+'" onclick="changeSearchView();blur()"><input type="button" value="∨" onclick="moveToSearchRes(\''+type+'\',\''+color+'\')" title="下へ検索"><input type="button" value="∧" onclick="moveToSearchRes(\''+type+'\',\''+color+'\')" title="上へ検索"><input type="button" value="CLR" onclick="clearColor(\''+type+'\',\''+color+'\')" title="Alt押下時\n着色レス全て"><input type="button" value="DEL" onclick="clearColor(\''+type+'\',\''+color+'\')" title="Alt押下時\n着色レス全て">';
268- fp.innerHTML+='<div id="c'+color[0]+'">'+nDIV+buttons+'</div>';
269- fp.style.visibility="visible";searched=true;
161+// 色復帰
162+function deactivate(obj){if(!obj){return}
163+ obj.style.backgroundColor=obj.rev;
164+ if(obj.id!="sizeinfo"){obj.removeAttribute("id");}
165+ obj.removeAttribute("rev");
166+ obj.removeAttribute("title");
270167 }
271-// 対象レスにジャンプ
272-var markedDT;
273-function moveToSearchRes(type,color){
274- if(color.match(/(.*?),/)){color=RegExp.$1}
275- var scope = (event && event.srcElement.value=="∧") ? false : true ;
276- var numArray= (type=="res") ? foundRes[color] : highlight[color];
277- if(isNaN(numArray.justMovedRes)){numArray.justMovedRes=0}
278- else{
279- markedDT.style.borderColor="#999";
280- if(scope){numArray.justMovedRes++;if(numArray.justMovedRes>=numArray.length){numArray.justMovedRes--;alert("これより下にはありません")}}
281- else {numArray.justMovedRes--;if(numArray.justMovedRes<0){numArray.justMovedRes++;alert("これより上にはありません")}}
168+// カラー選択
169+function selectColor(){
170+ var c=0;
171+ while(document.getElementById("COLOR"+c)){
172+ c++;
173+ if(!foundColor[c]){if(confirm("色を初期化しますか?")){return("restart")}else{return("exit")}}
282174 }
283- markedDT=getDTfromAnc(numArray[numArray.justMovedRes]); markedDT.style.borderColor="red";
284- markedDT.scrollIntoView(true);
285- setTimeout('markedDT.style.borderColor="#999"',5000);
175+ return(c);
286176 }
287-// ポップアップとリスト表示切り替え
288-function changeSearchView(){
289- var e=event.srcElement;
290- if(e.value=="POP"){
291- e.value="LST";
292- e.parentElement.childNodes[0].style.display="inline";
293- e.parentElement.childNodes[1].style.display="none";
177+// 結果表示
178+function foundReturn(found){
179+ if(!fR){document.body.insertAdjacentHTML('afterBegin','<div id="foundResult"></div>');fR=document.getElementById("foundResult");}
180+ //dtのtitleに
181+ for(var i=found.length;i--;){dt=getDTfromAnc(found[i]);dt.title=found.join(" ");}
182+ //foundResultに
183+ var buttons='<input type="button" value="CLR" onclick="clearResult(this)" title="Alt押下時\n着色レス全て"><input type="button" value="DEL" onclick="clearResult(this)" title="Alt押下時\n着色レス全て">';
184+ if(found.length>=20 && confirm("20以上あるけど表示する?")==false){
185+ fR.innerHTML=buttons; fR.title=found.join(" ");
294186 }else{
295- e.value="POP";
296- e.parentElement.childNodes[0].style.display="none";
297- e.parentElement.childNodes[1].style.display="inline";
187+ for(var i=0;i<found.length;i++){found[i] = addAnchor(found[i],found[i])}
188+ fR.innerHTML=found.join(" ")+buttons;
298189 }
190+ fR.style.visibility="visible";
299191 }
300-
301-//==========単語検索
302-function findIt(arg){createSearchPanel(arg);}
303-var searchWindow=null;
304-// 検索ウィンドウの表示
305-function createSearchPanel(arg){ // 専用ブラウザでのmodelessDialogへの外部読み込みでは、dialogArgumentsが送れないので直接書き出す
306- if(arg){word=arg}
307- if(searchWindow && !searchWindow.closed){return}
308- var skinPath=document.getElementsByName("SkinPath")[0].content;
309- searchWindow=showModelessDialog("",window,'dialogWidth:500px;dialogHeight:200px;dialogTop:0px;dialogLeft:0px;help:no;resizable:yes;status:no;unadorned:yes;');
310- var nWin='<html><head><title>単語の検索<\/title>'
311- +'<script type="text/javascript">function submitEvent(){var fo=document.forms[0]; dialogArguments.word=fo.word.value; var i=-1;do{i++;dialogArguments.expression =fo.expression[i].value;}while(!fo.expression[i].checked); var i=0; while(fo.searchTarget[i]){dialogArguments.searchTarget[fo.searchTarget[i].value]=fo.searchTarget[i].checked;i++;} var i=-1;do{i++;dialogArguments.searchView =fo.searchView[i].value;}while(!fo.searchView[i].checked); dialogArguments.searchWord();}</script>'
312- +'<style type="text/css">body{background:ThreeDFace;padding:0.5em;overflow:auto} fieldset{padding:0.5em;margin-top:0.5em;} legend,label,input{font:message-box;}</style>'
313- +'<\/head><body onunload="unloadEvent()"><form onsubmit="submitEvent();return false;"><table width="100%"><tr><td valign="top" colspan="3">'
314- +'<label for="word">検索文字列:</label><input type="text" name="word" id="word" size="50" value="'+word+'" tabindex="0"><br>'
315- +'</td><td align="right" valign="top" rowspan="2">'
316- +'<input type="submit" name="submit" value=" 検 索 " tabindex="7"><br><br><input type="button" name="cancel" value="キャンセル" onclick="window.close()" tabindex="8">'
317- +'</td></tr><tr valign="top">'
318- +'<td><fieldset><legend>検索方法</legend><input type="radio" name="expression" value="default" id="tDef" tabindex="1"> <label for="tDef">通常検索</label><br><input type="radio" name="expression" value="regExp" id="tReg"> <label for="tReg">正規表現</label><br><input type="radio" name="expression" value="multiAND" id="tAND"> <label for="tAND">AND検索</label><br><input type="radio" name="expression" value="multiOR" id="tOR"> <label for="tOR">OR検索</label></fieldset></td>'
319- +'<td><fieldset><legend>検索対象</legend><input type="checkbox" name="searchTarget" value="name" id="tName" tabindex="2" checked> <label for="tName">名前</label><br><input type="checkbox" name="searchTarget" value="mail" id="tMail" tabindex="3" checked> <label for="tMail">メール</label><br><input type="checkbox" name="searchTarget" value="id" id="tID" tabindex="4" checked> <label for="tID">日付とID</label><br><input type="checkbox" name="searchTarget" value="mess" id="tMess" tabindex="5" checked> <label for="tMess">本文</label></fieldset></td>'
320- +'<td><fieldset><legend>結果表示</legend><input type="radio" name="searchView" value="resList" id="rList" tabindex="6"> <label for="rList">レス番号を表示</label><br><input type="radio" name="searchView" value="resPopup" id="rPop"> <label for="rPop">レスをポップアップ</label><br><input type="radio" name="searchView" value="resJump" id="rJump"> <label for="rJump">レスへジャンプ</label></fieldset></td>'
321- +'</tr></table></form><\/body><\/html>';
322- searchWindow.document.write(nWin);
323- sdf=searchWindow.document.forms[0]; sdf.elements[0].select();
324- var ex=sdf.expression;for(var i=0;i<ex.length;i++){if(ex[i].value==expression){ex[i].checked=true}}
325- var sv=sdf.searchView;for(var i=0;i<sv.length;i++){if(sv[i].value==searchView){sv[i].checked=true}}
326- range=document.body.createTextRange();
327-}
328-// 検索処理メイン
329-var word="";var range;var searchTarget={"word":true};
330-function searchWord(){
331- if(!word){return}
332- var matchs=new Array(); var color=new Array();
333- // 検索方法
334- if(expression=="regExp" || expression=="default" || (expression.match(/multi/) && !word.match(/\s/))){ // AND/ORで一単語ならdefaultで検索
335- // 検索語指定(重複排除で高速化?)
336- if(expression=="regExp"){
337- var regWord=word.replace(/[\^\$]/g,"");
338- var reg=new RegExp(regWord,"g"); var tmpArr=range.text.match(reg); var tmp;
339- if(!tmpArr || !tmpArr.length){tmpArr=new Array(tmpArr)} // 検索結果0or1なら、配列作成
340- tmpArr.sort();for(var i=0;i<tmpArr.length;i++){if(tmp!=tmpArr[i]){matchs.push(tmpArr[i])}tmp=tmpArr[i]}
341- if(!matchs || !matchs.length){matchs[0]=word} // 検索結果0or1なら、配列作成
342- }else{matchs[0]=word}
343- // ハイライト
344- for(var i=0;i<matchs.length;i++){color.push(setHighlight(matchs[i]));}
345- highlight[color[0]].word=word;
192+// 結果消去、結果削除
193+function clearResult(obj){
194+ var fromObj=obj.parentElement;
195+ var singleColor=event.altKey;
196+ var result=new Array();var arrayElement; var numbers=fromObj.title ? fromObj.title : fromObj.innerText;
197+ if(singleColor){result=dts; arrayElement="result[i]";}
198+ else {result=numbers.split(" ");arrayElement="getDTfromAnc(result[i])";}
199+ var l=result.length;
200+ if(!result[0]){
201+ /* 検索結果ゼロでもresultがnullにならない対策 */
202+ }else if(event.srcElement.value!="DEL"){
203+ for(var i=l;i--;){
204+ var dt=eval(arrayElement);
205+ deactivate(dt);
206+ }
346207 }else{
347- // 検索語指定
348- var matchs=word.split(" "); var tmpArr=new Array(); var tmp;
349- // ハイライト→重複処理
350- for(var i=0;i<matchs.length;i++){
351- color.unshift(setHighlight(matchs[i]));
352- highlight[color[0]].word=matchs[i];
353- tmpArr=tmpArr.concat(highlight[color[0]])
208+ for(var i=l;i--;){
209+ var dt=eval(arrayElement); var dd=dt.nextSibling;
210+ //Live機能追加 - 透明あぼ〜ん
211+ if(browser=="Live2ch"){location.href='func:ABONECLEAR?'+dt.firstChild.innerText;}
212+ dt.removeNode(true); dd.removeNode(true);
354213 }
355- color.reverse();tmpArr.sort();createHash(highlight,color[0],"",matchs[0]); // 一旦初期化
356- var judge = (expression=="multiAND") ? "tmp==tmpArr[i]" : "tmp!=tmpArr[i]";
357- for(var i=0;i<tmpArr.length;i++){if(eval(judge)){highlight[color[0]].push(tmpArr[i])}tmp=tmpArr[i]} // 検索結果はhighlight[color[0]]に入れる
358214 }
359- // 結果表示
360- if (searchView=="resList") {returnFound("search",color);searchWindow.close();}
361- else if(searchView=="resPopup"){returnFound("search",color);searchWindow.close();}
362- else if(searchView=="resJump") {returnFound("search",color);searchWindow.close();if(highlight[color[0]].length){moveToSearchRes("search",color.join(","))}}
215+ if(fR){fR.innerText="";fR.style.visibility="hidden";}
363216 }
364-// ハイライト検索
365-function setHighlight(reg){
217+
218+//==========単語検索
219+function findIt(word){
220+ if(!word){
221+ var word = prompt("検索する文字を入力してください。","");
222+ word = unescape(escape(word).split("%00")[0]); //IE5のバグ対策
223+ }
224+ if(!word || word=="null"){return}
366225 // カラー選択
367- var c=selectColor("highlight"); if(!c){return}
226+ var singleColor=event.altKey;
227+ var c = singleColor ? 0 : selectColor();
228+ if (c=="restart"){c=0;singleColor=true}
229+ else if(c=="exit"){return;}
368230 // 検索
369- while(range.findText(reg)){
370- var dt=range.parentElement();var tag=dt.tagName; var thisRange;
371- // 検索対象で絞り込み
372- if(tag=="B"||tag=="U"){thisRange="name"}
373- else if(tag=="DT") {thisRange="mail"}
374- else if(tag=="SPAN") {thisRange="id"}
375- else if(tag=="DD" || tag=="A" && dt.parentElement.tagName=="DD"){thisRange="mess"}
376- else if(tag=="STRONG"){thisRange="word"}
377- else{/*alert("tag:"+tag+"\ndt:"+dt.outerHTML);*/range.collapse(false);continue;} // レス番号(A)や検索結果自体(TT)
378- if(!searchTarget[thisRange]){range.collapse(false);continue;}
379- // 正規表現の位置指定子がある場合、包含要素内部で再検索
380- if(expression=="regExp" && word.match(/[\^|\$]/)){
381- var thisReg=new RegExp(word); var targetText=(tag=="STRONG") ? dt.parentElement.innerText : dt.innerText;
382- if(!targetText.match(thisReg)){range.collapse(false);continue}
383- }
384- // dt取得→レス番号取得→ハイライト
385- if(dt.tagName!="DT"){
386- while(dt.tagName!="DT" && dt.tagName!="DD"){dt=dt.parentElement}
387- if(dt.tagName=="DD"){dt=dt.previousSibling}
388- }
389- var num=dt.firstChild.innerText;
390- if(dt.parentElement.className!="refResult" && num!=highlight[c][highlight[c].length-1]){highlight[c].push(num)} // 逆参照内のDT,同一番号なら回避
391- range.pasteHTML('<strong style="background-color:'+c+'">'+range.text+'</strong>');
392- range.collapse(false);
231+ var found=new Array; var l=dds.length;
232+ var bodyText=document.body.createTextRange();
233+ for(var i=l;i--;){
234+ var dt=dts[i]; var dd=dds[i]; if(dt.parentElement.className=="refResult"){continue} // 逆参照内のDTなら回避
235+ bodyText.moveToElementText(dt); var checkDT=bodyText.findText(word,0);
236+ bodyText.moveToElementText(dd); var checkDD=bodyText.findText(word,0);
237+ if(checkDT || checkDD){activate(dt,c);found.unshift(dt.firstChild.innerText)}
238+ else if(singleColor) {deactivate(dt);}
393239 }
394- range=document.body.createTextRange(); // レンジを元に戻しておく
395- return(c);
240+ if(found){foundReturn(found)}
396241 }
397242 //==========逆参照
398243 function searchRef(obj){
@@ -400,7 +245,16 @@ function searchRef(obj){
400245 var num=obj.firstChild.innerText;
401246 if(refHash[num]){
402247 var refArr=refHash[num].split(/\s/); var refs="";
403- for(var i=0;i<refArr.length;i++){refs+=returnString(refArr[i]);}
248+ for(var i=0;i<refArr.length;i++){
249+ var dtOrg=getDTfromAnc(refArr[i]); var dt=dtOrg.cloneNode(true); var dd=dtOrg.nextSibling.cloneNode(true);
250+ // 本文以外を削除
251+ if(dd.lastChild){
252+ if(dd.lastChild.tagName=="DL"){dd.lastChild.removeNode(true);} //逆参照の除去
253+ if(dd.lastChild.name){dd.lastChild.removeNode(true);} // LABELNUMBERがないものに係る不要アンカーの除去
254+ }
255+ // 本文を格納
256+ refs+=dt.outerHTML.replace(/name=.*?>/,">")+dd.outerHTML.replace(/<a name=.*>/i,"");
257+ }
404258 obj.nextSibling.insertAdjacentHTML("beforeEnd",'<dl class="refResult">'+refs+'</dl>')
405259 obj.name="referred";
406260 }
@@ -428,26 +282,9 @@ function getDTfromAnc(num){
428282 var anc=ancs(anchorHead+num);
429283 if(!anc){return("")} //LABELNUMBER対応のあぼ〜ん若しくは未出番号なら終了
430284 var obj=anc.parentElement; //LABELNUMBER対応のもの
431- if(!obj || !obj.tagName){return false;}
432285 if(obj.tagName!="DT"){ //LABELNUMBER非対応のもの
433286 if(num==1){if(anc){obj=anc.nextSibling} else{return("")}}
434287 else {if(!anc.nextSibling){obj=anc.parentElement.nextSibling}else{return("")}}
435288 }
436289 return(obj);
437-}
438-
439-// 画像板関連
440-var regIMG=new RegExp(".*?\\s.*?\\s.*:.*?\\sIMG:(.*?)(\\s|$)"); // 画像も可能にしてみる
441-function getIMG(obj){
442- if(regIMG.test(obj.innerText)){
443- var filename=RegExp.$1;
444- var tmp=filename.match(/(\d\d\d\d)(\d\d\d\d)(\d\d)/);
445- var today=new Date();var last=new Date(today-7*24*60*60*1000);var date="";
446- date+=last.getMonth()<9 ? "0"+(last.getMonth()+1) : last.getMonth()+1;
447- date+=last.getDate()<10 ? "0"+last.getDate() : last.getDate();
448- var log= (RegExp.$1+""+RegExp.$2 < last.getYear()+""+date) ? "_kako/" : "_img/";
449- var fileurl="http://up01.2ch.io/"+log+RegExp.$1+"/"+RegExp.$1+RegExp.$2+"/"+RegExp.$3+"/"+filename;
450- return(fileurl)
451- }else{return(false)}
452-}
453-
290+}
\ No newline at end of file
--- a/res/skin/skin30-3G/Header.html
+++ b/res/skin/skin30-3G/Header.html
@@ -15,7 +15,7 @@
1515 var start_time = new Date();
1616 //==========グローバル変数
1717 var anchorHead="";
18-var skinName="skin30-3 v3.6.1231";
18+var skinName="skin30-3 v3.5.0704";
1919 var browser="ギコナビ";
2020 //==========ギコナビ用アンカーの判定(0:処理無し,1:ポップアップ,2:ボタン挿入)
2121 // ギコナビでは、レスアンカーは相対アドレスで記述される
@@ -47,16 +47,6 @@ function threadurl(){
4747 t_bbs=RegExp.$1;
4848 t_key=RegExp.$2;
4949 }
50-//==========非表示レスの表示-ギコナビのみ
51-function hiddenRes(e){
52- var number=tohan(event.srcElement.innerText.replace(/>|>/g,""));
53- var i=0;while(document.anchors[i].name.match(/\D/)){i++}
54- var startRes=parseInt(document.anchors[i+1].name.replace(/\D/g,""));
55- if(number.match(/(\d*)\D+(\d*)/)){var start=parseInt(RegExp.$1);}
56- else {var start=parseInt(number);}
57- //alert(startRes+">"+start+" && "+start+"!="+1);
58- if(startRes>start && start!=1){return true}else{return false}
59-}
6050 </script>
6151 </head>
6252 <body>
--- a/res/skin/skin30-3G/chie_base.css
+++ b/res/skin/skin30-3G/chie_base.css
@@ -7,11 +7,8 @@ dt a{text-decoration:none;}
77 dd a{text-decoration:underline;line-height:1.1}
88
99 /* 検索結果 */
10-#foundPanel{color:LightSlateGray;}
11-#foundPanel div {font-family:"MS ゴシック";}
12-#foundPanel div span{font-family:Times;cursor:hand;}
13-#foundPanel a {color:LightSlateGray;}
14-#foundPanel a:hover{color:#000;}
10+#foundResult a {color:LightSlateGray;}
11+#foundResult a:hover{color:#000;}
1512
1613 /* dt */
1714 dt{
--- a/res/skin/skin30-3G/chie_event.js
+++ b/res/skin/skin30-3G/chie_event.js
@@ -1,22 +1,18 @@
1-//========新着ジャンプ設定
2-var buffer=1; // 低速回線や低速マシンの場合にはbufferの数値を増やすとより正確にジャンプ(1増やすと0.1秒遅れる)
3-var newResJump=1; // 新着レスジャンプ(0:ブラウザ任せ、1:読了時のみ、2:常時)*かちゅ、OpenJane、twintailのみの設定
4-//==========以下はスクリプト本文ですよ。
51 //イベントハンドラ定義
62 //外部関数:tohan
73 //外部変数:anchorHead,lightmode,getID,skinName,browser,dts
8-//=========外部ファイル共用のグローバル変数
9-var waited=false;//command表示後trueにし、選択後にfalseにする。
10-var viewed=false;//thumb読込み後trueにし、thumbPanelに乗降後falseにする。
11-var searched=false; //検索後に、trueにし、foundPanelに乗降後falseにする。
12-var cp,tp,vp,fp;
4+//グローバル変数
5+var buffer=1; // 低速回線や低速マシンの場合にはbufferの数値を増やすとより正確にジャンプ(1増やすと0.1秒遅れる)
6+var newResJump=1; // 新着レスジャンプ(0:ブラウザ任せ、1:読了時のみ、2:常時)*かちゅ、OpenJane、twintailのみの設定
137 //========Click処理→search,他
148 document.onclick = clickEvent;
159 function clickEvent(){
1610 if(clickCancel){return false}else{clearTimeout(clickTimer);if(document.getElementById("context")){document.getElementById("context").removeNode(true);}}
1711 var obj=window.event.srcElement;
1812 var tag=obj.tagName;
19- if(tag=="B"||tag=="U"||tag=="SPAN"){searchPerson(obj)} //名前,トリップ,ID
13+ if (tag=="B") {search(obj.parentElement)} //名前
14+ else if(tag=="U") {search(obj)} //トリップ
15+ else if(tag=="SPAN"){if(getID(obj)){searchID(obj)}} //ID
2016 else if(tag=="DT") {searchRef(obj)}
2117 else if(tag=="DD") {defaultPopup()}
2218 else if(tag=="A"){
@@ -27,7 +23,7 @@ function clickEvent(){
2723 if(obj.href.match(/^http:.*#/)){window.open(obj.href,"_parent");return false}
2824 }
2925 //A Bone補正(非表示レスの表示)
30- if((browser=="A Bone"||browser=="ギコナビ") && hiddenRes(obj)){showModelessDialog(document.getElementsByName("ThreadURL")[0].content.replace(/\/l50$/,"/")+tohan(obj.innerText.replace(/[>>]/g,"")),window,"dialogWidth:"+document.body.clientWidth+"px;help:no;resizable:yes;status:no;unadorned:yes;");window.focus();}
26+ if(browser=="A Bone" && hidedRes(obj)){showModelessDialog(document.getElementsByName("ThreadURL")[0].content+tohan(obj.innerText.replace(/[>>]/g,"")),window,"dialogWidth:"+document.body.clientWidth+"px;help:no;resizable:yes;status:no;unadorned:yes;");window.focus();}
3127 //Jane,Live,ギコナビ補正(skin30-2Normal及びギコナビ)*レスジャンプがscrollIntoViewでないものに係る補正
3228 if(browser=="A Bone" || browser=="OpenJane" || browser=="Live2ch" || browser=="ギコナビ"){if(obj.href.match(/^about|jumpres/)){
3329 var h=tohan(obj.innerText.replace(/[>>]/g,""));
@@ -36,17 +32,17 @@ function clickEvent(){
3632 }}
3733 return true;
3834 }
39- else{panelOver();return}
35+ else{return}
4036 }
4137
4238 //=========MouseOver処理→image,popup
4339 document.onmouseover = mouseOverEvent;
4440 function mouseOverEvent() {
4541 var e = window.event.srcElement;
46- if(e.tagName=='B'){if(browser!="twintail2"){
42+ if(e.tagName=='B'){
4743 if(e.innerText.match(/^([^\d0-9]*)([\d0-9]+)([^\d0-9]*.*)/)){namePopup(e,RegExp.$1,RegExp.$2,RegExp.$3);}
4844 else if(e.innerText.match(/^あぼ〜ん$/)) {abonePopup(e);}
49- }}
45+ }
5046 if(e.tagName=='A'){
5147 if(!e.innerText.match(/%/)){ // URLエンコードでありがちな%がなければ
5248 //e.href=e.href.replace(/>/g,"");
@@ -59,8 +55,9 @@ function mouseOverEvent() {
5955 }
6056 }
6157 if (checkAnchor(e.href)==2){insButton(e);return;}
62- else if(checkAnchor(e.href)==1){ // 多段ポップアップ
58+ else if(checkAnchor(e.href)==1){
6359 if(event.shiftKey){if(e.rel){e.href=e.rel}return}
60+ // 多段ポップアップ
6461 var parent=e.parentElement;
6562 var aNum= (parent.tagName!="DD") ? parent.firstChild.sourceIndex : parent.previousSibling.firstChild.innerText;
6663 if(!document.getElementById("p"+aNum)){
@@ -69,48 +66,49 @@ function mouseOverEvent() {
6966 if(!onPopup){removePopup()}
7067 makePopContent(e);return;
7168 }
72- }else if(checkAnchor(e.href)==0){ // 逆参照ポップアップ
73- if(e.href.match(/menu:/) && event.shiftKey){searchPopup(e)}
7469 }
75- }else if(e.tagName=="SPAN"||e.tagName=="TT"){
76- var obj=e;var onPopup;
77- while(obj.tagName!="BODY"){if(obj.id.match(/p\d+/)){onPopup=true;break}else{obj=obj.parentElement}}
78- if(e.tagName=="SPAN"){
79- if(!onPopup && event.shiftKey){searchPopup(e)}
80- }else{searchPopup(e)}
8170 }else{ // 多段ポップアップ消去
8271 var obj=e;var onPopup;
8372 if(obj.sourceIndex<0){obj=document.body;if(document.getElementById("popupBase")){onPopup=true;}} // namePopupとの競合でノードが外れる瞬間の回避
84- while(obj.tagName!="BODY"){if(obj.id.match(/(p\d+)/)){onPopup=true;break}else{obj=obj.parentElement;}}
73+ while(obj.tagName!="BODY"){if(obj.id.match(/p\d+/)){onPopup=true;break}else{obj=obj.parentElement;}}
8574 if(onPopup){while(obj.id!=obj.parentElement.lastChild.id){obj.parentElement.lastChild.removeNode(true)}}
8675 else {removePopup()}
8776 }
77+ if(e.tagName=="DT"){setHash();}
78+ if(e.tagName=="SPAN"){
79+ var obj=e;var onPopup;
80+ while(obj.tagName!="BODY"){if(obj.id.match(/p\d+/)){onPopup=true;break}else{obj=obj.parentElement}}
81+ if(!onPopup && event.shiftKey){searchPopup(event.toElement);} return;
82+ }
8883 }
89-//=========MouseMove処理→panelOver()
84+//=========MouseMove処理→menuOver(),tpOver()
9085 document.onmousemove=mouseMoveEvent;
86+var waited=false;//command表示後trueにし、選択後にfalseにする。
87+var viewed=false;//thumb読込み後trueにし、thumbPanelに乗降後falseにする。
88+var cp,tp,vp;
9189 function mouseMoveEvent() {
9290 if(!cp){
93- var nHTML ='<div id="controlPanel"><input type="button" value="TOP" onclick="scroll_Top();blur()"><input type="button" value="END" onclick="scroll_End();blur()"><input type="button" value="IMG" onmouseup="imgCommand();blur()"><input type="button" value="FND" onclick="fndCommand();blur();"></div><div id="foundPanel" onmouseout="searched=false"></div>';
94- if(skinName.match(/30-2/)){nHTML+='<div id="thumbPanel" onmouseout="viewed=false"></div><div id="viewPanel"></div>';}
95- document.body.insertAdjacentHTML("afterBegin",nHTML);
96- cp=document.getElementById("controlPanel");fp=document.getElementById("foundPanel");
97- if(skinName.match(/30-2/)){tp=document.getElementById("thumbPanel");vp=document.getElementById("viewPanel");}else{tp=vp=new Object()}
98- cp.condition="waited";tp.condition="vp.firstChild || viewed || !lightmode";fp.condition=resultView ? "fp.hasChildNodes()" : "searched";
99- cp.territory="<25"; tp.territory=">20"; fp.territory="<(30+fp.clientHeight) && fp.hasChildNodes()";
91+ var nHTML ="<div id='controlPanel'><input type='button' value='TOP' onclick='scroll_Top();blur()'><input type='button' value='END' onclick='scroll_End();blur()'><input type='button' value='IMG' onmouseup='imgCommand();blur()'><input type='button' value='FND' onclick='findIt(document.selection.createRange().text);blur()'></div>";
92+ if(skinName.match(/30-2/)){nHTML+="<div id='thumbPanel' onmouseout='viewed=false'></div><div id='viewPanel'></div>";}
93+ document.body.insertAdjacentHTML('afterBegin',nHTML);
94+ cp=document.getElementById("controlPanel");
95+ if(skinName.match(/30-2/)){tp=document.getElementById("thumbPanel");vp=document.getElementById("viewPanel");}
10096 }
101- if(event){panelOver();}
102- if(!idHash.length){setHash();searchColoring();}
97+ cpOver();
98+ tpOver();
10399 }
104-// 各パネル
105-function panelOver(){
100+// コントロールパネル
101+function cpOver(){
106102 var territoryW=document.body.clientWidth-120;var territoryH=25;
107- var panels=new Array("cp","tp","fp");
108- for(var i in panels){
109- if(skinName.match(/30-3/)&&panels[i]=="tp"){continue}
110- var panel=eval(panels[i]); var territoryY=eval("event.y"+panel.territory); var territoryX=eval(event.x>document.body.clientWidth-panel.offsetWidth-15);
111- if(eval(panel.condition)){panel.style.visibility="visible";return}
112- if(territoryY && territoryX){panel.style.visibility="visible";}else{panel.style.visibility="hidden";}
113- }
103+ if(waited){cp.style.visibility="visible";return}
104+ if(event.y<territoryH && event.x>territoryW){cp.style.visibility="visible";}else{cp.style.visibility="hidden";}
105+}
106+// サムネイルパネル
107+function tpOver(){
108+ if(skinName.match(/30-3/) || !lightmode){return}
109+ var territoryW=document.body.clientWidth-120;var territoryH=20;
110+ if(document.getElementById("viewPanel").firstChild || viewed){tp.style.visibility="visible";return}
111+ if(event.y>territoryH && event.x>territoryW){tp.style.visibility="visible";}else{tp.style.visibility="hidden";}
114112 }
115113 // TOP,END
116114 function scroll_Top(){document.getElementsByTagName("DL")[0].firstChild.scrollIntoView(true);}
@@ -129,14 +127,6 @@ function imgCommand(mode,s){
129127 clearCommand();
130128 }
131129 }
132-function fndCommand(mode,s){
133- if(!waited){
134- findIt(document.selection.createRange().text);
135- event.cancelBubble=true;
136- }else{
137- clearCommand();
138- }
139-}
140130 function clearCommand(){
141131 waited=false;
142132 document.getElementById("command").removeNode(true);
@@ -184,7 +174,7 @@ function key(){
184174 else if(code=="36"){scroll_Top()}
185175 else if(code=="35"){scroll_End()}
186176 else if(code=="73" && event.shiftKey){changePanel();return false;} // shift+I
187- else if(code=="70" && event.shiftKey){findIt(document.selection.createRange().text);return false;} // shift+F
177+ else if(code=="70" && event.shiftKey){cp.childNodes[3].click();return false;} // shift+F
188178 else if(code=="78" && event.shiftKey && firstNew){firstNew.scrollIntoView(true)} // shift+N
189179 else if(code=="82" && event.shiftKey && event.ctrlKey){ // ctrl+shift+R
190180 //かちゅ〜しゃ補正(板更新のショートカットキー)
@@ -200,7 +190,7 @@ function key(){
200190 //=========かちゅ、ABone、ゾヌ2
201191 var newResNum=parseInt(document.getElementsByName("GetRescount")[0].content)+1;
202192 var k=0;
203-function loadEvent(num){
193+function loadEvent(num){ //setTimeout("setHash();",100);
204194 //====新着レスジャンプ
205195 if(newResJump==0){clearInterval(timerID);return} //「ブラウザ任せ」なら終了
206196 //新着レスの開始番号を取得
@@ -219,7 +209,7 @@ function loadEvent(num){
219209 //=========新着レス取得後処理(標準スキン対応ブラウザ用)←NewMarkから呼び出し
220210 //=========OpenJ、twin
221211 var scr,viewPos,endPos=0;
222-function reloadEvent(){
212+function reloadEvent(){ //setTimeout("setHash();",100);
223213 //====既読化
224214 var lastDt=dts[dts.length-2];if(!lastDt){return}// 全部新着なら終了
225215 while(lastDt && lastDt.className=="new"){lastDt.className="";lastDt=lastDt.previousSibling.previousSibling;}
@@ -252,10 +242,10 @@ function defaultPopup(){
252242 obj.innerText=num;
253243 obj.href="#"+hnum;
254244 makePopContent(obj);
255- }else if(num.match(/\w{8,9}/)){ //\w{8}ではだめぽ?
256- var obj=document.createElement("DT");
257- obj.innerHTML="<span>date time ID:"+num+"</span>";
258- searchPerson(obj.firstChild);
245+ }else if(num.match(/\w/) && num.length==8){ //\w{8}ではだめぽ?
246+ var obj=document.createElement("span");
247+ obj.innerText="date time ID:"+num;
248+ setHash();searchID(obj);
259249 }
260250 }
261251
@@ -270,14 +260,5 @@ function copyEvent(){
270260 copyText.execCommand("Copy");
271261 return false;
272262 }
273-//=========onScroll処理
274-//window.onscroll=function(){clearInterval(beforeScrollTimer);onLoadEvent()}
275-window.onscroll=function(){onLoadEvent()}
276-if(document.getElementById("dl")){
277- document.getElementById("dl").onscroll=function(){onLoadEvent()}
278-}
279-//=========onLoad処理
280-window.onload=onLoadEvent;
281-function onLoadEvent(){mouseMoveEvent();setHash();searchColoring();}
282-setTimeout("onLoadEvent()",1000); // 一回だけ着色
283-
263+//=========onLoad処理(DAT2HTMLのみ)
264+window.onload=function(){setHash()}
--- a/res/skin/skin30-3G/chie_image2.js
+++ b/res/skin/skin30-3G/chie_image2.js
@@ -1,8 +1,7 @@
11 // イベントハンドラ:onMouseover
22 // 外部変数:anchorHead,dds
3-//======画像読み込みの設定 (注)WindowsXP SP2ではこれらの設定は有効に機能しません。
4-var onOpenLoad =1; // 0:読み込まない、1:新着レスのみ、2:全部
5-var onMouseLoad=true; // true:カーソルを合わせただけ、false:LOADボタンをクリックしてから
3+//======画像読み込みの設定
4+var onMouseLoad=true; // true:カーソルを合わせただけ、false:LOADボタンをクリックしてから
65 //==========グローバル変数
76 var lightmode=true; // Live,twinのジャンプ用判定で用いているので必須
87 //==========画像処理等
--- a/res/skin/skin30-3G/chie_popup.js
+++ b/res/skin/skin30-3G/chie_popup.js
@@ -1,6 +1,4 @@
1-//==========以下はスクリプト本文ですよ。
21 // イベントハンドラ:onMouseover
3-// 外部変数:idHash,refHash,foudRes,highlight
42 // 外部関数:addAnchor,getDTfromAnc
53 // 特徴:DIV#popupBase下に「フラットでリニア」にDL#p\dを作成する。
64 //==========CSSの出力
@@ -11,65 +9,65 @@ nCSS+='#popupBase dl{position:absolute; background-color:window; border:outset 1
119 nCSS+='#popupBase dt span{float:none; margin-left:1em;}';
1210 nCSS+='#popupBase dd{margin:auto 1em}';
1311 document.write('<style type="text/css">'+nCSS+'</style>\n');
14-//=========外部ファイル共用のグローバル変数
12+//=========グローバル変数
13+var pb;
1514 //=========ナンバーな名前のポップアップ
1615 function namePopup(e,before,num,after){
1716 var hnum=tohan(num);
18- if(hnum==774 || hnum==21 || hnum==1 || hnum==30){return} // Socket774、774KB、21禁、[1-30]、などは無視
19- if(before && before.match(/名無/)){return} //名無しっぽいのは無視
20- if(after) {if(after=="周年"){return}} // デフォルトな"n周年"は無視
17+ //3周年、4周年、Socket774、774KB、21禁、[1-30]、などは無視
18+ if(before){if(hnum==5 || hnum==774 || hnum==4 || hnum==21 || hnum==1 || hnum==30){return}}
2119 var nB = before ? "<b>"+before+"</b><b>":"<b>"; nB+=addAnchor(hnum,num); nB+=after ? "</b><b>"+after+"</b>":"</b>";
2220 e.outerHTML=nB;
2321 }
2422 //=========弱あぼ〜んのポップアップ
25-function abonePopup(e){e.outerHTML = "<b>"+addAnchor(e.parentElement.previousSibling.innerText,'あぼ〜ん')+"</b>";}
26-//=========検索したレスのポップアップ
27-function searchPopup(obj){
28- var reg,cArray;var tag=obj.tagName;
29- /*ref Popup*/if (tag=="A") {if(refHash[obj.innerText]){cArray=refHash[obj.innerText].split(" ")}else{return}}
30- /*ID Popup*/ else if(tag=="SPAN"){reg=getID(obj);if(reg&&reg.length>3){cArray=idHash[reg].split(" ");}else{return} if(cArray.length==1){return}}
31- /*検索Popup*/else if(tag=="TT") {var cHash=(obj.parentElement.rel=="res")?foundRes:highlight;cArray=cHash[obj.parentElement.firstChild.style.backgroundColor];if(!cArray){return}}
32- var targetString=""; for(var i=0;i<cArray.length;i++){targetString+=returnString(cArray[i]);} //中身の切り出し
33- if(targetString){popup(targetString);} //対象が存在したらポップアップ
23+function abonePopup(e){
24+ var hnum=e.parentElement.previousSibling.innerText;
25+ e.outerHTML = "<b>"+addAnchor(hnum,'あぼ〜ん')+"</b>";
3426 }
3527 //=========多段ポップアップ
3628 //・ポップアップの作成
29+var startRes;
3730 function makePopContent(obj){
3831 //事前準備
39- var num=obj.innerText.replace(/[>>]/g,""); var number=tohan(num);
40- if(!obj.rel){obj.rel=obj.href;} obj.href="decoy:"; // ブラウザ本体のポップアップ回避
41- //番号調査
32+ var num=obj.innerText.replace(/[>>]/g,"");
33+ var number=tohan(num);
34+ if(!obj.rel){obj.rel=obj.href;}
35+ obj.href="decoy:";
36+ //調査
37+ if(document.anchors.length==1){return} //レス数が1なら終了
38+ if(!startRes){startRes=parseInt(document.anchors[1].name.replace(/\D/g,""))}
4239 if(number.match(/(\d*)\D+(\d*)/)){var start=parseInt(RegExp.$1); var end=parseInt(RegExp.$2);}
4340 else {var start=end=parseInt(number);}
44- if(end-start>100){end=start+100} // 100以上表示しない
41+// alert(startRes+">"+end+" && "+end+"!=1")
42+ if(startRes>end && end!=1){obj.href=obj.rel;return}//存在していなければ終了
4543 //中身の切り出し
46- var targetString=""; for(var i=0;i<=end-start;i++){targetString+=returnString(start+i)}
44+ var targetString=""; if(end-start>100){end=start+100}
45+ if(start==end){targetString=returnString(start)}
46+ else {for(var i=0;i<=end-start;i++){targetString+=returnString(start+i)}}
4747 //対象が存在したらrelに退避してポップアップ
4848 if(targetString){popup(targetString);}else{obj.href=obj.rel;}
4949 }
5050 //・中身の切り出し
5151 function returnString(num){
5252 var obj=getDTfromAnc(num);
53- setSearchColor(obj);//ポップアップ先の着色
5453 if(!obj){return("")} //対象が透明あぼ〜んなら終了
55- var dt=obj.cloneNode(true);
56- var dtOuter=dt.outerHTML.replace(/name=.*?>/,">"); // LABELNUMBER対応のものに係るリンクアンカーの除去
57- var dd=obj.nextSibling.cloneNode(true);
54+ var dt,dd,dtOuter,ddOuter;
55+ dt=obj.cloneNode(true);
56+ dtOuter=dt.outerHTML.replace(/name=.*?>/,">"); // LABELNUMBER対応のものに係るリンクアンカーの除去
57+ dd=obj.nextSibling.cloneNode(true);
5858 if(dd.hasChildNodes()){
5959 while(dd.lastChild.name){dd.lastChild.removeNode(true)} // LABELNUMBER非対応のものに係るリンクアンカーの除去
6060 if(dd.lastChild.tagName=="DL"){dd.lastChild.removeNode(true)} // 逆参照の除去
6161 }
62- var ddOuter=dd.outerHTML;
62+ ddOuter=dd.outerHTML;
6363 return(dtOuter+ddOuter);
6464 }
6565 //・ポップアップ
66-var pb;
6766 function popup(inner){
6867 if(!pb){document.body.insertAdjacentHTML('afterBegin','<div id="popupBase"></div>');pb=document.getElementById("popupBase")}
6968 //要素の作成
7069 var parent=event.srcElement.parentElement;
71- //var aNum= (parent.tagName!="DD") ? parent.firstChild.sourceIndex : parent.previousSibling.firstChild.innerText; // DD以外=名前欄、画像、ID検索
72- var aNum=event.srcElement.sourceIndex;if(!aNum){alert("aNum取得エラー")}
70+ var aNum= (parent.tagName!="DD") ? parent.firstChild.sourceIndex : parent.previousSibling.firstChild.innerText; // DD以外=名前欄、画像、ID検索
7371 if(document.getElementById('p'+aNum)){return} // ポップアップしてたら終了
7472 pb.insertAdjacentHTML("beforeEnd",'<dl id="p'+aNum+'">'+inner+'</dl>');
7573 //要素の配置
@@ -77,16 +75,16 @@ function popup(inner){
7775 // y軸調整
7876 var pos=Math.min(event.y,document.body.clientHeight-event.y);
7977 var scTop=document.body.scrollTop+event.y;
80- if(pos==event.y){var y=scTop-30;} // カーソルの下へ表示
81- else {var y=scTop+10-p.clientHeight;} // カーソルの上へ表示
78+ if(pos==event.y){var y=scTop-30;} // 下
79+ else {var y=scTop+10-p.clientHeight;} // 上
8280 if(y<0){y=0}
83- if(event.srcElement.parentElement.tagName=="TT"){y+=35;}
81+ if(event.srcElement.parentElement.id=="foundResult"){y+=30}
8482 p.style.pixelTop=y;
8583 // x軸調整
8684 var pos=Math.min(event.x,document.body.clientWidth-event.x);
8785 var scLeft=document.body.scrollLeft+event.x;
88- if(pos==event.x){var x=scLeft-2} // カーソルの右へ表示
89- else {var x=scLeft-4-p.clientWidth;} // カーソルの左へ表示
86+ if(pos==event.x){var x=scLeft-2} // 右
87+ else {var x=scLeft-4-p.clientWidth;} // 左
9088 if(x<0){x=0}
9189 p.style.pixelLeft=x;
9290 // 高さ調整(scrollBarを要す場合と要しない場合がある)→y軸調整
--- a/res/skin/skin30-3G/chie_search.js
+++ b/res/skin/skin30-3G/chie_search.js
@@ -1,398 +1,243 @@
1-beID=false; // beにログイン出来る場合は、true
2-//==========検索設定
3-var expression="multiAND"; // 検索方法  default:標準、regExp:正規表現、multiAnd:AND検索、multiOR:OR検索
4-var searchView="resList"; // 検索結果表示  resList:該当レス番号表示、resPopup:該当レスポップアップ、
5-var resultView=false; // 検索結果の常時表示  true:常時表示、false:マウスで近づけたときのみ表示
6-var listLimit =10; // searchViewがresPopupでない場合の、レス番号の表示制限
7-//==========レス番号、日付文字列の着色設定
8-coloring=1; // 着色する:1 着色しない:0
9-threshold1=[2,"#0000ff"]; // 書き込みが複数あるID のしきい値と色
10-threshold2=[5,"#aaaa00"]; // 書き込みが多数あるID のしきい値と色
11-threshold3=[8,"#ff0000"]; // 書き込みが多数あるID のしきい値と色
12-threshold4=[1,"#0000FF"]; // 書き込みがある レス のしきい値とレス番号の色
13-threshold5=[4,"#aaaa00"]; // 書き込みが多数あるレス のしきい値とレス番号の色
14-threshold6=[7,"#ff0000"]; // 書き込みが多数あるレス のしきい値とレス番号の色
15-//==========名前・ID検索によるレスの帯の色指定(16進数又はWeb形式の色名で指定。いくつでも可。アルファベットは小文字でお願い)
16-var foundResColor =new Array("#ffdfee","#eeffdf","#ffeedf","#dfffee","#eedfff","#ffffe1");
17-//==========単語検索によるハイライト色指定(同上)
18-var highlightColor=new Array("#ffff66","#a0ffff","#99ff99","#ff9999","#ff66ff","#880000","#00aa00","#886800","#004699","#990099");
19-//==========以下はスクリプト本文ですよ。
20-// イベントハンドラ:onClick,onScroll,onMousemove
21-// 外部関数:addAnchor,checkAnchor,tohan,searchPopup
22-// 外部変数:anchorHead,browser,fp
23-// 逆参照の特徴:イベント発生DTに対応するDD下に、DL-DT-DD構造を作成する。
1+// 日付文字列の着色設定 着色する:1 着色しない:0
2+coloring=1;
3+threshold1=[2,"#0000FF"]; // 書き込みが複数あるID のしきい値と色
4+threshold2=[5,"#FF0000"]; // 書き込みが多数あるID のしきい値と色
5+threshold3=[1,"#0000FF"]; // 書き込みがある レス のしきい値とレス番号の色
6+threshold4=[4,"#FF0000"]; // 書き込みが多数あるレス のしきい値とレス番号の色
7+// イベントハンドラ:onClick
8+// 外部関数:addAnchor,checkAnchor,tohan
9+// 外部変数:anchorHead,browser
10+// 特徴:イベント発生DTに対応するDD下に、DL-DT-DD構造を作成する。
2411 //==========CSSの出力
2512 var nCSS='';
26-nCSS+='#foundPanel {position:absolute;top:expression(body.scrollTop+25);right:18px;padding:2px 5px;z-index:6;background-color:white;border:1px solid #999;visibility:hidden}';
27-nCSS+='#foundPanel div{padding-left:5px;text-align:right;font-size:100%;}';
13+nCSS+='#foundResult{position:absolute;top:expression(body.scrollTop+25);right:18px;padding:2px 5px;z-index:6;background-color:white;border:1px solid #999}';
2814 nCSS+='.refResult{margin:0.5em 0.3em; border:1px solid #666;padding-right:0px}';
2915 nCSS+='.refResult{border-top:none}';
3016 nCSS+='.refResult dt{margin-right:0px;}';
3117 nCSS+='.refResult dd{margin-left:0.8em;}';
3218 document.write('<style type="text/css">'+nCSS+'</style>\n');
19+//==========検索による色指定(16進数又はWeb形式の色名で指定。いくつでも可)
20+var foundColor = new Array("#ffdfee","#eeffdf","#ffeedf","#dfffee","#eedfff","#ffffe1");
3321 var nCSS='';
34-for(var css in foundResColor){
35- var c=foundResColor[css].replace(/#/,"");
36- nCSS+='#COLOR'+c+" a{border-color:"+foundResColor[css]+"}\n";
37- nCSS+='#COLOR'+c+" a:hover{border-color:red}\n";
22+for(var css=0;css<foundColor.length;css++){
23+ nCSS+='#COLOR'+css+" a{border-color:"+foundColor[css]+"}";
24+ nCSS+='#COLOR'+css+" a:hover{border-color:red}";
3825 }
3926 document.write('<style type="text/css">'+nCSS+'</style>\n');
40-//=========外部ファイル共用のグローバル変数
27+//==========グローバル変数
4128 var dts=document.getElementsByTagName('DT');
4229 var dds=document.getElementsByTagName('DD');
43-var idHash=new Array(); var refHash=new Array();
44-var foundRes,highlight;
30+var fR;
4531 //==========IDと参照をハッシュに格納
46-// 配列のハッシュより軽いっぽいので、空白区切りの値による単純なハッシュにしてみるテスト。
47-// setEndIdx:本文の同レスを重複処理しないように、Hash化位置としてのdtsの最終indexを記憶
48-// setEndNum:本文以外レスを重複処理しないように、最終レス番号を記憶
49-var setEndIdx=setEndNum=0;
32+var idHash=new Array(); var refHash=new Array(); var searchEnd=0;
5033 function setHash(){
51- //var t0=new Date();
52- var l=Math.min(dts.length,dds.length);
53- var lastNum=l ? parseInt(dts[l-1].firstChild.innerText) : 0;
54- if(isNaN(lastNum)&&l>1){lastNum=parseInt(dts[l-2].firstChild.innerText)} //Footerありなら一つ前
55- if(l==0 || lastNum<=setEndNum){return} // 最後まで調査済みなら回避
56- for(var i=setEndIdx;i<l;i++){
34+ var l=dts.length;
35+ if(dts[l-1].rel=="setEnd"){return} // 最後まで調査済みなら回避
36+ for(var i=searchEnd;i<l;i++){
5737 if(dds[i].parentElement.className=="refResult"){continue} // 逆参照内のDDなら回避
5838 var num=dts[i].firstChild.innerText; var span=dts[i].lastChild;
5939 // ID
60- var t=getID(span); if(t&&t.length>3){idHash[t] = idHash[t] ? idHash[t]+" "+num : num;} // ???やID:0,ID:#(@ゾヌ)はスルー。
61- // 画像板
62- var imgURL=getIMG(span);
63- if(imgURL){
64- var dd=dts[i].nextSibling;
65- if(tp && imgURL && !dd.getElementsByTagName("IMG").length){
66- var aObj=(dd.innerText)?'<br><a href="'+imgURL+'">'+imgURL+'</a>':'<a href="'+imgURL+'">'+imgURL+'</a>';
67- if(!beID && imgURL.match(/kako/)){/*dd.insertAdjacentHTML("beforeEnd","<br>Beにログインしてないと取得できません");*/}else{dd.insertAdjacentHTML("beforeEnd",aObj)}
68- }
69- }
70- // ref,IMG
40+ var t=getID(span); idHash[t] = idHash[t] ? idHash[t]+" "+num : num;
41+ // ref
7142 var ddAnc=dds[i].getElementsByTagName("A");
72- for(var j=0;j<ddAnc.length;j++){
73- if (checkAnchor(ddAnc[j].href)==0){
74- continue;
75- }else if(checkAnchor(ddAnc[j].href)==1){
76- var anc=tohan(ddAnc[j].innerText.replace(/[>>]/g,""));var start,end;
77- if(anc.match(/(\d*)\D+(\d*)/)){
78- start=parseInt(RegExp.$1); end=parseInt(RegExp.$2);
79- if( (end-start>100) || (num-end<4 && start==1) ){continue} // >>1-1000とか>>1-n(直前レス)とかは華麗にスルー
80- }else{
81- start=end=parseInt(anc);
43+ for(var j=ddAnc.length;j--;){
44+ if(checkAnchor(ddAnc[j].href)!=1){continue}
45+ var anc=tohan(ddAnc[j].innerText.replace(/[>>]/g,""));
46+ if(anc.match(/(\d*)\D+(\d*)/)){
47+ var start=parseInt(RegExp.$1); var end=parseInt(RegExp.$2);
48+ if(end-start>100){continue} // >>1-1000とかは華麗にスルー
49+ else if(num-end<3 && start==1){continue} // >>1-n(直前レス)は氏ね,とかもスルー
50+ for(var k=start;k<=end;k++){
51+ if(refHash[k] && refHash[k].indexOf(num)!=-1){continue} // 重複はスルー
52+ if(num>=k){refHash[k]=refHash[k] ? refHash[k]+" "+num : num;} // 未来へのアンカーはスルー
8253 }
83- var k=start-1;do{k++;
84- if((!refHash[k] || refHash[k].indexOf(num)==-1) && num>k){refHash[k]=refHash[k] ? refHash[k]+" "+num : num;} // 重複や未来へのアンカーはスルー
85- }while(k<end);
86- }else if(imageExt2(ddAnc[j].href) && onOpenLoad!=0){
87- if(onOpenLoad==1){if(dds[i].previousSibling.className!="new"){continue}}
88- insButton(ddAnc[j],ddAnc[j].href);
54+ }else{anc=parseInt(anc);
55+ if(refHash[anc] && refHash[anc].indexOf(num)!=-1){continue} // 重複はスルー
56+ if(num>=anc){refHash[anc]=refHash[anc] ? refHash[anc]+" "+num : num;} // 未来へのアンカーはスルー
8957 }
9058 }
9159 }
92- setEndIdx=l;setEndNum=lastNum;
93- //var t1=new Date(); var t=(t1-t0)/1000; if(t){alert(t+"秒");}
94-}
95-// スレッドウィンドウ中心に前後5レスを着色
96-var resUnit=new Array();
97-function searchColoring(){
60+ dts[l-1].rel="setEnd"; searchEnd=l;
9861 if(!coloring){return;} // 着色不要なら終了
99- if(!scr){scr=lightmode ? document.body : document.getElementById("dl");}
100- var nowScrollPos=scr.scrollTop+document.body.clientHeight/2;
101- var l=Math.min(dts.length,dds.length);var st,ed;
102- // dtのoffsetTopを格納(25レス単位)
103- if(resUnit.length<=Math.floor(dts.length/25)){resUnit[0]=0;
104- for(var i=25;i<l;i+=25){resUnit[i/25]=dts[i].offsetTop;}
105- }
106- // 現在どのあたりまでスクロールしてるか調査
107- var rul=resUnit.length-1;
108- if (rul==0) {st=0;ed=l-1;} //25未満
109- else if(resUnit[0]>nowScrollPos) {st=0;ed=24;} //0-24
110- else if(resUnit[rul]<nowScrollPos){st=l-26;ed=l-1;} // 最終25レス
111- else{
112- for(var i=rul;i--;){
113- if(resUnit[i+1]>nowScrollPos&&resUnit[i]<=nowScrollPos){st=i*25;ed=st+25;break}
62+ for(var i=l;i--;){
63+ if(!dts[i].innerText){continue}
64+ //if(dts[i].innerText.match(/id:/i)){ // IDがない板で、高速化するかも?
65+ var span=dts[i].lastChild; var t=getID(span); if(browser=="ホットゾヌ2"){span=span.lastChild}
66+ if(t && idHash[t] && span){
67+ var idResult=idHash[t].split(/\s/); if(t.match(/\?\?\?/)){idResult="";idHash[t]="";}
68+ if (idResult.length>=threshold2[0]){span.style.color=threshold2[1];span.title="同一ID ("+idResult.length+"回)\n"+idHash[t]}
69+ else if(idResult.length>=threshold1[0]){span.style.color=threshold1[1];span.title="同一ID ("+idResult.length+"回)\n"+idHash[t]}
70+ else if(idResult.length==1){span.title="同一IDは\nありません"}
71+ }
72+ //}
73+ var imgURL=getIMG(span);
74+ if(imgURL){dds[i].insertAdjacentHTML("afterBegin",'<img src="'+imgURL+'"><br>')}
75+ //
76+ var numA=dts[i].firstChild; var num=numA.innerText;
77+ if(refHash[num]){
78+ var refResult=refHash[num].split(/\s/);
79+ if (refResult.length>=threshold4[0]){numA.style.color=threshold4[1];dts[i].title="これへのレス ("+refResult.length+"個)\n"+refHash[num];}
80+ else if(refResult.length>=threshold3[0]){numA.style.color=threshold3[1];dts[i].title="これへのレス ("+refResult.length+"個)\n"+refHash[num];}
81+ else{numA.title="これへのレスはない模様"}
11482 }
11583 }
116- // 現在の範囲内からウィンドウの真ん中あたりに表示してるレスを取得(ここで着色すると、25レス単位の切替時に数レスが着色されない)
117- var dtIdx=0; //if(cp){cp.childNodes[1].value=(st+1)+"-"+(ed+1);cp.style.visibility="visible";}
118- for(var i=st;i<=ed;i++){if(!dts[i+1]){dtIdx=ed;break;}
119- if(dts[i+1].offsetTop>nowScrollPos && dts[i].offsetTop<=nowScrollPos){dtIdx=i;break;}
120- }
121- // dtIdxからその周辺を特定
122- var start=dtIdx-5;var end=dtIdx+5;//
123- for(var i=start;i<=end;i++){
124- if(dts[i]){setSearchColor(dts[i])}
125- }
12684 }
127-// IDHash、refHashを元に着色
128-function setSearchColor(dt){
129- if(!dt.innerText){return}
130- // ID
131- var span=dt.lastChild; var t=getID(span);//alert(t +"&&"+ idHash[t] +"&&"+ span);
132- if (browser=="ホットゾヌ2"){span=span.lastChild}
133- else if(browser=="A Bone") {span=span.childNodes[1]}
134- if(t && idHash[t] && span){
135- var idResult=idHash[t].split(" "); if(t.match(/\?\?\?/)){idResult="";idHash[t]="";}
136- if (idResult.length>=threshold3[0]){span.style.color=threshold3[1];span.title="同一ID ("+idResult.length+"回)\n"+idHash[t]}
137- else if(idResult.length>=threshold2[0]){span.style.color=threshold2[1];span.title="同一ID ("+idResult.length+"回)\n"+idHash[t]}
138- else if(idResult.length>=threshold1[0]){span.style.color=threshold1[1];span.title="同一ID ("+idResult.length+"回)\n"+idHash[t]}
139- else if(idResult.length==1){span.title="同一IDは\nありません"}
140- }
141- // ref
142- var numA=dt.firstChild; var num=numA.innerText;
143- if(refHash[num]){
144- var refResult=refHash[num].split(" ");
145- if (refResult.length>=threshold6[0]){numA.style.color=threshold6[1];dt.title="これへのレス ("+refResult.length+"個)\n"+refHash[num];}
146- else if(refResult.length>=threshold5[0]){numA.style.color=threshold5[1];dt.title="これへのレス ("+refResult.length+"個)\n"+refHash[num];}
147- else if(refResult.length>=threshold4[0]){numA.style.color=threshold4[1];dt.title="これへのレス ("+refResult.length+"個)\n"+refHash[num];}
148- else{numA.title="これへのレスはない模様"}
149- }
85+var regIMG=new RegExp(".*?\\s.*?\\s.*:.*?\\sIMG:(.*?)(\\s|$)"); // 画像も可能にしてみる
86+function getIMG(obj){
87+ if(regIMG.test(obj.innerText)){
88+ var filename=RegExp.$1;
89+ var tmp=filename.match(/(\d\d\d\d)(\d\d\d\d)(\d\d)/);
90+ var fileurl="http://up01.2ch.io/_img/"+RegExp.$1+"/"+RegExp.$1+RegExp.$2+"/"+RegExp.$3+"/"+filename;
91+ return(fileurl)
92+ }else{return(false)}
15093 }
15194 //==========名前・ID検索等
152-function searchPerson(obj){
153- var by,thisDT,reg;
154- if (obj.tagName=="DT") {by="ID"; thisDT=obj; reg=getID(obj)}
155- else if(obj.tagName=="SPAN"){by="ID"; thisDT=obj.parentElement;reg=getID(obj)}
156- else if(obj.tagName=="U") {by="NAME";thisDT=obj.parentElement; reg=obj.innerHTML.replace(/<B>(.*?)<\/B>/ig,"");if(!reg){reg=RegExp.$1.replace(/<.*?A.*?>/ig,"")}/*名前が数字*/}
157- else if(obj.tagName=="B") {by="NAME";thisDT=obj.parentElement.parentElement;reg=obj.innerText}
158- else{return}
159- if(!thisDT.rel){
160- var c=selectColor("res"); if(!c){return} var color=new Array(c); // カラー選択
161- if(by=="ID"){
162- if(!reg || !idHash[reg]){return} // IDなし、ID:???、本文中の他スレのコピペID
163- // 検索ハッシュに値を設定して、それに基づきレス着色
164- foundRes[c]=idHash[reg].split(" "); foundRes[c].word="ID:"+reg;
165- for(i in foundRes[c]){var dt=getDTfromAnc(foundRes[c][i]);toggleResColor(dt,c);}
166- }else{
167- var us=document.getElementsByTagName("U"); var l=us.length;
168- var regName=new RegExp();regName.compile(reg);
169- // ループ中にレス着色・値の設定を同時実行
170- for(var i=l;i--;){var dt=us[i].parentElement;
171- if(dt.parentElement.className=="refResult"){continue} // 逆参照内のDTなら回避
172- if(regName.test(us[i].innerText)){toggleResColor(dt,c);foundRes[c].unshift(dt.firstChild.innerText);}
173- }
174- foundRes[c].word=reg;
175- }
176- returnFound("res",color);
95+// IDの検索・削除
96+function searchID(obj){
97+ var singleColor=event.altKey;
98+ var decoy=obj.parentElement ? obj.parentElement : obj;
99+ var reg=getID(obj);
100+ if(!decoy.id.match(/^COLOR/)){
101+ if(!idHash[reg]){return}
102+ var target=new Array();target=idHash[reg].split(" ");
103+ // カラー選択
104+ var c = singleColor ? 0 : selectColor();
105+ if (c=="restart"){c=0;singleColor=true}
106+ else if(c=="exit"){return;}
107+ // 検索
108+ for(i in target){var dt=getDTfromAnc(target[i]);activate(dt,c);}
109+ foundReturn(target);
177110 }else{
178- clearColor("res",thisDT.style.backgroundColor);
111+ clearResult(obj);return;
179112 }
180113 }
181-// ID文字列の抽出
182-var regID=new RegExp(); // HOSTも可能にしてみる
183-regID.compile(".*?\\s.*?\\s.*:(.*?)(\\s|$)"); // 1000resで0.02秒ほど高速
184-function getID(span){
185- if(regID.test(span.innerText)){return(RegExp.$1)}else{return(false)}
186-}
187-//==========色設定解除
188-// オブジェクトの初期化
189-function createHash(name,key,arr,word){
190- name[key]=arr?arr:new Array();
191- name[key].word=word?word:"";
192- name[key].justMovedRes=undefined;
193-}
194-// 色選択(該当レス番号配列を持たないキーを返す)
195-function selectColor(type){
196- if(!foundRes) {foundRes =new Array();for(var i in foundResColor) {createHash(foundRes,foundResColor[i]);}} // Hash foundRes ={色:該当レス番号配列}
197- if(!highlight){highlight=new Array();for(var i in highlightColor){createHash(highlight,highlightColor[i]);}} // Hash hightLight={色:該当レス番号配列}
198- var cHash,cArray,cMess;
199- if(type=="res"){cHash=foundRes; cArray=foundResColor; cMess="今までのレス着色を解除しますか?";}
200- else {cHash=highlight;cArray=highlightColor;cMess="今までのハイライトを解除しますか?";}
201- var i=0; while(cHash[cArray[i]].word){
202- i++; if(i==cArray.length){if(confirm(cMess)){clearColor(type);i=0;break}else{i=null;break}}
203- }
204- return(cArray[i]);
114+// IDポップアップ
115+function searchPopup(obj){
116+ var objs=document.getElementsByTagName(obj.tagName);
117+ var reg=getID(obj);if(!reg){return}
118+ var target=idHash[reg].split(" ");
119+ if(target.length==1){return}
120+ if(!obj.rel){obj.rel=obj.href;} obj.href="decoy:";
121+ var targetString=""; for(i in target){targetString+=returnString(target[i])} //中身の切り出し
122+ if(targetString){popup(targetString);}else{obj.href=obj.rel;} //対象が存在したらrelに退避してポップアップ
205123 }
206-// 色解除(ハッシュ、対象、foundPanel)
207-function clearColor(type,color){
208- var cHash=(type=="res")?foundRes:highlight;
209- if(event && event.altKey){color=""}
210- for(var i in cHash){
211- if(type=="res"){
212- if(color && i!=color){continue} // 指定色でなければスルー
213- for(var j in cHash[i]){
214- if(event.srcElement.value=="DEL"){removeRes(getDTfromAnc(cHash[i][j]))}else{toggleResColor(getDTfromAnc(cHash[i][j]))}
215- }
216- cHash[i]=new Array();
217- document.getElementById("c"+i).removeNode(true);
218- }else{
219- var strongs=document.getElementsByTagName("STRONG");
220- var reg=new RegExp(i);
221- if(!color.match(i)){continue} // 指定色でなければスルー
222- for(var j=0;j<strongs.length;j++){
223- if(strongs[j].style.backgroundColor==i){
224- if(event.srcElement.value=="DEL"){removeRes(strongs[j].parentElement.previousSibling);j--}else{strongs[j].removeNode(false);j--}
225- }
226- }
227- cHash[i]=new Array();
228- if(document.getElementById("c"+i)){document.getElementById("c"+i).removeNode(true);} // and,or検索で1色目のみ
124+// 名前の検索・削除
125+function search(obj){
126+ var singleColor=event.altKey;
127+ var objs=document.getElementsByTagName(obj.tagName);
128+ var reg=obj.innerText; var target="objs[i].innerText"; //名前・トリップ
129+ var decoy=obj.parentElement ? obj.parentElement : obj;
130+ if(!decoy.id.match(/^COLOR/)){
131+ // カラー選択
132+ var c = singleColor ? 0 : selectColor();
133+ if (c=="restart"){c=0;singleColor=true}
134+ else if(c=="exit"){return;}
135+ // 検索
136+ var found=new Array; var l=objs.length;
137+ for(var i=l;i--;){
138+ var dt=objs[i].parentElement; if(dt.parentElement.className=="refResult"){continue} // 逆参照内のDTなら回避
139+ if(eval(target)==reg){activate(dt,c);found.unshift(dt.firstChild.innerText);}
140+ else if(singleColor) {deactivate(dt)}
229141 }
230- }
231- if(!fp.hasChildNodes()){fp.style.visibility="hidden";searched=false;}
232-}
233-// レス色トグル
234-function toggleResColor(dt,c){
235- if(!dt){return} // for-inで送られる番号以外のobjなら終了
236- if(c){
237- dt.rev=dt.style.backgroundColor;
238- dt.rel="colored";
239- dt.id ="COLOR"+c.replace(/#/,"");
240- dt.style.backgroundColor=c;
142+ foundReturn(found);
241143 }else{
242- dt.style.backgroundColor=dt.rev;
243- if(dt.id.match(/COLOR/)){dt.removeAttribute("id")}//else{alert("dtにCOLOR***以外のid("+dt.id+")が設定されています")}
244- dt.removeAttribute("rev");
245- dt.removeAttribute("rel");
144+ clearResult(obj);return;
246145 }
247146 }
248-// 検索結果に基づき消去
249-function removeRes(dt){if(!dt){return} // cHash[i][j]=ID:xxxxxxxxのとき
250- if(browser=="Live2ch"){location.href='func:ABONECLEAR?'+dt.firstChild.innerText;} // Liveのみ-透明あぼ〜ん
251- dt.nextSibling.removeNode(true);dt.removeNode(true);
147+
148+// ID文字列の抽出
149+//var regID=new RegExp("ID:(.*)$");
150+var regID=new RegExp(".*?\\s.*?\\s.*:(.*?)(\\s|$)"); // HOSTやらしたらばも可能にしてみる
151+function getID(obj){
152+ if(regID.test(obj.innerText)){return(RegExp.$1)}else{return(false)}
153+}
154+// 色設定
155+function activate(obj,c){
156+ var color=foundColor[c];
157+ obj.rev=obj.style.backgroundColor;
158+ obj.style.backgroundColor=color;
159+ obj.id="COLOR"+c; // 同一idが複数生じるがByNameではdtのnameから取得できないためやむなし
252160 }
253-//==========結果表示
254-// レス番号リスト(ポップアップアンカーを含む)
255-function returnFound(type,color){
256- var cHash=(type=="res")?foundRes:highlight;
257- var nDIV="";var numArray=cHash[color[0]]; var display=new Array(["none","POP"],["inline","LST"]);
258- if(searchView=="resPopup" || numArray.length>=listLimit){display=display.reverse();}
259- // ポップアップ
260- var nTT="";for(var i=0;i<color.length;i++){nTT+='<tt style="background-color:'+color[i]+'"> '+cHash[color[i]].word+'</tt>';}
261- nDIV+='<span rel="'+type+'" style="display:'+display[0][0]+'">'+nTT+'</span>';
262- // リスト
263- var nA="";for(var i=0;i<numArray.length;i++){nA+=addAnchor(numArray[i],numArray[i])+" "}
264- nDIV+='<tt style="background-color:'+color[0]+'" style="display:'+display[1][0]+'"> '+nA+'</tt>';
265- // 個数
266- nDIV+='&nbsp;'+numArray.length+' ';
267- var buttons='<input type="button" value="'+display[0][1]+'" onclick="changeSearchView();blur()"><input type="button" value="∨" onclick="moveToSearchRes(\''+type+'\',\''+color+'\')" title="下へ検索"><input type="button" value="∧" onclick="moveToSearchRes(\''+type+'\',\''+color+'\')" title="上へ検索"><input type="button" value="CLR" onclick="clearColor(\''+type+'\',\''+color+'\')" title="Alt押下時\n着色レス全て"><input type="button" value="DEL" onclick="clearColor(\''+type+'\',\''+color+'\')" title="Alt押下時\n着色レス全て">';
268- fp.innerHTML+='<div id="c'+color[0]+'">'+nDIV+buttons+'</div>';
269- fp.style.visibility="visible";searched=true;
161+// 色復帰
162+function deactivate(obj){if(!obj){return}
163+ obj.style.backgroundColor=obj.rev;
164+ if(obj.id!="sizeinfo"){obj.removeAttribute("id");}
165+ obj.removeAttribute("rev");
166+ obj.removeAttribute("title");
270167 }
271-// 対象レスにジャンプ
272-var markedDT;
273-function moveToSearchRes(type,color){
274- if(color.match(/(.*?),/)){color=RegExp.$1}
275- var scope = (event && event.srcElement.value=="∧") ? false : true ;
276- var numArray= (type=="res") ? foundRes[color] : highlight[color];
277- if(isNaN(numArray.justMovedRes)){numArray.justMovedRes=0}
278- else{
279- markedDT.style.borderColor="#999";
280- if(scope){numArray.justMovedRes++;if(numArray.justMovedRes>=numArray.length){numArray.justMovedRes--;alert("これより下にはありません")}}
281- else {numArray.justMovedRes--;if(numArray.justMovedRes<0){numArray.justMovedRes++;alert("これより上にはありません")}}
168+// カラー選択
169+function selectColor(){
170+ var c=0;
171+ while(document.getElementById("COLOR"+c)){
172+ c++;
173+ if(!foundColor[c]){if(confirm("色を初期化しますか?")){return("restart")}else{return("exit")}}
282174 }
283- markedDT=getDTfromAnc(numArray[numArray.justMovedRes]); markedDT.style.borderColor="red";
284- markedDT.scrollIntoView(true);
285- setTimeout('markedDT.style.borderColor="#999"',5000);
175+ return(c);
286176 }
287-// ポップアップとリスト表示切り替え
288-function changeSearchView(){
289- var e=event.srcElement;
290- if(e.value=="POP"){
291- e.value="LST";
292- e.parentElement.childNodes[0].style.display="inline";
293- e.parentElement.childNodes[1].style.display="none";
177+// 結果表示
178+function foundReturn(found){
179+ if(!fR){document.body.insertAdjacentHTML('afterBegin','<div id="foundResult"></div>');fR=document.getElementById("foundResult");}
180+ //dtのtitleに
181+ for(var i=found.length;i--;){dt=getDTfromAnc(found[i]);dt.title=found.join(" ");}
182+ //foundResultに
183+ var buttons='<input type="button" value="CLR" onclick="clearResult(this)" title="Alt押下時\n着色レス全て"><input type="button" value="DEL" onclick="clearResult(this)" title="Alt押下時\n着色レス全て">';
184+ if(found.length>=20 && confirm("20以上あるけど表示する?")==false){
185+ fR.innerHTML=buttons; fR.title=found.join(" ");
294186 }else{
295- e.value="POP";
296- e.parentElement.childNodes[0].style.display="none";
297- e.parentElement.childNodes[1].style.display="inline";
187+ for(var i=0;i<found.length;i++){found[i] = addAnchor(found[i],found[i])}
188+ fR.innerHTML=found.join(" ")+buttons;
298189 }
190+ fR.style.visibility="visible";
299191 }
300-
301-//==========単語検索
302-function findIt(arg){createSearchPanel(arg);}
303-var searchWindow=null;
304-// 検索ウィンドウの表示
305-function createSearchPanel(arg){ // 専用ブラウザでのmodelessDialogへの外部読み込みでは、dialogArgumentsが送れないので直接書き出す
306- if(arg){word=arg}
307- if(searchWindow && !searchWindow.closed){return}
308- var skinPath=document.getElementsByName("SkinPath")[0].content;
309- searchWindow=showModelessDialog("",window,'dialogWidth:500px;dialogHeight:200px;dialogTop:0px;dialogLeft:0px;help:no;resizable:yes;status:no;unadorned:yes;');
310- var nWin='<html><head><title>単語の検索<\/title>'
311- +'<script type="text/javascript">function submitEvent(){var fo=document.forms[0]; dialogArguments.word=fo.word.value; var i=-1;do{i++;dialogArguments.expression =fo.expression[i].value;}while(!fo.expression[i].checked); var i=0; while(fo.searchTarget[i]){dialogArguments.searchTarget[fo.searchTarget[i].value]=fo.searchTarget[i].checked;i++;} var i=-1;do{i++;dialogArguments.searchView =fo.searchView[i].value;}while(!fo.searchView[i].checked); dialogArguments.searchWord();}</script>'
312- +'<style type="text/css">body{background:ThreeDFace;padding:0.5em;overflow:auto} fieldset{padding:0.5em;margin-top:0.5em;} legend,label,input{font:message-box;}</style>'
313- +'<\/head><body onunload="unloadEvent()"><form onsubmit="submitEvent();return false;"><table width="100%"><tr><td valign="top" colspan="3">'
314- +'<label for="word">検索文字列:</label><input type="text" name="word" id="word" size="50" value="'+word+'" tabindex="0"><br>'
315- +'</td><td align="right" valign="top" rowspan="2">'
316- +'<input type="submit" name="submit" value=" 検 索 " tabindex="7"><br><br><input type="button" name="cancel" value="キャンセル" onclick="window.close()" tabindex="8">'
317- +'</td></tr><tr valign="top">'
318- +'<td><fieldset><legend>検索方法</legend><input type="radio" name="expression" value="default" id="tDef" tabindex="1"> <label for="tDef">通常検索</label><br><input type="radio" name="expression" value="regExp" id="tReg"> <label for="tReg">正規表現</label><br><input type="radio" name="expression" value="multiAND" id="tAND"> <label for="tAND">AND検索</label><br><input type="radio" name="expression" value="multiOR" id="tOR"> <label for="tOR">OR検索</label></fieldset></td>'
319- +'<td><fieldset><legend>検索対象</legend><input type="checkbox" name="searchTarget" value="name" id="tName" tabindex="2" checked> <label for="tName">名前</label><br><input type="checkbox" name="searchTarget" value="mail" id="tMail" tabindex="3" checked> <label for="tMail">メール</label><br><input type="checkbox" name="searchTarget" value="id" id="tID" tabindex="4" checked> <label for="tID">日付とID</label><br><input type="checkbox" name="searchTarget" value="mess" id="tMess" tabindex="5" checked> <label for="tMess">本文</label></fieldset></td>'
320- +'<td><fieldset><legend>結果表示</legend><input type="radio" name="searchView" value="resList" id="rList" tabindex="6"> <label for="rList">レス番号を表示</label><br><input type="radio" name="searchView" value="resPopup" id="rPop"> <label for="rPop">レスをポップアップ</label><br><input type="radio" name="searchView" value="resJump" id="rJump"> <label for="rJump">レスへジャンプ</label></fieldset></td>'
321- +'</tr></table></form><\/body><\/html>';
322- searchWindow.document.write(nWin);
323- sdf=searchWindow.document.forms[0]; sdf.elements[0].select();
324- var ex=sdf.expression;for(var i=0;i<ex.length;i++){if(ex[i].value==expression){ex[i].checked=true}}
325- var sv=sdf.searchView;for(var i=0;i<sv.length;i++){if(sv[i].value==searchView){sv[i].checked=true}}
326- range=document.body.createTextRange();
327-}
328-// 検索処理メイン
329-var word="";var range;var searchTarget={"word":true};
330-function searchWord(){
331- if(!word){return}
332- var matchs=new Array(); var color=new Array();
333- // 検索方法
334- if(expression=="regExp" || expression=="default" || (expression.match(/multi/) && !word.match(/\s/))){ // AND/ORで一単語ならdefaultで検索
335- // 検索語指定(重複排除で高速化?)
336- if(expression=="regExp"){
337- var regWord=word.replace(/[\^\$]/g,"");
338- var reg=new RegExp(regWord,"g"); var tmpArr=range.text.match(reg); var tmp;
339- if(!tmpArr || !tmpArr.length){tmpArr=new Array(tmpArr)} // 検索結果0or1なら、配列作成
340- tmpArr.sort();for(var i=0;i<tmpArr.length;i++){if(tmp!=tmpArr[i]){matchs.push(tmpArr[i])}tmp=tmpArr[i]}
341- if(!matchs || !matchs.length){matchs[0]=word} // 検索結果0or1なら、配列作成
342- }else{matchs[0]=word}
343- // ハイライト
344- for(var i=0;i<matchs.length;i++){color.push(setHighlight(matchs[i]));}
345- highlight[color[0]].word=word;
192+// 結果消去、結果削除
193+function clearResult(obj){
194+ var fromObj=obj.parentElement;
195+ var singleColor=event.altKey;
196+ var result=new Array();var arrayElement; var numbers=fromObj.title ? fromObj.title : fromObj.innerText;
197+ if(singleColor){result=dts; arrayElement="result[i]";}
198+ else {result=numbers.split(" ");arrayElement="getDTfromAnc(result[i])";}
199+ var l=result.length;
200+ if(!result[0]){
201+ /* 検索結果ゼロでもresultがnullにならない対策 */
202+ }else if(event.srcElement.value!="DEL"){
203+ for(var i=l;i--;){
204+ var dt=eval(arrayElement);
205+ deactivate(dt);
206+ }
346207 }else{
347- // 検索語指定
348- var matchs=word.split(" "); var tmpArr=new Array(); var tmp;
349- // ハイライト→重複処理
350- for(var i=0;i<matchs.length;i++){
351- color.unshift(setHighlight(matchs[i]));
352- highlight[color[0]].word=matchs[i];
353- tmpArr=tmpArr.concat(highlight[color[0]])
208+ for(var i=l;i--;){
209+ var dt=eval(arrayElement); var dd=dt.nextSibling;
210+ //Live機能追加 - 透明あぼ〜ん
211+ if(browser=="Live2ch"){location.href='func:ABONECLEAR?'+dt.firstChild.innerText;}
212+ dt.removeNode(true); dd.removeNode(true);
354213 }
355- color.reverse();tmpArr.sort();createHash(highlight,color[0],"",matchs[0]); // 一旦初期化
356- var judge = (expression=="multiAND") ? "tmp==tmpArr[i]" : "tmp!=tmpArr[i]";
357- for(var i=0;i<tmpArr.length;i++){if(eval(judge)){highlight[color[0]].push(tmpArr[i])}tmp=tmpArr[i]} // 検索結果はhighlight[color[0]]に入れる
358214 }
359- // 結果表示
360- if (searchView=="resList") {returnFound("search",color);searchWindow.close();}
361- else if(searchView=="resPopup"){returnFound("search",color);searchWindow.close();}
362- else if(searchView=="resJump") {returnFound("search",color);searchWindow.close();if(highlight[color[0]].length){moveToSearchRes("search",color.join(","))}}
215+ if(fR){fR.innerText="";fR.style.visibility="hidden";}
363216 }
364-// ハイライト検索
365-function setHighlight(reg){
217+
218+//==========単語検索
219+function findIt(word){
220+ if(!word){
221+ var word = prompt("検索する文字を入力してください。","");
222+ word = unescape(escape(word).split("%00")[0]); //IE5のバグ対策
223+ }
224+ if(!word || word=="null"){return}
366225 // カラー選択
367- var c=selectColor("highlight"); if(!c){return}
226+ var singleColor=event.altKey;
227+ var c = singleColor ? 0 : selectColor();
228+ if (c=="restart"){c=0;singleColor=true}
229+ else if(c=="exit"){return;}
368230 // 検索
369- while(range.findText(reg)){
370- var dt=range.parentElement();var tag=dt.tagName; var thisRange;
371- // 検索対象で絞り込み
372- if(tag=="B"||tag=="U"){thisRange="name"}
373- else if(tag=="DT") {thisRange="mail"}
374- else if(tag=="SPAN") {thisRange="id"}
375- else if(tag=="DD" || tag=="A" && dt.parentElement.tagName=="DD"){thisRange="mess"}
376- else if(tag=="STRONG"){thisRange="word"}
377- else{/*alert("tag:"+tag+"\ndt:"+dt.outerHTML);*/range.collapse(false);continue;} // レス番号(A)や検索結果自体(TT)
378- if(!searchTarget[thisRange]){range.collapse(false);continue;}
379- // 正規表現の位置指定子がある場合、包含要素内部で再検索
380- if(expression=="regExp" && word.match(/[\^|\$]/)){
381- var thisReg=new RegExp(word); var targetText=(tag=="STRONG") ? dt.parentElement.innerText : dt.innerText;
382- if(!targetText.match(thisReg)){range.collapse(false);continue}
383- }
384- // dt取得→レス番号取得→ハイライト
385- if(dt.tagName!="DT"){
386- while(dt.tagName!="DT" && dt.tagName!="DD"){dt=dt.parentElement}
387- if(dt.tagName=="DD"){dt=dt.previousSibling}
388- }
389- var num=dt.firstChild.innerText;
390- if(dt.parentElement.className!="refResult" && num!=highlight[c][highlight[c].length-1]){highlight[c].push(num)} // 逆参照内のDT,同一番号なら回避
391- range.pasteHTML('<strong style="background-color:'+c+'">'+range.text+'</strong>');
392- range.collapse(false);
231+ var found=new Array; var l=dds.length;
232+ var bodyText=document.body.createTextRange();
233+ for(var i=l;i--;){
234+ var dt=dts[i]; var dd=dds[i]; if(dt.parentElement.className=="refResult"){continue} // 逆参照内のDTなら回避
235+ bodyText.moveToElementText(dt); var checkDT=bodyText.findText(word,0);
236+ bodyText.moveToElementText(dd); var checkDD=bodyText.findText(word,0);
237+ if(checkDT || checkDD){activate(dt,c);found.unshift(dt.firstChild.innerText)}
238+ else if(singleColor) {deactivate(dt);}
393239 }
394- range=document.body.createTextRange(); // レンジを元に戻しておく
395- return(c);
240+ if(found){foundReturn(found)}
396241 }
397242 //==========逆参照
398243 function searchRef(obj){
@@ -400,7 +245,16 @@ function searchRef(obj){
400245 var num=obj.firstChild.innerText;
401246 if(refHash[num]){
402247 var refArr=refHash[num].split(/\s/); var refs="";
403- for(var i=0;i<refArr.length;i++){refs+=returnString(refArr[i]);}
248+ for(var i=0;i<refArr.length;i++){
249+ var dtOrg=getDTfromAnc(refArr[i]); var dt=dtOrg.cloneNode(true); var dd=dtOrg.nextSibling.cloneNode(true);
250+ // 本文以外を削除
251+ if(dd.lastChild){
252+ if(dd.lastChild.tagName=="DL"){dd.lastChild.removeNode(true);} //逆参照の除去
253+ if(dd.lastChild.name){dd.lastChild.removeNode(true);} // LABELNUMBERがないものに係る不要アンカーの除去
254+ }
255+ // 本文を格納
256+ refs+=dt.outerHTML.replace(/name=.*?>/,">")+dd.outerHTML.replace(/<a name=.*>/i,"");
257+ }
404258 obj.nextSibling.insertAdjacentHTML("beforeEnd",'<dl class="refResult">'+refs+'</dl>')
405259 obj.name="referred";
406260 }
@@ -428,26 +282,9 @@ function getDTfromAnc(num){
428282 var anc=ancs(anchorHead+num);
429283 if(!anc){return("")} //LABELNUMBER対応のあぼ〜ん若しくは未出番号なら終了
430284 var obj=anc.parentElement; //LABELNUMBER対応のもの
431- if(!obj || !obj.tagName){return false;}
432285 if(obj.tagName!="DT"){ //LABELNUMBER非対応のもの
433286 if(num==1){if(anc){obj=anc.nextSibling} else{return("")}}
434287 else {if(!anc.nextSibling){obj=anc.parentElement.nextSibling}else{return("")}}
435288 }
436289 return(obj);
437-}
438-
439-// 画像板関連
440-var regIMG=new RegExp(".*?\\s.*?\\s.*:.*?\\sIMG:(.*?)(\\s|$)"); // 画像も可能にしてみる
441-function getIMG(obj){
442- if(regIMG.test(obj.innerText)){
443- var filename=RegExp.$1;
444- var tmp=filename.match(/(\d\d\d\d)(\d\d\d\d)(\d\d)/);
445- var today=new Date();var last=new Date(today-7*24*60*60*1000);var date="";
446- date+=last.getMonth()<9 ? "0"+(last.getMonth()+1) : last.getMonth()+1;
447- date+=last.getDate()<10 ? "0"+last.getDate() : last.getDate();
448- var log= (RegExp.$1+""+RegExp.$2 < last.getYear()+""+date) ? "_kako/" : "_img/";
449- var fileurl="http://up01.2ch.io/"+log+RegExp.$1+"/"+RegExp.$1+RegExp.$2+"/"+RegExp.$3+"/"+filename;
450- return(fileurl)
451- }else{return(false)}
452-}
453-
290+}
\ No newline at end of file
Show on old repository browser