トップページ⇒tech
12コメント9KB

2ch log cutter

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
2chのログカッターを作ろうかと思っています。
今のところ下記のような感じです。
ご意見求む。

各スレッドのデータ構造

<title>[スレッドタイトル]</title>
<dl>[スレッドデータ]

<dt>[発言no] 名前:<font color="forestgreen"><b>[名前(ほとんど意味なし)]</b></font>投稿日:[yyyy/mm/dd(曜) hh:mm]
<dd>[発言内容]<br> <br><br>

</dl>

上記のデータ以外は無意味なのでカットする。
名前も意味がないことがほとんどなのでカットする。
<br>はウザイのでカットし、空行から空行までを<p>で囲む(<br>が2個以上連続で空行)。
以下のようなフォーマットに整形。

(理想のフォーマット)

<thread>
<thtitle>[スレッドタイトル]</thtitle>

<no>[発言no]</no>
<date>[yyyy/mm/dd(曜) hh:mm]</date>
<data>[発言内容]</data>

</thread>

表示する際にはインチキヘッダを付加し、

<thtitle> -> <h1>
<no>+<date> -> <dt>
<data> -> <dd>

とタグ変換する。
0002デフォルトの名無しさんNGNG
おもしろそ
0003デフォルトの名無しさんNGNG
データファイルはXML準拠にして、XSLT使って表示すればいいのでは?
IE限定になりますが。
0004デフォルトの名無しさんNGNG
何に使うの?
0005デフォルトの名無しさんNGNG
単純なCSVでいいじゃん。
正しくて遅いものなんて2ちゃんでは相手にされないよ。
0006デフォルトの名無しさんNGNG
パーサー作るのが面倒そうなので却下。
@`とか<>で区切ればいいでしょ。
0007JavaNGNG
JavaCCだJavaCCをツカエ
http://www.metamata.com/JavaCC/
http://www.ingrid.org/java/javacc/murata.html
Javaマンセー
00081NGNG
3さんの言うようにするのが正しいのでしょうが、5さんの言うように重くなります。
そのために表示用のインチキHTMLヘッダをつけてHTMLに変換するのです。
6さんは難しく考えすぎです。単にデータファイルから必要なところだけぶっこ抜いて
用意したオブジェクト(上のようなフォーマット)にぶちこんで、書き出すだけですから
DTDだのパーザだのはいりません。XMLは形を借りてるだけです。置き換えスクリプト
書くの楽ですから。
>4さん
2chは有用な情報とどうでもいい情報(?)が混在していて、しかも重いので、
いかにゴミを搾り取って有用な情報だけを効率的に抽出するか考えているのです。
基本のフィルタを作った後は、しょうもないアスキーアートを自動駆除できるように
したいな〜とか考えてます。
00096NGNG
>>8
嫌だって言った理由はXMLとかだと
わけのわからん(サイズも大きい)ライブラリをインストールしまくらないと
使うことさえ出来ないのが嫌だったのよ。
じゃーまーとりあえず前に書いたdat形式を
HTMLに変換するスクリプトをのせておこうかな。
0010デフォルトの名無しさんNGNG
#!/usr/bin/perl

use strict;
use File::Basename;
require "jcode.pl";


my $http_pattern = '((http|https)://[a-zA-Z0-9\.\/\~\:\?\#\@\&\-\+\=;%_]+)';
my $ttp_pattern = 'ttp(://[a-zA-Z0-9\.\/\~\:\?\#\@\&\-\+\=;%_]+)';
my $ftp_pattern = '(ftp://[a-zA-Z0-9\.\/\~\:\?\#\@\&\-\+\=;%_]+)';

&main;
exit;


sub main
{
my $i;

open( OUTIDX@` ">index.html" );

print OUTIDX << "EOF";
<HTML>
<HEAD>
<META http-equiv="Content-type" content="text/html; charset=EUC-JP">
<TITLE></TITLE>
</HEAD>
<BODY TEXT="#000000" BGCOLOR="#EFEFEF" LINK="#0000FF" ALINK="#FF0000" VLINK="#660099">
EOF

for ( $i = 0; $i <= $#ARGV; ++$i )
{
print "$i: $ARGV[$i] -> "@` basename( $ARGV[$i] )@` ".html\n";
dat2html( $ARGV[$i] );
}


print OUTIDX << "EOF";
</BODY>
</HTML>
EOF
close( OUTIDX );
}


# 0 投稿者の名前
# 1 メールアドレス
# 2 日付
# 3 内容
# 4 タイトル
sub dat2html
{
my( $fn ) = @_;
my( $e@` @e@` @top_data );

open( IN@` $fn ) || die "Can't open \"$fn\".";

my $real_fn = basename( $fn ) . ".html";
open( OUT@` ">$real_fn" ) || die "Can't open \"$real_fn\"";

$e = <IN>;
&jcode::convert( \$e@` "euc" );
@e = split( /@`/@` $e );
@top_data = @e;

print OUT << "EOF";
<HTML>
<HEAD>
<META http-equiv="Content-type" content="text/html; charset=EUC-JP">
<TITLE>$e[4]</TITLE>
</HEAD>
<BODY TEXT="#000000" BGCOLOR="#EFEFEF" LINK="#0000FF" ALINK="#FF0000" VLINK="#660099">

<P><FONT SIZE="+1" COLOR="red">$e[4]</FONT><BR>

<DL>
EOF

my $i = 1;

do
{
&jcode::convert( \$e@` "euc" );
@e = split( /@`/@` $e );

if ( $e[1] eq "" )
{
print OUT "<DT>$i 名前:<FONT COLOR=\"forestgreen\"><B>$e[0]</B></FONT>";
}
else
{
print OUT "<DT>$i 名前:<FONT COLOR=\"forestgreen\"><B><A HREF=\"mailto:$e[1]\">$e[0]</A></B></FONT>";
}


$e[3] =~ s!$http_pattern!<A HREF="$1">$1</A>!g;
$e[3] =~ s!$ttp_pattern!<A HREF="http$1">http$1</A>!g;
$e[3] =~ s!$ftp_pattern!<A HREF="$1">$1</A>!g;

print OUT "投稿日:$e[2]<DD>$e[3]<BR><BR>\n";

++$i;
}
while ( $e = <IN> );


print OUT << "EOF";
</DL>
</BODY>
</HTML>
EOF
close( IN );
close( OUT );


my $max_write_id = $i - 1;
print OUTIDX << "EOF";
<A HREF="$real_fn">$top_data[4] ($max_write_id)</A><BR>
EOF

}
0011名無しさん || dieNGNG
ついでに漏れはRuby版を。
かちゅ〜しゃのログコンバータだけどdatも逝ける。
http://nuna.tripod.co.jp/logconv_rb.txt

>>8
フィルタリングするなら*.datファイルを直接処理した方が良いと思う。
00121NGNG
6さん、11さんありがとう。参考になりました。
6さんのスクリプトを改造して名前とかフォントタグとかを削りました。
<br>タグの排除は箇条書きとして使われているところがあるので、
なかなか難しいですね。どうしよう。

do while構文のところがよく分からず無限ループになってしまったので、
禁断のコピペをしてしまいました・・・Larry先生ごめんなさい。

性能はまぁまぁいいと思います。300ファイルぐらいを1分程度で処理しま
した。あとはログを自動で持ってくるスクリプトを書くだけです。HTTPライ
ブラリでしたっけ?

http://www.angelfire.com/wv2/epmrbv/2chcutter.pl.txt
■ このスレッドは過去ログ倉庫に格納されています