/** * 指定されたディレクトリの下に、指定された名前のディレクトリが存在するか確認して作成する */ void XrossBoardUtil::CreateSpecifyDirectory(wxDir& specifyDir, const wxString& dirName) { if (!specifyDir.HasSubDirs(dirName)) { ::wxMkdir(specifyDir.GetName() + wxFILE_SEP_PATH + dirName); } }
/** * 指定された文字列でdatファイルへのファイルパスを組み立てる */ wxString XrossBoardUtil::AssembleFilePath(wxString& boardNameAscii, wxString& origNumber, const int kind) { wxString filePath = wxEmptyString; if (kind == KIND_THREAD_DAT) { // スレッドのdatファイル const wxDir dir(::wxGetHomeDir() + wxFILE_SEP_PATH + XROSSBOARD_DIR); filePath = dir.GetName(); filePath += wxFILE_SEP_PATH; filePath += wxT("dat"); filePath += wxFILE_SEP_PATH; filePath += boardNameAscii; filePath += wxFILE_SEP_PATH; filePath += origNumber; filePath += wxT(".dat"); } else if (kind == KIND_BOARD__DAT) { // 板一覧リストのdatファイル const wxDir dir(::wxGetHomeDir() + wxFILE_SEP_PATH + XROSSBOARD_DIR); filePath = dir.GetName(); filePath += wxFILE_SEP_PATH; filePath += wxT("dat"); filePath += wxFILE_SEP_PATH; filePath += boardNameAscii; filePath += wxFILE_SEP_PATH; filePath += boardNameAscii; filePath += wxT(".dat"); } else if (kind == KIND_DAT_PATH) { // datファイルのあるパス const wxDir dir(::wxGetHomeDir() + wxFILE_SEP_PATH + XROSSBOARD_DIR); filePath = dir.GetName(); filePath += wxFILE_SEP_PATH; filePath += wxT("dat"); } return filePath; }
/** * レスをIDで抽出してファイルから読み取ってDOM形式にして送り返す * @param const wxString& boardNameAscii 板名の英語名 * @param const wxString& origNumber UNIXタイムベースのオリジナルな番号 * @param const wxString& extractId 抽出対象のID * @return wxString 取得したレスの内容 */ wxString XrossBoardUtil::FindResponseById(const wxString& boardNameAscii, const wxString& origNumber, const wxString& extractId) { // ファイルパスの組み立てとファイルの有無確認 const wxDir dir(::wxGetHomeDir() + wxFILE_SEP_PATH + XROSSBOARD_DIR); wxString filePath = dir.GetName(); filePath += wxFILE_SEP_PATH; filePath += wxT("dat"); filePath += wxFILE_SEP_PATH; filePath += boardNameAscii; filePath += wxFILE_SEP_PATH; filePath += origNumber; filePath += wxT(".dat"); if (!wxFile::Exists(filePath)) { // 無ければ空文字リターン return wxEmptyString; } // HTMLのDOM形式にする wxString lumpOfHTML = HTML_HEADER_POPUP; wxString default_nanashi, mail, day_and_ID; /** * IDを抽出してポップアップさせる */ wxTextFile datFile; datFile.Open(filePath, wxConvUTF8); for (int i = 0; i < datFile.GetLineCount(); i++) { int curnumber = i + 1; wxString str = datFile[i]; if (regexThread.IsValid() && curnumber > 1 && regexThread.Matches(str) && regexThread.GetMatch(str, 3).Contains(extractId) ) { // >>1 以外の処理 // マッチさせたそれぞれの要素を取得する default_nanashi = regexThread.GetMatch(str, 1); mail = regexThread.GetMatch(str, 2); day_and_ID = regexThread.GetMatch(str, 3); lumpOfHTML += wxT("<dt>"); lumpOfHTML += wxString::Format(wxT("%d"), curnumber); // レスの最初に<table>タグを入れる wxString res; res.Append(wxT("<table border=0 id=\"") + wxString::Format(wxT("%d"), curnumber) + wxT("\">")); res.Append(regexThread.GetMatch(str, 4)); res.Append(wxT("</table>")); // レス内部のURLに<a>タグをつける res = ReplaceURLText(res); // レスの最後に改行 res.Append(wxT(BR)); if (mail != wxEmptyString) { // もしメ欄になにか入っているならば lumpOfHTML += wxT(" 名前:<a href=\"mailto:"); lumpOfHTML += mail; lumpOfHTML += wxT("\"><b>"); lumpOfHTML += default_nanashi; lumpOfHTML += wxT("</b></a>"); lumpOfHTML += day_and_ID; lumpOfHTML += wxT("<dd>"); lumpOfHTML += res; } else { // 空の場合 lumpOfHTML += wxT(" 名前:<font color=green><b>"); lumpOfHTML += default_nanashi; lumpOfHTML += wxT("</b></font>"); lumpOfHTML += day_and_ID; lumpOfHTML += wxT("<dd>"); lumpOfHTML += res; } } else if (regexThreadFst.IsValid() && curnumber == 1 && regexThreadFst.Matches(str) && regexThread.GetMatch(str, 3).Contains(extractId) ) { // >>1 の場合の処理 // マッチさせたそれぞれの要素を取得する default_nanashi = regexThreadFst.GetMatch(str, 1); mail = regexThreadFst.GetMatch(str, 2); day_and_ID = regexThreadFst.GetMatch(str, 3); lumpOfHTML += wxT("<dt>"); lumpOfHTML += wxString::Format(wxT("%d"), curnumber); // レスの最初に<table>タグを入れる wxString res; res.Append(wxT("<table border=0 id=\"") + wxString::Format(wxT("%d"), curnumber) + wxT("\">")); res.Append(regexThreadFst.GetMatch(str, 4)); res.Append(wxT("</table>")); // レス内部のURLに<a>タグをつける res = ReplaceURLText(res); // レスの最後に改行 res.Append(wxT(BR)); if (mail != wxEmptyString) { // もしメ欄になにか入っているならば lumpOfHTML += wxT(" 名前:<a href=\"mailto:"); lumpOfHTML += mail; lumpOfHTML += wxT("\"><b>"); lumpOfHTML += default_nanashi; lumpOfHTML += wxT("</b></a>"); lumpOfHTML += day_and_ID; lumpOfHTML += wxT("<dd>"); lumpOfHTML += res; } else { // 空の場合 lumpOfHTML += wxT(" 名前:<font color=green><b>"); lumpOfHTML += default_nanashi; lumpOfHTML += wxT("</b></font>"); lumpOfHTML += day_and_ID; lumpOfHTML += wxT("<dd>"); lumpOfHTML += res; } } } datFile.Close(); // HTMLソースを加える lumpOfHTML += HTML_FOOTER; return lumpOfHTML; }
/** * アンカーで指定されたレスをファイルから読み取ってレスだけを返す * * @param const wxString& boardNameAscii 板名の英語名 * @param const wxString& origNumber UNIXタイムベースのオリジナルな番号 * @param const long resNumber 取得するレスの番号 * @param const bool useTriangularBrackets true = 返り値に'>'がつく, false = '>'がつかない * @return wxString 取得したレスの内容 */ wxString XrossBoardUtil::FindAnchoredResponseText(const wxString& boardNameAscii, const wxString& origNumber, const long resNumber, const bool useTriangularBrackets) { // ファイルパスの組み立てとファイルの有無確認 const wxDir dir(::wxGetHomeDir() + wxFILE_SEP_PATH + XROSSBOARD_DIR); wxString filePath = dir.GetName(); filePath += wxFILE_SEP_PATH; filePath += wxT("dat"); filePath += wxFILE_SEP_PATH; filePath += boardNameAscii; filePath += wxFILE_SEP_PATH; filePath += origNumber; filePath += wxT(".dat"); if (!wxFile::Exists(filePath)) { // 無ければ空文字リターン return wxEmptyString; } // 取得するレス番 int resNumInt = static_cast<int>(resNumber); // datファイルを読み込む wxTextFile datFile; datFile.Open(filePath, wxConvUTF8); wxString str; if (datFile.IsOpened() && 1 == resNumInt) { str = datFile.GetFirstLine(); datFile.Close(); } else if (datFile.IsOpened() && resNumInt > 1) { datFile.GetFirstLine(); for (int i = 1; !datFile.Eof(); str = datFile.GetNextLine()) { // 上から読み込んでレス番号にあたる行のレスを取得する if (i == resNumInt) { datFile.Close(); break; } ++i; } } wxString res = wxEmptyString; if (useTriangularBrackets) { res = wxT(">"); } // 正規表現でレスの内容を取り出してメモリに展開する /** ex) レスの形式 * * [デフォルト名無し]<>[メ欄]<>[yyyy/mm/dd(D) HH:MM:SS:ss ID:aaaaaaaaa BE:xxxxxxxxx-2BE(n)]<>[書き込み]<>板名 * [デフォルト名無し]<>[メ欄]<>[yyyy/mm/dd(D) HH:MM:SS:ss ID:aaaaaaaaa]<>[書き込み]<> */ if (regexThread.IsValid() && resNumInt > 1) { // >>1 以外の処理 if (regexThread.Matches(str)) { res.Append(regexThread.GetMatch(str, 4)); // レスの最後に改行 res.Replace(wxT(BR), useTriangularBrackets ? wxT("\n>") : wxT("\n"), true); res.Append(wxT("\n")); } } else if (regexThreadFst.IsValid() && resNumInt == 1) { // >>1 の場合の処理 if (regexThreadFst.Matches(str)) { res.Append(regexThreadFst.GetMatch(str, 4)); // レスの最後に改行 res.Replace(wxT(BR), useTriangularBrackets ? wxT("\n>") : wxT("\n"), true); res.Append(wxT("\n")); } } // HTMLのタグを削除する if (regexHtmlTag.IsValid()) { regexHtmlTag.ReplaceAll(&res, wxEmptyString); } // 実態参照文字を変換 res = ConvCharacterReference(res); return res; }
/** * アンカーで指定されたレスをファイルから読み取ってDOM形式にして送り返す * @param const wxString& boardNameAscii 板名の英語名 * @param const wxString& origNumber UNIXタイムベースのオリジナルな番号 * @param const wxString& resNumberStart 取得するレスの番号(開始点) * @param const wxString& resNumberEnd 取得するレスの番号(終了点) * @return wxString 取得したレスの内容 */ wxString XrossBoardUtil::FindAnchoredResponse(const wxString& boardNameAscii, const wxString& origNumber, const wxString& resNumberStart, const wxString& resNumberEnd) { // ファイルパスの組み立てとファイルの有無確認 const wxDir dir(::wxGetHomeDir() + wxFILE_SEP_PATH + XROSSBOARD_DIR); wxString filePath = dir.GetName(); // 複数レスをポップアップさせる bool popupMultiResponse = false; // 入力文字列の検証 int start = wxAtoi(resNumberStart); if ( start < 0 || 1000 < start ) return wxEmptyString; int end = 0; if (resNumberEnd != wxEmptyString) { end = wxAtoi(resNumberEnd); if ( end < 0 || 1000 < end ) { return wxEmptyString; } // 複数レス用フラグを立てる popupMultiResponse = true; } filePath += wxFILE_SEP_PATH; filePath += wxT("dat"); filePath += wxFILE_SEP_PATH; filePath += boardNameAscii; filePath += wxFILE_SEP_PATH; filePath += origNumber; filePath += wxT(".dat"); if (!wxFile::Exists(filePath)) { // 無ければ空文字リターン return wxEmptyString; } // HTMLのDOM形式にする wxString lumpOfHTML = HTML_HEADER_POPUP; wxString default_nanashi, mail, day_and_ID, res; if (popupMultiResponse) { /** * 複数レスをポップアップさせる */ wxTextFile datFile; datFile.Open(filePath, wxConvUTF8); wxArrayString arraystr; for (int i = start; i < end + 1; i++) { arraystr.Add(datFile[i-1]); } datFile.Close(); for (int i = 0; i < arraystr.GetCount(); i++) { int curnumber = i + start; wxString str = arraystr[i]; lumpOfHTML += wxT("<dt>"); lumpOfHTML += wxString::Format(wxT("%d"), curnumber); if (regexThread.IsValid() && curnumber > 1) { // >>1 以外の処理 if (regexThread.Matches(str)) { // マッチさせたそれぞれの要素を取得する default_nanashi = regexThread.GetMatch(str, 1); mail = regexThread.GetMatch(str, 2); day_and_ID = regexThread.GetMatch(str, 3); // レスの最初に<table>タグを入れる res.Append(wxT("<table border=0 id=\"") + wxString::Format(wxT("%d"), curnumber) + wxT("\">")); res.Append(regexThread.GetMatch(str, 4)); res.Append(wxT("</table>")); // レス内部のURLに<a>タグをつける res = ReplaceURLText(res); // レスの最後に改行 res.Append(wxT(BR)); } } else if (regexThreadFst.IsValid() && curnumber == 1) { // >>1 の場合の処理 if (regexThreadFst.Matches(str)) { // マッチさせたそれぞれの要素を取得する default_nanashi = regexThreadFst.GetMatch(str, 1); mail = regexThreadFst.GetMatch(str, 2); day_and_ID = regexThreadFst.GetMatch(str, 3); // レスの最初に<table>タグを入れる res.Append(wxT("<table border=0 id=\"") + wxString::Format(wxT("%d"), curnumber) + wxT("\">")); res.Append(regexThreadFst.GetMatch(str, 4)); res.Append(wxT("</table>")); // レス内部のURLに<a>タグをつける res = ReplaceURLText(res); // レスの最後に改行 res.Append(wxT(BR)); } } if (mail != wxEmptyString) { // もしメ欄になにか入っているならば lumpOfHTML += wxT(" 名前:<a href=\"mailto:"); lumpOfHTML += mail; lumpOfHTML += wxT("\"><b>"); lumpOfHTML += default_nanashi; lumpOfHTML += wxT("</b></a>"); lumpOfHTML += day_and_ID; lumpOfHTML += wxT("<dd>"); lumpOfHTML += res; } else { // 空の場合 lumpOfHTML += wxT(" 名前:<font color=green><b>"); lumpOfHTML += default_nanashi; lumpOfHTML += wxT("</b></font>"); lumpOfHTML += day_and_ID; lumpOfHTML += wxT("<dd>"); lumpOfHTML += res; } } } else { /** * 単独レスをポップアップさせる */ wxTextFile datFile; datFile.Open(filePath, wxConvUTF8); wxString str; if (datFile.IsOpened() && 1 == start) { str = datFile.GetFirstLine(); datFile.Close(); } else if (datFile.IsOpened() && start > 1) { datFile.GetFirstLine(); for (int i = 1; !datFile.Eof(); str = datFile.GetNextLine()) { // 上から読み込んでレス番号にあたる行のレスを取得する if (i == start) { datFile.Close(); break; } ++i; } } // 正規表現でレスの内容を取り出してメモリに展開する lumpOfHTML += wxT("<dt>"); lumpOfHTML += resNumberStart; /** ex) レスの形式 * * [デフォルト名無し]<>[メ欄]<>[yyyy/mm/dd(D) HH:MM:SS:ss ID:aaaaaaaaa BE:xxxxxxxxx-2BE(n)]<>[書き込み]<>板名 * [デフォルト名無し]<>[メ欄]<>[yyyy/mm/dd(D) HH:MM:SS:ss ID:aaaaaaaaa]<>[書き込み]<> */ if (regexThread.IsValid() && start > 1) { // >>1 以外の処理 if (regexThread.Matches(str)) { // マッチさせたそれぞれの要素を取得する default_nanashi = regexThread.GetMatch(str, 1); mail = regexThread.GetMatch(str, 2); day_and_ID = regexThread.GetMatch(str, 3); // レスの最初に<table>タグを入れる res.Append(wxT("<table border=0 id=\"") + resNumberStart + wxT("\">")); res.Append(regexThread.GetMatch(str, 4)); res.Append(wxT("</table>")); // レス内部のURLに<a>タグをつける res = ReplaceURLText(res); // レスの最後に改行 res.Append(wxT(BR)); } } else if (regexThreadFst.IsValid() && start == 1) { // >>1 の場合の処理 if (regexThreadFst.Matches(str)) { // マッチさせたそれぞれの要素を取得する default_nanashi = regexThreadFst.GetMatch(str, 1); mail = regexThreadFst.GetMatch(str, 2); day_and_ID = regexThreadFst.GetMatch(str, 3); // レスの最初に<table>タグを入れる res.Append(wxT("<table border=0 id=\"") + resNumberStart + wxT("\">")); res.Append(regexThreadFst.GetMatch(str, 4)); res.Append(wxT("</table>")); // レス内部のURLに<a>タグをつける res = ReplaceURLText(res); // レスの最後に改行 res.Append(wxT(BR)); } } if (mail != wxEmptyString) { // もしメ欄になにか入っているならば lumpOfHTML += wxT(" 名前:<a href=\"mailto:"); lumpOfHTML += mail; lumpOfHTML += wxT("\"><b>"); lumpOfHTML += default_nanashi; lumpOfHTML += wxT("</b></a>"); lumpOfHTML += day_and_ID; lumpOfHTML += wxT("<dd>"); lumpOfHTML += res; } else { // 空の場合 lumpOfHTML += wxT(" 名前:<font color=green><b>"); lumpOfHTML += default_nanashi; lumpOfHTML += wxT("</b></font>"); lumpOfHTML += day_and_ID; lumpOfHTML += wxT("<dd>"); lumpOfHTML += res; } } // HTMLソースを加える lumpOfHTML += HTML_FOOTER; return lumpOfHTML; }
wxRCT3Filler(wxSQLite3Database* db, const wxDir& root): m_db(db), // m_pd(_("Scanning RCT3 Directory"), wxT("Scanning"), 1000, NULL, wxPD_AUTO_HIDE | wxPD_APP_MODAL | wxPD_ELAPSED_TIME), m_pd(), m_root(root.GetName(), wxT("")) {};