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