@@ -1,18 +1,20 @@ | |||
function вZ64(строка) | |||
var мир = {}; | |||
мир.вZ64 = function(строка) | |||
{ | |||
var байты = new TextEncoder("utf-8").encode(строка); | |||
var архив = pako.deflate(байты, { to: 'string' }); | |||
return base64js.fromByteArray(архив); | |||
} | |||
}; | |||
function изZ64(строка) | |||
мир.изZ64 = function(строка) | |||
{ | |||
var архив = base64js.toByteArray(строка); | |||
var байты = pako.inflate(архив); | |||
return new TextDecoder("utf-8").decode(байты); | |||
} | |||
}; | |||
function uuid() | |||
мир.uuid = function() | |||
{ | |||
// https://stackoverflow.com/a/2117523 | |||
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace( | |||
@@ -23,4 +25,16 @@ function uuid() | |||
return v.toString(16); | |||
} | |||
); | |||
} | |||
}; | |||
мир.назначитьКнопкамСобытия = function(события, список) | |||
{ | |||
for (var номер in список) | |||
{ | |||
const пара = список[номер]; | |||
var кнопка = document.getElementById(пара[0]); | |||
кнопка.addEventListener("click", function(_) { | |||
события.уведомить(пара[1]); | |||
}); | |||
} | |||
}; |
@@ -13,7 +13,7 @@ function Игра() | |||
{ | |||
if (z64) | |||
{ | |||
var код = изZ64(z64); | |||
var код = мир.изZ64(z64); | |||
/**/console.debug("Игра.исполнитьКод:", код); | |||
} | |||
}; | |||
@@ -2,6 +2,7 @@ function Редактор(события, имяРедактора) | |||
{ | |||
this.создать = function() | |||
{ | |||
this.первоначальныйЗаголовок = document.title; | |||
this.установитьAce(); | |||
this.улавливатьЗавершениеРедактирования(); | |||
this.пз = new ПараметрыЗапуска(); | |||
@@ -14,7 +15,7 @@ function Редактор(события, имяРедактора) | |||
var z64 = this.пз.параметры["z64"]; | |||
if (z64) | |||
{ | |||
var код = изZ64(z64); | |||
var код = мир.изZ64(z64); | |||
this.ace.session.setValue(код); | |||
} | |||
}; | |||
@@ -22,10 +23,10 @@ function Редактор(события, имяРедактора) | |||
this.исполнитьКод = function() | |||
{ | |||
var содержимое = this.ace.session.getValue(); | |||
var z64 = вZ64(содержимое); | |||
var z64 = мир.вZ64(содержимое); | |||
var путь = window.location.pathname + "?z64=" + z64; | |||
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("проигрыватель"); | |||
@@ -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() | |||
{ | |||
var тут = this; | |||
this.ace.session.on("change", function(дельта) { | |||
const билет = uuid(); | |||
const билет = мир.uuid(); | |||
тут.билет = билет; | |||
setTimeout( | |||
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() | |||
{ | |||
var ошибка = document.getElementById(имяОшибки); | |||
/* | |||
var версия = document.getElementById(имяПуска); | |||
пуск.addEventListener("click", function(событие) { | |||
console.debug("НАДО запустить"); | |||
}); | |||
*/ | |||
мир.назначитьКнопкамСобытия( | |||
события, | |||
[ | |||
[имяПерезапуска, "перезапустить"], | |||
[имяОтдельно, "запустить отдельно"], | |||
[имяСсылки, "скопировать ссылку"], | |||
] | |||
); | |||
события.подписать(this); | |||
}; | |||
@@ -24,6 +24,17 @@ console.debug("НАДО запустить"); | |||
{ | |||
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.события, "редактор"); | |||
this.пульт = new Пульт(this.события, "ошибка", "пуск"); | |||
this.пульт = new Пульт(this.события, "ошибка", "перезапустить", "отдельно", "ссылка"); | |||
}; | |||
// Конструктор. | |||
@@ -1 +1 @@ | |||
3.0/редактор/index.html | |||
3.1/редактор/index.html |