Отлично, давай сделаем всё «с нуля» и без сюрпризов. Итог: ты одним действием вставляешь **статический** список ссылок `- [[…|…]]` на все `.md` из подпапки **Details** рядом с текущей страницей. Это идеально рендерится в **Obsidian Publish** (никаких виджетов/плагинов на сайте). # Пошаговая инструкция ## 1) Включить Community-плагины и поставить Templater 1. Открой **Settings → Community plugins**. 2. Включи переключатель **Turn on community plugins**. 3. Нажми **Browse** → найди **Templater** → **Install** → **Enable**. ## 2) Завести папку для шаблонов 1. В файловом дереве создай папку, например **`Templates`** (в корне vault). ## 3) Создать шаблон «оглавления Details» 1. В `Templates` создай файл **`Make-Details-Index.md`**. 2. Вставь в него код ниже и **сохрани**. ```markdown <%* /** * Генерирует статический Markdown-список ссылок (- [[path|basename]]) * на все .md-файлы в подпапке "Details" рядом с текущей заметкой. * * Настройки: * includeSubfolders — заходить ли в подпапки внутри "Details" * excludeSelf — исключать ли текущую заметку из списка * sortLocale — локаль сортировки для collator (например, 'ru' или 'en') */ const includeSubfolders = false; const excludeSelf = true; const sortLocale = 'ru'; const { app } = this; // 1) Папка текущего файла (от корня vault) const baseFolder = tp.file.folder(true); // например: "A/B/C" const targetFolderPath = `${baseFolder}/Details`; // "A/B/C/Details" const targetFolder = app.vault.getAbstractFileByPath(targetFolderPath); if (!targetFolder || !targetFolder.children) { tR += `> Папка "Details" не найдена в: ${baseFolder}`; return; } // 2) Собрать .md-файлы из "Details" (с подпапками — опционально) function collectMdFiles(root) { const out = []; const walk = (node) => { if (!node || !('children' in node) || !Array.isArray(node.children)) return; for (const ch of node.children) { if ('children' in ch) { // это папка if (includeSubfolders) walk(ch); // рекурсивно, если разрешено } else if (ch.extension === 'md') { // это файл .md out.push(ch); } } }; walk(root); return out; } let files = collectMdFiles(targetFolder); if (excludeSelf) files = files.filter(f => f.basename !== tp.file.title); // 3) Сортировка по имени (basename) files.sort((a, b) => a.basename.localeCompare(b.basename, sortLocale)); // Экранируем вертикальную черту в alias (на всякий случай) const esc = s => String(s).replace(/\|/g, "\\|"); // 4) Генерация строк "− [[path|basename]]" tR += files .map(f => `- [[${f.path.replace(/\.md$/,'')}|${esc(f.basename)}]]`) .join("\n"); %> ``` ## 4) Вставить список в нужную страницу 1. Открой страницу, где требуется список. 2. Поставь курсор в **пустую строку**, туда, где должен появиться список. 3. Нажми **⌘P** → набери `templater insert` → выбери **Templater: Insert template**. 4. Укажи шаблон **`Make-Details-Index.md`**. Вставится **готовый Markdown-список** (без какого-либо кода). > Хочешь быстрее? **Settings → Hotkeys** → назначь хоткей на **Templater: Insert template** (например, `Ctrl+⌘+T`). ## 5) Опубликовать корректно - В **Publish** не добавляй папку `Templates` — тогда файла-шаблона на сайте не будет. - Публикуемая страница содержит **только статический текст** → в Publish всё выглядит «как набрано руками». # Полезные варианты и тонкости ## Включить подпапки в `Details` - Открой шаблон, поменяй: ```js const includeSubfolders = true; ``` - Список станет рекурсивным. ## Чтобы «обновить» оглавление - Просто снова выполни **Templater: Insert template** на этой же странице. - Быстро перезаписать старое оглавление: выдели старые строки и вставь заново (или сразу вставляй поверх курсором в начале блока). ## Если хочешь группировку по подпапкам — скажи, пришлю версию, которая: - собирает файлы рекурсивно, - группирует заголовками подпапок, - выводит блоками: ``` ## Subfolder-1 - [[...|...]] - [[...|...]] ## Subfolder-2 - [[...|...]] ``` Производительность (performance): генерация единоразовая, на странице остаётся чистый Markdown → нулевая нагрузка в Publish. ## Если по ошибке вставился виджет/код — значит, запускали **не тот пункт**. Используй **Templater: Insert template** (а не “Replace inline templates” и не “Run JS Code”), и обязательно храни код в `Templates`, а не в самой заметке. --- Готово! Если укажешь, нужны ли подпапки и/или особая сортировка (по дате изменения, по заголовку H1 и т.д.), подгоню шаблон под твой стиль.