#!/usr/bin/perl

# Převede stromečky z CSTS formátu do FS, aby se daly zobrazit Graphem.

inicializovat_seznam_atributu();
$seznam_atributu_je_kompletni = 0;

$struktura[0] = -1;
@hodnoty_veta = ([0,"#"]);
while(<>)
{
    # Odstranit znaky konce řádku (chomp() mi nefunguje vždy).
    s/\r?\n$//;
    # Před začátkem nové věty převést tu předcházející.
    if(m/^<s[ >]/)
    {
        # Zapamatovat si identifikátor věty, pokud je znám.
        if(m/ id="([^"]+)"/)
        {
            $sid = $1;
        }
        # Převést větu, pokud není prázdná.
        if($#struktura>0)
        {
            zpracovat_vetu();
        }
        # Do příští věty uložit její identifikátor, který jsme už přečetli.
        $hodnoty_veta[0][1] = $sid;
    }
    elsif(m/^<[fd][> ]/)
    {
        if(!$seznam_atributu_je_kompletni)
        {
            doplnit_seznam_atributu($_);
            $seznam_atributu_je_kompletni = 1;
        }
        # Zvýąit číslo slova.
        $ord++;
        # Zapamatovat si rodiče, dříve neľ bude seznam atributů rozcupován.
        if(m/<g>(\d+)/)
        {
            $struktura[$ord] = $1;
        }
        splice(@hodnoty);
        for($i = 0; $i<=$#atributy_csts; $i++)
        {
            while(s/$atributy_csts[$i]//)
            {
            $hodnoty[$i] = $1;
            }
        }
        push(@hodnoty_veta, [@hodnoty]);
    }
}
zpracovat_vetu();
#print("(0,1)\n");
vypsat_parametry_tredu();



###############################################################################
# Podprogramy
###############################################################################



sub inicializovat_seznam_atributu
{
    @atributy = ("ord", "form");
    @atributy_fs = ("\@N ord\n", "\@V form\n\@P form\n");
    @atributy_csts = ("<r>(\\d+)", "<[fd](?:>| [^>]*>)([^<]*)");
}



sub doplnit_seznam_atributu
{
    my $radek = $_[0];
    chomp($radek);
    my @radek = split(/</, $radek);
    shift(@radek);
    my($i, $j);
    for($i = 0; $i<=$#radek; $i++)
    {
    $radek[$i] = "<".$radek[$i];
    for($j = 0; $j<=$#atributy_csts; $j++)
    {
        if($radek[$i] =~ m/$atributy_csts[$j]/)
        {
        goto atribut_pridan;
        }
    }
    # Přidat regulární výraz pro čtení CSTS atributu.
    if($radek[$i] =~ m/<([^ >]+) src="([^"]+)"/) #"{
        {
            $atributy_csts[++$#atributy_csts] = "<$1 src=\"$2\">([^<]*)";
            $atributy[$#atributy_csts] = "$1$2";
            $atributy_fs[$#atributy_csts] = "\@P $1$2\n";
        }
        elsif($radek[$i] =~ m/<([^ >]+)/)
        {
        $atributy_csts[++$#atributy_csts] = "<$1>([^<]*)";
            $atributy[$#atributy_csts] = $1;
            $atributy_fs[$#atributy_csts] = "\@P $1\n";
        }
      atribut_pridan:
    }
    # Seznam atributů uľ je hotový, takľe je nejvyąąí čas vypsat záhlaví FS.
    print(join("", @atributy_fs)."\n");
}



sub zpracovat_vetu
{
    print(podstrom(0)."\n");
    splice(@hodnoty_veta, 1);
    splice(@struktura, 1);
    $ord = 0;
}



sub podstrom
{
    my $koren = $_[0];
    my $i;
    my $j;
    my @vysledek;
    for($i = 0; $i<=$#struktura; $i++)
    {
        if($struktura[$i]==$koren)
        {
            $vysledek[$j++] = podstrom($i);
        }
    }
    my $vysledek = "[";
    for($i = 0; $i<=$#{$hodnoty_veta[$koren]}; $i++)
    {
    # Zneąkodnit znaky se zvláątní funkcí ve FS.
    $hodnoty_veta[$koren][$i] =~ s/([[=|,\]])/\\$1/g;
    $vysledek .= "," unless($i==0);
    $vysledek .= $hodnoty_veta[$koren][$i];
    }
    $vysledek .= "]";
    if($j>0)
    {
        $vysledek = $vysledek."(".join(",", @vysledek).")";
    }
    return $vysledek;
}



# Vypsat parametry tredu (umoľňují zobrazovat červeně anotaci <MDg src="dz">).
sub vypsat_parametry_tredu
{
    # Standardně v Tredu zobrazit ord, form, g, MDgdz.
    print("//Tred:Custom-Attribute:\${ord}\n");
    print("//Tred:Custom-Attribute:\${form}\n");
    print("//Tred:Custom-Attribute:\${MDta}\n");
    print("//Tred:Custom-Attribute:\${g}\n");
    print("//Tred:Custom-Attribute:\${MDgdz}\n");
    # Zobrazit závislosti tam, kde se MDgdz liší od g.
    print("//Tred:Custom-Attribute:style:<? \"#{Line-coords:n,n,p,p\" . (\$\${g} != \$\${MDgdz} ? \"&n,n,x[ord=\$this->{MDgdz}],y[ord=\$this->{MDgdz}]\" : \"\") . \"}\"\n");
    # Tyto závislosti zobrazit červeně.
    print("//Tred:Custom-AttributeCont:    .\"#{Line-fill:\" . ( \$\${g} != \$\${MDgdz} ? \"&red\" : \"\" ) . \"}\" ?>\n");
    # Navíc je zobrazit tučně a se šipkou od závislého k řídícímu.
    print("//Tred:Custom-Attribute:style:#{Line-width:&3&3}\n");
    print("//Tred:Custom-Attribute:style:#{Line-arrow:&last&last}\n");
}



# Původní zápis konfigurace, tak jak byl uložen z Tredu.
sub x1
{
    print <<EOF
//Tred:Custom-Attribute:${ord}
//Tred:Custom-Attribute:${form}
//Tred:Custom-Attribute:${g}
//Tred:Custom-Attribute:${MDgdz}
//Tred:Custom-Attribute:style:<? "#{Line-coords:n,n,p,p"
//Tred:Custom-AttributeCont:         .( $${g} != $${MDgdz} ? "&n,n,x[ord=$this->{MDgdz}],y[ord=$this->{MDgdz}]" : "")
//Tred:Custom-AttributeCont:         .( $${g} != $${govMD_mc} ? "&n,n,x[ord=$this->{govMD_mc}],y[ord=$this->{govMD_mc}]" : "")
//Tred:Custom-AttributeCont:         ."}"
//Tred:Custom-AttributeCont:        ."#{Line-fill:"
//Tred:Custom-AttributeCont:         .( $${g} != $${MDgdz} ? "&red" : "")
//Tred:Custom-AttributeCont:         .( $${g} != $${govMD_mc} ? "&green" : "")
//Tred:Custom-AttributeCont:         ."}"
//Tred:Custom-AttributeCont:      ?>
//Tred:Custom-Attribute:${gov}
//Tred:Custom-Attribute:style:#{Line-arrow:&last&last}
//Tred:Custom-Attribute:style:#{Line-width:&3&3}
//Tred:Balloon-Pattern:tag:    ${tag}
//Tred:Balloon-Pattern:lemma:    ${lemma}
//Tred:Balloon-Pattern:commentA: ${commentA}
EOF
    ;
}
