Files
english/.opencode/skills/threejs/scripts/generate_csv_from_json.py
2026-04-12 01:06:31 +07:00

136 lines
4.7 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Generate CSV files from examples-raw.json
"""
import csv
import json
from pathlib import Path
DATA_DIR = Path(__file__).parent.parent / "data"
SKILL_DIR = Path(__file__).parent.parent
def extract_keywords_from_file(filename):
"""Extract keywords from filename"""
base = filename.replace('.html', '')
parts = base.split('_')
return ', '.join([p for p in parts if len(p) > 1])
def extract_name_from_file(filename):
"""Extract display name from filename"""
base = filename.replace('.html', '')
parts = base.split('_')[1:] # Remove prefix like 'webgl'
return ' / '.join(parts)
def generate_csvs():
"""Generate tracking and examples CSVs from JSON"""
json_file = DATA_DIR / "examples-raw.json"
with open(json_file, 'r', encoding='utf-8') as f:
examples = json.load(f)
print(f"Loaded {len(examples)} examples from JSON")
# Count by category
categories = {}
for ex in examples:
cat = ex['c']
categories[cat] = categories.get(cat, 0) + 1
print("\nExamples by category:")
for cat, count in sorted(categories.items(), key=lambda x: -x[1]):
print(f" {cat}: {count}")
# Generate tracking CSV
tracking_file = SKILL_DIR / "extraction-progress.csv"
tracking_rows = []
for i, ex in enumerate(examples, 1):
tracking_rows.append({
'ID': i,
'Category': ex['c'],
'Name': extract_name_from_file(ex['f']),
'File': ex['f'],
'URL': f"https://threejs.org/examples/{ex['f']}",
'Keywords': extract_keywords_from_file(ex['f']),
'Status': 'extracted',
'Extracted_At': '2026-01-21'
})
with open(tracking_file, 'w', newline='', encoding='utf-8') as f:
writer = csv.DictWriter(f, fieldnames=['ID', 'Category', 'Name', 'File', 'URL', 'Keywords', 'Status', 'Extracted_At'])
writer.writeheader()
writer.writerows(tracking_rows)
print(f"\nGenerated {len(tracking_rows)} entries in {tracking_file}")
# Generate examples-all.csv
examples_file = DATA_DIR / "examples-all.csv"
examples_rows = []
for i, ex in enumerate(examples, 1):
name = extract_name_from_file(ex['f'])
keywords = extract_keywords_from_file(ex['f'])
# Determine complexity based on category
complexity = "medium"
if "advanced" in ex['c'] or "gpgpu" in ex['f'] or "compute" in ex['f']:
complexity = "high"
elif "basic" in ex['f'] or ex['c'] in ['css2d', 'css3d', 'svg']:
complexity = "low"
# Generate use cases based on keywords
use_cases = []
file_lower = ex['f'].lower()
if 'animation' in file_lower:
use_cases.append('character animation')
if 'loader' in file_lower:
use_cases.append('model loading')
if 'material' in file_lower:
use_cases.append('material effects')
if 'postprocessing' in file_lower:
use_cases.append('visual effects')
if 'shadow' in file_lower:
use_cases.append('realistic lighting')
if 'physics' in file_lower:
use_cases.append('physics simulation')
if 'xr' in file_lower or 'vr' in file_lower or 'ar' in file_lower:
use_cases.append('VR/AR experience')
if 'interactive' in file_lower or 'raycaster' in file_lower:
use_cases.append('user interaction')
if 'particle' in file_lower or 'points' in file_lower:
use_cases.append('particle effects')
if 'terrain' in file_lower or 'geometry' in file_lower:
use_cases.append('procedural generation')
if 'tsl' in file_lower:
use_cases.append('shader programming')
if 'compute' in file_lower:
use_cases.append('GPU compute')
if not use_cases:
use_cases.append('3D visualization')
desc = f"Three.js {ex['c']} example demonstrating {name.replace(' / ', ', ')}"
examples_rows.append({
'ID': i,
'Category': ex['c'],
'Name': name,
'File': ex['f'],
'URL': f"https://threejs.org/examples/{ex['f']}",
'Keywords': keywords,
'Complexity': complexity,
'Use Cases': '; '.join(use_cases),
'Description': desc
})
with open(examples_file, 'w', newline='', encoding='utf-8') as f:
writer = csv.DictWriter(f, fieldnames=['ID', 'Category', 'Name', 'File', 'URL', 'Keywords', 'Complexity', 'Use Cases', 'Description'])
writer.writeheader()
writer.writerows(examples_rows)
print(f"Generated {len(examples_rows)} entries in {examples_file}")
if __name__ == "__main__":
generate_csvs()