#! /usr/local/bin/perl

# ϊ
# ̂Ƃt@~RFϊƂ 1 Ƃ̕ϊ

#
# Pϊf[^
#
# q[x] => q[], ƂƋtϊ̎ɁuvuxvɒûŒӁB
# stȕϊ͉change_to_xxx/change_from_xxx̒ɒڏƁB
#
# ==================================================================
my %xxx_data = (
# t@~R $00 - $0f
	q[0] => q[<FONT color=#7F7F7F></FONT>],
	q[1] => q[<FONT color=#0000FF></FONT>],
	q[2] => q[<FONT color=#0000BF></FONT>],
	q[3] => q[<FONT color=#472BBF></FONT>],

	q[4] => q[<FONT color=#970087></FONT>],
	q[5] => q[<FONT color=#AB0023></FONT>],
	q[6] => q[<FONT color=#AB1300></FONT>],
	q[7] => q[<FONT color=#8B1700></FONT>],

	q[8] => q[<FONT color=#533000></FONT>],
	q[9] => q[<FONT color=#007800></FONT>],
	q[a] => q[<FONT color=#006B00></FONT>],
	q[b] => q[<FONT color=#005B00></FONT>],

	q[c] => q[<FONT color=#004358></FONT>],
	q[d] => q[<FONT color=#000000></FONT>],
	q[e] => q[<FONT color=#000001></FONT>],
	q[f] => q[<FONT color=#000002></FONT>],

# t@~R $10 - $1f
	q[0] => q[<FONT color=#BFBFBF></FONT>],
	q[1] => q[<FONT color=#0078F8></FONT>],
	q[2] => q[<FONT color=#0058F8></FONT>],
	q[3] => q[<FONT color=#6B47FF></FONT>],

	q[4] => q[<FONT color=#DB00CD></FONT>],
	q[5] => q[<FONT color=#E7005B></FONT>],
	q[6] => q[<FONT color=#F83800></FONT>],
	q[7] => q[<FONT color=#E75F13></FONT>],

	q[8] => q[<FONT color=#AF7F00></FONT>],
	q[9] => q[<FONT color=#00B800></FONT>],
	q[a] => q[<FONT color=#00AB00></FONT>],
	q[b] => q[<FONT color=#00AB47></FONT>],

	q[c] => q[<FONT color=#008B8B></FONT>],
	q[d] => q[<FONT color=#000003></FONT>],
	q[e] => q[<FONT color=#000004></FONT>],
	q[f] => q[<FONT color=#000005></FONT>],

# t@~R $20 - $2f
	q[0] => q[<FONT color=#F8F8F8></FONT>],
	q[1] => q[<FONT color=#3FBFFF></FONT>],
	q[2] => q[<FONT color=#6B88FF></FONT>],
	q[3] => q[<FONT color=#9878F8></FONT>],

	q[4] => q[<FONT color=#F878F8></FONT>],
	q[5] => q[<FONT color=#F85898></FONT>],
	q[6] => q[<FONT color=#F87858></FONT>],
	q[7] => q[<FONT color=#FFA347></FONT>],

	q[8] => q[<FONT color=#F8B800></FONT>],
	q[9] => q[<FONT color=#B8F818></FONT>],
	q[a] => q[<FONT color=#5BDB57></FONT>],
	q[b] => q[<FONT color=#58F898></FONT>],

	q[c] => q[<FONT color=#00EBDB></FONT>],
	q[d] => q[<FONT color=#787878></FONT>],
	q[e] => q[<FONT color=#000006></FONT>],
	q[f] => q[<FONT color=#000007></FONT>],

# t@~R $30 - $3f
	q[0] => q[<FONT color=#FFFFFF></FONT>],
	q[1] => q[<FONT color=#A7E7FF></FONT>],
	q[2] => q[<FONT color=#B8B8F8></FONT>],
	q[3] => q[<FONT color=#D8B8F8></FONT>],

	q[4] => q[<FONT color=#F8B8F8></FONT>],
	q[5] => q[<FONT color=#FBA7C3></FONT>],
	q[6] => q[<FONT color=#F0D0B0></FONT>],
	q[7] => q[<FONT color=#FFE3AB></FONT>],

	q[8] => q[<FONT color=#FBDB7B></FONT>],
	q[9] => q[<FONT color=#D8F878></FONT>],
	q[a] => q[<FONT color=#B8F8B8></FONT>],
	q[b] => q[<FONT color=#B8F8D8></FONT>],

	q[c] => q[<FONT color=#00FFFF></FONT>],
	q[d] => q[<FONT color=#F8D8F8></FONT>],
	q[e] => q[<FONT color=#000008></FONT>],
	q[f] => q[<FONT color=#000009></FONT>],

# EFϊ 
	q[0] => q[<FONT color=black></FONT>],
	q[1] => q[<FONT color=dodgerblue></FONT>],
	q[2] => q[<FONT color=crimson></FONT>],
	q[3] => q[<FONT color=deeppink></FONT>],
	q[4] => q[<FONT color=forestgreen></FONT>],
	q[5] => q[<FONT color=teal></FONT>],
	q[6] => q[<FONT color=gold></FONT>],
	q[7] => q[<FONT color=orange></FONT>],
	q[8] => q[<FONT color=mistyrose></FONT>],
	q[9] => q[<FONT color=gray></FONT>],
	q[w] => q[<FONT color=silver></FONT>],

# EFϊ 
	q[0] => q[<FONT color=black></FONT>],
	q[1] => q[<FONT color=dodgerblue></FONT>],
	q[2] => q[<FONT color=crimson></FONT>],
	q[3] => q[<FONT color=deeppink></FONT>],
	q[4] => q[<FONT color=forestgreen></FONT>],
	q[5] => q[<FONT color=teal></FONT>],
	q[6] => q[<FONT color=gold></FONT>],
	q[7] => q[<FONT color=orange></FONT>],
	q[8] => q[<FONT color=mistyrose></FONT>],
	q[9] => q[<FONT color=gray></FONT>],
	q[w] => q[<FONT color=silver></FONT>],

# EFϊ 
	q[0] => q[<FONT color=black></FONT>],
	q[1] => q[<FONT color=dodgerblue></FONT>],
	q[2] => q[<FONT color=crimson></FONT>],
	q[3] => q[<FONT color=deeppink></FONT>],
	q[4] => q[<FONT color=forestgreen></FONT>],
	q[5] => q[<FONT color=teal></FONT>],
	q[6] => q[<FONT color=gold></FONT>],
	q[7] => q[<FONT color=orange></FONT>],
	q[8] => q[<FONT color=mistyrose></FONT>],
	q[9] => q[<FONT color=gray></FONT>],
	q[w] => q[<FONT color=silver></FONT>],

# EFϊ 
	q[0] => q[<FONT color=black></FONT>],
	q[1] => q[<FONT color=dodgerblue></FONT>],
	q[2] => q[<FONT color=crimson></FONT>],
	q[3] => q[<FONT color=deeppink></FONT>],
	q[4] => q[<FONT color=forestgreen></FONT>],
	q[5] => q[<FONT color=teal></FONT>],
	q[6] => q[<FONT color=gold></FONT>],
	q[7] => q[<FONT color=orange></FONT>],
	q[8] => q[<FONT color=mistyrose></FONT>],
	q[9] => q[<FONT color=gray></FONT>],
	q[w] => q[<FONT color=silver></FONT>],

# EFϊ 
	q[0] => q[<FONT color=black></FONT>],
	q[1] => q[<FONT color=dodgerblue></FONT>],
	q[2] => q[<FONT color=crimson></FONT>],
	q[3] => q[<FONT color=deeppink></FONT>],
	q[4] => q[<FONT color=forestgreen></FONT>],
	q[5] => q[<FONT color=teal></FONT>],
	q[6] => q[<FONT color=gold></FONT>],
	q[7] => q[<FONT color=orange></FONT>],
	q[8] => q[<FONT color=mistyrose></FONT>],
	q[9] => q[<FONT color=gray></FONT>],
	q[w] => q[<FONT color=silver></FONT>],

# EFϊ 
	q[0] => q[<FONT color=black></FONT>],
	q[1] => q[<FONT color=dodgerblue></FONT>],
	q[2] => q[<FONT color=crimson></FONT>],
	q[3] => q[<FONT color=deeppink></FONT>],
	q[4] => q[<FONT color=forestgreen></FONT>],
	q[5] => q[<FONT color=teal></FONT>],
	q[6] => q[<FONT color=gold></FONT>],
	q[7] => q[<FONT color=orange></FONT>],
	q[8] => q[<FONT color=mistyrose></FONT>],
	q[9] => q[<FONT color=gray></FONT>],
	q[w] => q[<FONT color=silver></FONT>],

# EFϊ U
	q[0] => q[<FONT color=black>U</FONT>],
	q[1] => q[<FONT color=dodgerblue>U</FONT>],
	q[2] => q[<FONT color=crimson>U</FONT>],
	q[3] => q[<FONT color=deeppink>U</FONT>],
	q[4] => q[<FONT color=forestgreen>U</FONT>],
	q[5] => q[<FONT color=teal>U</FONT>],
	q[6] => q[<FONT color=gold>U</FONT>],
	q[7] => q[<FONT color=orange>U</FONT>],
	q[8] => q[<FONT color=mistyrose>U</FONT>],
	q[9] => q[<FONT color=gray>U</FONT>],
	q[w] => q[<FONT color=silver>U</FONT>],

# Eϊ
	q[oa!] => q[<FONT color=crimson>U~</FONT>],
	q[ob!] => q[<FONT color=dodgerblue>U~</FONT>],
	q[oc!] => q[<FONT color=orange>U~</FONT>],
	q[od!] => q[<FONT color=deeppink>U~</FONT>],
	q[oe!] => q[<FONT color=teal>U~</FONT>],
	q[of!] => q[<FONT color=forestgreen>U~</FONT>],
	q[og!] => q[<FONT color=gold>U~</FONT>],

# 蕶
	q[Ղ] => q[<FONT color=VIOLET>Ղ</FONT>],
	q[] => q[<FONT color=PINK></FONT>],
	q[Ղ] => q[<FONT color=YELLOW>Ղ</FONT>],
	q[ł] => q[<FONT color=LIGHTSEAGREEN>ł</FONT>],
	q[҂悱] => q[<FONT color=DARKORCHID>҂悱</FONT>],
);
# ======܂============================================================

# p̃p^[
my %xxx_back = map { $xxx_data{$_}, $_ } keys(%xxx_data);
my $xxx_data_pattern = "(?:" . join("|", map { quotemeta($_) } keys(%xxx_data)) . ")";
my $xxx_back_pattern = "(?:" . join("|", map { quotemeta($_) } keys(%xxx_back)) . ")";

# ȕϊs(FtƂ)
sub change_to_xxx {
	my($message) = @_;

	# %xxx_data̕ϊ (SJIS,^OΉς)
	$message =~ s/\G((?:[^\x81-\x9f\xe0-\xfc<]|[\x81-\x9f\xe0-\xfc].|<[^>]*?>)*?)($xxx_data_pattern)/$1$xxx_data{$2}/xgo;

	# ̑̕ϊsꍇ͂̕ӂɋLq

	return $message;
}

# ȕϊ߂(FtƂ)
sub change_from_xxx {
	my($message) = @_;

	# %xxx_data̕߂
	$message =~ s/($xxx_back_pattern)/$xxx_back{$1}/go;

	# ̑̕ϊ߂ꍇ͂̕ӂɋLq

	return $message;
}

# html֘A̐K\
my $re_xtag_name = qr#[a-zA-Z0-9\.\_\:\-]+#;

# 摜̊gq̐K\
my $re_image_suffix = qr#jpg|jpeg|png|gif#i;

# ^O̒ɂƊȂȂ̂̐K\
my $re_dangerous = qr#mailto:|script|file:|strange\.kurumi\.ne\.jp|env|xmp|hainuwele|bbss.cgi|click#i;

# ^O[`
sub tag_change {
	my($message, $nazomode) = @_;

	if($nazomode) {
		# Ȃ[h

		# URLN̒1
		my $autolink = ($message =~ s#<A href="[^"]*" target="link">([^<]*)</A>#\0$1\0#go);

		# "&߂
		$message =~ s#((?:\G|>)[^<]*?)&quot;#$1"#go;
		$message =~ s#((?:\G|>)[^<]*?)&amp;#$1&#go;

		# ^Oۂ̂^Oɖ߂
		$message =~ s#&lt;(/?$re_xtag_name(?:\s+(?:$re_xtag_name\s*(?:=\s*(?:"[^"]*"|[^\s]*?)[\s\0]*)?)*)?/?)&gt;#&xtag_filter($1, 1)#ego;

		# URLN̒2Ɖ摜WJ
		if($autolink) {
			my $inline_img = ($message =~ s#((?:\G|>)[^<]*?)\0([^\0]*?$re_image_suffix)\0#$1<IMG src="$2">#go);
			$message =~ s#((?:\G|>)[^<]*?)\0([^\0]*?)\0#$1<A href="$2" target="link">$2</A>#go;
			$message =~ tr/\0//d;
			if($inline_img) {
				$message =~ s#<IMG src="([^"]*$re_dangerous[^"]*)">#<A href="$1" target="link">$1</A>#go;
			}
		}
	} else {
		# ʏ탂[h
		# ()
	}

	return $message;
}

# ^OptB^
sub xtag_filter {
	my($data, $nazomode) = @_;
	return "&lt;" . $data . "&gt;" if $data =~ m#(?:$re_dangerous)#;
	return "<" . $data . ">";
}

1;

__END__
