Source code for xsdata.utils.text

import re
import string
from typing import Any
from typing import List
from typing import Match
from typing import Tuple


def prefix(value: str, sep: str = ":") -> str:
    """Return the first part of the string before the separator."""
    return split(value, sep)[0]


def suffix(value: str, sep: str = ":") -> str:
    """Return the last part of the string after the separator."""
    return split(value, sep)[1]


def split(value: str, sep: str = ":") -> Tuple:
    """
    Separate the given string with the given separator and return a tuple of
    the prefix and suffix.

    If the separator isn't present in the string return None as prefix.
    """
    left, _, right = value.partition(sep)
    return (left, right) if right else (None, left)


[docs]def capitalize(value: str, **kwargs: Any) -> str: """Capitalize the given string.""" return value[0].upper() + value[1:]
def original_case(value: str, **kwargs: Any) -> str: """Return the input string without any modifications.""" return value
[docs]def pascal_case(value: str, **kwargs: Any) -> str: """Convert the given string to pascal case.""" return "".join(map(str.title, split_words(value)))
[docs]def camel_case(value: str, **kwargs: Any) -> str: """Convert the given string to camel case.""" result = "".join(map(str.title, split_words(value))) return result[0].lower() + result[1:]
[docs]def mixed_case(value: str, **kwargs: Any) -> str: """Convert the given string to mixed case.""" return "".join(split_words(value))
[docs]def mixed_pascal_case(value: str, **kwargs: Any) -> str: """Convert the given string to mixed pascal case.""" return capitalize(mixed_case(value))
[docs]def mixed_snake_case(value: str, **kwargs: Any) -> str: """Convert the given string to mixed snake case.""" return "_".join(split_words(value))
[docs]def snake_case(value: str, **kwargs: Any) -> str: """Convert the given string to snake case.""" return "_".join(map(str.lower, split_words(value)))
def screaming_snake_case(value: str, **kwargs: Any) -> str: """Convert the given string to screaming snake case.""" return snake_case(value, **kwargs).upper()
[docs]def kebab_case(value: str, **kwargs: Any) -> str: """Convert the given string to kebab case.""" return "-".join(split_words(value))
def split_words(value: str) -> List[str]: """Split a string on new capital letters and not alphanumeric characters.""" words: List[str] = [] buffer: List[str] = [] previous = None def flush(): if buffer: words.append("".join(buffer)) buffer.clear() for char in value: tp = classify(char) if tp == StringType.OTHER: flush() elif not previous or tp == previous: buffer.append(char) elif tp == StringType.UPPER and previous != StringType.UPPER: flush() buffer.append(char) else: buffer.append(char) previous = tp flush() return words class StringType: UPPER = 1 LOWER = 2 NUMERIC = 3 OTHER = 4 def classify(character: str) -> int: """String classifier.""" if character.isupper(): return StringType.UPPER if character.islower(): return StringType.LOWER if character.isnumeric(): return StringType.NUMERIC return StringType.OTHER ESCAPE = re.compile(r'[\x00-\x1f\\"\b\f\n\r\t]') ESCAPE_DCT = { "\\": "\\\\", '"': '\\"', "\b": "\\b", "\f": "\\f", "\n": "\\n", "\r": "\\r", "\t": "\\t", } for i in range(0x20): ESCAPE_DCT.setdefault(chr(i), f"\\u{i:04x}") def escape_string(value: str) -> str: """ Escape a string for code generation. Source: json.encoder.py_encode_basestring """ def replace(match: Match) -> str: return ESCAPE_DCT[match.group(0)] return ESCAPE.sub(replace, value) _punctuation = set(string.punctuation + string.whitespace) def alnum(value: str) -> str: for remove in set(value).intersection(_punctuation): value = value.replace(remove, "") return value.lower()