138 lines
4.3 KiB
JavaScript
138 lines
4.3 KiB
JavaScript
function Редактор(события, имяОбласти)
|
||
{
|
||
this.создать = function()
|
||
{
|
||
this.установитьAce();
|
||
this.улавливатьЗавершениеРедактирования();
|
||
события.подписать(this);
|
||
};
|
||
|
||
this.обработатьСобытие = function(событие)
|
||
{
|
||
if (событие == "завершили редактирование")
|
||
{
|
||
this.проверитьКорректностьКода();
|
||
}
|
||
else if (событие == "код корректен")
|
||
{
|
||
this.преобразоватьВZ64();
|
||
}
|
||
};
|
||
|
||
this.преобразоватьВZ64 = function()
|
||
{
|
||
var содержимое = this.ace.session.getValue();
|
||
var в = this.в64(содержимое);
|
||
var из = this.из64(в);
|
||
/**/console.debug("ИГР в/из", в, из);
|
||
|
||
/**/console.debug("ИГР-01 содержимое:", содержимое);
|
||
var байты1 = new TextEncoder("utf-8").encode(содержимое);
|
||
/**/console.debug("ИГР-02 байты1:", байты1);
|
||
var архив1 = pako.deflate(байты1, { to: 'string' });
|
||
/**/console.debug("ИГР-03 архив1:", архив1);
|
||
var z64 = base64js.fromByteArray(архив1);
|
||
/**/console.debug("ИГР-04 z64:", z64);
|
||
var архив2 = base64js.toByteArray(z64);
|
||
/**/console.debug("ИГР-05 архив2:", архив2);
|
||
var байты2 = pako.inflate(архив2);
|
||
/**/console.debug("ИГР-06 байты2:", байты2);
|
||
var текст = new TextDecoder("utf-8").decode(байты2);
|
||
/**/console.debug("ИГР-07 текст", текст);
|
||
};
|
||
|
||
this.установитьAce = function()
|
||
{
|
||
var область = document.getElementById(имяОбласти);
|
||
this.ace = window.ace.edit(имяОбласти);
|
||
this.ace.session.setMode("ace/mode/javascript");
|
||
}
|
||
|
||
this.улавливатьЗавершениеРедактирования = function()
|
||
{
|
||
var тут = this;
|
||
this.ace.session.on("change", function(дельта) {
|
||
const билет = тут.uuid();
|
||
тут.билет = билет;
|
||
setTimeout(
|
||
function()
|
||
{
|
||
if (билет == тут.билет)
|
||
{
|
||
события.уведомить("завершили редактирование");
|
||
}
|
||
},
|
||
1000
|
||
);
|
||
});
|
||
};
|
||
|
||
this.проверитьКорректностьКода = function()
|
||
{
|
||
try
|
||
{
|
||
eval(this.ace.session.getValue());
|
||
события.уведомить("код корректен");
|
||
}
|
||
catch (ошибка)
|
||
{
|
||
события.уведомить("код некорректен");
|
||
}
|
||
};
|
||
|
||
this.в64 = function(строка)
|
||
{
|
||
var байты = new TextEncoder("utf-8").encode(строка);
|
||
return base64js.fromByteArray(байты);
|
||
};
|
||
|
||
this.из64 = function(шифр)
|
||
{
|
||
var байты = base64js.toByteArray(шифр);
|
||
return new TextDecoder("utf-8").decode(байты);
|
||
};
|
||
|
||
/*
|
||
this.вZ64 = function(строка)
|
||
{
|
||
var байты = new TextEncoder("utf-8").encode(строка);
|
||
var архив = pako.deflate(байты, { to: 'string' });
|
||
var ret = this.в64(архив);
|
||
return ret
|
||
};
|
||
|
||
this.изZ64 = function(шифр)
|
||
{
|
||
//var архив = this.из64(шифр);
|
||
var архив = base64js.toByteArray(шифр);
|
||
|
||
var байты = null;
|
||
try {
|
||
байты = pako.inflate(архив);
|
||
} catch (err) {
|
||
console.error(err);
|
||
}
|
||
|
||
|
||
var ret = new TextDecoder("utf-8").decode(байты);
|
||
return ret;
|
||
};
|
||
*/
|
||
|
||
this.uuid = function()
|
||
{
|
||
// https://stackoverflow.com/a/2117523
|
||
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(
|
||
/[xy]/g,
|
||
function(c)
|
||
{
|
||
var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
|
||
return v.toString(16);
|
||
}
|
||
);
|
||
};
|
||
|
||
// Конструктор.
|
||
this.создать();
|
||
}
|