Инструменты пользователя

Инструменты сайта


tmp_teh_zadanie_2_23.07.26_18:04

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слеваПредыдущая версия
tmp_teh_zadanie_2_23.07.26_18:04 [2026/07/23 18:34] – [toolbar.php] VladPolskiytmp_teh_zadanie_2_23.07.26_18:04 [2026/07/23 18:36] (текущий) – [local.php] VladPolskiy
Строка 1549: Строка 1549:
 </file> </file>
  
-===== local.php ===== +===== toolbar.js ===== 
-<code php local.php>+<code js toolbar.js> 
 +/** 
 + * Функция вставки вики-тегов в поле редактора 
 + */ 
 +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 = "<span style='color:#666; font-style:italic;'>Генерация предпросмотра...</span>"; 
 +    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 = "<span style='color:red;'>Не удалось загрузить предпросмотр: " + error.message + "</span>"; 
 +    }); 
 +
 + 
 +// Добавьте этот код в самый конец файла 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"); 
 +    }); 
 +}); 
 +</code> 
 + 
 +===== media-modal.js ===== 
 +<code js media-modal.js> 
 +/** 
 + * Системный компонент: Управление модальным окном Медиа-менеджера и AJAX загрузкой 
 + */ 
 + 
 +function openMediaModal() { 
 +    var modal = document.getElementById("mediaModal"); 
 +    if (modal) { 
 +        modal.style.display = "flex"; 
 +        document.getElementById("uploadPrompt").innerText = "📄 Кликните сюда для выбора картинки"; 
 +        document.getElementById("modalFileInp").value = "";  
 +    } 
 +
 + 
 +function closeMediaModal() { 
 +    var modal = document.getElementById("mediaModal"); 
 +    if (modal) modal.style.display = "none"; 
 +
 + 
 +/** 
 + * Асинхронная отправка файла на бэкенд без перезагрузки страницы 
 + */ 
 +function sendModalFile(event) { 
 +    // Жестко глушим любые системные события браузера, чтобы предотвратить submit формы редактора 
 +    if (event) { 
 +        event.preventDefault(); 
 +        event.stopPropagation(); 
 +    } 
 + 
 +    var fileInp = document.getElementById("modalFileInp"); 
 +    if (!fileInp || !fileInp.files || fileInp.files.length === 0) { 
 +        alert("Пожалуйста, выберите файл для загрузки."); 
 +        return; 
 +    } 
 + 
 +    var urlParams = new URLSearchParams(window.location.search); 
 +    var pageId = urlParams.get('id') || 'start'; 
 + 
 +    var targetFile = fileInp.files.item(0); 
 + 
 +    var formData = new FormData(); 
 +    formData.append("uploadfile", targetFile); 
 + 
 +    // Выполняем асинхронный фоновый запрос к бэкенду 
 +    fetch('?id=' + encodeURIComponent(pageId) + '&do=api_upload',
 +        method: 'POST', 
 +        body: formData 
 +    }) 
 +    .then(function(response) { 
 +        if (!response.ok) { 
 +            throw new Error("Ошибка сети: сервер вернул статус " + response.status); 
 +        } 
 +        return response.json(); 
 +    }) 
 +    .then(function(data) { 
 +        if (data.success) { 
 +            // Вставляем полученный тег в поле редактора 
 +            insertTags(data.tag, '', ''); 
 +            closeMediaModal(); 
 +        } else { 
 +            alert("Ошибка сервера: " + data.error); 
 +        } 
 +    }) 
 +    .catch(function(error) { 
 +        console.error('AJAX Error:', error); 
 +        alert("Критическая ошибка при фоновой отправке файла: " + error.message); 
 +    }); 
 +
 + 
 +document.addEventListener("DOMContentLoaded", function() { 
 +    var fileInp = document.getElementById("modalFileInp"); 
 +    if (fileInp) { 
 +        fileInp.addEventListener("change", function() { 
 +            if (this.files && this.files.length > 0) { 
 +                var currentFile = this.files.item(0); 
 +                document.getElementById("uploadPrompt").innerText = "✅ Выбран файл: " + currentFile.name; 
 +            } 
 +        }); 
 +    } 
 +});
 </code> </code>
  
  
tmp_teh_zadanie_2_23.07.26_18/04.txt · Последнее изменение: VladPolskiy

Если не указано иное, содержимое этой вики предоставляется на условиях следующей лицензии: Public Domain
Public Domain Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki