#!/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';
';
$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";