loadArticle.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. /**
  2. * ПОКАЗ НЕОПУБЛИКОВАННОЙ СТАТЬИ
  3. * Copyright © 2021, А.М.Гольдин. ISC license
  4. */
  5. "use strict";
  6. // Возвращает html со статьей
  7. // id - это id запрашиваемой статьи :)
  8. // user - это данные клиента [3, "ivanov", "Иванов", "Ян", "Карлович"]
  9. module.exports = async (id, user) => {
  10. try {
  11. if (!/^\w{3,20}$/.test(id)) return "none";
  12. // Промисификатор чтения файла
  13. const rFile = fl => {
  14. return new Promise((resolve, reject) => {
  15. fs.readFile(fl, (e, cnt) => {
  16. if (e) reject("none"); else resolve(cnt.toString());
  17. })
  18. })
  19. };
  20. // Проверяем его роль
  21. let roles = 0;
  22. let staff = await dbFind("staff", {login: user[1]});
  23. if (staff[0]) roles = staff[0].roles.toString(2).padStart(3, '0');
  24. if (user[1] == ADMIN) roles = "111";
  25. // Загружаем данные статьи из базы
  26. let arts = await dbFind("articles", {_id: id});
  27. if (!arts[0]) return "none";
  28. let artObj = arts[0];
  29. if (artObj.status == 7) return "none";
  30. if (!artObj.status) return `
  31. <!DOCTYPE html><html lang="ru"><head><meta charset="utf-8">
  32. <title>Просмотр статьи</title></head>
  33. <body>Статья с id=${id} еще не загружена</body></html>
  34. `;
  35. // Показывать ли данные автора статьи? Только редактору и автору
  36. // Саму статью показываем только сотрудникам редакции и автору
  37. if (!roles && artObj.us != user[1]) return "none";
  38. let perm = (roles[0] == '1' || artObj.us == user[1]) ? true : false;
  39. // Загружаем файл с шаблоном и текстовый файл со статьей
  40. // __dirname + `/../draft/${id}/article.txt`;
  41. let cont = await rFile(__dirname + `/../www/include/print.tpl`);
  42. let art;
  43. try {art = await rFile( __dirname + `/../draft/${id}/article.txt`);}
  44. catch(e) {art = "Аннотации нет¤Текста нет¤";}
  45. let artArr = art.split('¤');
  46. // Подготавливаем данные
  47. let authorArr = artObj.author.split(' '),
  48. otch = authorArr[2] ? authorArr[2][0] + '. ' : '',
  49. author = `<nobr>${authorArr[1][0]}. ${otch}${authorArr[0]}</nobr>`,
  50. famIO = "<nobr>"
  51. + `${authorArr[0]} ${authorArr[1][0]}. ${otch}`.trim()
  52. + "</nobr>",
  53. soavt = '';
  54. // Если есть соавторы - добавляем их
  55. if (Object.keys(artObj.coauth).length) for (let lgn in artObj.coauth) {
  56. if (!lgn.trim()) continue;
  57. let fio = artObj.coauth[lgn][0] || "Соавтор не подтвержден",
  58. sved = artObj.coauth[lgn][1] || "данные не указаны",
  59. fioArr = fio.split(' '),
  60. fam = fioArr[0],
  61. io = `${fioArr[1][0]}. ${fioArr[2][0]}.`;
  62. author += `, <nobr>${io} ${fam}</nobr>`;
  63. famIO += `, <nobr>${fam} ${io}</nobr>`;
  64. soavt += `<br><i>${fio}</i> – ${sved}.`;
  65. }
  66. // Делаем замены в шаблоне
  67. const REPL = {
  68. "{{title}}" : perm ? authorArr[0] : "Просмотр статьи",
  69. "{{УДК}}" : artObj.udk,
  70. "{{Заголовок}}" : artObj.head,
  71. "{{Автор}}" : perm ? author : "Фамилия И. О.",
  72. "{{Аннотация}}" : artArr[0],
  73. "{{Ключевые}}" : artObj.keywords,
  74. "{{Текст}}" : artArr[1],
  75. "{{Литература}}" : artArr[2],
  76. "{{ФИО}}" : perm ? artObj.author : "Фамилия Имя Отчество",
  77. "{{должность}}" : perm ? artObj.sved : "данные скрыты",
  78. "{{email}}" : perm ? artObj.eml : "адрес скрыт",
  79. "{{соавт}}" : perm ? soavt : '',
  80. "{{ФамилияИО}}" : perm ? famIO : "Фамилия И. О.",
  81. "{{год}}" : artObj.dt2.split('.')[2],
  82. "{{дата}}" : artObj.dt1
  83. };
  84. for (let r in REPL) cont = cont.replace(new RegExp(r, 'g'), REPL[r]);
  85. // Заменяем ссылки на изображения; при использовании этого API
  86. // для публикации статьи следует затем везде удалить ?draft_<id>/
  87. cont = cont.replace(
  88. /\[img (\d+\.\w{3}) /g, "[img ?draft_" + id + "/$1 "
  89. );
  90. return cont;
  91. }
  92. catch(e) {return "none";}
  93. };