#!/usr/bin/perl # perl script to convert a text tab-separated palette to xml format sub parse_color { my ($indexOnPageColumn, $pageNumColumn, $colorIDColumn, $colourSpaceNameColumn, $colourNameColumn, $LABColumn, $CMYKColumn, $RGBColumn, $sRGBColumn, $adobeRGBColumn, $line) = @_; my @split = map { s/\s+$//; s/^\s+//; $_; } split('\t',$line); $page = $split[$pageNumColumn]; $indexOnPage = int($split[$indexOnPageColumn]); $colorID = int($split[$colorIDColumn]); $colourSpace = $split[$colourSpaceNameColumn]; $name = $split[$colourNameColumn]; if ($LABColumn ne -1) { # L [0..100], a [-128..127], b [-128..127] $L = $split[$LABColumn]/100; $a = ($split[$LABColumn+1]+128)/255; $b = ($split[$LABColumn+2]+128)/255; } if ($CMYKColumn ne -1) { # CMYK US [0..100] $C = $split[$CMYKColumn]/100; $M = $split[$CMYKColumn+1]/100; $Y = $split[$CMYKColumn+2]/100; $K = $split[$CMYKColumn+3]/100; } if ($RGBColumn ne -1) { # RGB is [0..255] $R = $split[$RGBColumn]/255; $G = $split[$RGBColumn+1]/255; $B = $split[$RGBColumn+2]/255; } if ($sRGBColumn ne -1) { # sRGB-100 is [0..100] $sR = $split[$sRGBColumn]/100; $sG = $split[$sRGBColumn+1]/100; $sB = $split[$sRGBColumn+2]/100; } if ($adobeRGBColumn ne -1) { # Adobe RGB is [0..100] $aR = $split[$adobeRGBColumn]/100; $aG = $split[$adobeRGBColumn+1]/100; $aB = $split[$adobeRGBColumn+2]/100; } my %color = ( page => $page, indexOnPage => $indexOnPage, colorID => $colorID, colourSpace => $colourSpace, name => $name, L => $L, a => $a, b => $b, C => $C, M => $M, Y => $Y, K => $K, R => $R, G => $G, B => $B, sR => $sR, sG => $sG, sB => $sB, aR => $aR, aG => $aG, aB => $aB, ); return \%color; } ################################################################ # # Step 1: Parse command-line parameters # ################################################################ die "CreatePaletteXmlFromTxt: usage: CreatePaletteXmlFromTxt.pl \n" if(scalar(@ARGV) < 2); ($infile, $outfile) = @ARGV; ################################################################ # # Step 2: Read the input file. # ################################################################ open(INFILE, $infile) or die "CreatePaletteXmlFromTxt: error: couldn't open '$infile' for input\n"; @fileInput = ; close INFILE; # Get the palette name my @split = split('\t',$fileInput[0]); $palname = $split[0]; # Get the color name prefix my @split = split('\t',$fileInput[1]); $palPrefix = $split[0]; my @split = split(' ',$palPrefix); if ($split[0] eq "PANTONE") { $palPrefix = "PANTONE " } # Get the palette GUID my @split = split('\t',$fileInput[2]); $palGuid = $split[0]; my @split = split('-',$palGuid); if ($split[4] eq "") { $palGuid = "place GUID here e.g. 54259aaa-a0c2-4133-b85b-4eca414c7dae" } # Get the process/spot specification my @split = split('\t',$fileInput[3]); $palIsSpot = $split[0]; if (($palIsSpot ne "Process") and ($palIsSpot ne "Spot")) { $palIsSpot = "Spot" } print $palname."\n"; print $palIsSpot." palette\n"; #Remove the rest of the header shift @fileInput; shift @fileInput; shift @fileInput; shift @fileInput; shift @fileInput; shift @fileInput; # Determine which columns are available my @splitHeader = map { s/\s+$//; s/^\s+//; $_; } split('\t',$fileInput[0]); $indexOnPageColumn = -1; $pageNumColumn = -1; $colorIDColumn = -1; $colourSpaceNameColumn = -1; $colourNameColumn = -1; $LABColumn = -1; $CMYKColumn = -1; $RGBColumn = -1; $sRGBColumn = -1; $adobeRGBColumn = -1; $columnIndex=-1; # Detect what data is available while ($columnIndex ne scalar(@splitHeader)) { # The IndexOnPage data determines where on the swatchbook page the color appears if (($splitHeader[$columnIndex] eq "IndexOnPage") or ($splitHeader[$columnIndex] eq "Row")) { print "Detected IndexOnPage data\n"; $indexOnPageColumn = $columnIndex; } # If there is Page data given, it is used as the swatchbook page number if ($splitHeader[$columnIndex] eq "Page") { print "Detected Page number data\n"; $pageNumColumn = $columnIndex; } if ($splitHeader[$columnIndex] eq "Column") { $pageNumColumn = $columnIndex; } # The ColorSpaceID is a unique ID for each color if (($splitHeader[$columnIndex] eq "ColorSpaceID") or ($splitHeader[$columnIndex] eq "Book Order")) { print "Detected ColorSpaceID data\n"; $colorIDColumn = $columnIndex; } # The ColorSpaceName is a unique color space name for each color if (($splitHeader[$columnIndex] eq "ColorSpaceName") or ($splitHeader[$columnIndex] eq "PANTONE Color") or ($splitHeader[$columnIndex] eq "Pantone Color")) { print "Detected ColorSpaceName data\n"; $colourSpaceNameColumn = $columnIndex; } # The DescriptiveName is the visible name used, otherwise the color space name is used if (($splitHeader[$columnIndex] eq "DescriptiveName") or ($splitHeader[$columnIndex] eq "PANTONE Name")) { print "Detected DescriptiveName data\n"; $colourNameColumn = $columnIndex; } # Look for the beginning of the CMYK data if (($splitHeader[$columnIndex] eq "C") and ($CMYKColumn eq "-1")) { print "Detected CMYK data\n"; $CMYKColumn = $columnIndex; } # Look for the beginning of the LAB data if (($splitHeader[$columnIndex] eq "L*") and ($LABColumn eq "-1")) { print "Detected LAB data\n"; $LABColumn = $columnIndex; } # Look for the beginning of the RGB data if (($splitHeader[$columnIndex] eq "R") and ($RGBColumn eq "-1")) { print "Detected RGB data\n"; $RGBColumn = $columnIndex; } # Look for the beginning of the sRGB data if ((($splitHeader[$columnIndex] eq "sR-100") or ($splitHeader[$columnIndex] eq "sR %")) and ($sRGBColumn eq "-1")) { print "Detected sRGB-100 data\n"; $sRGBColumn = $columnIndex; } # Look for the beginning of the adobeRGB data if (($splitHeader[$columnIndex] eq "aR %") and ($adobeRGBColumn eq "-1")) { print "Detected Adobe RGB data\n"; $adobeRGBColumn = $columnIndex; } $columnIndex += 1; } if ($colourNameColumn eq -1) { $colourNameColumn = $colourSpaceNameColumn; } # Validate the columns die "CreatePaletteXmlFromTxt: error: missing IndexOnPage data\n" if($indexOnPageColumn eq -1); die "CreatePaletteXmlFromTxt: error: missing ColorID data\n" if($colorIDColumn eq 0); die "CreatePaletteXmlFromTxt: error: missing ColorSpaceName data\n" if($colourSpaceNameColumn eq 0); shift @fileInput; ################################################################ # # Step 3: Write out the xml file. # ################################################################ use utf8; open(OUTFILE, ">:utf8", $outfile) or die "CreatePaletteXmlFromTxt: error: couldn't open '$outfile' for output\n"; print OUTFILE "\n"; print OUTFILE "\n"; # Colour spaces print OUTFILE " \n"; foreach(@fileInput) { $color = parse_color($indexOnPageColumn, $pageNumColumn, $colorIDColumn, $colourSpaceNameColumn, $colourNameColumn, $LABColumn, $CMYKColumn, $RGBColumn, $sRGBColumn, $adobeRGBColumn, $_); if ($palIsSpot eq "Spot") { print OUTFILE " {colourSpace}."\" fixedID=\"".$color->{colorID}."\" version=\"1500\">\n"; } else { print OUTFILE " {colourSpace}."\" fixedID=\"".$color->{colorID}."\" version=\"1500\" process=\"true\">\n"; } if ($CMYKColumn ne -1) { print OUTFILE " {C}.",".$color->{M}.",".$color->{Y}.",".$color->{K}."\"/>\n"; } if ($LABColumn ne -1) { print OUTFILE " {L}.",".$color->{a}.",".$color->{b}."\"/>\n"; } if ($RGBColumn ne -1) { print OUTFILE " {R}.",".$color->{G}.",".$color->{B}."\"/>\n"; } if ($sRGBColumn ne -1) { print OUTFILE " {sR}.",".$color->{sG}.",".$color->{sB}."\"/>\n"; } if ($adobeRGBColumn ne -1) { print OUTFILE " {aR}.",".$color->{aG}.",".$color->{aB}."\"/>\n"; } print OUTFILE " \n"; } print OUTFILE " \n"; # Colours print OUTFILE " \n"; print OUTFILE " \n"; $currentPage = 1; foreach(@fileInput) { $color = parse_color($indexOnPageColumn, $pageNumColumn, $colorIDColumn, $colourSpaceNameColumn, $colourNameColumn, $LABColumn, $CMYKColumn, $RGBColumn, $sRGBColumn, $adobeRGBColumn, $_); if ($currentPage != $color->{page}) { $currentPage = $color->{page}; print OUTFILE " \n"; print OUTFILE " \n"; } print OUTFILE " {name}."\" cs=\"".$color->{colourSpace}."\" tints=\"1\"/>\n"; } print OUTFILE " \n"; print OUTFILE " \n"; print OUTFILE "\n"; close OUTFILE; print "Palette converted. ".scalar(@fileInput)." colours\n";