Обновлена логика центральных блоков: теперь поддерживается несколько блоков

This commit is contained in:
2025-11-15 21:33:38 +02:00
parent ec41330624
commit 5c3e28fd55
26 changed files with 355 additions and 435 deletions

View File

@@ -15,81 +15,11 @@
<content tclass="btitle" bclass="bfloat"> <content tclass="btitle" bclass="bfloat">
<ru><![CDATA[ <ru><![CDATA[
<div> <div>
текст текст текст текст текст текст текст текст текст текст текст тексритчрсотат текст текст текст текст </div> test1цыкцып
<div>
 текст текст текст текст текыККПАФЦКАКПАМст текст текст текст текст текст текст текст урпкцуептекст текст текст
</div> </div>
<div> <div>
 текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст test2
</div> </div>
<div>
<hr style="height: 5px; width: 50%; background: rgb(0, 0, 0); border: 0px;">
<br>
</div>
<div>
<table style="width: 50%; margin: 1px; float: left; border: 1px solid rgb(0, 0, 0); background-color: rgb(255, 255, 255); border-collapse: collapse;">
<tbody>
<tr>
<td style="padding: 1px; border: 1px solid rgb(0, 0, 0);">
</td>
<td style="padding: 1px; border: 1px solid rgb(0, 0, 0);">
</td>
<td style="padding: 1px; border: 1px solid rgb(0, 0, 0);">
</td>
<td style="padding: 1px; border: 1px solid rgb(0, 0, 0);">
</td>
</tr>
<tr>
<td style="padding: 1px; border: 1px solid rgb(0, 0, 0);">
</td>
<td style="padding: 1px; border: 1px solid rgb(0, 0, 0);">
</td>
<td style="padding: 1px; border: 1px solid rgb(0, 0, 0);">
</td>
<td style="padding: 1px; border: 1px solid rgb(0, 0, 0);">
</td>
</tr>
<tr>
<td style="padding: 1px; border: 1px solid rgb(0, 0, 0);">
</td>
<td style="padding: 1px; border: 1px solid rgb(0, 0, 0);">
</td>
<td style="padding: 1px; border: 1px solid rgb(0, 0, 0);">
</td>
<td style="padding: 1px; border: 1px solid rgb(0, 0, 0);">
</td>
</tr>
<tr>
<td style="padding: 1px; border: 1px solid rgb(0, 0, 0);">
</td>
<td style="padding: 1px; border: 1px solid rgb(0, 0, 0);">
</td>
<td style="padding: 1px; border: 1px solid rgb(0, 0, 0);">
</td>
<td style="padding: 1px; border: 1px solid rgb(0, 0, 0);">
</td>
</tr>
</tbody>
</table>
<br>
</div>
<div>
<br>
</div>
<div>
<br>
</div>
<div>
<br>
</div>
<div>
<br>
</div>
<div>
<br>
</div>
<div><br>
</div>
]]></ru> ]]></ru>
<lv><![CDATA[ <lv><![CDATA[
<p>Uz šo brīdi šeit ne kā nav</p> <p>Uz šo brīdi šeit ne kā nav</p>

View File

@@ -8,24 +8,12 @@
</general> </general>
<!--Содержание страницы--> <!--Содержание страницы-->
<!--Левые блоки--> <!--Левые блоки-->
<lblock> <lblock/>
<block url="/plugin/foto/" title="df" tclass="btitle" bclass="bfloat"/>
<block url="/plugin/plugintest/" title="кнерцу" tclass="btitle" bclass="bfloat"/>
<block url="/plugin/foto/" title="цкпм" tclass="btitle" bclass="bfloat"/>
</lblock>
<!--Правые блоки--> <!--Правые блоки-->
<rblock> <rblock/>
<block url="/plugin/plugintest/" title="a5ysd" tclass="btitle" bclass="bfloat"/>
</rblock>
<!--Текст страницы--> <!--Текст страницы-->
<content tclass="btitle" bclass="bfloat"> <content tclass="btitle" bclass="bfloat">
<ru><![CDATA[ <ru/>
<!--?php
header('Content-Type: text/html; charset=utf-8');
readfile(__DIR__ . '/DgrmJS-main/src/index.html');
?-->
text
]]></ru>
<lv><![CDATA[ <lv><![CDATA[
echo file_get_contents(__DIR__ . '/DgrmJS-main/src/index.html'); echo file_get_contents(__DIR__ . '/DgrmJS-main/src/index.html');
]]></lv> ]]></lv>

View File

@@ -8,95 +8,18 @@
</general> </general>
<!--Содержание страницы--> <!--Содержание страницы-->
<!--Левые блоки--> <!--Левые блоки-->
<lblock> <lblock/>
</lblock>
<!--Правые блоки--> <!--Правые блоки-->
<rblock> <rblock/>
</rblock>
<!--Текст страницы--> <!--Текст страницы-->
<content tclass="btitle" bclass="bfloat"> <content tclass="btitle" bclass="bfloat">
<ru><![CDATA[ <ru>
<div> <![CDATA[<div>
текст текст текст текст текст текст текст текст текст текст текст тексритчрсотат текст текст текст текст </div> test1цыуквацыфавп
<div> </div>]]><![CDATA[<div>
 текст текст текст текст текыККПАФЦКАКПАМст текст текст текст текст текст текст текст урпкцуептекст текст текст test2
</div> </div>]]>
<div> </ru>
 текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст
</div>
<div>
<hr style="height: 5px; width: 50%; background: rgb(0, 0, 0); border: 0px;">
<br>
</div>
<div>
<table style="width: 50%; margin: 1px; float: left; border: 1px solid rgb(0, 0, 0); background-color: rgb(255, 255, 255); border-collapse: collapse;">
<tbody>
<tr>
<td style="padding: 1px; border: 1px solid rgb(0, 0, 0);">
</td>
<td style="padding: 1px; border: 1px solid rgb(0, 0, 0);">
</td>
<td style="padding: 1px; border: 1px solid rgb(0, 0, 0);">
</td>
<td style="padding: 1px; border: 1px solid rgb(0, 0, 0);">
</td>
</tr>
<tr>
<td style="padding: 1px; border: 1px solid rgb(0, 0, 0);">
</td>
<td style="padding: 1px; border: 1px solid rgb(0, 0, 0);">
</td>
<td style="padding: 1px; border: 1px solid rgb(0, 0, 0);">
</td>
<td style="padding: 1px; border: 1px solid rgb(0, 0, 0);">
</td>
</tr>
<tr>
<td style="padding: 1px; border: 1px solid rgb(0, 0, 0);">
</td>
<td style="padding: 1px; border: 1px solid rgb(0, 0, 0);">
</td>
<td style="padding: 1px; border: 1px solid rgb(0, 0, 0);">
</td>
<td style="padding: 1px; border: 1px solid rgb(0, 0, 0);">
</td>
</tr>
<tr>
<td style="padding: 1px; border: 1px solid rgb(0, 0, 0);">
</td>
<td style="padding: 1px; border: 1px solid rgb(0, 0, 0);">
</td>
<td style="padding: 1px; border: 1px solid rgb(0, 0, 0);">
</td>
<td style="padding: 1px; border: 1px solid rgb(0, 0, 0);">
</td>
</tr>
</tbody>
</table>
<br>
</div>
<div>
<br>
</div>
<div>
<br>
</div>
<div>
<br>
</div>
<div>
<br>
</div>
<div>
<br>
</div>
<div><br>
</div>
]]></ru>
<lv><![CDATA[ <lv><![CDATA[
<p>  cb <b>bbvcdjyfdyhyhdывепиwstdg</b></p> <p>  cb <b>bbvcdjyfdyhyhdывепиwstdg</b></p>
]]></lv> ]]></lv>

View File

@@ -533,12 +533,12 @@ if(isPhone){
/** @brief Флаг, указывающий, были ли изменения в контенте */ /** @brief Флаг, указывающий, были ли изменения в контенте */
window.contentIsEdit = false; window.contentIsEdit = false;
if (document.getElementById("content")) { if (document.querySelectorAll(".content").length) {
document.getElementById("content").addEventListener("input", function() { document.querySelectorAll(".content").forEach(el => {
window.contentIsEdit = true; el.addEventListener("input", () => window.contentIsEdit = true);
const observer = new MutationObserver(() => window.contentIsEdit = true);
observer.observe(el, { childList: true, subtree: true });
}); });
const observer = new MutationObserver(() => window.contentIsEdit = true);
observer.observe(document.getElementById("content"), { childList: true, subtree: true });
} }
/** @brief Очередь сообщений для отображения */ /** @brief Очередь сообщений для отображения */
@@ -738,8 +738,11 @@ let cou=1;
* @brief Показать/скрыть HTML-код страницы в textarea * @brief Показать/скрыть HTML-код страницы в textarea
*/ */
function showHtmlCode() { function showHtmlCode() {
let contents = document.getElementsByClassName("content");
if (cou==1) { if (cou==1) {
document.getElementById("tex").value=document.getElementById("content").innerHTML; let combined = "";
for (let i=0; i<contents.length; i++) combined += "<![CDATA[" + contents[i].innerHTML + "]]>";
document.getElementById("tex").value = combined;
document.getElementById("tex").value = decodeHtmlEntities(document.getElementById("tex").value); document.getElementById("tex").value = decodeHtmlEntities(document.getElementById("tex").value);
document.getElementById("tex").value = formatHTML(document.getElementById("tex").value); document.getElementById("tex").value = formatHTML(document.getElementById("tex").value);
let sbe=document.getElementsByClassName("sb"); let sbe=document.getElementsByClassName("sb");
@@ -754,11 +757,18 @@ function showHtmlCode() {
} }
cou=2; cou=2;
} else { } else {
document.getElementById("content").innerHTML=document.getElementById("tex").value; let text = document.getElementById("tex").value;
let split = text.match(/<!\[CDATA\[(.*?)\]\]>/gs);
if (split) {
for (let i=0; i<contents.length; i++) {
if (split[i]) contents[i].innerHTML = split[i].replace(/<!\[CDATA\[|\]\]>/g, '');
}
}
document.getElementById("tex").style.visibility="hidden"; document.getElementById("tex").style.visibility="hidden";
cou=1; cou=1;
} }
} }
window.showHtmlCode = showHtmlCode; window.showHtmlCode = showHtmlCode;
/** @brief Флаг нового состояния страницы при сохранении */ /** @brief Флаг нового состояния страницы при сохранении */
@@ -783,8 +793,10 @@ window.saveChanges = saveChanges;
*/ */
function saveContentId() { function saveContentId() {
if(cou==1) { if(cou==1) {
document.getElementById("content").innerHTML = decodeHtmlEntities(document.getElementById("content").innerHTML); let contents = document.getElementsByClassName("content");
document.getElementById("tex").value=document.getElementById("content").innerHTML; let combined = "";
for (let i = 0; i < contents.length; i++) combined += "<![CDATA[" + contents[i].innerHTML.trim() + "]]>";
document.getElementById("tex").value = combined;
} }
document.getElementById("tex").value = decodeHtmlEntities(document.getElementById("tex").value); document.getElementById("tex").value = decodeHtmlEntities(document.getElementById("tex").value);
let saveContentIdData = document.getElementById("tex").value.trim(); let saveContentIdData = document.getElementById("tex").value.trim();
@@ -796,8 +808,8 @@ function saveContentId() {
messageFunction("{{main_block_not_saved}}"); messageFunction("{{main_block_not_saved}}");
} }
}); });
} }
/** /**
* @brief Сохраняет данные подключённых плагинов (левой и правой колонок) * @brief Сохраняет данные подключённых плагинов (левой и правой колонок)
*/ */
@@ -897,11 +909,10 @@ function formatHTML(html) {
*/ */
window.saveContentIdHow = async function (currentPath) { window.saveContentIdHow = async function (currentPath) {
if (cou == 1) { if (cou == 1) {
document.getElementById("content").innerHTML = decodeHtmlEntities(document.getElementById("content").innerHTML); let contents = Array.from(document.getElementsByClassName("content")).map(el => el.innerHTML.trim());
document.getElementById("tex").value = document.getElementById("content").innerHTML; document.getElementById("tex").value = contents.map(c => `<![CDATA[${c}]]>`).join('');
} }
document.getElementById("tex").value = decodeHtmlEntities(document.getElementById("tex").value); let saveContentIdData = decodeHtmlEntities(document.getElementById("tex").value).trim();
let saveContentIdData = document.getElementById("tex").value.trim();
let nameFile = document.getElementById('saveHowName').value; let nameFile = document.getElementById('saveHowName').value;
if (!nameFile.endsWith('.page.php')) { if (!nameFile.endsWith('.page.php')) {
nameFile += '.page.php'; nameFile += '.page.php';
@@ -1315,17 +1326,47 @@ window.functionOpenPage = false;
function getPage(newPath) { function getPage(newPath) {
window.functionOpenPage = true; window.functionOpenPage = true;
jsonrpcRequest("getPage", { newPath }).then(page => { jsonrpcRequest("getPage", { newPath }).then(page => {
const centerFloat = document.querySelector('.center-float');
const oldBlocks = centerFloat.querySelectorAll('.bfloat');
oldBlocks.forEach(b => {
if (b.querySelector('.content')) {
const next = b.nextSibling;
if (next && next.nodeType === 1 && next.tagName === 'BR') next.remove();
if (next && next.nodeType === 3 && next.textContent.trim() === '') {
const next2 = next.nextSibling;
if (next2 && next2.nodeType === 1 && next2.tagName === 'BR') next2.remove();
}
b.remove();
}
});
page.content.forEach((c, i) => {
const placeholder = document.getElementById('news-placeholder');
if (i > 0) {
const br = document.createElement('br');
centerFloat.insertBefore(br, placeholder);
}
const block = document.createElement('div');
block.className = 'bfloat' + (i === 0 ? ' content1' : '');
block.style.fontSize = '1em';
const inner = document.createElement('div');
inner.className = 'content';
inner.innerHTML = c;
block.appendChild(inner);
centerFloat.insertBefore(block, placeholder);
});
document.getElementById("right-float").innerHTML = page.right; document.getElementById("right-float").innerHTML = page.right;
document.getElementById("left-float").innerHTML = page.left; document.getElementById("left-float").innerHTML = page.left;
document.getElementById("content").innerHTML = page.content;
document.getElementById("managerDiv").style.visibility = "hidden"; document.getElementById("managerDiv").style.visibility = "hidden";
// history.pushState(null, '', page.pagePath);
document.getElementById("mainTitle").innerHTML = "<i>{{new_file}}!</i>"; document.getElementById("mainTitle").innerHTML = "<i>{{new_file}}!</i>";
removePluginDom("manager") removePluginDom("manager");
}); });
window.newPageFunValue = ""; window.newPageFunValue = "";
} }
//обьявление функции для того, чтобы обращатся к ней из других файлов //обьявление функции для того, чтобы обращатся к ней из других файлов
window.getPage = getPage; window.getPage = getPage;
window.managerData = managerData; window.managerData = managerData;

View File

@@ -3,5 +3,13 @@
<sitename>RaspberryqePi</sitename> <sitename>RaspberryqePi</sitename>
<slogan>Raspberry Pi</slogan> <slogan>Raspberry Pi</slogan>
<index url='content/index' title='Sākuma lapa' name='index' template='rpi' PageMenu='0,1,2' users='' group=''> <index url='content/index' title='Sākuma lapa' name='index' template='rpi' PageMenu='0,1,2' users='' group=''>
<page1 url="content/rpi/index" title="Новый ф6нрцуеыкеа" name="page1" template="MedWait" PageMenu="0,1,2" users="" group="" news="" plugins="">
<underpage1 url="content/rpi/index" title="Загловок" name="underpage1" template="rpi" PageMenu="0,1,2" users="" group="" news="" plugins="">
</underpage1>
<underpage2 url="content/rpi/index" title="Загловок" name="underpage2" template="rpi" PageMenu="0,1,2" users="" group="" news="" plugins="SvgEditorM">
</underpage2>
<createSite url="data/createSite" title="Страница создание нового сайта" name="createSite" template="MedWait" PageMenu="0,1,2" users="" group="" news="" plugins="dgrm">
</createSite>
</page1>
</index> </index>
</site> </site>

View File

@@ -3,7 +3,7 @@
<sitename>site</sitename> <sitename>site</sitename>
<slogan>site</slogan> <slogan>site</slogan>
<index url="content/index" title="Новый ф6нрцуеыке" name="index" template="start" PageMenu="0,0" users="" group="" news="" plugins=""> <index url="content/index" title="Новый ф6нрцуеыке" name="index" template="start" PageMenu="0,0" users="" group="" news="" plugins="">
<page1 url="content/rpi/index" title="Новый фрцуеыкеа" name="page1" template="MedWait" PageMenu="0,1,2" users="" group="" news="" plugins=""> <page1 url="content/rpi/index" title="Новый файл" name="page1" template="MedWait" PageMenu="0,1,2" users="" group="" news="" plugins="dgrm,SvgEditorM,form_editor">
<underpage1 url="content/rpi/index" title="Загловок" name="underpage1" template="rpi" PageMenu="0,1,2" users="" group="" news="" plugins=""> <underpage1 url="content/rpi/index" title="Загловок" name="underpage1" template="rpi" PageMenu="0,1,2" users="" group="" news="" plugins="">
</underpage1> </underpage1>
<underpage2 url="content/rpi/index" title="Загловок" name="underpage2" template="rpi" PageMenu="0,1,2" users="" group="" news="" plugins="SvgEditorM"> <underpage2 url="content/rpi/index" title="Загловок" name="underpage2" template="rpi" PageMenu="0,1,2" users="" group="" news="" plugins="SvgEditorM">

View File

@@ -307,17 +307,6 @@ function GetBlock ($BlockVar, $side) {
} }
} }
return $Block; return $Block;
// $Block.='<div class="'.$BlockVar[$i]['bclass'].'"><div class="bcont">ku ku</div></div>';
/*is_countable($$BlockVar) && count($BlockVar)
$Block = "";
if (is_countable($$BlockVar) && count($BlockVar) > 0){
$Block = "true";
}
else{
$Block = "false";
}
$Block = count($BlockVar);*/
} }
@@ -769,14 +758,14 @@ if ($RURLstr!='error'){
function loadPluginsInCenterBlock() { function loadPluginsInCenterBlock() {
global $_SESSION, $path, $config; global $_SESSION, $path, $config;
if ($_SESSION['Login'] == 'true') { if ($_SESSION['Login'] == 'true') {
$availablePlugins = ['dgrm', 'SvgEditorM']; $availablePlugins = ['dgrm', 'SvgEditorM', 'form_editor'];
$pluginDir = $path . 'main_plugin/'; $pluginDir = $path . 'main_plugin/';
if (is_dir($pluginDir)) { if (is_dir($pluginDir)) {
$dirs = array_diff(scandir($pluginDir), ['.', '..']); $dirs = array_diff(scandir($pluginDir), ['.', '..']);
foreach ($dirs as $dir) { foreach ($dirs as $dir) {
if (is_dir($pluginDir . $dir)) { if (is_dir($pluginDir . $dir)) {
if (!in_array($dir, $availablePlugins) || strpos($config['page_plugins'] ?? '', $dir) !== false) { if (!in_array($dir, $availablePlugins) || strpos($config['page_plugins'] ?? '', $dir) !== false) {
if ($dir === 'SvgEditorM' || $dir === 'dgrm') { if ($dir === 'SvgEditorM' || $dir === 'dgrm' || $dir === 'form_editor') {
$html .= includePlugin(['plugin' => $dir]); $html .= includePlugin(['plugin' => $dir]);
} }
} }
@@ -784,7 +773,6 @@ function loadPluginsInCenterBlock() {
} }
} }
} }
$html .= includePlugin(['plugin' => 'form_editor']);
return $html; return $html;
} }
?> ?>

View File

@@ -0,0 +1,29 @@
<![CDATA[
<div>
test1цыкцып
</div>]]><![CDATA[
<div>
test2
</div>]]>
<![CDATA[
<div>
test1цыкцып
</div>]]><![CDATA[
<div>
test2
</div>]]>
Array
(
[0] => <div>
test1цыкцып
</div>
[1] => <div>
test2
</div>
)
<![CDATA[<div>
test1цыкцып
</div>]]><![CDATA[<div>
test2
</div>]]>

View File

@@ -7,7 +7,7 @@
/** @brief Путь к текущей директории */ /** @brief Путь к текущей директории */
$path = dirname(__FILE__) . '/'; $path = dirname(__FILE__) . '/';
/* if(isset($_SESSION)) { file_put_contents($path . '/error.txt', "" . PHP_EOL, FILE_APPEND); }*/ /* file_put_contents($path . '/error.txt', "" . PHP_EOL, FILE_APPEND); */
session_start(); session_start();
@@ -150,7 +150,7 @@ if ($access) {
$config['right'] = "<div id='right-float'>" . $config['right'] . "</div>"; $config['right'] = "<div id='right-float'>" . $config['right'] . "</div>";
$center = '<div class="center-float">' . GetBlock($xmlstr->cblock->block, 'center') . '<div>'; $center = '<div class="center-float">' . GetBlock($xmlstr->cblock->block, 'center') . '<div>';
$config['content'] = $xmlstr->content->{$config['lng']}; /* $config['content'] = $xmlstr->content->{$config['lng']}; */
} else { } else {
if ($_SESSION['log_in']) { if ($_SESSION['log_in']) {
$xmlstr = simplexml_load_file($path . 'content/adm/user.page.php'); $xmlstr = simplexml_load_file($path . 'content/adm/user.page.php');
@@ -161,7 +161,18 @@ if ($access) {
$config['left'] = ''; $config['left'] = '';
$config['right'] = ''; $config['right'] = '';
$center = '<div class="center-float">' . GetBlock($xmlstr->cblock->block, 'center') . '<div>'; $center = '<div class="center-float">' . GetBlock($xmlstr->cblock->block, 'center') . '<div>';
$config['content'] = $xmlstr->content->$config['lng']; /* $config['content'] = $xmlstr->content->{$config['lng']}; */
}
$xmlString = file_get_contents($path . $config['page_url'] . ".page.php");
preg_match('#<' . $config['lng'] . '>(.*?)</' . $config['lng'] . '>#s', $xmlString, $tagMatch);
$config['content'] = '';
if (preg_match_all('#<!\[CDATA\[(.*?)\]\]>#s', $tagMatch[1], $matches)) {
foreach ($matches[1] as $i => $cdata) {
if ($i > 0)
$config['content'] .= "<br>";
$config['content'] .= '<div class="%cfloat%' . ($i == 0 ? ' content1' : '') . '"><div class="content">' . $cdata . '</div></div>';
}
} }
foreach ($config as $key=>$value) if ($key!="request_url") foreach ($config as $key=>$value) if ($key!="request_url")
$config['content'] =str_replace('%'.$key.'%', $value, $config['content']); $config['content'] =str_replace('%'.$key.'%', $value, $config['content']);

View File

@@ -57,7 +57,7 @@ a {
} }
textarea { textarea {
text-align: center; /* text-align: center;
border: none;; border: none;;
padding: 10px; padding: 10px;
padding-top: 0.8em; padding-top: 0.8em;
@@ -69,7 +69,7 @@ a {
overflow: hidden; overflow: hidden;
resize: none; resize: none;
line-height: 1em; line-height: 1em;
caret-color: #fff; caret-color: #fff; */
} }
[data-connect] { display: none; } [data-connect] { display: none; }

View File

@@ -54,13 +54,13 @@ function basisVis() {
editableElementsFun(); editableElementsFun();
let basis3 = document.getElementById('basis3'); let basis3 = document.getElementById('basis3');
let sideFloatClass = basis3 ? basis3.querySelectorAll('[style*="visibility: visible;"]') : null; let sideFloatClass = basis3 ? basis3.querySelectorAll('[style*="visibility: visible;"]') : null;
if (!basis3 || !sideFloatClass || !editableElements || editableElements.length === 0) return; if (!basis3 || !sideFloatClass || !window.editableElements || window.editableElements.length === 0) return;
elementsСhecked = [basis3, ...sideFloatClass, ...editableElements]; let elementsСhecked = [basis3, ...sideFloatClass, ...window.editableElements];
if (basis3.style.visibility === "visible") { if (basis3.style.visibility === "visible") {
basis3.style.visibility = "hidden"; basis3.style.visibility = "hidden";
sessionStorage.setItem('basis3_visibility', 'hidden'); sessionStorage.setItem('basis3_visibility', 'hidden');
editableElements.forEach(function(element) { window.editableElements.forEach(function(element) {
if (element) { if (element) {
element.setAttribute("contenteditable", false); element.setAttribute("contenteditable", false);
} }
@@ -69,18 +69,18 @@ function basisVis() {
sideFloatClass.forEach(function(element) { sideFloatClass.forEach(function(element) {
element.style.visibility = "hidden"; element.style.visibility = "hidden";
}); });
for (let i = 0; i < editId.length; i++) { for (let i = 0; i < editId.length; i++) {
editMode = -1; editMode = -1;
if (document.getElementById(editId[i])) { if (document.getElementById(editId[i])) {
document.getElementById(editId[i]).classList.remove('active'); document.getElementById(editId[i]).classList.remove('active');
} }
} }
document.getElementById('bcbody').style.top = '0px'; document.getElementById('bcbody').style.top = '0px';
document.querySelectorAll('.bfloat').forEach(e=>e.style.fontSize='') document.querySelectorAll('.bfloat').forEach(e => e.style.fontSize = '')
} else { } else {
basis3.style.visibility = "visible"; basis3.style.visibility = "visible";
sessionStorage.setItem('basis3_visibility', 'visible'); sessionStorage.setItem('basis3_visibility', 'visible');
editableElements.forEach(function(element) { window.editableElements.forEach(function(element) {
if (element) { if (element) {
element.setAttribute("contenteditable", true); element.setAttribute("contenteditable", true);
} }
@@ -90,20 +90,20 @@ function basisVis() {
basis3.style.top = '20%'; basis3.style.top = '20%';
basis3.style.transform = 'translate(0%, -20%)'; basis3.style.transform = 'translate(0%, -20%)';
document.getElementById('bcbody').style.top = '30px'; document.getElementById('bcbody').style.top = '30px';
document.querySelectorAll('.bfloat').forEach(e=>e.style.fontSize='1em') document.querySelectorAll('.bfloat').forEach(e => e.style.fontSize = '1em')
} }
} }
window.basisVis = basisVis; window.basisVis = basisVis;
/** @brief Сбор всех редактируемых элементов */ /** @brief Сбор всех редактируемых элементов */
function editableElementsFun() { function editableElementsFun() {
let content = document.getElementById('content'); window.editableElements = [];
editableElements = document.querySelectorAll('.pluginEditable'); let contents = document.querySelectorAll('.content');
editableElements = Array.from(editableElements); let pluginEls = document.querySelectorAll('.pluginEditable');
editableElements.push(content); pluginEls = Array.from(pluginEls);
window.editableElements.push(...pluginEls, ...contents);
editableElements.forEach(function(element) { window.editableElements.forEach(function(element) {
if (!element) { if (!element) {
console.log("Element " + element + " not found."); console.log("Element " + element + " not found.");
return; return;
@@ -111,31 +111,28 @@ function editableElementsFun() {
}); });
} }
addEventListener("LoadeditorJs", function() addEventListener("LoadeditorJs", function()
{ {
let te=document.getElementById("tex"); // Ссылка на текстовое поле let te=document.getElementById("tex"); // Ссылка на текстовое поле
let tex=document.getElementById("tex"); // Ссылка на стили текстового поля let tex=document.getElementById("tex"); // Ссылка на стили текстового поля
if (document.getElementById("content") == "") { // Передаём содержимое пустых блоков в поле
te.value=document.getElementById("content").innerHTML; // Передача данных из области контента в текстовое поле document.querySelectorAll('.content').forEach(el => {
} if (!el.innerHTML) te.value = el.innerHTML;
});
// Символы клавиш со знаками препинания или перевода строки // Символы клавиш со знаками препинания или перевода строки
let symb = ["Enter", "!", "?", ";", ":", ",", ".", " ", "-", "'", "\"", "(", ")", "{", "}", "[", "]", "_", "&", "/", "\\", "*"]; let symb = ["Enter", "!", "?", ";", ":", ",", ".", " ", "-", "'", "\"", "(", ")", "{", "}", "[", "]", "_", "&", "/", "\\", "*"];
// Запись в память введенного текста при нажатии клавиши со знаком препинания или перевода строки // Запись в память введенного текста при нажатии клавиши со знаком препинания или перевода строки
if (document.getElementById("content")) { document.querySelectorAll('.content').forEach(el => {
document.getElementById("content").addEventListener("keyup", function(ev) el.addEventListener('keyup', ev => {
{ for (let i = 0; i < symb.length; i++) {
for(let i=0; i<symb.length; i++) if (symb[i] == ev.key) inter();
{ }
if(symb[i]==ev.key) });
inter(); });
}
});
}
let sel = document.getSelection(); let sel = document.getSelection();
function selInContenteditable(insertType) { function selInContenteditable(insertType) {
@@ -497,69 +494,74 @@ document.getElementById("newPage").addEventListener("click", newPageFun);
function newPageFun() { function newPageFun() {
document.getElementById("right-float").innerHTML = ""; document.getElementById("right-float").innerHTML = "";
document.getElementById("left-float").innerHTML = ""; document.getElementById("left-float").innerHTML = "";
document.getElementById("content").innerHTML = ""; document.querySelectorAll('.content').forEach(el => el.innerHTML = "");
document.getElementById("mainTitle").innerHTML = "<i>{{new_file}}!</i>"; document.getElementById("mainTitle").innerHTML = "<i>{{new_file}}!</i>";
window.newPageFunValue = "newPage"; window.newPageFunValue = "newPage";
document.getElementById("settingsMain_d").style.visibility="hidden"; document.getElementById("settingsMain_d").style.visibility="hidden";
} }
// Сохранение выделение // Сохранение выделение
document.addEventListener('selectionchange', () => { document.addEventListener('selectionchange', () => {
const content = document.getElementById('content'); const contents = document.querySelectorAll('.content');
if (!contents || contents.length === 0) return;
const sel = window.getSelection(); const sel = window.getSelection();
if (!sel.rangeCount) return; if (!sel.rangeCount) return;
const range = sel.getRangeAt(0); const range = sel.getRangeAt(0);
const startNode = range.startContainer; const startNode = range.startContainer;
if (content.contains(startNode)) { for (let content of contents) {
saveSelection(); if (content.contains(startNode)) {
saveSelection();
break;
}
} }
}); });
let savedSel = null; let savedSel = null;
function saveSelection() { function saveSelection() {
const content = document.getElementById('content'); const contents = document.querySelectorAll('.content');
const sel = window.getSelection(); const sel = window.getSelection();
if (!sel.rangeCount) return; if (!sel.rangeCount) return;
const range = sel.getRangeAt(0); const range = sel.getRangeAt(0);
if (!content.contains(range.commonAncestorContainer)) return; for (let content of contents) {
const pre = range.cloneRange(); if (content.contains(range.commonAncestorContainer)) {
pre.selectNodeContents(content); const pre = range.cloneRange();
pre.setEnd(range.startContainer, range.startOffset); pre.selectNodeContents(content);
const start = pre.toString().length; pre.setEnd(range.startContainer, range.startOffset);
const end = start + range.toString().length; const start = pre.toString().length;
savedSel = { start, end }; const end = start + range.toString().length;
savedSel = { start, end };
break;
}
}
} }
function restoreSelection() { function restoreSelection() {
if (!savedSel) return; if (!savedSel) return;
const content = document.getElementById('content'); const contents = document.querySelectorAll('.content');
const { start, end } = savedSel; const { start, end } = savedSel;
let charIndex = 0; let charIndex = 0;
const range = document.createRange(); const range = document.createRange();
range.setStart(content, 0); try {
range.collapse(true); for (const content of contents) {
try { range.setStart(content, 0);
(function traverse(node) { range.collapse(true);
if (node.nodeType === Node.TEXT_NODE) { (function traverse(node) {
const next = charIndex + node.length; if (node.nodeType === Node.TEXT_NODE) {
if (charIndex <= start && next >= start) { const next = charIndex + node.length;
range.setStart(node, start - charIndex); if (charIndex <= start && next >= start) range.setStart(node, start - charIndex);
} if (charIndex <= end && next >= end) {
if (charIndex <= end && next >= end) { range.setEnd(node, end - charIndex);
range.setEnd(node, end - charIndex); throw 'done';
throw 'done'; }
} charIndex = next;
charIndex = next; } else node.childNodes.forEach(traverse);
} else { })(content);
node.childNodes.forEach(traverse); }
} } catch (e) {}
})(content); const sel = window.getSelection();
} catch (e) {} sel.removeAllRanges();
const sel = window.getSelection(); sel.addRange(range);
sel.removeAllRanges();
sel.addRange(range);
} }
// Взаимодействие с плагинами // Взаимодействие с плагинами
@@ -1457,14 +1459,14 @@ const singleFormats = [
const specialFormats = ['butlink', 'linkdel', 'forma', 'col', 'backgr']; const specialFormats = ['butlink', 'linkdel', 'forma', 'col', 'backgr'];
addEventListener("LoadeditorJs", function() { addEventListener("LoadeditorJs", function() {
const content = document.getElementById('content'); const content = document.querySelectorAll('.content');
simpleFormats.forEach(f => { simpleFormats.forEach(f => {
document.getElementById(f.id).addEventListener('click', () => { document.getElementById(f.id).addEventListener('click', () => {
const sel = window.getSelection(); const sel = window.getSelection();
if (!sel.rangeCount) return; if (!sel.rangeCount) return;
const range = sel.getRangeAt(0); const range = sel.getRangeAt(0);
if (!content.contains(range.commonAncestorContainer)) return; if (![...document.querySelectorAll('.content')].some(c => c.contains(range.commonAncestorContainer))) return;
let all = true; let all = true;
const it = document.createNodeIterator( const it = document.createNodeIterator(
range.commonAncestorContainer, range.commonAncestorContainer,
@@ -1495,7 +1497,7 @@ divFormats.forEach(f => {
const sel = window.getSelection(); const sel = window.getSelection();
if (!sel.rangeCount) return; if (!sel.rangeCount) return;
const range = sel.getRangeAt(0); const range = sel.getRangeAt(0);
if (!content.contains(range.commonAncestorContainer)) return; if (![...document.querySelectorAll('.content')].some(c => c.contains(range.commonAncestorContainer))) return;
divApplyformat(range, f); divApplyformat(range, f);
inter(); inter();
}); });
@@ -1506,7 +1508,7 @@ listFormats.forEach(f => {
const sel = window.getSelection(); const sel = window.getSelection();
if (!sel.rangeCount) return; if (!sel.rangeCount) return;
const range = sel.getRangeAt(0); const range = sel.getRangeAt(0);
if (!content.contains(range.commonAncestorContainer)) return; if (![...document.querySelectorAll('.content')].some(c => c.contains(range.commonAncestorContainer))) return;
listApplyformat(range, f); listApplyformat(range, f);
inter(); inter();
}); });
@@ -1523,7 +1525,7 @@ singleFormats.forEach(f => {
const sel = window.getSelection() const sel = window.getSelection()
if (!sel.rangeCount) return if (!sel.rangeCount) return
const range = sel.getRangeAt(0) const range = sel.getRangeAt(0)
if (!content.contains(range.commonAncestorContainer)) return if (![...document.querySelectorAll('.content')].some(c => c.contains(range.commonAncestorContainer))) return;
singleApplyformat(range, f) singleApplyformat(range, f)
inter() inter()
}) })
@@ -1534,7 +1536,7 @@ specialFormats.forEach(f => {
const sel = window.getSelection(); const sel = window.getSelection();
if (!sel.rangeCount) return; if (!sel.rangeCount) return;
const range = sel.getRangeAt(0); const range = sel.getRangeAt(0);
if (!content.contains(range.commonAncestorContainer)) return; if (![...content].some(c => c.contains(range.commonAncestorContainer))) return;
if (typeof document[f + 'Fun'] === 'function') document[f + 'Fun'](range); if (typeof document[f + 'Fun'] === 'function') document[f + 'Fun'](range);
else window[f + 'Fun'](range); else window[f + 'Fun'](range);
inter(); inter();
@@ -1543,10 +1545,13 @@ specialFormats.forEach(f => {
const events = ['pointerup','keyup','input','focus','blur','click']; const events = ['pointerup','keyup','input','focus','blur','click'];
events.forEach(evt => { events.forEach(evt => {
if (!content) return; const contents = document.querySelectorAll('.content');
content.addEventListener(evt, () => { if (!contents || contents.length === 0) return;
updateToolbarStyles(); contents.forEach(content => {
updateSingleSelectors(); content.addEventListener(evt, () => {
updateToolbarStyles();
updateSingleSelectors();
});
}); });
}); });
@@ -1561,36 +1566,42 @@ let currentIndex = 0
/** @brief Сохраняет текущее состояние контента, если оно изменилось */ /** @brief Сохраняет текущее состояние контента, если оно изменилось */
function inter() { function inter() {
const editable = document.getElementById("content") const editables = document.querySelectorAll(".content")
if (editable) { editables.forEach(editable => {
let currentContent = editable.innerHTML if (editable) {
if (currentContent !== arr[currentIndex]) { let currentContent = editable.innerHTML
currentIndex++ if (currentContent !== arr[currentIndex]) {
arr = arr.slice(0, currentIndex) currentIndex++
arr.push(currentContent) arr = arr.slice(0, currentIndex)
arr.push(currentContent)
}
} }
} })
} }
if (document.getElementById("content")) { document.querySelectorAll(".content").forEach((editable, i) => {
arr[0] = document.getElementById("content").innerHTML if (i === 0) arr[0] = editable.innerHTML
} })
document.getElementById("forw").addEventListener("click", function() { document.getElementById("forw").addEventListener("click", function() {
if (currentIndex < arr.length - 1) { if (currentIndex < arr.length - 1) {
currentIndex++ currentIndex++
const editable = document.getElementById("content") const editables = document.querySelectorAll(".content")
editable.innerHTML = arr[currentIndex] editables.forEach(editable => {
editable.setAttribute("contenteditable", "true") editable.innerHTML = arr[currentIndex]
editable.setAttribute("contenteditable", "true")
})
} }
}) })
document.getElementById("bac").addEventListener("click", function() { document.getElementById("bac").addEventListener("click", function() {
if (currentIndex > 0) { if (currentIndex > 0) {
currentIndex-- currentIndex--
const editable = document.getElementById("content") const editables = document.querySelectorAll(".content")
editable.innerHTML = arr[currentIndex] editables.forEach(editable => {
editable.setAttribute("contenteditable", "true") editable.innerHTML = arr[currentIndex]
editable.setAttribute("contenteditable", "true")
})
} }
}) })
@@ -1785,8 +1796,10 @@ function divApplyformat(range, format) {
range.compareBoundaryPoints(Range.START_TO_END, er) > 0; range.compareBoundaryPoints(Range.START_TO_END, er) > 0;
}; };
Array.from(content.children).forEach(child => { Array.from(document.querySelectorAll('.content')).forEach(content => {
if (intersects(child)) externals.add(child); Array.from(content.children).forEach(child => {
if (intersects(child)) externals.add(child);
});
}); });
externals.forEach(div => { externals.forEach(div => {
@@ -1811,8 +1824,10 @@ function listApplyformat(range, format) {
if (type === 'listNone') { if (type === 'listNone') {
const lists = new Set(); const lists = new Set();
Array.from(content.querySelectorAll('li')).forEach(li => { Array.from(document.querySelectorAll('.content')).forEach(content => {
if (intersects(li)) lists.add(li.parentNode); Array.from(content.querySelectorAll('li')).forEach(li => {
if (intersects(li)) lists.add(li.parentNode);
});
}); });
lists.forEach(list => { lists.forEach(list => {
@@ -1849,31 +1864,33 @@ function listApplyformat(range, format) {
parent.removeChild(list); parent.removeChild(list);
}); });
} else { } else {
const items = Array.from(content.children).filter(child => intersects(child)); Array.from(document.querySelectorAll('.content')).forEach(content => {
if (!items.length) return; const items = Array.from(content.children).filter(child => intersects(child));
if (!items.length) return;
let listEl; let listEl;
if (type === 'listNumbers' || type === 'listLetters') { if (type === 'listNumbers' || type === 'listLetters') {
listEl = document.createElement('ol'); listEl = document.createElement('ol');
listEl.style.listStyleType = format.style.listStyleType; listEl.style.listStyleType = format.style.listStyleType;
} else {
listEl = document.createElement('ul');
listEl.style.listStyleType = format.style.listStyleType;
}
content.insertBefore(listEl, items[0]);
items.forEach(node => {
if (node.tagName === 'UL' || node.tagName === 'OL') {
Array.from(node.children).forEach(li => {
listEl.appendChild(li);
});
content.removeChild(node);
} else { } else {
const li = document.createElement('li'); listEl = document.createElement('ul');
content.removeChild(node); listEl.style.listStyleType = format.style.listStyleType;
li.appendChild(node);
listEl.appendChild(li);
} }
content.insertBefore(listEl, items[0]);
items.forEach(node => {
if (node.tagName === 'UL' || node.tagName === 'OL') {
Array.from(node.children).forEach(li => {
listEl.appendChild(li);
});
content.removeChild(node);
} else {
const li = document.createElement('li');
content.removeChild(node);
li.appendChild(node);
listEl.appendChild(li);
}
});
}); });
} }
} }
@@ -1959,32 +1976,36 @@ function formaFun(range) {
return range.compareBoundaryPoints(Range.END_TO_START, er) < 0 return range.compareBoundaryPoints(Range.END_TO_START, er) < 0
&& range.compareBoundaryPoints(Range.START_TO_END, er) > 0; && range.compareBoundaryPoints(Range.START_TO_END, er) > 0;
}; };
Array.from(content.children).forEach(child => { Array.from(document.querySelectorAll('.content')).forEach(content => {
if (intersects(child)) externals.add(child); Array.from(content.children).forEach(child => {
if (intersects(child)) externals.add(child);
});
}); });
externals.forEach(el => { externals.forEach(el => {
el.style.textAlign = ''; el.style.textAlign = '';
}); });
const itList = document.createNodeIterator( Array.from(document.querySelectorAll('.content')).forEach(content => {
content, const itList = document.createNodeIterator(
NodeFilter.SHOW_ELEMENT, content,
{ NodeFilter.SHOW_ELEMENT,
acceptNode: n => {
(n.tagName === 'UL' || n.tagName === 'OL') && acceptNode: n =>
range.intersectsNode(n) (n.tagName === 'UL' || n.tagName === 'OL') &&
? NodeFilter.FILTER_ACCEPT range.intersectsNode(n)
: NodeFilter.FILTER_REJECT ? NodeFilter.FILTER_ACCEPT
: NodeFilter.FILTER_REJECT
}
);
let listEl;
while (listEl = itList.nextNode()) {
const parent = listEl.parentNode;
Array.from(listEl.children).forEach(li => {
while (li.firstChild) parent.insertBefore(li.firstChild, listEl);
});
parent.removeChild(listEl);
} }
); });
let listEl;
while (listEl = itList.nextNode()) {
const parent = listEl.parentNode;
Array.from(listEl.children).forEach(li => {
while (li.firstChild) parent.insertBefore(li.firstChild, listEl);
});
parent.removeChild(listEl);
}
function unwrapAllSpansAndLinks(node) { function unwrapAllSpansAndLinks(node) {
const frag = document.createDocumentFragment(); const frag = document.createDocumentFragment();
@@ -2079,7 +2100,7 @@ function detectFormatState(format) {
const sel = window.getSelection(); const sel = window.getSelection();
if (!sel.rangeCount) return 'none'; if (!sel.rangeCount) return 'none';
const range = sel.getRangeAt(0); const range = sel.getRangeAt(0);
if (!content.contains(range.commonAncestorContainer)) return 'none'; if (![...document.querySelectorAll('.content')].some(c => c.contains(range.commonAncestorContainer))) return 'none';
const it = document.createNodeIterator( const it = document.createNodeIterator(
range.commonAncestorContainer, range.commonAncestorContainer,
NodeFilter.SHOW_TEXT, NodeFilter.SHOW_TEXT,
@@ -2091,7 +2112,7 @@ function detectFormatState(format) {
if (!text) continue; if (!text) continue;
total++; total++;
let cur = node.parentElement, ok = false; let cur = node.parentElement, ok = false;
while (cur && cur !== content) { while (cur && ![...document.querySelectorAll('.content')].includes(cur)) {
const fmt = simpleFormats.find(f => f.id === format); const fmt = simpleFormats.find(f => f.id === format);
const v = fmt ? getComputedStyle(cur)[fmt.prop] || '' : ''; const v = fmt ? getComputedStyle(cur)[fmt.prop] || '' : '';
if (fmt && fmt.test(v)) { ok = true; break; } if (fmt && fmt.test(v)) { ok = true; break; }
@@ -2128,7 +2149,7 @@ function detectSingleState(format) {
const sel = window.getSelection(); const sel = window.getSelection();
if (!sel.rangeCount) return ''; if (!sel.rangeCount) return '';
const range = sel.getRangeAt(0); const range = sel.getRangeAt(0);
if (!content.contains(range.commonAncestorContainer)) return ''; if (![...document.querySelectorAll('.content')].some(c => c.contains(range.commonAncestorContainer))) return '';
const it = document.createNodeIterator( const it = document.createNodeIterator(
range.commonAncestorContainer, range.commonAncestorContainer,
NodeFilter.SHOW_TEXT, NodeFilter.SHOW_TEXT,
@@ -2263,7 +2284,7 @@ document.querySelectorAll('.align-dropdown-text').forEach(dropdown => {
const sel = window.getSelection() const sel = window.getSelection()
if (sel.rangeCount) { if (sel.rangeCount) {
const range = sel.getRangeAt(0) const range = sel.getRangeAt(0)
if (content.contains(range.commonAncestorContainer)) { if ([...document.querySelectorAll('.content')].some(c => c.contains(range.commonAncestorContainer))) {
singleApplyformat(range, f) singleApplyformat(range, f)
inter() inter()
} }

View File

@@ -15,22 +15,19 @@ function savePageCenterBlock($params) {
$saveContentIdXml = $path . $_SESSION['page_url'] . ".page.php"; $saveContentIdXml = $path . $_SESSION['page_url'] . ".page.php";
$saveContentIdData = $params['saveContentIdData'] ?? ''; $saveContentIdData = $params['saveContentIdData'] ?? '';
$file = @simplexml_load_file($saveContentIdXml);
$node = $file->content->{$_SESSION['lng']};
$file->content->{$_SESSION['lng']} = ''; $xml = file_get_contents($saveContentIdXml);
$node = dom_import_simplexml($node); $xml = preg_replace('#<' . $_SESSION['lng'] . '>.*?</' . $_SESSION['lng'] . '>#s', '<' . $_SESSION['lng'] . '></' . $_SESSION['lng'] . '>', $xml);
$doc = $node->ownerDocument;
$appended = $node->appendChild($doc->createCDATASection("\n" . $saveContentIdData . "\n"));
$saved = $file->asXML($saveContentIdXml);
if ($appended && $saved) { if (preg_match('#<' . $_SESSION['lng'] . '>#', $xml, $pos)) {
return 'true'; $xml = preg_replace('#(<' . $_SESSION['lng'] . '>)#', '$1' . "\n" . $saveContentIdData . "\n", $xml, 1);
} }
if (file_put_contents($saveContentIdXml, $xml) !== false) return 'true';
throw new Exception("Problem saving content", -32003); throw new Exception("Problem saving content", -32003);
} }
/** /**
* @brief Сохраняет левый и правый блоки страницы * @brief Сохраняет левый и правый блоки страницы
* @param array $params Массив с данными блоков, ключ 'floatsBlock' содержит массив левых и правых блоков * @param array $params Массив с данными блоков, ключ 'floatsBlock' содержит массив левых и правых блоков
@@ -130,39 +127,33 @@ function saveHowPageContent($params) {
$_SESSION['page_url'] = $params['page_url'] . str_replace('.page.php', '', $params['nameFile']); $_SESSION['page_url'] = $params['page_url'] . str_replace('.page.php', '', $params['nameFile']);
$filePath = $path . $params['page_url'] . $params['nameFile']; $filePath = $path . $params['page_url'] . $params['nameFile'];
$contentData = $params['saveContentIdData'] ?? ''; $contentData = html_entity_decode($params['saveContentIdData'] ?? '', ENT_QUOTES, 'UTF-8');
$file = simplexml_load_file($filePath);
$langNode = $file->content->{$_SESSION['lng']}; $xml = file_get_contents($filePath);
$file->content->{$_SESSION['lng']} = ''; $xml = preg_replace('#<' . $_SESSION['lng'] . '>.*?</' . $_SESSION['lng'] . '>#s', '<' . $_SESSION['lng'] . '></' . $_SESSION['lng'] . '>', $xml);
$node = dom_import_simplexml($langNode); $xml = preg_replace('#(<' . $_SESSION['lng'] . '>)#', "$1\n" . $contentData . "\n", $xml, 1);
$doc = $node->ownerDocument;
$node->appendChild($doc->createCDATASection("\n" . $contentData . "\n")); $xml = preg_replace('#<rblock>.*?</rblock>#s', '<rblock></rblock>', $xml);
$xml = preg_replace('#<lblock>.*?</lblock>#s', '<lblock></lblock>', $xml);
$file->rblock = '';
$file->lblock = '';
$blocks = $params['floatsBlock'] ?? []; $blocks = $params['floatsBlock'] ?? [];
$titles = $params['title'] ?? []; $titles = $params['title'] ?? [];
$urls = $params['pluginUrl'] ?? []; $urls = $params['pluginUrl'] ?? [];
$tclasses = $params['tclass'] ?? []; $tclasses = $params['tclass'] ?? [];
$bclasses = $params['bclass'] ?? []; $bclasses = $params['bclass'] ?? [];
foreach ($blocks as $i => $blockName) { foreach ($blocks as $i => $blockName) {
$newBlock = $file->$blockName->addChild('block'); $url = htmlspecialchars($urls[$i] ?? '', ENT_QUOTES, 'UTF-8');
$newBlock->addAttribute('url', htmlspecialchars($urls[$i] ?? '', ENT_QUOTES,'UTF-8')); $title = htmlspecialchars($titles[$i] ?? '', ENT_QUOTES, 'UTF-8');
$newBlock->addAttribute('title', htmlspecialchars($titles[$i] ?? '', ENT_QUOTES,'UTF-8')); $tclass = htmlspecialchars($tclasses[$i] ?? '', ENT_QUOTES, 'UTF-8');
$newBlock->addAttribute('tclass',htmlspecialchars($tclasses[$i] ?? '',ENT_QUOTES,'UTF-8')); $bclass = htmlspecialchars($bclasses[$i] ?? '', ENT_QUOTES, 'UTF-8');
$newBlock->addAttribute('bclass',htmlspecialchars($bclasses[$i] ?? '',ENT_QUOTES,'UTF-8'));
$blockXml = '<block url="' . $url . '" title="' . $title . '" tclass="' . $tclass . '" bclass="' . $bclass . '"/>';
$xml = preg_replace('#<' . $blockName . '>#', '<' . $blockName . '>' . "\n" . $blockXml, $xml, 1);
} }
$dom = new DOMDocument('1.0','UTF-8'); if (file_put_contents($filePath, $xml) !== false) return 'true';
$dom->preserveWhiteSpace = false; throw new Exception("Failed to save content", -32003);
$dom->formatOutput = true;
$dom->loadXML($file->asXML());
$saved = $dom->save($filePath);
if ($saved === false) {
throw new Exception("Failed to save content", -32003);
}
return 'true';
} }
/** /**
@@ -184,11 +175,12 @@ function createNewPage($params) {
} }
$file = simplexml_load_file($saveContentIdXml); $file = simplexml_load_file($saveContentIdXml);
$node = $file->content->{$_SESSION['lng']}; foreach ($file->content->{$_SESSION['lng']} as $node) {
$file->content->{$_SESSION['lng']} = ''; $node = dom_import_simplexml($node);
$node = dom_import_simplexml($node); $no = $node->ownerDocument;
$no = $node->ownerDocument; while ($node->firstChild) $node->removeChild($node->firstChild);
$node->appendChild($no->createCDATASection("\n" . $saveContentIdData . "\n")); $node->appendChild($no->createCDATASection("\n" . $saveContentIdData . "\n"));
}
$saved = $file->asXML($saveContentIdXml); $saved = $file->asXML($saveContentIdXml);
if ($saved === false) { if ($saved === false) {

View File

@@ -252,9 +252,17 @@ function getPage($params) {
} }
$page = []; $page = [];
$page['right'] = GetBlock($pageXml->rblock->block, 'right'); $page['right'] = GetBlock($pageXml->rblock->block, 'right');
$page['left'] = GetBlock($pageXml->lblock->block, 'left'); $page['left'] = GetBlock($pageXml->lblock->block, 'left');
$page['content'] = (string)$pageXml->content->{$_SESSION['lng']};
$xmlContent = file_get_contents($file);
$lng = $_SESSION['lng'];
preg_match('#<' . $lng . '>(.*?)</' . $lng . '>#s', $xmlContent, $block);
$langBlock = $block[1] ?? '';
preg_match_all('#<!\[CDATA\[(.*?)\]\]>#s', $langBlock, $matches);
$contents = $matches[1] ?? [];
$page['content'] = $contents;
$_SESSION['page_url'] = $rel; $_SESSION['page_url'] = $rel;
session_write_close(); session_write_close();
return $page; return $page;

View File

@@ -993,7 +993,7 @@ function treePropertiesDiv() {
inputHtml = `<input type="text" value="${value}" style="font-size: inherit;" readonly disabled>`; inputHtml = `<input type="text" value="${value}" style="font-size: inherit;" readonly disabled>`;
} else if (key.toLowerCase() === "plugins") { } else if (key.toLowerCase() === "plugins") {
let plugins = (value || '').split(','); let plugins = (value || '').split(',');
let allPlugins = ['dgrm','SvgEditorM']; let allPlugins = ['dgrm','SvgEditorM', 'form_editor'];
inputHtml = allPlugins.map(p => inputHtml = allPlugins.map(p =>
`<label><input type="checkbox" value="${p}"${plugins.includes(p)?' checked':''}>${p}</label>` `<label><input type="checkbox" value="${p}"${plugins.includes(p)?' checked':''}>${p}</label>`
).join(' '); ).join(' ');

View File

@@ -187,12 +187,15 @@ ul, ol {
.bfloat { .bfloat {
overflow-x: hidden; overflow-x: hidden;
left: -1px; left: -1px;
top: -1px;
position: relative; position: relative;
border-radius: 0 0 10px 10px; border-radius: 10px;
padding: 10px; padding: 10px;
font-size: 1em; font-size: 1em;
} }
.content1 {
top: -1px;
border-radius: 0 0 10px 10px;
}
.cfloat { .cfloat {
left: -1px; left: -1px;
@@ -228,11 +231,11 @@ ul, ol {
font-weight: bold; font-weight: bold;
} }
#content { #content, .content {
overflow-x: hidden; overflow-x: hidden;
overflow-y: hidden; overflow-y: hidden;
} }
#content td { #content td, .content td {
height: 19px; height: 19px;
} }
#editor a { #editor a {

View File

@@ -14,9 +14,7 @@
<div class="%ctitle%" id="mainTitle"> <div class="%ctitle%" id="mainTitle">
%title% %title%
</div> </div>
<div class="%cfloat%"> %content%
<div id="content">%content%</div>
</div>
</div> </div>
%left% %left%
%right% %right%

View File

@@ -27,8 +27,6 @@
<div class="%ctitle%" id="mainTitle"> <div class="%ctitle%" id="mainTitle">
%title% %title%
</div> </div>
<div class="%cfloat%"> %content%
<div id="content">%content%</div>
</div>
</div> </div>
</div> </div>

View File

@@ -27,8 +27,6 @@
<div class="%ctitle%" id="mainTitle"> <div class="%ctitle%" id="mainTitle">
%title% %title%
</div> </div>
<div class="%cfloat%"> %content%
<div id="content">%content%</div>
</div>
</div> </div>
</div> </div>

View File

@@ -27,8 +27,6 @@
<div class="%ctitle%" id="mainTitle"> <div class="%ctitle%" id="mainTitle">
%title% %title%
</div> </div>
<div class="%cfloat%"> %content%
<div id="content">%content%</div>
</div>
</div> </div>
</div> </div>

View File

@@ -27,8 +27,6 @@
<div class="%ctitle%" id="mainTitle"> <div class="%ctitle%" id="mainTitle">
%title% %title%
</div> </div>
<div class="%cfloat%"> %content%
<div id="content">%content%</div>
</div>
</div> </div>
</div> </div>

View File

@@ -27,8 +27,6 @@
<div class="%ctitle%" id="mainTitle"> <div class="%ctitle%" id="mainTitle">
%title% %title%
</div> </div>
<div class="%cfloat%"> %content%
<div id="content">%content%</div>
</div>
</div> </div>
</div> </div>

View File

@@ -23,7 +23,5 @@
<div class="%ctitle%" id="mainTitle"> <div class="%ctitle%" id="mainTitle">
%title% %title%
</div> </div>
<div class="%cfloat%"> %content%
<div id="content">%content%</div>
</div>
</div> </div>

View File

@@ -49,9 +49,7 @@
<div class="%ctitle%" id="mainTitle"> <div class="%ctitle%" id="mainTitle">
%title% %title%
</div> </div>
<div class="%cfloat%"> %content%
<div id="content">%content%</div>
</div>
</div> </div>
</div> </div>

View File

@@ -28,9 +28,7 @@
<div class="%ctitle%" id="mainTitle"> <div class="%ctitle%" id="mainTitle">
%title% %title%
</div> </div>
<div class="%cfloat%"> %content%
<div id="content">%content%</div>
</div>
</div> </div>
</div> </div>

View File

@@ -49,9 +49,7 @@
<div class="%ctitle%" id="mainTitle"> <div class="%ctitle%" id="mainTitle">
%title% %title%
</div> </div>
<div class="%cfloat%"> %content%
<div id="content">%content%</div>
</div>
</div> </div>
</div> </div>

View File

@@ -26,9 +26,7 @@
<div class="%ctitle%" id="mainTitle"> <div class="%ctitle%" id="mainTitle">
%title% %title%
</div> </div>
<div class="%cfloat%"> %content%
<div id="content">%content%</div>
</div>
</div> </div>
</div> </div>