%% DATAVIEW_PUBLISHER: start
```dataviewjs
const questTasks = dv.pages('"RPG/Spelare/Kingmaker"')
.file.tasks
.where(t => t.tags.includes("#quest"));
// Group tasks by their source file
const tasksByFile = {};
for (const task of questTasks) {
if (!tasksByFile[task.path]) {
tasksByFile[task.path] = [];
}
tasksByFile[task.path].push(task);
}
let output = "";
// Create output with file headers and task lists
for (const filePath in tasksByFile) {
const fileName = filePath.split("/").pop().replace(".md", "");
// Add file header (using ### for smaller heading)
output += `[[${filePath}|${fileName}]]\n\n`;
// Add tasks for this file
const fileTasks = tasksByFile[filePath].map(task => ({
text: task.text.replace(/#\S+/g, "").trim(),
checked: task.completed
}));
// Convert to markdown task list
for (const task of fileTasks) {
output += `- [${task.checked ? 'x' : ' '}] ${task.text}\n`;
}
output += "\n";
}
output;
```
%%
%% DATAVIEW_PUBLISHER: end %%