xref: /plugin/mizarverifiabledocs/script.js (revision 9fc5dc4b1674e92eafb48539fd7a855151fa369f)
1"use strict";
2document.addEventListener('DOMContentLoaded', function() {
3    const editButtons = document.querySelector('.editButtons');
4    if (editButtons && !document.getElementById('edbtn__miz2prel')) {
5        // URLに「&do=edit」が含まれているかチェックすることで全体編集を判定
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});