Automatische Buttonerzeugung

Wenn Sie grafisch gestaltete Buttons verwenden, kann es sehr viel Zeit verschlingen, alle benötigten Bilder von Hand zu erzeugen. Sehr viel angenehmer ist es, die Bilder automatisch aus den txt-Attributen der Buttons zu erzeugen.
foo
bar
bletch
quux
Um dies zu erreichen, können Sie bei navbar-FH.wml bei navbar:render das zusätzliche Attribut imgstyle angeben. Der Wert dieses Attributs wird intern als Key für ein Hash von Coderefs mit dem Namen %imgstyle benutzt. Um diese Funktion zu benutzen, müssen Sie also schreiben:
<navbar:render name="foobar" imgstyle="foo" select="foo.bar" ... >
Dies allein hat noch keine Wirkung, zusätzlich müssen Sie noch (in der gleichen Datei wie die Navigationsleiste oder in einer separaten Include-Datei) eine Funktion definieren, die die Buttons erzeugt:
<:
$imgstyle{foo} = sub {
    my ($file, $txt, $type, $level, $lang, $id) = @_;

    # actual code to produce the image here

}
:>
$file
ist der Name der Datei, die erzeugt werden soll.
$txt
ist der Text des Buttons.
$type
ist der imgstar-Typ des Buttons: 0 für Normal, 1 für Selected, 2 für Over.
$level
ist die Hierarchiestufe, auf der der Button steht, entsprechend der Zahl der Punkte im id-Attribut.
$lang
ist die Sprache, zu der dieser Button gehört, oder der leere String.
$id
ist das id-Attribut des Buttons, was sonst.
Um die Bilder zu erzeugen können Sie benutzen, was Sie wollen, Perlmagick oder Gimp oder was auch immer. Es ist Ihre Sache, dafür zu sorgen, dass die Funktion etwas Sinnvolles tut.

Hier ist der Code für das (zugegebener weise leicht pathologische) Beispiel vom Anfang der Seite:


<:
{
  my @cols=("white", "lightseagreen", "yellow");
  my @spc=("", "* ");
  $imgstyle{foo} = sub {
    my ($file, $txt, $type, $level, $lang, $id) = @_;
      system ("(banner '". $spc[$level] . $txt . "' |\
        asciitopgm 400 140 | pnmrotate 90 |\
        pnmscale -height 20 -width 80 |\
        pgmtoppm black-". $cols[$type]." | convert - " .
        $file . ") >/dev/null 2>&1 >/dev/null");
  }
}
:>
<navbar:define name="example">
  <navbar:header>
    <table cellspacing=0 cellpadding=0 border=0>
  </navbar:header>
  <navbar:footer>
    </table>
  </navbar:footer>

  <navbar:prolog>
    <tr><td>
  </navbar:prolog>
  <navbar:epilog>
    </td></tr>
  </navbar:epilog>

  <navbar:button id=foo img=foo.*.png 
         url=dummy.html txt=foo>     
  <navbar:button id=foo.bar img=bar.*.png
         url=dummy.html txt=bar>
  <navbar:button id=foo.bletch img=bletch.*.png
         url=dummy.html txt=bletch>     
  <navbar:button id=quux img=quux.*.png
         url=dummy.html txt=quux>
</navbar:define>

Florian Hars <florian@hars.de>, 2007-10-15 (orig: 1999-04-09)