#!/usr/bin/perl

# Convert a terminal color scheme for 256 color terminals to a GUI color
# scheme by adding the appropriate gui* options.

# Copyright (C) 2012  Simon Ruderich
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.


use strict;
use warnings;


sub xterm2rgb {
    my ($color) = @_;

    # Taken from the urxvt-8.2-256color.patch in Debian's urxvt-unicode
    # package 9.07-2.
    my @colors = (
        'rgb:00/00/00',
        'rgb:00/00/5f',
        'rgb:00/00/87',
        'rgb:00/00/af',
        'rgb:00/00/d7',
        'rgb:00/00/ff',
        'rgb:00/5f/00',
        'rgb:00/5f/5f',
        'rgb:00/5f/87',
        'rgb:00/5f/af',
        'rgb:00/5f/d7',
        'rgb:00/5f/ff',
        'rgb:00/87/00',
        'rgb:00/87/5f',
        'rgb:00/87/87',
        'rgb:00/87/af',
        'rgb:00/87/d7',
        'rgb:00/87/ff',
        'rgb:00/af/00',
        'rgb:00/af/5f',
        'rgb:00/af/87',
        'rgb:00/af/af',
        'rgb:00/af/d7',
        'rgb:00/af/ff',
        'rgb:00/d7/00',
        'rgb:00/d7/5f',
        'rgb:00/d7/87',
        'rgb:00/d7/af',
        'rgb:00/d7/d7',
        'rgb:00/d7/ff',
        'rgb:00/ff/00',
        'rgb:00/ff/5f',
        'rgb:00/ff/87',
        'rgb:00/ff/af',
        'rgb:00/ff/d7',
        'rgb:00/ff/ff',
        'rgb:5f/00/00',
        'rgb:5f/00/5f',
        'rgb:5f/00/87',
        'rgb:5f/00/af',
        'rgb:5f/00/d7',
        'rgb:5f/00/ff',
        'rgb:5f/5f/00',
        'rgb:5f/5f/5f',
        'rgb:5f/5f/87',
        'rgb:5f/5f/af',
        'rgb:5f/5f/d7',
        'rgb:5f/5f/ff',
        'rgb:5f/87/00',
        'rgb:5f/87/5f',
        'rgb:5f/87/87',
        'rgb:5f/87/af',
        'rgb:5f/87/d7',
        'rgb:5f/87/ff',
        'rgb:5f/af/00',
        'rgb:5f/af/5f',
        'rgb:5f/af/87',
        'rgb:5f/af/af',
        'rgb:5f/af/d7',
        'rgb:5f/af/ff',
        'rgb:5f/d7/00',
        'rgb:5f/d7/5f',
        'rgb:5f/d7/87',
        'rgb:5f/d7/af',
        'rgb:5f/d7/d7',
        'rgb:5f/d7/ff',
        'rgb:5f/ff/00',
        'rgb:5f/ff/5f',
        'rgb:5f/ff/87',
        'rgb:5f/ff/af',
        'rgb:5f/ff/d7',
        'rgb:5f/ff/ff',
        'rgb:87/00/00',
        'rgb:87/00/5f',
        'rgb:87/00/87',
        'rgb:87/00/af',
        'rgb:87/00/d7',
        'rgb:87/00/ff',
        'rgb:87/5f/00',
        'rgb:87/5f/5f',
        'rgb:87/5f/87',
        'rgb:87/5f/af',
        'rgb:87/5f/d7',
        'rgb:87/5f/ff',
        'rgb:87/87/00',
        'rgb:87/87/5f',
        'rgb:87/87/87',
        'rgb:87/87/af',
        'rgb:87/87/d7',
        'rgb:87/87/ff',
        'rgb:87/af/00',
        'rgb:87/af/5f',
        'rgb:87/af/87',
        'rgb:87/af/af',
        'rgb:87/af/d7',
        'rgb:87/af/ff',
        'rgb:87/d7/00',
        'rgb:87/d7/5f',
        'rgb:87/d7/87',
        'rgb:87/d7/af',
        'rgb:87/d7/d7',
        'rgb:87/d7/ff',
        'rgb:87/ff/00',
        'rgb:87/ff/5f',
        'rgb:87/ff/87',
        'rgb:87/ff/af',
        'rgb:87/ff/d7',
        'rgb:87/ff/ff',
        'rgb:af/00/00',
        'rgb:af/00/5f',
        'rgb:af/00/87',
        'rgb:af/00/af',
        'rgb:af/00/d7',
        'rgb:af/00/ff',
        'rgb:af/5f/00',
        'rgb:af/5f/5f',
        'rgb:af/5f/87',
        'rgb:af/5f/af',
        'rgb:af/5f/d7',
        'rgb:af/5f/ff',
        'rgb:af/87/00',
        'rgb:af/87/5f',
        'rgb:af/87/87',
        'rgb:af/87/af',
        'rgb:af/87/d7',
        'rgb:af/87/ff',
        'rgb:af/af/00',
        'rgb:af/af/5f',
        'rgb:af/af/87',
        'rgb:af/af/af',
        'rgb:af/af/d7',
        'rgb:af/af/ff',
        'rgb:af/d7/00',
        'rgb:af/d7/5f',
        'rgb:af/d7/87',
        'rgb:af/d7/af',
        'rgb:af/d7/d7',
        'rgb:af/d7/ff',
        'rgb:af/ff/00',
        'rgb:af/ff/5f',
        'rgb:af/ff/87',
        'rgb:af/ff/af',
        'rgb:af/ff/d7',
        'rgb:af/ff/ff',
        'rgb:d7/00/00',
        'rgb:d7/00/5f',
        'rgb:d7/00/87',
        'rgb:d7/00/af',
        'rgb:d7/00/d7',
        'rgb:d7/00/ff',
        'rgb:d7/5f/00',
        'rgb:d7/5f/5f',
        'rgb:d7/5f/87',
        'rgb:d7/5f/af',
        'rgb:d7/5f/d7',
        'rgb:d7/5f/ff',
        'rgb:d7/87/00',
        'rgb:d7/87/5f',
        'rgb:d7/87/87',
        'rgb:d7/87/af',
        'rgb:d7/87/d7',
        'rgb:d7/87/ff',
        'rgb:d7/af/00',
        'rgb:d7/af/5f',
        'rgb:d7/af/87',
        'rgb:d7/af/af',
        'rgb:d7/af/d7',
        'rgb:d7/af/ff',
        'rgb:d7/d7/00',
        'rgb:d7/d7/5f',
        'rgb:d7/d7/87',
        'rgb:d7/d7/af',
        'rgb:d7/d7/d7',
        'rgb:d7/d7/ff',
        'rgb:d7/ff/00',
        'rgb:d7/ff/5f',
        'rgb:d7/ff/87',
        'rgb:d7/ff/af',
        'rgb:d7/ff/d7',
        'rgb:d7/ff/ff',
        'rgb:ff/00/00',
        'rgb:ff/00/5f',
        'rgb:ff/00/87',
        'rgb:ff/00/af',
        'rgb:ff/00/d7',
        'rgb:ff/00/ff',
        'rgb:ff/5f/00',
        'rgb:ff/5f/5f',
        'rgb:ff/5f/87',
        'rgb:ff/5f/af',
        'rgb:ff/5f/d7',
        'rgb:ff/5f/ff',
        'rgb:ff/87/00',
        'rgb:ff/87/5f',
        'rgb:ff/87/87',
        'rgb:ff/87/af',
        'rgb:ff/87/d7',
        'rgb:ff/87/ff',
        'rgb:ff/af/00',
        'rgb:ff/af/5f',
        'rgb:ff/af/87',
        'rgb:ff/af/af',
        'rgb:ff/af/d7',
        'rgb:ff/af/ff',
        'rgb:ff/d7/00',
        'rgb:ff/d7/5f',
        'rgb:ff/d7/87',
        'rgb:ff/d7/af',
        'rgb:ff/d7/d7',
        'rgb:ff/d7/ff',
        'rgb:ff/ff/00',
        'rgb:ff/ff/5f',
        'rgb:ff/ff/87',
        'rgb:ff/ff/af',
        'rgb:ff/ff/d7',
        'rgb:ff/ff/ff',
        'rgb:08/08/08',
        'rgb:12/12/12',
        'rgb:1c/1c/1c',
        'rgb:26/26/26',
        'rgb:30/30/30',
        'rgb:3a/3a/3a',
        'rgb:44/44/44',
        'rgb:4e/4e/4e',
        'rgb:58/58/58',
        'rgb:62/62/62',
        'rgb:6c/6c/6c',
        'rgb:76/76/76',
        'rgb:80/80/80',
        'rgb:8a/8a/8a',
        'rgb:94/94/94',
        'rgb:9e/9e/9e',
        'rgb:a8/a8/a8',
        'rgb:b2/b2/b2',
        'rgb:bc/bc/bc',
        'rgb:c6/c6/c6',
        'rgb:d0/d0/d0',
        'rgb:da/da/da',
        'rgb:e4/e4/e4',
        'rgb:ee/ee/ee',
    );

    return if $color < 16 or $color > 255; # undef

    my $value = $colors[$color - 16];
    $value =~ s{^rgb:}{};
    $value =~ s{/}{}g;

    return '#' . $value;
}


while (<>)) {
    # Only handle lines with highlight commands.
    if (/^\s*\bhi(?:ghlight)?\b/) {
        foreach my $setting (m/\bcterm(?:fg|bg)?=\S+/g) {
            my ($name, $value) = split /=/, $setting;

            my $gui_name = $name;
            $gui_name =~ s/cterm/gui/;

            my $new_value;
            if ($name eq 'cterm') {
                $new_value = $value;
            } elsif ($value eq 'NONE') {
                $new_value = 'NONE';
            } else {
                $new_value = xterm2rgb($value);
            }

            # Update existing value.
            if (/\b\Q$gui_name\E=/) {
                s/\Q$gui_name\E=\S+/$gui_name=$new_value/;
            # Append at the end of the line.
            } else {
                s/\n/ $gui_name=$new_value\n/;
            }
        }
    }

    print;
}
