Implement color objects
This commit is contained in:
parent
03518abdcd
commit
1b31a6f044
199
src/wireviz/wv_colors_new.py
Normal file
199
src/wireviz/wv_colors_new.py
Normal file
@ -0,0 +1,199 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from collections import namedtuple
|
||||||
|
from dataclasses import dataclass, field
|
||||||
|
from enum import Enum
|
||||||
|
from typing import List
|
||||||
|
|
||||||
|
KnownColor = namedtuple("KnownColor", "html code_de full_en full_de")
|
||||||
|
ColorOutputMode = Enum("ColorOutputMode", "EN_LOWER EN_UPPER DE_LOWER DE_UPPER HTML_LOWER HTML_UPPER")
|
||||||
|
|
||||||
|
known_colors = {
|
||||||
|
"BK": KnownColor("#000000", "sw", "black", "schwarz"),
|
||||||
|
"WH": KnownColor("#ffffff", "ws", "white", "weiß"),
|
||||||
|
"GY": KnownColor("#999999", "gr", "grey", "grau"),
|
||||||
|
"PK": KnownColor("#ff66cc", "rs", "pink", "rosa"),
|
||||||
|
"RD": KnownColor("#ff0000", "rt", "red", "rot"),
|
||||||
|
"OG": KnownColor("#ff8000", "or", "orange", "orange"),
|
||||||
|
"YE": KnownColor("#ffff00", "ge", "yellow", "gelb"),
|
||||||
|
"OL": KnownColor("#708000", "ol", "olive green", "olivgrün"),
|
||||||
|
"GN": KnownColor("#00ff00", "gn", "green", "grün"),
|
||||||
|
"TQ": KnownColor("#00ffff", "tk", "turquoise", "türkis"),
|
||||||
|
"LB": KnownColor("#a0dfff", "hb", "light blue", "hellblau"),
|
||||||
|
"BU": KnownColor("#0066ff", "bl", "blue", "blau"),
|
||||||
|
"VT": KnownColor("#8000ff", "vi", "violet", "violett"),
|
||||||
|
"BN": KnownColor("#895956", "br", "brown", "braun"),
|
||||||
|
"BG": KnownColor("#ceb673", "bg", "beige", "beige"),
|
||||||
|
"IV": KnownColor("#f5f0d0", "eb", "ivory", "elfenbein"),
|
||||||
|
"SL": KnownColor("#708090", "si", "slate", "schiefer"),
|
||||||
|
"CU": KnownColor("#d6775e", "ku", "copper", "Kupfer"),
|
||||||
|
"SN": KnownColor("#aaaaaa", "vz", "tin", "verzinkt"),
|
||||||
|
"SR": KnownColor("#84878c", "ag", "silver", "Silber"),
|
||||||
|
"GD": KnownColor("#ffcf80", "au", "gold", "Gold"),
|
||||||
|
}
|
||||||
|
|
||||||
|
color_output_mode = ColorOutputMode.EN_UPPER
|
||||||
|
padding_amount = 1
|
||||||
|
|
||||||
|
def convert_case(inp):
|
||||||
|
if "_LOWER" in color_output_mode.name:
|
||||||
|
return inp.lower()
|
||||||
|
elif "_UPPER" in color_output_mode.name:
|
||||||
|
return inp.upper()
|
||||||
|
else: # currently not used
|
||||||
|
return inp
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class SingleColor():
|
||||||
|
_code_en: str
|
||||||
|
_code_de: str
|
||||||
|
_html: str
|
||||||
|
|
||||||
|
@property
|
||||||
|
def code_en(self):
|
||||||
|
return convert_case(self._code_en)
|
||||||
|
# repeat for _code_de, _html
|
||||||
|
|
||||||
|
@property
|
||||||
|
def code_de(self):
|
||||||
|
return convert_case(self._code_de)
|
||||||
|
# repeat for _code_de, _html
|
||||||
|
|
||||||
|
@property
|
||||||
|
def html(self):
|
||||||
|
return convert_case(self._html)
|
||||||
|
# repeat for _code_de, _html
|
||||||
|
|
||||||
|
@property
|
||||||
|
def known(self):
|
||||||
|
return self.code_en.upper() in known_colors.keys()
|
||||||
|
|
||||||
|
def __init__(self, inp):
|
||||||
|
if isinstance(inp, int):
|
||||||
|
hex_str = f"#{inp:06x}"
|
||||||
|
self._html = hex_str
|
||||||
|
self._code_en = hex_str # do not perform reverse lookup
|
||||||
|
self._code_de = hex_str
|
||||||
|
elif inp.upper() in known_colors.keys():
|
||||||
|
inp_upper = inp.upper()
|
||||||
|
self._code_en = inp_upper
|
||||||
|
self._code_de = known_colors[inp_upper].code_de
|
||||||
|
self._html = known_colors[inp_upper].html
|
||||||
|
else: # assume valid HTML color
|
||||||
|
self._html = inp
|
||||||
|
self._code_en = inp
|
||||||
|
self._code_de = inp
|
||||||
|
|
||||||
|
@property
|
||||||
|
def html_padded(self):
|
||||||
|
return ":".join([self.html] * padding_amount)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
if self.known and "EN_" in color_output_mode.name:
|
||||||
|
return self.code_en
|
||||||
|
elif self.known and "DE_" in color_output_mode.name:
|
||||||
|
return self.code_de
|
||||||
|
else:
|
||||||
|
return self.html
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class MultiColor():
|
||||||
|
colors: List[SingleColor] = field(default_factory=list)
|
||||||
|
|
||||||
|
def __init__(self, inp):
|
||||||
|
self.colors = []
|
||||||
|
if isinstance(inp, List): # input is already a list
|
||||||
|
for item in inp:
|
||||||
|
if isinstance(item, SingleColor):
|
||||||
|
self.colors.append(item)
|
||||||
|
else: # string
|
||||||
|
self.colors.append(SingleColor(item))
|
||||||
|
elif isinstance(inp, SingleColor): # single color
|
||||||
|
self.colors = [inp]
|
||||||
|
else: # split input into list
|
||||||
|
if ":" in str(inp):
|
||||||
|
self.colors = [SingleColor(item) for item in inp.split(":")]
|
||||||
|
else:
|
||||||
|
if isinstance(inp, int):
|
||||||
|
self.colors = [SingleColor(inp)]
|
||||||
|
elif len(inp) % 2 == 0:
|
||||||
|
items = [inp[i:i+2] for i in range(0, len(inp), 2)]
|
||||||
|
known = [item.upper() in known_colors.keys() for item in items]
|
||||||
|
if all(known):
|
||||||
|
self.colors = [SingleColor(item) for item in items]
|
||||||
|
else: # assume it's a HTML color name
|
||||||
|
self.colors = [SingleColor(inp)]
|
||||||
|
else: # assume it's a HTML color name
|
||||||
|
self.colors = [SingleColor(inp)]
|
||||||
|
|
||||||
|
|
||||||
|
def __len__(self):
|
||||||
|
return len(self.colors)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
if "EN_" in color_output_mode.name or "DE_" in color_output_mode.name:
|
||||||
|
joiner = "" if self.all_known else ":"
|
||||||
|
elif "HTML_" in color_output_mode.name:
|
||||||
|
joiner = ":"
|
||||||
|
else:
|
||||||
|
joiner = "???"
|
||||||
|
return joiner.join([str(color) for color in self.colors])
|
||||||
|
|
||||||
|
@property
|
||||||
|
def all_known(self):
|
||||||
|
return all([color.known for color in self.colors])
|
||||||
|
|
||||||
|
@property
|
||||||
|
def html(self):
|
||||||
|
return ":".join([color.html for color in self.colors])
|
||||||
|
|
||||||
|
@property
|
||||||
|
def html_padded(self):
|
||||||
|
if len(self) == 0:
|
||||||
|
out = []
|
||||||
|
elif len(self) == 1:
|
||||||
|
out = [self.colors[0] for i in range(3)]
|
||||||
|
elif len(self) == 2:
|
||||||
|
out = [self.colors[0], self.colors[1], self.colors[0]]
|
||||||
|
elif len(self) == 3:
|
||||||
|
out = self.colors
|
||||||
|
else:
|
||||||
|
raise Exception(f"Padding not supported for len {len(selfq)}")
|
||||||
|
return ":".join([str(color) for color in out])
|
||||||
|
|
||||||
|
COLOR_CODES = {
|
||||||
|
# fmt: off
|
||||||
|
"DIN": [
|
||||||
|
"WH", "BN", "GN", "YE", "GY", "PK", "BU", "RD", "BK", "VT", "GYPK", "RDBU",
|
||||||
|
"WHGN", "BNGN", "WHYE", "YEBN", "WHGY", "GYBN", "WHPK", "PKBN", "WHBU", "BNBU",
|
||||||
|
"WHRD", "BNRD", "WHBK", "BNBK", "GYGN", "YEGY", "PKGN", "YEPK", "GNBU", "YEBU",
|
||||||
|
"GNRD", "YERD", "GNBK", "YEBK", "GYBU", "PKBU", "GYRD", "PKRD", "GYBK", "PKBK",
|
||||||
|
"BUBK", "RDBK", "WHBNBK", "YEGNBK", "GYPKBK", "RDBUBK", "WHGNBK", "BNGNBK",
|
||||||
|
"WHYEBK", "YEBNBK", "WHGYBK", "GYBNBK", "WHPKBK", "PKBNBK", "WHBUBK",
|
||||||
|
"BNBUBK", "WHRDBK", "BNRDBK",
|
||||||
|
],
|
||||||
|
# fmt: on
|
||||||
|
"IEC": ["BN", "RD", "OG", "YE", "GN", "BU", "VT", "GY", "WH", "BK"],
|
||||||
|
"BW": ["BK", "WH"],
|
||||||
|
# 25-pair color code - see also https://en.wikipedia.org/wiki/25-pair_color_code
|
||||||
|
# 5 major colors (WH,RD,BK,YE,VT) combined with 5 minor colors (BU,OG,GN,BN,SL).
|
||||||
|
# Each POTS pair tip (+) had major/minor color, and ring (-) had minor/major color.
|
||||||
|
# fmt: off
|
||||||
|
"TEL": [ # 25x2: Ring and then tip of each pair
|
||||||
|
"BUWH", "WHBU", "OGWH", "WHOG", "GNWH", "WHGN", "BNWH", "WHBN", "SLWH", "WHSL",
|
||||||
|
"BURD", "RDBU", "OGRD", "RDOG", "GNRD", "RDGN", "BNRD", "RDBN", "SLRD", "RDSL",
|
||||||
|
"BUBK", "BKBU", "OGBK", "BKOG", "GNBK", "BKGN", "BNBK", "BKBN", "SLBK", "BKSL",
|
||||||
|
"BUYE", "YEBU", "OGYE", "YEOG", "GNYE", "YEGN", "BNYE", "YEBN", "SLYE", "YESL",
|
||||||
|
"BUVT", "VTBU", "OGVT", "VTOG", "GNVT", "VTGN", "BNVT", "VTBN", "SLVT", "VTSL",
|
||||||
|
],
|
||||||
|
"TELALT": [ # 25x2: Tip and then ring of each pair
|
||||||
|
"WHBU", "BU", "WHOG", "OG", "WHGN", "GN", "WHBN", "BN", "WHSL", "SL",
|
||||||
|
"RDBU", "BURD", "RDOG", "OGRD", "RDGN", "GNRD", "RDBN", "BNRD", "RDSL", "SLRD",
|
||||||
|
"BKBU", "BUBK", "BKOG", "OGBK", "BKGN", "GNBK", "BKBN", "BNBK", "BKSL", "SLBK",
|
||||||
|
"YEBU", "BUYE", "YEOG", "OGYE", "YEGN", "GNYE", "YEBN", "BNYE", "YESL", "SLYE",
|
||||||
|
"VTBU", "BUVT", "VTOG", "OGVT", "VTGN", "GNVT", "VTBN", "BNVT", "VTSL", "SLVT",
|
||||||
|
],
|
||||||
|
# fmt: on
|
||||||
|
"T568A": ["WHGN", "GN", "WHOG", "BU", "WHBU", "OG", "WHBN", "BN"],
|
||||||
|
"T568B": ["WHOG", "OG", "WHGN", "BU", "WHBU", "GN", "WHBN", "BN"],
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user