File size: 2,151 Bytes
eebc40f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import * as d3 from 'd3';
import { calculatePositions as calculateVoronoiPositions } from './voronoiDilation';

/**
 * Utilitaires pour la gestion des polices
 */

/**
 * Obtient l'ID du symbole SVG pour une police donnée
 * Utilise directement l'ID de la police + "_a" (plus besoin de mapping)
 */
export const getFontSymbolId = (fontName) => {
  if (!fontName) return 'fallback_a';
  
  // Utiliser directement l'ID de la police + "_a"
  // L'ID est déjà normalisé dans font-index.json
  return fontName.toLowerCase() + '_a';
};

/**
 * Vérifie si une police correspond à un terme de recherche
 */
export const matchesSearch = (font, searchTerm) => {
  if (!searchTerm) return true;
  const searchLower = searchTerm.toLowerCase();
  return font.name.toLowerCase().includes(searchLower) || 
         font.family.toLowerCase().includes(searchLower);
};

/**
 * Forge une URL Google Fonts pour une police donnée
 * Gère correctement les espaces, majuscules et caractères spéciaux
 */
export const generateGoogleFontsUrl = (fontName) => {
  if (!fontName) return null;
  
  // Nettoyer et formater le nom de police pour l'URL Google Fonts
  const formattedName = fontName
    .trim()
    .replace(/\s+/g, '+')  // Remplacer les espaces par des +
    .replace(/[^\w\s+]/g, '') // Supprimer les caractères spéciaux sauf +
    .replace(/\s+/g, '+'); // S'assurer que tous les espaces sont des +
  
  return `https://fonts.google.com/specimen/${formattedName}`;
};

/**
 * Filtre les polices selon les critères donnés
 */
export const filterFonts = (fonts, filter, searchTerm) => {
  return fonts.filter(font => {
    // Filtrage par famille
    const familyMatch = filter === 'all' || font.family === filter;
    
    // Filtrage par recherche
    const searchMatch = matchesSearch(font, searchTerm);
    
    return familyMatch && searchMatch;
  });
};

/**
 * Calcule les positions avec simulation de relaxation de Voronoi
 * Délègue le calcul complexe au module voronoiDilation
 */
export const calculatePositions = (fonts, width, height, dilationFactor) => {
  return calculateVoronoiPositions(fonts, width, height, dilationFactor);
};