function formatu_subtabelon($sxablono, $titolo)
 {
     //         echo("<!-- formatu_subtabelon( ..., " . var_export($titolo, true) .
     //              ")\n-->");
     $teksto = "\n";
     $titolo = eotransformado($titolo, $this->kodigo);
     $teksto .= "\n " . $titolo . " ";
     $teksto .= "\n-" . str_repeat('-', mb_strlen($titolo, "UTF-8")) . "-";
     $teksto .= "\n";
     $linioj = explode("\n", $sxablono);
     $tabellinioj = array();
     $largxo = 0;
     foreach ($linioj as $linio) {
         list($titolo, $kamponomo) = explode("|", $linio);
         $titolo = eotransformado($titolo, trim($this->kodigo));
         $len = mb_strlen($titolo, "UTF-8");
         $tabellinio = array($titolo, $kamponomo, $len);
         $tabellinioj[] = $tabellinio;
         $largxo = max($largxo, $len);
     }
     //         echo "<!-- " . var_export($tabellinioj, true) . "-->";
     foreach ($tabellinioj as $tabellinio) {
         list($titolo, $kamponomo, $len) = $tabellinio;
         $teksto .= "\n" . $titolo . " " . str_repeat(" ", $largxo - $len);
         $kamponomo = trim($kamponomo);
         $valoro = teksttransformo_donu_datumon($kamponomo, $this->datumoj);
         $valoro = implode(str_repeat(" ", $largxo + 1), explode("\n", eotransformado($valoro, $this->kodigo)));
         $teksto .= $valoro;
     }
     $this->teksto .= $teksto . "\n";
 }
/**
 * traktas <tekstero>n el la gramatiko cxe
 * transformu_tekston().
 */
function simpla_teksttransformo($sxablonero, $datumoj)
{
    $teksto = "";
    $sxablona_pozicio = 0;
    while (false !== ($komenco = strpos($sxablonero, '{{', $sxablona_pozicio))) {
        // la <simpla_teksto> el (4).
        $teksto .= substr($sxablonero, $sxablona_pozicio, $komenco - $sxablona_pozicio);
        $fino = strpos($sxablonero, '}}', $komenco + 2);
        if ($fino === false) {
            darf_nicht_sein();
        }
        // la <variablo> el (4).
        $teksto .= teksttransformo_donu_datumon(substr($sxablonero, $komenco + 2, $fino - ($komenco + 2)), $datumoj);
        // la sekva iteracio (aux la post-iteracia parto de la funkcio)
        // traktas la <tekstero>n el (4).
        $sxablona_pozicio = $fino + 2;
    }
    // la simpla_teksto el (3).
    $teksto .= substr($sxablonero, $sxablona_pozicio);
    return $teksto;
}
/**
 * Traktas <variablonomo> el la gramatiko cxe
 * transformu_tekston().
 */
function teksttransformo_donu_datumon($variablonomo, $datumoj)
{
    list($komenco, $resto) = explode('.', $variablonomo, 2);
    if ($resto and is_array($datumoj[$komenco])) {
        return teksttransformo_donu_datumon($resto, $datumoj[$komenco]);
    } else {
        return $datumoj[$komenco];
    }
}