#Traduction de Kanchi-NR en UTF-8
# Saillans, Noël 2010

use strict;
use warnings;

my %tab_KNR2Unicode = (
#Organisation de la table : calquée sur le document "alphbet .doc"

#Signes divers
	")" => "\x{0964}", # danda
	"\x{2013}" => "\x{0965}",  # double danda
	#Nasalisation
	"'" => "\x{0902}", # le bindu (= anusvâra) 
	#le candra-bindu 
	#La marque du "o" bref dans les emprunts
	# Le visarga U+0903 est traité avant, vu qu'en HTML il est représenté par l'entité "&quote;"
	"(" => "\x{094D}", # virama 
	"\x{00E5}" => "\x{093D}", # avagraha 
	# Le "mini-spacer" (un pixel sur la ligne sup.) a été supprimé dans une phase antérieure
	#La syllabe mystique "Aum"

#Symboles "occidentaux":
	#Le trait d'union reste un tiret  -
	#La virgule = opt <
	"\x{2265}" => ".", # le point = opt > (opt-shift <)
	#Le point-virgule = opt ;
	#Le point d'interrogation = opt-shift ?
	#Le point d'exclamation = opt-shift x

#Voyelles pleines	
	"a" => "\x{0905}", # a bref
	# problème pour a long = "a;" : traité auparavant
	"\x{00EE}" => "\x{0907}",# i bref
	"\x{00C8}" => "\x{0908}", # i long
	"\x{00A8}" => "\x{0909}", # u bref
	# u long
	# r voyelle
	"E" => "\x{090F}", # e
	# ai : problème, il est réalisé par "Ee"
	# o : idem "ao"
	# au : idem "a*" : on les traite tous les 3 en même temps que "a;"
	
#Matras
	";" => "\x{093E}", # a long
	"i" => "\x{093F}", # i bref (après rotation)
	"I" => "\x{0940}", # i long
	"u" => "\x{0941}", # u bref
	"U" => "\x{0942}", # u long
	"O" => "\x{0943}", # r voyelle
	"e" => "\x{0947}", # e
	"w" => "\x{0948}", # ai
	"o" => "\x{094B}", # o
	"*" => "\x{094C}", # au
	
#Vélaires
	"k" => "\x{0915}", # ka
	"K" => "\x{0915}\x{094D}", # ka+virama
	"\x{2019}" => "\x{0915}\x{0943}", # ka + r voyelle
	# ka+virama+ra : traité auparavant
	"=" => "\x{0915}\x{094D}\x{0937}", # ksha
	# ksha + virama
	# kta
	# ka + nukta (q)
	
	"%" => "\x{0916}", # kha
	":" => "\x{0916}\x{094D}", # kha+virama
	# kha + nukta (ach-Laut)
	
	"g" => "\x{0917}", # ga
	"G" => "\x{0917}\x{094D}", # ga+virama
	# ga + nukta (agh-Laut)

	"\`" => "\x{0918}", # gha
	"~" => "\x{0918}\x{094D}", # gha+virama
	
	# nga
	# ngka 
	# ngku (dans angkush)
	"\x{20AC}" => "\x{0919}\x{094D}\x{0915}\x{094D}\x{0924}", # ngkta
	"\x{0192}" => "\x{0919}\x{094D}\x{0916}", # ngkha
	"\x{00A9}" => "\x{0919}\x{094D}\x{0917}", # ngga
	# nggha
	
#Palatales
	"c" => "\x{091A}", # ca
	"C" => "\x{091A}\x{094D}", # ca+virama
	
	"z" => "\x{091B}",	# cha
	# jamais avec virama
	
	"j" => "\x{091C}", # ja
	"J" => "\x{091C}\x{094D}", # ja+virama
	"D" => "\x{091C}\x{094D}\x{091E}", # jñ = ja+virama+ña
	# ja + nukta (z)
	
	# jha
	# jamais avec virama
	
	# ña
	"H" => "\x{091E}\x{094D}", # ña+virama
	"\x{00E7}" => "\x{091E}\x{094D}\x{091A}", # ñca
	"\x{00D4}" => "\x{091E}\x{094D}\x{091C}", # ñja
	
#Rétroflexes
	"\$" => "\x{091F}", # tta
	# redoublé
	
	"#" => "\x{0920}", # ttha
	
	"@" => "\x{0921}", # dda
	# ddra
	# claquante rra
	
	"!" => "\x{0922}", # ddha
	# claquante rrha	
	
	"," => "\x{0923}", # nna
	# "<" => "\x{0923}\x{094D}",  nna+virama : traité avant car entité "&lt;"

#Dentales
	"t" => "\x{0924}", # ta
	"T" => "\x{0924}\x{094D}", # ta+virama
	"\x{2020}" => "\x{0924}\x{094D}\x{0924}", # t redoublé
	"\x{00CA}" => "\x{0924}\x{094D}\x{0924}\x{094D}", # t redoublé+virama
	"]" => "\x{0924}\x{094D}\x{0930}", # tra	
	"}" => "\x{0924}\x{094D}\x{0930}\x{094D}", # tra+virama
	
	"q" => "\x{0925}", # tha
	"Q" => "\x{0925}\x{094D}", # tha+virama
	
	"d" => "\x{0926}", # da	
	"\x{2202}" => "\x{0926}\x{094D}\x{0926}", # d redoublé
	"\x{0131}" => "\x{0926}\x{094D}\x{0927}", # ddha
	"{" => "\x{0926}\x{094D}\x{0930}", # dra
	# "&" => "\x{0926}\x{094D}\x{0930}\x{0941}", dru : traité avant comme entité "&amp;"
	"\x{00CE}" => "\x{0926}\x{0943}", # d + r voyelle
	"\x{221A}" => "\x{0926}\x{094D}\x{0935}", # dva
	"\x{00A5}" => "\x{0926}\x{094D}\x{092F}", # dya
	# dga
	# dma
	"\x{222B}" => "\x{0926}\x{094D}\x{092D}", # dbha
	# dba
	
	"/" => "\x{0927}", # dha
	"?" => "\x{0927}\x{094D}", # dha+virama
	
	"n" => "\x{0928}", # na
	"N" => "\x{0928}\x{094D}",  # na+virama

#Labiales
	"p" => "\x{092A}", # pa
	"P" => "\x{092A}\x{094D}", # pa+virama

	"f" => "\x{092B}", # pha
	# jamais avec virama
	# pha + nukta (f)	
	# fra = pha + nukta +virama + r 
	
	"b" => "\x{092C}", # ba
	"B" => "\x{092C}\x{094D}", # ba+virama

	"." => "\x{092D}", # bha
	# ">" => "\x{092D}\x{094D}", bha+virama traité avatn comme entité "&gt;"
	
	"m" => "\x{092E}", # ma
	"M" => "\x{092E}\x{094D}", # ma+virama

#Les 4 Semi-voyelles (toujours comptées comme sonores)

	"y" => "\x{092F}", # ya
	"Y" => "\x{092F}\x{094D}", #ya+virama
	
	"r" => "\x{0930}", #ra
	"R" => "\x{0930}\x{094D}", # resh = ra+virama (après rotation)
	"[" => "\x{094D}\x{0930}", # virama+ra (après b, p, etc.
	"^" => "\x{094D}\x{0930}", # virama+ra (après tta, etc.)
	"\x{AE}" => "\x{0930}\x{0941}", # ru bref
	"\x{00C2}" => "\x{0930}\x{0942}", # rû	long
		
	"l" => "\x{0932}", # la
	"L" => "\x{0932}\x{094D}", # la+virama

	"v" => "\x{0935}", #va
	"V" => "\x{0935}\x{094D}", # va+virama

#Les 3 sifflantes (toujours comptées comme sourdes)	
	"x" => "\x{0936}", # ça palatal
	"X" => "\x{0936}\x{094D}", # ça pal.+virama
	"\x{2248}" => "\x{0936}\x{094D}\x{0930}", # çra
	"\x{00EA}" => "\x{0936}\x{094D}\x{0935}", # çva
	"\x{00ED}" => "\x{0936}\x{094D}\x{091A}", # çca

	"W" => "\x{0937}", # sha rétr.
	"\x{201E}" => "\x{0937}\x{094D}",# sha+virama
	"\x{2211}" => "\x{0937}\x{094D}\x{091F}", # shtta
	"\x{0153}" => "\x{0937}\x{094D}\x{0920}", # shttha

	"s" => "\x{0938}", # sa
	"S" => "\x{0938}\x{094D}",  # sa+virama
	"\x{00DF}" => "\x{0938}\x{094D}\x{0924}\x{094D}\x{0930}",# stra
	
#L'aspirée (toujours comptée comme sonore)	
	"h" => "\x{0939}", # ha
	"\x{00D9}" => "\x{0939}\x{0942}", # hû long
	"\x{00DB}" => "\x{0939}\x{0941}", # hu bref
	"\x{02D9}" => "\x{0939}\x{0943}", # h+r voyelle
	"\x{02DC}" => "\x{0939}\x{094D}\x{092E}", # hma
	# hy
	"\x{25CA}" => "\x{0939}\x{094D}\x{0928}", # hna

# Et pour finir, les chiffres	
	"0" => "\x{0966}",
	"1" => "\x{0967}",
	"2" => "\x{0968}",
	"3" => "\x{0969}",
	"4" => "\x{096A}",
	"5" => "\x{096B}",
	"6" => "\x{096C}",
	"7" => "\x{096D}",
	"8" => "\x{096E}",
	"9" => "\x{096F}",
);

sub fonc_KNR2Unicode($){ #arg. car
my ($car) = @_;

# On travaille ici sur un caractère individuel, réputé être en KNR

	if( exists ($tab_KNR2Unicode{$car}) ){
		return $tab_KNR2Unicode{$car};
	}else{
		return $car;
	}
}#fonc_KNR2Unicode

sub KNR2Unicode($){ #arg. chaîne KR, renvoie la version utf-8
my ($src) = @_;

# On travaille ici sur la chaîne réputée être en KNR tout entière

	my $mtr = '\;|i|I|u|U|O|e|w|o|\*'; # les caractères représentantles matras en KNR
	
#Nettoyages à faire avant pour ne pas être embêté
	# "_" dénote une forme complémentaite qui apparaît dans la construction de "kta" et de "kra",
	# de manière complètement ad hoc sous la forme "tt+(matra)+_" et "K+/+_"
	# Dans "kra" il est inutile, on peut le supprimer, mais pas dans "kta" !
	$src =~ s/K\[_/Kr/g; # matra ?
	$src =~ s/\x{2020}($mtr)?_/( defined($1) )?"Kt$1" : "Kt"/ge;

	# le "mini-spacer "\x{2021}" n'a plus lieu d'être
	$src =~ s/\x{2021}//g;

# Travaux à exécuter en priorité	
	$src =~ s/\&quot\;/\x{0903}/g; #le visarga traité à part
	$src =~ s/\&lt\;/\x{0923}\x{094D}/g; # l'entité "&lt;" représente "<" = nna+virama
	$src =~ s/\&gt\;/\x{092D}\x{094D}/g; # l'entité "&gt;" représente ">" = bha+virama
	$src =~ s/\&amp\;/\x{0926}\x{094D}\x{0930}\x{0941}/g; # l'entité "&amp;" représente "&" = dru

# Voyelles pleines	
	$src =~ s/a\;/\x{0906}/g; # la séquence "a;" représente la voyelle pleine "a long"
	$src =~ s/ao/\x{0913}/g; # la séquence "ao" représente la voyelle pleine "o"
	$src =~ s/a\*/\x{0914}/g; # la séquence "a*" représente la voyelle pleine "au"
	$src =~ s/Ee/\x{0910}/g; # la séquence "Ee" représente la voyelle pleine "ai"

# Les rares "&nbsp;" restants
	$src =~ s/\&nbsp\;/ /g; # en espérant ne pas perdre trop d'espaces cadrants

# Passage délicat autour des consonnes viramées (csv)
	my $csv = '(K|\:|G|~|C|J|H|\x{0923}\x{094D}|T|\x{00CA}|\}Q|\?|N|P|B|\x{092D}\x{094D}|M|Y|L|V|X|\x{201E}|S)';
# Rotation du i bref	
	$src =~ s/i($csv*.)/$1i/g; # il peut y avoir plusieurs consonnes viramées...
# Rotation du "reph"	
	$src =~ s/($csv?.(?:$mtr)?\'?)R/R$1/g; #le "reph" - attention aux matras et à l'anusvâra...

# Et c'est parti...	
 	return join('', map( {fonc_KNR2Unicode($_)}  split(//, $src)));
}#KNR2Unicode

sub nbsp($){ # chaîne de "&nbsp;"
my ($chn) = @_;
	my @tab = split(/\;/, $chn);
	return "\x{2630}"x scalar(@tab);
}#nbsp


sub Mac2UTF8($$){ #arg. 2 fichiers
	my ($fichIn, $fichOut) = @_;
	open(ENTREE, "<:encoding(macroman)", "$fichIn");
	open(SORTIE, ">:utf8", "$fichOut");
	
	my @tablignes = <ENTREE>;
	my $txt = join('', @tablignes);
	close(ENTREE);
	
# On travaille ici sur le $txt tout entier

	$txt =~ s/charset=macintosh/charset=utf-8/; #annoncer le changement de codage
	$txt =~ s/\<o\:p\>\s*\<\/o\:p\>//g; # éliminer "<o:p></o:p>"

# on transforme les spacerun et les tabcount en chaînes célestes

	my $spacerun = '\<span\s*style=\"mso\-spacerun\:\s*yes\"\>((\&nbsp\;)*\s?)\<\/span\>';
	# les "<span style="mso-spacerun: yes">&nbsp;</span>" 
	$txt =~ s/$spacerun/nbsp($1)/eg;
	
	my $tabcount = '\<span\s*style=\'mso\-tab\-count\:\d\'\>\s*((\&nbsp\;)*\s?)\<\/span\>';
	# idem pour les "<span style='mso-tab-count:1'>&nbsp;... </span>"
	$txt =~ s/$tabcount/nbsp($1)/eg;

# Action !
	my $ftsz = 'font\-size\:\d\d\.\dpt\;'; #"font-size:12.0pt;"
	my $nrm = '\;\s*font\-style\:normal'; 
	my $KNR = "\<span\\s*style=\'(?:$ftsz)?font-family:\\s*\"K\x{00E5}nchi NR\"(?:$nrm)?\'\>";
	#  "<span style='font-family:"Kånchi NR"'>" et ses variantes
	
	$txt =~ s/($KNR)($tabcount)/$2$1/; # on déplace les tabcount, car ils contribuent à la structure
	$txt =~ s/$KNR(.*?)\</'<span style=\'font-family:Serif; font-size:larger\'>'.KNR2Unicode($1).'<'/sge; 

# Enfin on restaure les espaces
	$txt =~ s/\x{2630}/\&nbsp\;/g;
	
	print(SORTIE $txt);
	close(SORTIE);
}#Mac2UTF8

Mac2UTF8($ARGV[0], $ARGV[1]); #fichiers source ".htm", et  but ".html"