# Prompt: # # write me a python function called markup that replicates a subset of the rich python library coloring features. i basically want these tests to pass: # # tests = [ # "[green bold italic]Hi[/] [bright_black]Bye[/]", # "[green]Hello[/] [bold]World[/]", # "[italic red]Test[/]", # "[red bold][Hello][/]", # "[black on red bold] MISSING [/]" # ] # # it should return a marked up ansi string # # handle this edge case: # # "[red bold][Hello[/]", # # output should be [Hello in red bold # # also handle this case: # # "[black on red bold] MISSING [/]" # # in the output, the background should be red, foreground should be black and the text should be bold def markup(s): style_codes = { 'bold': '1', 'italic': '3', 'underline': '4', } fg_color_codes = { 'black': '30', 'red': '31', 'green': '32', 'yellow': '33', 'blue': '34', 'magenta': '35', 'cyan': '36', 'white': '37', 'bright_black': '90', 'bright_red': '91', 'bright_green': '92', 'bright_yellow': '93', 'bright_blue': '94', 'bright_magenta': '95', 'bright_cyan': '96', 'bright_white': '97', } bg_color_codes = { 'black': '40', 'red': '41', 'green': '42', 'yellow': '43', 'blue': '44', 'magenta': '45', 'cyan': '46', 'white': '47', 'bright_black': '100', 'bright_red': '101', 'bright_green': '102', 'bright_yellow': '103', 'bright_blue': '104', 'bright_magenta': '105', 'bright_cyan': '106', 'bright_white': '107', } result = '' i = 0 length = len(s) while i < length: if s[i] == '[': if i + 1 < length and s[i + 1] != '/': # Potential opening tag i_end = s.find(']', i + 1) if i_end == -1: # No closing ']', treat as literal '[' result += s[i] i += 1 continue # Extract styles styles_str = s[i + 1:i_end] styles = styles_str.strip().split() codes = [] valid_tag = False idx = 0 while idx < len(styles): style = styles[idx] if style == 'on': idx += 1 if idx < len(styles): bg_color = styles[idx] if bg_color in bg_color_codes: codes.append(bg_color_codes[bg_color]) valid_tag = True else: # Invalid background color, ignore pass else: # 'on' at end with no color, ignore pass elif style in style_codes: codes.append(style_codes[style]) valid_tag = True elif style in fg_color_codes: codes.append(fg_color_codes[style]) valid_tag = True else: # Unknown style, ignore pass idx += 1 if valid_tag: escape_sequence = '\033[' + ';'.join(codes) + 'm' result += escape_sequence i = i_end + 1 else: # Not a valid tag, treat '[' as literal result += s[i] i += 1 elif i + 1 < length and s[i + 1] == '/': # Closing tag if i + 2 < length and s[i + 2] == ']': # Valid closing tag result += '\033[0m' i += 3 else: # Invalid closing tag, treat as literal '[' result += s[i] i += 1 else: # Invalid tag or standalone '[', treat as literal result += s[i] i += 1 else: # Regular character result += s[i] i += 1 return result if __name__ == "__main__": tests = [ "[green bold italic]Hi[/] [bright_black]Bye[/]", "[green]Hello[/] [bold]World[/]", "[italic red]Test[/]", "[red bold][Hello][/]", "[black on red bold] MISSING [/] [blue]What is wrong?[/] [yellow]Nothing...[/]" ] for test in tests: result = markup(test) print("\nINPUT :", test) print("RAW :", repr(result)) print("FORMATTED :", result)