批量替换标点和空格有一键完成的插件或方法么

ocr一本pdf书籍到obsidian里,标点之类的错误很多,空格也特别多,想要批量替换这些标点,和去除空格。

  1. 目前去除空格依靠 增强编辑插件 完成了。该插件有一键去除空格的命令。但是替换标点却不行。虽然该插件说明里有替换英文标点为中文标点的命令,但没有效果。
  2. Text format插件也有替换标点的命令,运行后一样没有效果。
  3. 然后也问了deepseek,ds反反复复让用quickadd加宏和js脚本来处理,但是最新版的quickadd 的宏不知道怎么用,老教程不管用。再次失败。
  4. 此后又使用了Regex pipeline,Regex regex-replace插件来定义批量替换,依旧失败。
  5. 到此已经没有办法了,求助有没有正确可用的替换标点的一键操作的方法,最好是替换的标点可自定义。

linter 能自定义正则替换

linter用完了替换是不是就要关掉设置好的自定义替换,不然会误操作无需修改的文件。

啊,Easy Typing 记得可以全文格式化来着,可以删除/添加文字间的空格;
标点的话,如果是中英文标点区别直接 Ctrl+H 就可以批量替换吧。

研究了两个晚上,ds写的代码不管用,用豆包写的代码,添加到quickadd里基本实现批量替换了,现在研究怎么快速执行该命令,老是调用命令窗口很费事

求分享代码

快速执行:

  • 给命令设置快捷键:Obsidian的设置˗ ˗ ˗ 选项˗ ˗ ˗ 快捷键
  • 其他快速执行命令的插件
    1. 按钮类:Editing Toolbar、Note Toolbar …
    2. 输入文本后执行命令:Latex Suite

这是转换英文标点为中文标点的脚本,在quickadd里添加一个marco,在user script 里载入这个js脚本就行了。对选中文本或整个文档都能执行该命令。对 ,;:()""--{}'' 这几种标点进行替换。没有对英文 .转换,怕出现差错。英文的双引号和单引号都只能成对替换,如果是单个 " 引号,替换不了,因为英文没有左右引号的区别,它无法智能的替换。如果有其他想替换的标点自己加进去就行了,照猫画虎,我都是这么干的。

让豆包改进了脚本,整体应用对表格会有影响,为免误操作,所以改成只对选中的文本有效,

仅对选中的文本进行转换标点

module.exports = async (params) => {
    const { app, QuickAdd } = params;
    const editor = app.workspace.activeEditor?.editor;

    if (!editor) {
        new Notice("请打开一个文档");
        return;
    }

    // 只处理选中的文本,未选中则提示
    const selection = editor.getSelection();
    if (!selection) {
        new Notice("请先选中需要处理的文本");
        return;
    }

    // 定义替换规则:英文标点→中文标点(按顺序替换)
    const replaceRules = [
        [/,/g, ","],               // 英文逗号→中文逗号
        [/!/g, "!"],               // 英文感叹号→中文感叹号
        [/\?/g, "?"],              // 英文问号→中文问号
        [/:/g, ":"],               // 英文冒号→中文冒号
        [/;/g, ";"],               // 英文分号→中文分号
        [/\(/g, "("],              // 英文左括号→中文左括号
        [/\)/g, ")"],              // 英文右括号→中文右括号
        [/--/g, "——"],              // 英文破折号→中文破折号
        [/\{/g, "{"],              // 英文左大括号→中文左大括号
        [/\}/g, "}"],              // 英文右大括号→中文右大括号
        [/"([^"]*)"/g, "“$1”"],     // 英文双引号→中文双引号(成对)
        [/'([^']*)'/g, "‘$1’"],     // 英文单引号→中文单引号(成对)
    ];

    // 执行替换(仅处理选中的文本)
    let result = selection;
    replaceRules.forEach(([regex, replacement]) => {
        result = result.replace(regex, replacement);
    });

    // 将处理后的文本替换回选中区域
    editor.replaceSelection(result);

    new Notice("标点转换完成!");
};
1 个赞

这里是删除文本中的所有半角空格和不连续空格脚本。不连续空格是ocr的文本里出现的奇怪空格,好在豆包竟然知道怎么处理,但我放过了全角空格,全角空格我用在名人名言的引用处,所以选择不删除,如果想要全角空格也清除,可以让豆包给你加上。

因为会影响表格,导致有点不太正常,让豆包把代码改成只对选中的文本生效,避免误操作。

仅对选中的文本进行操作。

module.exports = async (params) => {
    const { app } = params;
    const editor = app.workspace.activeEditor?.editor;
    
    if (!editor) {
        new Notice("请打开一个文档");
        return;
    }

    // 只处理选中的文本,未选中则提示
    const selection = editor.getSelection();
    if (!selection) {
        new Notice("请先选中需要处理的文本");
        return;
    }

    // 处理空格问题:
    let result = selection
        // 删除各种不间断空格
        .replace(/[\u00A0\u202F\u2007\u2002\u2003\u2004\u2005\u2006\u2008\u2009\u200A]/g, '')
        // 移除非英文单词之间的半角空格(仅保留英文单词间的空格)
        .replace(/(?<![a-zA-Z]) (?![a-zA-Z])/g, '')
        // 压缩英文单词间的连续空格为单个空格
        .replace(/(?<=[a-zA-Z])  +(?=[a-zA-Z])/g, ' ');

    // 将处理后的文本替换回选中区域
    editor.replaceSelection(result);

    new Notice("空格清理完成!");
};
2 个赞

这个是转换1. 2. 3. 这样的数字列表为有序列表和 前面有一个圆点点的列表为无序列表脚本。

这个也改成了只对选中文本进行应用,以免误操作。

module.exports = async (params) => {
    const { app } = params;
    const editor = app.workspace.activeEditor?.editor;
    
    if (!editor) {
        new Notice("没有活跃的编辑器");
        return;
    }

    // 只处理选中的文本,未选中则提示
    const selection = editor.getSelection();
    if (!selection) {
        new Notice("请先选中需要处理的文本");
        return;
    }

    // 处理选中文本
    let content = selection
        // 1. 处理有序列表(数字+点 → 保持数字. 格式)
        .replace(/^(\d+)\.([^\s])/gm, '$1. $2')       // 1.内容 → 1. 内容
        .replace(/^(\d+)\s+\.([^\s])/gm, '$1. $2')   // 1 .内容 → 1. 内容
        .replace(/^(\d+)\.\s+/gm, '$1. ');            // 1.   内容 → 1. 内容

    // 2. 处理无序列表(各种圆点 → 转换为 - 格式)
    content = content
        // 匹配•、●、○等圆点,替换为-,并确保后面有空格
        .replace(/^(•|●|○|▪|▫)\s*([^\s])/gm, '- $2')  // •内容 → - 内容;●  内容 → - 内容
        .replace(/^(•|●|○|▪|▫)\s+/gm, '- ');           // •   内容 → - 内容

    // 替换选中内容
    editor.replaceSelection(content);

    new Notice("已将选中文本转换为标准列表格式");
};
1 个赞

豆包写的脚本,原本有一句 const { Notice } = window.obsidian;,运行后老是提示错误,我就删除了这句,似乎没有影响。 顺便请懂代码的大佬给看看,这三个脚本有没有错误的地方或可以改善规则的地方。