dotfiles/fix-da-snippets.py
2025-02-28 11:41:18 +01:00

74 lines
2.5 KiB
Python

import os
import re
import json
import sys
def clean_json(content):
# Step 1: Remove comments (lines starting with //)
content = re.sub(r'^//.*\n', '', content, flags=re.MULTILINE)
# Step 2: Replace single quotes with double quotes for JSON compatibility
content = content.replace("'", '"')
# Step 3: Remove trailing commas in both objects and arrays
# Remove trailing commas in arrays
content = re.sub(r',\s*([\]}])', r'\1', content)
# Remove trailing commas in objects
content = re.sub(r',\s*(\n|\})', r'\1', content)
# Step 4: Escape backslashes in LaTeX snippets
content = content.replace("\\", "\\\\") # Double backslashes for JSON
# Step 5: Parse and re-encode to ensure valid JSON (removes trailing commas)
try:
data = json.loads(content) # Parse the content into a Python dictionary
cleaned_json = json.dumps(data, indent=4) # Re-encode into JSON, pretty-printed
except json.JSONDecodeError as e:
print(f"Error parsing JSON: {e}")
return None
return cleaned_json
def process_directory(directory):
# Loop through files in the specified directory (non-recursively)
for filename in os.listdir(directory):
file_path = os.path.join(directory, filename)
# Only process files that end with .json
if os.path.isfile(file_path) and filename.endswith('.json'):
print(f"Processing {file_path}")
# Read the file content
with open(file_path, 'r', encoding='utf-8') as file:
content = file.read()
# Clean the JSON content
cleaned_content = clean_json(content)
if cleaned_content is not None:
# Write the cleaned content back to the file
with open(file_path, 'w', encoding='utf-8') as file:
file.write(cleaned_content)
print(f"Fixed formatting in {file_path}")
else:
print(f"Failed to fix {file_path} due to JSON parsing error.")
def main():
# Check if a directory was passed as an argument, otherwise read from stdin
if len(sys.argv) > 1:
directory = sys.argv[1]
else:
print("Please provide a directory path as an argument.")
sys.exit(1)
# Check if the directory exists
if not os.path.isdir(directory):
print(f"The provided path '{directory}' is not a valid directory.")
sys.exit(1)
# Process all .json files in the directory
process_directory(directory)
if __name__ == '__main__':
main()