"""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, List, 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, profile: Optional[str] = None, ): djlint_settings = load_pyproject_settings(Path(src)) # custom configuration options self.extension: str = str(extension or djlint_settings.get("extension", "html")) self.quiet: str = str(quiet or djlint_settings.get("quiet", "")) self.custom_blocks: str = str( build_custom_blocks(djlint_settings.get("custom_blocks")) or "" ) # ignore is based on input and also profile self.ignore: str = str(ignore or djlint_settings.get("ignore", "")) # codes to exclude profile_dict: Dict[str, List[str]] = { "django": ["J", "N", "M"], "jinja": ["D", "N", "M"], "nunjucks": ["D", "J", "M"], "handlebars": ["D", "J", "N"], } self.profile_code: List[str] = profile_dict.get( str(profile or djlint_settings.get("profile", "all")).lower(), [] ) self.profile: str = str( profile or djlint_settings.get("profile", "all") ).lower() # base options self.indent: str = (indent or int(djlint_settings.get("indent", 4))) * " " 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"""