init
This commit is contained in:
135
.opencode/skills/threejs/scripts/generate_csv_from_json.py
Normal file
135
.opencode/skills/threejs/scripts/generate_csv_from_json.py
Normal file
@@ -0,0 +1,135 @@
|
||||
#!/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()
|
||||
Reference in New Issue
Block a user