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 =
'b8 | b7 | b6 | b5 | b4 | b3 | b2 | b1 |
';
const tableEnd = '
';
// 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;
}