Условие
Дан конфиг навигации сайта-«охоты за сокровищами». Реализовать функцию-интерпретатор, которая по конфигу и пути возвращает целевой URL.
module.exports = async function interpretNavConfig(config, inputPath) {
// TODO: реализуйте логику интерпретатора
// Можно возвращать config.errorPath при ошибках
return config.errorPath;
};Правила
Конфиг содержит:
pathRules— список правил карты;processors— набор обработчиков (опционально);errorPath— путь, в который приводят ошибки.
Каждое правило имеет pattern и одно из destination или redirect. В destination/redirect могут использоваться плейсхолдеры {param} — они подставляются значениями параметров из pattern.
Шаблон pattern
segment1[param1][param2?][param3~]
segment— фиксированная часть пути.[param]— сегмент-параметр.?— параметр опциональный.~— игнорирование регистра (значение приводится к нижнему).- Допустимы только символы
A-Z a-z 0-9 _ -(минимум 1 символ). inputPathразбивается по/, пустые сегменты игнорируются.
Алгоритм
match— найти первое правило (слева направо), которое полностью покрывает путь.redirect— подставить параметры в шаблон, начать заново с новым путём (без выполнения процессоров).processors— выполнить процессоры правила. Если процессор вернул строку — это новый путь, начинаем новый цикл.destination— вернутьdestinationс подстановками.
При любой ошибке — вернуть errorPath.
Примеры
// Пример 1: простое сопоставление
const config = {
pathRules: [
{ pattern: "users[id]", destination: "/pages/user.html" }
],
errorPath: "/pages/error.html"
};
await interpretNavConfig(config, "users/abc-01");
// → "/pages/user.html"// Пример 2: опциональный параметр
const config = {
pathRules: [
{ pattern: "archive[year][month?]", destination: "/pages/archive.html" }
],
errorPath: "/pages/error.html"
};
await interpretNavConfig(config, "archive/2024");
// → "/pages/archive.html"// Пример 3: лишние сегменты — нет совпадения
const config = {
pathRules: [{ pattern: "a[b?]", destination: "/ok" }],
errorPath: "/err"
};
await interpretNavConfig(config, "a/b/c");
// → "/err" (3 сегмента не подходят)