Commit MetaInfo

修订版cbcd6af9e05c46a72d5dce1c1156d5e4dccffc5e (tree)
时间2006-05-31 01:07:26
作者cvs2git <cvs2git>
Commitercvs2git

Log Message

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

更改概述

差异

--- 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;
@@ -1912,8 +1911,8 @@ begin
19121911 tmp2 := ZenToHan(e.Get_outerText);
19131912 if (GikoSys.IsNumeric(tmp2)) then begin
19141913 //sはレス番号っぽいっす。
1915- wkIntSt := StrToInt64(tmp2);
1916- wkIntTo := StrToInt64(tmp2);
1914+ wkIntSt := StrToInt(tmp2);
1915+ wkIntTo := StrToInt(tmp2);
19171916 //s := GetThreadText(wkBBS, wkKey, wkIntSt, wkIntTo, False, False);
19181917 FHint.PopupType := gptThread;
19191918 HTMLCreater.SetResPopupText(FHint, GetActiveContent, wkIntSt, wkIntTo, False, False);
@@ -4623,7 +4622,7 @@ begin
46234622 threadNumber := ChangeFileExt(Thread.FileName, '');
46244623 GikoSys.GetPopupResNumber( URL, stRes, edRes );
46254624 // スレの番号をレス番と誤って認識しているのをクリア
4626- if (StrToInt64(threadNumber) = stRes) then begin
4625+ if (StrToInt(threadNumber) = stRes) then begin
46274626 if not (AnsiEndsText(threadNumber + '/' + threadNumber, URL))
46284627 and (Pos('&st=' + threadNumber , URL) = 0) then begin
46294628 stRes := 0;
@@ -4781,8 +4780,8 @@ begin
47814780 ListView.Items.Count := ListView.Items.Count + 1;
47824781 end;
47834782 end;
4784- // ログなしスレッドのときは、ホスト名のチェックをする
4785- if (not ThreadItem.IsLogFile) then begin
4783+ // 2ちゃんねるでなくログなしスレッドのときは、ホスト名のチェックをする
4784+ if (not Board.Is2ch) and (not ThreadItem.IsLogFile) then begin
47864785 if AnsiPos(Host, Board.URL) = 0 then
47874786 ThreadItem.DownloadHost := Host
47884787 else
@@ -5099,7 +5098,7 @@ begin
50995098
51005099 ThreadItem := GetActiveContent;
51015100 if ThreadItem <> nil then begin
5102- Num := StrToInt64(s);
5101+ Num := StrToInt(s);
51035102 FHint.PopupType := gptThread;
51045103 HTMLCreater.SetResPopupText(FHint, ThreadItem, Num, Num, False, False);
51055104 if FHint.ResCount <> 0 then
@@ -6238,29 +6237,26 @@ begin
62386237 FavoriteTreeNameURLCopyPopupMenu.Visible := False;
62396238 FavoriteTreeReloadPopupMenu.Visible := False;
62406239 FavoriteTreeLogDeletePopupMenu.Visible := False;
6241- FavoriteTreeItemNameCopyPopupMenu.Visible := False;
62426240 end else if FClickNode.IsFirstNode then begin
62436241 FavoriteTreeBrowseFolderPopupMenu.Visible := True;
62446242 FavoriteTreeDeletePopupMenu.Visible := False;
62456243 FavoriteTreeRenamePopupMenu.Visible := False;
62466244 FavoriteTreeNewFolderPopupMenu.Visible := True;
62476245 FavoriteTreeURLCopyPopupMenu.Visible := False;
6248- FavoriteTreeNameCopyPopupMenu.Visible := False;
6246+ FavoriteTreeNameCopyPopupMenu.Visible := True;
62496247 FavoriteTreeNameURLCopyPopupMenu.Visible := False;
62506248 FavoriteTreeReloadPopupMenu.Visible := False;
62516249 FavoriteTreeLogDeletePopupMenu.Visible := False;
6252- FavoriteTreeItemNameCopyPopupMenu.Visible := True;
62536250 end else if FClickNode.Text = Favorite.FAVORITE_LINK_NAME then begin
62546251 FavoriteTreeBrowseFolderPopupMenu.Visible := True;
62556252 FavoriteTreeDeletePopupMenu.Visible := True;
62566253 FavoriteTreeRenamePopupMenu.Visible := False;
62576254 FavoriteTreeNewFolderPopupMenu.Visible := True;
62586255 FavoriteTreeURLCopyPopupMenu.Visible := False;
6259- FavoriteTreeNameCopyPopupMenu.Visible := False;
6256+ FavoriteTreeNameCopyPopupMenu.Visible := True;
62606257 FavoriteTreeNameURLCopyPopupMenu.Visible := False;
62616258 FavoriteTreeReloadPopupMenu.Visible := False;
62626259 FavoriteTreeLogDeletePopupMenu.Visible := False;
6263- FavoriteTreeItemNameCopyPopupMenu.Visible := True;
62646260 end else if TObject(FClickNode.Data) is TFavoriteFolder then begin
62656261 FavoriteTreeBrowseFolderPopupMenu.Visible := True;
62666262 FavoriteTreeDeletePopupMenu.Visible := True;
@@ -6271,7 +6267,6 @@ begin
62716267 FavoriteTreeNameURLCopyPopupMenu.Visible := False;
62726268 FavoriteTreeReloadPopupMenu.Visible := False;
62736269 FavoriteTreeLogDeletePopupMenu.Visible := False;
6274- FavoriteTreeItemNameCopyPopupMenu.Visible := True;
62756270 end else if TObject(FClickNode.Data) is TFavoriteThreadItem then begin
62766271 FavoriteTreeBrowseFolderPopupMenu.Visible := False;
62776272 FavoriteTreeDeletePopupMenu.Visible := True;
@@ -6282,7 +6277,6 @@ begin
62826277 FavoriteTreeNameURLCopyPopupMenu.Visible := True;
62836278 FavoriteTreeReloadPopupMenu.Visible := True;
62846279 FavoriteTreeLogDeletePopupMenu.Visible := True;
6285- FavoriteTreeItemNameCopyPopupMenu.Visible := True;
62866280 end else if TObject(FClickNode.Data) is TFavoriteBoardItem then begin
62876281 FavoriteTreeBrowseFolderPopupMenu.Visible := False;
62886282 FavoriteTreeDeletePopupMenu.Visible := True;
@@ -6293,7 +6287,6 @@ begin
62936287 FavoriteTreeNameURLCopyPopupMenu.Visible := True;
62946288 FavoriteTreeReloadPopupMenu.Visible := True;
62956289 FavoriteTreeLogDeletePopupMenu.Visible := False;
6296- FavoriteTreeItemNameCopyPopupMenu.Visible := True;
62976290 end else begin
62986291 FavoriteTreeBrowseFolderPopupMenu.Visible := False;
62996292 FavoriteTreeDeletePopupMenu.Visible := False;
@@ -6304,7 +6297,6 @@ begin
63046297 FavoriteTreeNameURLCopyPopupMenu.Visible := False;
63056298 FavoriteTreeReloadPopupMenu.Visible := False;
63066299 FavoriteTreeLogDeletePopupMenu.Visible := False;
6307- FavoriteTreeItemNameCopyPopupMenu.Visible := False;
63086300 end;
63096301
63106302 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
@@ -120,9 +118,7 @@ begin
120118 try
121119 // iniファイルが無ければ、デフォルトをリネームする
122120 if not FileExists(FilePath) then begin
123- CopyFile(
124- PChar(ChangeFileExt(FilePath, '.default')),
125- PChar(FilePath), True);
121+ RenameFile(ChangeFileExt(FilePath, '.default'), FilePath);
126122 end;
127123
128124 // ファイルの存在を確認
@@ -149,9 +145,6 @@ begin
149145 sections.Free;
150146 ini.Free;
151147 end;
152- if FSorted Then begin
153- FDictionary.CustomSort(KeySort);
154- end;
155148 end;
156149
157150 except
@@ -167,11 +160,10 @@ var
167160 begin
168161 if FileExists(FilePath) then begin
169162 try
170- SysUtils.DeleteFile(FilePath);
163+ DeleteFile(FilePath);
171164 except
172165 end;
173166 end;
174-
175167 ini := TMemIniFile.Create(FilePath);
176168 try
177169 for i :=0 to FDictionary.Count - 1 do begin
@@ -201,8 +193,8 @@ end;
201193 procedure TInputAssistDM.DataModuleCreate(Sender: TObject);
202194 begin
203195 FDictionary := TStringList.Create;
204- FDictionary.Sorted := False;
205- FSorted := True;
196+ FDictionary.Duplicates := dupAccept;
197+ FDictionary.Sorted := True;
206198 end;
207199 //! 登録単語数取得
208200 function TInputAssistDM.ResistWordCount : Integer;
@@ -235,9 +227,6 @@ begin
235227 break;
236228 end;
237229 end;
238- if FSorted Then begin
239- FDictionary.CustomSort(KeySort);
240- end;
241230 end;
242231 end;
243232 //! 登録単語追加
@@ -253,9 +242,6 @@ begin
253242 resWord.SetText('定型文');
254243 FDictionary.AddObject(Key, resWord);
255244 Result := resWord;
256- if FSorted Then begin
257- FDictionary.CustomSort(KeySort);
258- end;
259245 end;
260246 end;
261247 //! 登録単語のキー変更
@@ -270,10 +256,6 @@ begin
270256 break;
271257 end;
272258 end;
273- if FSorted Then begin
274- FDictionary.CustomSort(KeySort);
275- end;
276-
277259 end;
278260 end;
279261 //! Keyを持つ登録されている単語を取得
@@ -323,15 +305,17 @@ end;
323305 //! ソートの状態の取得
324306 function TInputAssistDM.GetSorted: Boolean;
325307 begin
326- Result := FSorted;
308+ Result := False;
309+ if (FDictionary <> nil) then begin
310+ Result := FDictionary.Sorted;
311+ end;
327312 end;
328313 //! ソート状態の設定
329314 procedure TInputAssistDM.SetSorted(Value: Boolean);
330315 begin
331- if (not FSorted) and (Value) then begin
332- FDictionary.CustomSort(KeySort);
316+ if (FDictionary <> nil) then begin
317+ FDictionary.Sorted := Value;
333318 end;
334- FSorted := Value;
335319 end;
336320 //! Keyのカテゴリに登録されている単語を取得
337321 function TInputAssistDM.GetCategoryResistWords(Key: String; var list: TStringList): Integer;
@@ -381,30 +365,9 @@ begin
381365 try
382366 resWord1 := TResistWord(List.Objects[Index1]);
383367 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));
368+ Result := AnsiCompareStr(resWord1.GetCategory, resWord2.GetCategory);
405369 if (Result = 0) then begin
406- Result := CompareStr(ZenToHan(resWord1.GetCategory),
407- ZenToHan(resWord2.GetCategory));
370+ Result := AnsiCompareStr(resWord1.GetKey, resWord2.GetKey);
408371 end;
409372 except
410373 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/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/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/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