Реализовано открытие и закрытие вкладок на нажатие трех полосок, добавлена вкладка структуры страницы с возможностью вставки плагинов, подключена библиотека MarkedJS, исправлены баги, управление центральными блоками через CDATA.
This commit is contained in:
113
content/markdownMarkedJS.page.php
Normal file
113
content/markdownMarkedJS.page.php
Normal 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>
|
||||||
|
<
|
||||||
|
Список:
|
||||||
|
- пункт один
|
||||||
|
- пункт два
|
||||||
|
- пункт три
|
||||||
|
</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>
|
||||||
@@ -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[
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
} */
|
||||||
?>
|
?>
|
||||||
36
error.txt
36
error.txt
@@ -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 |
10
index.php
10
index.php
@@ -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']); */
|
||||||
|
|||||||
@@ -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');
|
||||||
|
|||||||
@@ -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>";
|
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
|
|||||||
@@ -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">';
|
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -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">⊳</div></div>
|
</div><div id="arrow-right" class="arrow borderStyle">⊳</div></div>
|
||||||
|
|
||||||
<!-- текстовый редактор -->
|
<!-- текстовый редактор -->
|
||||||
|
|||||||
@@ -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'
|
||||||
|
|||||||
@@ -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) . '});';
|
||||||
?>
|
?>
|
||||||
|
|||||||
@@ -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
753
main_plugin/marked-master/marked.d.ts
vendored
Normal 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 {};
|
||||||
72
main_plugin/marked-master/marked.esm.js
Normal file
72
main_plugin/marked-master/marked.esm.js
Normal file
File diff suppressed because one or more lines are too long
7
main_plugin/marked-master/marked.esm.js.map
Normal file
7
main_plugin/marked-master/marked.esm.js.map
Normal file
File diff suppressed because one or more lines are too long
74
main_plugin/marked-master/marked.umd.js
Normal file
74
main_plugin/marked-master/marked.umd.js
Normal file
File diff suppressed because one or more lines are too long
7
main_plugin/marked-master/marked.umd.js.map
Normal file
7
main_plugin/marked-master/marked.umd.js.map
Normal file
File diff suppressed because one or more lines are too long
@@ -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 = "";
|
||||||
|
|||||||
@@ -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(' ');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user