matome.cs
using System;
using System.Data;
using System.IO;
using System.Text;
using System.Collections;
using System.Collections.Generic;
using System.Configuration;
using System.Text.RegularExpressions;

namespace matome {

    class Matome {
        private static string ANCHOR_PATTERN="";
        private static string RES_PATTERN = "";
        private static int logCount = 1;
        private static Boolean TagMode = true;
        private static Boolean AppendMode = true;
        //制限事項 携帯勇者は他の人のものまで拾って酷いことになる可能性があるのでお勧めしません。
        // 抽出条件を元に対象勇者の日毎のID取得
        // 名称 酉 日付 ID
        // データ取得(勇者の発言のみ)
        // リンク先取得
        // HTML出力
        // 終了
        public static int Main(string[] args) {
            Boolean ret = true;

            Brave brave = new Brave();
            if (args.Length < 1) {
                //勇者名省略時は勇者名が設定ファイルに書かれているときはそれで検索
                string braveName = System.Configuration.ConfigurationSettings.AppSettings["BRAVE_NAME"].Trim();
                if (braveName==null || braveName.Equals("")) {
                    Console.WriteLine("Usage : Matome 勇者名 ");
                    return 1;
                }
                brave.Name = braveName;
            } else {
                brave.Name = args[0];
            }
            //正規表現読み込み
            ANCHOR_PATTERN=System.Configuration.ConfigurationSettings.AppSettings["ANCHOR_PATTERN"];
            RES_PATTERN = System.Configuration.ConfigurationSettings.AppSettings["RES_PATTERN"];
            //タグモード TRUE:通常出力 FALSE:レス部分しか出力しないモード
            TagMode = System.Configuration.ConfigurationSettings.AppSettings["TAG_MODE"].Equals("TRUE");
            //上書きモード TRUE:全て同一ファイルに出力するモード FALSE:別ファイルに出力するモード
            AppendMode = System.Configuration.ConfigurationSettings.AppSettings["APPEND_MODE"].Equals("TRUE");
        
            
            //対象TRIP読込
            for (int i = 0; i < int.Parse(ConfigurationSettings.AppSettings["BRAVE_TRIP_COUNT"]); i++) {
                brave.Trips.Add(ConfigurationSettings.AppSettings["BRAVE_TRIP_" + i]);
            }

            //対象ID読込
            for (int i = 0; i < int.Parse(ConfigurationSettings.AppSettings["BRAVE_ID_COUNT"]); i++) {
                brave.IDs.Add(ConfigurationSettings.AppSettings["BRAVE_ID_" + i]);
            }

            //偽者のいる場合対象外TRIP読込
            for (int i = 0; i < int.Parse(ConfigurationSettings.AppSettings["NOT_BRAVE_TRIP_COUNT"]); i++) {
                brave.DummyTrips.Add(ConfigurationSettings.AppSettings["NOT_BRAVE_TRIP_" + i]);
            }

            //偽者のいる場合対象外ID読込
            for (int i = 0; i < int.Parse(ConfigurationSettings.AppSettings["NOT_BRAVE_ID_COUNT"]); i++) {
                brave.DummyIDs.Add(ConfigurationSettings.AppSettings["NOT_BRAVE_ID_" + i]);
            }

            // 抽出条件を元に対象勇者の日毎のID取得
            string path = ConfigurationSettings.AppSettings["FOLDER_PATH"];
            string targetPath = path;
          
            string[] workDirectorys;
            //サブフォルダも検索するか  TRUE:サブフォルダも対象 FALSE:指定フォルダまで
            Boolean subFolderSearchMode = System.Configuration.ConfigurationSettings.AppSettings["FOLDER_SEARCH_MODE"].Equals("TRUE");
            if(!Directory.Exists(targetPath)){
                Console.WriteLine("指定されたパスが見つかりません :{0}",targetPath);
                return 1;
            }
            if (subFolderSearchMode) {
                workDirectorys = Directory.GetDirectories(targetPath, "*", SearchOption.AllDirectories);
            } else {
                workDirectorys = Directory.GetDirectories(targetPath);
            }
            //      Console.WriteLine("対象フォルダ : {0}",targetPath);
            //      Console.WriteLine("フォルダ数 : {0}",workDirectorys.Length);

            //ID収集モード ALL 一旦全収集後ログ検索 それ以外同一フォルダ内からのみ取得
            Boolean idMode = System.Configuration.ConfigurationSettings.AppSettings["ID_MODE"].Equals("ALL");
            //Logモード TRUE いきなりログ解析 それ以外酉、ID検索後処理
            Boolean logMode = System.Configuration.ConfigurationSettings.AppSettings["LOG_MODE"].Equals("TRUE");
            //名称検索モード START/IN/ALL/END
            string nameMode = System.Configuration.ConfigurationSettings.AppSettings["NAME_MODE"];

            //フォルダ階層がある場合
            if (workDirectorys.Length > 0) {
                for (int i = 0; ret && i < workDirectorys.Length; i++) {
                    if (!logMode) {
                        getLogByFolder(workDirectorys[i], brave, true, nameMode);
                    }
                    if (!idMode) {
                        getLogByFolder(workDirectorys[i], brave, false, nameMode);
                    }
                }
                if (idMode) {
                    for (int i = 0; ret && i < workDirectorys.Length; i++) {
                        getLogByFolder(workDirectorys[i], brave, false, nameMode);
                    }
                }
            } else {    //単一フォルダの場合
                if (!logMode) {
                    getLogByFolder(targetPath, brave, true, nameMode);
                }
                getLogByFolder(targetPath, brave, false, nameMode);
            }
            /* デバグ用検索対象酉とID出力 * /
            if(brave.Trips.Count>0){
              for(int i=0;i0){
              for(int i=0;i
            // 名称 酉 日付 ID
            // データ取得(勇者の発言のみ)
            // リンク先取得
            // HTML出力
            //cssコピー
            string outPath = ConfigurationSettings.AppSettings["OUT_PATH"];
            if (outPath == null || outPath.Equals("")) {
                outPath = ".";
            }
            if (!Directory.Exists(outPath)) {
                outPath = ".";
            }
            if (!File.Exists(outPath + "/" + ConfigurationSettings.AppSettings["CSS_FILE"])) {
                System.IO.File.Copy(ConfigurationSettings.AppSettings["CSS_FILE"], outPath + "/" + ConfigurationSettings.AppSettings["CSS_FILE"]);
            }
            // 終了
            Console.WriteLine("-------------------------------------- 終了");
            return 0;
        }
        /**
         * getLogByFolder
         * フォルダ配下のファイルに対して処理を行う。
         * 引数:フォルダパス(I)
         *   :勇者情報(I/O)
         *     :モード(True:酉収集 False:ログ収集)
         *   :名称検索モード(I)
         * 戻り値:処理結果(True/False)
        */
        private static bool getLogByFolder(string pFolderPath, Brave brave,bool mode,string nameMode) {
            Console.WriteLine("フォルダ : {0}",pFolderPath);
            bool ret = true;
            //フォルダ配下のファイル取得
            System.IO.DirectoryInfo dirInfo = new System.IO.DirectoryInfo(pFolderPath);
            //フォルダ内のdatファイル一覧
            foreach (System.IO.FileInfo file in dirInfo.GetFiles("*.dat")) {
                if (mode) {
                    Console.WriteLine("\tファイル : {0} 抽出中", file.Name);
                    if (!executeForName(file, brave, nameMode)) {
                        ret = false;
                    }
                } else {
                    Console.WriteLine("\tファイル : {0} 処理中", file.Name);
                    Sure wSure;
                    if ((wSure = executeForTripID(file, brave, nameMode)).flag==1) {
                        //HTML出力
                        Console.WriteLine("\tファイル : {0} 出力中", file.Name);
                        OutHtml(file, brave, wSure);
                    } else {
                        ret = false;
                    }
                }
                //テスト時最初のファイルで止める場合はコメントを外す
                //break;
            }
            return ret;
        }
        /**
         * executeForName
         * 酉、ID抽出
         * 勇者情報の名称を元に勇者情報の酉とIDを埋める
         * 引数:フォルダパス(I)
         *   :勇者情報(I/O)
         *   :名称検索モード(I)
         * 戻り値:処理結果(True/False)
         */
        private static Boolean executeForName(FileInfo pInfo, Brave brave,string nameMode) {
            Boolean ret = true;
            try {
                string sure = ReadFile(pInfo);
                string[] result = sure.Split('\n');
                for (int i = 0; i < result.Length; i++) {
                    if (result[i].Trim() != "") {
                        //名前(◆Trip)<>メール<>時刻 ID<>本文<>スレタイ(一行目のみ)
                        Regex regex = new System.Text.RegularExpressions.Regex(RES_PATTERN);
                        MatchCollection matchCol = regex.Matches(result[i].Trim());
                        //形式があっていたら処理
                        if (matchCol.Count > 0) {
                            string name = matchCol[0].Groups[1].Value.Trim();
                            //強調タグは消す
                            name = name.Replace("", "").Replace("", "").Trim();
                            string trip = "";
                            //◆〜 Tripを抽出
                            if (name.IndexOf("◆") >= 0) {
                                trip = name;
                                trip = trip.Substring(trip.IndexOf("◆") + 1, trip.Length - trip.IndexOf("◆") - 1);
                                trip = trip.Trim();
                                name = name.Substring(0, name.IndexOf("◆")).Trim();
                            }
                            //名前が引数の勇者名からはじまっている場合または酉が一致する場合
                            //名称モード対応
                            if (trip!=null && !trip.Equals("") && brave.Trips.Contains(trip)
                                || (nameMode.Equals("START") && name.StartsWith(brave.Name))
                                || (nameMode.Equals("IN") && name.IndexOf(brave.Name)>=0)
                                || (nameMode.Equals("ALL") && name.Equals(brave.Name))
                                || (nameMode.Equals("END") && name.EndsWith(brave.Name))
                                    ) {
                                //ID抽出
                                string dateId = matchCol[0].Groups[3].Value.Trim();
                                string id = dateId.Substring(dateId.IndexOf("ID:") + 3).Trim();
                                //偽者酉リストにあれば除外
                                if (brave.DummyTrips.Contains(trip)) {
                                    continue;
                                }
                                //偽者IDリストにあれば除外
                                if (brave.DummyIDs.Contains(id)) {
                                    continue;
                                }
                                //Console.WriteLine("加工後:{0}",trip);
                                //構造体に存在しなければ追加
                                if (!brave.Trips.Contains(trip)) {
                                    brave.Trips.Add(trip);
                                }
                                //構造体に存在しなければ追加
                                if (!brave.IDs.Contains(id)) {
                                    brave.IDs.Add(id);
                                }
                                //Console.WriteLine("{0} : {1},{2}",i+1 ,trip,matchCol[0].Groups[3]);
                            }
                        }
                    }
                }

            } catch (Exception e) {
                Console.WriteLine("Exception StackTrace = {0}", e.StackTrace);
                ret = false;
            } finally {
            }
            return ret;
        }
        /**
         * executeForTripID
         * 酉、ID抽出
         * 勇者情報の酉、IDを元に勇者の発言とリンク先抽出しHTML出力
         * 引数:フォルダパス(I)
         *   :勇者情報(I/O)
         *   :名称検索モード(I)
         * 戻り値:スレッド構造体
         */
        private static Sure executeForTripID(FileInfo pInfo, Brave brave, string nameMode) {
            Sure wSure = new Sure();
            try {
                //ファイル読込
                string sure = ReadFile(pInfo);

                //行単位で分割しループ
                string[] result = sure.Split('\n');
                for (int i = 0; i < result.Length ; i++) {
                    //空行以外なら処理
                    if (result[i].Trim() != "") {
                        //名前(◆Trip)<>メール<>時刻 ID<>本文<>スレタイ(一行目のみ)
                        Regex regex = new System.Text.RegularExpressions.Regex(RES_PATTERN);
                        MatchCollection matchCol = regex.Matches(result[i].Trim());
                        //形式があっていたら処理
                        if (matchCol.Count > 0) {
                            //先頭行ならスレタイ取得
                            if (i == 0) {
                                wSure.Title = matchCol[0].Groups[5].Value.Trim();
                            }

                            Res wRes = new Res();
                            //レス番はループ変数+1(ループ変数は0からはじまるため)
                            wRes.No = i + 1;
                            //名前抽出
                            wRes.Name = matchCol[0].Groups[1].Value.Trim();
                            wRes.Name = wRes.Name.Replace("", "").Replace("", "");
                            //◆〜 Tripを抽出
                            if (wRes.Name.IndexOf("◆") >= 0) {
                                string trip = wRes.Name;
                                trip = trip.Substring(trip.IndexOf("◆") + 1, trip.Length - trip.IndexOf("◆") - 1);
                                wRes.Trip = trip.Trim();
                                wRes.Name = wRes.Name.Substring(0, wRes.Name.IndexOf("◆")).Trim();
                            }
                            //メール抽出 sage age は削除
                            wRes.Mail = matchCol[0].Groups[2].Value.Trim().Replace("sage", "").Replace("age", "");
                            //日時,IDを抽出
                            string dateId = matchCol[0].Groups[3].Value.Trim();
                            if (dateId.IndexOf("ID:") >= 0) {
                                wRes.date = dateId.Substring(0, dateId.IndexOf("ID:")).Trim();
                                //              wRes.date=DateTime.Parse(dateId.Substring(0,dateId.IndexOf("ID:")));
                                wRes.id = dateId.Substring(dateId.IndexOf("ID:") + 3).Trim();
                            } else {
                                wRes.date = dateId.Trim();
                            }
                            //本文抽出
                            wRes.text = matchCol[0].Groups[4].Value.Trim();
                            //tikage対策
                            if (new System.Text.RegularExpressions.Regex(@"\d{20}").Matches(wRes.text).Count > 0) {
                                wRes.text = "tikage と思われるので削除されました。";
                            }
                            //milky対策
                            if (wRes.Name.Equals("milky")) {
                                wRes.text = "milky と思われるので削除されました。";
                            }
                            //リンクタグがそのままだと邪魔なので削除する
                            wRes.text = Regex.Replace(wRes.text, "\\(.*?)", "$1");
                            //wRes.text = wRes.text.Replace("", "");
                            //              wRes.text=wRes.text.Replace("","").Replace("
","\n").Replace(">",">").Replace("<","<");
//スレッド構造体に追加 wSure.Res.Add(wRes); } } } //強制収容モード(本文中に指定文字を含めば出力) Boolean enforcedMode = System.Configuration.ConfigurationSettings.AppSettings["ENFORCED_MODE"].Equals("TRUE"); //レスモード TRUE:勇者の発言に対するレスも拾う FALSE:勇者の付けたレスは拾う Boolean resMode = System.Configuration.ConfigurationSettings.AppSettings["RES_MODE"].Equals("TRUE"); //スレッド内容検索 //名称,酉,IDのどれかが一致したら勇者の発言とする。 foreach (Res r in wSure.Res) { //偽者酉リストにあれば除外 if (brave.DummyTrips.Contains(r.Trip)) { continue; } //偽者IDリストにあれば除外 else if (brave.DummyIDs.Contains(r.id)) { continue; } //名前一致 //名称モード対応 else if ((nameMode.Equals("START") && r.Name.StartsWith(brave.Name)) || (nameMode.Equals("IN") && r.Name.IndexOf(brave.Name)>=0) || (nameMode.Equals("ALL") && r.Name.Equals(brave.Name)) || (nameMode.Equals("END") && r.Name.EndsWith(brave.Name)) ) { r.flag = Res.FLAG_RES; } //酉一致 else if (brave.Trips.Contains(r.Trip)) { r.flag = Res.FLAG_RES; } //ID一致 else if (brave.IDs.Contains(r.id)) { r.flag = Res.FLAG_RES; } //強制収容モード(本文中に指定文字を含めば出力) else if (enforcedMode && r.Name.IndexOf(brave.Name) >= 0) { r.flag = Res.FLAG_OTHER; } //一つでも出力対象があればスレッドを出力対象にする。 if (wSure.flag == 0 && r.flag != Res.FLAG_NO_OUTPUT) { wSure.flag = 1; wSure.date = r.date; } } //リンク先抽出 //ここがメインなので誰か綺麗に書ける人がいたら直してください(切実) if (wSure.flag == 1) { foreach (Res r in wSure.Res) { //勇者の発言のリンク先抽出 安価からのリンク先も抽出 if (r.flag == Res.FLAG_RES || r.flag == Res.FLAG_UNC) { //>>x >>xx >>xxx >>1000 を抽出 (>>1は除外した) Regex regex = new System.Text.RegularExpressions.Regex(ANCHOR_PATTERN); MatchCollection matchCol = regex.Matches(r.text); //リンクが存在したら if (matchCol.Count > 0) { foreach (Match match in matchCol) { try { //リンク先のレス番解析 int index = ToNumber(match.Groups[2].Value); int lastIndex = index; //範囲安価対応 if (match.Groups.Count > 3) { string separete = match.Groups[3].Value.Trim(); if (separete.Equals("-")) { lastIndex = ToNumber(match.Groups[4].Value); } if (separete.Equals(",")) { int wIndex = ToNumber(match.Groups[4].Value); //>>1乙対応 if (wIndex > 1 && wIndex < wSure.Res.Count) { if (r.No < wSure.Res[wIndex - 1].No || r.flag == Res.FLAG_UNC) { SetFlag(wSure.Res[wIndex - 1], Res.FLAG_UNC); } else { SetFlag(wSure.Res[wIndex - 1], Res.FLAG_OTHER); } } } } //レス番が存在すれば処理する for (int i = index; i <= lastIndex; i++) { //>>1乙対応 if (i > 1 && i < wSure.Res.Count) { if (r.No < wSure.Res[i - 1].No || r.flag == Res.FLAG_UNC) { SetFlag(wSure.Res[i - 1], Res.FLAG_UNC); } else { SetFlag(wSure.Res[i - 1], Res.FLAG_OTHER); } } } } catch (Exception e) { Console.WriteLine("text={0}\nException StackTrace = {1}", r.text, e.StackTrace); } } } //↑↓対応 ↑一段まで↓は結構拾うはず if (r.flag == Res.FLAG_UNC) { if (r.text.IndexOf("↑") >= 0) { int index = r.No - 1; if (index > 1 && index < wSure.Res.Count) { SetFlag(wSure.Res[index - 1], Res.FLAG_UNC); } } if (r.text.IndexOf("↓の↓") >= 0) { int index = r.No + 2; if (index > 1 && index < wSure.Res.Count) { SetFlag(wSure.Res[index - 1], Res.FLAG_UNC); } } else if (r.text.IndexOf("↓") >= 0) { int index = r.No + 1; if (index > 1 && index < wSure.Res.Count) { SetFlag(wSure.Res[index - 1], Res.FLAG_UNC); } } } } else if (resMode) { //勇者の発言に対するレス抽出 //次スレ立て指定対応(1からのリンクは無視) if(r.No==1){ continue; } //>>x >>xx >>xxx >>1000 を抽出 (>>1は除外した) Regex regex = new System.Text.RegularExpressions.Regex(ANCHOR_PATTERN); MatchCollection matchCol = regex.Matches(r.text); if (matchCol.Count > 0) { foreach (Match match in matchCol) { try { int index = ToNumber(match.Groups[2].Value); int lastIndex = index; //範囲安価対応 if (match.Groups.Count > 3) { string separete = match.Groups[3].Value.Trim(); if (separete.Equals("-")) { lastIndex = ToNumber(match.Groups[4].Value); } if (separete.Equals(",")) { int wIndex = ToNumber(match.Groups[4].Value); if (wIndex > 0 && wIndex < wSure.Res.Count) { //リンク先に勇者の発言が含まれれば出力 if (wSure.Res[wIndex - 1].flag==Res.FLAG_RES) { SetFlag(r, Res.FLAG_OTHER); } } } } //レス番が存在すれば処理する for (int i = index; i <= lastIndex; i++) { if (i > 0 && i < wSure.Res.Count) { //リンク先に勇者の発言が含まれれば出力 if (wSure.Res[i - 1].flag == Res.FLAG_RES) { SetFlag(r, Res.FLAG_OTHER); } } } } catch (Exception e) { Console.WriteLine("text={0}\nException StackTrace = {1}", r.text, e.StackTrace); throw new Exception("テキスト解析失敗", e); } } } } } } } catch (Exception e) { Console.WriteLine("Exception StackTrace = {0}", e.StackTrace); throw new Exception("酉、ID抽出失敗", e); } finally { } return wSure; } /** * ToNumber * 全角数値含む文字列を数字に変換 */ private static int ToNumber(string oldString) { if (oldString==null || oldString.Trim().Equals("")) { return 0; } if (new System.Text.RegularExpressions.Regex(@"[0-9]").Matches(oldString).Count > 0) { //全角数値が入っている。 //VisualBasicの関数を入れるとコンパイル時のリンクが面倒なのでベタで変換 oldString=oldString.Replace("0", "0") .Replace("1", "1") .Replace("2", "2") .Replace("3", "3") .Replace("4", "4") .Replace("5", "5") .Replace("6", "6") .Replace("7", "7") .Replace("8", "8") .Replace("9", "9"); } try { return int.Parse(oldString); } catch{ return 0; } } /** * SetFlag * フラグ設定 * フラグを設定するレス情報,フラグ */ private static void SetFlag(Res r,int flag) { //酉 if (r.flag == Res.FLAG_RES) { //リンク先が既に検索対象勇者であればフラグはそのまま } else if (r.flag == Res.FLAG_YRES) { //リンク先が既に他勇者であればフラグはそのまま } else if (r.flag == Res.FLAG_UNC) { //リンク先が既に安価であればフラグはそのまま } else if (r.Trip == null || r.Trip.Equals("")) { //リンク先が酉持ちでなければ指定フラグを立てる r.flag = flag; } else { //リンク先が酉持ちなら他勇者とする。 r.flag = Res.FLAG_YRES; } } /** * ReadFile * ファイル読込 * 引数:読み込みファイル情報 * 戻り値:ファイル内容 */ private static string ReadFile(FileInfo pInfo) { StreamReader streamReader = null; string sure = ""; try { streamReader = new System.IO.StreamReader(pInfo.OpenRead(), System.Text.Encoding.GetEncoding("sjis")); sure = streamReader.ReadToEnd(); } catch (UnauthorizedAccessException e) { Console.WriteLine("Exception StackTrace = {0}", e.StackTrace); Console.WriteLine("ファイル({0})へのアクセスが許可されていません。 ", pInfo.Name); } catch (FileNotFoundException e) { Console.WriteLine("Exception StackTrace = {0}", e.StackTrace); Console.WriteLine("ファイル({0})が見つかりませんでした。 ", pInfo.Name); } finally { if (streamReader != null) { streamReader.Close(); } } return sure; } /** * OutHtml * HTML出力 * 引数:読み込みファイル情報 * :勇者構造体 * :スレッド構造体 */ private static void OutHtml(FileInfo pInfo, Brave brave, Sure wSure) { StringBuilder buf = MakeHtml(wSure); //出力ファイル接尾語 bool outLastNameMode = System.Configuration.ConfigurationSettings.AppSettings["OUT_FILELAST_NAME"].Equals("TRUE"); //最初の勇者の発言時刻(スレ立て日付) DateTime outTime= new DateTime(); try { if (wSure.date == null) { //スレ立て日付 outTime = DateTime.Parse(wSure.Res[0].date); } else { //最初の勇者の発言時刻 outTime = DateTime.Parse(wSure.date); } } catch { //Exceptionは潰す } //出力ファイル名 読み込んだファイル名の拡張子をhtmlに変更したもの //最初スレタイにしてたけどそれだとファイルに使えない文字が出るの(///)←コレ string outPath = ConfigurationSettings.AppSettings["OUT_PATH"]; if (outPath == null || outPath.Equals("")) { outPath = "."; } if (!Directory.Exists(outPath)){ outPath = "."; } string outName = ConfigurationSettings.AppSettings["OUT_FILENAME"]; if (outName == null || outName.Equals("")) { if (AppendMode) { outName = brave.Name; } else if (outLastNameMode) { outName = brave.Name + "_" + outTime.ToString(ConfigurationSettings.AppSettings["OUT_FILELAST_NAME_FORMAT"]); } else { outName = brave.Name + "_" + pInfo.Name.Substring(0, pInfo.Name.Length - 4); } } else { if (AppendMode) { //そのまま } else if (outLastNameMode) { outName = outName + "_" + outTime.ToString(ConfigurationSettings.AppSettings["OUT_FILELAST_NAME_FORMAT"]); } else { outName = outName + logCount.ToString(ConfigurationSettings.AppSettings["OUT_FORMAT"]); logCount++; } } string fileName=outPath + "/" + outName + ".html"; StreamWriter sw = new StreamWriter(fileName, true,System.Text.Encoding.GetEncoding(932)); //内容をすべて書き込む sw.Write(buf); //閉じる sw.Close(); //出力日付モード TRUE:スレ立て日付 FALSE:現時刻 Boolean dateMode = System.Configuration.ConfigurationSettings.AppSettings["DATE_MODE"].Equals("TRUE"); if (dateMode) { File.SetLastWriteTime(fileName, outTime); } } /** * MakeHtml * HTML出力 * 引数:スレッド構造体 * 戻り値:HTML */ private static StringBuilder MakeHtml(Sure wSure) { StringBuilder buf = new StringBuilder(); if (TagMode) { buf.Append("\n"); //外だし対応 buf.Append("); buf.Append(ConfigurationSettings.AppSettings["CSS_FILE"]); buf.Append("\">\n"); // buf.Append(ReadFile(new System.IO.FileInfo(ConfigurationSettings.AppSettings["CSS_FILE"]))); /* buf.Append(" \n"); */ buf.Append("\n"); } buf.Append("
"); buf.Append(wSure.Title); buf.Append("


\n"
); foreach (Res r in wSure.Res) { if (r.flag != Res.FLAG_NO_OUTPUT) { buf.Append(r.No); buf.Append(" "); buf.Append(r.Name); if (r.Trip == null || r.Trip.Equals("")) { } else { buf.Append("◆"); buf.Append(r.Trip); } buf.Append("["); buf.Append(r.Mail); buf.Append("] 投稿日:"); buf.Append(r.date); buf.Append(" ID:"); buf.Append(r.id); switch (r.flag) { case Res.FLAG_RES: buf.Append("
"); break; case Res.FLAG_UNC: buf.Append("
"); break; case Res.FLAG_YRES: buf.Append("
"); break; case Res.FLAG_OTHER: buf.Append("
"); break; } buf.Append(r.text); buf.Append("

\n"
); } } if (TagMode) { buf.Append("\n"); } return buf; } /** * Brave * 勇者構造体 * 勇者名,酉,ID */ private class Brave { //名称 setterとgetter使ってるのは趣味 static string Name_; public string Name { get { return Name_; } set { Name_ = value; } } //酉 public List<string> Trips = new List<string>(); //ID public List<string> IDs = new List<string>(); //対象外酉 public List<string> DummyTrips = new List<string>(); //対象外ID public List<string> DummyIDs = new List<string>(); } /** * Sure * スレッド構造体 * スレタイ,レスリスト,出力フラグ */ class Sure { //スレタイ public string Title; //レス一覧 public List Res = new List(); //出力フラグ public int flag = 0; //日付 public string date=null; } /** * Res * レス構造体 * レス番,名前,酉,メール,日付,ID,本文,出力フラグ */ class Res { //出力フラグ public const int FLAG_NO_OUTPUT = 0; public const int FLAG_RES = 1; public const int FLAG_UNC = 2; public const int FLAG_YRES = 3; public const int FLAG_OTHER = 4; //name,mail,日時 ID (2006/05/17(水) 03:19:01.51 ID:),本文,スレタイトル(先頭のみ) //レス番 public int No; //名前 public string Name; //酉 public string Trip; //メール public string Mail; //日付 public string date; //ID public string id; //本文 public string text; //出力フラグ public int flag = FLAG_NO_OUTPUT; } } }
inserted by FC2 system