fix: correct tojson|safe usage in templates and update validator

- Remove |safe from |tojson in HTML attributes (x-data) - quotes must
  become " for browsers to parse correctly
- Update LANG-002 and LANG-003 architecture rules to document correct
  |tojson usage patterns:
  - HTML attributes: |tojson (no |safe)
  - Script blocks: |tojson|safe
- Fix validator to warn when |tojson|safe is used in x-data (breaks
  HTML attribute parsing)
- Improve code quality across services, APIs, and tests

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2025-12-13 22:59:51 +01:00
parent 94d268f330
commit 9920430b9e
123 changed files with 1408 additions and 840 deletions

View File

@@ -56,7 +56,7 @@ class FileResult:
def status(self) -> str:
if self.errors > 0:
return "FAILED"
elif self.warnings > 0:
if self.warnings > 0:
return "PASSED*"
return "PASSED"
@@ -64,7 +64,7 @@ class FileResult:
def status_icon(self) -> str:
if self.errors > 0:
return ""
elif self.warnings > 0:
if self.warnings > 0:
return "⚠️"
return ""
@@ -220,17 +220,19 @@ class BaseValidator:
# Look for the function definition
for j in range(i + 1, min(i + 10, len(lines))):
next_line = lines[j].strip()
if next_line.startswith("def ") or next_line.startswith("async def "):
if next_line.startswith("def ") or next_line.startswith(
"async def "
):
# Extract function name
match = re.search(r"(?:async\s+)?def\s+(\w+)", next_line)
if match:
func_name = match.group(1)
results.append((i + 1, decorator, func_name))
break
elif next_line.startswith("@"):
if next_line.startswith("@"):
# Multiple decorators - continue to next
continue
elif next_line and not next_line.startswith("#"):
if next_line and not next_line.startswith("#"):
# Non-decorator, non-comment line - stop looking
break
i += 1
@@ -303,7 +305,7 @@ class BaseValidator:
Returns (is_valid, error_message) tuple.
"""
try:
with open(file_path, "r", encoding="utf-8") as f:
with open(file_path, encoding="utf-8") as f:
json.load(f)
return True, ""
except json.JSONDecodeError as e: