# ------------------------------------------------------------------------------ # Interface and some basic functionality for all printers. # ------------------------------------------------------------------------------ class Printer: var _format_enabled = true var _disabled = false var _printer_name = "NOT SET" var _show_name = false # used for debugging, set manually func get_format_enabled(): return _format_enabled func set_format_enabled(format_enabled): _format_enabled = format_enabled func send(text, fmt = null): if _disabled: return var formatted = text if fmt != null and _format_enabled: formatted = format_text(text, fmt) if _show_name: formatted = str("(", _printer_name, ")") + formatted _output(formatted) func get_disabled(): return _disabled func set_disabled(disabled): _disabled = disabled # -------------------- # Virtual Methods (some have some default behavior) # -------------------- func _output(text): pass func format_text(text, fmt): return text # ------------------------------------------------------------------------------ # Responsible for sending text to a GUT gui. # ------------------------------------------------------------------------------ class GutGuiPrinter: extends Printer var _textbox = null var _colors = {red = Color.RED, yellow = Color.YELLOW, green = Color.GREEN} func _init(): _printer_name = "gui" func _wrap_with_tag(text, tag): return str("[", tag, "]", text, "[/", tag, "]") func _color_text(text, c_word): return "[color=" + c_word + "]" + text + "[/color]" # Remember, we have to use push and pop because the output from the tests # can contain [] in it which can mess up the formatting. There is no way # as of 3.4 that you can get the bbcode out of RTL when using push and pop. # # The only way we could get around this is by adding in non-printable # whitespace after each "[" that is in the text. Then we could maybe do # this another way and still be able to get the bbcode out, or generate it # at the same time in a buffer (like we tried that one time). # # Since RTL doesn't have good search and selection methods, and those are # really handy in the editor, it isn't worth making bbcode that can be used # there as well. # # You'll try to get it so the colors can be the same in the editor as they # are in the output. Good luck, and I hope I typed enough to not go too # far that rabbit hole before finding out it's not worth it. func format_text(text, fmt): if _textbox == null: return if fmt == "bold": _textbox.push_bold() elif fmt == "underline": _textbox.push_underline() elif _colors.has(fmt): _textbox.push_color(_colors[fmt]) else: # just pushing something to pop. _textbox.push_normal() _textbox.add_text(text) _textbox.pop() return "" func _output(text): if _textbox == null: return _textbox.add_text(text) func get_textbox(): return _textbox func set_textbox(textbox): _textbox = textbox # This can be very very slow when the box has a lot of text. func clear_line(): _textbox.remove_line(_textbox.get_line_count() - 1) _textbox.queue_redraw() func get_bbcode(): return _textbox.text func get_disabled(): return _disabled and _textbox != null # ------------------------------------------------------------------------------ # This AND TerminalPrinter should not be enabled at the same time since it will # result in duplicate output. printraw does not print to the console so i had # to make another one. # ------------------------------------------------------------------------------ class ConsolePrinter: extends Printer var _buffer = "" func _init(): _printer_name = "console" # suppresses output until it encounters a newline to keep things # inline as much as possible. func _output(text): if text.ends_with("\n"): print(_buffer + text.left(text.length() - 1)) _buffer = "" else: _buffer += text # ------------------------------------------------------------------------------ # Prints text to terminal, formats some words. # ------------------------------------------------------------------------------ class TerminalPrinter: extends Printer var escape = PackedByteArray([0x1b]).get_string_from_ascii() var cmd_colors = { red = escape + "[31m", yellow = escape + "[33m", green = escape + "[32m", underline = escape + "[4m", bold = escape + "[1m", default = escape + "[0m", clear_line = escape + "[2K" } func _init(): _printer_name = "terminal" func _output(text): # Note, printraw does not print to the console. printraw(text) func format_text(text, fmt): return cmd_colors[fmt] + text + cmd_colors.default func clear_line(): send(cmd_colors.clear_line) func back(n): send(escape + str("[", n, "D")) func forward(n): send(escape + str("[", n, "C"))