image-selection-service.ts•17.1 kB
/**
* Context-Aware Image Selection Service
* Task 3.2: Context-Aware Image Selection Implementation
*
* Provides intelligent image selection based on educational context:
* - Subject-specific image libraries
* - Grade-level appropriate imagery
* - Educational context awareness
* - Brazilian curriculum (BNCC) compliance
* - Fallback mechanisms for any topic
*/
interface ImageSelection {
url: string;
caption: string;
alt_text: string;
educational_context: string;
fallback_used: boolean;
}
interface SubjectImageLibrary {
[key: string]: {
[topic: string]: string[];
};
}
interface ImageMetadata {
subject: string;
topic: string;
grade_level: string;
educational_purpose: string;
brazilian_standard: boolean;
}
export class ImageSelectionService {
private imageLibrary: SubjectImageLibrary;
private educationalImageMap: Map<string, ImageMetadata>;
constructor() {
this.initializeImageLibrary();
this.initializeImageMetadata();
}
/**
* Select contextually appropriate image based on educational content
*/
public selectContextualImage(
content: string,
subject: string = 'geral',
gradeLevel: string = 'fundamental',
widgetType: string = 'image-1'
): ImageSelection {
try {
// Analyze content for topic detection
const topic = this.detectTopic(content, subject);
// Get subject-specific images
const images = this.getSubjectImages(subject, topic);
if (images.length > 0) {
// Select best image based on context
const selectedImage = this.selectBestImage(images, gradeLevel, widgetType);
return {
url: selectedImage,
caption: this.generateEducationalCaption(topic, subject, gradeLevel),
alt_text: this.generateAccessibleAltText(topic, subject),
educational_context: `${subject}/${topic}/${gradeLevel}`,
fallback_used: false
};
} else {
// Use fallback system
return this.getFallbackImage(subject, gradeLevel);
}
} catch (error) {
console.warn('Image selection error, using fallback:', error);
return this.getFallbackImage(subject, gradeLevel);
}
}
/**
* Initialize subject-specific image libraries
* Organized by Brazilian educational subjects and topics
*/
private initializeImageLibrary(): void {
this.imageLibrary = {
// Ciências (Sciences)
'ciências': {
'fotossíntese': [
'https://cdn.digitalpages.com.br/education/ciencias/fotossintese/cloroplasto-estrutura.jpg',
'https://cdn.digitalpages.com.br/education/ciencias/fotossintese/folha-anatomia.jpg',
'https://cdn.digitalpages.com.br/education/ciencias/fotossintese/processo-fotossintese.jpg',
'https://cdn.digitalpages.com.br/education/ciencias/fotossintese/luz-solar-plantas.jpg'
],
'célula': [
'https://cdn.digitalpages.com.br/education/ciencias/celula/celula-animal.jpg',
'https://cdn.digitalpages.com.br/education/ciencias/celula/celula-vegetal.jpg',
'https://cdn.digitalpages.com.br/education/ciencias/celula/organelas-celulares.jpg',
'https://cdn.digitalpages.com.br/education/ciencias/celula/divisao-celular.jpg'
],
'sistemaSolar': [
'https://cdn.digitalpages.com.br/education/ciencias/sistema-solar/planetas-orbita.jpg',
'https://cdn.digitalpages.com.br/education/ciencias/sistema-solar/sol-estrutura.jpg',
'https://cdn.digitalpages.com.br/education/ciencias/sistema-solar/terra-lua.jpg',
'https://cdn.digitalpages.com.br/education/ciencias/sistema-solar/galaxia-via-lactea.jpg'
]
},
// Física (Physics)
'física': {
'trajetória': [
'https://cdn.digitalpages.com.br/education/fisica/trajetoria/movimento-projetil.jpg',
'https://cdn.digitalpages.com.br/education/fisica/trajetoria/parabola-trajetoria.jpg',
'https://cdn.digitalpages.com.br/education/fisica/trajetoria/vetores-velocidade.jpg',
'https://cdn.digitalpages.com.br/education/fisica/trajetoria/fisica-esportes.jpg'
],
'forças': [
'https://cdn.digitalpages.com.br/education/fisica/forcas/diagrama-forcas.jpg',
'https://cdn.digitalpages.com.br/education/fisica/forcas/newton-leis.jpg',
'https://cdn.digitalpages.com.br/education/fisica/forcas/equilibrio-forcas.jpg',
'https://cdn.digitalpages.com.br/education/fisica/forcas/atrito-movimento.jpg'
],
'movimento': [
'https://cdn.digitalpages.com.br/education/fisica/movimento/mru-grafico.jpg',
'https://cdn.digitalpages.com.br/education/fisica/movimento/aceleracao-tempo.jpg',
'https://cdn.digitalpages.com.br/education/fisica/movimento/velocidade-media.jpg',
'https://cdn.digitalpages.com.br/education/fisica/movimento/cinematica-equacoes.jpg'
]
},
// Química (Chemistry)
'química': [
'moléculas': [
'https://cdn.digitalpages.com.br/education/quimica/moleculas/agua-estrutura.jpg',
'https://cdn.digitalpages.com.br/education/quimica/moleculas/carbono-ligacoes.jpg',
'https://cdn.digitalpages.com.br/education/quimica/moleculas/dna-estrutura.jpg',
'https://cdn.digitalpages.com.br/education/quimica/moleculas/proteinas-3d.jpg'
],
'reações': [
'https://cdn.digitalpages.com.br/education/quimica/reacoes/combustao-energia.jpg',
'https://cdn.digitalpages.com.br/education/quimica/reacoes/acido-base.jpg',
'https://cdn.digitalpages.com.br/education/quimica/reacoes/laboratorio-experimento.jpg',
'https://cdn.digitalpages.com.br/education/quimica/reacoes/tabela-periodica.jpg'
],
'laboratório': [
'https://cdn.digitalpages.com.br/education/quimica/laboratorio/equipamentos-lab.jpg',
'https://cdn.digitalpages.com.br/education/quimica/laboratorio/seguranca-quimica.jpg',
'https://cdn.digitalpages.com.br/education/quimica/laboratorio/vidraria-lab.jpg',
'https://cdn.digitalpages.com.br/education/quimica/laboratorio/experimento-seguro.jpg'
]
],
// História (History)
'história': {
'independência': [
'https://cdn.digitalpages.com.br/education/historia/independencia/dom-pedro-grito.jpg',
'https://cdn.digitalpages.com.br/education/historia/independencia/brasil-colonia.jpg',
'https://cdn.digitalpages.com.br/education/historia/independencia/mapa-brasil-1822.jpg',
'https://cdn.digitalpages.com.br/education/historia/independencia/familia-real.jpg'
],
'colonial': [
'https://cdn.digitalpages.com.br/education/historia/colonial/capitanias-hereditarias.jpg',
'https://cdn.digitalpages.com.br/education/historia/colonial/engenho-acucar.jpg',
'https://cdn.digitalpages.com.br/education/historia/colonial/navegacoes-portuguesas.jpg',
'https://cdn.digitalpages.com.br/education/historia/colonial/sociedade-colonial.jpg'
],
'império': [
'https://cdn.digitalpages.com.br/education/historia/imperio/dom-pedro-ii.jpg',
'https://cdn.digitalpages.com.br/education/historia/imperio/guerra-paraguai.jpg',
'https://cdn.digitalpages.com.br/education/historia/imperio/abolicao-escravatura.jpg',
'https://cdn.digitalpages.com.br/education/historia/imperio/proclamacao-republica.jpg'
]
},
// Matemática (Mathematics)
'matemática': {
'geometria': [
'https://cdn.digitalpages.com.br/education/matematica/geometria/formas-geometricas.jpg',
'https://cdn.digitalpages.com.br/education/matematica/geometria/teorema-pitagoras.jpg',
'https://cdn.digitalpages.com.br/education/matematica/geometria/areas-volumes.jpg',
'https://cdn.digitalpages.com.br/education/matematica/geometria/coordenadas-plano.jpg'
],
'álgebra': [
'https://cdn.digitalpages.com.br/education/matematica/algebra/equacoes-lineares.jpg',
'https://cdn.digitalpages.com.br/education/matematica/algebra/funcoes-graficos.jpg',
'https://cdn.digitalpages.com.br/education/matematica/algebra/sistemas-equacoes.jpg',
'https://cdn.digitalpages.com.br/education/matematica/algebra/numeros-reais.jpg'
]
},
// Português (Portuguese)
'português': {
'literatura': [
'https://cdn.digitalpages.com.br/education/portugues/literatura/machado-assis.jpg',
'https://cdn.digitalpages.com.br/education/portugues/literatura/romantismo-brasil.jpg',
'https://cdn.digitalpages.com.br/education/portugues/literatura/modernismo-22.jpg',
'https://cdn.digitalpages.com.br/education/portugues/literatura/cordel-nordeste.jpg'
],
'gramática': [
'https://cdn.digitalpages.com.br/education/portugues/gramatica/classes-palavras.jpg',
'https://cdn.digitalpages.com.br/education/portugues/gramatica/sintaxe-periodo.jpg',
'https://cdn.digitalpages.com.br/education/portugues/gramatica/concordancia-verbal.jpg',
'https://cdn.digitalpages.com.br/education/portugues/gramatica/acentuacao-grafica.jpg'
]
}
};
}
/**
* Initialize image metadata for educational context
*/
private initializeImageMetadata(): void {
this.educationalImageMap = new Map();
// This would be populated with detailed metadata for each image
// Including BNCC compliance, grade level appropriateness, etc.
}
/**
* Detect main topic from content analysis
*/
private detectTopic(content: string, subject: string): string {
const contentLower = content.toLowerCase();
// Subject-specific topic detection patterns
const topicPatterns = {
'ciências': {
'fotossíntese': ['fotossíntese', 'cloroplasto', 'folha', 'luz solar', 'plantas'],
'célula': ['célula', 'organela', 'núcleo', 'mitocôndria', 'citoplasma'],
'sistemaSolar': ['sistema solar', 'planetas', 'sol', 'terra', 'lua', 'órbita']
},
'física': {
'trajetória': ['trajetória', 'movimento', 'projétil', 'parábola', 'velocidade'],
'forças': ['força', 'newton', 'atrito', 'gravidade', 'peso', 'equilíbrio'],
'movimento': ['movimento', 'velocidade', 'aceleração', 'mru', 'mruv']
},
'química': {
'moléculas': ['molécula', 'átomo', 'ligação', 'estrutura', 'química'],
'reações': ['reação', 'combustão', 'ácido', 'base', 'equação química'],
'laboratório': ['laboratório', 'experimento', 'vidraria', 'segurança']
},
'história': {
'independência': ['independência', 'dom pedro', 'grito ipiranga', '1822'],
'colonial': ['colônia', 'capitania', 'engenho', 'açúcar', 'navegação'],
'império': ['império', 'dom pedro ii', 'abolição', 'república']
},
'matemática': {
'geometria': ['geometria', 'triângulo', 'círculo', 'área', 'volume'],
'álgebra': ['álgebra', 'equação', 'função', 'gráfico', 'variável']
},
'português': {
'literatura': ['literatura', 'romance', 'poesia', 'autor', 'obra'],
'gramática': ['gramática', 'verbo', 'substantivo', 'sintaxe', 'concordância']
}
};
const subjectPatterns = topicPatterns[subject as keyof typeof topicPatterns];
if (!subjectPatterns) return 'geral';
// Find best matching topic based on keyword frequency
let bestTopic = 'geral';
let bestScore = 0;
for (const [topic, keywords] of Object.entries(subjectPatterns)) {
const score = keywords.reduce((acc, keyword) => {
return acc + (contentLower.includes(keyword) ? 1 : 0);
}, 0);
if (score > bestScore) {
bestScore = score;
bestTopic = topic;
}
}
return bestTopic;
}
/**
* Get subject-specific images for a topic
*/
private getSubjectImages(subject: string, topic: string): string[] {
const subjectLibrary = this.imageLibrary[subject];
if (!subjectLibrary) return [];
const topicImages = subjectLibrary[topic];
return topicImages || [];
}
/**
* Select best image based on context
*/
private selectBestImage(images: string[], gradeLevel: string, widgetType: string): string {
// For now, select first image
// Future enhancement: scoring based on grade level, widget type, etc.
return images[0];
}
/**
* Generate educational caption for image
*/
private generateEducationalCaption(topic: string, subject: string, gradeLevel: string): string {
const captions = {
'fotossíntese': 'Processo de fotossíntese: como as plantas produzem energia a partir da luz solar',
'célula': 'Estrutura celular: organizando a vida microscópica',
'trajetória': 'Movimento de projéteis: aplicando conceitos físicos no cotidiano',
'forças': 'Diagrama de forças: compreendendo as leis de Newton',
'moléculas': 'Estruturas moleculares: a base química da vida',
'independência': 'Independência do Brasil: marcos históricos de 1822',
'geometria': 'Conceitos geométricos: formas e medidas no mundo real',
'literatura': 'Literatura brasileira: expressões culturais através da escrita'
};
return captions[topic as keyof typeof captions] || `Conteúdo educacional de ${subject}: ${topic}`;
}
/**
* Generate accessible alt text for screen readers
*/
private generateAccessibleAltText(topic: string, subject: string): string {
return `Imagem educacional sobre ${topic} na disciplina de ${subject}`;
}
/**
* Fallback image system for unknown topics
*/
private getFallbackImage(subject: string, gradeLevel: string): ImageSelection {
const fallbackUrls = {
'ciências': 'https://cdn.digitalpages.com.br/education/generic/ciencias-geral.jpg',
'física': 'https://cdn.digitalpages.com.br/education/generic/fisica-geral.jpg',
'química': 'https://cdn.digitalpages.com.br/education/generic/quimica-geral.jpg',
'história': 'https://cdn.digitalpages.com.br/education/generic/historia-geral.jpg',
'matemática': 'https://cdn.digitalpages.com.br/education/generic/matematica-geral.jpg',
'português': 'https://cdn.digitalpages.com.br/education/generic/portugues-geral.jpg',
'geral': 'https://cdn.digitalpages.com.br/education/generic/educacao-geral.jpg'
};
const fallbackUrl = fallbackUrls[subject as keyof typeof fallbackUrls] || fallbackUrls['geral'];
return {
url: fallbackUrl,
caption: `Conteúdo educacional de ${subject}`,
alt_text: `Imagem genérica para ${subject}`,
educational_context: `${subject}/geral/${gradeLevel}`,
fallback_used: true
};
}
/**
* Get widget-specific image (for different widget types)
*/
public getWidgetSpecificImage(widgetType: string, content: string, subject: string): ImageSelection {
// Widget-specific image selection logic
switch (widgetType) {
case 'head-1':
return this.getHeaderImage(subject);
case 'gallery-1':
return this.getGalleryImage(content, subject);
case 'hotspots-1':
return this.getHotspotImage(content, subject);
default:
return this.selectContextualImage(content, subject);
}
}
/**
* Get header-appropriate image
*/
private getHeaderImage(subject: string): ImageSelection {
const headerImages = {
'ciências': 'https://cdn.digitalpages.com.br/education/headers/ciencias-header.jpg',
'física': 'https://cdn.digitalpages.com.br/education/headers/fisica-header.jpg',
'química': 'https://cdn.digitalpages.com.br/education/headers/quimica-header.jpg',
'história': 'https://cdn.digitalpages.com.br/education/headers/historia-header.jpg',
'matemática': 'https://cdn.digitalpages.com.br/education/headers/matematica-header.jpg',
'português': 'https://cdn.digitalpages.com.br/education/headers/portugues-header.jpg'
};
const url = headerImages[subject as keyof typeof headerImages] ||
'https://cdn.digitalpages.com.br/education/headers/educacao-header.jpg';
return {
url,
caption: `Disciplina: ${subject}`,
alt_text: `Cabeçalho para aula de ${subject}`,
educational_context: `${subject}/header/geral`,
fallback_used: false
};
}
/**
* Get gallery-appropriate images
*/
private getGalleryImage(content: string, subject: string): ImageSelection {
// Return first image of detected topic for gallery
return this.selectContextualImage(content, subject);
}
/**
* Get hotspot-appropriate background image
*/
private getHotspotImage(content: string, subject: string): ImageSelection {
// Return interactive-friendly image for hotspots
return this.selectContextualImage(content, subject);
}
}