4from typing
import Callable, Iterable, List, Match, NamedTuple, Optional, Tuple, Union
70def _parse(markup: str) -> Iterable[Tuple[int, Optional[str], Optional[Tag]]]:
71 """Parse markup in to an iterable of tuples of (position, text, tag).
74 markup (str): A string containing console markup
84 yield start, markup[position:start],
None
86 backslashes, escaped =
_divmod(
len(escapes), 2)
89 yield start,
"\\" * backslashes,
None
90 start += backslashes * 2
93 yield start, full_text[
len(escapes) :],
None
97 yield start,
None,
_Tag(text, parameters
if equals
else None)
99 if position <
len(markup):
100 yield position, markup[position:],
None
105 style: Union[str, Style] =
"",
107 emoji_variant: Optional[EmojiVariant] =
None,
109 """Render console markup in to a Text instance.
112 markup (str): A string containing console markup.
113 emoji (bool, optional): Also render emoji code. Defaults to True.
116 MarkupError: If there is a syntax error in the markup.
119 Text: A test instance.
121 emoji_replace = _emoji_replace
122 if "[" not in markup:
124 emoji_replace(markup, default_variant=emoji_variant)
if emoji
else markup,
127 text =
Text(style=style)
131 style_stack: List[Tuple[int, Tag]] = []
134 spans: List[Span] = []
140 def pop_style(style_name: str) -> Tuple[int, Tag]:
141 """Pop tag matching given style name."""
147 for position, plain_text, tag
in _parse(markup):
148 if plain_text
is not None:
152 elif tag
is not None:
157 style_name = normalize(style_name)
162 f
"closing tag '{tag.markup}' at position {position} doesn't match any open tag"
166 start, open_tag = pop()
169 f
"closing tag '[/]' at position {position} has nothing to close"
177 if handler_match
is not None:
180 "()" if match_parameters
is None else match_parameters
184 meta_params = literal_eval(parameters)
185 except SyntaxError
as error:
187 f
"error parsing {parameters!r} in {open_tag.parameters!r}; {error.msg}"
189 except Exception
as error:
191 f
"error parsing {open_tag.parameters!r}; {error}"
217 text_length =
len(text)
224 text.spans = sorted(spans[::-1], key=attrgetter(
"start"))