#!/usr/bin/perl

sub vstup{
	$_=<FI>;
	chop;
	#mame korektni unixovy textovy standardni vstup
}

sub prekoduj {
	LINE:while(1){
#		$targ=$uvozovky ? "``" : "''";
		$targ=$uvozovky ? '\clqq{}' : '\crqq{}';
		last LINE unless s/"/$targ/e;
		$uvozovky=!$uvozovky;
	}
	s/\`\`/\\clqq{}/g;
	s/\'\'/\\crqq{}/g;
#	s/^\'/\\rq{}/;
#	s/\`/\\clq{}/g;
#	s/\'/\\crq{}/g;
	s/\`/\\lq{}/g;
	s/\'/\\rq{}/g;

	s/\[:/\$[:\$/g;
	s/:\]/\$:]\$/g;
	s/\&/\\&/g;
	s/\#/\\#/g;
}

sub initpisne {
	#preskoc pocatecni t602 radky zacinajici @
	vstup();
	while(/^@/){ vstup(); }
	while($_ eq ""){ vstup(); }

#	prekoduj();
	s/\&/\\ampersand\{\}/g;	#v obsahu nesmi byt & kvuli oddelovacum...
	s/\#/\\#/g;
	#v nadpisu necham uvozovky nedotceny kvuli obsahu

	#zpracuj jmeno pisnicky a autora
	($nic,$pisen,$skupina)=split(/\s{2,}/);
	if($skupina eq ""){
		$skupina=$adresar;
	}
	print "\t$pisen; $skupina\n";

	print FO "\\input pisne\n";
	print FO "\\pisen{$pisen}{$skupina}\n";

	#nyni budeme prochazet jednotlive radky a prevadet je
	$uvozovky=1;
	$bold=0;
	vstup();
	while($_ eq ""){ vstup(); }
}

sub vyrusctrlznaky {
	#na konci textu je bold vypnuty
	@x=split(//);
	if($#x>=0){			#-1 se chova jako 0
		$bold += $#x;
	}
	s/[-]//g;			#zbavime se tech zmen stylu
}

sub prevedakord{
	$ak=$rozpis[$_[0]];
	$xxx=0;

	#vyjimka: 7/5#, 5b/7, 7/5, 7/5-, ...
	if($ak =~ s/([2-9])([b#-])?[-\/]?([2-9])([b#-]?)/\{\}^{\1\2}_{\3\4}/){
		$xxx=1;
	}

	$ak =~ s/#/{}^\\#/g;	#standardne b, # do exponentu
	$ak =~ s/b/{}^b/g;
#	$ak =~ s/([#b])mi/\1_{\\rm mi}/g;

	$ak =~ s/maj([0-9])/\{\}^{\\rm maj\1}/g;	#maj7 nahoru
	$ak =~ s/([0-9])maj/\{\}^{\\rm maj\1}/g;
	$ak =~ s/sus([0-9])/_{\\rm sus\1}/g;		#sus4, add9 dolu
	$ak =~ s/([0-9])sus/_{\\rm sus\1}/g;
	$ak =~ s/add([0-9])/_{\\rm add\1}/g;
	$ak =~ s/([0-9])add/_{\\rm add\1}/g;
	$ak =~ s/dim/{\\rm dim}/g;			#dim, mi antikvou
	$ak =~ s/mi/{\\rm mi}/g;

	$ak =~ s/\&/\\&/g;				#kvuli chybam

	#if($ak =~ s/([0-9])[-\/]([0-9])/\{\}^\1_\2/){ $xxx=1; }
		#dvojity index 7/5
	if($ak =~ s/11/\{\}^{11}/){ $xxx=1; }
	if($ak =~ s/13/\{\}^{13}/){ $xxx=1; }
	if(!$xxx){
		$ak =~ s/([^sdj])([0-9])/\1\{\}^\2/g; #prvni cislo nahore
#		$ak =~ s/([^sdj^])([0-9])/\1\{\}_\2/; #druhe dole
	}

	$ak =~ s/\//\\over /g;		#basovani
	#aby TeX nerval na #
	
	$rozpis[$_[0]]=$ak;
}

sub nactiakordy {
	@rozpis=split(/\s+/);
#	print $#rozpis,',',@rozpis,"\n";	#0. pozice prazdna

	#nyni mam ulozen pocet a druh akordu, ulozime jeste pozice
	$pozice=$kde[0]=0;
	$_=$_ . " cokoliv";			#pridat zarazku
	for($i=1;$i<=$#rozpis;$i++){
		while(substr($_,$pozice,1) =~ /\s{1}/){
			$pozice++;
		}
		$kde[$i]=$pozice;
		while(substr($_,$pozice,1) !~ /\s{1}/){
			$pozice++;
		}
#		print $kde[$i],',',$pozice,',';
		prevedakord($i);		#odstranit #...
	}
	$kde[$#rozpis+1]=$pozice;		#pozice konce textu
}

sub konvertujtext {
	if($_ ne "" && substr($_,0,1) !~ /\s/){	#nova sloka
		($sloka,$mezera,$zbytek)=/([^ ]*)(\s*)(.*)/;

		$_=$sloka;
		prekoduj();

		print FO "\n\\nsloka{$_}";
		print "\t$sloka\n";
		$_=$zbytek;
		$posun=length($sloka)+length($mezera);
	}else{
		($sloka,$mezera,$zbytek)=/([^ ]*)(\s+)(.*)/;
		$_=$zbytek;
		$posun=length($sloka)+length($mezera);
	}
	
	for($i=0;$i<=$#rozpis;$i++){
	if($kde[$i]<$posun){
		$kde[$i]=$posun;
	}}	#kvuli nadpisum jeste pred radkou

	#nyni rozsekame radek na ty casti, ktere odpovidaji danym akordum
	if($#rozpis==-1){	#nebyly zapsany predtim akordy?
		prekoduj();
		print FO "$_\\par\n";
	}else{
		$#text=-1;
		$text[0]=substr($_,0,$kde[1]-$posun);
#		print $text[0],";";
		$kde[$#rozpis+1]=length($_)+$posun+1;
		for($i=1;$i<=$#rozpis;$i++){	#vsechny akordy
			$text[$i]=substr($_,$kde[$i]-$posun,
				$kde[$i+1]-$kde[$i]);
#			print "$kde[$i],$kde[$i+1],$text[$i];";
		}
#		print @text,"\n";

		#vypiseme dane \vtop y
		print FO "\\radek";
		for($i=0;$i<=$#rozpis;$i++){
#			$text[$i] =~ s/ / \\hfill{}/g;	
			#aby navazovaly akordy
			
			$_=$text[$i];
			prekoduj();

			if($rozpis[$i] ne ""){
				$rozpis[$i]="\$$rozpis[$i]\$";
			}
			print FO "\\dvojice{$rozpis[$i]}{$_}";
		}
		print FO "\\par\n";
		if(0){
			print FO "\\hbox{\\halign{&#\\cr\n&";
			for($i=1;$i<=$#rozpis;$i++){
				print FO "\\akord{$rozpis[$i]} &";
			}
			print FO "\\cr\n";
			for($i=0;$i<=$#rozpis;$i++){
				print FO "$text[$i]&";
			}
			print FO "\\cr}}\\par\n";
		}
		$#rozpis=-1;
	}
}

#######################################################################

$adresar=$ARGV[0];
$vstup=$ARGV[1];
$vystup=$ARGV[2];
open(FI,"<$vstup") || die "nemuzu cist z $vstup\n";
open(FO,">$vystup") || die "nemuzu zapisovat do $vystup\n";

initpisne();
do{
	vyrusctrlznaky();

	if($#x>=0 && ($bold%2 || $#x>1)){
		nactiakordy();
	}else{
		konvertujtext();
	}

	if($konec==1){	#uz byl eof?
		$konec=2;
	}else{
		vstup();
		if(eof(FI)){ $konec=1; }
	}
}while($konec!=2);
print FO "\n\\konecpisne\n";

close(FO);
close(FI);

