Initital input line color handling.
This commit is contained in:
parent
f6e72c09c6
commit
af5d7a19c4
1 changed files with 327 additions and 2 deletions
|
@ -516,6 +516,327 @@ class MatrixServer:
|
||||||
"", "server_config_change_cb", self.name, "", "")
|
"", "server_config_change_cb", self.name, "", "")
|
||||||
|
|
||||||
|
|
||||||
|
FormatedString = namedtuple(
|
||||||
|
'FormatedString',
|
||||||
|
['text', 'attributes'],
|
||||||
|
verbose=True
|
||||||
|
)
|
||||||
|
|
||||||
|
Default_format_attributes = {
|
||||||
|
"bold": False,
|
||||||
|
"italic": False,
|
||||||
|
"underline": False,
|
||||||
|
"fgcolor": None,
|
||||||
|
"bgcolor": None
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def line_color_to_sgr(color_string):
|
||||||
|
# type: (str) -> str
|
||||||
|
line_colors = {
|
||||||
|
"0": "white",
|
||||||
|
"1": "black",
|
||||||
|
"2": "blue",
|
||||||
|
"3": "green",
|
||||||
|
"4": "lightred",
|
||||||
|
"5": "red",
|
||||||
|
"6": "magenta",
|
||||||
|
"7": "brown",
|
||||||
|
"8": "yellow",
|
||||||
|
"9": "lightgreen",
|
||||||
|
"10": "cyan",
|
||||||
|
"11": "lightcyan",
|
||||||
|
"12": "lightblue",
|
||||||
|
"13": "lightmagenta",
|
||||||
|
"14": "darkgray",
|
||||||
|
"15": "gray",
|
||||||
|
"16": "52",
|
||||||
|
"17": "94",
|
||||||
|
"18": "100",
|
||||||
|
"19": "58",
|
||||||
|
"20": "22",
|
||||||
|
"21": "29",
|
||||||
|
"22": "23",
|
||||||
|
"23": "24",
|
||||||
|
"24": "17",
|
||||||
|
"25": "54",
|
||||||
|
"26": "53",
|
||||||
|
"27": "89",
|
||||||
|
"28": "88",
|
||||||
|
"29": "130",
|
||||||
|
"30": "142",
|
||||||
|
"31": "64",
|
||||||
|
"32": "28",
|
||||||
|
"33": "35",
|
||||||
|
"34": "30",
|
||||||
|
"35": "25",
|
||||||
|
"36": "18",
|
||||||
|
"37": "91",
|
||||||
|
"38": "90",
|
||||||
|
"39": "125",
|
||||||
|
"40": "124",
|
||||||
|
"41": "166",
|
||||||
|
"42": "184",
|
||||||
|
"43": "106",
|
||||||
|
"44": "34",
|
||||||
|
"45": "49",
|
||||||
|
"46": "37",
|
||||||
|
"47": "33",
|
||||||
|
"48": "19",
|
||||||
|
"49": "129",
|
||||||
|
"50": "127",
|
||||||
|
"51": "161",
|
||||||
|
"52": "196",
|
||||||
|
"53": "208",
|
||||||
|
"54": "226",
|
||||||
|
"55": "154",
|
||||||
|
"56": "46",
|
||||||
|
"57": "86",
|
||||||
|
"58": "51",
|
||||||
|
"59": "75",
|
||||||
|
"60": "21",
|
||||||
|
"61": "171",
|
||||||
|
"62": "201",
|
||||||
|
"63": "198",
|
||||||
|
"64": "203",
|
||||||
|
"65": "215",
|
||||||
|
"66": "227",
|
||||||
|
"67": "191",
|
||||||
|
"68": "83",
|
||||||
|
"69": "122",
|
||||||
|
"70": "87",
|
||||||
|
"71": "111",
|
||||||
|
"72": "63",
|
||||||
|
"73": "177",
|
||||||
|
"74": "207",
|
||||||
|
"75": "205",
|
||||||
|
"76": "217",
|
||||||
|
"77": "223",
|
||||||
|
"78": "229",
|
||||||
|
"79": "193",
|
||||||
|
"80": "157",
|
||||||
|
"81": "158",
|
||||||
|
"82": "159",
|
||||||
|
"83": "153",
|
||||||
|
"84": "147",
|
||||||
|
"85": "183",
|
||||||
|
"86": "219",
|
||||||
|
"87": "212",
|
||||||
|
"88": "16",
|
||||||
|
"89": "233",
|
||||||
|
"90": "235",
|
||||||
|
"91": "237",
|
||||||
|
"92": "239",
|
||||||
|
"93": "241",
|
||||||
|
"94": "244",
|
||||||
|
"95": "247",
|
||||||
|
"96": "250",
|
||||||
|
"97": "254",
|
||||||
|
"98": "231",
|
||||||
|
"99": "default"
|
||||||
|
}
|
||||||
|
|
||||||
|
assert color_string in line_colors
|
||||||
|
|
||||||
|
return line_colors[color_string]
|
||||||
|
|
||||||
|
|
||||||
|
def html_color_to_sgr(color):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def sgr_to_rgb(color):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
# TODO reverse video
|
||||||
|
def parse_input_line(line):
|
||||||
|
"""Parses the weechat input line and produces formated strings that can be
|
||||||
|
later converted to HTML or to a string for weechat's print functions
|
||||||
|
"""
|
||||||
|
# type: (str) -> List[FormatedString]
|
||||||
|
text = "" # type: str
|
||||||
|
substrings = [] # type: List[FormatedString]
|
||||||
|
attributes = Default_format_attributes.copy()
|
||||||
|
|
||||||
|
i = 0
|
||||||
|
while i < len(line):
|
||||||
|
# Bold
|
||||||
|
if line[i] == "\x02":
|
||||||
|
if text:
|
||||||
|
substrings.append(FormatedString(text, attributes.copy()))
|
||||||
|
text = ""
|
||||||
|
attributes["bold"] = not attributes["bold"]
|
||||||
|
i = i + 1
|
||||||
|
|
||||||
|
# Color
|
||||||
|
elif line[i] == "\x03":
|
||||||
|
if text:
|
||||||
|
substrings.append(FormatedString(text, attributes.copy()))
|
||||||
|
text = ""
|
||||||
|
i = i + 1
|
||||||
|
|
||||||
|
# check if it's a valid color, add it to the attributes
|
||||||
|
if line[i].isdigit():
|
||||||
|
color_string = line[i]
|
||||||
|
i = i + 1
|
||||||
|
|
||||||
|
if line[i].isdigit():
|
||||||
|
if color_string == "0":
|
||||||
|
color_string = line[i]
|
||||||
|
else:
|
||||||
|
color_string = color_string + line[i]
|
||||||
|
i = i + 1
|
||||||
|
|
||||||
|
attributes["fgcolor"] = line_color_to_sgr(color_string)
|
||||||
|
else:
|
||||||
|
attributes["fgcolor"] = None
|
||||||
|
|
||||||
|
# check if we have a background color
|
||||||
|
if line[i] == "," and line[i+1].isdigit():
|
||||||
|
color_string = line[i+1]
|
||||||
|
i = i + 2
|
||||||
|
|
||||||
|
if line[i].isdigit():
|
||||||
|
if color_string == "0":
|
||||||
|
color_string = line[i]
|
||||||
|
else:
|
||||||
|
color_string = color_string + line[i]
|
||||||
|
i = i + 1
|
||||||
|
|
||||||
|
attributes["bgcolor"] = line_color_to_sgr(color_string)
|
||||||
|
else:
|
||||||
|
attributes["bgcolor"] = None
|
||||||
|
# Reset
|
||||||
|
elif line[i] == "\x0F":
|
||||||
|
if text:
|
||||||
|
substrings.append(FormatedString(text, attributes.copy()))
|
||||||
|
text = ""
|
||||||
|
# Reset all the attributes
|
||||||
|
attributes = Default_format_attributes.copy()
|
||||||
|
i = i + 1
|
||||||
|
# Italic
|
||||||
|
elif line[i] == "0\x1D":
|
||||||
|
if text:
|
||||||
|
substrings.append(FormatedString(text, attributes.copy()))
|
||||||
|
text = ""
|
||||||
|
attributes["italic"] = not attributes["italic"]
|
||||||
|
i = i + 1
|
||||||
|
|
||||||
|
# Underline
|
||||||
|
elif line[i] == "0\x1F":
|
||||||
|
if text:
|
||||||
|
substrings.append(FormatedString(text, attributes.copy()))
|
||||||
|
text = ""
|
||||||
|
attributes["underline"] = not attributes["underline"]
|
||||||
|
i = i + 1
|
||||||
|
|
||||||
|
# Normal text
|
||||||
|
else:
|
||||||
|
text = text + line[i]
|
||||||
|
i = i + 1
|
||||||
|
|
||||||
|
substrings.append(FormatedString(text, attributes))
|
||||||
|
return substrings
|
||||||
|
|
||||||
|
|
||||||
|
def formated(strings):
|
||||||
|
for string in strings:
|
||||||
|
if string.attributes != Default_format_attributes:
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def formated_to_weechat(strings):
|
||||||
|
# type: (List[FormatedString]) -> str
|
||||||
|
# TODO BG COLOR
|
||||||
|
def add_attribute(string, name, value):
|
||||||
|
if name == "bold" and value:
|
||||||
|
return "{bold_on}{text}{bold_off}".format(
|
||||||
|
bold_on=W.color("bold"),
|
||||||
|
text=string,
|
||||||
|
bold_off=W.color("-bold"))
|
||||||
|
elif name == "italic" and value:
|
||||||
|
return "{italic_on}{text}{italic_off}".format(
|
||||||
|
italic_on=W.color("italic"),
|
||||||
|
text=string,
|
||||||
|
italic_off=W.color("-italic"))
|
||||||
|
elif name == "underline" and value:
|
||||||
|
return "{underline_on}{text}{underline_off}".format(
|
||||||
|
underline_on=W.color("underline"),
|
||||||
|
text=string,
|
||||||
|
underline_off=W.color("-underline"))
|
||||||
|
elif name == "fgcolor" and value:
|
||||||
|
return "{color_on}{text}{color_off}".format(
|
||||||
|
color_on=W.color(value),
|
||||||
|
text=string,
|
||||||
|
color_off=W.color("resetcolor"))
|
||||||
|
elif name == "bgcolor" and value:
|
||||||
|
return "{color_on}{text}{color_off}".format(
|
||||||
|
color_on=W.color("," + value),
|
||||||
|
text=string,
|
||||||
|
color_off=W.color("resetcolor"))
|
||||||
|
|
||||||
|
return string
|
||||||
|
|
||||||
|
def format_string(formated_string):
|
||||||
|
text = formated_string.text
|
||||||
|
attributes = formated_string.attributes
|
||||||
|
|
||||||
|
for key, value in attributes.items():
|
||||||
|
text = add_attribute(text, key, value)
|
||||||
|
return text
|
||||||
|
|
||||||
|
weechat_strings = map(format_string, strings)
|
||||||
|
return "".join(weechat_strings)
|
||||||
|
|
||||||
|
|
||||||
|
def formated_to_html(strings):
|
||||||
|
# type: (List[FormatedString]) -> str
|
||||||
|
# TODO BG COLOR
|
||||||
|
def add_attribute(string, name, value):
|
||||||
|
if name == "bold" and value:
|
||||||
|
return "{bold_on}{text}{bold_off}".format(
|
||||||
|
bold_on="<strong>",
|
||||||
|
text=string,
|
||||||
|
bold_off="</strong>")
|
||||||
|
elif name == "italic" and value:
|
||||||
|
return "{italic_on}{text}{italic_off}".format(
|
||||||
|
italic_on="<em>",
|
||||||
|
text=string,
|
||||||
|
italic_off="</em>")
|
||||||
|
elif name == "underline" and value:
|
||||||
|
return "{underline_on}{text}{underline_off}".format(
|
||||||
|
underline_on="<u>",
|
||||||
|
text=string,
|
||||||
|
underline_off="</u>")
|
||||||
|
elif name == "fgcolor" and value:
|
||||||
|
return "{underline_on}{text}{underline_off}".format(
|
||||||
|
underline_on="<font color={color}>".format(color=value),
|
||||||
|
text=string,
|
||||||
|
underline_off="</font>")
|
||||||
|
|
||||||
|
return string
|
||||||
|
|
||||||
|
def strip_atribute(string, name, value):
|
||||||
|
return string
|
||||||
|
|
||||||
|
def format_string(formated_string):
|
||||||
|
text = formated_string.text
|
||||||
|
attributes = formated_string.attributes
|
||||||
|
|
||||||
|
for key, value in attributes.items():
|
||||||
|
text = strip_atribute(text, key, value)
|
||||||
|
return text
|
||||||
|
|
||||||
|
html_string = map(format_string, strings)
|
||||||
|
return "".join(html_string)
|
||||||
|
|
||||||
|
|
||||||
|
def html_to_formated():
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
def wrap_socket(server, file_descriptor):
|
def wrap_socket(server, file_descriptor):
|
||||||
# type: (MatrixServer, int) -> socket.socket
|
# type: (MatrixServer, int) -> socket.socket
|
||||||
sock = None # type: socket.socket
|
sock = None # type: socket.socket
|
||||||
|
@ -1613,10 +1934,14 @@ def room_input_cb(server_name, buffer, input_data):
|
||||||
if room.encrypted:
|
if room.encrypted:
|
||||||
return W.WEECHAT_RC_OK
|
return W.WEECHAT_RC_OK
|
||||||
|
|
||||||
body = {"msgtype": "m.text", "body": input_data}
|
# TODO if the input line contains any formating we need to send out a
|
||||||
|
# message of type html
|
||||||
|
formated_data = parse_input_line(input_data)
|
||||||
|
|
||||||
|
body = {"msgtype": "m.text", "body": formated_to_html(formated_data)}
|
||||||
extra_data = {
|
extra_data = {
|
||||||
"author": server.user,
|
"author": server.user,
|
||||||
"message": input_data,
|
"message": formated_to_weechat(formated_data),
|
||||||
"room_id": room_id
|
"room_id": room_id
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue