Заметки с перенаправлением | 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.

271 lines
9.8KB

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