Skip to content

Module app.utils.text

View Source
from typing import List, Tuple

def encode(lines: List[str]) -> str:

    encoded_lines = []

    for line in lines:

        if line:

            encoded = line

            for before, after in [

                ("_", "__"),

                ("-", "--"),

                (" ", "_"),

                ("?", "~q"),

                ("%", "~p"),

                ("#", "~h"),

                ('"', "''"),

                ("/", "~s"),

                ("\\", "~b"),

                ("\n", "~n"),

                ("&", "~a"),

            ]:

                encoded = encoded.replace(before, after)

            encoded_lines.append(encoded)

        else:

            encoded_lines.append("_")

    slug = "/".join(encoded_lines)

    return slug or "_"

def decode(slug: str) -> List[str]:

    has_arrow = "_-->" in slug

    slug = slug.replace("_", " ").replace("  ", "_")

    slug = slug.replace("-", " ").replace("  ", "-")

    slug = slug.replace("''", '"')

    if has_arrow:

        slug = slug.replace("- >", " ->")

    for before, after in [

        ("~q", "?"),

        ("~p", "%"),

        ("~h", "#"),

        ("~n", "\n"),

        ("~a", "&"),

        ("~b", "\\"),

    ]:

        slug = slug.replace(before, after)

    lines = slug.split("/")

    lines = [line.replace("~s", "/") for line in lines]

    return lines

def normalize(slug: str) -> Tuple[str, bool]:

    normalized_slug = encode(decode(slug))

    return normalized_slug, slug != normalized_slug

Functions

decode

def decode(
    slug: str
) -> List[str]
View Source
def decode(slug: str) -> List[str]:

    has_arrow = "_-->" in slug

    slug = slug.replace("_", " ").replace("  ", "_")

    slug = slug.replace("-", " ").replace("  ", "-")

    slug = slug.replace("''", '"')

    if has_arrow:

        slug = slug.replace("- >", " ->")

    for before, after in [

        ("~q", "?"),

        ("~p", "%"),

        ("~h", "#"),

        ("~n", "\n"),

        ("~a", "&"),

        ("~b", "\\"),

    ]:

        slug = slug.replace(before, after)

    lines = slug.split("/")

    lines = [line.replace("~s", "/") for line in lines]

    return lines

encode

def encode(
    lines: List[str]
) -> str
View Source
def encode(lines: List[str]) -> str:

    encoded_lines = []

    for line in lines:

        if line:

            encoded = line

            for before, after in [

                ("_", "__"),

                ("-", "--"),

                (" ", "_"),

                ("?", "~q"),

                ("%", "~p"),

                ("#", "~h"),

                ('"', "''"),

                ("/", "~s"),

                ("\\", "~b"),

                ("\n", "~n"),

                ("&", "~a"),

            ]:

                encoded = encoded.replace(before, after)

            encoded_lines.append(encoded)

        else:

            encoded_lines.append("_")

    slug = "/".join(encoded_lines)

    return slug or "_"

normalize

def normalize(
    slug: str
) -> Tuple[str, bool]
View Source
def normalize(slug: str) -> Tuple[str, bool]:

    normalized_slug = encode(decode(slug))

    return normalized_slug, slug != normalized_slug