Заметки с перенаправлением | Notes with redirection
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

302 lines
11KB

  1. <!DOCTYPE html>
  2. <html>
  3. <meta charset="utf-8">
  4. <head>
  5. <style>
  6. table
  7. {
  8. border-collapse: collapse;
  9. width: 100%;
  10. }
  11. table, th, td
  12. {
  13. border: 1px solid #aaa;
  14. padding: 0.5em;
  15. margin-top: 0.5em;
  16. margin-bottom: 0.5em;
  17. }
  18. </style>
  19. <title>Метки</title>
  20. </head>
  21. <body>
  22. <p>Загружаем метки</p>
  23. <script>
  24. function базаБезФайла()
  25. {
  26. var база = window.location.href;
  27. var компоненты = база.split(/\//);
  28. компоненты.pop();
  29. return decodeURIComponent(компоненты.join("/"));
  30. }
  31. function ограниченнаяСтрока(строка)
  32. {
  33. const предел = 93;
  34. if (строка.length > предел)
  35. {
  36. return строка.substring(0, предел) + ". . .";
  37. }
  38. return строка;
  39. }
  40. // JavaScript equivalent to printf/String.Format
  41. // https://stackoverflow.com/a/4673436
  42. function форматСтроки() {
  43. // How to shift “arguments”
  44. // https://stackoverflow.com/questions/4775895/how-to-shift-arguments
  45. var args = Array.prototype.slice.call(arguments);
  46. var str = args.shift();
  47. return str.replace(/{(\d+)}/g, function(match, number) {
  48. return typeof args[number] != 'undefined'
  49. ? args[number]
  50. : match
  51. ;
  52. });
  53. }
  54. function взять(адрес, откликУспеха, откликПровала)
  55. {
  56. var запрос = new XMLHttpRequest();
  57. запрос.onreadystatechange = function()
  58. {
  59. if (this.readyState == 4)
  60. {
  61. if (this.status == 200)
  62. {
  63. откликУспеха(this.responseText);
  64. }
  65. else if (откликПровала)
  66. {
  67. откликПровала(this.status);
  68. }
  69. }
  70. }
  71. запрос.open("GET", адрес);
  72. запрос.send();
  73. }
  74. </script>
  75. <script>
  76. var м = {};
  77. м.метки = [];
  78. м.таблица = null;
  79. м.создатьТаблицу = function()
  80. {
  81. const интерфейс = `
  82. <table id="метки">
  83. <tr>
  84. <th>Дата</th>
  85. <th>Имя</th>
  86. <th>Описание</th>
  87. <th>Короткий адрес</th>
  88. <th>Полный адрес</th>
  89. </tr>
  90. </table>
  91. `;
  92. document.body.innerHTML = интерфейс;
  93. м.таблица = document.getElementById("метки");
  94. };
  95. м.заполнитьТаблицу = function()
  96. {
  97. for (var номер in м.метки)
  98. {
  99. var метка = м.метки[номер];
  100. var ряд = м.таблица.insertRow(-1);
  101. var номер = 0;
  102. var ячейки = {
  103. "дата": ряд.insertCell(номер++),
  104. "имя": ряд.insertCell(номер++),
  105. "описание": ряд.insertCell(номер++),
  106. "коротко": ряд.insertCell(номер++),
  107. "адрес": ряд.insertCell(номер++),
  108. };
  109. ячейки.дата.innerHTML = метка.дата;
  110. ячейки.имя.innerHTML = метка.имя;
  111. ячейки.описание.innerHTML = метка.описание;
  112. ячейки.коротко.innerHTML = базаБезФайла() + "?" + метка.имя;
  113. ячейки.адрес.innerHTML =
  114. форматСтроки(
  115. "<a href='{0}'>{1}</a>",
  116. метка.адрес,
  117. ограниченнаяСтрока(метка.адрес)
  118. );
  119. }
  120. };
  121. м.имя = null;
  122. м.разобратьИмяПеренаправления = function()
  123. {
  124. const имя = decodeURIComponent(window.location.search.substring(1));
  125. if (имя.length)
  126. {
  127. м.имя = имя;
  128. }
  129. };
  130. м.адресПоИмени = function(имя)
  131. {
  132. if (!имя)
  133. {
  134. return null;
  135. }
  136. for (var номер in м.метки)
  137. {
  138. var метка = м.метки[номер];
  139. if (метка.имя == имя)
  140. {
  141. return метка.адрес;
  142. }
  143. }
  144. return null;
  145. };
  146. м.разобратьМетки = function(текст)
  147. {
  148. var сейчас = "";
  149. var метки = [];
  150. var метка = {
  151. "имя" : "",
  152. "дата" : "",
  153. "адрес" : "",
  154. "описание" : "",
  155. };
  156. function возможноЗабратьМетку()
  157. {
  158. if (
  159. метка.имя.length &&
  160. метка.дата.length &&
  161. метка.адрес.length &&
  162. метка.описание.length
  163. ) {
  164. метки.push(метка);
  165. // Освободить место для следующей метки.
  166. метка = {
  167. "имя" : "",
  168. "дата" : "",
  169. "адрес" : "",
  170. "описание" : "",
  171. };
  172. }
  173. }
  174. const строки = текст.split(/\n/);
  175. for (var номер in строки)
  176. {
  177. const строка = строки[номер];
  178. // Ключ.
  179. if (строка == "ИМЯ")
  180. {
  181. возможноЗабратьМетку();
  182. сейчас = "имя";
  183. }
  184. else if (строка == "ДАТА")
  185. {
  186. возможноЗабратьМетку();
  187. сейчас = "дата";
  188. }
  189. else if (строка == "ОПИСАНИЕ")
  190. {
  191. возможноЗабратьМетку();
  192. сейчас = "описание";
  193. }
  194. else if (строка == "АДРЕС")
  195. {
  196. возможноЗабратьМетку();
  197. сейчас = "адрес";
  198. }
  199. // Значение.
  200. else
  201. {
  202. if (сейчас == "имя")
  203. {
  204. метка.имя += строка;
  205. }
  206. else if (сейчас == "дата")
  207. {
  208. метка.дата += строка;
  209. }
  210. else if (сейчас == "адрес")
  211. {
  212. метка.адрес += строка;
  213. }
  214. else if (сейчас == "описание")
  215. {
  216. метка.описание += строка + "\n";
  217. }
  218. }
  219. }
  220. // Последний раз.
  221. возможноЗабратьМетку();
  222. м.метки = метки;
  223. };
  224. м.сортироватьМетки = function()
  225. {
  226. // Сортируем от новейших меток к старейшим.
  227. м.метки.sort(function(метка1, метка2){
  228. if (метка1.дата > метка2.дата)
  229. {
  230. return -1;
  231. }
  232. if (метка1.дата < метка2.дата)
  233. {
  234. return 1;
  235. }
  236. return 0;
  237. });
  238. };
  239. м.загрузитьМетки = function(откликЗавершения)
  240. {
  241. взять(
  242. м.адрес,
  243. function(текст)
  244. {
  245. м.разобратьМетки(текст);
  246. откликЗавершения();
  247. }
  248. );
  249. };
  250. м.сделатьДело = function()
  251. {
  252. м.разобратьИмяПеренаправления();
  253. const адр = м.адресПоИмени(м.имя)
  254. // Перенаправить.
  255. if (адр)
  256. {
  257. window.location.href = адр;
  258. }
  259. // Показать заметки.
  260. else
  261. {
  262. м.сортироватьМетки();
  263. м.создатьТаблицу();
  264. м.заполнитьТаблицу();
  265. // Уведомить о неверном имени.
  266. if (м.имя)
  267. {
  268. console.log("ВНИМАНИЕ Неверное имя: '" + м.имя + "'");
  269. }
  270. }
  271. };
  272. м.запустить = function()
  273. {
  274. м.загрузитьМетки(м.сделатьДело);
  275. };
  276. </script>
  277. <script>
  278. м.адрес = "https://git.opengamestudio.org/kornerr/metki/raw/branch/master/база";
  279. м.запустить();
  280. </script>
  281. </body>
  282. </html>