/** * Функция вставки вики-тегов в поле редактора */ function insertTags(openTag, closeTag, defaultText) { var txtarea = document.getElementById("wikiEditor"); if (!txtarea) return; var start = txtarea.selectionStart; var end = txtarea.selectionEnd; var selText = txtarea.value.substring(start, end); if (!selText) { selText = defaultText; } var replacement = ''; var newCursorStart = start; var newCursorEnd = end; if (openTag.indexOf('%sel%') !== -1) { replacement = openTag.replace('%sel%', selText) + closeTag; txtarea.value = txtarea.value.substring(0, start) + replacement + txtarea.value.substring(end, txtarea.value.length); newCursorStart = start + 3; newCursorEnd = start + 3; } else { replacement = openTag + selText + closeTag; txtarea.value = txtarea.value.substring(0, start) + replacement + txtarea.value.substring(end, txtarea.value.length); newCursorStart = start; newCursorEnd = start + replacement.length; } txtarea.focus(); txtarea.selectionStart = newCursorStart; txtarea.selectionEnd = newCursorEnd; } /** * Инициализация горячих клавиш */ document.addEventListener("DOMContentLoaded", function() { var editor = document.getElementById("wikiEditor"); if (!editor) return; editor.addEventListener("keydown", function(e) { var isCtrl = e.ctrlKey || e.metaKey; if (isCtrl) { if (e.key.toLowerCase() === 'b') { e.preventDefault(); insertTags('**', '**', 'жирный текст'); } if (e.key.toLowerCase() === 'i') { e.preventDefault(); insertTags('//', '//', 'курсив'); } if (e.key.toLowerCase() === 'u') { e.preventDefault(); insertTags('__', '__', 'подчеркнутый текст'); } } }); }); /** * Асинхронный движок предпросмотра текста в стиле DokuWiki */ function runLivePreview() { var editor = document.getElementById("wikiEditor"); var previewBlock = document.getElementById("previewBlock"); var previewContent = document.getElementById("previewContent"); if (!editor || !previewBlock || !previewContent) return; var textValue = editor.value; var formData = new FormData(); formData.append("wikitext", textValue); var urlParams = new URLSearchParams(window.location.search); var pageId = urlParams.get('id') || 'start'; previewContent.innerHTML = "Генерация предпросмотра..."; previewBlock.style.display = "block"; previewBlock.scrollIntoView({ behavior: 'smooth' }); // Отправляем запрос на бэкенд fetch('?id=' + encodeURIComponent(pageId) + '&do=api_preview', { method: 'POST', body: formData }) .then(function(response) { if (!response.ok) { throw new Error("Сервер вернул статус " + response.status); } // ИСПРАВЛЕНО: Ждем чистый текст/HTML, а не JSON! return response.text(); }) .then(function(htmlResult) { // Мгновенно отрисовываем HTML в блоке превью previewContent.innerHTML = htmlResult; }) .catch(function(error) { console.error('Preview Error:', error); previewContent.innerHTML = "Не удалось загрузить предпросмотр: " + error.message + ""; }); } // Добавьте этот код в самый конец файла assets/js/toolbar.js: /** * Управление выпадающими горизонтальными пикерами Toolbar */ document.addEventListener("DOMContentLoaded", function() { var btnH = document.getElementById("dokuBtnH"); var btnCode = document.getElementById("dokuBtnCode"); var dropH = document.getElementById("dokuDropH"); var dropCode = document.getElementById("dokuDropCode"); if (btnH && dropH) { btnH.addEventListener("click", function(e) { e.stopPropagation(); if (dropCode) dropCode.classList.remove("doku-dropdown-show"); dropH.classList.toggle("doku-dropdown-show"); }); } if (btnCode && dropCode) { btnCode.addEventListener("click", function(e) { e.stopPropagation(); if (dropH) dropH.classList.remove("doku-dropdown-show"); dropCode.classList.toggle("doku-dropdown-show"); }); } document.addEventListener("click", function() { if (dropH) dropH.classList.remove("doku-dropdown-show"); if (dropCode) dropCode.classList.remove("doku-dropdown-show"); }); });