// SPDX-License-Identifier: GPL-2.0-or-later
// SPDX-FileCopyrightText: 2024-2025 Yamada, M.
// DokuWiki Plugin Mizar Verifiable Docs (Source View Script)
"use strict";
document.addEventListener('DOMContentLoaded', function() {
const editButtons = document.querySelector('.editButtons');
if (editButtons && !document.getElementById('edbtn__miz2prel')) {
const isFullEdit = document.location.search.includes('&do=edit');
if (isFullEdit) {
const miz2prelButton = document.createElement('button');
miz2prelButton.textContent = 'miz2prel';
miz2prelButton.id = 'edbtn__miz2prel';
miz2prelButton.type = 'button';
miz2prelButton.classList.add('miz2prel-button');
const clearButton = document.createElement('button');
clearButton.textContent = 'Clear';
clearButton.id = 'edbtn__clear';
clearButton.type = 'button';
clearButton.classList.add('clear-button');
clearButton.addEventListener('click', async function() {
const outputDiv = document.getElementById('compileResult');
if (outputDiv) {
outputDiv.innerHTML = '';
outputDiv.style.backgroundColor = '';
}
try {
const response = await fetch(DOKU_BASE + "lib/exe/ajax.php?call=clear_temp_files", {
method: "POST",
headers: {
"Content-Type": "application/x-www-form-urlencoded"
}
});
const data = await response.json();
if (data.success) {
console.log(data.message);
} else {
console.error("Failed to clear temporary files:", data.message);
}
} catch (error) {
console.error("Error clearing temporary files:", error);
}
clearButton.style.display = 'none';
miz2prelButton.style.display = 'inline-block';
});
miz2prelButton.addEventListener('click', async function() {
const editor = document.getElementById('wiki__text');
if (!editor) {
alert('Editor not found');
return;
}
const pageContent = editor.value;
const editBar = document.getElementById('wiki__editbar');
let outputDiv = document.getElementById('compileResult');
if (!outputDiv) {
outputDiv = document.createElement('div');
outputDiv.id = 'compileResult';
}
if (editBar) {
editBar.parentNode.insertBefore(outputDiv, editBar.nextSibling);
}
// ▼ Spinnerを追加
const spinner = document.createElement('div');
spinner.className = 'loading-spinner';
spinner.innerHTML = 'Loading...';
miz2prelButton.parentNode.insertBefore(spinner, miz2prelButton.nextSibling);
try {
const response = await fetch(DOKU_BASE + 'lib/exe/ajax.php?call=source_compile', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
body: 'content=' + encodeURIComponent(pageContent)
});
const data = await response.json();
if (data.success) {
const eventSource = new EventSource(DOKU_BASE + 'lib/exe/ajax.php?call=source_sse');
eventSource.onmessage = function(event) {
outputDiv.innerHTML += event.data + '
';
};
eventSource.addEventListener('compileErrors', function(event) {
try {
const errors = JSON.parse(event.data);
let errorContent = '';
errors.forEach(function(error) {
const { line, column, message } = error;
errorContent += `❌ ${message} (Ln: ${line}, Col: ${column})
`;
});
outputDiv.innerHTML += errorContent;
outputDiv.style.backgroundColor = '#fcc';
} catch (e) {
console.error('Failed to parse error data:', e);
}
});
eventSource.addEventListener('end', function(event) {
outputDiv.innerHTML += "Compilation complete
";
if (!outputDiv.innerHTML.includes('❌')) {
outputDiv.style.backgroundColor = '#ccffcc';
}
eventSource.close();
// ▼ Spinnerを削除(コンパイル完了後)
spinner.remove();
});
eventSource.onerror = function(event) {
console.error('EventSource failed:', event);
eventSource.close();
// ▼ Spinnerを削除(エラー発生時)
spinner.remove();
};
miz2prelButton.style.display = 'none';
clearButton.style.display = 'inline-block';
} else {
outputDiv.innerHTML = 'Error: ' + data.message;
outputDiv.style.backgroundColor = '#fcc';
// ▼ Spinnerを削除(サーバーレスポンスエラー時)
spinner.remove();
}
} catch (error) {
console.error('Error:', error);
outputDiv.innerHTML = 'Error: ' + error;
outputDiv.style.backgroundColor = '#fcc';
// ▼ Spinnerを削除(キャッチ時)
spinner.remove();
}
});
editButtons.appendChild(miz2prelButton);
editButtons.appendChild(clearButton);
}
}
});