private void AddMenu(JaneScript js, string name, Action<MenuItem, PopupTargetInfo> handler) { MenuItem menu1 = js.InsertMenu(MenuNames.MainWnd_ThreadPopupMenu, "", 1000); menu1.Caption = name; menu1.OnClick = handler; base.PersistMenuItem(menu1); }
private List<IdMatchInfo> GetIdMatches(JaneScript js, Board board, string id) { List<IdMatchInfo> matches = new List<IdMatchInfo>(); using (DisposableList<ThreadItem> threads = Util.CreateThreadItemList(board)) { foreach (ThreadItem t in threads) { if (!t.DatExist) continue; int lines = t.Lines; // HACK 全取得スレッドをなめなくてもいいようにすべき // sinse や LastGot で事前に日付チェックを行ったり // バイナリサーチで日付の一致する範囲を事前に調べたり for (int i = 1; i <= lines; i++) { using (ResItem res = t.GetRes(i)) { if (res.Id == id) { matches.Add(new IdMatchInfo() { datName = t.DatName, resNumber = i, datetime = res.DateValue, }); } } } js.ProcessMessages(); } } return matches; }
private void DoFindId(JaneScript js, ThreadItem thread, string id) { using (Board board = thread.Board) { board.Load(); List<IdMatchInfo> matches = this.GetIdMatches(js, board, id); this.OutputMatches(js, board, id, matches); } }
private void AddMenus(JaneScript js, bool? ascending) { MenuItem menu1 = js.InsertMenu(MenuNames.MainWnd_MainMenu, "MenuThre", js.MenuIndex(MenuNames.MainWnd_MainMenu, "N28")); MenuItem menu2 = js.InsertMenu(MenuNames.MainWnd_ThreadPopupMenu, "", js.MenuIndex(MenuNames.MainWnd_ThreadPopupMenu, "N9")); this.RegisterMenu(js, menu1, ascending); this.RegisterMenu(js, menu2, ascending); }
private void RegisterMenu(JaneScript js, MenuItem menu, bool? ascending) { if (!ascending.HasValue) { menu.Caption = "-"; } else { menu.Caption = Util.GetPrefixedMenuCaption(string.Format("開いているスレを{0}ソート", ascending.Value ? "昇順" : "降順")); base.PersistMenuItems(FunctionMenuUtil.AppendSubmenuItems(menu, new SortHandlerClass(js, ascending.Value).MenuHandler)); } base.PersistMenuItem(menu); }
private void DoTop10(JaneScript js, ThreadItem thread) { // レス数で降順ソートしてトップ10 var top = ( from rr in this.GetResRefInfos(thread) orderby rr.RefCount descending select rr) .Take(10).ToArray(); string shortTitle = "レス数トップ10"; string longTitle = "レス数トップ10: " + thread.Title; Util.WriteToNewView(js, shortTitle, longTitle, longTitle, false, false, (DatOut datout) => { for (int i = 0; i < top.Length; i++) { var rr = top[i]; datout.WriteText(string.Format("{0}位 {1}レス", i + 1, rr.RefCount)); datout.WriteBR(); datout.WriteThread(thread, rr.ResNumber, rr.ResNumber, AboneLevel.Futsuu); } }); }
private void FindAndWriteDrafts(JaneScript js, DatOut datout, bool readDraftContents) { datout.WriteText("草稿を検索しています。"); datout.WriteBR(); datout.WriteHTML("<hr>"); using (CategoryList cl = js.CategoryList()) using (DisposableList<Category> categories = new DisposableList<Category>(cl)) { foreach (Category category in categories) { DirectoryInfo diCate = new DirectoryInfo(category.LogDir); if (!diCate.Exists) continue; using (DisposableList<Board> boards = new DisposableList<Board>(category)) { foreach(Board board in boards){ board.Load(); // カテゴリディレクトリの草稿を探す FileInfo fi = new FileInfo(Path.Combine(category.LogDir, board.Name + "NewThread.mns")); if (fi.Exists) this.OutDraft(datout, category, board, fi, readDraftContents); // 板ディレクトリ内を探す DirectoryInfo di = new DirectoryInfo(board.LogDir); if (!di.Exists) continue; foreach (FileInfo fi2 in di.GetFiles("*.mns")) { if (fi2.Name == "NewThread.mns") { this.OutDraft(datout, category, board, fi2, readDraftContents); } else { using (ThreadItem thread = board.FindThread(Path.GetFileNameWithoutExtension(fi2.Name))) { this.OutDraft(datout, category, board, thread, fi2, readDraftContents); } } } js.ProcessMessages(); } } js.ProcessMessages(); } } datout.WriteBR(); datout.WriteHTML("<hr>"); datout.WriteText("検索が終了しました。"); }
private void DoGroupBy(JaneScript js, ThreadItem thread) { // レス数でグループ化して降順ソート var groups = from rr in this.GetResRefInfos(thread) group rr.ResNumber by rr.RefCount into g orderby g.Key descending select g; Uri threadUri = thread.URL; string shortTitle = "レス数でグループ化"; string longTitle = "レス数でグループ化: " + thread.Title; Util.WriteToNewView(js, shortTitle,longTitle, longTitle, false, false, (DatOut datout) => { foreach (var g in groups) { datout.WriteHTML(string.Format("<dt>{0} ({1})</dt>", g.Key, g.Count())); StringBuilder sb = new StringBuilder("<dd>"); foreach (var resNumber in g) { sb.AppendFormat("<a href=\"{0}{1}\">{1}</a> ", threadUri, resNumber); } sb.AppendLine("<br></dd>");//ddを閉じる前にbrを入れるとインデントする datout.WriteHTML(sb.ToString()); datout.Flush(); } }); }
private void OutputMatches(JaneScript js, Board board, string id, List<IdMatchInfo> matches) { string shortTitle = "ID検索"; string longTitle = string.Format("ID検索: ID:{0} {1}", id, board.Name); Util.WriteToNewView(js, shortTitle, longTitle, longTitle, false, false, (DatOut datout) => { var q = from m in matches orderby m.datetime select m; foreach (var m in q) { using (ThreadItem t = board.FindThread(m.datName)) { datout.WriteHTML(string.Format("<a href=\"{0}\">{1}</a><br>", t.URL, HttpUtility.HtmlEncode(t.Title))); datout.WriteThread(t, m.resNumber, m.resNumber, AboneLevel.Futsuu); } } datout.WriteHTML("<br><hr><br>"); datout.WriteText("スレごとのレス数は以下のとおりです。"); datout.WriteBR(); var boardGroups = from m in matches group m by m.datName into boardg orderby boardg.Count() descending select boardg; foreach (var bg in boardGroups) { using (ThreadItem t = board.FindThread(bg.Key)) { datout.WriteHTML(string.Format("{0}レス: <a href=\"{1}\">{2}</a><br>", bg.Count(), t.URL, HttpUtility.HtmlEncode(t.Title))); } } }); }
private void RegisterMenu(JaneScript js, MenuItem menu) { menu.Caption = Util.GetPrefixedMenuCaption("条件で閉じる"); base.PersistMenuItem(menu); base.PersistMenuItems(FunctionMenuUtil.AppendSubmenuItems(menu, this.MenuHandler, true)); }
public SortHandlerClass(JaneScript js, bool ascending) { this.js = js; this.ascending = ascending; }
public void OnInitialize(object comProxy) { WrapperManager.InitializeWrapper(comProxy); this.js = WrapperManager.GetJaneScript(); }