Schachdiagramme maschinell erzeugen
BearbeitenEinfach so
BearbeitenWomit man sich das unten sparen kann ;)
Version vom 5. Juni 2006
BearbeitenEin Perl-Skript, das aus der Forsyth-Edwards-Notation (FEN) die hiesigen Schachdiagramme (siehe auch Vorlage:Schachbrett/Doku) erzeugt.
- Die Freeware-Programme Scid oder xboard speichern Positionen in FEN.
- Die Grundstellung im Schach in FEN:
rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1
- Es wird nur die "1. Gruppe" (siehe FEN) verarbeitet.
- Getestet unter Unix/Linux, müsste auch unter Windows laufen (dazu in die erste Zeile des Codes den Pfad zu "perl.exe" anpassen). Eingabe auf der Kommandozeile:
perl 'Perl-Datei' 'FEN-Datei' oder unter Windows C:\"Pfad_zu_perl.exe"\perl.exe 'Perl-Datei' 'FEN-Datei'
Wobei der Quellcode in der 'Perl-Datei' steht, und eine beliebige Anzahl von FEN-Positionen in der 'FEN-Datei', zeilenweise voneinander abgetrennt. Die Diagramme werden auf die Standardausgabe geschrieben, gewünschte Umlenkung durch " > Dateiname " möglich.
Wichtig: Nutzung auf eigene Gefahr. Vor dem Kopieren evtl. Versionen/Autoren checken, falls Spitzbuben am Werk (= Skriptcode) waren.
Quellcode
Bearbeiten#!/usr/bin/perl # Für Windows: erste Zeile ersetzen durch z.B. #!C:\"Pfad_zu_perl.exe"\perl.exe use strict; my $chess2_header = "{{Schachbrett|=\n| tright\n|\n|=\n"; my $chess2_empty = ' |'; my $chess2_footer = " a b c d e f g h\n\n|\n}}\n"; my $chess1_line = '(?:[rnbqkp1-8]{1,8})'; # read input files containing positions linewise while (<>) { if (m@^((?:$chess1_line/){7,7}$chess1_line)@i) { my $chess1_pos = $1; print &translate ($chess1_pos); } } # translate sub translate { my ($pos1) = @_; my $pos2 = $chess2_header; my $line_no = 8; $pos1 .= '/'; while ($pos1 =~ s@^([^/]*)/@@) { my $line = $1; $pos2 .= " $line_no |"; $line_no--; my $field_no = 0; while ($line =~ s@(.)@@){ my $field = $1; if ($field =~ m@\d@) { $field_no += $field; $pos2 .= ${chess2_empty}x$field; } elsif ($field =~ m@[PRNBQK]@) { $field_no++; $field =~ tr@A-Z@a-z@; $field .= 'l'; $pos2 .= "$field|"; } elsif ($field =~ m@[prnbqk]@) { $field_no++; $field .= 'd'; $pos2 .= "$field|"; } else { print STDERR "undefined char $field\n"; } } if ($field_no == 8) { $pos2 .= "=\n"; } else { print STDERR "wrong number of fields\n"; return 0; } } if ($line_no == 0) { $pos2 .= $chess2_footer; return $pos2; } else { print STDERR "wrong number of lines\n"; return 0; } }