@@ -1,18 +1,20 @@ | |||||
function вZ64(строка) | |||||
var мир = {}; | |||||
мир.вZ64 = function(строка) | |||||
{ | { | ||||
var байты = new TextEncoder("utf-8").encode(строка); | var байты = new TextEncoder("utf-8").encode(строка); | ||||
var архив = pako.deflate(байты, { to: 'string' }); | var архив = pako.deflate(байты, { to: 'string' }); | ||||
return base64js.fromByteArray(архив); | return base64js.fromByteArray(архив); | ||||
} | |||||
}; | |||||
function изZ64(строка) | |||||
мир.изZ64 = function(строка) | |||||
{ | { | ||||
var архив = base64js.toByteArray(строка); | var архив = base64js.toByteArray(строка); | ||||
var байты = pako.inflate(архив); | var байты = pako.inflate(архив); | ||||
return new TextDecoder("utf-8").decode(байты); | return new TextDecoder("utf-8").decode(байты); | ||||
} | |||||
}; | |||||
function uuid() | |||||
мир.uuid = function() | |||||
{ | { | ||||
// https://stackoverflow.com/a/2117523 | // https://stackoverflow.com/a/2117523 | ||||
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace( | return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace( | ||||
@@ -23,4 +25,16 @@ function uuid() | |||||
return v.toString(16); | return v.toString(16); | ||||
} | } | ||||
); | ); | ||||
} | |||||
}; | |||||
мир.назначитьКнопкамСобытия = function(события, список) | |||||
{ | |||||
for (var номер in список) | |||||
{ | |||||
const пара = список[номер]; | |||||
var кнопка = document.getElementById(пара[0]); | |||||
кнопка.addEventListener("click", function(_) { | |||||
события.уведомить(пара[1]); | |||||
}); | |||||
} | |||||
}; |
@@ -13,7 +13,7 @@ function Игра() | |||||
{ | { | ||||
if (z64) | if (z64) | ||||
{ | { | ||||
var код = изZ64(z64); | |||||
var код = мир.изZ64(z64); | |||||
/**/console.debug("Игра.исполнитьКод:", код); | /**/console.debug("Игра.исполнитьКод:", код); | ||||
} | } | ||||
}; | }; | ||||
@@ -2,6 +2,7 @@ function Редактор(события, имяРедактора) | |||||
{ | { | ||||
this.создать = function() | this.создать = function() | ||||
{ | { | ||||
this.первоначальныйЗаголовок = document.title; | |||||
this.установитьAce(); | this.установитьAce(); | ||||
this.улавливатьЗавершениеРедактирования(); | this.улавливатьЗавершениеРедактирования(); | ||||
this.пз = new ПараметрыЗапуска(); | this.пз = new ПараметрыЗапуска(); | ||||
@@ -14,7 +15,7 @@ function Редактор(события, имяРедактора) | |||||
var z64 = this.пз.параметры["z64"]; | var z64 = this.пз.параметры["z64"]; | ||||
if (z64) | if (z64) | ||||
{ | { | ||||
var код = изZ64(z64); | |||||
var код = мир.изZ64(z64); | |||||
this.ace.session.setValue(код); | this.ace.session.setValue(код); | ||||
} | } | ||||
}; | }; | ||||
@@ -22,10 +23,10 @@ function Редактор(события, имяРедактора) | |||||
this.исполнитьКод = function() | this.исполнитьКод = function() | ||||
{ | { | ||||
var содержимое = this.ace.session.getValue(); | var содержимое = this.ace.session.getValue(); | ||||
var z64 = вZ64(содержимое); | |||||
var z64 = мир.вZ64(содержимое); | |||||
var путь = window.location.pathname + "?z64=" + z64; | var путь = window.location.pathname + "?z64=" + z64; | ||||
history.pushState(null, "", путь); | history.pushState(null, "", путь); | ||||
document.title = `M-3.0 ${z64.length}:${z64.slice(z64.length - 5)}`; | |||||
document.title = `${this.первоначальныйЗаголовок} ${z64.length}:${z64.slice(z64.length - 5)}`; | |||||
// Исполняем явно код лишь первый раз. | // Исполняем явно код лишь первый раз. | ||||
var проигрыватель = document.getElementById("проигрыватель"); | var проигрыватель = document.getElementById("проигрыватель"); | ||||
@@ -52,20 +53,24 @@ function Редактор(события, имяРедактора) | |||||
} | } | ||||
}; | }; | ||||
this.установитьAce = function() | |||||
this.проверитьКорректностьКода = function() | |||||
{ | { | ||||
var область = document.getElementById(имяРедактора); | |||||
this.ace = window.ace.edit(имяРедактора); | |||||
this.ace.session.setMode("ace/mode/javascript"); | |||||
this.ace.session.setUseWrapMode(true); | |||||
} | |||||
try | |||||
{ | |||||
eval(this.ace.session.getValue()); | |||||
события.уведомить("код корректен"); | |||||
} | |||||
catch (ошибка) | |||||
{ | |||||
события.уведомить("код некорректен"); | |||||
} | |||||
}; | |||||
this.улавливатьЗавершениеРедактирования = function() | this.улавливатьЗавершениеРедактирования = function() | ||||
{ | { | ||||
var тут = this; | var тут = this; | ||||
this.ace.session.on("change", function(дельта) { | this.ace.session.on("change", function(дельта) { | ||||
const билет = uuid(); | |||||
const билет = мир.uuid(); | |||||
тут.билет = билет; | тут.билет = билет; | ||||
setTimeout( | setTimeout( | ||||
function() | function() | ||||
@@ -75,22 +80,17 @@ function Редактор(события, имяРедактора) | |||||
события.уведомить("завершили редактирование"); | события.уведомить("завершили редактирование"); | ||||
} | } | ||||
}, | }, | ||||
1000 | |||||
300 | |||||
); | ); | ||||
}); | }); | ||||
}; | }; | ||||
this.проверитьКорректностьКода = function() | |||||
this.установитьAce = function() | |||||
{ | { | ||||
try | |||||
{ | |||||
eval(this.ace.session.getValue()); | |||||
события.уведомить("код корректен"); | |||||
} | |||||
catch (ошибка) | |||||
{ | |||||
события.уведомить("код некорректен"); | |||||
} | |||||
var область = document.getElementById(имяРедактора); | |||||
this.ace = window.ace.edit(имяРедактора); | |||||
this.ace.session.setMode("ace/mode/javascript"); | |||||
this.ace.session.setUseWrapMode(true); | |||||
}; | }; | ||||
// Конструктор. | // Конструктор. | ||||
@@ -1,16 +1,16 @@ | |||||
function Пульт(события, имяОшибки, имяПуска) | |||||
function Пульт(события, имяОшибки, имяПерезапуска, имяОтдельно, имяСсылки) | |||||
{ | { | ||||
this.создать = function() | this.создать = function() | ||||
{ | { | ||||
var ошибка = document.getElementById(имяОшибки); | var ошибка = document.getElementById(имяОшибки); | ||||
/* | |||||
var версия = document.getElementById(имяПуска); | |||||
пуск.addEventListener("click", function(событие) { | |||||
console.debug("НАДО запустить"); | |||||
}); | |||||
*/ | |||||
мир.назначитьКнопкамСобытия( | |||||
события, | |||||
[ | |||||
[имяПерезапуска, "перезапустить"], | |||||
[имяОтдельно, "запустить отдельно"], | |||||
[имяСсылки, "скопировать ссылку"], | |||||
] | |||||
); | |||||
события.подписать(this); | события.подписать(this); | ||||
}; | }; | ||||
@@ -24,6 +24,17 @@ console.debug("НАДО запустить"); | |||||
{ | { | ||||
this.показатьОшибку(true); | this.показатьОшибку(true); | ||||
} | } | ||||
else if (событие == "скопировать ссылку") | |||||
{ | |||||
navigator.clipboard.writeText(window.location) | |||||
.then(() => { | |||||
UIkit.notification("Скопировали ссылку", { status: "success", timeout: 1000 }); | |||||
}) | |||||
.catch(err => { | |||||
UIkit.notification("Не удалось скопировать ссылку :(", { status: "danger", timeout: 5000 }); | |||||
}); | |||||
} | |||||
}; | }; | ||||
@@ -4,7 +4,7 @@ function Муром() | |||||
{ | { | ||||
this.события = new События(); | this.события = new События(); | ||||
this.редактор = new Редактор(this.события, "редактор"); | this.редактор = new Редактор(this.события, "редактор"); | ||||
this.пульт = new Пульт(this.события, "ошибка", "пуск"); | |||||
this.пульт = new Пульт(this.события, "ошибка", "перезапустить", "отдельно", "ссылка"); | |||||
}; | }; | ||||
// Конструктор. | // Конструктор. | ||||
@@ -1 +1 @@ | |||||
3.0/редактор/index.html | |||||
3.1/редактор/index.html |