viewExportVD.js 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. // ЭЛЕКТРОННЫЙ ЖУРНАЛ «ШКАЛА»: ПРОСМОТР ЭКСПОРТИРОВАННОГО ФАЙЛА ЭЖ
  2. // (МЕЖКЛАССНАЯ ГРУППА ВНЕУРОЧНОЙ ДЕЯТЕЛЬНОСТИ)
  3. // Copyright © 2021, А.М.Гольдин. Modified BSD License
  4. // Скрипт подписывается в каждый экспортируемый html-файл с журналом группы ВД
  5. "use strict";
  6. // Получаем объект с данными журнала, вырезаем все ссылки
  7. let body = document.querySelector("article");
  8. let bodyInner = body.innerHTML.replace(/<a .+?>/g, '').replace(/<\/a>/g, '');
  9. let scole = JSON.parse(bodyInner);
  10. // Формируем заголовок страницы и определения стилей
  11. let title = document.createElement("title");
  12. title.textContent = `Журнал группы ВД`;
  13. document.head.prepend(title);
  14. let stl = document.createElement("style");
  15. stl.textContent = `
  16. @page {size: A4 portrait; margin:1.5cm 2.5cm}
  17. body {width:16cm; margin:auto; font:10pt Arial, sans-serif; text-align:center}
  18. nav {text-align:center; margin-bottom:6pt; page-break-before:always}
  19. h1, h2, h3, p {text-align:center;}
  20. h1 {font-size:18pt; margin:192pt 0pt 0pt}
  21. h2 {font-size:12pt; margin:36pt 0pt 12pt}
  22. h2:first-of-type {font-size:10pt; margin:72pt 0pt 0pt}
  23. h3 {font-size:12pt; margin:0pt 0pt 12pt}
  24. p {margin:48pt 0pt; border-top:0.25pt solid black}
  25. button {position:fixed; top:5px; right:20px; font-size:24pt; display:none;}
  26. /* Последняя страница */
  27. aside {width:10cm; margin:auto; padding-top:5cm; page-break-before:always}
  28. aside p {border:none}
  29. aside p:nth-child(2) {border-top:0.25pt solid black}
  30. aside p:nth-child(3) {text-align:left; font-style:italic}
  31. /* Таблица с отметками */
  32. .pupCol, .gradeCol {
  33. display:inline-block; width:3.5cm; border-top:0.25pt solid black;}
  34. .gradeCol {width:1.1cm;}
  35. .pupCol div, .gradeCol div {
  36. border-bottom:0.25pt solid black; padding:1pt 0pt; text-align:left;}
  37. .gradeCol div {text-align:center; border-left:0.25pt solid black;}
  38. .gradeCol div:first-child {font-stretch:condensed}
  39. /* Таблица с темами */
  40. .topicsStr {border:0.25pt solid black; border-style:none none solid}
  41. .ctr {border-top:0.25pt solid black}
  42. .topicsStr div {
  43. display:inline-block; padding:3pt; text-align:center; vertical-align:top;
  44. -webkit-hyphens:auto; -moz-hyphens:auto; -ms-hyphens:auto; hiphens:auto;}
  45. .topicsStr div:nth-child(1) {width:1cm; border-left:none}
  46. .topicsStr div:nth-child(2) {width:0.6cm}
  47. .topicsStr div:nth-child(3) {width:0.8cm}
  48. .topicsStr div:nth-child(4) {width:6.4cm; text-align:left}
  49. .topicsStr div:nth-child(5) {width:6cm; text-align:left}
  50. .ctr div:nth-child(3), .ctr div:nth-child(4), .ctr div:nth-child(5) {
  51. text-align:center;}
  52. h3 + .topicsStr div {border-left:0.25pt solid black}
  53. h3 + .topicsStr div:first-child {border-left:none}
  54. @media screen {
  55. html {background:#ccc}
  56. body {background:white; margin:2cm auto; padding-top:1cm;}
  57. nav, aside {padding-top:12pt; border-top:5px groove #ccc; margin-top:24pt}
  58. aside {padding:12pt 3cm 2cm}
  59. button {display:block;}
  60. }
  61. `;
  62. document.head.prepend(stl);
  63. let doc = `
  64. <button type="button" onClick="window.print()" title="Печать"
  65. >&#128424;</button>
  66. <p><small>(наименование образовательной организации)</small></p>
  67. <h1>Журнал группы внеурочной деятельности<br style="margin-bottom:12pt">
  68. <small>Группа ${grFull.replace("(", "<br>(")
  69. .replace(": ", "<br>")}</small></h1>
  70. <h2>20_____/_____ учебный год</h2>`;
  71. let pageNum = 2;
  72. // Формируем колонку с фамилиями учащихся
  73. let pupCol = "<div class='pupCol'><div>&nbsp;</div>";
  74. for (let pupil of scole.pnList) {
  75. pupil = pupil.replace(/\|.*\|/, '').trim();
  76. pupCol += `<div>${pupil}</div>`;
  77. }
  78. pupCol += "</div>";
  79. // Текущая печатаемая страница (левая/четная и правая/нечетная)
  80. let currPageLeft = '', currPageRight = '';
  81. // Цикл по всем датам
  82. // (11 - количество записанных уроков на одной странице)
  83. let lessNum = 0;
  84. for (let dt in scole) {
  85. if (dt == "pnList") continue;
  86. if (!(lessNum % 11)) {
  87. doc += currPageLeft + currPageRight;
  88. currPageLeft = `<nav>${pageNum}</nav>`; pageNum++;
  89. currPageLeft += pupCol; // список учащихся
  90. currPageRight = `<nav>${pageNum}</nav>`; pageNum++;
  91. currPageRight += "<div class='topicsStr ctr'>"
  92. + "<div>Дата</div><div>ч</div><div>Вес</div>"
  93. + "<div>Содержание занятия</div><div>Задание на дом</div>"
  94. + "</div>";
  95. }
  96. // Подписываем текущий столбик урока в таблицу с отметками
  97. // (кроме пропущенных учителем занятий)
  98. if (scole[dt].w != 9) {
  99. currPageLeft += `<div class='gradeCol'><div>${dt}</div>`;
  100. for (let gr of scole[dt].g) {
  101. gr = gr.replace("999", "зач");
  102. if (!/\d{2}\.\d{2}/.test(dt)) gr = gr.replace("0", "н/а");
  103. currPageLeft += `<div>${gr ? gr : ' '}</div>`;
  104. }
  105. currPageLeft += "</div>";
  106. }
  107. // Подписываем текущую тему в таблицу с темами
  108. if (scole[dt].t) {
  109. let vol = scole[dt].v ? scole[dt].v : 1,
  110. cursiv = scole[dt].w == 9 ? " style='font-style:italic'" : '',
  111. weight = scole[dt].w == 9 ? '' : scole[dt].w/2,
  112. topic = scole[dt].t.substr(0,120),
  113. htask = scole[dt].h.substr(0,120);
  114. currPageRight += `<div class='topicsStr'><div>${dt}</div>`
  115. + `<div>${vol}</div><div>${weight}</div>`
  116. + `<div${cursiv}>${topic}</div><div>${htask}</div></div>`;
  117. }
  118. lessNum++;
  119. }
  120. doc += currPageLeft + currPageRight;
  121. doc += "<aside><p>В настоящем журнале пронумеровано,<br>" +
  122. "прошнуровано и скреплено печатью</p><p>листов</p><p>Подпись:</p></aside>";
  123. document.body.innerHTML = doc;