def beautify(data): data = strutils.escape_special_areas( data, SPECIAL_AREAS, DELIMITERS ) data = re.sub(r"\s*{\s*(?!};)", " {\n", data) data = re.sub(r"\s*;\s*", ";\n", data) data = re.sub(r"(?<!{)\s*}(;)?\s*", r"\n}\1\n", data) beautified = io.StringIO() indent_level = 0 for line in data.splitlines(True): if line.endswith("{\n"): beautified.write(" " * 2 * indent_level + line) indent_level += 1 elif line.startswith("}"): indent_level -= 1 beautified.write(" " * 2 * indent_level + line) else: beautified.write(" " * 2 * indent_level + line) data = strutils.unescape_special_areas(beautified.getvalue()) return data
def beautify(data: str, indent: str = " "): """Beautify a string containing CSS code""" data = strutils.escape_special_areas( data.strip(), CSS_SPECIAL_AREAS, CSS_SPECIAL_CHARS, ) # Add newlines data = re.sub(r"\s*;\s*", ";\n", data) data = re.sub(r"\s*{\s*", " {\n", data) data = re.sub(r"\s*}\s*", "\n}\n\n", data) # Fix incorrect ":" placement data = re.sub(r"\s*:\s*(?=[^{]+})", ": ", data) # Fix no space after "," data = re.sub(r"\s*,\s*", ", ", data) # indent data = re.sub("\n[ \t]+", "\n", data) data = re.sub("\n(?![}\n])(?=[^{]*})", "\n" + indent, data) data = strutils.unescape_special_areas(data) return data.rstrip("\n") + "\n"
def test_escape_special_areas(): assert strutils.escape_special_areas('foo "bar" baz', ESCAPE_QUOTES, "*") == 'foo "bar" baz' esc = strutils.escape_special_areas('foo "b*r" b*z', ESCAPE_QUOTES, "*") assert esc == 'foo "b\ue02ar" b*z' assert strutils.unescape_special_areas(esc) == 'foo "b*r" b*z'