await dv.view("scripts/locations");
const path_module = require('path');
function getNPCName(p) {
let nameLink = `[[${p.file.name}|${p.file.name}]]`; // Создаем Wiki-ссылку
let alive = p.alive == undefined || !!p.alive;
if (!alive) {
nameLink += ` (D)`;
}
return nameLink;
}
function getClassAndLevel(p) {
const statsArray = p.stats ? p.stats.split(';') : [];
if (statsArray.length > 0) {
const firstStat = statsArray[0];
const colonIndex = firstStat.indexOf(':');
return colonIndex !== -1 ? firstStat.slice(colonIndex + 1).trim() : firstStat;
}
return null;
}
function getMainInfo(p) {
let age = p.birthday ? (1491 - p.birthday) : null;
let mainInfoParts = [];
if (p.appearance || p.race) {
// specialization
let appearanceTitle = "";
if (p.race) {
appearanceTitle += `Раса: ${p.race}. `;
}
if (age) {
appearanceTitle += `Возраст: ${age} лет. `;
}
if (p.profession) {
appearanceTitle += `Профессия: ${p.profession}. `;
}
if (p.appearance) {
appearanceTitle += `${p.appearance}`;
}
let appearanceTooltip = `View`;
mainInfoParts.push(appearanceTooltip);
}
if (p.personality) {
let personalityTooltip = `Pers`;
mainInfoParts.push(personalityTooltip);
}
if (p.biography) {
let biographyTooltip = `Bio`;
mainInfoParts.push(biographyTooltip);
}
if (p.quests) {
let questsTooltip = `Quests`;
mainInfoParts.push(questsTooltip);
}
return mainInfoParts.join(" / ");
}
function listProperty(property) {
if (!property) {
return "";
}
// Если это массив, разделяем элементы
if (Array.isArray(property)) {
let links = [];
let otherItems = [];
property.forEach(item => {
if (item) {
if (typeof item === 'string') {
otherItems.push(item);
}
else if (typeof item === 'object')
{
links.push(item);
}
}
});
// Собираем ссылочные элементы и создаём tooltip для остальных
let tooltip = otherItems.length > 0 ? `Equip` : "";
// Объединяем ссылки и tooltip
return [...links, tooltip].filter(Boolean).join(", ");
} else {
// Если это не массив, просто возвращаем как есть (и проверяем на тип строки)
return typeof property === 'string' ? `Equip` : "";
}
}
function listAffiliation(affiliation) {
if (!affiliation) {
return "";
}
if (Array.isArray(affiliation)) {
return affiliation.filter(Boolean).join(", ");
} else {
// Если это не массив, просто возвращаем как есть (и проверяем на тип строки)
return typeof affiliation === 'string' ? affiliation : "";
}
}
// Функция для отображения таблицы
function show_table(dv, regionsList, basePath) {
dv.span("## Персонажи");
dv.table(["Image", "Name", "Stat", "Main Info", "Affiliation", "Assets", "Loc"],
dv.pages("#npc")
.filter(p => p.domicile && dv.locations.regionMatches(dv, regionsList, p.domicile))
.sort(p => p.file.name, 'asc') // Сортировка по имени файла в порядке возрастания
.map(p => {
let nameLink = getNPCName(p);
let stats = getClassAndLevel(p);
let mainInfo = getMainInfo(p);
let avatarImage = dv.locations.getImageLinks(p, basePath); // Передаем basePath для формирования правильного пути
return [avatarImage, nameLink, stats, mainInfo, listAffiliation(p.affiliation), listProperty(p.possessions), p.location]; // Аватар первой колонкой
})
);
}
// Функция для запуска отображения таблицы
function run_show_table(...args) {
let dv = args[0].arg1;
let regionsList = args[0].arg2;
let basePath = this.app.vault.adapter.basePath; // Получаем базовый путь к хранилищу
show_table(dv, regionsList, basePath);
}
run_show_table(input);