【已解决】在dataview 的tasklist 展示的时候,点击完成,可以实现 源任务完成,请问是怎么做到的

修改dataview解析后的对象,让源文件产生对应的修改

我可以调用 dataview 的 api 来实现吗,或者通过 app.vault.adapter.update 等ob的方法。我曾经在别的插件看到有人用过,但不了解全貌,能提供几个函数,非常感谢

比如说 dv.current().file.task.text = 任务1 ,用于修改任务的文本内容,或者我要增加一个子任务

app里用用于修改文件内容的函数吗,最好是解析好任务的,可以对任务条目进行修改,如果是row,有点麻烦,我就不用自己造轮子了

await app.vault.adapter.mkdir('/' + folder_path + name)
console.log('task created: ' + folder_path + name)
//多层级创建文件夹会不渲染(ob的文件目录不显示),需要更新ob的文件目录
await app.vault.adapter.update

我是想这不是基础的用法,要编写代码的,管理员给我移到这里也没关系 :melting_face:

找到了dataview的实现方式,是硬解析,通过 taskitem 对象内保存的行列进行替换

/** Rewrite a task with the given completion status and new text. */
export async function rewriteTask(vault: Vault, task: STask, desiredStatus: string, desiredText?: string) {
    if (desiredStatus == task.status && (desiredText == undefined || desiredText == task.text)) return;
    desiredStatus = desiredStatus == "" ? " " : desiredStatus;

    let rawFiletext = await vault.adapter.read(task.path);
    let hasRN = rawFiletext.contains("\r");
    let filetext = rawFiletext.split(/\r?\n/u);

    if (filetext.length < task.line) return;
    let match = LIST_ITEM_REGEX.exec(filetext[task.line]);
    if (!match || match[2].length == 0) return;

    let taskTextParts = task.text.split("\n");
    if (taskTextParts[0].trim() != match[3].trim()) return;

    // We have a positive match here at this point, so go ahead and do the rewrite of the status.
    let initialSpacing = /^[\s>]*/u.exec(filetext[task.line])!![0];
    if (desiredText) {
        let desiredParts = desiredText.split("\n");

        let newTextLines: string[] = [`${initialSpacing}${task.symbol} [${desiredStatus}] ${desiredParts[0]}`].concat(
            desiredParts.slice(1).map(l => initialSpacing + "\t" + l)
        );

        filetext.splice(task.line, task.lineCount, ...newTextLines);
    } else {
        filetext[task.line] = `${initialSpacing}${task.symbol} [${desiredStatus}] ${taskTextParts[0].trim()}`;
    }

    let newText = filetext.join(hasRN ? "\r\n" : "\n");
    await vault.adapter.write(task.path, newText);
}
1 个赞