File size: 5,881 Bytes
9c5671b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
document.getElementById('fileInput').addEventListener('change', handleFileSelect);

function handleFileSelect(event) {
    const file = event.target.files[0];
    if (!file) return;

    const fileNameMatch = file.name.match(/(\d+\.\d+(?:-\d+)?)[_-]([a-z0-9]+)\.json/i);
    let fileInfoText = '';

    if (fileNameMatch) {
        const specNumber = fileNameMatch[1];
        const versionCode = fileNameMatch[2];

        // Conversion des caractères en numéro de version
        let versionString = "";
        for (let i = 0; i < versionCode.length; i++) {
            let char = versionCode[i].toLowerCase();
            let versionPart;

            if (/[0-9]/.test(char)) {
                versionPart = parseInt(char, 10);
            } else if (/[a-z]/.test(char)) {
                versionPart = char.charCodeAt(0) - 'a'.charCodeAt(0) + 10;
            } else {
                versionPart = "?";
            }

            if (i > 0) versionString += ".";
            versionString += versionPart;
        }

        fileInfoText = `Spécification ${specNumber}, Version ${versionString}`;
        document.getElementById('fileInfo').textContent = fileInfoText;
    } else {
        document.getElementById('fileInfo').textContent = file.name;
    }

    const reader = new FileReader();
    reader.onload = function (e) {
        try {
            const jsonContent = JSON.parse(e.target.result);
            renderDocument(jsonContent);
        } catch (error) {
            document.getElementById('document-container').innerHTML =
                `<div class="error">Erreur lors du traitement du fichier JSON: ${error.message}</div>`;
        }
    };
    reader.readAsText(file);
}

function renderDocument(jsonContent) {
    const container = document.getElementById('document-container');
    container.innerHTML = '';

    // Parcourir tous les éléments du JSON
    Object.entries(jsonContent).forEach(([key, value]) => {
        // Déterminer le niveau de titre basé sur la clé
        if (key.match(/^\d+$/)) {
            // Section principale (ex: "1 Scope")
            const section = document.createElement('div');
            section.className = 'section';

            const title = document.createElement('h2');
            title.textContent = key;
            section.appendChild(title);

            const content = document.createElement('div');
            content.innerHTML = formatText(value);
            section.appendChild(content);

            container.appendChild(section);
        } else if (key.match(/^\d+\.\d+$/)) {
            // Sous-section (ex: "3.1 Definitions")
            const subsection = document.createElement('div');
            subsection.className = 'subsection';

            const title = document.createElement('h3');
            title.textContent = key;
            subsection.appendChild(title);

            const content = document.createElement('div');
            content.innerHTML = formatText(value);
            subsection.appendChild(content);

            container.appendChild(subsection);
        } else {
            // Autres éléments
            const div = document.createElement('div');
            const title = document.createElement('h3');
            title.textContent = key;
            div.appendChild(title);

            const content = document.createElement('div');
            content.innerHTML = formatText(value);
            div.appendChild(content);

            container.appendChild(div);
        }
    });
}

function formatText(text) {
    if (!text) return '';

    // Remplacer les sauts de ligne
    let formattedText = text.replace(/\n/g, '<br>');

    // Formatage des tableaux (détection basique de structures tabulaires)
    if (text.includes('Byte') && (text.includes('b8') || text.includes('b7'))) {
        // Tenter de détecter et convertir les représentations de tables de bits
        formattedText = formatBitTables(formattedText);
    }

    // Mise en évidence des termes techniques
    formattedText = formattedText.replace(/\b([A-Z]{2,}(?:-[A-Z]+)*)\b/g, '<span class="code-block">$1</span>');

    return formattedText;
}

function formatBitTables(text) {
    // Exemple simple pour détecter et formater les tableaux de bits
    // Une implémentation plus robuste nécessiterait une analyse plus complexe

    // Détection basique d'un en-tête de table de bits
    const tableHeaders = text.match(/b8\s+b7\s+b6\s+b5\s+b4\s+b3\s+b2\s+b1/g);

    if (tableHeaders) {
        // Remplacer les occurrences par une table HTML
        tableHeaders.forEach(header => {
            const tableStart =
                '<table class="byte-table"><tr><th>b8</th><th>b7</th><th>b6</th><th>b5</th><th>b4</th><th>b3</th><th>b2</th><th>b1</th></tr>';
            const tableEnd = '</table>';

            // Essayer de capturer les lignes suivantes qui pourraient être des données de table
            const headerPos = text.indexOf(header);
            const nextLineStart = text.indexOf('<br>', headerPos) + 4;
            let tableContent = '';

            // Ajouter des lignes jusqu'à ce qu'on atteigne une ligne vide ou un nouveau paragraphe
            let currentPos = nextLineStart;
            let endPos = text.indexOf('<br><br>', currentPos);
            if (endPos === -1) endPos = text.length;

            const potentialTableData = text.substring(currentPos, endPos);
            const rows = potentialTableData.split('<br>');

            rows.forEach(row => {
                if (row.trim() && !row.includes('Byte') && !row.includes('b8')) {
                    tableContent += '<tr><td colspan="8">' + row + '</td></tr>';
                }
            });

            const tableHTML = tableStart + tableContent + tableEnd;
            text = text.replace(header + potentialTableData, tableHTML);
        });
    }

    return text;
}