#! /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[<FONT color=#7F7F7F></FONT>] => q[0],
	q[<FONT color=#0000FF></FONT>] => q[1],
	q[<FONT color=#0000BF></FONT>] => q[2],
	q[<FONT color=#472BBF></FONT>] => q[3],
                                              
	q[<FONT color=#970087></FONT>] => q[4],
	q[<FONT color=#AB0023></FONT>] => q[5],
	q[<FONT color=#AB1300></FONT>] => q[6],
	q[<FONT color=#8B1700></FONT>] => q[7],
                                              
	q[<FONT color=#533000></FONT>] => q[8],
	q[<FONT color=#007800></FONT>] => q[9],
	q[<FONT color=#006B00></FONT>] => q[a],
	q[<FONT color=#005B00></FONT>] => q[b],
                                              
	q[<FONT color=#004358></FONT>] => q[c],
	q[<FONT color=#000000></FONT>] => q[d],
	q[<FONT color=#000001></FONT>] => q[e],
	q[<FONT color=#000002></FONT>] => q[f],

# t@~R $10 - $1f
	q[<FONT color=#BFBFBF></FONT>] => q[0],
	q[<FONT color=#0078F8></FONT>] => q[1],
	q[<FONT color=#0058F8></FONT>] => q[2],
	q[<FONT color=#6B47FF></FONT>] => q[3],
                                              
	q[<FONT color=#DB00CD></FONT>] => q[4],
	q[<FONT color=#E7005B></FONT>] => q[5],
	q[<FONT color=#F83800></FONT>] => q[6],
	q[<FONT color=#E75F13></FONT>] => q[7],
                                              
	q[<FONT color=#AF7F00></FONT>] => q[8],
	q[<FONT color=#00B800></FONT>] => q[9],
	q[<FONT color=#00AB00></FONT>] => q[a],
	q[<FONT color=#00AB47></FONT>] => q[b],
                                              
	q[<FONT color=#008B8B></FONT>] => q[c],
	q[<FONT color=#000003></FONT>] => q[d],
	q[<FONT color=#000004></FONT>] => q[e],
	q[<FONT color=#000005></FONT>] => q[f],

# t@~R $20 - $2f
	q[<FONT color=#F8F8F8></FONT>] => q[0],
	q[<FONT color=#3FBFFF></FONT>] => q[1],
	q[<FONT color=#6B88FF></FONT>] => q[2],
	q[<FONT color=#9878F8></FONT>] => q[3],
                                              
	q[<FONT color=#F878F8></FONT>] => q[4],
	q[<FONT color=#F85898></FONT>] => q[5],
	q[<FONT color=#F87858></FONT>] => q[6],
	q[<FONT color=#FFA347></FONT>] => q[7],
                                              
	q[<FONT color=#F8B800></FONT>] => q[8],
	q[<FONT color=#B8F818></FONT>] => q[9],
	q[<FONT color=#5BDB57></FONT>] => q[a],
	q[<FONT color=#58F898></FONT>] => q[b],
                                              
	q[<FONT color=#00EBDB></FONT>] => q[c],
	q[<FONT color=#787878></FONT>] => q[d],
	q[<FONT color=#000006></FONT>] => q[e],
	q[<FONT color=#000007></FONT>] => q[f],
                                              
# t@~R $30 - $3f
	q[<FONT color=#FFFFFF></FONT>] => q[0],
	q[<FONT color=#A7E7FF></FONT>] => q[1],
	q[<FONT color=#B8B8F8></FONT>] => q[2],
	q[<FONT color=#D8B8F8></FONT>] => q[3],
                                              
	q[<FONT color=#F8B8F8></FONT>] => q[4],
	q[<FONT color=#FBA7C3></FONT>] => q[5],
	q[<FONT color=#F0D0B0></FONT>] => q[6],
	q[<FONT color=#FFE3AB></FONT>] => q[7],
                                              
	q[<FONT color=#FBDB7B></FONT>] => q[8],
	q[<FONT color=#D8F878></FONT>] => q[9],
	q[<FONT color=#B8F8B8></FONT>] => q[a],
	q[<FONT color=#B8F8D8></FONT>] => q[b],
                                              
	q[<FONT color=#00FFFF></FONT>] => q[c],
	q[<FONT color=#F8D8F8></FONT>] => q[d],
	q[<FONT color=#000008></FONT>] => q[e],
	q[<FONT color=#000009></FONT>] => q[f],

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

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

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

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

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

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

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

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

# 蕶
	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>] => q[҂悱],
);
# ======܂============================================================

# 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__
