1"use strict"; 2document.addEventListener('DOMContentLoaded', function() { 3 const editButtons = document.querySelector('.editButtons'); 4 if (editButtons && !document.getElementById('edbtn__miz2prel')) { 5 // URLに「&do=edit」が含まれているかチェックすることで全体編集を判定test 6 const isFullEdit = document.location.search.includes('&do=edit'); 7 8 // 全体編集の場合にのみmiz2prelボタンを表示 9 if (isFullEdit) { 10 const miz2prelButton = document.createElement('button'); 11 miz2prelButton.textContent = 'miz2prel'; 12 miz2prelButton.id = 'edbtn__miz2prel'; 13 miz2prelButton.type = 'button'; 14 miz2prelButton.classList.add('miz2prel-button'); 15 16 const clearButton = document.createElement('button'); // Clearボタンの作成 17 clearButton.textContent = 'Clear'; 18 clearButton.id = 'edbtn__clear'; 19 clearButton.type = 'button'; 20 clearButton.classList.add('clear-button'); 21 22 // Clearボタンのクリックイベント 23 clearButton.addEventListener('click', async function() { 24 const outputDiv = document.getElementById('compileResult'); 25 if (outputDiv) { 26 outputDiv.innerHTML = ''; // 出力内容をクリア 27 outputDiv.style.backgroundColor = ''; // 背景色をリセット 28 } 29 30 // サーバーに一時ファイルを削除するリクエストを送信 31 try { 32 const response = await fetch(DOKU_BASE + "lib/exe/ajax.php?call=clear_temp_files", { 33 method: "POST", 34 headers: { 35 "Content-Type": "application/x-www-form-urlencoded" 36 } 37 }); 38 39 const data = await response.json(); 40 if (data.success) { 41 console.log(data.message); 42 } else { 43 console.error("Failed to clear temporary files:", data.message); 44 } 45 } catch (error) { 46 console.error("Error clearing temporary files:", error); 47 } 48 49 // Clearボタンを消してmiz2prelボタンを再表示 50 clearButton.style.display = 'none'; // Clearボタンを非表示 51 miz2prelButton.style.display = 'inline-block'; // miz2prelボタンを表示 52 }); 53 54 miz2prelButton.addEventListener('click', async function() { 55 const editor = document.getElementById('wiki__text'); 56 if (!editor) { 57 alert('Editor not found'); 58 return; 59 } 60 61 const pageContent = editor.value; 62 const editBar = document.getElementById('wiki__editbar'); 63 let outputDiv = document.getElementById('compileResult'); 64 if (!outputDiv) { 65 outputDiv = document.createElement('div'); 66 outputDiv.id = 'compileResult'; 67 } 68 69 if (editBar) { 70 editBar.parentNode.insertBefore(outputDiv, editBar.nextSibling); 71 } 72 73 try { 74 const response = await fetch(DOKU_BASE + 'lib/exe/ajax.php?call=source_compile', { 75 method: 'POST', 76 headers: { 77 'Content-Type': 'application/x-www-form-urlencoded' 78 }, 79 body: 'content=' + encodeURIComponent(pageContent) 80 }); 81 82 const data = await response.json(); 83 84 if (data.success) { 85 // SSEで結果を受信 86 const eventSource = new EventSource(DOKU_BASE + 'lib/exe/ajax.php?call=source_sse'); 87 88 eventSource.onmessage = function(event) { 89 outputDiv.innerHTML += event.data + '<br>'; 90 }; 91 92 // エラー情報がある場合に受信するイベントリスナー 93 eventSource.addEventListener('compileErrors', function(event) { 94 try { 95 const errors = JSON.parse(event.data); 96 let errorContent = ''; // エラー内容を表示するための変数 97 errors.forEach(function(error) { 98 const { line, column, message } = error; 99 // リンクを削除してエラーメッセージのみを表示 100 errorContent += `❌ ${message} (Ln: ${line}, Col: ${column})<br>`; 101 }); 102 outputDiv.innerHTML += errorContent; // エラー情報を表示 103 104 // エラーメッセージが含まれている場合は背景色を赤にする 105 outputDiv.style.backgroundColor = '#fcc'; 106 } catch (e) { 107 console.error('Failed to parse error data:', e); 108 } 109 }); 110 111 eventSource.addEventListener('end', function(event) { 112 outputDiv.innerHTML += "Compilation complete<br>"; 113 if (!outputDiv.innerHTML.includes('❌')) { 114 outputDiv.style.backgroundColor = '#ccffcc'; 115 } 116 eventSource.close(); // 接続を閉じる 117 }); 118 119 eventSource.onerror = function(event) { 120 console.error('EventSource failed:', event); 121 eventSource.close(); // エラー発生時に接続を閉じる 122 }; 123 124 // miz2prelボタンを消してclearボタンを表示 125 miz2prelButton.style.display = 'none'; // miz2prelボタンを非表示に 126 clearButton.style.display = 'inline-block'; // clearボタンを表示 127 } else { 128 outputDiv.innerHTML = 'Error: ' + data.message; 129 outputDiv.style.backgroundColor = '#fcc'; // エラーがある場合は背景色を赤にする 130 } 131 } catch (error) { 132 console.error('Error:', error); 133 outputDiv.innerHTML = 'Error: ' + error; 134 outputDiv.style.backgroundColor = '#fcc'; // エラーがある場合は背景色を赤にする 135 } 136 }); 137 138 editButtons.appendChild(miz2prelButton); 139 editButtons.appendChild(clearButton); // Clearボタンを追加 140 } 141 } 142});