27def _ansi_tokenize(ansi_text: str) -> Iterable[_AnsiToken]:
28 """Tokenize a string in to plain text and ANSI codes.
29
30 Args:
31 ansi_text (str): A String containing ANSI codes.
32
33 Yields:
34 AnsiToken: A named tuple of (plain, sgr, osc)
35 """
36
37 position = 0
38 sgr: Optional[str]
39 osc: Optional[str]
43 if start > position:
44 yield _AnsiToken(ansi_text[position:start])
45 if sgr:
46 if sgr == "(":
47 position = end + 1
48 continue
50 yield _AnsiToken("", sgr[1:-1], osc)
51 else:
52 yield _AnsiToken("", sgr, osc)
53 position = end
54 if position <
len(ansi_text):
55 yield _AnsiToken(ansi_text[position:])
56
57