summaryrefslogtreecommitdiff
path: root/color-converter.py
blob: 0dfae00068eb9a0bacd7711f749d6f03cfe7d4b9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
import sys
import argparse

TYPES = ['hex', 'rgb', 'hsl', 'cmyk']
HEX_LETTERS = ['a', 'b', 'c', 'd', 'e', 'f']

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('--hex', action='store_true', help='convert from hex (accepted formats: [ffffff] or ["#ffffff"])')
    parser.add_argument('--rgb', action='store_true', help='convert from RGB (accepted formats: [R G B], [\"rgb(R, G, B)\"], and [\"rgb(R,G,B)\"])')
    parser.add_argument('color', nargs='*', help='accepts a color in Hex, RGB, CYMK, or HSL and performs format conversions')
    args = parser.parse_args()

    print(args, '\n')

    color = args.color 
    
    if len(color) == 0 :
        print('ERROR: Must enter color code')
        return

    # HANDLE HEX INPUT
    if args.hex :
        color = color[0].strip('#')
        if not validateHex(color) :
            return

        convertFromHex(color)

    # HANDLE RGB INPUT
    if args.rgb :
        # cleanse any non-numerical stuff
        if len(color) == 1 :
            color = color[0].strip('rgb(').strip(')').split(',')
        if not validateRGB(color) :
            return
        
        for i in range(len(color)) :
            color[i] = int(color[i])

        convertFromRGB(color)
        
##
# HEX CONVERSION SECTION
##

# Takes in valid RGB code and converts it to the other formats
def convertFromHex(hexCode) :
    convertToRGB('hex', hexCode)
    # convertToCMYK('hex', code)
    # convertToHSL('hex', code)

def convertToHex(codeFormat, code) :
    hexValue = '#'
    
    if codeFormat == 'rgb' :
        for rgbValue in code :
            hexValue += hex(int(rgbValue / 16)) 
            hexValue += hex(int(rgbValue % 16))
    
    print('HEX: ', hexValue)


##
# RGB CONVERSION SECTION
##

# Takes in valid RGB code and converts it to the other formats
def convertFromRGB(code) :
    convertToHex('rgb', code)
    # convertToCMYK('rgb', code)
    # convertToHSL('rgb', code)

def convertToRGB(codeFormat, code) :
    rgbValue = '' 

    if codeFormat == 'hex' :
        
        tempSum = 0
        i = 0
        while i < 6 :
            tempSum += int(code[i], 16) * 16
            tempSum += int(code[i+1], 16)
            rgbValue += str(tempSum) + ' '
            i = i + 2
            tempSum = 0
    
    print('RGB: ', rgbValue)
##
# INPUT VALIDATION SECTION
##

# Takes in a string. Returns True if valid Hex color code.
def validateHex(value) :
    if len(value) != 6 :
        print('ERROR: Hex value should have 6 digits')
        return False

    for i in range(len(value)):
        if value[i-1].isnumeric() :
            continue
        elif HEX_LETTERS.count(value[i-1]) != 0 :
            continue
        else :
            print('ERROR: Invalid character in hex code')
            return False

    return True


# Takes in a list of numerical strings. Returns True if valid RGB values. 
def validateRGB(values) :
    if len(values) != 3 :
        print('ERROR: Improper number of values (should be 3)')
        return False

    for value in values :
        if not value.strip().isnumeric() :
            print('ERROR: Improper format for RGB value(s)')
            return False
        value = int(value)
        if (value < 0) or (value > 255) :
            print('ERROR: Each RBG value must be between 0-255')
            return False
    return True

# Takes in a decimal number and converts it to hexadecimal
def hex(number) :
    number = int(number)
    if number > 16 :
        print("ERROR: Decimal to Hexidecimal conversion failed")
        return "ERROR: Decimal to Hexidecimal conversion failed" 
    if number < 10 :
        return str(number)
    return HEX_LETTERS[number % 10]



if __name__ == '__main__' :
    main()