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