__  __    __   __  _____      _            _          _____ _          _ _ 
 |  \/  |   \ \ / / |  __ \    (_)          | |        / ____| |        | | |
 | \  / |_ __\ V /  | |__) | __ ___   ____ _| |_ ___  | (___ | |__   ___| | |
 | |\/| | '__|> <   |  ___/ '__| \ \ / / _` | __/ _ \  \___ \| '_ \ / _ \ | |
 | |  | | |_ / . \  | |   | |  | |\ V / (_| | ||  __/  ____) | | | |  __/ | |
 |_|  |_|_(_)_/ \_\ |_|   |_|  |_| \_/ \__,_|\__\___| |_____/|_| |_|\___V 2.1
 if you need WebShell for Seo everyday contact me on Telegram
 Telegram Address : @jackleet
        
        
For_More_Tools: Telegram: @jackleet | Bulk Smtp support mail sender | Business Mail Collector | Mail Bouncer All Mail | Bulk Office Mail Validator | Html Letter private



Upload:

Command:

[email protected]: ~ $
from ast import literal_eval
from operator import attrgetter
import re
from typing import Callable, Iterable, List, Match, NamedTuple, Optional, Tuple, Union

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


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)
    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.
        emoji (bool, optional): Also render emoji code. Defaults to True.

    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:
            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.table import Table
    from pip._vendor.rich import print

    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
__init__.py File 5.67 KB 0644
__main__.py File 8.6 KB 0644
_cell_widths.py File 9.86 KB 0644
_emoji_codes.py File 136.95 KB 0644
_emoji_replace.py File 1.04 KB 0644
_extension.py File 265 B 0644
_inspect.py File 7.27 KB 0644
_log_render.py File 3.15 KB 0644
_loop.py File 1.21 KB 0644
_lru_cache.py File 1.22 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 25.9 KB 0644
_stack.py File 351 B 0644
_timer.py File 417 B 0644
_windows.py File 2.02 KB 0644
_wrap.py File 1.76 KB 0644
abc.py File 890 B 0644
align.py File 10.18 KB 0644
ansi.py File 6.52 KB 0644
bar.py File 3.19 KB 0644
box.py File 8.86 KB 0644
cells.py File 4.18 KB 0644
color.py File 16.88 KB 0644
color_triplet.py File 1.03 KB 0644
columns.py File 6.96 KB 0644
console.py File 79.33 KB 0644
constrain.py File 1.26 KB 0644
containers.py File 5.37 KB 0644
control.py File 5.17 KB 0644
default_styles.py File 7.44 KB 0644
diagnose.py File 183 B 0644
emoji.py File 2.44 KB 0644
errors.py File 642 B 0644
file_proxy.py File 1.58 KB 0644
filesize.py File 2.45 KB 0644
highlighter.py File 4.78 KB 0644
json.py File 4.93 KB 0644
jupyter.py File 2.95 KB 0644
layout.py File 13.72 KB 0644
live.py File 13.39 KB 0644
live_render.py File 3.58 KB 0644
logging.py File 10.61 KB 0644
markup.py File 7.87 KB 0644
measure.py File 5.13 KB 0644
padding.py File 4.85 KB 0644
pager.py File 838 B 0644
palette.py File 3.32 KB 0644
panel.py File 8.43 KB 0644
pretty.py File 31.81 KB 0644
progress.py File 35.08 KB 0644
progress_bar.py File 7.58 KB 0644
prompt.py File 11.04 KB 0644
protocol.py File 1.37 KB 0644
region.py File 166 B 0644
repr.py File 4.21 KB 0644
rule.py File 4.1 KB 0644
scope.py File 2.78 KB 0644
screen.py File 1.55 KB 0644
segment.py File 23.36 KB 0644
spinner.py File 4.21 KB 0644
status.py File 4.32 KB 0644
style.py File 25.85 KB 0644
styled.py File 1.23 KB 0644
syntax.py File 26.36 KB 0644
table.py File 35.9 KB 0644
tabulate.py File 1.66 KB 0644
terminal_theme.py File 1.42 KB 0644
text.py File 43.38 KB 0644
theme.py File 3.54 KB 0644
themes.py File 102 B 0644
traceback.py File 25.33 KB 0644
tree.py File 8.91 KB 0644
Filemanager