File size: 4,516 Bytes
eebc40f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6bda4a6
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
import { useState, useEffect } from 'react';

/**
 * Hook personnalisé pour la gestion des données de polices
 */
export const useFontData = (dataset) => {
  const [fonts, setFonts] = useState([]);
  const [loading, setLoading] = useState(true);
  // Plus besoin de fontMapping - utilisation directe des IDs
  const [error, setError] = useState(null);

  useEffect(() => {
    const loadData = async () => {
      try {
        setLoading(true);
        setError(null);
        
        const typographyFile = dataset === 'extended' 
          ? '/typography_data_extended.json' 
          : dataset === 'new'
          ? `/data/typography_data.json?t=${Date.now()}` // Force reload
          : '/typography_data.json';
        // NOTE: mappingFile supprimé car non utilisé
        const spriteFile = dataset === 'extended' 
          ? '/font-sprite-extended.svg' 
          : dataset === 'new'
          ? '/data/font-sprite.svg'
          : '/font-sprite.svg';
        const sentencesFile = dataset === 'extended' 
          ? '/font_sentences_extended.json' 
          : dataset === 'new'
          ? null // No sentences file needed for new dataset (individual SVGs)
          : '/font_sentences.json';
        
        const response = await fetch(typographyFile);
        if (!response.ok) {
          throw new Error(`HTTP Error: ${response.status}`);
        }
        const data = await response.json();
        let fonts = data.fonts;
        
        // Debug: compter les polices fusionnées
        const mergedFonts = fonts.filter(f => f.fusionInfo && f.fusionInfo.merged);
        console.log(`📊 Loaded ${fonts.length} fonts, ${mergedFonts.length} merged fonts`);
        if (mergedFonts.length > 0) {
          console.log('🔍 Merged fonts:', mergedFonts.map(f => f.name));
        }
        
        // Charger les données des phrases si disponibles (pas pour le nouveau dataset)
        if (sentencesFile) {
          try {
            const sentencesResponse = await fetch(sentencesFile);
            if (sentencesResponse.ok) {
              const sentencesData = await sentencesResponse.json();
              
              // Créer un map des phrases par nom de police
              const sentencesMap = {};
              if (sentencesData.sentences) {
                sentencesData.sentences.forEach(item => {
                  sentencesMap[item.name] = item.sentence;
                });
              }
              
              // Intégrer les phrases dans les données des polices
              fonts = fonts.map(font => ({
                ...font,
                sentence: sentencesMap[font.name] || null
              }));
            }
          } catch (error) {
            console.warn('Impossible de charger les données des phrases:', error);
          }
        }
        
        setFonts(fonts);
        
        // Plus besoin de charger le mapping
        
        const spriteResponse = await fetch(spriteFile);
        if (!spriteResponse.ok) {
          throw new Error(`HTTP Error: ${spriteResponse.status}`);
        }
        const spriteContent = await spriteResponse.text();
        
        if (!document.getElementById('global-font-sprite')) {
          const spriteContainer = document.createElement('div');
          spriteContainer.id = 'global-font-sprite';
          
          const fallbackSymbol = `
            <symbol id="fallback_a" viewBox="0 0 80 80">
              <rect width="80" height="80" fill="currentColor" opacity="0.1"/>
              <text x="40" y="50" text-anchor="middle" dominant-baseline="middle" 
                    font-family="monospace" font-size="32" fill="currentColor">A</text>
            </symbol>
          `;
          
          spriteContainer.innerHTML = spriteContent + fallbackSymbol;
          spriteContainer.style.display = 'none';
          spriteContainer.style.position = 'absolute';
          spriteContainer.style.width = '0';
          spriteContainer.style.height = '0';
          document.body.insertBefore(spriteContainer, document.body.firstChild);
        } else {
          const existingContainer = document.getElementById('global-font-sprite');
          existingContainer.innerHTML = spriteContent;
        }
        
        setLoading(false);
      } catch (error) {
        console.error('Error loading data:', error);
        setError(error.message);
        setLoading(false);
      }
    };

    loadData();
  }, [dataset]);

  return {
    fonts,
    loading,
    error
  };
};