| 1 |
#!/usr/bin/perl |
| 2 |
|
| 3 |
# |
| 4 |
# convert (a subset) of fractint l-systems into |
| 5 |
# lsys-lsystems |
| 6 |
# |
| 7 |
# version 1.0 |
| 8 |
# |
| 9 |
|
| 10 |
while (<>) { |
| 11 |
chomp; |
| 12 |
my $comment=$1 if s/\s*;+\s*(.*)$//; |
| 13 |
my $o; |
| 14 |
s/"/%/g; |
| 15 |
if (/^\s*(\S+)\s+{\s*$/i) { |
| 16 |
$lsys=$1; |
| 17 |
$lsys=~s/[^A-Za-z_]/_/g; |
| 18 |
$lsys=~s/([_a-z])([A-Z])/$1_@{[lc($2)]}/g; |
| 19 |
$lsys=~s/__/_/g; |
| 20 |
$lsys=~s/^_//; |
| 21 |
$lsys=~s/_$//; |
| 22 |
$s=$lsys{$lsys}; |
| 23 |
$lsys{$lsys}++; |
| 24 |
$lsys.=$s; |
| 25 |
$o="ruleset ("; |
| 26 |
} elsif (/Angle (\d+)/i) { |
| 27 |
$angle=$1; |
| 28 |
} elsif (/Axiom (\S+)/i) { |
| 29 |
$o=" $lsys(n) => attr (delta, 360/$angle) ".mangle($1).", n;"; |
| 30 |
} elsif (/^\s*(\S+)\s*=(.*)$/) { |
| 31 |
my($f,$g)=($1,$2); |
| 32 |
$f=~y/a-z/A-Z/; |
| 33 |
$f=~y/FGDM/FfFfFfFf/; |
| 34 |
$o=" $f => ".mangle($g).";"; |
| 35 |
} elsif(/^\s*}\s*$/i) { |
| 36 |
undef $lsys; |
| 37 |
$o=")"; |
| 38 |
} |
| 39 |
print $o,($comment ? " // $comment" : ""),"\n"; |
| 40 |
} |
| 41 |
|
| 42 |
sub mangle { |
| 43 |
$_=$_[0]; |
| 44 |
s/([a-zA-Z])([a-z])/$1 $2/g; |
| 45 |
y/a-z/A-Z/; |
| 46 |
y/FGDM/FfFfFfFf/; |
| 47 |
s/\/([0-9.]+)/ +($1) /g; |
| 48 |
s/\\([0-9.]+)/ -($1) /g; |
| 49 |
s/\@q\s*i([0-9.]+)/ attr (distance, distance\/0$1^0.5) /ig; |
| 50 |
s/\@i\s*q([0-9.]+)/ attr (distance, distance\/0$1^0.5) /ig; |
| 51 |
s/\@q([0-9.]+)/ attr (distance, distance*0$1^0.5) /ig; |
| 52 |
s/\@i([0-9.]+)/ attr (distance, distance\/0$1) /ig; |
| 53 |
s/\@([0-9.]+)/ attr (distance, distance*0$1) /ig; |
| 54 |
s/c([0-9]+)//ig; # ignore all |
| 55 |
s/<([0-9]+)//g; # kinds of |
| 56 |
s/>([0-9]+)//g; # colours |
| 57 |
s/ / /g; |
| 58 |
s/^ //g; |
| 59 |
s/ $//g; |
| 60 |
$_; |
| 61 |
} |
| 62 |
|
| 63 |
|