Skip to content

Commit

Permalink
変換処理部、ひとまず
Browse files Browse the repository at this point in the history
  • Loading branch information
onihusube committed Jun 18, 2023
1 parent e7a45fd commit 69dd466
Show file tree
Hide file tree
Showing 2 changed files with 90 additions and 13 deletions.
86 changes: 73 additions & 13 deletions HtmlConverter/HtmltoDat.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using System;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
Expand Down Expand Up @@ -235,21 +235,22 @@ private StringBuilder CGI202306_ConvertProcess(string title, string URI, string
// レスの連続抽出はざっくりとやる
var ResMatches = Regex.Matches(allres, @"<article id=.+?</section></article>");
// ↑で抽出した1つのレス内で各要素を抽出
Regex ResContent = new Regex(@"<article id=.(?<num>\d+?).+?<summary>.+?<span class=.postusername.>(?<name><b>.+?</b>)</span></summary><span class=.date.>(?<date>.+?)</span>(?:<span class=.uid.>(?<id>ID:\w+?)</span>)?</details><section class=.post-content.>(?<massage> .+? )</section></article>");
Regex ResContent = new Regex(@"<article id=.(?<num>\d+?).+?<summary>.+?<span class=.postusername.>(?<name><b>.+?</b>)</span></summary><span class=.date.>(?<date>.+?)</span><span class=.uid.>(?<id>.+?)</span>(?<be><span class=.be.+?</span>)?</details><section class=.post-content.>(?<massage>.+?)</section></article>");

// 旧型式(API移行直後のhtml形式)の処理を再利用するために、レス部分のhtmlを1レスづつ旧型式に変換する
// 細部のハンドリングを継承するための措置
foreach (Match resmatch in ResMatches)
{
Match res_content = ResContent.Match(resmatch.Value);

string resnumber = res_content.Groups["num"].Value;
string name = res_content.Groups["name"].Value;
string date = res_content.Groups["date"].Value;
string id = res_content.Groups["id"].Value; // キャプチャ無し(IDなし)の場合は空文字になる(らしい
string id = res_content.Groups["id"].Value; // キャプチャ無し(IDなし)の場合は空文字列になる(らしい
string be = res_content.Groups["be"].Value; // 無ければ空文字列
string message = res_content.Groups["massage"].Value;

// いくつかのコーナーケースのハンドル処理
// ただし、これらがこの形式でも出現するのかは未確認

// 0,NGの検出
if (resnumber == "0" && date == "NG")
Expand All @@ -262,24 +263,63 @@ private StringBuilder CGI202306_ConvertProcess(string title, string URI, string
{
for (int j = htmlResnumber - datResnumber; j > 0; --j)
{
Builddat.Append("うふ~ん<>うふ~ん<>うふ~ん ID:DELETED<>うふ~ん<>うふ~ん<>\n");
Builddat.Append("うふ~ん<>うふ~ん<>うふ~ん<>うふ~ん<>うふ~ん\n");
}
datResnumber = htmlResnumber;
}
// あぼーんの検出(pinkはたぶんうふ~んになる)
if (date == "NG" && message == "あぼーん")
{
// 昔はID:DELETEDになっていたらしいが今は違う
// datでは "あぼーん<>あぼーん<>あぼーん<>あぼーん<>あぼーん"のようになる
// ここで直でdat構築したほうが早そう
date = "あぼーん";
id = "";
}
if (string.IsNullOrEmpty(be))
{
// beリンクの変換
// <span class="be r2BP"><a href="http://be.5ch.net/user/823355746" target="_blank">?2BP(0)</a></span> これを
// <a href="javascript:be(823355746);">?2BP(0)</a> みたいにする

var mb = Regex.Match(be, @"<a href.+?(\d{2,}).+?>(.+)</span>");
be = $" <a href={'"'}javascript:be({mb.Groups[1].Value});{'"'}>{mb.Groups[2].Value}";

// 本文内のアイコンリンクは処理する必要ない
}
if (message.Contains("<span class="))
{
// <span class="AA">を無視する
message = Regex.Match(message, @"^<span class=.+?>(.+?)</span>$").Groups[1].Value;
}
if (Regex.IsMatch(message, $@" class=.reply_link.>") == true)
{
// class="reply_link"を取り除く
// rel="noopener noreferrer" target="_blank" の2つの属性だけが安価リンクには残る
message = Regex.Replace(message, @" class=.reply_link.>", ">");

// これ以上の安価リンク処理は必要ない
}

// 本文を先に追加
Bres.Append(message);

// p53など、レス前後にスペースが無いときに補う。
if (!Regex.IsMatch(message, @"^\s.+\s$"))
{
Bres.Insert(0, " ");
Bres.Append(" ");
}

//Bres.Insert(0, ":" + dateid + be + "<dd>");
//Bres.Insert(0, "<dt>" + number + " :" + name);
//Bres.Append("<br><br>");

// ↓こうなるように変換
// <dt>{レス番} :<b>{メールリンク}{名前}</b>:{日付} {ID}{beリンク}<dd> {本文} <br><br>
// IDがない時でも日付の後ろにスペースは入る

Bres.Insert(0, $"<dt>{resnumber}{name}{date} {id}{be}<dd>");
Bres.Append("<br><br>");
// レス1つ分をdat形式へ変換
//Builddat.Append(html2dat(Bres.ToString()));
Builddat.Append(html2dat(Bres.ToString()));

// 1レス目の末尾にはタイトルを付加する
if (!String.IsNullOrEmpty(title))
{
Expand Down Expand Up @@ -412,10 +452,13 @@ private StringBuilder CommonConvertProcess(string title, string URI, string allr
// class="reply_link"
message = Regex.Replace(message, $@"\sclass={'"'}reply_link{'"'}>", ">");
}
//安価のリンク修正、http://potato.2ch.net/test/read.cgi/jisaku/1447271149/9→../test/read.cgi/jisaku/1447271149/9
// 安価のリンク修正、http://potato.2ch.net/test/read.cgi/jisaku/1447271149/9→../test/read.cgi/jisaku/1447271149/9
// どうやら現在はこれ治ってるらしく、一時的なものだった模様
Bres.Append(message);
foreach (Match item in Regex.Matches(message, @"(<a href=.)(?:https?:)?//\w+\.((?:2|5)ch\.net|bbspink\.com)(/test/read.cgi/\w+/\d+/\d{1,4}.\s.+?>&gt;&gt;\d{1,5}</a>)"))
{
// こういう-> <a href="../test/read.cgi/software/1458275801/1" rel="noopener noreferrer" target="_blank">&gt;&gt;1</a>
// 形式にしたい(rel="noopener noreferrer" target="_blank"の2つの属性はdatにもある、それ以外はない)
Bres.Replace(item.Groups[0].Value, item.Groups[1].Value + ".." + item.Groups[3].Value);
}
//お絵かきリンク修正
Expand Down Expand Up @@ -572,6 +615,12 @@ private Byte[] HTMLTranceOutRegex(String URI, int range, String UA, String LastM
/// <returns>変換されたdat一行</returns>
private static String html2dat(String res)
{
// ここでの入力は1レス1行の、次のようなもの
// API導入以前のHTML形式
// <dt>126 :<font color="green"><b>名無し募集中。。。</b></font>:2019/04/22(月) 00:42:21.47 0<dd> <a href="../test/read.cgi/morningcoffee/1555849244/67" rel="noopener noreferrer" target="_blank">&gt;&gt;67</a> <br> 待ってました! <br><br>
// <dt>138 :<a href="mailto:sage"><b>名無し募集中。。。</b></a>:2019/04/22(月) 01:25:43.27 0<dd> こりゃ陸上競技見に行かなあかんな <br><br>
// <dt>147 :<font color="green"><b>名無し募集中。。。</b></font>:2019/04/22(月) 08:44:08.35 0<dd> 良スレ=基地外がいないマターリスレになるからね <br><br>

var BuildDat = new StringBuilder(res.Length * 2);
String temp;
bool be = false;
Expand All @@ -586,10 +635,18 @@ private static String html2dat(String res)
//あぼ~ん時の処理
if (Regex.IsMatch(temp, @">:(.+\sID:DELETED)"))
{
// 最終的なdatは"あぼ~ん<>あぼ~ん<>あぼ~ん ID:DELETED<>あぼ~ん<>あぼ~ん<>"のようになる(末尾足りてない?)
BuildDat.Append(Regex.Match(temp, @">:(.+\sID:DELETED)").Groups[1].Value + "<>");
goto honbun;
}

//あぼ~ん時の処理2、ID:DELETEDではない現在(2023/06頃)の形式(pinkはどうなる?
if (Regex.IsMatch(temp, @">:あぼーん "))
{
// 最終的なdatは"あぼーん<>あぼーん<>あぼーん<>あぼーん<>あぼーん"のようになる(末尾1つ多い)
BuildDat.Append("あぼーん<>あぼーん<>あぼーん");
goto skip_abone;
}

//投稿日時+ID抽出
var DateID = Regex.Match(temp, @":(?:(?<date>\d{4}\/.+ID:.+)\s<a\s|(?<date>\d{4}\/.+ID:.+)<dd>|(?<date>\d{4}\/.+?)<dd>\s<a\s|(?<date>\d{4}\/.+?)\s<a\s|(?<date>\d{4}\/.+)<dd>)").Groups["date"].Value;
BuildDat.Append(DateID);
Expand Down Expand Up @@ -670,6 +727,7 @@ private static String html2dat(String res)
}
else
{
// ssspの前にスペース入ってるのはバグではないのか??
ResBody.Replace(mae[1].Value, " sssp:" + mae[2].Value + mae[3].Value);
}
}
Expand All @@ -690,6 +748,8 @@ private static String html2dat(String res)
BuildDat.Replace("<br> <>", "<br> <>");
BuildDat.Replace("<br> <>", "<br> <>");

skip_abone: // あぼーん時のスキップ

//<br>の連続時にスペースを補う
BuildDat.Replace("<br> <br>", "<br> <br>");
return BuildDat.Replace("<br> <br>", "<br> <br>").ToString();
Expand Down
17 changes: 17 additions & 0 deletions doc/html20230615/testdata.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<article id="3" data-date="NG" data-userid="ID:Nzcn4Kgf0" data-id="3" class="clear post"><details open class="post-header"><summary><span class="postid">0003</span><span class="postusername"><b><a href="mailto:sage">名無しさん@お腹いっぱい。</a></b></span></summary><span class="date">2023/05/13(土) 20:21:15.82</span><span class="uid">ID:Nzcn4Kgf0</span></details><section class="post-content"> こいつどうする <br> <br> 2chAPIProxy 23 <br> <a href="https://egg.5ch.net/test/read.cgi/software/1683969568/">https://egg.5ch.net/test/read.cgi/software/1683969568/</a> </section></article>

<article id="4" data-date="NG" data-userid="ID:Nzcn4Kgf0" data-id="4" class="clear post"><details open class="post-header"><summary><span class="postid">0004</span><span class="postusername"><b><a href="mailto:sage">名無しさん@お腹いっぱい。</a></b></span></summary><span class="date">2023/05/13(土) 20:25:39.03</span><span class="uid">ID:Nzcn4Kgf0</span></details><section class="post-content"> 1 名前:名無しさん@お腹いっぱい。 (アウアウウー Sa37-OAGI [106.133.99.247 [上級国民]])[sage] 投稿日:2023/05/13(土) 18:19:28.83 ID:77/dCGkCa <br> !extend:checked:vvvvvv:1000:512 <br> <br> 前スレ <br> 2chAPIProxy 22 <br> <a href="https://egg.5ch.net/test/read.cgi/software/1675228865/">https://egg.5ch.net/test/read.cgi/software/1675228865/</a> <br> <br> VIPQ2_EXTDAT: checked:vvvvvv:1000:512:: EXT was configured </section></article>

<article id="5" data-date="NG" data-userid="ID:S9rOoEW40" data-id="5" class="clear post"><details open class="post-header"><summary><span class="postid">0005</span><span class="postusername"><b><a href="mailto:sage">名無しさん@お腹いっぱい。</a></b></span></summary><span class="date">2023/05/13(土) 20:29:02.06</span><span class="uid">ID:S9rOoEW40</span></details><section class="post-content"> うんこビチグソ絶不調です! </section></article>

<article id="6" data-date="NG" data-userid="ID:ssjUoYJo0" data-id="6" class="clear post"><details open class="post-header"><summary><span class="postid">0006</span><span class="postusername"><b><a href="mailto:sage">名無しさん@お腹いっぱい。</a></b></span></summary><span class="date">2023/05/13(土) 20:47:34.41</span><span class="uid">ID:ssjUoYJo0</span></details><section class="post-content"> こっちか </section></article>

<article id="7" data-date="NG" data-userid="ID:Nzcn4Kgf0" data-id="7" class="clear post"><details open class="post-header"><summary><span class="postid">0007</span><span class="postusername"><b><a href="mailto:sage">名無しさん@お腹いっぱい。</a></b></span></summary><span class="date">2023/05/13(土) 20:51:10.08</span><span class="uid">ID:Nzcn4Kgf0</span></details><section class="post-content"> <a href="../test/read.cgi/software/1683972382/3" rel="noopener noreferrer" target="_blank" class="reply_link">&gt;&gt;3</a> <br> 埋めとけ </section></article>

<article id="8" data-date="NG" data-userid="ID:LdU3YexI0" data-id="8" class="clear post"><details open class="post-header"><summary><span class="postid">0008</span><span class="postusername"><b>名無しさん@お腹いっぱい。</b></span></summary><span class="date">2023/05/13(土) 21:24:24.80</span><span class="uid">ID:LdU3YexI0</span></details><section class="post-content"> 早速ワッチョイなしスレで自演か </section></article>

<article id="18" data-date="NG" data-userid="NG" data-id="18" class="clear post"><details open class="post-header"><summary><span class="postid">0018</span><span class="postusername"><b><a href="mailto:やっとでました">p53 ★</a></b></span></summary><span class="date">NG</span><span class="uid">NG</span></details><section class="post-content">p53 ver 0.16 (Perl,SJIS) 2016/01/04 FOX. [on] <br>元のスレ <a href="http://hope.5ch.net/test/read.cgi/idol/1451917253/1">http://hope.2ch.net/test/read.cgi/idol/1451917253/1</a> <br><b>18422 -> 4827</b> (バイト)<br>p53 このスレは検体(実験台)です。巨大コピペ大歓迎。<br>p53 とは、<a href="http://jump.5ch.net/?http://server.maido3.com/?txt=kirei#top" target="_blank">http://server.maido3.com/?txt=kirei#top</a><br></section></article>

<article id="3" data-date="NG" data-userid="ID:Nzcn4Kgf0" data-id="3" class="clear post"><details open class="post-header"><summary><span class="postid">0003</span><span class="postusername"><b><a href="mailto:sage">名無しさん@お腹いっぱい。</a></b></span></summary><span class="date">2023/05/13(土) 20:21:15.82</span><span class="uid">ID:Nzcn4Kgf0</span></details><section class="post-content"><span class="AA"> フッフッフ、私の呪縛は死ぬまで解けないぞ </span></section></article>

<article id="2" data-date="NG" data-userid="ID:QOxLhn3Q" data-id="2" class="clear post"><details open class="post-header"><summary><span class="postid">0002</span><span class="postusername"><b>名無しさん@ログイン中</b></span></summary><span class="date">2022/09/05(月) 19:05:55.09</span><span class="uid">ID:QOxLhn3Q</span><span class="be rS★"><a href="http://be.5ch.net/user/676665312" target="_blank">?S★(2770727)</a></span></details><section class="post-content"> <img src="//img.5ch.net/premium/6666924.gif"> <br> テスト </section></article>

1 comment on commit 69dd466

@onihusube
Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

#11

Please sign in to comment.