const count = 5;
// Укажите интересующие вас теги
const excludedTags = ['#тема', '#тип'];
let d = {};
const excludedFolder = '03 РАБОТА/КОНТАКТЫ'; // Убрали лишний "/"
// Функция для проверки, содержит ли заметка хотя бы один из исключённых тегов
function hasAnyExcludedTags(filePath, tagNames) {
let fileCache = dv.app.metadataCache.getCache(filePath);
if (!fileCache || !fileCache.tags) return false;
// Извлекаем теги как массив значений
let fileTags = fileCache.tags.map(tag => tag.tag);
// Проверяем, если хотя бы один тег из excludedTags присутствует в заметке
return tagNames.some(tagName =>
fileTags.some(fileTag => fileTag.startsWith(tagName))
);
}
// Функция для проверки, находится ли файл в исключённой папке
function isInExcludedFolder(filePath, folderPath) {
return filePath.includes(folderPath); // Сравниваем путь без начального "/"
}
// Функция для обработки ссылок
function process(k, v) {
Object.keys(v).forEach(function (x) {
let link_x = dv.fileLink(x);
if (d[link_x] === undefined) {
d[link_x] = [];
}
// Исключаем файлы, если они находятся в запрещённой папке или содержат исключённые теги
if (!isInExcludedFolder(x, excludedFolder) && !hasAnyExcludedTags(x, excludedTags)) {
d[link_x].push(dv.fileLink(k));
}
});
}
// Обрабатываем ссылки
Object.entries(dv.app.metadataCache.resolvedLinks)
.filter(([k, v]) => Object.keys(v).length)
.forEach(([k, v]) => process(k, v));
// Выводим результат в таблицу
dv.table(["Имя заметки", "Ссылаются"],
Object.entries(d)
.filter(([k, v]) => v.length >= count)
.sort((a, b) => b[1].length - a[1].length)
.map(([k, v]) => [k, v.join(" • ")]));
---
aliases:
- Картотеку
- Картотеке
- Картотеки
- Картотекой
- Картотеке
---
И в дальнейшем и в поиске и плагинах Входящие/Исходящие ссылки Obsidian будет учитывать в том числе и альтернативные имена.