Save all currently accumulated repository changes as a backup snapshot for Gitea so no local work is lost.
129 lines
4.9 KiB
JavaScript
129 lines
4.9 KiB
JavaScript
// Преобразование текста судебного акта в 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
|
||
}
|
||
}
|
||
}];
|