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 = `
Erreur lors du traitement du fichier JSON: ${error.message}
`; } }; 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, '
'); // 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, '$1'); 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 = ''; const tableEnd = '
b8b7b6b5b4b3b2b1
'; // Essayer de capturer les lignes suivantes qui pourraient être des données de table const headerPos = text.indexOf(header); const nextLineStart = text.indexOf('
', 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('

', currentPos); if (endPos === -1) endPos = text.length; const potentialTableData = text.substring(currentPos, endPos); const rows = potentialTableData.split('
'); rows.forEach(row => { if (row.trim() && !row.includes('Byte') && !row.includes('b8')) { tableContent += '' + row + ''; } }); const tableHTML = tableStart + tableContent + tableEnd; text = text.replace(header + potentialTableData, tableHTML); }); } return text; }