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

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


tmp_teh_zadanie_2_23.07.26_18:04

Различия

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

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

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
tmp_teh_zadanie_2_23.07.26_18:04 [2026/07/23 18:27] – [local.php] VladPolskiytmp_teh_zadanie_2_23.07.26_18:04 [2026/07/23 18:36] (текущий) – [local.php] VladPolskiy
Строка 1427: Строка 1427:
  
 ===== toolbar.php ===== ===== toolbar.php =====
-<code php toolbar.php>+<file html toolbar.php>
 <?php <?php
 /** /**
Строка 1547: Строка 1547:
     </div>     </div>
 </div> </div>
 +</file>
 +
 +===== toolbar.js =====
 +<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> </code>
  
-===== local.php ===== +===== media-modal.js ===== 
-<code php local.php>+<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.1784820460.txt.gz · Последнее изменение: VladPolskiy

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