"""Settings for reformater.""" # pylint: disable=C0301,C0103 # flake8: noqa import logging import re ## get pyproject.toml settings from pathlib import Path from typing import Dict, Optional, Union import tomlkit logger = logging.getLogger(__name__) def find_pyproject(src: Path) -> Optional[Path]: """Search upstream for a pyprojec.toml file.""" for directory in [src, *src.resolve().parents]: candidate = directory / "pyproject.toml" if candidate.is_file(): return candidate return None def load_pyproject_settings(src: Path) -> Dict: """Load djlint config from pyproject.toml.""" djlint_content: Dict = {} pyproject_file = find_pyproject(src) if pyproject_file: content = tomlkit.parse(pyproject_file.read_text()) try: djlint_content = content["tool"]["djlint"] # type: ignore except KeyError: logger.info("No pyproject.toml found.") return djlint_content def build_custom_blocks(custom_blocks: Union[str, None]) -> Optional[str]: """Build regex string for custom template blocks.""" if custom_blocks: return "|" + "|".join(x.strip() for x in custom_blocks.split(",")) return None class Config: """Djling Config.""" def __init__( self, src: str, ignore: Optional[str] = None, extension: Optional[str] = None, indent: Optional[int] = None, quiet: Optional[bool] = False, ): djlint_settings = load_pyproject_settings(Path(src)) # custom configuration options self.extension: str = str(extension or djlint_settings.get("extension", "html")) self.ignore: str = str(ignore or djlint_settings.get("ignore", "")) self.quiet: str = str(quiet or djlint_settings.get("quiet", "")) self.custom_blocks: str = str( build_custom_blocks(djlint_settings.get("custom_blocks")) or "" ) # base options self.indent: str = (indent or int(djlint_settings.get("indent", 4))) * " " print(len(self.indent)) default_exclude: str = r""" \.venv | venv | \.tox | \.eggs | \.git | \.hg | \.mypy_cache | \.nox | \.svn | \.bzr | _build | buck-out | build | dist | \.pants\.d | \.direnv | node_modules | __pypackages__ """ self.exclude: str = djlint_settings.get("exclude", default_exclude) extend_exclude: str = djlint_settings.get("extend_exclude", "") if extend_exclude: self.exclude += r" | " + r" | ".join( re.escape(x.strip()) for x in extend_exclude.split(",") ) # add blank line after load tags self.blank_line_after_tag: Optional[str] = djlint_settings.get( "blank_line_after_tag", None ) # contents of tags will not be formatted, but tags will be formatted self.ignored_block_opening: str = r"""