[ Avaa Bypassed ]




Upload:

Command:

hmhc3928@3.149.24.49: ~ $
import re
from ast import literal_eval
from operator import attrgetter
from typing import Callable, Iterable, List, Match, NamedTuple, Optional, Tuple, Union

from ._emoji_replace import _emoji_replace
from .emoji import EmojiVariant
from .errors import MarkupError
from .style import Style
from .text import Span, Text

RE_TAGS = re.compile(
    r"""((\\*)\[([a-z#/@][^[]*?)])""",
    re.VERBOSE,
)

RE_HANDLER = re.compile(r"^([\w.]*?)(\(.*?\))?$")


class Tag(NamedTuple):
    """A tag in console markup."""

    name: str
    """The tag name. e.g. 'bold'."""
    parameters: Optional[str]
    """Any additional parameters after the name."""

    def __str__(self) -> str:
        return (
            self.name if self.parameters is None else f"{self.name} {self.parameters}"
        )

    @property
    def markup(self) -> str:
        """Get the string representation of this tag."""
        return (
            f"[{self.name}]"
            if self.parameters is None
            else f"[{self.name}={self.parameters}]"
        )


_ReStringMatch = Match[str]  # regex match object
_ReSubCallable = Callable[[_ReStringMatch], str]  # Callable invoked by re.sub
_EscapeSubMethod = Callable[[_ReSubCallable, str], str]  # Sub method of a compiled re


def escape(
    markup: str,
    _escape: _EscapeSubMethod = re.compile(r"(\\*)(\[[a-z#/@][^[]*?])").sub,
) -> str:
    """Escapes text so that it won't be interpreted as markup.

    Args:
        markup (str): Content to be inserted in to markup.

    Returns:
        str: Markup with square brackets escaped.
    """

    def escape_backslashes(match: Match[str]) -> str:
        """Called by re.sub replace matches."""
        backslashes, text = match.groups()
        return f"{backslashes}{backslashes}\\{text}"

    markup = _escape(escape_backslashes, markup)
    if markup.endswith("\\") and not markup.endswith("\\\\"):
        return markup + "\\"

    return markup


def _parse(markup: str) -> Iterable[Tuple[int, Optional[str], Optional[Tag]]]:
    """Parse markup in to an iterable of tuples of (position, text, tag).

    Args:
        markup (str): A string containing console markup

    """
    position = 0
    _divmod = divmod
    _Tag = Tag
    for match in RE_TAGS.finditer(markup):
        full_text, escapes, tag_text = match.groups()
        start, end = match.span()
        if start > position:
            yield start, markup[position:start], None
        if escapes:
            backslashes, escaped = _divmod(len(escapes), 2)
            if backslashes:
                # Literal backslashes
                yield start, "\\" * backslashes, None
                start += backslashes * 2
            if escaped:
                # Escape of tag
                yield start, full_text[len(escapes) :], None
                position = end
                continue
        text, equals, parameters = tag_text.partition("=")
        yield start, None, _Tag(text, parameters if equals else None)
        position = end
    if position < len(markup):
        yield position, markup[position:], None


def render(
    markup: str,
    style: Union[str, Style] = "",
    emoji: bool = True,
    emoji_variant: Optional[EmojiVariant] = None,
) -> Text:
    """Render console markup in to a Text instance.

    Args:
        markup (str): A string containing console markup.
        style: (Union[str, Style]): The style to use.
        emoji (bool, optional): Also render emoji code. Defaults to True.
        emoji_variant (str, optional): Optional emoji variant, either "text" or "emoji". Defaults to None.


    Raises:
        MarkupError: If there is a syntax error in the markup.

    Returns:
        Text: A test instance.
    """
    emoji_replace = _emoji_replace
    if "[" not in markup:
        return Text(
            emoji_replace(markup, default_variant=emoji_variant) if emoji else markup,
            style=style,
        )
    text = Text(style=style)
    append = text.append
    normalize = Style.normalize

    style_stack: List[Tuple[int, Tag]] = []
    pop = style_stack.pop

    spans: List[Span] = []
    append_span = spans.append

    _Span = Span
    _Tag = Tag

    def pop_style(style_name: str) -> Tuple[int, Tag]:
        """Pop tag matching given style name."""
        for index, (_, tag) in enumerate(reversed(style_stack), 1):
            if tag.name == style_name:
                return pop(-index)
        raise KeyError(style_name)

    for position, plain_text, tag in _parse(markup):
        if plain_text is not None:
            # Handle open brace escapes, where the brace is not part of a tag.
            plain_text = plain_text.replace("\\[", "[")
            append(emoji_replace(plain_text) if emoji else plain_text)
        elif tag is not None:
            if tag.name.startswith("/"):  # Closing tag
                style_name = tag.name[1:].strip()

                if style_name:  # explicit close
                    style_name = normalize(style_name)
                    try:
                        start, open_tag = pop_style(style_name)
                    except KeyError:
                        raise MarkupError(
                            f"closing tag '{tag.markup}' at position {position} doesn't match any open tag"
                        ) from None
                else:  # implicit close
                    try:
                        start, open_tag = pop()
                    except IndexError:
                        raise MarkupError(
                            f"closing tag '[/]' at position {position} has nothing to close"
                        ) from None

                if open_tag.name.startswith("@"):
                    if open_tag.parameters:
                        handler_name = ""
                        parameters = open_tag.parameters.strip()
                        handler_match = RE_HANDLER.match(parameters)
                        if handler_match is not None:
                            handler_name, match_parameters = handler_match.groups()
                            parameters = (
                                "()" if match_parameters is None else match_parameters
                            )

                        try:
                            meta_params = literal_eval(parameters)
                        except SyntaxError as error:
                            raise MarkupError(
                                f"error parsing {parameters!r} in {open_tag.parameters!r}; {error.msg}"
                            )
                        except Exception as error:
                            raise MarkupError(
                                f"error parsing {open_tag.parameters!r}; {error}"
                            ) from None

                        if handler_name:
                            meta_params = (
                                handler_name,
                                meta_params
                                if isinstance(meta_params, tuple)
                                else (meta_params,),
                            )

                    else:
                        meta_params = ()

                    append_span(
                        _Span(
                            start, len(text), Style(meta={open_tag.name: meta_params})
                        )
                    )
                else:
                    append_span(_Span(start, len(text), str(open_tag)))

            else:  # Opening tag
                normalized_tag = _Tag(normalize(tag.name), tag.parameters)
                style_stack.append((len(text), normalized_tag))

    text_length = len(text)
    while style_stack:
        start, tag = style_stack.pop()
        style = str(tag)
        if style:
            append_span(_Span(start, text_length, style))

    text.spans = sorted(spans[::-1], key=attrgetter("start"))
    return text


if __name__ == "__main__":  # pragma: no cover
    MARKUP = [
        "[red]Hello World[/red]",
        "[magenta]Hello [b]World[/b]",
        "[bold]Bold[italic] bold and italic [/bold]italic[/italic]",
        "Click [link=https://www.willmcgugan.com]here[/link] to visit my Blog",
        ":warning-emoji: [bold red blink] DANGER![/]",
    ]

    from pip._vendor.rich import print
    from pip._vendor.rich.table import Table

    grid = Table("Markup", "Result", padding=(0, 1))

    for markup in MARKUP:
        grid.add_row(Text(markup), markup)

    print(grid)

Filemanager

Name Type Size Permission Actions
__pycache__ Folder 0755
__init__.py File 5.95 KB 0644
__main__.py File 8.28 KB 0644
_cell_widths.py File 9.97 KB 0644
_emoji_codes.py File 136.95 KB 0644
_emoji_replace.py File 1.04 KB 0644
_export_format.py File 2.08 KB 0644
_extension.py File 265 B 0644
_fileno.py File 799 B 0644
_inspect.py File 9.47 KB 0644
_log_render.py File 3.15 KB 0644
_loop.py File 1.21 KB 0644
_null_file.py File 1.35 KB 0644
_palettes.py File 6.9 KB 0644
_pick.py File 423 B 0644
_ratio.py File 5.34 KB 0644
_spinners.py File 19.45 KB 0644
_stack.py File 351 B 0644
_timer.py File 417 B 0644
_win32_console.py File 22.29 KB 0644
_windows.py File 1.88 KB 0644
_windows_renderer.py File 2.72 KB 0644
_wrap.py File 3.32 KB 0644
abc.py File 890 B 0644
align.py File 10.13 KB 0644
ansi.py File 6.74 KB 0644
bar.py File 3.19 KB 0644
box.py File 10.58 KB 0644
cells.py File 4.67 KB 0644
color.py File 17.8 KB 0644
color_triplet.py File 1.03 KB 0644
columns.py File 6.96 KB 0644
console.py File 96.85 KB 0644
constrain.py File 1.26 KB 0644
containers.py File 5.37 KB 0644
control.py File 6.47 KB 0644
default_styles.py File 7.89 KB 0644
diagnose.py File 972 B 0644
emoji.py File 2.44 KB 0644
errors.py File 642 B 0644
file_proxy.py File 1.64 KB 0644
filesize.py File 2.45 KB 0644
highlighter.py File 9.36 KB 0644
json.py File 4.91 KB 0644
jupyter.py File 3.18 KB 0644
layout.py File 13.68 KB 0644
live.py File 13.94 KB 0644
live_render.py File 3.58 KB 0644
logging.py File 11.62 KB 0644
markup.py File 8.25 KB 0644
measure.py File 5.18 KB 0644
padding.py File 4.85 KB 0644
pager.py File 828 B 0644
palette.py File 3.32 KB 0644
panel.py File 10.45 KB 0644
pretty.py File 35.01 KB 0644
progress.py File 58.32 KB 0644
progress_bar.py File 7.97 KB 0644
prompt.py File 11.04 KB 0644
protocol.py File 1.36 KB 0644
py.typed File 0 B 0644
region.py File 166 B 0644
repr.py File 4.33 KB 0644
rule.py File 4.49 KB 0644
scope.py File 2.78 KB 0644
screen.py File 1.55 KB 0644
segment.py File 23.68 KB 0644
spinner.py File 4.24 KB 0644
status.py File 4.32 KB 0644
style.py File 26.44 KB 0644
styled.py File 1.23 KB 0644
syntax.py File 34.64 KB 0644
table.py File 38.75 KB 0644
terminal_theme.py File 3.29 KB 0644
text.py File 46.2 KB 0644
theme.py File 3.69 KB 0644
themes.py File 102 B 0644
traceback.py File 28.91 KB 0644
tree.py File 8.95 KB 0644