Trivia1 / modules /flashcard_generator.py
Bharath370's picture
Upload 16 files
5775a1b verified
# modules/flashcard_generator.py
"""Enhanced Flashcard Generator Module"""
from typing import Dict, List, Optional
from modules.api_utils import (
fetch_wikipedia_summary,
fetch_wikibooks_content,
fetch_wikipedia_categories,
fetch_related_topics,
)
import random
def generate_flashcard_types(topic: str, difficulty: str) -> Dict:
"""Generate different types of flashcards based on difficulty"""
summary_data = fetch_wikipedia_summary(topic)
if not summary_data:
return {"error": "Topic not found", "status": False}
title = summary_data.get("title", topic)
extract = summary_data.get("extract", "")
description = summary_data.get("description", "")
# Also try to get Wikibooks content for educational material
wikibooks_content = fetch_wikibooks_content(topic)
flashcard_types = {
"Easy": {
"front": f"What is {title}?",
"back": extract[:200] + "..." if len(extract) > 200 else extract,
"type": "definition",
},
"Medium": {
"front": f"Explain the key concepts of {title}",
"back": extract[:300] + "..." if len(extract) > 300 else extract,
"type": "conceptual",
},
"Hard": {
"front": f"How does {title} relate to its field and what are its applications?",
"back": extract
+ (
f"\n\nAdditional context: {wikibooks_content[:200]}"
if wikibooks_content
else ""
),
"type": "analytical",
},
}
flashcard = flashcard_types.get(difficulty, flashcard_types["Easy"])
# Add categories as tags
categories = fetch_wikipedia_categories(title)
return {
"front": flashcard["front"],
"back": flashcard["back"],
"hint": description,
"topic": title,
"difficulty": difficulty,
"type": flashcard["type"],
"tags": categories[:3] if categories else [],
"status": True,
}
def generate_flashcard(topic: str, difficulty: str = "Medium") -> Dict:
"""Generate an enhanced flashcard for a given topic"""
return generate_flashcard_types(topic, difficulty)
def generate_flashcard_deck(
topics: List[str], difficulty: str = "Medium"
) -> List[Dict]:
"""Generate a deck of flashcards with progress tracking"""
deck = []
for i, topic in enumerate(topics):
card = generate_flashcard(topic, difficulty)
if card.get("status"):
card["card_number"] = i + 1
card["total_cards"] = len(topics)
deck.append(card)
return deck
def generate_smart_deck(
main_topic: str, deck_size: int = 10, difficulty: str = "Medium"
) -> List[Dict]:
"""Generate a smart deck with related topics"""
# Start with the main topic
topics = [main_topic]
# Add related topics
related = fetch_related_topics(main_topic, deck_size - 1)
topics.extend(related)
# Generate the deck
deck = generate_flashcard_deck(topics[:deck_size], difficulty)
# Shuffle for variety
random.shuffle(deck)
# Re-number the cards
for i, card in enumerate(deck):
card["card_number"] = i + 1
return deck
def generate_review_card(topic: str, previous_performance: Dict) -> Dict:
"""Generate a review flashcard based on previous performance"""
# Adjust difficulty based on performance
if previous_performance.get("success_rate", 0) < 0.5:
difficulty = "Easy"
elif previous_performance.get("success_rate", 0) > 0.8:
difficulty = "Hard"
else:
difficulty = "Medium"
card = generate_flashcard(topic, difficulty)
if card.get("status"):
card["is_review"] = True
card["previous_attempts"] = previous_performance.get("attempts", 0)
card["previous_success_rate"] = previous_performance.get("success_rate", 0)
return card