#!/usr/local/bin/perl -s
package romkan;
;######################################################################
;#
;# romkan.pl: romaji-to-kana convertion subroutine for Perl
;#
;# Copyright (c) 1993 Kazumasa Utashiro <utashiro@sra.co.jp>
;# Software Research Associates, Inc., Japan
;#
;# Original: Jan 12 1993
;; $rcsid = q$Id: romkan.pl,v 1.4 1993/05/03 16:28:13 utashiro Exp $;
;#
;######################################################################
;#
;# SYNOPSIS
;#
;#	$kana = &romkan($roma [, CODE [, KATAKANA]] );
;#
;# DESCRIPTION
;#
;#	Subroutine &romkan returns KANA string expressed by the first
;#	argument.  It returns undef when translation was failed.
;#
;#	Second argument specifies the encoding of return string.  It
;#	is encoded in 'euc' by default.  Use 'euc', 'sjis' or 'jis'.
;#
;#	If the third argument is supplied and its value is
;#	true, return string is expressed by KATAKANA rather
;#	than HIRAGANA which is default.  Use undef for
;#	second argument if you don't want to specify the code.
;#
;######################################################################
;#
;# SAMPLE:
;#
;#	require('romkan.pl');
;#	while (<>) {
;#	    s/[\w\-]+/&romkan($&)||$&/ge unless 1 .. /^$/;
;#	    print;
;#	}
;#
;######################################################################

require('jcode.pl');

$pcode = 'euc';

$romkan_table = <<'__TABLE_END__' unless $romkan_table;
a	$B$"(B	i	$B$$(B	u	$B$&(B	e	$B$((B	o	$B$*(B
ka	$B$+(B	ki	$B$-(B	ku	$B$/(B	ke	$B$1(B	ko	$B$3(B
ga	$B$,(B	gi	$B$.(B	gu	$B$0(B	ge	$B$2(B	go	$B$4(B
sa	$B$5(B	si	$B$7(B	su	$B$9(B	se	$B$;(B	so	$B$=(B
za	$B$6(B	zi	$B$8(B	zu	$B$:(B	ze	$B$<(B	zo	$B$>(B
ta	$B$?(B	ti	$B$A(B	tu	$B$D(B	te	$B$F(B	to	$B$H(B
				tsu	$B$D(B
da	$B$@(B	di	$B$B(B	du	$B$E(B	de	$B$G(B	do	$B$I(B
na	$B$J(B	ni	$B$K(B	nu	$B$L(B	ne	$B$M(B	no	$B$N(B
ha	$B$O(B	hi	$B$R(B	hu	$B$U(B	he	$B$X(B	ho	$B$[(B
fa	$B$U$!(B	fi	$B$U$#(B	fu	$B$U(B	fe	$B$U$'(B	fo	$B$U$)(B
pa	$B$Q(B	pi	$B$T(B	pu	$B$W(B	pe	$B$Z(B	po	$B$](B
ba	$B$P(B	bi	$B$S(B	bu	$B$V(B	be	$B$Y(B	bo	$B$\(B
ma	$B$^(B	mi	$B$_(B	mu	$B$`(B	me	$B$a(B	mo	$B$b(B
ya	$B$d(B			yu	$B$f(B			yo	$B$h(B
ra	$B$i(B	ri	$B$j(B	ru	$B$k(B	re	$B$l(B	ro	$B$m(B
wa	$B$o(B	wi	$B$p(B			we	$B$q(B	wo	$B$r(B
kya	$B$-$c(B			kyu	$B$-$e(B	kye	$B$-$'(B	kyo	$B$-$g(B
gya	$B$.$c(B			gyu	$B$.$e(B	gye	$B$.$'(B	gyo	$B$.$g(B
sha	$B$7$c(B	shi	$B$7(B	shu	$B$7$e(B	she	$B$7$'(B	sho	$B$7$g(B
zya	$B$8$c(B			zyu	$B$8$e(B	zye	$B$8$'(B	zyo	$B$8$g(B
ja	$B$8$c(B	ji	$B$8(B	ju	$B$8$e(B	je	$B$8$'(B	jo	$B$8$g(B
jya	$B$8$c(B			jyu	$B$8$e(B	jye	$B$8$'(B	jyo	$B$8$g(B
tya	$B$A$c(B	thi	$B$F$#(B	tyu	$B$A$e(B	tye	$B$A$'(B	tyo	$B$A$g(B
cha	$B$A$c(B	chi	$B$A(B	chu	$B$A$e(B	che	$B$A$'(B	cho	$B$A$g(B
dya	$B$B$c(B	dhi	$B$G$#(B	dyu	$B$B$e(B	dye	$B$B$'(B	dyo	$B$B$g(B
nya	$B$K$c(B			nyu	$B$K$e(B	nye	$B$K$'(B	nyo	$B$K$g(B
hya	$B$R$c(B			hyu	$B$R$e(B	hye	$B$R$'(B	hyo	$B$R$g(B
pya	$B$T$c(B			pyu	$B$T$e(B	pye	$B$T$'(B	pyo	$B$T$g(B
bya	$B$S$c(B			byu	$B$S$e(B	bye	$B$S$'(B	byo	$B$S$g(B
mya	$B$_$c(B			myu	$B$_$e(B	mye	$B$_$'(B	myo	$B$_$g(B
rya	$B$j$c(B			ryu	$B$j$e(B	rye	$B$j$'(B	ryo	$B$j$g(B
xa	$B$!(B	xi	$B$#(B	xu	$B$%(B	xe	$B$'(B	xo	$B$)(B
xwa	$B$n(B	xtsu	$B$C(B	xtu	$B$C(B
xya	$B$c(B			xyu	$B$e(B			xyo	$B$g(B
n'	$B$s(B	n	$B$s(B
-	$B!<(B
__TABLE_END__

&jcode'convert(*romkan_table, $pcode);
%romkan = @romkan = split(/\s+/, $romkan_table);
$consonants = 'ckgszjtdhfpbmyrw';
for ($consonants =~ /./g) { $romkan{"$_$_"} = $romkan{'xtsu'}; }
for (0..9) { $romkan{$_} = $_; }

;;; eval($sub_romkan = q%
sub main'romkan {
    local($_, $code, $katakana) = @_;
    local($kana) = '';
    while (length) {
% .	join('', grep(++$i%2 && ($_ = "\tnext if s/^$_//i;\n"), @romkan)) . q%
	next if s/^\d//;
	next if s/^([%.$consonants.q%])\1/\1/i;
	last;
    } continue {
	$kana .= $romkan{"\L$&"};
    }
    return undef if length;
    $kana =~ s/\244(.)/\245$1/g if $katakana;
    &jcode'convert(*kana, $code, $pcode) if $code && $code ne $pcode;
    $kana;
}
%);

;######################################################################
if (__FILE__ eq $0) {	# test main
    package main;

    print $romkan'sub_romkan if $debug; #''
    $/ = '' unless -t STDIN;
    while (<>) {
	print unless -t STDIN;
	s/[\w\-]+/&romkan($&)||$&/ge;
	print;
    }
}
;######################################################################

1;
