#!/usr/bin/perl

$par = "";
#nebudeme zapisovat \par diky \obeylines

sub vstup {
	$emptylines = 0;
	while (1) {
		if (eof(FI))
		{
			$konec = 1;
			$_ = "";
			return;
		}
		$_=<FI>;
		chomp == 1 || die "not a UNIX text-file\n";
		#mame korektni unixovy textovy standardni vstup
		return if $_ ne "";
		$emptylines++;
	}
}

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 {
	while(/^@/){ die "t602 line found\n"; 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{4,}/);
	vstup();
	while ($_ =~ /^[\s\/]{30,}(.*)$/ && $_ !~ //) {
		$tmp = $1;
		$tmp =~ s/\&/\\ampersand\{\}/g;
		$tmp =~ s/\#/\\#/g;
		$skupina .= " $tmp";
		vstup();
	}
	if($skupina eq ""){
		$skupina=$adresar;
	}
	print "\t$pisen; $skupina\n";

	$skpis = `echo "$skupina.$pisen" | cstocs il2 ascii`;
	$skpis =~ tr/A-Z/a-z/;
	$skpis =~ s/[^a-z0-9.]//g;
	if ($uzbylo++) {
		print FO "\n\\konecpisne\n\n\n";
	} else {
		print FO "\\input pisne\n";
		print FO "{\\obeylines\n\n";
	}
	print FO "\\pisen{$skpis}{$pisen}{$skupina}\n";

	#nyni budeme prochazet jednotlive radky a prevadet je
	$uvozovky=1;
	$bold=0;
}

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 {
	for (my $i=0; $i<$emptylines; $i++)
	{
		#print FO "\n";
	}
	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";

vstup();
initpisne();
while (!$konec) {
	vyrusctrlznaky();

	if($#x>=0 && ($bold%2 || $#x>1)){
		nactiakordy();
	}else{
		if ($emptylines >= 1 or $adresar eq "texts") {
			@items = split(/\s{4,}/);
			if ($#items >= 2 && /^\s{6,}/)
			{
				initpisne();
				next;
			}
		}
		konvertujtext();
	}

	vstup();
}
print FO "\n\\konecpisne\n}\n";

close(FO);
close(FI);

