%% 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 %%