Files
crm.clientright.ru/text_to_rtf.js
Fedor 01c4fe80b5 chore: snapshot current working tree changes
Save all currently accumulated repository changes as a backup snapshot for Gitea so no local work is lost.
2026-03-26 14:19:01 +03:00

129 lines
4.9 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Преобразование текста судебного акта в RTF формат
// Используется в n8n Code Node
let text = '';
try {
const courtActsText = $('Code in JavaScript8').first().json?.court_acts?.[0]?.text;
if (courtActsText && String(courtActsText).trim() !== '') {
text = String(courtActsText);
}
} catch (e) {
// Игнорируем, если нода недоступна
}
if (!text) {
text = $json.text || $json.ocr_text || $json.cleaned_text || $json.original_text || '';
}
// Функция для исправления кодировки (если текст пришёл в неправильной кодировке)
function fixEncoding(str) {
if (!str) return '';
// Проверяем, есть ли признаки неправильной кодировки (кракозябры типа "пїЅ", "РѕСЃ")
const hasGarbledText = /пїЅ|Р[°-ї]{2,}|С[°-ї]{2,}/.test(str);
if (hasGarbledText) {
try {
// Пытаемся исправить: если текст был в UTF-8, но прочитан как Windows-1251/ISO-8859-1
// Конвертируем: latin1 -> Buffer -> UTF-8
const buffer = Buffer.from(str, 'latin1');
const fixed = buffer.toString('utf8');
// Проверяем, что исправление помогло (должно быть больше нормальных русских букв)
const hasRussian = /[А-Яа-яЁё]/.test(fixed);
if (hasRussian) {
return fixed;
}
} catch (e) {
// Игнорируем ошибки
}
}
return str;
}
// Исправляем кодировку текста
text = fixEncoding(text);
// Функция для конвертации текста в RTF с Unicode escape sequences
// Это самый надёжный способ для кириллицы
function textToRTF(str) {
if (!str) return '';
let result = '';
for (let i = 0; i < str.length; i++) {
const char = str[i];
const code = char.charCodeAt(0);
// ASCII символы (0-127) - оставляем как есть, но экранируем специальные
if (code < 128) {
if (char === '\\') result += '\\\\';
else if (char === '{') result += '\\{';
else if (char === '}') result += '\\}';
else if (char === '\n') result += '\\par\n';
else if (char === '\r') continue; // Пропускаем \r
else result += char;
} else {
// Не-ASCII символы (включая кириллицу) - используем Unicode escape
// RTF использует \uN? где N - десятичный код символа
result += `\\u${code}?`;
}
}
return result;
}
// Создаём RTF документ с правильной кодировкой для кириллицы
// Используем Unicode escape sequences (\uN?) - самый надёжный способ для кириллицы
// Кодировка RTF: UTF-8 (\ansicpg65001) для поддержки Unicode
const rtfText = textToRTF(text);
const rtfContent = `{\\rtf1\\ansi\\ansicpg65001\\deff0\\nouicompat\\deflang1049
{\\fonttbl{\\f0\\fnil\\fcharset204{\\*\\fname Times New Roman;}Times New Roman;}{\\f1\\fnil\\fcharset204{\\*\\fname Arial;}Arial;}}
{\\colortbl;\\red0\\green0\\blue0;}
\\f0\\fs24\\lang1049\\langfe1049
${rtfText}
}`;
// Конвертируем RTF в base64 для передачи (RTF сам по себе в UTF-8, но содержимое в Win1251)
const rtfBase64 = Buffer.from(rtfContent, 'utf8').toString('base64');
// Рассчитываем размер файла в байтах
const fileSizeBytes = Buffer.byteLength(rtfContent, 'utf8');
// Размер в человекочитаемом формате
function formatFileSize(bytes) {
if (bytes === 0) return '0 B';
const k = 1024;
const sizes = ['B', 'KB', 'MB', 'GB'];
const i = Math.floor(Math.log(bytes) / Math.log(k));
return Math.round((bytes / Math.pow(k, i)) * 100) / 100 + ' ' + sizes[i];
}
const fileSizeHuman = formatFileSize(fileSizeBytes);
// Генерируем имя файла
const uuid = $json.uuid || Date.now().toString();
const caseNumber = ($json.case_number || 'unknown').replace(/[<>:"|?*\/\\]/g, '_');
const fileName = `${caseNumber}_${uuid}.rtf`;
return [{
json: {
...$json,
rtf_base64: rtfBase64,
rtf_content: rtfContent, // На случай если нужен сам RTF текст
file_name: fileName,
file_extension: 'rtf',
mime_type: 'application/rtf; charset=utf-8',
file_size: fileSizeBytes, // Размер в байтах
file_size_human: fileSizeHuman // Размер в человекочитаемом формате (KB, MB и т.д.)
},
binary: {
data: {
data: rtfBase64,
mimeType: 'application/rtf; charset=utf-8',
fileName: fileName
}
}
}];