/**
* Функция вставки вики-тегов в поле редактора
*/
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");
});
});