1 Commits

25 changed files with 1315 additions and 178 deletions

View File

@@ -0,0 +1,113 @@
<?xml version="1.0" encoding="utf-8"?>
<page>
<general>
<!--Kлючевые слова-->
<keywords>
</keywords>
<!--Условия доступа-->
<access>
<read>
<users>
</users>
<groups>
</groups>
</read>
<edit>
<users>
</users>
<groups>
</groups>
</edit>
</access>
</general>
<!--Содержание страницы-->
<!--Основное меню-->
<mainmenu>
<item name="имя" url="урл" title="описание">
</item>
</mainmenu>
<!--Текст страницы-->
<content tclass="btitle" bclass="bfloat">
<ru>
<![CDATA[<div>
<h3>
Markdown
</h3>
<textarea id="md" style="width:100%; height:300px;">
# Заголовок
Тестовый абзац текста.
Здесь есть **жирный текст**, *курсив*, `моноширинный текст`.
Ссылка: [Перейти](https://example.com)
Список:
- пункт один
- пункт два
- пункт три
</textarea>
</div>
]]>
<![CDATA[<div>
<h3>
HTML
</h3>
<div id="html" style="width:100%; height:300px; border:1px solid #ccc; padding:5px; overflow:auto;">
<h1>
Заголовок
</h1>
<p>
Тестовый абзац текста.
Здесь есть
<strong>
жирный текст
</strong>
,
<em>
курсив
</em>
,
<code>
моноширинный текст
</code>
.
</p>
<p>
Ссылка:
<a href="https://example.com">
Перейти
</a>
</p>
<p>
Список:
</p>
<ul>
<li>
пункт один
</li>
<li>
пункт два
</li>
<li>
пункт три
</li>
</ul>
</div>
</div>
<script>
function updateHtml() {
document.getElementById('html').innerHTML = marked.parse(document.getElementById('md').value);
}
document.getElementById('md').addEventListener('input', updateHtml);
window.addEventListener('DOMContentLoaded', updateHtml);
</script>
]]>
</ru>
<lv><![CDATA[
<p>Uz šo brīdi šeit ne kā nav</p>
]]></lv>
<en><![CDATA[
<p>??????</p>
]]></en>
</content>
<rblock/>
<lblock/>
</page>

View File

@@ -18,6 +18,8 @@
test1цыуквацыфавп test1цыуквацыфавп
</div>]]><![CDATA[<div> </div>]]><![CDATA[<div>
test2 test2
</div>]]><![CDATA[<div>
test2
</div>]]> </div>]]>
</ru> </ru>
<lv><![CDATA[ <lv><![CDATA[

View File

@@ -32,6 +32,7 @@ window.touchY = 0;
* @return Promise Разрешается после загрузки всех скриптов плагина * @return Promise Разрешается после загрузки всех скриптов плагина
*/ */
function includePlugin(plugin) { function includePlugin(plugin) {
console.log(plugin)
return jsonrpcRequest("includePlugin", { plugin }) return jsonrpcRequest("includePlugin", { plugin })
.then(html => { .then(html => {
const div = document.createElement('div'); const div = document.createElement('div');
@@ -737,39 +738,82 @@ let cou=1;
/** /**
* @brief Показать/скрыть HTML-код страницы в textarea * @brief Показать/скрыть HTML-код страницы в textarea
*/ */
function showHtmlCode() { let lastType = 'html';
let contents = document.getElementsByClassName("content"); function showCode(type) {
if (cou==1) { let contents = document.getElementsByClassName("content");
let combined = ""; let tex = document.getElementById("tex");
for (let i=0; i<contents.length; i++) combined += "<![CDATA[" + contents[i].innerHTML + "]]>"; if (cou == 1) {
document.getElementById("tex").value = combined; let combined = "";
document.getElementById("tex").value = decodeHtmlEntities(document.getElementById("tex").value); for (let i = 0; i < contents.length; i++) {
document.getElementById("tex").value = formatHTML(document.getElementById("tex").value); combined += "<![CDATA[" + contents[i].innerHTML + "]]>";
let sbe=document.getElementsByClassName("sb"); }
for(let i=0; i<sbe.length; i++) { tex.value = combined;
if (sbe[i] != document.getElementById("tex")) tex.value = decodeHtmlEntities(tex.value);
sbe[i].style.visibility="hidden"; if (type === 'html') {
} tex.value = formatHTML(tex.value);
if (document.getElementById("tex").style.visibility=="hidden") { } else if (type === 'marked') {
document.getElementById("tex").style.visibility="visible"; tex.value = marked.parse(tex.value);
} else { }
document.getElementById("tex").style.visibility="hidden"; let sbe = document.getElementsByClassName("sb");
} for (let i = 0; i < sbe.length; i++) {
cou=2; if (sbe[i] != tex) sbe[i].style.visibility = "hidden";
} else { }
let text = document.getElementById("tex").value; tex.style.visibility = tex.style.visibility == "hidden" ? "visible" : "hidden";
let split = text.match(/<!\[CDATA\[(.*?)\]\]>/gs); lastType = type;
if (split) { cou = 2;
for (let i=0; i<contents.length; i++) { } else {
if (split[i]) contents[i].innerHTML = split[i].replace(/<!\[CDATA\[|\]\]>/g, ''); let text = tex.value;
} let split = text.match(/<!\[CDATA\[(.*?)\]\]>/gs);
} const centerFloat = document.querySelector('.center-float');
document.getElementById("tex").style.visibility="hidden"; if (!centerFloat) return;
cou=1; let need = split ? split.length : 1;
} let floats = centerFloat.getElementsByClassName('bfloat');
while (floats.length < need) {
let bf = document.createElement('div');
bf.className = 'bfloat';
if (floats.length > 0) bf.style.borderRadius = "10px";
let c = document.createElement('div');
c.className = 'content';
c.contentEditable = 'true';
centerFloat.appendChild(bf);
bf.appendChild(c);
centerFloat.appendChild(document.createElement('br'));
floats = centerFloat.getElementsByClassName('bfloat');
}
while (floats.length > need) {
let next = floats[floats.length - 1].nextSibling;
if (next && next.tagName === 'BR') centerFloat.removeChild(next);
centerFloat.removeChild(floats[floats.length - 1]);
floats = centerFloat.getElementsByClassName('bfloat');
}
contents = centerFloat.getElementsByClassName("content");
if (split) {
for (let i = 0; i < need; i++) {
let val = split[i] ? split[i].replace(/<!\[CDATA\[|\]\]>/g, '') : '';
if (lastType === 'marked') val = '<div>' + marked.parse(val.replace(/^\s*<div[^>]*>|<\/div>\s*$/g, '')) + '</div>';
contents[i].innerHTML = val;
}
} else {
let val = text;
if (lastType === 'marked') val = '<div>' + marked.parse(val.replace(/^\s*<div[^>]*>|<\/div>\s*$/g, '')) + '</div>';
contents[0].innerHTML = val;
}
let children = Array.from(centerFloat.children);
for (let i = 0; i < children.length - 1; i++) {
let current = children[i];
let next = children[i + 1];
if (current.id !== 'mainTitle' && current.classList.contains('bfloat')) {
if (!(next && next.tagName === 'BR')) {
let br = document.createElement('br');
centerFloat.insertBefore(br, next);
}
}
}
tex.style.visibility = "hidden";
cou = 1;
}
} }
window.showCode = showCode;
window.showHtmlCode = showHtmlCode;
/** @brief Флаг нового состояния страницы при сохранении */ /** @brief Флаг нового состояния страницы при сохранении */
window.newPageFunValue = ""; window.newPageFunValue = "";
@@ -1348,8 +1392,10 @@ function getPage(newPath) {
centerFloat.insertBefore(br, placeholder); centerFloat.insertBefore(br, placeholder);
} }
const block = document.createElement('div'); const block = document.createElement('div');
block.className = 'bfloat' + (i === 0 ? ' content1' : ''); block.className = 'bfloat';
block.style.fontSize = '1em'; block.style.fontSize = '1em';
if (i !== 0) block.style.borderRadius = '10px';
const inner = document.createElement('div'); const inner = document.createElement('div');
inner.className = 'content'; inner.className = 'content';
inner.innerHTML = c; inner.innerHTML = c;

View File

@@ -2,18 +2,20 @@
<site> <site>
<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="">
<page1 url="content/rpi/index" title="Новый файл" name="page1" template="MedWait" PageMenu="0,1,2" users="" group="" news="" plugins="dgrm,SvgEditorM,form_editor"> <page1 url="content/rpi/index" title="Новый файл" name="page1" template="MedWait" PageMenu="0,1,2" users="" group="" news="">
<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="">
</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="">
</underpage2> </underpage2>
<createSite url="data/createSite" title="Страница создание нового сайта" name="createSite" template="MedWait" PageMenu="0,1,2" users="" group="" news="" plugins="dgrm"> <createSite url="data/createSite" title="Страница создание нового сайта" name="createSite" template="MedWait" PageMenu="0,1,2" users="" group="" news="">
</createSite> </createSite>
</page1> </page1>
<page2 url="content/index" title="Загловок" name="page2" template="rpi" PageMenu="0,1,2" users="" group="" news="" plugins="dgrm,SvgEditorM"> <page2 url="content/index" title="Загловок" name="page2" template="rpi" PageMenu="0,1,2" users="" group="" news="">
</page2> </page2>
<uyr url="content/index" title="Новый syu6e5" name="uyr" template="MedWait" PageMenu="0,1,2" users="" group="" news="" plugins=""> <uyr url="content/index" title="Новый syu6e5" name="uyr" template="MedWait" PageMenu="0,1,2" users="" group="" news="">
</uyr> </uyr>
<markdownMarkedJS url="content/markdownMarkedJS" title="markdownMarkedJS" name="markdownMarkedJS" template="MedWait" PageMenu="0,1,2" users="" group="" news="">
</markdownMarkedJS>
</index> </index>
</site> </site>

View File

@@ -708,7 +708,6 @@ if (!isset($xmlstr->index)) {
$index->addAttribute('users', ''); $index->addAttribute('users', '');
$index->addAttribute('group', ''); $index->addAttribute('group', '');
$index->addAttribute('news', ''); $index->addAttribute('news', '');
$index->addAttribute('plugins', '');
$xmlstr->asXML($FPfile); $xmlstr->asXML($FPfile);
} }
$ansv['sitename'] =$xmlstr->sitename; $ansv['sitename'] =$xmlstr->sitename;
@@ -735,7 +734,6 @@ if ($RURLstr!='error'){
$ansv['template'] = $xmlstr->{$RURLstr[$i]}['template']; $ansv['template'] = $xmlstr->{$RURLstr[$i]}['template'];
$ansv['title'] = $xmlstr->{$RURLstr[$i]}['title']; $ansv['title'] = $xmlstr->{$RURLstr[$i]}['title'];
$ansv['page'] = $xmlstr->{$RURLstr[$i]}; $ansv['page'] = $xmlstr->{$RURLstr[$i]};
$ansv['page_plugins'] = (string)($xmlstr->{$RURLstr[$i]}['plugins'] ?? '');
} }
$xmlstr = $xmlstr->{$RURLstr[$i]}; $xmlstr = $xmlstr->{$RURLstr[$i]};
} }
@@ -755,7 +753,7 @@ if ($RURLstr!='error'){
* @param mixed $RURLstr Массив сегментов URL или строка 'error' * @param mixed $RURLstr Массив сегментов URL или строка 'error'
* @return array Массив с информацией о странице, включая URL, шаблон, заголовок и плагины * @return array Массив с информацией о странице, включая URL, шаблон, заголовок и плагины
*/ */
function loadPluginsInCenterBlock() { /* function loadPluginsInCenterBlock() {
global $_SESSION, $path, $config; global $_SESSION, $path, $config;
if ($_SESSION['Login'] == 'true') { if ($_SESSION['Login'] == 'true') {
$availablePlugins = ['dgrm', 'SvgEditorM', 'form_editor']; $availablePlugins = ['dgrm', 'SvgEditorM', 'form_editor'];
@@ -774,5 +772,5 @@ function loadPluginsInCenterBlock() {
} }
} }
return $html; return $html;
} } */
?> ?>

View File

@@ -1,29 +1,15 @@
<![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> <![CDATA[<div>
test1цыкцып test1цыуквацыфавп
</div>]]><![CDATA[<div>
test2
</div>]]>
<![CDATA[<div>
test1цыуквацыфавп
</div>]]><![CDATA[<div>
test2
</div>]]>
<![CDATA[<div>
test1цыуквацыфавп
</div>]]><![CDATA[<div> </div>]]><![CDATA[<div>
test2 test2
</div>]]> </div>]]>

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 738 KiB

After

Width:  |  Height:  |  Size: 739 KiB

View File

@@ -40,6 +40,12 @@ if (!isset($_SESSION['page_url'])) {
$_SESSION['page_url'] = $config['page_url']; $_SESSION['page_url'] = $config['page_url'];
} }
$pluginBlocks = ['dgrm', 'SvgEditorM', 'form_editor'];
$pluginBlocksPath = $path . 'main_plugin/';
$pluginBlocks = array_filter($pluginBlocks, function($block) use ($pluginBlocksPath) {
return is_dir($pluginBlocksPath . $block);
});
$methodRpc = null; $methodRpc = null;
if ($_SERVER["REQUEST_METHOD"] === "POST" && strpos($_SERVER["CONTENT_TYPE"] ?? "", "application/json") !== false) { if ($_SERVER["REQUEST_METHOD"] === "POST" && strpos($_SERVER["CONTENT_TYPE"] ?? "", "application/json") !== false) {
@@ -171,7 +177,7 @@ if (preg_match_all('#<!\[CDATA\[(.*?)\]\]>#s', $tagMatch[1], $matches)) {
foreach ($matches[1] as $i => $cdata) { foreach ($matches[1] as $i => $cdata) {
if ($i > 0) if ($i > 0)
$config['content'] .= "<br>"; $config['content'] .= "<br>";
$config['content'] .= '<div class="%cfloat%' . ($i == 0 ? ' content1' : '') . '"><div class="content">' . $cdata . '</div></div>'; $config['content'] .= '<div class="%cfloat%" style="' . ($i == 0 ? '' : 'border-radius: 10px;') . '"><div class="content">' . $cdata . '</div></div>';
} }
} }
foreach ($config as $key=>$value) if ($key!="request_url") foreach ($config as $key=>$value) if ($key!="request_url")
@@ -200,7 +206,7 @@ foreach ($lang[$lng] as $key => $value) {
} }
$html .= '<script>' . $Js . '</script>'; $html .= '<script>' . $Js . '</script>';
$html .= loadPluginsInCenterBlock(); $html .= '<script src="/main_plugin/marked-master/marked.umd.js"></script>';
$html .= includePlugin(['plugin' => 'siteSettings']); $html .= includePlugin(['plugin' => 'siteSettings']);
$html .= includePlugin(['plugin' => 'auth']); $html .= includePlugin(['plugin' => 'auth']);
/* $html .= includePlugin(['plugin' => 'editor']); */ /* $html .= includePlugin(['plugin' => 'editor']); */

View File

@@ -257,7 +257,7 @@ class Editor {
Инициализация (выполняется после загрузки DOM) Инициализация (выполняется после загрузки DOM)
----------------------------- */ ----------------------------- */
window.addEventListener('DOMContentLoaded', () => { window.addEventListener('LoadSvgEditorMJs', () => {
let main = document.getElementById('main') || document.body; let main = document.getElementById('main') || document.body;
let selection = document.getElementById('selector'); let selection = document.getElementById('selector');

View File

@@ -8,18 +8,6 @@ global $path, $_SESSION, $configAdmins;
if (in_array($_SESSION['username'], $configAdmins, true)) { if (in_array($_SESSION['username'], $configAdmins, true)) {
include $path . 'main_plugin/SvgEditorM/index.php'; include $path . 'main_plugin/SvgEditorM/index.php';
echo '<link rel="stylesheet" type="text/css" href="/main_plugin/SvgEditorM/SvgEditorM.css">'; echo '<link rel="stylesheet" type="text/css" href="/main_plugin/SvgEditorM/SvgEditorM.css">';
echo "<script type='module'> echo "<script type='module'>import('/main_plugin/SvgEditorM/SvgEditorM.js');</script>";
document.addEventListener('DOMContentLoaded', () => {
const c = document.querySelector('.center-float');
const d = document.getElementById('sidebar');
if (c && d) {
c.appendChild(document.createElement('br'));
c.appendChild(d);
import('/main_plugin/SvgEditorM/SvgEditorM.js');
} else if (d) {
d.remove();
}
});
</script>";
} }
?> ?>

View File

@@ -7,19 +7,7 @@
global $path, $_SESSION, $configAdmins; global $path, $_SESSION, $configAdmins;
if (in_array($_SESSION['username'], $configAdmins, true)) { if (in_array($_SESSION['username'], $configAdmins, true)) {
echo file_get_contents($path . 'main_plugin/dgrm/index.php'); echo file_get_contents($path . 'main_plugin/dgrm/index.php');
echo "<script type='module'> echo "<script type='module'>import('/main_plugin/dgrm/index.js');</script>";
document.addEventListener('DOMContentLoaded', () => { echo '<link rel="stylesheet" type="text/css" href="/main_plugin/dgrm/dgrm.css">';
const c = document.querySelector('.center-float');
const d = document.getElementById('dgrmDiv');
if (c && d) {
c.appendChild(document.createElement('br'));
c.appendChild(d);
import('/main_plugin/dgrm/index.js');
} else if (d) {
d.remove();
}
});
</script>";
echo '<link rel="stylesheet" type="text/css" href="/main_plugin/dgrm/dgrm.css">';
} }
?> ?>

View File

@@ -246,6 +246,9 @@
#toolbar-group-button-paste { #toolbar-group-button-paste {
background-position: 166px 517px; background-position: 166px 517px;
} }
#toolbar-group-button-structure {
background-position: 166px 517px;
}
.align-dropdown, .align-dropdown-oneImg { .align-dropdown, .align-dropdown-oneImg {
position: relative; position: relative;
@@ -376,6 +379,10 @@
background-position: -318px 1824px; background-position: -318px 1824px;
} }
#markedBut {
background-position: -318px 1824px;
}
#bac { #bac {
background-position: 645px 716px; background-position: 645px 716px;
} }
@@ -452,7 +459,7 @@
background-position: 1045px 557px; background-position: 1045px 557px;
} }
/* #pluginSave { #pluginSave {
background-position: -479px 1665px; background-position: -479px 1665px;
} }
#pluginCreateLeft { #pluginCreateLeft {
@@ -467,12 +474,15 @@
#pluginAddRight { #pluginAddRight {
background-position: -638px 1665px; background-position: -638px 1665px;
} }
#pluginAddCenter {
background-position: -838px 1665px;
}
#pluginDelete { #pluginDelete {
background-position: -518px 1665px; background-position: -518px 1665px;
} }
#pluginMove { #pluginMove {
background-position: -438px 1665px; background-position: -438px 1665px;
} */ }
#contentPageCreate { #contentPageCreate {
background-position: 926px 676px; background-position: 926px 676px;

View File

@@ -415,7 +415,7 @@ function clo(c) // Функция закры
} }
// действия блока плагинов // действия блока плагинов
let pluginDropdownContentId = document.getElementById("pluginDropdownContent"); /* let pluginDropdownContentId = document.getElementById("pluginDropdownContent");
pluginDropdownContentId.addEventListener('click', function () { pluginDropdownContentId.addEventListener('click', function () {
let targetElement = document.getElementById(this.value); let targetElement = document.getElementById(this.value);
if (targetElement) { if (targetElement) {
@@ -436,7 +436,7 @@ pluginDropdownContentId.addEventListener('click', function () {
if (editMode == -1) { if (editMode == -1) {
pluginDropdownContentId.style.backgroundColor = ''; pluginDropdownContentId.style.backgroundColor = '';
} }
}); }); */
// действия блока элементов // действия блока элементов
/* let elementDropdownContentId = document.getElementById("elementDropdownContent"); /* let elementDropdownContentId = document.getElementById("elementDropdownContent");
@@ -455,7 +455,7 @@ mainActionsId.addEventListener('click', function () {
switch (this.value) { switch (this.value) {
case "save": case "save":
saveChanges(); saveChanges();
break; break;fshowHtmlCode
case "saveHow": case "saveHow":
saveChangesHow(); saveChangesHow();
break; break;
@@ -564,13 +564,83 @@ function restoreSelection() {
sel.addRange(range); sel.addRange(range);
} }
/* плагины для центра */
document.getElementById('pluginAddCenter').onclick = function pluginFunCenter() {
jsonrpcRequest('getPluginBlocks', {})
.then(folders => {
const pluginAddSideName = document.getElementById('pluginAddCenterName');
pluginAddSideName.innerHTML = '';
folders.forEach(folder => {
const option = document.createElement('option');
option.value = folder;
option.textContent = folder;
pluginAddSideName.appendChild(option);
});
});
};
document.getElementById('pluginAddCenterFun_d').addEventListener('click', function() {
const select = document.getElementById('pluginAddCenterName');
const pluginName = select.value;
if (!pluginName) return;
if (document.querySelector('.' + pluginName)) return;
includePluginBlock(pluginName).then(fragment => {
const centerFloat = document.querySelector('.center-float');
if (!centerFloat) return;
const wrapper = document.createElement('div');
wrapper.setAttribute('pluginblock', pluginName);
wrapper.appendChild(document.createElement('br'));
const scripts = [];
Array.from(fragment.childNodes).forEach(node => {
if (node.tagName === 'SCRIPT') {
const s = document.createElement('script');
if (node.src) {
s.src = node.src;
s.async = false;
scripts.push(new Promise(res => s.onload = res));
} else {
s.textContent = node.textContent;
}
document.body.appendChild(s);
} else {
wrapper.appendChild(node);
}
});
centerFloat.appendChild(wrapper);
Promise.all(scripts).then(() => {
const event = new Event("Load" + pluginName + "Js");
document.dispatchEvent(event);
window.dispatchEvent(event);
});
});
});
// Пример изменения includePlugin
function includePluginBlock(plugin) {
return jsonrpcRequest("includePlugin", { plugin })
.then(html => {
const frag = document.createDocumentFragment();
const temp = document.createElement('div');
temp.innerHTML = html;
Array.from(temp.childNodes).forEach(node => {
if (node.nodeType === 1) node.setAttribute('plugin', plugin);
frag.appendChild(node);
});
return frag;
});
}
// Взаимодействие с плагинами // Взаимодействие с плагинами
/* document.getElementById('pluginCreateLeft').onclick = function() { pluginFun('create', 'left'); }; /* document.getElementById('pluginCreateLeft').onclick = function() { pluginFun('create', 'left'); };
document.getElementById('pluginCreateRight').onclick = function() { pluginFun('create', 'right'); }; */ document.getElementById('pluginCreateRight').onclick = function() { pluginFun('create', 'right'); }; */
document.getElementById('pluginAddLeft').onclick = function() { pluginFun('add', 'left'); }; document.getElementById('pluginAddLeft').onclick = function() { pluginFun('add', 'left'); };
document.getElementById('pluginAddRight').onclick = function() { pluginFun('add', 'right'); }; document.getElementById('pluginAddRight').onclick = function() { pluginFun('add', 'right'); };
/* document.getElementById('pluginRulesButton1').onclick = function() { pluginRulesFun('pluginRulesBlock1'); }; /* document.getElementById('pluginRulesButton1').onclick = function() { pluginRulesFun('pluginRulesBlock1'); };
document.getElementById('pluginRulesButton2').onclick = function() { pluginRulesFun('pluginRulesBlock2'); }; */ document.getElementById('pluginRulesButton2').onclick = function() { pluginRulesFun('pluginRulesBlock2'); }; */
@@ -740,7 +810,7 @@ function editFun3(i) {
function editFun4(i) { function editFun4(i) {
} }
function editFun5(i) { function editFun5(i) {
pluginDropdownContentId.style.backgroundColor = ''; /* pluginDropdownContentId.style.backgroundColor = ''; */
} }
let pluginTakeCheck = 0; let pluginTakeCheck = 0;
@@ -2211,19 +2281,22 @@ addEventListener("LoadeditorJs", function()
document.querySelectorAll("#panel .toolbar-group").forEach(g => { document.querySelectorAll("#panel .toolbar-group").forEach(g => {
const btn = g.querySelector(".toolbar-group-button"); const btn = g.querySelector(".toolbar-group-button");
const content = g.querySelector(".toolbar-group-content"); const content = g.querySelector(".toolbar-group-content");
const toggle = () => {
const isHidden = content.style.display === "none";
content.style.display = isHidden ? "" : "none";
const hidden = content.style.display === "none";
g.classList.toggle("open", !hidden);
};
if (btn && content) { if (btn && content) {
btn.addEventListener("click", () => { btn.addEventListener("click", e => {
const isHidden = content.style.display === "none"; toggle();
content.style.display = isHidden ? "" : "none";
if (btn && content) {
const isHidden = content.style.display === "none";
g.classList.toggle("open", !isHidden);
}
}); });
if (btn && content) { g.addEventListener("click", e => {
const isHidden = content.style.display === "none"; if (e.target === g) toggle();
g.classList.toggle("open", !isHidden); });
} const isHidden = content.style.display === "none";
g.classList.toggle("open", !isHidden);
} }
}); });

View File

@@ -156,6 +156,16 @@
</div> </div>
</div> </div>
<?php /** @brief Список выбора плагина в ентре */ $pluginAddCenter_d; ?>
<div id="pluginAddCenter_d" class="cust sb borderStyle">
<div class="deploy">
{{add_plugin_center}}:<br>
<label for="pluginAddCenterName">{{select_plugin}}</label>
<select id="pluginAddCenterName" class="sele"></select>
<button id="pluginAddCenterFun_d" class="butin">{{select}}</button>
</div>
</div>
<?php /** @brief Редактирование меню страницы */ $contentPageCreate_d; ?> <?php /** @brief Редактирование меню страницы */ $contentPageCreate_d; ?>
<div id="contentPageCreate_d" class="cust sb borderStyle"> <div id="contentPageCreate_d" class="cust sb borderStyle">
<div class="deploy"> <div class="deploy">
@@ -201,7 +211,8 @@
<span class="toolbar-group-content"> <span class="toolbar-group-content">
<div id="settingsMain" class="editi editib swit"></div> <div id="settingsMain" class="editi editib swit"></div>
<div id="htm" onclick="showHtmlCode()" class="editi editib pers" alt="{{html_code_main_block_alt}}" title="{{html_code_main_block_title}}"></div> <div id="htm" onclick="showCode('html')" class="editi editib pers" alt="{{html_code_main_block_alt}}" title="{{html_code_main_block_title}}"></div>
<!-- <div id="markedBut" onclick="showCode('marked')" class="editi editib pers" alt="{{marked_code_main_block_alt}}" title="{{marked_code_main_block_title}}"></div> -->
<div id="bac" class="editi editib pers" alt="{{undo_action_alt}}" title="{{undo_action_title}}"></div> <div id="bac" class="editi editib pers" alt="{{undo_action_alt}}" title="{{undo_action_title}}"></div>
<div id="forw" class="editi editib pers" alt="{{redo_action_alt}}" title="{{redo_action_title}}"></div> <div id="forw" class="editi editib pers" alt="{{redo_action_alt}}" title="{{redo_action_title}}"></div>
@@ -283,16 +294,21 @@
<div id="hr" class="editi editib pers editf"></div> <div id="hr" class="editi editib pers editf"></div>
<div id="tabl" class="editi editib pers editf"></div> <div id="tabl" class="editi editib pers editf"></div>
<div id="copyr" class="editi editib swit"></div> <div id="copyr" class="editi editib swit"></div>
<select id="pluginDropdownContent" class="edits pers3">
<option id="pluginAddLeft" value="pluginAddLeft" class="swit">{{add_plugin_left}}</option>
<option id="pluginAddRight" value="pluginAddRight" class="swit">{{add_plugin_right}}</option>
<option id="pluginDelete" value="pluginDelete" class="editfText">{{delete_plugin}}</option>
<option id="pluginMove" value="pluginMove" class="editfText">{{move_plugin}}</option>
</select>
</span> </span>
</div> </div>
<div class="toolbar-group">
<span id="toolbar-group-button-structure" class="editi editib pers toolbar-group-button"></span>
<span class="toolbar-group-content">
<div id="pluginAddLeft" class="editi editib swit editf"></div>
<div id="pluginAddRight" class="editi editib swit editf"></div>
<div id="pluginAddCenter" class="editi editib swit editf"></div>
<div id="pluginDelete" class="editi editib pers editf"></div>
<div id="pluginMove" class="editi editib pers editf"></div>
</span>
</div>
</div><div id="arrow-right" class="arrow borderStyle">&vrtri;</div></div> </div><div id="arrow-right" class="arrow borderStyle">&vrtri;</div></div>
<!-- текстовый редактор --> <!-- текстовый редактор -->

View File

@@ -11,23 +11,20 @@
* @throws Exception В случае проблем с сохранением контента * @throws Exception В случае проблем с сохранением контента
*/ */
function savePageCenterBlock($params) { function savePageCenterBlock($params) {
global $config, $path, $_SESSION; global $config, $path, $_SESSION;
$saveContentIdXml = $path . $_SESSION['page_url'] . ".page.php"; $saveContentIdXml = $path . $_SESSION['page_url'] . ".page.php";
$saveContentIdData = $params['saveContentIdData'] ?? ''; $saveContentIdData = html_entity_decode($params['saveContentIdData'] ?? '', ENT_QUOTES, 'UTF-8');
$xml = file_get_contents($saveContentIdXml);
$xml = file_get_contents($saveContentIdXml);
$xml = preg_replace('#<' . $_SESSION['lng'] . '>.*?</' . $_SESSION['lng'] . '>#s', '<' . $_SESSION['lng'] . '></' . $_SESSION['lng'] . '>', $xml); $xml = preg_replace('#<' . $_SESSION['lng'] . '>.*?</' . $_SESSION['lng'] . '>#s', '<' . $_SESSION['lng'] . '></' . $_SESSION['lng'] . '>', $xml);
$xml = preg_replace('#(<' . $_SESSION['lng'] . '>)#', "$1\n" . $saveContentIdData . "\n", $xml, 1);
if (preg_match('#<' . $_SESSION['lng'] . '>#', $xml, $pos)) { if (file_put_contents($saveContentIdXml, $xml) !== false) return 'true';
$xml = preg_replace('#(<' . $_SESSION['lng'] . '>)#', '$1' . "\n" . $saveContentIdData . "\n", $xml, 1); throw new Exception("Problem saving content", -32003);
}
if (file_put_contents($saveContentIdXml, $xml) !== false) return 'true';
throw new Exception("Problem saving content", -32003);
} }
/** /**
* @brief Сохраняет левый и правый блоки страницы * @brief Сохраняет левый и правый блоки страницы
* @param array $params Массив с данными блоков, ключ 'floatsBlock' содержит массив левых и правых блоков * @param array $params Массив с данными блоков, ключ 'floatsBlock' содержит массив левых и правых блоков
@@ -255,6 +252,20 @@ function getPlugin($params) {
return ob_get_clean(); return ob_get_clean();
} }
/**
* Возвращает список доступных плагинов в виде JSON
* @param array $params Входные параметры запроса (не используются)
* @return string JSON-массив с названиями плагинов
* @throws Exception Если глобальная переменная $pluginBlocks не определена или пуста
*/
function getPluginBlocks($params) {
global $pluginBlocks;
if (!isset($pluginBlocks) || !is_array($pluginBlocks) || empty($pluginBlocks)) {
throw new Exception("Нет доступных плагинов", -1);
}
return $pluginBlocks;
}
/** /**
* @brief Загружает изображение пользователя из Base64 и сохраняет на сервер * @brief Загружает изображение пользователя из Base64 и сохраняет на сервер
* @param array $params Массив с данными изображения, включая 'userImgBase64' и 'userImgName' * @param array $params Массив с данными изображения, включая 'userImgBase64' и 'userImgName'

View File

@@ -17,5 +17,5 @@ foreach ($lang[$lng] as $key => $value) {
$placeholders['{{' . $key . '}}'] = $value; $placeholders['{{' . $key . '}}'] = $value;
} }
echo 'window.addEventListener("load", function() {' . strtr(file_get_contents($path . 'form_editor.js'), $placeholders) . '});'; echo 'window.addEventListener("Loadform_editorJs", function() {' . strtr(file_get_contents($path . 'form_editor.js'), $placeholders) . '});';
?> ?>

View File

@@ -13,27 +13,11 @@ $lang = include $path . 'main_plugin/form_editor/lang.php';
$lng = $_SESSION['lng'] ?? 'en'; $lng = $_SESSION['lng'] ?? 'en';
if (in_array($_SESSION['username'], $configAdmins, true)) { if (in_array($_SESSION['username'], $configAdmins, true)) {
$Html = file_get_contents($path . 'main_plugin/form_editor/form_editor.php'); $Html = file_get_contents($path . 'main_plugin/form_editor/form_editor.php');
foreach ($lang[$lng] as $key => $value) { foreach ($lang[$lng] as $key => $value) {
$Html = str_replace('{{' . $key . '}}', $value, $Html); $Html = str_replace('{{' . $key . '}}', $value, $Html);
} }
echo $Html; echo $Html;
echo "<script>
document.addEventListener('DOMContentLoaded', () => {
const c = document.querySelector('.center-float');
const d = document.getElementById('formEditor');
if (c && d) {
c.appendChild(document.createElement('br'));
c.appendChild(d);
} else if (d) {
d.remove();
}
});
</script>";
echo '<link rel="stylesheet" type="text/css" href="/main_plugin/form_editor/form_editor.css">'; echo '<link rel="stylesheet" type="text/css" href="/main_plugin/form_editor/form_editor.css">';
echo '<script type="text/javascript" src="/main_plugin/form_editor/lang.js.php?lng=' . $lng . '"></script>'; echo '<script type="text/javascript" src="/main_plugin/form_editor/lang.js.php?lng=' . $lng . '"></script>';
} }

753
main_plugin/marked-master/marked.d.ts vendored Normal file
View File

@@ -0,0 +1,753 @@
// Generated by dts-bundle-generator v9.5.1
export type MarkedToken = (Tokens.Blockquote | Tokens.Br | Tokens.Checkbox | Tokens.Code | Tokens.Codespan | Tokens.Def | Tokens.Del | Tokens.Em | Tokens.Escape | Tokens.Heading | Tokens.Hr | Tokens.HTML | Tokens.Image | Tokens.Link | Tokens.List | Tokens.ListItem | Tokens.Paragraph | Tokens.Space | Tokens.Strong | Tokens.Table | Tokens.Tag | Tokens.Text);
export type Token = (MarkedToken | Tokens.Generic);
export declare namespace Tokens {
interface Blockquote {
type: "blockquote";
raw: string;
text: string;
tokens: Token[];
}
interface Br {
type: "br";
raw: string;
}
interface Checkbox {
type: "checkbox";
raw: string;
checked: boolean;
}
interface Code {
type: "code";
raw: string;
codeBlockStyle?: "indented";
lang?: string;
text: string;
escaped?: boolean;
}
interface Codespan {
type: "codespan";
raw: string;
text: string;
}
interface Def {
type: "def";
raw: string;
tag: string;
href: string;
title: string;
}
interface Del {
type: "del";
raw: string;
text: string;
tokens: Token[];
}
interface Em {
type: "em";
raw: string;
text: string;
tokens: Token[];
}
interface Escape {
type: "escape";
raw: string;
text: string;
}
interface Generic {
[index: string]: any;
type: string;
raw: string;
tokens?: Token[];
}
interface Heading {
type: "heading";
raw: string;
depth: number;
text: string;
tokens: Token[];
}
interface Hr {
type: "hr";
raw: string;
}
interface HTML {
type: "html";
raw: string;
pre: boolean;
text: string;
block: boolean;
}
interface Image {
type: "image";
raw: string;
href: string;
title: string | null;
text: string;
tokens: Token[];
}
interface Link {
type: "link";
raw: string;
href: string;
title?: string | null;
text: string;
tokens: Token[];
}
interface List {
type: "list";
raw: string;
ordered: boolean;
start: number | "";
loose: boolean;
items: ListItem[];
}
interface ListItem {
type: "list_item";
raw: string;
task: boolean;
checked?: boolean;
loose: boolean;
text: string;
tokens: Token[];
}
interface Paragraph {
type: "paragraph";
raw: string;
pre?: boolean;
text: string;
tokens: Token[];
}
interface Space {
type: "space";
raw: string;
}
interface Strong {
type: "strong";
raw: string;
text: string;
tokens: Token[];
}
interface Table {
type: "table";
raw: string;
align: Array<"center" | "left" | "right" | null>;
header: TableCell[];
rows: TableCell[][];
}
interface TableCell {
text: string;
tokens: Token[];
header: boolean;
align: "center" | "left" | "right" | null;
}
interface TableRow<P = string> {
text: P;
}
interface Tag {
type: "html";
raw: string;
inLink: boolean;
inRawBlock: boolean;
text: string;
block: boolean;
}
interface Text {
type: "text";
raw: string;
text: string;
tokens?: Token[];
escaped?: boolean;
}
}
export type Links = Record<string, Pick<Tokens.Link | Tokens.Image, "href" | "title">>;
export type TokensList = Token[] & {
links: Links;
};
/**
* Renderer
*/
declare class _Renderer<ParserOutput = string, RendererOutput = string> {
options: MarkedOptions<ParserOutput, RendererOutput>;
parser: _Parser<ParserOutput, RendererOutput>;
constructor(options?: MarkedOptions<ParserOutput, RendererOutput>);
space(token: Tokens.Space): RendererOutput;
code({ text, lang, escaped }: Tokens.Code): RendererOutput;
blockquote({ tokens }: Tokens.Blockquote): RendererOutput;
html({ text }: Tokens.HTML | Tokens.Tag): RendererOutput;
def(token: Tokens.Def): RendererOutput;
heading({ tokens, depth }: Tokens.Heading): RendererOutput;
hr(token: Tokens.Hr): RendererOutput;
list(token: Tokens.List): RendererOutput;
listitem(item: Tokens.ListItem): RendererOutput;
checkbox({ checked }: Tokens.Checkbox): RendererOutput;
paragraph({ tokens }: Tokens.Paragraph): RendererOutput;
table(token: Tokens.Table): RendererOutput;
tablerow({ text }: Tokens.TableRow<ParserOutput>): RendererOutput;
tablecell(token: Tokens.TableCell): RendererOutput;
/**
* span level renderer
*/
strong({ tokens }: Tokens.Strong): RendererOutput;
em({ tokens }: Tokens.Em): RendererOutput;
codespan({ text }: Tokens.Codespan): RendererOutput;
br(token: Tokens.Br): RendererOutput;
del({ tokens }: Tokens.Del): RendererOutput;
link({ href, title, tokens }: Tokens.Link): RendererOutput;
image({ href, title, text, tokens }: Tokens.Image): RendererOutput;
text(token: Tokens.Text | Tokens.Escape): RendererOutput;
}
/**
* TextRenderer
* returns only the textual part of the token
*/
declare class _TextRenderer<RendererOutput = string> {
strong({ text }: Tokens.Strong): RendererOutput;
em({ text }: Tokens.Em): RendererOutput;
codespan({ text }: Tokens.Codespan): RendererOutput;
del({ text }: Tokens.Del): RendererOutput;
html({ text }: Tokens.HTML | Tokens.Tag): RendererOutput;
text({ text }: Tokens.Text | Tokens.Escape | Tokens.Tag): RendererOutput;
link({ text }: Tokens.Link): RendererOutput;
image({ text }: Tokens.Image): RendererOutput;
br(): RendererOutput;
checkbox({ raw }: Tokens.Checkbox): RendererOutput;
}
/**
* Parsing & Compiling
*/
declare class _Parser<ParserOutput = string, RendererOutput = string> {
options: MarkedOptions<ParserOutput, RendererOutput>;
renderer: _Renderer<ParserOutput, RendererOutput>;
textRenderer: _TextRenderer<RendererOutput>;
constructor(options?: MarkedOptions<ParserOutput, RendererOutput>);
/**
* Static Parse Method
*/
static parse<ParserOutput = string, RendererOutput = string>(tokens: Token[], options?: MarkedOptions<ParserOutput, RendererOutput>): ParserOutput;
/**
* Static Parse Inline Method
*/
static parseInline<ParserOutput = string, RendererOutput = string>(tokens: Token[], options?: MarkedOptions<ParserOutput, RendererOutput>): ParserOutput;
/**
* Parse Loop
*/
parse(tokens: Token[]): ParserOutput;
/**
* Parse Inline Tokens
*/
parseInline(tokens: Token[], renderer?: _Renderer<ParserOutput, RendererOutput> | _TextRenderer<RendererOutput>): ParserOutput;
}
declare const other: {
codeRemoveIndent: RegExp;
outputLinkReplace: RegExp;
indentCodeCompensation: RegExp;
beginningSpace: RegExp;
endingHash: RegExp;
startingSpaceChar: RegExp;
endingSpaceChar: RegExp;
nonSpaceChar: RegExp;
newLineCharGlobal: RegExp;
tabCharGlobal: RegExp;
multipleSpaceGlobal: RegExp;
blankLine: RegExp;
doubleBlankLine: RegExp;
blockquoteStart: RegExp;
blockquoteSetextReplace: RegExp;
blockquoteSetextReplace2: RegExp;
listReplaceTabs: RegExp;
listReplaceNesting: RegExp;
listIsTask: RegExp;
listReplaceTask: RegExp;
listTaskCheckbox: RegExp;
anyLine: RegExp;
hrefBrackets: RegExp;
tableDelimiter: RegExp;
tableAlignChars: RegExp;
tableRowBlankLine: RegExp;
tableAlignRight: RegExp;
tableAlignCenter: RegExp;
tableAlignLeft: RegExp;
startATag: RegExp;
endATag: RegExp;
startPreScriptTag: RegExp;
endPreScriptTag: RegExp;
startAngleBracket: RegExp;
endAngleBracket: RegExp;
pedanticHrefTitle: RegExp;
unicodeAlphaNumeric: RegExp;
escapeTest: RegExp;
escapeReplace: RegExp;
escapeTestNoEncode: RegExp;
escapeReplaceNoEncode: RegExp;
unescapeTest: RegExp;
caret: RegExp;
percentDecode: RegExp;
findPipe: RegExp;
splitPipe: RegExp;
slashPipe: RegExp;
carriageReturn: RegExp;
spaceLine: RegExp;
notSpaceStart: RegExp;
endingNewline: RegExp;
listItemRegex: (bull: string) => RegExp;
nextBulletRegex: (indent: number) => RegExp;
hrRegex: (indent: number) => RegExp;
fencesBeginRegex: (indent: number) => RegExp;
headingBeginRegex: (indent: number) => RegExp;
htmlBeginRegex: (indent: number) => RegExp;
};
declare const blockNormal: {
blockquote: RegExp;
code: RegExp;
def: RegExp;
fences: RegExp;
heading: RegExp;
hr: RegExp;
html: RegExp;
lheading: RegExp;
list: RegExp;
newline: RegExp;
paragraph: RegExp;
table: RegExp;
text: RegExp;
};
export type BlockKeys = keyof typeof blockNormal;
declare const inlineNormal: {
_backpedal: RegExp;
anyPunctuation: RegExp;
autolink: RegExp;
blockSkip: RegExp;
br: RegExp;
code: RegExp;
del: RegExp;
emStrongLDelim: RegExp;
emStrongRDelimAst: RegExp;
emStrongRDelimUnd: RegExp;
escape: RegExp;
link: RegExp;
nolink: RegExp;
punctuation: RegExp;
reflink: RegExp;
reflinkSearch: RegExp;
tag: RegExp;
text: RegExp;
url: RegExp;
};
export type InlineKeys = keyof typeof inlineNormal;
export interface Rules {
other: typeof other;
block: Record<BlockKeys, RegExp>;
inline: Record<InlineKeys, RegExp>;
}
/**
* Tokenizer
*/
declare class _Tokenizer<ParserOutput = string, RendererOutput = string> {
options: MarkedOptions<ParserOutput, RendererOutput>;
rules: Rules;
lexer: _Lexer<ParserOutput, RendererOutput>;
constructor(options?: MarkedOptions<ParserOutput, RendererOutput>);
space(src: string): Tokens.Space | undefined;
code(src: string): Tokens.Code | undefined;
fences(src: string): Tokens.Code | undefined;
heading(src: string): Tokens.Heading | undefined;
hr(src: string): Tokens.Hr | undefined;
blockquote(src: string): Tokens.Blockquote | undefined;
list(src: string): Tokens.List | undefined;
html(src: string): Tokens.HTML | undefined;
def(src: string): Tokens.Def | undefined;
table(src: string): Tokens.Table | undefined;
lheading(src: string): Tokens.Heading | undefined;
paragraph(src: string): Tokens.Paragraph | undefined;
text(src: string): Tokens.Text | undefined;
escape(src: string): Tokens.Escape | undefined;
tag(src: string): Tokens.Tag | undefined;
link(src: string): Tokens.Link | Tokens.Image | undefined;
reflink(src: string, links: Links): Tokens.Link | Tokens.Image | Tokens.Text | undefined;
emStrong(src: string, maskedSrc: string, prevChar?: string): Tokens.Em | Tokens.Strong | undefined;
codespan(src: string): Tokens.Codespan | undefined;
br(src: string): Tokens.Br | undefined;
del(src: string): Tokens.Del | undefined;
autolink(src: string): Tokens.Link | undefined;
url(src: string): Tokens.Link | undefined;
inlineText(src: string): Tokens.Text | undefined;
}
declare class _Hooks<ParserOutput = string, RendererOutput = string> {
options: MarkedOptions<ParserOutput, RendererOutput>;
block?: boolean;
constructor(options?: MarkedOptions<ParserOutput, RendererOutput>);
static passThroughHooks: Set<string>;
static passThroughHooksRespectAsync: Set<string>;
/**
* Process markdown before marked
*/
preprocess(markdown: string): string;
/**
* Process HTML after marked is finished
*/
postprocess(html: ParserOutput): ParserOutput;
/**
* Process all tokens before walk tokens
*/
processAllTokens(tokens: Token[] | TokensList): Token[] | TokensList;
/**
* Mask contents that should not be interpreted as em/strong delimiters
*/
emStrongMask(src: string): string;
/**
* Provide function to tokenize markdown
*/
provideLexer(): typeof _Lexer.lexInline;
/**
* Provide function to parse tokens
*/
provideParser(): (tokens: Token[], options?: MarkedOptions<ParserOutput, RendererOutput> | undefined) => ParserOutput;
}
export interface TokenizerThis {
lexer: _Lexer;
}
export type TokenizerExtensionFunction = (this: TokenizerThis, src: string, tokens: Token[] | TokensList) => Tokens.Generic | undefined;
export type TokenizerStartFunction = (this: TokenizerThis, src: string) => number | void;
export interface TokenizerExtension {
name: string;
level: "block" | "inline";
start?: TokenizerStartFunction;
tokenizer: TokenizerExtensionFunction;
childTokens?: string[];
}
export interface RendererThis<ParserOutput = string, RendererOutput = string> {
parser: _Parser<ParserOutput, RendererOutput>;
}
export type RendererExtensionFunction<ParserOutput = string, RendererOutput = string> = (this: RendererThis<ParserOutput, RendererOutput>, token: Tokens.Generic) => RendererOutput | false | undefined;
export interface RendererExtension<ParserOutput = string, RendererOutput = string> {
name: string;
renderer: RendererExtensionFunction<ParserOutput, RendererOutput>;
}
export type TokenizerAndRendererExtension<ParserOutput = string, RendererOutput = string> = TokenizerExtension | RendererExtension<ParserOutput, RendererOutput> | (TokenizerExtension & RendererExtension<ParserOutput, RendererOutput>);
export type HooksApi<ParserOutput = string, RendererOutput = string> = Omit<_Hooks<ParserOutput, RendererOutput>, "constructor" | "options" | "block">;
export type HooksObject<ParserOutput = string, RendererOutput = string> = {
[K in keyof HooksApi<ParserOutput, RendererOutput>]?: (this: _Hooks<ParserOutput, RendererOutput>, ...args: Parameters<HooksApi<ParserOutput, RendererOutput>[K]>) => ReturnType<HooksApi<ParserOutput, RendererOutput>[K]> | Promise<ReturnType<HooksApi<ParserOutput, RendererOutput>[K]>>;
};
export type RendererApi<ParserOutput = string, RendererOutput = string> = Omit<_Renderer<ParserOutput, RendererOutput>, "constructor" | "options" | "parser">;
export type RendererObject<ParserOutput = string, RendererOutput = string> = {
[K in keyof RendererApi<ParserOutput, RendererOutput>]?: (this: _Renderer<ParserOutput, RendererOutput>, ...args: Parameters<RendererApi<ParserOutput, RendererOutput>[K]>) => ReturnType<RendererApi<ParserOutput, RendererOutput>[K]> | false;
};
export type TokenizerApi<ParserOutput = string, RendererOutput = string> = Omit<_Tokenizer<ParserOutput, RendererOutput>, "constructor" | "options" | "rules" | "lexer">;
export type TokenizerObject<ParserOutput = string, RendererOutput = string> = {
[K in keyof TokenizerApi<ParserOutput, RendererOutput>]?: (this: _Tokenizer<ParserOutput, RendererOutput>, ...args: Parameters<TokenizerApi<ParserOutput, RendererOutput>[K]>) => ReturnType<TokenizerApi<ParserOutput, RendererOutput>[K]> | false;
};
export interface MarkedExtension<ParserOutput = string, RendererOutput = string> {
/**
* True will tell marked to await any walkTokens functions before parsing the tokens and returning an HTML string.
*/
async?: boolean;
/**
* Enable GFM line breaks. This option requires the gfm option to be true.
*/
breaks?: boolean;
/**
* Add tokenizers and renderers to marked
*/
extensions?: TokenizerAndRendererExtension<ParserOutput, RendererOutput>[] | null;
/**
* Enable GitHub flavored markdown.
*/
gfm?: boolean;
/**
* Hooks are methods that hook into some part of marked.
* preprocess is called to process markdown before sending it to marked.
* processAllTokens is called with the TokensList before walkTokens.
* postprocess is called to process html after marked has finished parsing.
* emStrongMask is called to mask contents that should not be interpreted as em/strong delimiters.
* provideLexer is called to provide a function to tokenize markdown.
* provideParser is called to provide a function to parse tokens.
*/
hooks?: HooksObject<ParserOutput, RendererOutput> | null;
/**
* Conform to obscure parts of markdown.pl as much as possible. Don't fix any of the original markdown bugs or poor behavior.
*/
pedantic?: boolean;
/**
* Type: object Default: new Renderer()
*
* An object containing functions to render tokens to HTML.
*/
renderer?: RendererObject<ParserOutput, RendererOutput> | null;
/**
* Shows an HTML error message when rendering fails.
*/
silent?: boolean;
/**
* The tokenizer defines how to turn markdown text into tokens.
*/
tokenizer?: TokenizerObject | null;
/**
* The walkTokens function gets called with every token.
* Child tokens are called before moving on to sibling tokens.
* Each token is passed by reference so updates are persisted when passed to the parser.
* The return value of the function is ignored.
*/
walkTokens?: ((token: Token) => void | Promise<void>) | null;
}
export interface MarkedOptions<ParserOutput = string, RendererOutput = string> extends Omit<MarkedExtension<ParserOutput, RendererOutput>, "hooks" | "renderer" | "tokenizer" | "extensions" | "walkTokens"> {
/**
* Hooks are methods that hook into some part of marked.
*/
hooks?: _Hooks<ParserOutput, RendererOutput> | null;
/**
* Type: object Default: new Renderer()
*
* An object containing functions to render tokens to HTML.
*/
renderer?: _Renderer<ParserOutput, RendererOutput> | null;
/**
* The tokenizer defines how to turn markdown text into tokens.
*/
tokenizer?: _Tokenizer<ParserOutput, RendererOutput> | null;
/**
* Custom extensions
*/
extensions?: null | {
renderers: {
[name: string]: RendererExtensionFunction<ParserOutput, RendererOutput>;
};
childTokens: {
[name: string]: string[];
};
inline?: TokenizerExtensionFunction[];
block?: TokenizerExtensionFunction[];
startInline?: TokenizerStartFunction[];
startBlock?: TokenizerStartFunction[];
};
/**
* walkTokens function returns array of values for Promise.all
*/
walkTokens?: null | ((token: Token) => void | Promise<void> | (void | Promise<void>)[]);
}
/**
* Block Lexer
*/
declare class _Lexer<ParserOutput = string, RendererOutput = string> {
tokens: TokensList;
options: MarkedOptions<ParserOutput, RendererOutput>;
state: {
inLink: boolean;
inRawBlock: boolean;
top: boolean;
};
private tokenizer;
private inlineQueue;
constructor(options?: MarkedOptions<ParserOutput, RendererOutput>);
/**
* Expose Rules
*/
static get rules(): {
block: {
normal: {
blockquote: RegExp;
code: RegExp;
def: RegExp;
fences: RegExp;
heading: RegExp;
hr: RegExp;
html: RegExp;
lheading: RegExp;
list: RegExp;
newline: RegExp;
paragraph: RegExp;
table: RegExp;
text: RegExp;
};
gfm: Record<"code" | "blockquote" | "hr" | "html" | "table" | "text" | "def" | "heading" | "list" | "paragraph" | "fences" | "lheading" | "newline", RegExp>;
pedantic: Record<"code" | "blockquote" | "hr" | "html" | "table" | "text" | "def" | "heading" | "list" | "paragraph" | "fences" | "lheading" | "newline", RegExp>;
};
inline: {
normal: {
_backpedal: RegExp;
anyPunctuation: RegExp;
autolink: RegExp;
blockSkip: RegExp;
br: RegExp;
code: RegExp;
del: RegExp;
emStrongLDelim: RegExp;
emStrongRDelimAst: RegExp;
emStrongRDelimUnd: RegExp;
escape: RegExp;
link: RegExp;
nolink: RegExp;
punctuation: RegExp;
reflink: RegExp;
reflinkSearch: RegExp;
tag: RegExp;
text: RegExp;
url: RegExp;
};
gfm: Record<"link" | "code" | "url" | "br" | "del" | "text" | "escape" | "tag" | "reflink" | "nolink" | "_backpedal" | "anyPunctuation" | "autolink" | "blockSkip" | "emStrongLDelim" | "emStrongRDelimAst" | "emStrongRDelimUnd" | "punctuation" | "reflinkSearch", RegExp>;
breaks: Record<"link" | "code" | "url" | "br" | "del" | "text" | "escape" | "tag" | "reflink" | "nolink" | "_backpedal" | "anyPunctuation" | "autolink" | "blockSkip" | "emStrongLDelim" | "emStrongRDelimAst" | "emStrongRDelimUnd" | "punctuation" | "reflinkSearch", RegExp>;
pedantic: Record<"link" | "code" | "url" | "br" | "del" | "text" | "escape" | "tag" | "reflink" | "nolink" | "_backpedal" | "anyPunctuation" | "autolink" | "blockSkip" | "emStrongLDelim" | "emStrongRDelimAst" | "emStrongRDelimUnd" | "punctuation" | "reflinkSearch", RegExp>;
};
};
/**
* Static Lex Method
*/
static lex<ParserOutput = string, RendererOutput = string>(src: string, options?: MarkedOptions<ParserOutput, RendererOutput>): TokensList;
/**
* Static Lex Inline Method
*/
static lexInline<ParserOutput = string, RendererOutput = string>(src: string, options?: MarkedOptions<ParserOutput, RendererOutput>): Token[];
/**
* Preprocessing
*/
lex(src: string): TokensList;
/**
* Lexing
*/
blockTokens(src: string, tokens?: Token[], lastParagraphClipped?: boolean): Token[];
blockTokens(src: string, tokens?: TokensList, lastParagraphClipped?: boolean): TokensList;
inline(src: string, tokens?: Token[]): Token[];
/**
* Lexing/Compiling
*/
inlineTokens(src: string, tokens?: Token[]): Token[];
}
/**
* Gets the original marked default options.
*/
declare function _getDefaults<ParserOutput = string, RendererOutput = string>(): MarkedOptions<ParserOutput, RendererOutput>;
declare let _defaults: MarkedOptions<any, any>;
export type MaybePromise = void | Promise<void>;
export declare class Marked<ParserOutput = string, RendererOutput = string> {
defaults: MarkedOptions<ParserOutput, RendererOutput>;
options: (opt: MarkedOptions<ParserOutput, RendererOutput>) => this;
parse: {
(src: string, options: MarkedOptions<ParserOutput, RendererOutput> & {
async: true;
}): Promise<ParserOutput>;
(src: string, options: MarkedOptions<ParserOutput, RendererOutput> & {
async: false;
}): ParserOutput;
(src: string, options?: MarkedOptions<ParserOutput, RendererOutput> | null): ParserOutput | Promise<ParserOutput>;
};
parseInline: {
(src: string, options: MarkedOptions<ParserOutput, RendererOutput> & {
async: true;
}): Promise<ParserOutput>;
(src: string, options: MarkedOptions<ParserOutput, RendererOutput> & {
async: false;
}): ParserOutput;
(src: string, options?: MarkedOptions<ParserOutput, RendererOutput> | null): ParserOutput | Promise<ParserOutput>;
};
Parser: {
new (options?: MarkedOptions<ParserOutput, RendererOutput> | undefined): _Parser<ParserOutput, RendererOutput>;
parse<ParserOutput_1 = string, RendererOutput_1 = string>(tokens: Token[], options?: MarkedOptions<ParserOutput_1, RendererOutput_1>): ParserOutput_1;
parseInline<ParserOutput_1 = string, RendererOutput_1 = string>(tokens: Token[], options?: MarkedOptions<ParserOutput_1, RendererOutput_1>): ParserOutput_1;
};
Renderer: {
new (options?: MarkedOptions<ParserOutput, RendererOutput> | undefined): _Renderer<ParserOutput, RendererOutput>;
};
TextRenderer: {
new (): _TextRenderer<RendererOutput>;
};
Lexer: typeof _Lexer;
Tokenizer: {
new (options?: MarkedOptions<ParserOutput, RendererOutput> | undefined): _Tokenizer<ParserOutput, RendererOutput>;
};
Hooks: {
new (options?: MarkedOptions<ParserOutput, RendererOutput> | undefined): _Hooks<ParserOutput, RendererOutput>;
passThroughHooks: Set<string>;
passThroughHooksRespectAsync: Set<string>;
};
constructor(...args: MarkedExtension<ParserOutput, RendererOutput>[]);
/**
* Run callback for every token
*/
walkTokens(tokens: Token[] | TokensList, callback: (token: Token) => MaybePromise | MaybePromise[]): MaybePromise[];
use(...args: MarkedExtension<ParserOutput, RendererOutput>[]): this;
setOptions(opt: MarkedOptions<ParserOutput, RendererOutput>): this;
lexer(src: string, options?: MarkedOptions<ParserOutput, RendererOutput>): TokensList;
parser(tokens: Token[], options?: MarkedOptions<ParserOutput, RendererOutput>): ParserOutput;
private parseMarkdown;
private onError;
}
/**
* Compiles markdown to HTML asynchronously.
*
* @param src String of markdown source to be compiled
* @param options Hash of options, having async: true
* @return Promise of string of compiled HTML
*/
export declare function marked(src: string, options: MarkedOptions & {
async: true;
}): Promise<string>;
/**
* Compiles markdown to HTML.
*
* @param src String of markdown source to be compiled
* @param options Optional hash of options
* @return String of compiled HTML. Will be a Promise of string if async is set to true by any extensions.
*/
export declare function marked(src: string, options: MarkedOptions & {
async: false;
}): string;
export declare function marked(src: string, options: MarkedOptions & {
async: true;
}): Promise<string>;
export declare function marked(src: string, options?: MarkedOptions | null): string | Promise<string>;
export declare namespace marked {
var options: (options: MarkedOptions) => typeof marked;
var setOptions: (options: MarkedOptions) => typeof marked;
var getDefaults: typeof _getDefaults;
var defaults: MarkedOptions<any, any>;
var use: (...args: MarkedExtension[]) => typeof marked;
var walkTokens: (tokens: Token[] | TokensList, callback: (token: Token) => MaybePromise | MaybePromise[]) => MaybePromise[];
var parseInline: {
(src: string, options: MarkedOptions<string, string> & {
async: true;
}): Promise<string>;
(src: string, options: MarkedOptions<string, string> & {
async: false;
}): string;
(src: string, options?: MarkedOptions<string, string> | null | undefined): string | Promise<string>;
};
var Parser: typeof _Parser;
var parser: typeof _Parser.parse;
var Renderer: typeof _Renderer;
var TextRenderer: typeof _TextRenderer;
var Lexer: typeof _Lexer;
var lexer: typeof _Lexer.lex;
var Tokenizer: typeof _Tokenizer;
var Hooks: typeof _Hooks;
var parse: typeof marked;
}
export declare const options: (options: MarkedOptions) => typeof marked;
export declare const setOptions: (options: MarkedOptions) => typeof marked;
export declare const use: (...args: MarkedExtension[]) => typeof marked;
export declare const walkTokens: (tokens: Token[] | TokensList, callback: (token: Token) => MaybePromise | MaybePromise[]) => MaybePromise[];
export declare const parseInline: {
(src: string, options: MarkedOptions<string, string> & {
async: true;
}): Promise<string>;
(src: string, options: MarkedOptions<string, string> & {
async: false;
}): string;
(src: string, options?: MarkedOptions<string, string> | null | undefined): string | Promise<string>;
};
export declare const parse: typeof marked;
export declare const parser: typeof _Parser.parse;
export declare const lexer: typeof _Lexer.lex;
export {
_Hooks as Hooks,
_Lexer as Lexer,
_Parser as Parser,
_Renderer as Renderer,
_TextRenderer as TextRenderer,
_Tokenizer as Tokenizer,
_defaults as defaults,
_getDefaults as getDefaults,
};
export {};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -38,7 +38,6 @@ function getSiteTree($params) {
'users' => (string) $child->attributes()->users, 'users' => (string) $child->attributes()->users,
'group' => (string) $child->attributes()->group, 'group' => (string) $child->attributes()->group,
'news' => (string) $child->attributes()->news, 'news' => (string) $child->attributes()->news,
'plugins' => (string) $child->attributes()->plugins,
'content' => (string)$child 'content' => (string)$child
]; ];
@@ -150,7 +149,6 @@ function buildSiteTreeXml($data, $level = 1) {
'users' => isset($item['users']) ? htmlspecialchars($item['users'], ENT_XML1 | ENT_QUOTES, 'UTF-8') : '', 'users' => isset($item['users']) ? htmlspecialchars($item['users'], ENT_XML1 | ENT_QUOTES, 'UTF-8') : '',
'group' => isset($item['group']) ? htmlspecialchars($item['group'], ENT_XML1 | ENT_QUOTES, 'UTF-8') : '', 'group' => isset($item['group']) ? htmlspecialchars($item['group'], ENT_XML1 | ENT_QUOTES, 'UTF-8') : '',
'news' => isset($item['news']) ? htmlspecialchars($item['news'], ENT_XML1 | ENT_QUOTES, 'UTF-8') : '', 'news' => isset($item['news']) ? htmlspecialchars($item['news'], ENT_XML1 | ENT_QUOTES, 'UTF-8') : '',
'plugins' => isset($item['plugins']) ? htmlspecialchars($item['plugins'], ENT_XML1 | ENT_QUOTES, 'UTF-8') : ''
]; ];
$attrString = ""; $attrString = "";

View File

@@ -67,7 +67,6 @@ function generateTreeHtml(items, checkChildren) {
html += `PageMenu: ${item.PageMenu}<br>`; html += `PageMenu: ${item.PageMenu}<br>`;
html += `users: ${item.users}<br>`; html += `users: ${item.users}<br>`;
html += `group: ${item.group}<br>`; html += `group: ${item.group}<br>`;
html += `plugins: ${item.plugins}<br>`;
let now = new Date(); let now = new Date();
let pad = n => n < 10 ? '0' + n : n; let pad = n => n < 10 ? '0' + n : n;
@@ -100,7 +99,7 @@ function generateTreeHtml(items, checkChildren) {
html += `</li>`; html += `</li>`;
if (style) { if (style) {
selectedTreeItemAdd = `url: ${item.url}<br>title: ${item.title}<br>name: ${item.name}<br>template: ${item.template}<br>PageMenu: ${item.PageMenu}<br>users: ${item.users}<br>group: ${item.group}<br>plugins: ${item.plugins}`; selectedTreeItemAdd = `url: ${item.url}<br>title: ${item.title}<br>name: ${item.name}<br>template: ${item.template}<br>PageMenu: ${item.PageMenu}<br>users: ${item.users}<br>group: ${item.group}`;
} }
}); });
@@ -888,13 +887,6 @@ function saveTreePropertiesDiv() {
.map(x => `<label><input type="checkbox" value="${x.value}"${x.checked?' checked':''}>${x.value}</label>`); .map(x => `<label><input type="checkbox" value="${x.value}"${x.checked?' checked':''}>${x.value}</label>`);
parts.push(`<div>${blocks.join(' ')}</div>`); parts.push(`<div>${blocks.join(' ')}</div>`);
value = parts.join(''); value = parts.join('');
}
else if (key.toLowerCase() === 'plugins') {
let cbs = valueCell.querySelectorAll('input[type="checkbox"][value]');
let active = Array.from(cbs)
.filter(cb => cb.checked)
.map(cb => cb.value);
value = active.join(',');
} else { } else {
let input = valueCell.querySelector('input'); let input = valueCell.querySelector('input');
value = input ? input.value : valueCell.textContent.trim(); value = input ? input.value : valueCell.textContent.trim();
@@ -991,12 +983,6 @@ 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() === "group") { } else if (key.toLowerCase() === "group") {
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") {
let plugins = (value || '').split(',');
let allPlugins = ['dgrm','SvgEditorM', 'form_editor'];
inputHtml = allPlugins.map(p =>
`<label><input type="checkbox" value="${p}"${plugins.includes(p)?' checked':''}>${p}</label>`
).join(' ');
} }

View File

@@ -191,8 +191,6 @@ ul, ol {
border-radius: 10px; border-radius: 10px;
padding: 10px; padding: 10px;
font-size: 1em; font-size: 1em;
}
.content1 {
top: -1px; top: -1px;
border-radius: 0 0 10px 10px; border-radius: 0 0 10px 10px;
} }