marc21-punctuation
Version:
Библиотека для обработки формата MARC21 и применения правил пунктуации согласно стандартам Библиотеки Конгресса США
91 lines (90 loc) • 3.57 kB
JavaScript
;
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;