Initial commit
This commit is contained in:
260
skills/venue-templates/scripts/query_template.py
Executable file
260
skills/venue-templates/scripts/query_template.py
Executable file
@@ -0,0 +1,260 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Query Template Script
|
||||
Search and retrieve venue-specific templates by name, type, or keywords.
|
||||
|
||||
Usage:
|
||||
python query_template.py --venue "Nature" --type "article"
|
||||
python query_template.py --keyword "machine learning"
|
||||
python query_template.py --list-all
|
||||
python query_template.py --venue "NeurIPS" --requirements
|
||||
"""
|
||||
|
||||
import argparse
|
||||
import os
|
||||
import json
|
||||
from pathlib import Path
|
||||
|
||||
# Template database
|
||||
TEMPLATES = {
|
||||
"journals": {
|
||||
"nature": {
|
||||
"file": "nature_article.tex",
|
||||
"full_name": "Nature",
|
||||
"description": "Top-tier multidisciplinary science journal",
|
||||
"page_limit": "~3000 words",
|
||||
"citation_style": "Superscript numbered",
|
||||
"format": "Single column"
|
||||
},
|
||||
"neurips": {
|
||||
"file": "neurips_article.tex",
|
||||
"full_name": "NeurIPS (Neural Information Processing Systems)",
|
||||
"description": "Top-tier machine learning conference",
|
||||
"page_limit": "8 pages + unlimited refs",
|
||||
"citation_style": "Numbered [1]",
|
||||
"format": "Two column",
|
||||
"anonymization": "Required (double-blind)"
|
||||
},
|
||||
"plos_one": {
|
||||
"file": "plos_one.tex",
|
||||
"full_name": "PLOS ONE",
|
||||
"description": "Open-access multidisciplinary journal",
|
||||
"page_limit": "No limit",
|
||||
"citation_style": "Vancouver [1]",
|
||||
"format": "Single column"
|
||||
}
|
||||
},
|
||||
"posters": {
|
||||
"beamerposter": {
|
||||
"file": "beamerposter_academic.tex",
|
||||
"full_name": "Beamerposter Academic",
|
||||
"description": "Classic academic conference poster using beamerposter",
|
||||
"size": "A0, customizable",
|
||||
"package": "beamerposter"
|
||||
}
|
||||
},
|
||||
"grants": {
|
||||
"nsf": {
|
||||
"file": "nsf_proposal_template.tex",
|
||||
"full_name": "NSF Standard Grant",
|
||||
"description": "National Science Foundation research proposal",
|
||||
"page_limit": "15 pages (project description)",
|
||||
"key_sections": "Project Summary, Project Description, Broader Impacts"
|
||||
},
|
||||
"nih_specific_aims": {
|
||||
"file": "nih_specific_aims.tex",
|
||||
"full_name": "NIH Specific Aims Page",
|
||||
"description": "Most critical page of NIH proposals",
|
||||
"page_limit": "1 page (strictly enforced)",
|
||||
"key_sections": "Hook, Hypothesis, 3 Aims, Payoff"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
def get_skill_path():
|
||||
"""Get the path to the venue-templates skill directory."""
|
||||
# Assume script is in .claude/skills/venue-templates/scripts/
|
||||
script_dir = Path(__file__).parent
|
||||
skill_dir = script_dir.parent
|
||||
return skill_dir
|
||||
|
||||
def search_templates(venue=None, template_type=None, keyword=None):
|
||||
"""Search for templates matching criteria."""
|
||||
results = []
|
||||
|
||||
for cat_name, category in TEMPLATES.items():
|
||||
# Filter by type if specified
|
||||
if template_type and cat_name != template_type and template_type != "all":
|
||||
continue
|
||||
|
||||
for temp_id, template in category.items():
|
||||
# Filter by venue name
|
||||
if venue:
|
||||
venue_lower = venue.lower()
|
||||
if venue_lower not in temp_id and venue_lower not in template.get("full_name", "").lower():
|
||||
continue
|
||||
|
||||
# Filter by keyword
|
||||
if keyword:
|
||||
keyword_lower = keyword.lower()
|
||||
search_text = json.dumps(template).lower()
|
||||
if keyword_lower not in search_text:
|
||||
continue
|
||||
|
||||
results.append({
|
||||
"id": temp_id,
|
||||
"category": cat_name,
|
||||
"file": template["file"],
|
||||
"full_name": template.get("full_name", temp_id),
|
||||
"description": template.get("description", ""),
|
||||
"details": template
|
||||
})
|
||||
|
||||
return results
|
||||
|
||||
def list_all_templates():
|
||||
"""List all available templates."""
|
||||
print("\n=== AVAILABLE TEMPLATES ===\n")
|
||||
|
||||
for cat_name, category in TEMPLATES.items():
|
||||
print(f"\n{cat_name.upper()}:")
|
||||
for temp_id, template in category.items():
|
||||
print(f" • {template.get('full_name', temp_id)}")
|
||||
print(f" File: {template['file']}")
|
||||
if "description" in template:
|
||||
print(f" Description: {template['description']}")
|
||||
print()
|
||||
|
||||
def print_template_info(template):
|
||||
"""Print detailed information about a template."""
|
||||
print(f"\n{'='*60}")
|
||||
print(f"Template: {template['full_name']}")
|
||||
print(f"{'='*60}")
|
||||
print(f"Category: {template['category']}")
|
||||
print(f"File: {template['file']}")
|
||||
|
||||
details = template['details']
|
||||
|
||||
print(f"\nDescription: {details.get('description', 'N/A')}")
|
||||
|
||||
if 'page_limit' in details:
|
||||
print(f"Page Limit: {details['page_limit']}")
|
||||
if 'citation_style' in details:
|
||||
print(f"Citation Style: {details['citation_style']}")
|
||||
if 'format' in details:
|
||||
print(f"Format: {details['format']}")
|
||||
if 'anonymization' in details:
|
||||
print(f"⚠️ Anonymization: {details['anonymization']}")
|
||||
if 'size' in details:
|
||||
print(f"Poster Size: {details['size']}")
|
||||
if 'package' in details:
|
||||
print(f"LaTeX Package: {details['package']}")
|
||||
if 'key_sections' in details:
|
||||
print(f"Key Sections: {details['key_sections']}")
|
||||
|
||||
# Print full path to template
|
||||
skill_path = get_skill_path()
|
||||
template_path = skill_path / "assets" / template['category'] / template['file']
|
||||
print(f"\nFull Path: {template_path}")
|
||||
|
||||
if template_path.exists():
|
||||
print("✓ Template file exists")
|
||||
else:
|
||||
print("✗ Template file not found")
|
||||
|
||||
print()
|
||||
|
||||
def print_requirements(venue):
|
||||
"""Print formatting requirements for a venue."""
|
||||
results = search_templates(venue=venue)
|
||||
|
||||
if not results:
|
||||
print(f"No templates found for venue: {venue}")
|
||||
return
|
||||
|
||||
template = results[0] # Take first match
|
||||
details = template['details']
|
||||
|
||||
print(f"\n{'='*60}")
|
||||
print(f"FORMATTING REQUIREMENTS: {template['full_name']}")
|
||||
print(f"{'='*60}\n")
|
||||
|
||||
if 'page_limit' in details:
|
||||
print(f"📄 Page Limit: {details['page_limit']}")
|
||||
if 'format' in details:
|
||||
print(f"📐 Format: {details['format']}")
|
||||
if 'citation_style' in details:
|
||||
print(f"📚 Citation Style: {details['citation_style']}")
|
||||
if 'anonymization' in details:
|
||||
print(f"🔒 Anonymization: {details['anonymization']}")
|
||||
if 'size' in details:
|
||||
print(f"📏 Size: {details['size']}")
|
||||
|
||||
print(f"\n💡 For detailed requirements, see:")
|
||||
skill_path = get_skill_path()
|
||||
|
||||
if template['category'] == "journals":
|
||||
print(f" {skill_path}/references/journals_formatting.md")
|
||||
elif template['category'] == "posters":
|
||||
print(f" {skill_path}/references/posters_guidelines.md")
|
||||
elif template['category'] == "grants":
|
||||
print(f" {skill_path}/references/grants_requirements.md")
|
||||
|
||||
print()
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(
|
||||
description="Query venue-specific LaTeX templates",
|
||||
formatter_class=argparse.RawDescriptionHelpFormatter,
|
||||
epilog="""
|
||||
Examples:
|
||||
%(prog)s --list-all
|
||||
%(prog)s --venue "Nature" --type journals
|
||||
%(prog)s --keyword "machine learning"
|
||||
%(prog)s --venue "NeurIPS" --requirements
|
||||
"""
|
||||
)
|
||||
|
||||
parser.add_argument('--venue', type=str, help='Venue name (e.g., "Nature", "NeurIPS")')
|
||||
parser.add_argument('--type', type=str, choices=['journals', 'posters', 'grants', 'all'],
|
||||
help='Template type')
|
||||
parser.add_argument('--keyword', type=str, help='Search keyword')
|
||||
parser.add_argument('--list-all', action='store_true', help='List all available templates')
|
||||
parser.add_argument('--requirements', action='store_true',
|
||||
help='Show formatting requirements for venue')
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
# List all templates
|
||||
if args.list_all:
|
||||
list_all_templates()
|
||||
return
|
||||
|
||||
# Show requirements
|
||||
if args.requirements:
|
||||
if not args.venue:
|
||||
print("Error: --requirements requires --venue")
|
||||
parser.print_help()
|
||||
return
|
||||
print_requirements(args.venue)
|
||||
return
|
||||
|
||||
# Search for templates
|
||||
if not any([args.venue, args.type, args.keyword]):
|
||||
parser.print_help()
|
||||
return
|
||||
|
||||
results = search_templates(venue=args.venue, template_type=args.type, keyword=args.keyword)
|
||||
|
||||
if not results:
|
||||
print("No templates found matching your criteria.")
|
||||
return
|
||||
|
||||
print(f"\nFound {len(results)} template(s):\n")
|
||||
|
||||
for result in results:
|
||||
print_template_info(result)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
||||
Reference in New Issue
Block a user