302 строки
11 KiB
HTML
302 строки
11 KiB
HTML
<!DOCTYPE html>
|
|
<html>
|
|
<meta charset="utf-8">
|
|
<head>
|
|
<style>
|
|
table
|
|
{
|
|
border-collapse: collapse;
|
|
width: 100%;
|
|
}
|
|
table, th, td
|
|
{
|
|
border: 1px solid #aaa;
|
|
padding: 0.5em;
|
|
margin-top: 0.5em;
|
|
margin-bottom: 0.5em;
|
|
}
|
|
</style>
|
|
<title>Метки</title>
|
|
</head>
|
|
<body>
|
|
<p>Загружаем метки</p>
|
|
<script>
|
|
function базаБезФайла()
|
|
{
|
|
var база = window.location.href;
|
|
var компоненты = база.split(/\//);
|
|
компоненты.pop();
|
|
return decodeURIComponent(компоненты.join("/"));
|
|
}
|
|
|
|
function ограниченнаяСтрока(строка)
|
|
{
|
|
const предел = 93;
|
|
if (строка.length > предел)
|
|
{
|
|
return строка.substring(0, предел) + ". . .";
|
|
}
|
|
|
|
return строка;
|
|
}
|
|
|
|
// JavaScript equivalent to printf/String.Format
|
|
// https://stackoverflow.com/a/4673436
|
|
function форматСтроки() {
|
|
// How to shift “arguments”
|
|
// https://stackoverflow.com/questions/4775895/how-to-shift-arguments
|
|
var args = Array.prototype.slice.call(arguments);
|
|
var str = args.shift();
|
|
return str.replace(/{(\d+)}/g, function(match, number) {
|
|
return typeof args[number] != 'undefined'
|
|
? args[number]
|
|
: match
|
|
;
|
|
});
|
|
}
|
|
|
|
function взять(адрес, откликУспеха, откликПровала)
|
|
{
|
|
var запрос = new XMLHttpRequest();
|
|
запрос.onreadystatechange = function()
|
|
{
|
|
if (this.readyState == 4)
|
|
{
|
|
if (this.status == 200)
|
|
{
|
|
откликУспеха(this.responseText);
|
|
}
|
|
else if (откликПровала)
|
|
{
|
|
откликПровала(this.status);
|
|
}
|
|
}
|
|
}
|
|
|
|
запрос.open("GET", адрес);
|
|
запрос.send();
|
|
}
|
|
</script>
|
|
<script>
|
|
var м = {};
|
|
м.метки = [];
|
|
|
|
м.таблица = null;
|
|
м.создатьТаблицу = function()
|
|
{
|
|
const интерфейс = `
|
|
<table id="метки">
|
|
<tr>
|
|
<th>Дата</th>
|
|
<th>Имя</th>
|
|
<th>Описание</th>
|
|
<th>Короткий адрес</th>
|
|
<th>Полный адрес</th>
|
|
</tr>
|
|
</table>
|
|
`;
|
|
document.body.innerHTML = интерфейс;
|
|
м.таблица = document.getElementById("метки");
|
|
};
|
|
|
|
м.заполнитьТаблицу = function()
|
|
{
|
|
for (var номер in м.метки)
|
|
{
|
|
var метка = м.метки[номер];
|
|
var ряд = м.таблица.insertRow(-1);
|
|
var номер = 0;
|
|
var ячейки = {
|
|
"дата": ряд.insertCell(номер++),
|
|
"имя": ряд.insertCell(номер++),
|
|
"описание": ряд.insertCell(номер++),
|
|
"коротко": ряд.insertCell(номер++),
|
|
"адрес": ряд.insertCell(номер++),
|
|
};
|
|
ячейки.дата.innerHTML = метка.дата;
|
|
ячейки.имя.innerHTML = метка.имя;
|
|
ячейки.описание.innerHTML = метка.описание;
|
|
ячейки.коротко.innerHTML = базаБезФайла() + "?" + метка.имя;
|
|
ячейки.адрес.innerHTML =
|
|
форматСтроки(
|
|
"<a href='{0}'>{1}</a>",
|
|
метка.адрес,
|
|
ограниченнаяСтрока(метка.адрес)
|
|
);
|
|
}
|
|
};
|
|
|
|
м.имя = null;
|
|
м.разобратьИмяПеренаправления = function()
|
|
{
|
|
const имя = decodeURIComponent(window.location.search.substring(1));
|
|
if (имя.length)
|
|
{
|
|
м.имя = имя;
|
|
}
|
|
};
|
|
|
|
м.адресПоИмени = function(имя)
|
|
{
|
|
if (!имя)
|
|
{
|
|
return null;
|
|
}
|
|
|
|
for (var номер in м.метки)
|
|
{
|
|
var метка = м.метки[номер];
|
|
if (метка.имя == имя)
|
|
{
|
|
return метка.адрес;
|
|
}
|
|
}
|
|
|
|
return null;
|
|
};
|
|
|
|
м.разобратьМетки = function(текст)
|
|
{
|
|
var сейчас = "";
|
|
var метки = [];
|
|
var метка = {
|
|
"имя" : "",
|
|
"дата" : "",
|
|
"адрес" : "",
|
|
"описание" : "",
|
|
};
|
|
|
|
function возможноЗабратьМетку()
|
|
{
|
|
if (
|
|
метка.имя.length &&
|
|
метка.дата.length &&
|
|
метка.адрес.length &&
|
|
метка.описание.length
|
|
) {
|
|
метки.push(метка);
|
|
// Освободить место для следующей метки.
|
|
метка = {
|
|
"имя" : "",
|
|
"дата" : "",
|
|
"адрес" : "",
|
|
"описание" : "",
|
|
};
|
|
}
|
|
}
|
|
|
|
const строки = текст.split(/\n/);
|
|
for (var номер in строки)
|
|
{
|
|
const строка = строки[номер];
|
|
// Ключ.
|
|
if (строка == "ИМЯ")
|
|
{
|
|
возможноЗабратьМетку();
|
|
сейчас = "имя";
|
|
}
|
|
else if (строка == "ДАТА")
|
|
{
|
|
возможноЗабратьМетку();
|
|
сейчас = "дата";
|
|
}
|
|
else if (строка == "ОПИСАНИЕ")
|
|
{
|
|
возможноЗабратьМетку();
|
|
сейчас = "описание";
|
|
}
|
|
else if (строка == "АДРЕС")
|
|
{
|
|
возможноЗабратьМетку();
|
|
сейчас = "адрес";
|
|
}
|
|
// Значение.
|
|
else
|
|
{
|
|
if (сейчас == "имя")
|
|
{
|
|
метка.имя += строка;
|
|
}
|
|
else if (сейчас == "дата")
|
|
{
|
|
метка.дата += строка;
|
|
}
|
|
else if (сейчас == "адрес")
|
|
{
|
|
метка.адрес += строка;
|
|
}
|
|
else if (сейчас == "описание")
|
|
{
|
|
метка.описание += строка + "\n";
|
|
}
|
|
}
|
|
}
|
|
// Последний раз.
|
|
возможноЗабратьМетку();
|
|
м.метки = метки;
|
|
};
|
|
|
|
м.сортироватьМетки = function()
|
|
{
|
|
// Сортируем от новейших меток к старейшим.
|
|
м.метки.sort(function(метка1, метка2){
|
|
if (метка1.дата > метка2.дата)
|
|
{
|
|
return -1;
|
|
}
|
|
if (метка1.дата < метка2.дата)
|
|
{
|
|
return 1;
|
|
}
|
|
return 0;
|
|
});
|
|
};
|
|
|
|
м.загрузитьМетки = function(откликЗавершения)
|
|
{
|
|
взять(
|
|
м.адрес,
|
|
function(текст)
|
|
{
|
|
м.разобратьМетки(текст);
|
|
откликЗавершения();
|
|
}
|
|
);
|
|
};
|
|
|
|
м.сделатьДело = function()
|
|
{
|
|
м.разобратьИмяПеренаправления();
|
|
const адр = м.адресПоИмени(м.имя)
|
|
// Перенаправить.
|
|
if (адр)
|
|
{
|
|
window.location.href = адр;
|
|
}
|
|
// Показать заметки.
|
|
else
|
|
{
|
|
м.сортироватьМетки();
|
|
м.создатьТаблицу();
|
|
м.заполнитьТаблицу();
|
|
|
|
// Уведомить о неверном имени.
|
|
if (м.имя)
|
|
{
|
|
console.log("ВНИМАНИЕ Неверное имя: '" + м.имя + "'");
|
|
}
|
|
}
|
|
};
|
|
|
|
м.запустить = function()
|
|
{
|
|
м.загрузитьМетки(м.сделатьДело);
|
|
};
|
|
</script>
|
|
<script>
|
|
м.адрес = "https://git.opengamestudio.org/kornerr/metki/raw/branch/master/база";
|
|
м.запустить();
|
|
</script>
|
|
</body>
|
|
</html>
|