修改dataview解析后的对象,让源文件产生对应的修改
我可以调用 dataview 的 api 来实现吗,或者通过 app.vault.adapter.update
等ob的方法。我曾经在别的插件看到有人用过,但不了解全貌,能提供几个函数,非常感谢
比如说 dv.current().file.task.text = 任务1
,用于修改任务的文本内容,或者我要增加一个子任务
修改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
我是想这不是基础的用法,要编写代码的,管理员给我移到这里也没关系
找到了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);
}