This commit is contained in:
2021-09-16 09:49:10 +03:00
parent 5449e11870
commit 543c4be5a0
75 changed files with 1622 additions and 0 deletions

View File

@@ -0,0 +1,127 @@
function Редактор(события, имяРедактора)
{
this.создать = function()
{
this.первоначальныйЗаголовок = document.title;
this.установитьAce();
this.улавливатьЗавершениеРедактирования();
this.задатьКодПриЗапуске();
события.подписать(this);
};
this.задатьКодПриЗапуске = function()
{
var z64 = мир.параметрыЗапуска()["z64"];
if (z64)
{
var код = мир.изZ64(z64);
this.ace.session.setValue(код);
}
};
this.запуститьОтдельно = function()
{
var содержимое = this.ace.session.getValue();
var z64 = мир.вZ64(содержимое);
var путь = window.location.pathname + "/../../проигрыватель/index.html?z64=" + z64;
window.open(путь);
};
this.исполнитьКод = function()
{
var содержимое = this.ace.session.getValue();
var z64 = мир.вZ64(содержимое);
// Исполняем явно код лишь первый раз.
var проигрыватель = document.getElementById("проигрыватель");
if (!проигрыватель.src)
{
проигрыватель.src = "../проигрыватель/index.html?z64=" + z64;
}
// После запуска уведомляем iframe о новом коде без перезагрузки.
else
{
window.frames.проигрыватель.postMessage(z64, "*");
}
};
this.обновитьАдреснуюСтрокуИЗаголовок = function()
{
var содержимое = this.ace.session.getValue();
var z64 = мир.вZ64(содержимое);
var путь = window.location.pathname + "?z64=" + z64;
history.pushState(null, "", путь);
document.title = `${this.первоначальныйЗаголовок} ${z64.length}:${z64.slice(z64.length - 5)}`;
};
this.обработатьСобытие = function(событие)
{
if (событие == "завершили редактирование")
{
this.обновитьАдреснуюСтрокуИЗаголовок();
this.проверитьКорректностьКода();
}
else if (событие == "код корректен")
{
this.исполнитьКод();
}
else if (событие == "перезапустить")
{
this.перезапуститьКод();
}
else if (событие == "запустить отдельно")
{
this.запуститьОтдельно();
}
};
this.перезапуститьКод = function()
{
var содержимое = this.ace.session.getValue();
var z64 = мир.вZ64(содержимое);
var проигрыватель = document.getElementById("проигрыватель");
проигрыватель.src = "../проигрыватель/index.html?z64=" + z64;
};
this.проверитьКорректностьКода = function()
{
try
{
eval(this.ace.session.getValue());
события.уведомить("код корректен");
}
catch (ошибка)
{
события.уведомить("код некорректен");
}
};
this.улавливатьЗавершениеРедактирования = function()
{
var тут = this;
this.ace.session.on("change", function(дельта) {
const билет = мир.uuid();
тут.билет = билет;
setTimeout(
function()
{
if (билет == тут.билет)
{
события.уведомить("завершили редактирование");
}
},
300
);
});
};
this.установитьAce = function()
{
var область = document.getElementById(имяРедактора);
this.ace = window.ace.edit(имяРедактора);
this.ace.session.setMode("ace/mode/javascript");
this.ace.session.setUseWrapMode(true);
};
// Конструктор.
this.создать();
}

View File

@@ -0,0 +1,48 @@
function Пульт(события, имяОшибки, имяПерезапуска, имяОтдельно, имяСсылки)
{
this.создать = function()
{
var ошибка = document.getElementById(имяОшибки);
мир.назначитьКнопкамСобытия(
события,
[
[имяПерезапуска, "перезапустить"],
[имяОтдельно, "запустить отдельно"],
[имяСсылки, "скопировать ссылку"],
]
);
события.подписать(this);
};
this.обработатьСобытие = function(событие)
{
if (событие == "код корректен")
{
this.показатьОшибку(false);
}
else if (событие == "код некорректен")
{
this.показатьОшибку(true);
}
else if (событие == "скопировать ссылку")
{
navigator.clipboard.writeText(window.location)
.then(() => {
UIkit.notification("Скопировали ссылку", { status: "success", timeout: 1000 });
})
.catch(err => {
UIkit.notification("Не удалось скопировать ссылку :(", { status: "danger", timeout: 5000 });
});
}
};
this.показатьОшибку = function(показать)
{
ошибка.innerHTML = показать ? "<span uk-icon=\"icon: warning\"></span>" : "&nbsp;";
};
// Конструктор.
this.создать();
}

View File

@@ -0,0 +1,13 @@
function Муром()
{
this.создать = function()
{
мир.события = new События();
мир.состояние = new Состояние();
мир.редактор = new Редактор(мир.события, "редактор");
мир.пульт = new Пульт(мир.события, "ошибка", "перезапустить", "отдельно", "ссылка");
};
// Конструктор.
this.создать();
}

View File

@@ -0,0 +1 @@
https://github.com/ajaxorg/ace-builds/tree/master/src-min-noconflict

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

@@ -0,0 +1,93 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>M-3.2</title>
<script src="../общее/base64-js/base64js.min.js"></script>
<script src="../общее/pako/pako.min.js"></script>
<script src="ace/ace.js"></script>
<script src="ace/mode-javascript.js"></script>
<script src="ace/worker-javascript.js"></script>
<link rel="stylesheet" type="text/css" href="uikit/uikit.min.css" />
<script src="uikit/uikit.min.js"></script>
<script src="uikit/uikit-icons.min.js"></script>
<style>
#редактор
{
position: absolute;
left: 0;
top: 0;
bottom: 0;
width: calc(50% - 2em);
}
#пульт
{
position: absolute;
left: calc(50% - 2em);
top: 0;
bottom: 0;
width: 4em;
display: flex;
flex-direction: column;
border: 1px dashed gainsboro;
}
#проигрыватель
{
position: absolute;
right: 0;
top: 0;
bottom: 0;
width: calc(50% - 2em);
height: 100%;
border: 0px none;
}
.впульте
{
margin: 0 auto;
}
</style>
</head>
<body>
<div id="редактор"></div>
<div id="пульт">
<span id="ошибка" class="впульте">&nbsp;</span>
<a id="перезапустить" class="впульте uk-icon-button uk-margin-top" uk-icon="refresh" uk-tooltip="Перезапустить"></a>
<a id="отдельно" class="впульте uk-icon-button uk-margin-top" uk-icon="desktop" uk-tooltip="Запустить в отдельной вкладке"></a>
<a id="ссылка" class="впульте uk-icon-button uk-margin-top" uk-icon="link" uk-tooltip="Скопировать ссылку"></a>
<a id="версия" class="впульте uk-icon-button uk-margin-top" uk-icon="git-branch" uk-tooltip="Версия"></a>
<div uk-dropdown="mode: click">
<table class="uk-table">
<tbody>
<tr>
<td>3.2</td>
<td>Заголовок...? раз два три четыре пять шесть семь восемь девять десять</td>
</tr>
<tr>
<td><a href="../../3.1/редактор/index.html">3.1</a></td>
<td>Кнопки перезапуска, копирования ссылки, запуска в отдельной вкладке</td>
</tr>
<tr>
<td><a href="../../3.0/редактор/index.html">3.0</a></td>
<td>Проверка введённого кода на отсутствие синтаксических ошибок</td>
</tr>
</tbody>
</table>
</div>
</div>
<iframe id="проигрыватель" name="проигрыватель"></iframe>
<script src="../общее/100.События.js"></script>
<script src="../общее/150.Состояние.js"></script>
<script src="../общее/200.функции.js"></script>
<script src="100.Редактор.js"></script>
<script src="200.Пульт.js"></script>
<script src="700.Муром.js"></script>
<script>
var муром = new Муром();
</script>
</body>
</html>

View File

@@ -0,0 +1 @@
https://getuikit.com/download

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