2007年7月25日水曜日

Jane用のNGExメモ

永遠に「書きかけ」かもしれません。

>1-1000

[>1-1000]
MsgType = 正規(含む)
MsgBody="(?:>|>)[11]\-(?:1000|1000)"
Option = 透明あぼーん, NGIDへの自動追加

>1-1000を含む書き込みをあぼーんします。

メール欄が sage 以外

[メール欄 [Not sage]]
MailType = 正規(含まない)
MailBody="sage|^$"
Option = 透明あぼーん

メール欄が sage ではない書き込みをあぼーんします。 ただし、メール欄が空欄の記事にはマッチしません。 (投稿者が2ちゃんねるの仕様を知らずにスレッドを上げる事があるため)

4文字以下のレス

[4文字以下のレス]
MsgType = 正規(含む)
MsgBody="^(?:[  ]*<br>)*[  ]*[^<]{1,4}(?:[  ]*<br>)*[  ]*$"
Option = 透明あぼーん

4文字以下の書き込みをあぼーんします。(全角文字も1文字としてカウントします)

連続英文字

[連続英文字 (6文字以上)]
MsgType = 正規(含む)
MsgBody="[^#]([a-vx-za-vx-z])\1{5}(?! *;|["'])"
Option = 透明あぼーん, NGIDへの自動追加

"aaaaa" など、6文字以上の連続した英字を含む書き込みをあぼーんします。
<span style="color: #ffffff;"> のようなCSSのカラーコードに誤爆するのを防ぐための処理を入れてあります。

漢字15文字

[漢字15文字]
MsgType = 正規(含む)
MsgBody="[一-龠]{15}"
Option = 透明あぼーん, NGIDへの自動追加

連続した15文字の漢字を含む書き込みをあぼーんします。 どこかのスレッドから借用させていただきました。

~GET

[~GET]
MsgType = 正規(含む)
MsgBody="[\d0-9](?:げっと|ゲット|get|get)"
Option = 透明あぼーん, NGIDへの自動追加

レス番ゲッターをあぼーんします。

まだ~?

[まだ~?]
MsgType = 正規(含む)
MsgBody="[まママ][~ーーぁァ]*(?:[だダ]|ダ)[~ーーぁァ]+[??]"
Option = 透明あぼーん

間延びした「まだ~?」発言をあぼーんします。

文末中傷

[文末中傷]
MsgType = 正規(含む)
MsgBody="(?:アホスレ|キモイ|イラネ|いらね|必死だな|最低だな|最悪だな|グロだな|[\((  ](?:プ|プ|はぁと)+)(?:$|[ w\( w(]|<br>)"
Option = 透明あぼーん, NGIDへの自動追加

文末の中傷発言をあぼーんします。

文意不明なレス

[文意不明なレス]
MsgType = 正規(含む)
MsgBody="^(?:[  ]*<br>)*[  ]*(?:[ !\d0-9 !]|age|sage)+(?:[  ]*<br>)*[  ]*$"
Option = 透明あぼーん, NGIDへの自動追加

「数字」「感嘆符 (!)」「age」「sage」のみで構成される書き込みをあぼーんします。

保守

[保守]
MsgType = 正規(含む)
MsgBody="^[  ]*(?:保守|ほしゅ|ホッ?シュ|hos[hy]u)[  。]*$"
Option = 透明あぼーん

保守のみの書き込みをあぼーんします。 書き込み自体は有り難いのですが、視覚スペースを増やしたいので消しています。

誤爆

[誤爆]
MsgType = 正規(含む)
MsgBody="^[  ]*↑?誤爆[  ]*$"
Option = 透明あぼーん, NGIDへの自動追加

「↑誤爆」のみの書き込みをあぼーんします。(誤爆を装った荒らし)

オレオレ

[オレオレ]
MsgType = 正規(含む)
MsgBody="(?:(?:俺|オレ|おれ|漏れ)も?){2}"
Option = 透明あぼーん

オレオレ詐欺師を消し去ります。

「死ね」「氏ね」「市ね」

[死ね]
MsgType = 正規(含む)
MsgBody="[死氏市][  ]*ね"
Option = 透明あぼーん, NGIDへの自動追加

「死ね」「氏ね」「市ね」を含む書き込みをあぼーんします。

スクリプトによる自動書き込み

[スクリプトによる自動書き込み]
MsgType = 正規(含む)
MsgBody="犯[  ]*罪[  ]*者|自[  ]*首|変[  ]*態|下[  ]*衆|知[  ]*障|池[  ]*沼|低[  ]*脳|社[  ]*会[  ]*の[  ]*ダ[  ]*ニ|溜[  ]*ま[  ]*り[  ]*場"
Option = 透明あぼーん, NGIDへの自動追加

スクリプトによる自動書き込みをあぼーんします。 当時、猛威を振るっていたのは「AntiDojin」とか「Antilo」とかその辺りのウイルスだったと思います。 現在は脅威ではありませんが、中傷コメントにもマッチするので残してあります。

空白区切り文字

[空白区切り文字 (4文字)]
MsgType = 正規(含む)
MsgBody="(?:[ w w]+[ぁ-龠]){4}(?=[ <w w]|$)"
Option = 透明あぼーん

「テ ス ト で す よ ?」のような空白区切りの文字列を含む書き込みあぼーんします。
空白文字ではありませんが、"w" 区切りにも該当し、例えば「みwなwぎwっwてwきwたw」をあぼーんできます。

縦書き (4文字)

[縦書き (4文字)]
MsgType = 正規(含む)
MsgBody="(?:^|<br>)[  ]*[^ < ](?:(?:[  ]*<br>)+[  ]*[^ < ]){3}(?=[  ]*(?:<br>|$))"
Option = 透明あぼーん

改行を利用した縦書き4文字を含む書き込みをあぼーんします。 1行置きの縦書きにも対応しています。

投稿記事のコピペ

[投稿記事のコピペ]
MsgType = 正規(含む)
MsgBody="投稿日[::][  ]*\d{2,4}/\d{2}/\d{2}\([^)]+\)[  ]*\d{2}:\d{2}:\d{2}"
Option = 透明あぼーん

2ちゃんねるの投稿記事をコピペした書き込みをあぼーんします。 Janeのデフォルトスキン(2ちゃんねるをブラウザで見たときと同じ)からコピペした書式にしか対応していないので、全てのコピペには対応できていません。 ですが、結構マッチしてくれます。

[画像リンクの連投 (1行×5 / 完全一致)]
MsgType = 正規(含む)
MsgBody="^(?:[  ]*<br>)*[  ]*(?:h?ttp://[\w-]{1,63}(?:\.[\w-]{1,63}){0,4}\.[\w-]{2,6}(?::\d{1,5}|(?![.\w\-:]))/[!=#-&(-;?-[\]-~]+\.(?:jpg|png|gif|bmp)(?:[  ]*<br>)*[  ]*){5,}$"
Option = 透明あぼーん, NGIDへの自動追加
http://test.com/test1.jpg
http://test.com/test2.jpg
http://test.com/test3.jpg
http://test.com/test4.jpg
http://test.com/test5.jpg

上記のような、画像リンクを5連投するだけの書き込みをあぼーんします。(完全一致)

[画像リンク 10連投 (部分一致)]
MsgType = 正規(含む)
MsgBody="(?:^|<br>)[  ]*(?:h?ttp://(?<domain>[[:alnum:]\-]{1,63})(?:\.\g<domain>){1,5}(?::\d{1,5})?/[!=#-&(-;?-[\]-~]+\.(?:jpg|png|gif|bmp)(?:[  ]*<br>[  ]*)*){10}"
Option = 透明あぼーん, NGIDへの自動追加
テスト
http://test.com/test1.jpg http://test.com/test2.jpg
http://test.com/test3.jpg http://test.com/test4.jpg
http://test.com/test5.jpg http://test.com/test6.jpg
http://test.com/test7.jpg http://test.com/test8.jpg
http://test.com/test9.jpg http://test.com/test10.jpg

上記のような、画像リンクの10連投を含む書き込みをあぼーんします。(部分一致)

アンカー5連投

[アンカー5連投 (行内)]
MsgType = 正規(含む)
MsgBody="(?:^|<br>)(?:[^<]*?(?:<a [^<]+</a>|(?:&gt;|>){1,2}\d+)){5}"
Option = 透明あぼーん, NGIDへの自動追加

>>1>>2>>3>>4>>5 のような行内にレスアンカーを5連投した書き込みをあぼーんします。

[アンカー5連投 (1行×5)]
MsgType = 正規(含む)
MsgBody="(?:^|<br>)[  ]*(?:(?:&gt;|>){1,2}\d+|<a [^>]*>&gt;&gt;\d+(?:-\d+)*</a>)(?:[,-]\d+)*(?:[  ]*<br>[  ]*(?:(?:&gt;|>){1,2}\d+|<a [^>]*>&gt;&gt;\d+(?:-\d+)*</a>)(?:[,-]\d+)*){4}"
Option = 透明あぼーん, NGIDへの自動追加
>>1
>>2-3
>5-7,9,15
>>20-30
>31,32,33,34,35

上記のような、レスアンカーを改行区切りで5連投した書き込みをあぼーんします。

スキーム5連投 (行内)

[スキーム5連投 (行内)]
MsgType = 正規(含む)
MsgBody="(?:^|<br>)(?:[^<]*?://){5}"
Option = 透明あぼーん
ttp:// ttp:// ttp:// ttp:// ttp://

上記のような、行内で :// を5回繰り返す書き込みをあぼーんします。
上の例では、間に空白を挟んでいますが、どんな文字列を挟んでもマッチします。(HTMLタグを除く)

a要素 HTMLコード 連投 (1行×5)

[a要素 HTMLコード 連投 (1行×5)]
MsgType = 正規(含む)
MsgBody="(?:^|<br>)[  ]*(?:&lt;a (?:(?!&gt;)[^<])*href *= *(?:&quot;|')? *https?://(?:(?!&lt;)[^<])+&lt;/a&gt;(?:[  ]*<br>)*[  ]*){5}"
Option = 透明あぼーん
<a href="http://test1.com/">http://test1.com/</a>
<a href="http://test2.com/">http://test2.com/</a>
<a href="http://test3.com/">http://test3.com/</a>
<a href="http://test4.com/">http://test4.com/</a>
<a href="http://test5.com/">http://test5.com/</a>

上記のような、a要素のHTMLソースを5行繰り返す書き込みをあぼーんします。

HTML文字実体参照 5連投

[HTML文字実体参照 5連投]
MsgType = 正規(含む)
MsgBody="(?:&(?!(?:amp|gt|lt|quot);)(?:[a-z]{2,5}|#(?:0*\d{1,5}|xe?0*[\da-f]{2,5}));?[  ]*){5}"
Option = 透明あぼーん

HTML文字実体参照数値文字参照 を5連投した書き込みをあぼーんします。(各用語の説明はリンク先を参照してください) システムで使われている &amp; > < " は検索対象から除きます。 # 2ちゃんねるでは、シングルクオート ' はエスケープしていないようです。

1行文の2連投

[1行文の2連投]
MsgType = 正規(含む)
MsgBody="(?:^|<br>)(?![  ]*<br>)((?:[^<]|<a [^<]+</a>)+)<br>\1(?=(?:<br>|$))"
Option = 透明あぼーん, NGIDへの自動追加
正規表現を覚えたい
正規表現を覚えたい

上記のような、「1行文」の繰り返しを含む書き込みをあぼーんします。
「1行文の3連投」に変えたい場合は、<br>\1(<br>\1){2} に置換してください。

複数行の2連投

[複数行の2連投]
MsgType = 正規(含む)
MsgBody="(?:^|<br>)(?![  ]*<br>)((?:[^<]|<a [^<]+</a>){10,}<br>.*)(?:<br>[  ]*)*<br>\1"
Option = 透明あぼーん, NGIDへの自動追加
こんにちは、Janeさん。
今日もいい天気ですね。
こんにちは、Janeさん。
今日もいい天気ですね。

上記のような、「複数行の文章」を改行で挟んで繰り返す書き込みをあぼーんします。 間に空行を挟んでもマッチします。

行内の文字列 5連投

[行内の文字列 5連投]
MsgType = 正規(含む)
MsgBody="(?:^|<br>)[  ]*([^ < ]{3,})(?:[  ]+\1){4}"
Option = 透明あぼーん
てすと てすと てすと てすと てすと

上記のような「行内の文字列」を空白文字で挟んで5回繰り返す書き込みをあぼーんします。

アミトーンの記号連投

[アミトーンの記号連投 (1文字×4)]
MsgType = 正規(含む)
MsgBody="(["',:;])([  ]*\1)\2{2}"
Option = 透明あぼーん, NGIDへの自動追加

:::: のように、記号1文字を連投してアミトーンを貼るAAをあぼーんします。
アミトーンは巨大AAで頻繁に使われます。

[アミトーンの記号連投 (2文字×3)]
MsgType = 正規(含む)
MsgBody="((["',.:;])(?!\2)["',.:;])([  ]*\1)\3"
Option = 透明あぼーん, NGIDへの自動追加

:;:;:;:; のように、記号2文字を連投してアミトーンを貼るAAをあぼーんします。

巨大AA (記号の並列)

[巨大AA (記号の並列)]
MsgType = 正規(含む)
MsgBody="([()/|ヽ()/\|])(?= *[_  ̄_]{2})[ _ _ ̄]+\1"
Option = 透明あぼーん, NGIDへの自動追加

/  / のように、空白文字の両側に同じ記号がある書き込みをあぼーんします。
巨大AAは空白文字を利用して空間を作る性質があるため、かなりのAAに対応できます。
if( ($a==1) && ($b==2) ) のようなプログラムコードに誤爆するのを防ぐために半角空白を除く空白文字が2回以上連続した文字列に限定しています。

巨大AA (記号の線対称)

[巨大AA (記号の線対称)]
MsgType = 正規(含む)
MsgBody="/[ _ _ ̄]+\|\[ _ _ ̄]+/|[((](?! *[))])[ _ _ ̄]+[))]"
Option = 透明あぼーん, NGIDへの自動追加

/ ̄ ̄\ のような空白文字を挟んで記号が線対称に並ぶ書き込みをあぼーんします。
は空白文字ではありませんが、空間を作るために利用されることが多いため、表現に追加しています。

台詞用ふきだし (名前)

[台詞用ふきだし (名前)]
MsgType = 正規(含む)
NGName = "^\?[\-_─_ ̄]+(?:(?:[/|/\|]{2}|[vVV])[\-_─_ ̄]+)?[//]?$"
Option = 透明あぼーん

漫画で台詞を表すのに使われるふきだしを名前欄で使用している書き込みをあぼーんします。

ラベル: , ,

2007年7月23日月曜日

Jane用のReplaceStrメモ

ReplaceStr.txt の覚え書き。

JaneView、もしくは、JaneStyleで動作確認済みの正規表現です。
どちらで確認しているかは、行頭の文字列で判断してください。

他の派生では、正規表現宣言部の書式が違うようなので、適宜読み替えてください。
(Viewの書式と互換性があるようなので、そのままでも動くとは思いますが)

全角数字を半角数字に

0	0
1	1
2	2
3	3
4	4
5	5
6	6
7	7
8	8
9	9

全角数字を半角数字に置換します。
レス番を置換するときに、全角/半角を考慮しなくて良くなって便利です。

全角英字を半角英字に (小文字)

a	a
b	b
c	c
d	d
e	e
f	f
g	g
h	h
i	i
j	j
k	k
l	l
m	m
n	n
o	o
p	p
q	q
r	r
s	s
t	t
u	u
v	v
w	w
x	x
y	y
z	z

JaneのReplaceStrは大文字/小文字を区別しないため、英字の半角への置換は小文字/大文字のどちらか1つしか使えません。
(両方、指定すると先に指定した方に統一されます)

全角英字を半角英字に (大文字)

A	A
B	B
C	C
D	D
E	E
F	F
G	G
H	H
I	I
J	J
K	K
L	L
M	M
N	N
O	O
P	P
Q	Q
R	R
S	S
T	T
U	U
V	V
W	W
X	X
Y	Y
Z	Z

JaneのReplaceStrは大文字/小文字を区別しないため、英字の半角への置換は小文字/大文字のどちらか1つしか使えません。
(両方、指定すると先に指定した方に統一されます)

全角記号を半角記号に

(	(
)	)
^	^
<	&lt;
>	&gt;
&	&amp;

HTML文字実体参照のソースコードを表示

<>&(?!(?:amp|gt|lt|nbsp|quot))(?=[a-z]{2,5}|#(?:0*\d{1,5}|xe?0*[\da-f]{2,5}))	&amp;

HTML文字実体参照のソースコードを表示します。

英字/記号の2連投以上を省略表示

<>?{2,}	??
<>!{2,}	!!
<>w{2,}(?![\w%&\--/=])	w

全角の疑問符/感嘆符の2回以上の連続を2文字に省略表示します。
2文字以上の w を省略表示します。
(URL中の文字にマッチするのを防ぐため、w の後ろに「URLに使われる文字」がある時にはマッチしません)

文頭/文末の空白文字を削除

<>^(?:[  ]*<br>)+[  ]*	
<>(?:<br>[  ]*)+$	

文頭/文末の半角空白/全角空白/改行を削除します。

空行3つ以上を空行2つに

<>(?:<br>[  ]*){4,}	<br><br><br>
空行3つ以上を空行2つに置換します。

「レスアンカー + 改行」を「レスアンカー + 空白」に

<>((?:^[  ]*|(?:<br>[  ]*){2})(?:(?:(?:&gt;){1,2}\d+|<a [^>]*>&gt;&gt;\d+(?:-\d+)*</a>)(?:[,-]\d+)*[  ]*)+)(?:[  ]*<br>)+(?![  ]*&gt;(?!&gt;\d))(?=(?:[^<]*<a [^>]*>[^<]*</a>)*[^<]*(?:$|(?:<br>[  ]*){2}))	$1&nbsp;&nbsp;

「レスアンカー -> 改行 -> 1行のコメント」を「レスアンカー -> 半角空白2個 -> 1行のコメント」に置換します。
視認性を確保するため、対象の文字列と他の文字列に一行以上のマージンがある状況に限定しています。
置換する文字列の前後に空行or文頭or文末が存在するときにしかマッチしません。

ひらがな/カタカナの3連投以上を省略表示

<>([あ-んア-ン])\1{2,}	$1$1

「3文字以上のひらがな/カタカナ」の同一文字の3連続以上を2文字に省略表示します。
(例) 来たああああああ → 来たああ

2ちゃんねる語を標準語に (非正規表現)

概出	既出
香具師	方
おまいら	お前ら
イ㌔	生きろ

2ちゃんねる語を標準語に変換します。

2ちゃんねる語を標準語に (ローマ字typo)

<>うp(?!\w)	UP
<>おk(?!\w)	OK
<>日本語でOK(?!\w)	日本語で書いてください
<>wktk(?![\w%&\--/=])	わくわく
<>kwsk(?![\w%&\--/=])	詳しく
<>gdgd(?![\w%&\--/=])	ぐだぐだ

ローマ字によるtypo系の2ちゃんねる語を標準語に変換します。

2ちゃんねる語を標準語に (文末)

<>(じゃ|[よ良]く)ね(?=[??])	$1ない
<>キタ━+(?:ヽ?\([ ゚ ∀]*\)ノ?━+)+	来た
<>([^a-z])YO(?![\w%&\--/=])	$1よ
<>([^a-z])NE{2,}(?![\w%&\--/=])	$1ねー
<>キボンヌ?(?=[ <w ]|$)	希望します
<>きぼん(?=[ <w ]|$)	希望します
<>乙+(?=(?:で(?:す|した))?(?:[ !<㌧w 。!ー~]|$))	お疲れ様
<>思われ(?=[ ()<w 。!]|$)	思われる
<>希ガス(?=[ ()<w 。!]|$)	気がする
<>もちつけ(?=[ ()<w 。!]|$)	落ち着け
<>しる(?=[ ()<w 。!]|$)	しろ
<>で[しつ](?=[ ()<w 。!]|$)	です
<>まつ(?=[ ()<w 。!]|$)	ます
<>るお(?=[ ()<w 。!]|$)	るよ
<>だお(?=[ ()<w 。!]|$)	だよ
<>ますた(?=[ ()<w 。!]|$)	ました
<>ですた(?=[ ()<w 。!]|$)	でした

文末にある2ちゃんねる語を標準語に変換します。
一部の正規表現はURL中に含むことを防ぐため、表現の 手前/直後 に「URLに使われる文字」が存在するときにマッチしません。

<>\.(jpg|gif|png)(\.html?)(?=[ < ]|$)	.$1 [Killed $2]

http://somehost.com/uploader/wallpaper.jpg.html のようなURLから .html を取り除きます。
Refererを設定するだけの ImageViewURLReplace.dat による設定をするのが面倒な人用です。

アフィリエイトパラメータを削除

<>://(?:www\.)?amazon\.co\.jp/((?:\w+/)+)(?:\w+-22/|(\w+)(?=\?)(?:[&?](?!tag=)\w+=\w+)*[&?]tag=\w+-22)[!#-&(-;=?-[\]-~]*	://www.amazon.co.jp/$1$2 [Killed Affiliate]

Amazonのアフィリエイト用のURLからアフィリエイトを示す文字列を取り除きます。

引用文を着色

<rx>((?:^|<br>)[  ]*)((?:&gt;(?!(?:&gt;)?[\d0-9])|>(?![\d0-9]))[^<]+)	$1<font color=green>$2</font>	msg

引用文を着色します。JaneStyle用。
JaneNidaでも動作するかも?(未確認)

# http:// から始まるリンクテキストのリンク色を上書きしてしまうのは、仕様です。
# 処理の順番が関係していますが、これはJaneStyleで対応すべき問題だと思います。
# (「ReplaceStr → リンクテキストにアンカーを付与」の順番が望ましいと思います)

ラベル: , ,

2007年7月22日日曜日

JeneViewの正規表現を使用するときの注意点 正規表現編

JaneViewの「NGEx」「ReplaceStr.txt」で扱われる正規表現で躓きそうな部分のまとめです。

大文字/小文字を区別しない

Janeの正規表現は、大文字/小文字を区別しません。

a … 「a」「A」にマッチ
w … 「w」「W」 にマッチ

全角の大文字/小文字も区別しない点に注意してください。正規表現の修飾子 "i" が指定されていると捉えても構いません。

# 個人的には、[大文字/小文字を区別する] オプションが欲しいところです。
w+ は WWW にマッチしてしまうし、ReplaceStr.txt による英字の「全角→半角」変換は先にマッチした方 (小文字 or 大文字) に統一されてしまいます。
この状況を打開する方法は、今のところ存在しないと思います。

WSH有効でより高度な正規表現を使用できる

[設定 -> 設定 -> 基本 -> その他 -> 正規表現にWSHを使う] にチェックを入れることで、チェックを入れないときに使えなかった正規表現を使用できるようになります。

(?:pattern) … 変数にキャプチャせずにグループ化する
(?=pattern) … pattern に一致する文字列を肯定先読み。先読みした文字列は変数にキャプチャしない。
(?!pattern) … pattern に一致する文字列を否定先読み。先読みした文字列は変数にキャプチャしない。

ここに挙げた表現は全て変数にキャプチャしません。(グループ化された部分を変数に記憶せず、 で参照できなくなる)
そのため、メモリを節約できます。

「何だかよくわからない」という人は、先読み 正規表現でGoogle検索してみてください。

# Proxomitronの表現で表すと、(?=pattern) は肯定先読み、(?!pattern) はNOT関数と同等です。

# [正規表現にWSHを使う] にチェックを入れないと、TRegExpr が使用されます。
JaneView.txt によると、「※エラーは出ませんが、TRegExprはあまり複雑な正規表現はパースできないようで特にmigemoで短い文字列を検索した場合にはマッチングがおかしい事があります」とのこと。

キャレット (^) は行頭ではなく、文頭にマッチする

一部の正規表現ライブラリは ^ を指定することで行頭にマッチしますが、Janeの ^ は文頭にマッチします。
特別なことをしなくても、複数行にマッチさせることが可能です。
(dat保存時に改行がbr要素に置換されるため、Janeの内部処理では一行からなるデータを検索していると思われます)

行頭にマッチさせたい場合は、次のように指定します。

(?:^|<br>)

全角文字を文字クラスに含めることが出来る

Janeの正規表現は、全角文字を文字クラスに含めることが出来ます。
ですので、[  ] で「半角空白/全角空白」の両方にマッチさせることが可能です。

Shift_JIS の文字列を検索している

Janeが検索するのは Shift_JIS の文字列です。 このことを覚えておくと、全角文字を文字クラスで範囲指定するときに役立ちます。

例えば、[あ-ん] はどういう文字にマッチするでしょうか。
直感的にはひらがなの「あ~ん」にマッチしそうですが、実際には「ぁぃぅぇぉ」などの拗音にもマッチします。

これは、ひらがなを Shift_JIS の16進数で表されるコードに変換すると、理解しやすいでしょう。

あ … 0x82 0xa0
ぃ … 0x82 0xa1
い … 0x82 0xa2
...
ん … 0x82 0xf1

2つめのコードの末尾の数字を見ると、0, 1, 2 と連番になっていることが分かります。
文字クラスはこれらコードの数値を範囲指定しているのです。
[あ-ん] は 0x82 [0xa0-0xf1] を指定しているともいえます。(実際には、この記述法で指定できません。)

特定の文字のコードを調べるには、次のどれかを使ってください。

「Proxomitron用 文字コード変換」「URLエンコード」は上で紹介したものと書式が違いますが、数値は同じなので参考にすることが出来ます。
例えば、「あ」をエンコードしたとき、それぞれのコードは以下のようになります。(「82, a0」の数値が同じ事が分かると思います)

16進数のShift_JISコード … 0x82 0xa0
Proxomitron用文字コード … [%82][%a0]
URLエンコード … %82%a0

# Proxomitronでは [あ-ん] を [%82][%a0-%f1] と書き表せます。(Shift_JISコードの場合)

# 0xnn がそれぞれ1バイトのコードを示します。
Shift_JISコードにおいては、ひらがな1文字に付き2バイトで表されるので、それぞれ2つ分のコードがあるわけです。
2バイトで1文字を表している文字を2バイト文字といいます。

ReplaceStr で置換した内容に対して、更に置換することが出来る

例えば、次の表現を ReplaceStr.txt に記述すると、

名無し[Tab]ななしだよ
ななしだよ[Tab]名無しという名の名無し

「名無し」は「名無し → ななしだよ → 名無しという名の名無し」という遍歴を経て、「名無しという名の名無し」に置換されます。

# 一度に置換させるより、複数回マッチさせた方が高速に置換する事もあるそうです。

# 特に、全角/半角 の両方に対応したい場合、初めに半角に置換して文字種を統一しておけば、後の表現を書くのが楽になります。

NGEx は ReplaceStr より前に発動する

ReplaceStr で置換した文字列に NGEx でマッチさせることは出来ません。

# NGEx であぼーん(消去)した投稿内容に対して、ReplaceStr が無効なわけではないようです。
レスアンカーであぼーんされたレスを見たり、[Ctrl] + [数字] キー で任意のレス番の投稿内容をポップアップさせると、ReplaceStrが効いていることが分かります。

ラベル: , , ,

JeneViewの正規表現を使用するときの注意点 datデータ編

JaneViewは2ちゃんねるのスレッドデータを保存している「datファイル」を直接読んで、マッチする文字列を検索します。

# 詳しくは後述しますが、datデータはブラウザに表示されている内容と微妙に違います。 通常、正規表現で改行にマッチさせるときは \r\n を使いますが、Janeで改行にマッチさせる場合は、<br> を使います。

datファイルは、<> 区切りのCSVフォーマットとなっています。 下記は、ある一人の投稿者のdatデータの参考例です。

Jane使いの名無しさん<>sage<>2007/07/21(土) 21:00:00 ID:XXXXXXXXX<> ここは NGEx.txt を晒すスレです。 <br> 前スレ <br> NGEx.txtを晒すスレ <br> http://jane.s28.xrea.com/test/read.cgi/bbs/1068846004/ <>NGEx.txtを晒すスレ2

このように、datファイル上では、一人の投稿者の投稿内容は一行で表されます。 それぞれの内容は「名前<>メール欄<>投稿日時<>本文<>スレッドタイトル」となっています。 (スレッドタイトルはスレッドを立てた人のデータだけに書き込まれ、No.2 以降の投稿者のデータには書き込まれません。)

Janeからdatファイルを参照する

Janeはスレッドを取得したときに、「Janeをインストールしたフォルダ\Logsch\板名\スレッド番号.dat」にdatファイルを保存します。 しかし、ここから該当スレッドを探すのは面倒なので、もう少し簡単な方法を紹介します。

Janeを終了した状態で、Jane2ch.exe があるフォルダの command.dat をメモ帳などのテキストエディタで開いてください。 (command.dat がなければ、新規テキスト文書.txt を作成して、command.dat にリネームします) そして、以下の内容をコピー&ペーストして、上書き保存します。

*各種設定=
[Tab]*datを開く="C:\Program Files\Hidemaru\Hidemaru.exe" "$LOCALDAT"
[Tab]*AAListを開く="C:\Program Files\Hidemaru\Hidemaru.exe" "$BASEPATHaalist.txt"
[Tab]*NGEx.txtを開く="C:\Program Files\Hidemaru\Hidemaru.exe" "$BASEPATHNGEx.txt"
[Tab]*Command.datを開く="C:\Program Files\Hidemaru\Hidemaru.exe" "$BASEPATHcommand.dat"
[Tab]*ImageViewURLReplace.datを開く="C:\Program Files\Hidemaru\Hidemaru.exe" "$BASEPATHImageViewURLReplace.dat"
[Tab]*ReplaceStr.txtを開く="C:\Program Files\Hidemaru\Hidemaru.exe" "$BASEPATHReplaceStr.txt"

# "C:\Program Files\Hidemaru\Hidemaru.exe" の部分には、任意のテキストエディタをフルパスで指定します。 [Tab] はタブ文字 ([Tab] キーを入力して出現する文字) に変換してください。

Janeを起動し、何らかのスレッドを開きます。 [コマンド -> 各種設定 -> datを開く] で現在閲覧しているスレッドのdatファイルが開きます。

# コマンドから確認する方法は、ReplaceStr.txt でも使えます。

# 特定のレス番のdatデータを参照したいときには、[レス番を左クリック -> NGに追加] から確認したい項目を選択します。
# それぞれ、NGに追加するまでワンクッションあるので、NGに追加することなく確認できます。
#
# 名前  … [NGNameに追加] で確認
# メール … [NGAddrに追加] で確認
# 本文  … [datからNGWordに追加] で確認

タブ文字は半角空白に変換される

タブ文字を2ちゃんねる掲示板に投稿すると、「タブ文字 → 半角空白」の変換をした上でdatに保存されます。

空白文字は [  ] でマッチさせる

空白文字とは、半角スペース, タブ文字, 改行コード, 復帰コード, NULL など、目に見えない文字のことです。 正規表現では \s で表されます。

全角空白も含めた空白文字にマッチさせる場合、(?:\s| ) と書きたくなりますが、datに保存されるときに「タブ文字, 改行コード, 復帰コード」が別の文字列に置換されるため、もう少し簡単に書き表すことが出来ます。

[  ]

実際には、[  ]* と書くことが多いでしょう。

改行は <br> でマッチさせる

改行にマッチさせるときには、\r\n ではなく  <br>  を指定します。 (<br> の両端に空白がある点に注意してください。)

ただし、非公式の掲示板の中には空白がないところもあります。 そこで、空白文字を0回以上消費させることで両方に対応させます。

[改行1つ]
[  ]*<br>[  ]*

[1回以上の改行]
(?:<br>[  ]*){1,*}

[0回以上の改行]
(?:<br>|[  ])*

<br> はHTMLで規定されている要素(タグ)です。 br要素 "line break"で検索すると参考サイトがHITします。 こちらは「改行するタグ」と覚えておくだけでよいと思います。

文頭/文末の空白文字を考慮する

公式の2ちゃんねる掲示板に書き込むと、dat保存時に本文部分の「文頭/文末」に半角空白が挿入されます。 非公式の掲示板の中には、空白が挿入されないところもあるので、空白の有無に関わらずマッチさせることで全ての掲示板に対応させます。

[文頭にマッチ]
^[  ]*

[文末にマッチ]
[  ]*$

[本文が存在しない or 空白のみの本文 にマッチ]
^[  ]*$

<>&" は HTML文字実体参照 でマッチさせる

「<>&"」を2ちゃんねる掲示板に投稿すると、HTML文字実体参照に変換してdatに保存されます。 <>&" にマッチさせるには、それぞれ以下のように指定します。

<  … &lt;
>  … &gt;
& … &amp;
" … &quot;

HTML文字実体参照はHTMLで規定されている文字です。 HTML文字実体参照 で検索すると、参考サイトが多数HITします。 なかなか使う機会が多いので、一度目を通しておくと良いかもしれません。 (>>1 などのレスアンカーにマッチさせる時に必要になります)

# 2ちゃんねる掲示板に投稿するとき、<>" は自動的にエスケープ(上の書式に変換)されますが、& だけはエスケープされません。 従って、HTML文字実体参照を含む文字を投稿すると、HTML文字実体参照が有効なまま投稿されることになります。 NGEx, ReplaceStr.txt の正規表現など、投稿内容を改変せずに投稿したい場合は、テキストエディタ等で「& → &amp;」の一括置換を行ってから投稿してください。

# 個人的には、「& → &amp;」の変換をJane側で処理してくれると嬉しかったり…。 正規表現を晒すスレッド等で、&だけ全角で書いている方がいたり、HTML文字実体参照が有効なことを知らないでミスする方をしばしば見かけます。

レスアンカーは HTML文字実体参照、a要素 でマッチさせる

レスアンカーとは、>>1 のようなレス番を指定するアンカーのことです。 レスアンカーは掲示板によって二種類の書式があり、完全対応するためにはそれぞれの書式を確認する必要があります。

# a要素を付加しない板の場合
&gt;&gt;1

# a要素を付加する板の場合
<a href="../test/read.cgi/win/1111111111/1" target="_blank">&gt;&gt;1</a>

両方に対応させるには、以下のように書きます。

<a [^>]+>&gt;&gt;1</a>|&gt;&gt;1

ラベル: , , ,

2007年7月19日木曜日

このブログのコードブロックをIEでコピーすると、改行なしでコピーされてしまう

取り急ぎ、修正しましたが、納得のいく修正はできませんでした。

以下、修正前のソース。

<pre class='thinking_code'><code><br />window.onload = function(){<br />alert('Hello World !');<br />}<br /></code></pre>

で、こちらが修正後のソース。

<style type='text/css'>
/* 考察中のコード */
.thinking_code {
white-space: nowrap;
}
</style>

<div class='thinking_code'><code><br />window.onload = function(){<br />alert('Hello World !');<br />}<br /></code></div>

white-space: nowrap; もしくは、pre要素だと改行込みでコピーできなくなるようです。(IE限定)

# まだ分からないところがあるので、thinking_code だけ修正しました。code_block は未修正です。

2007/07/19 13:34 追記 一通り、修正しました。

2007/07/23 0:30 追記 Bloggerの「br要素の自動挿入」を解除することで対応しました。

ラベル: , , ,

ニコニコ動画フィルタ集テスト版を更新 (拡大表示からの復帰時の不具合修正)

更新点は以下の通り。

2007/07/19
・動画の拡大表示からの復帰時に隠していた動画下コンテンツが再表示されてしまう不具合を修正

restorePlayer() の問題を修正しただけです。 ダウンロードは filter_niconico_test_20070719 からどうぞ。

flvplayer_wrapper 2007/07/16と組み合わせる場合は、「動画上部のニワニュース広告を削除」を無効に設定すれば共存できます。 (有効にしても動作しますが、プレイヤー上部のボタンが見切れてしまうので、一部機能が使えなくなります。)

(2007/07/19 7:22追記) リンク先が誤っていたのを修正しました。

ラベル: ,

既定の関数にユーザー定義関数を追加する

ニコニコ動画は動画プレイヤーの拡大表示から元の表示に戻す時に、restorePlayer() というJavaScriptの関数を使用しています。

function restorePlayer() {
 Event.stopObserving(window, "resize", fitPlayerToWindow, false);
 $("flvplayer").setStyle({ width: "", height: "" });
 $$("html", "body").invoke("setStyle", { margin: "", padding: "", width: "", height: "" });
 $("flvplayer_container").setStyle(containerStyle);
 $("PAGEHEADER", "WATCHHEADER", "WATCHFOOTER", "PAGEFOOTER").invoke("show");
 Element.scrollTo($("flvplayer_container"));
}

.invoke("show") で拡大表示時に隠れていた "PAGEHEADER", "WATCHHEADER", "WATCHFOOTER", "PAGEFOOTER" のIDを持つ要素を再び表示させています。 困ったことにこれは、Proxomitron(ユーザーJavaScript)で非表示にした要素も表示させてしまいます。 そこで、restorePlayer() に再び該当要素を非表示にする動作を入れるために、作成したのが以下の関数。

// ----------- 関数の定義

/* restorePlayer() にユーザー定義関数を追加 */
function AddrestorePlayer(func){
   var oldrestorePlayer = restorePlayer;

   restorePlayer = function(){
    oldrestorePlayer();
    func();
   }
}

/* 動画下のコンテンツ(対応ブラウザ、動画再生プレイヤー つかいかた、Amazonアソシエイト) を隠す */
function HideWatchFooter(){
   var WatchFooter = document.getElementById('WATCHFOOTER');
   WatchFooter.style.display = 'none';
}

// ----------- 実行処理

window.onload = function(){ // ページ読み込みが終了したとき
   HideWatchFooter();
   AddrestorePlayer(HideWatchFooter); // restorePlayer() に HideWatchFooter() を追加
}

このコードは、既存の関数を変更せずに、追加している仕組みが優れています。 restorePlayer() が書き換わっても追従できるのです。

ちなみに、このアルゴリズムは私が考え出したものではなく、Simon Willison’s WeblogaddLoadEventが元となっています。 更にいえば、私が特別英語力に優れているわけでもなく、『DOM Scripting 標準ガイドブック ~やさしく学ぶ、JavaScriptとDOMによるWebデザイン』を参考にしています。

今回のように既存の関数を改変することを、専門用語で関数のオーバーロードと呼ぶようです。 よくある例は、「既存の関数と同じ関数を定義することによって、前の関数を帳消しにして、新しい関数に上書きする」手法です。

/* 既存の関数 */
function restorePlayer() {
   ...(中略)...
}

/* 新しい関数 (同名の関数を定義することで古い関数を上書きする) */
function restorePlayer() {
   ...(中略)...
}

このように、同名の関数を再定義することで前の関数を上書きします。 この記述の後で、restorePlayer() が呼び出された場合、後者の関数を実行することになります。

ラベル: ,

2007年7月18日水曜日

コメントが真っ白になる問題を解決したフィルタ (2007/07/19)

<chat> の内容削除に留めたフィルタ。 空白のコメントが残るので、683氏のフィルタの方が良いかもしれません。

[Patterns]
Name = "NicoVideo: Kill chat-item [NG command] [2007/07/16] test1"
Active = TRUE
URL = "$TYPE(oth)msg[0-9]+.nicovideo.jp/api/(^?)"
Limit = 512
Match = "$NEST((<chat\s[^>]++mail=$AV(([a-z]+\s)++$LST(NicoNico-NG_cmd)(\s*|(^?)))[^>]+>(^<))\0,</chat>)"
Replace = "\0</chat>"

Name = "NicoVideo: Kill chat-item [easiness] [2007/07/16] test1"
Active = TRUE
URL = "$TYPE(oth)msg[0-9]+.nicovideo.jp/api/(^?)"
Limit = 512
Match = "$NEST((<chat\s[^>]+>(^<))\0,"
        "([%e3][%80][%80]|\s)+"
        "((([%C0-%DF][%80-%BF]|[%E0-%EF][%80-%BF][%80-%BF]|[%F0-%F7][%80-%BF][%80-%BF][%80-%BF]|[^<>])\0"
        "($TST(\0))+)+{1,2})\1"
        "($TST(\1))+"
        "([!?%77]|[%e3]([%81][%a3]|[%83][%83])|[%ef]([%bc][%81%9f]|[%bd][%97]))+"
        ",</chat>)"
Replace = "\0</chat>"

Name = "NicoVideo: Kill chat-item [NGID] [2007/07/16] test1"
Active = TRUE
URL = "$TYPE(oth)msg[0-9]+.nicovideo.jp/api/(^?)"
Limit = 512
Match = "$NEST((<chat\s[^>]++user_id=$AV($LST(NicoNico-NGID))[^>]+>(^<))\0,</chat>)"
Replace = "\0</chat>"

Name = "NicoVideo: Kill chat-item [NGWord] [2007/07/16] test1"
Active = TRUE
URL = "$TYPE(oth)msg[0-9]+.nicovideo.jp/api/(^?)"
Limit = 512
Match = "$NEST((<chat\s([^>]++user_id=$AV(\9)|)[^>]+>(^<))\0,"
        "*$LST(NGWord-utf8)*"
        ",</chat>)"
Replace = "\0</chat>"

ラベル: ,

2007年7月17日火曜日

ニコニコ動画にユーザーJavaScriptを追加するProxomitronフィルタ

機能は以下の通り。

  • 動画上部の広告を隠す (見えなくするだけで、接続はなくなりません)
  • 動画閲覧ページで動画検索フォームに「現在の動画タイトル」をセットする
  • FLVのダウンロードリンクを挿入
動画タイトルの見出しをクリックすると、「動画名.flv」をクリップボードへコピーして、ダウンロードリンクが右側に表出します。 (もう一度、動画タイトルをクリックすると、ダウンロードリンクを隠します)
  • 「あなたのブログに動画を貼り付けよう」を隠す
  • 動画下のコンテンツ(対応ブラウザ、動画再生プレイヤー つかいかた、Amazonアソシエイト) を隠す
  • 「ページの先頭へ」の画像を隠す
  • ページフッタの表示形式を変更する (折りたたむ / 隠す)

Opera9,Firefox2,IE7で動作確認。 (Firefox2が主なので、他のブラウザで動かなかったら、報告を下さい)

[Patterns]
Name = "NicoVideo: add nicovideo_plus.js [2007/07/16] test1"
Active = TRUE
URL = "$TYPE(htm)www.nicovideo.jp/"
Limit = 8
Match = "(^(^&lt;/head&gt;))$STOP()"
Replace = "\t&lt;script type='text/javascript' charset='utf-8' src='http://local.ptron/js/nicovideo_plus.js'&gt;&lt;/script&gt;\r\n"

スクリプトがないと何も動作しないので、filter_niconico_test_20070717 からダウンロードして使用してください。

(2007/07/19 7:39追記) リンク先が誤っていたのを修正しました。

ラベル: ,

ブログ開設

このブログはちょっとした思いつきや考え事をまとめるためのメモ帳です。 管理人はThinking Archive(仮)の中の人。

サイトに書くまでもないちょっとしたことをこちらにメモしていけたらと考えています。 逆に言えば、こちらで雑多にメモして、まとまってきたらサイトにコンテンツとしてまとめる、という形がベストですね。