%% DATAVIEW_PUBLISHER: start ```dataviewjs const questTasks = dv.pages('"RPG/Spelare/Kingmaker"') .file.tasks .where(t => t.tags.includes("#quest") && !t.completed); const tasksByFile = {}; for (const task of questTasks) { if (!tasksByFile[task.path]) { const filePage = dv.page(task.path); tasksByFile[task.path] = { ctime: filePage.file.ctime, tasks: [] }; } tasksByFile[task.path].tasks.push(task); } const sortedFiles = Object.entries(tasksByFile) .sort(([, a], [, b]) => a.ctime - b.ctime); let output = ""; for (const [filePath, fileData] of sortedFiles) { const fileName = filePath.split("/").pop().replace(".md", ""); output += `[[${filePath}|${fileName}]]\n\n`; for (const task of fileData.tasks) { const cleanText = task.text.replace(/#\S+/g, "").trim(); output += `- [${task.completed ? 'x' : ' '}] ${cleanText}\n`; } output += "\n"; } output; ``` %% %% DATAVIEW_PUBLISHER: end %%