File size: 7,653 Bytes
48c68c7
 
 
 
9c5671b
48c68c7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f0a2998
48c68c7
 
 
 
 
 
 
 
9c5671b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
48c68c7
9c5671b
48c68c7
9c5671b
 
 
 
 
 
28face5
48c68c7
9c5671b
28face5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9c5671b
28face5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9c5671b
28face5
 
 
 
 
 
 
 
 
9c5671b
 
28face5
 
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
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
const jsonTab = document.getElementById("tab1-btn")
const specTab = document.getElementById("tab2-btn")

document.getElementById("tab1").style.display = "block";
document.getElementById('fileInput').addEventListener('change', handleFileSelect);
document.getElementById("versCheck").addEventListener('change', event=>{
    if(event.target.checked){document.getElementById("versionInput").removeAttribute("disabled")} else {document.getElementById("versionInput").value = ""; document.getElementById("versionInput").setAttribute("disabled", "")}
})
function openTab(evt, tabName) {
    var i, tabcontent, tablinks;
    tabcontent = document.getElementsByClassName("tabcontent");
    for (i = 0; i < tabcontent.length; i++) {
      tabcontent[i].style.display = "none";
    }
    tablinks = document.getElementsByClassName("tablinks");
    for (i = 0; i < tablinks.length; i++) {
      tablinks[i].className = tablinks[i].className.replace(" active", "");
    }
    document.getElementById(tabName).style.display = "block";
    evt.currentTarget.className += " active";
}

function handleSpecSearch(){
    let versCheck = document.getElementById("versCheck").checked;
    let body = {"specification": document.getElementById("specInput").value};
    if(versCheck && document.getElementById("versionInput").value.length > 0){
        body["version"] = document.getElementById("versionInput").value;
    }
    
    fetch("/online", {
        method: "POST",
        headers: {"Content-Type": "application/json"},
        body: JSON.stringify(body)
    })
    .then(data => data.json())
    .then(resp => renderDocument("tab2", resp))
    .catch(error => console.error(error))
}

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("tab1", jsonContent);
        } catch (error) {
            document.querySelector('#tab1 #document-container').innerHTML =
                `<div class="error">Erreur lors du traitement du fichier JSON: ${error.message}</div>`;
        }
    };
    reader.readAsText(file);
}

function renderDocument(tab, data) {
    const container = document.querySelector(`#${tab} #document-container`);
    container.innerHTML = '';
    
    function renderSection(sectionKey, sectionData, level) {
        const sectionDiv = document.createElement('div');
        sectionDiv.className = `section level-${level}`;
        
        // Extraire le numéro et le titre de la clé
        const parts = sectionKey.split(/\s(.+)/); // Divise à partir du premier espace
        const sectionNumber = parts[0];
        const sectionTitle = parts[1] || "";
        
        // Créer l'en-tête de section
        const header = document.createElement(`h${Math.min(level + 1, 6)}`);
        header.textContent = sectionKey; // Utiliser la clé complète comme titre
        sectionDiv.appendChild(header);
        
        // Ajouter le contenu
        if (sectionData.content) {
            const content = document.createElement('div');
            content.className = 'content';
            content.textContent = sectionData.content;
            sectionDiv.appendChild(content);
        }
        
        // Ajouter les sous-sections récursivement
        if (sectionData.subsections && Object.keys(sectionData.subsections).length > 0) {
            const subsectionsDiv = document.createElement('div');
            subsectionsDiv.className = 'subsections';
            
            for (const [subKey, subData] of Object.entries(sectionData.subsections)) {
                const subSection = renderSection(subKey, subData, level + 1);
                subsectionsDiv.appendChild(subSection);
            }
            
            sectionDiv.appendChild(subsectionsDiv);
        }
        
        return sectionDiv;
    }
    
    // Parcourir les sections de premier niveau
    for (const [sectionKey, sectionData] of Object.entries(data)) {
        const sectionElement = renderSection(sectionKey, sectionData, 1);
        container.appendChild(sectionElement);
    }
}



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;
}