123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- /**
- * ПОКАЗ НЕОПУБЛИКОВАННОЙ СТАТЬИ
- * Copyright © 2021, А.М.Гольдин. ISC license
- */
- "use strict";
- // Возвращает html со статьей
- // id - это id запрашиваемой статьи :)
- // user - это данные клиента [3, "ivanov", "Иванов", "Ян", "Карлович"]
- module.exports = async (id, user) => {
- try {
- if (!/^\w{3,20}$/.test(id)) return "none";
- // Промисификатор чтения файла
- const rFile = fl => {
- return new Promise((resolve, reject) => {
- fs.readFile(fl, (e, cnt) => {
- if (e) reject("none"); else resolve(cnt.toString());
- })
- })
- };
- // Проверяем его роль
- let roles = 0;
- let staff = await dbFind("staff", {login: user[1]});
- if (staff[0]) roles = staff[0].roles.toString(2).padStart(3, '0');
- if (user[1] == ADMIN) roles = "111";
- // Загружаем данные статьи из базы
- let arts = await dbFind("articles", {_id: id});
- if (!arts[0]) return "none";
- let artObj = arts[0];
- if (artObj.status == 7) return "none";
- if (!artObj.status) return `
- <!DOCTYPE html><html lang="ru"><head><meta charset="utf-8">
- <title>Просмотр статьи</title></head>
- <body>Статья с id=${id} еще не загружена</body></html>
- `;
- // Показывать ли данные автора статьи? Только редактору и автору
- // Саму статью показываем только сотрудникам редакции и автору
- if (!roles && artObj.us != user[1]) return "none";
- let perm = (roles[0] == '1' || artObj.us == user[1]) ? true : false;
- // Загружаем файл с шаблоном и текстовый файл со статьей
- // __dirname + `/../draft/${id}/article.txt`;
- let cont = await rFile(__dirname + `/../www/include/print.tpl`);
- let art;
- try {art = await rFile( __dirname + `/../draft/${id}/article.txt`);}
- catch(e) {art = "Аннотации нет¤Текста нет¤";}
- let artArr = art.split('¤');
- // Подготавливаем данные
- let authorArr = artObj.author.split(' '),
- otch = authorArr[2] ? authorArr[2][0] + '. ' : '',
- author = `<nobr>${authorArr[1][0]}. ${otch}${authorArr[0]}</nobr>`,
- famIO = "<nobr>"
- + `${authorArr[0]} ${authorArr[1][0]}. ${otch}`.trim()
- + "</nobr>",
- soavt = '';
- // Если есть соавторы - добавляем их
- if (Object.keys(artObj.coauth).length) for (let lgn in artObj.coauth) {
- if (!lgn.trim()) continue;
- let fio = artObj.coauth[lgn][0] || "Соавтор не подтвержден",
- sved = artObj.coauth[lgn][1] || "данные не указаны",
- fioArr = fio.split(' '),
- fam = fioArr[0],
- io = `${fioArr[1][0]}. ${fioArr[2][0]}.`;
- author += `, <nobr>${io} ${fam}</nobr>`;
- famIO += `, <nobr>${fam} ${io}</nobr>`;
- soavt += `<br><i>${fio}</i> – ${sved}.`;
- }
- // Делаем замены в шаблоне
- const REPL = {
- "{{title}}" : perm ? authorArr[0] : "Просмотр статьи",
- "{{УДК}}" : artObj.udk,
- "{{Заголовок}}" : artObj.head,
- "{{Автор}}" : perm ? author : "Фамилия И. О.",
- "{{Аннотация}}" : artArr[0],
- "{{Ключевые}}" : artObj.keywords,
- "{{Текст}}" : artArr[1],
- "{{Литература}}" : artArr[2],
- "{{ФИО}}" : perm ? artObj.author : "Фамилия Имя Отчество",
- "{{должность}}" : perm ? artObj.sved : "данные скрыты",
- "{{email}}" : perm ? artObj.eml : "адрес скрыт",
- "{{соавт}}" : perm ? soavt : '',
- "{{ФамилияИО}}" : perm ? famIO : "Фамилия И. О.",
- "{{год}}" : artObj.dt2.split('.')[2],
- "{{дата}}" : artObj.dt1
- };
- for (let r in REPL) cont = cont.replace(new RegExp(r, 'g'), REPL[r]);
- // Заменяем ссылки на изображения; при использовании этого API
- // для публикации статьи следует затем везде удалить ?draft_<id>/
- cont = cont.replace(
- /\[img (\d+\.\w{3}) /g, "[img ?draft_" + id + "/$1 "
- );
- return cont;
- }
- catch(e) {return "none";}
- };
|