UNPKG

marc21-punctuation

Version:

Библиотека для обработки формата MARC21 и применения правил пунктуации согласно стандартам Библиотеки Конгресса США

91 lines (90 loc) 3.57 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Formatter = void 0; /** * Базовый класс для форматирования полей MARC21 с применением правил пунктуации */ class Formatter { constructor() { this.rules = []; } /** * Добавляет правило пунктуации * @param rule Правило пунктуации */ addRule(rule) { this.rules.push(rule); } /** * Добавляет несколько правил пунктуации * @param rules Массив правил пунктуации */ addRules(rules) { this.rules.push(...rules); } /** * Находит подходящее правило для заданного поля MARC21 * @param field Поле MARC21 * @returns Подходящее правило или undefined, если правило не найдено */ findMatchingRule(field) { return this.rules.find(rule => { // Проверяем соответствие тега if (rule.tag !== field.tag) { return false; } // Если правило определяет условия для индикаторов, проверяем их if (rule.indicators && field.indicators) { const [ind1Rule, ind2Rule] = rule.indicators; const [ind1Field, ind2Field] = field.indicators; // null означает "любой индикатор" if (ind1Rule !== null && ind1Rule !== ind1Field) { return false; } if (ind2Rule !== null && ind2Rule !== ind2Field) { return false; } } return true; }); } /** * Форматирует поле MARC21 с применением правил пунктуации * @param field Поле MARC21 * @returns Результат форматирования */ format(field) { // Для полей контрольной информации просто возвращаем значение поля if (!field.subfields || field.subfields.length === 0) { return { field, formattedText: field.value || '', }; } // Ищем подходящее правило const rule = this.findMatchingRule(field); if (rule) { // Применяем правило к полю const formattedSubfields = rule.apply(field); // Собираем итоговый форматированный текст // Важно: правила должны сами указывать нужные пробелы в префиксах и суффиксах const formattedText = formattedSubfields .map(sf => sf.formattedValue) .join(''); return { field, formattedText, formattedSubfields, }; } // Если правила нет, просто соединяем значения подполей пробелами const formattedText = field.subfields .map(sf => sf.value) .join(' '); return { field, formattedText, }; } } exports.Formatter = Formatter;