128 lines
4.6 KiB
JavaScript
128 lines
4.6 KiB
JavaScript
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.создать();
|
||
}
|