Отлично, давай сделаем всё «с нуля» и без сюрпризов. Итог: ты одним действием вставляешь **статический** список ссылок `- [[…|…]]` на все `.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 и т.д.), подгоню шаблон под твой стиль.