#!/usr/bin/perl # periodic.pl - quick and dirty perl script to generate a SVG version of # the periodic table, based upon a 2-element table produced with sodipodi. # Copyright - 2003, Gordon Haverland, Matter Realisations # No warranty. Use as you see fit as long as you keep this notice in the # code. perl@materialisations.com $prolog=<<'EOP'; EOP $postlog = ''; $group = <<'EOS'; SyMbOl EOS @periodic = ( { AtNuM => 1, SyMbOl => 'H', IX => 0, IY => 0, }, { AtNuM => 2, SyMbOl => 'He', IX => 17, IY => 0, }, { AtNuM => 3, SyMbOl => 'Li', IX => 0, IY => 1, }, { AtNuM => 4, SyMbOl => 'Be', IX => 1, IY => 1, }, { AtNuM => 5, SyMbOl => 'B', IX => 12, IY => 1, }, { AtNuM => 6, SyMbOl => 'C', IX => 13, IY => 1, }, { AtNuM => 7, SyMbOl => 'N', IX => 14, IY => 1, }, { AtNuM => 8, SyMbOl => 'O', IX => 15, IY => 1, }, { AtNuM => 9, SyMbOl => 'F', IX => 16, IY => 1, }, { AtNuM => 10, SyMbOl => 'Ne', IX => 17, IY => 1, }, { AtNuM => 11, SyMbOl => 'Na', IX => 0, IY => 2, }, { AtNuM => 12, SyMbOl => 'Mg', IX => 1, IY => 2, }, { AtNuM => 13, SyMbOl => 'Al', IX => 12, IY => 2, }, { AtNuM => 14, SyMbOl => 'Si', IX => 13, IY => 2, }, { AtNuM => 15, SyMbOl => 'P', IX => 14, IY => 2, }, { AtNuM => 16, SyMbOl => 'S', IX => 15, IY => 2, }, { AtNuM => 17, SyMbOl => 'Cl', IX => 16, IY => 2, }, { AtNuM => 18, SyMbOl => 'Ar', IX => 17, IY => 2, }, { AtNuM => 19, SyMbOl => 'K', IX => 0, IY => 3, }, { AtNuM => 20, SyMbOl => 'Ca', IX => 1, IY => 3, }, { AtNuM => 21, SyMbOl => 'Sc', IX => 2, IY => 3, }, { AtNuM => 22, SyMbOl => 'Ti', IX => 3, IY => 3, }, { AtNuM => 23, SyMbOl => 'V', IX => 4, IY => 3, }, { AtNuM => 24, SyMbOl => 'Cr', IX => 5, IY => 3, }, { AtNuM => 25, SyMbOl => 'Mn', IX => 6, IY => 3, }, { AtNuM => 26, SyMbOl => 'Fe', IX => 7, IY => 3, }, { AtNuM => 27, SyMbOl => 'Co', IX => 8, IY => 3, }, { AtNuM => 28, SyMbOl => 'Ni', IX => 9, IY => 3, }, { AtNuM => 29, SyMbOl => 'Cu', IX => 10, IY => 3, }, { AtNuM => 30, SyMbOl => 'Zn', IX => 11, IY => 3, }, { AtNuM => 31, SyMbOl => 'Ga', IX => 12, IY => 3, }, { AtNuM => 32, SyMbOl => 'Ge', IX => 13, IY => 3, }, { AtNuM => 33, SyMbOl => 'As', IX => 14, IY => 3, }, { AtNuM => 34, SyMbOl => 'Se', IX => 15, IY => 3, }, { AtNuM => 35, SyMbOl => 'Br', IX => 16, IY => 3, }, { AtNuM => 36, SyMbOl => 'Kr', IX => 17, IY => 3, }, { AtNuM => 37, SyMbOl => 'Rb', IX => 0, IY => 4, }, { AtNuM => 38, SyMbOl => 'Sr', IX => 1, IY => 4, }, { AtNuM => 39, SyMbOl => 'Y', IX => 2, IY => 4, }, { AtNuM => 40, SyMbOl => 'Zr', IX => 3, IY => 4, }, { AtNuM => 41, SyMbOl => 'Nb', IX => 4, IY => 4, }, { AtNuM => 42, SyMbOl => 'Mo', IX => 5, IY => 4, }, { AtNuM => 43, SyMbOl => 'Tc', IX => 6, IY => 4, }, { AtNuM => 44, SyMbOl => 'Ru', IX => 7, IY => 4, }, { AtNuM => 45, SyMbOl => 'Rh', IX => 8, IY => 4, }, { AtNuM => 46, SyMbOl => 'Pd', IX => 9, IY => 4, }, { AtNuM => 47, SyMbOl => 'Ag', IX => 10, IY => 4, }, { AtNuM => 48, SyMbOl => 'Cd', IX => 11, IY => 4, }, { AtNuM => 49, SyMbOl => 'In', IX => 12, IY => 4, }, { AtNuM => 50, SyMbOl => 'Sn', IX => 13, IY => 4, }, { AtNuM => 51, SyMbOl => 'Sb', IX => 14, IY => 4, }, { AtNuM => 52, SyMbOl => 'Te', IX => 15, IY => 4, }, { AtNuM => 53, SyMbOl => 'I', IX => 16, IY => 4, }, { AtNuM => 54, SyMbOl => 'Xe', IX => 17, IY => 4, }, { AtNuM => 55, SyMbOl => 'Cs', IX => 0, IY => 5, }, { AtNuM => 56, SyMbOl => 'Ba', IX => 1, IY => 5, }, { AtNuM => 57, SyMbOl => 'La*', IX => 2, IY => 5, }, { AtNuM => 72, SyMbOl => 'Hf', IX => 3, IY => 5, }, { AtNuM => 73, SyMbOl => 'Ta', IX => 4, IY => 5, }, { AtNuM => 74, SyMbOl => 'W', IX => 5, IY => 5, }, { AtNuM => 75, SyMbOl => 'Re', IX => 6, IY => 5, }, { AtNuM => 76, SyMbOl => 'Os', IX => 7, IY => 5, }, { AtNuM => 77, SyMbOl => 'Ir', IX => 8, IY => 5, }, { AtNuM => 78, SyMbOl => 'Pt', IX => 9, IY => 5, }, { AtNuM => 79, SyMbOl => 'Au', IX => 10, IY => 5, }, { AtNuM => 80, SyMbOl => 'Hg', IX => 11, IY => 5, }, { AtNuM => 81, SyMbOl => 'Tl', IX => 12, IY => 5, }, { AtNuM => 82, SyMbOl => 'Pb', IX => 13, IY => 5, }, { AtNuM => 83, SyMbOl => 'Bi', IX => 14, IY => 5, }, { AtNuM => 84, SyMbOl => 'Po', IX => 15, IY => 5, }, { AtNuM => 85, SyMbOl => 'At', IX => 16, IY => 5, }, { AtNuM => 86, SyMbOl => 'Rn', IX => 17, IY => 5, }, { AtNuM => 87, SyMbOl => 'Fr', IX => 0, IY => 6, }, { AtNuM => 88, SyMbOl => 'Ra', IX => 1, IY => 6, }, { AtNuM => 89, SyMbOl => 'Ac**', IX => 2, IY => 6, }, { AtNuM => 104, SyMbOl => 'Rf', IX => 3, IY => 6, }, { AtNuM => 105, SyMbOl => 'Db', IX => 4, IY => 6, }, { AtNuM => 106, SyMbOl => 'Sg', IX => 5, IY => 6, }, { AtNuM => 107, SyMbOl => 'Bh', IX => 6, IY => 6, }, { AtNuM => 108, SyMbOl => 'Hs', IX => 7, IY => 6, }, { AtNuM => 109, SyMbOl => 'Mt', IX => 8, IY => 6, }, { AtNuM => 110, SyMbOl => 'Ds', IX => 9, IY => 6, }, { AtNuM => 58, SyMbOl => 'Ce', IX => 2, IY => 8, }, { AtNuM => 59, SyMbOl => 'Pr', IX => 3, IY => 8, }, { AtNuM => 60, SyMbOl => 'Nd', IX => 4, IY => 8, }, { AtNuM => 61, SyMbOl => 'Pm', IX => 5, IY => 8, }, { AtNuM => 62, SyMbOl => 'Sm', IX => 6, IY => 8, }, { AtNuM => 63, SyMbOl => 'Eu', IX => 7, IY => 8, }, { AtNuM => 64, SyMbOl => 'Gd', IX => 8, IY => 8, }, { AtNuM => 65, SyMbOl => 'Tb', IX => 9, IY => 8, }, { AtNuM => 66, SyMbOl => 'Dy', IX => 10, IY => 8, }, { AtNuM => 67, SyMbOl => 'Ho', IX => 11, IY => 8, }, { AtNuM => 68, SyMbOl => 'Er', IX => 12, IY => 8, }, { AtNuM => 69, SyMbOl => 'Tm', IX => 13, IY => 8, }, { AtNuM => 70, SyMbOl => 'Yb', IX => 14, IY => 8, }, { AtNuM => 71, SyMbOl => 'Lu', IX => 15, IY => 8, }, { AtNuM => 90, SyMbOl => 'Th', IX => 2, IY => 9, }, { AtNuM => 91, SyMbOl => 'Pa', IX => 3, IY => 9, }, { AtNuM => 92, SyMbOl => 'U', IX => 4, IY => 9, }, { AtNuM => 93, SyMbOl => 'Np', IX => 5, IY => 9, }, { AtNuM => 94, SyMbOl => 'Pu', IX => 6, IY => 9, }, { AtNuM => 95, SyMbOl => 'Am', IX => 7, IY => 9, }, { AtNuM => 96, SyMbOl => 'Cm', IX => 8, IY => 9, }, { AtNuM => 97, SyMbOl => 'Bk', IX => 9, IY => 9, }, { AtNuM => 98, SyMbOl => 'Cf', IX => 10, IY => 9, }, { AtNuM => 99, SyMbOl => 'Es', IX => 11, IY => 9, }, { AtNuM => 100, SyMbOl => 'Fm', IX => 12, IY => 9, }, { AtNuM => 101, SyMbOl => 'Md', IX => 13, IY => 9, }, { AtNuM => 102, SyMbOl => 'No', IX => 14, IY => 9, }, { AtNuM => 103, SyMbOl => 'Lr', IX => 15, IY => 9, } ); open( SVG, "> periodic2.svg" ) || die "Bleep\n"; # $IX, $IY, $width, $height $width = 32.0; $height = 32.0; $Owidth = 19 * $width; $Oheight = 11 * $height; # With text-anchor:middle; in the style of text elements, I get left-right # centering of the Atomic Symbols. I still don't get up-down. By default, # all units are pixels, and I am using 12px letters. So, I don't want # $height/2 vertical offset. I want $height - 0.5( $height - 12px ) = # $height/2 + 6. #$gap = 1.0; print SVG "$prolog"; print SVG " \n"; foreach $element (@periodic) { # Calculate the location of the upper left corner of rectangle, and location # of text. $RLocX = ($width / 2) + ($element->{IX} * $width); $RLocY = ($height / 2) + ($element->{IY} * $height); $TLocX = $width + ($element->{IX} * $width); $TLocY = $height + ($element->{IY} * $height) + 6; # Get a copy of the SVG group. my $grp = $group; # Substitute in, all the AtNuM values for IDs, the Atomic Symbol, and the # above calculate locations. $grp =~ s/AtNuM/$element->{AtNuM}/g; $grp =~ s/SyMbOl/$element->{SyMbOl}/; $grp =~ s/WiDtH/$width/; $grp =~ s/HeIgHt/$height/; $grp =~ s/RLocX/$RLocX/; $grp =~ s/RLocY/$RLocY/; $grp =~ s/TLocX/$TLocX/; $grp =~ s/TLocY/$TLocY/; print SVG "$grp"; } print SVG "$postlog\n";